From e890ddcf6b3116b9102ea1b250a4e3facf295fa6 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 12 Aug 2025 18:40:56 +0200 Subject: [PATCH 01/97] feat: add viem support with ethers.js adapter wrappers and viem auth provider --- packages/taco-auth/package.json | 8 + packages/taco-auth/src/providers/index.ts | 1 + .../taco-auth/src/providers/viem/index.ts | 3 + .../src/providers/viem/viem-auth-providers.ts | 80 + .../src/providers/viem/viem-wrappers.ts | 161 + packages/taco/VIEM_SUPPORT.md | 154 + .../viem-encrypt-decrypt.test.ts | 261 + packages/taco/package.json | 8 + packages/taco/src/index.ts | 3 + packages/taco/src/viem-taco.ts | 134 + packages/taco/src/wrappers/index.ts | 6 + packages/taco/src/wrappers/viem-wrappers.ts | 343 + packages/taco/test/viem-unit.test.ts | 169 + packages/taco/test/viem-wrappers.test.ts | 122 + pnpm-lock.yaml | 13268 +++++++++++----- 15 files changed, 11158 insertions(+), 3563 deletions(-) create mode 100644 packages/taco-auth/src/providers/viem/index.ts create mode 100644 packages/taco-auth/src/providers/viem/viem-auth-providers.ts create mode 100644 packages/taco-auth/src/providers/viem/viem-wrappers.ts create mode 100644 packages/taco/VIEM_SUPPORT.md create mode 100644 packages/taco/integration-test/viem-encrypt-decrypt.test.ts create mode 100644 packages/taco/src/viem-taco.ts create mode 100644 packages/taco/src/wrappers/index.ts create mode 100644 packages/taco/src/wrappers/viem-wrappers.ts create mode 100644 packages/taco/test/viem-unit.test.ts create mode 100644 packages/taco/test/viem-wrappers.test.ts diff --git a/packages/taco-auth/package.json b/packages/taco-auth/package.json index 2e68475af..83e4648b0 100644 --- a/packages/taco-auth/package.json +++ b/packages/taco-auth/package.json @@ -47,6 +47,14 @@ "devDependencies": { "@nucypher/test-utils": "workspace:*" }, + "peerDependencies": { + "viem": "^2.0.0" + }, + "peerDependenciesMeta": { + "viem": { + "optional": true + } + }, "engines": { "node": ">=18", "pnpm": ">=8.0.0" diff --git a/packages/taco-auth/src/providers/index.ts b/packages/taco-auth/src/providers/index.ts index 76b739f00..b1bcd4e23 100644 --- a/packages/taco-auth/src/providers/index.ts +++ b/packages/taco-auth/src/providers/index.ts @@ -7,3 +7,4 @@ export { } from './eip4361/auth'; export * from './eip4361/eip4361'; export * from './eip4361/external-eip4361'; +export * from './viem'; diff --git a/packages/taco-auth/src/providers/viem/index.ts b/packages/taco-auth/src/providers/viem/index.ts new file mode 100644 index 000000000..46d967630 --- /dev/null +++ b/packages/taco-auth/src/providers/viem/index.ts @@ -0,0 +1,3 @@ +export { ViemEIP4361AuthProvider } from './viem-auth-providers'; +export type { EIP4361AuthProviderParams } from './viem-auth-providers'; +export { createEthersProvider, createEthersSigner } from './viem-wrappers'; diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts new file mode 100644 index 000000000..9c5bca591 --- /dev/null +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -0,0 +1,80 @@ +import { EIP4361AuthProvider, EIP4361AuthProviderParams } from '../eip4361/eip4361'; + +import { createEthersProvider, createEthersSigner } from './viem-wrappers'; + +// Dynamic viem types (available only when viem is installed) +type Account = any; +type PublicClient = any; + +/** + * Viem-compatible EIP4361 authentication provider. + * + * This class provides a clean viem-native API for EIP4361 authentication + * while internally handling the conversion to ethers.js objects that the + * underlying EIP4361AuthProvider expects. + * + * @example + * ```typescript + * import { createPublicClient, http } from 'viem'; + * import { privateKeyToAccount } from 'viem/accounts'; + * import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; + * + * const publicClient = createPublicClient({ + * chain: polygon, + * transport: http() + * }); + * const account = privateKeyToAccount('0x...'); + * + * const authProvider = new ViemEIP4361AuthProvider( + * publicClient, + * account, + * { domain: 'my-app.com', uri: 'https://my-app.com' } + * ); + * + * const signature = await authProvider.getOrCreateAuthSignature(); + * ``` + */ +export class ViemEIP4361AuthProvider { + private ethersAuthProvider: EIP4361AuthProvider; + + /** + * Create a new ViemEIP4361AuthProvider + * + * @param viemPublicClient - viem PublicClient for blockchain interactions + * @param viemAccount - viem Account for signing operations + * @param options - Optional EIP4361 parameters (domain, uri) + */ + constructor( + viemPublicClient: PublicClient, + viemAccount: Account, + options?: EIP4361AuthProviderParams + ) { + // Convert viem objects to ethers objects internally + const ethersProvider = createEthersProvider(viemPublicClient); + const ethersSigner = createEthersSigner(viemAccount, ethersProvider); + + // Create the underlying ethers auth provider + this.ethersAuthProvider = new EIP4361AuthProvider( + ethersProvider, + ethersSigner, + options + ); + } + + /** + * Get or create authentication signature + */ + async getOrCreateAuthSignature() { + return this.ethersAuthProvider.getOrCreateAuthSignature(); + } + + /** + * Get the underlying ethers auth provider (for advanced use cases) + */ + get ethersProvider(): EIP4361AuthProvider { + return this.ethersAuthProvider; + } +} + +// Export type for consumers +export type { EIP4361AuthProviderParams }; diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts new file mode 100644 index 000000000..6a090a22e --- /dev/null +++ b/packages/taco-auth/src/providers/viem/viem-wrappers.ts @@ -0,0 +1,161 @@ +import { ethers } from 'ethers'; + +// Dynamic viem types (available only when viem is installed) +type Account = any; +type PublicClient = any; + +/** + * Checks if viem is available and throws a helpful error if not + */ +function checkViemAvailability(): void { + try { + require('viem'); + } catch (error) { + throw new Error( + 'viem is required for viem auth providers. Install it with: npm install viem', + ); + } +} + +/** + * A minimal provider that wraps viem PublicClient for auth provider compatibility + * + * This class implements only the methods needed for EIP4361AuthProvider to work. + * It uses type assertion to satisfy the ethers.providers.Provider interface + * without implementing all methods. + */ +class ViemAuthProvider { + private viemPublicClient: PublicClient; + + constructor(viemPublicClient: PublicClient) { + this.viemPublicClient = viemPublicClient; + } + + async getNetwork(): Promise { + const chainId = await this.viemPublicClient.getChainId(); + return { + name: this.viemPublicClient.chain?.name || `chain-${chainId}`, + chainId, + }; + } + + async call(transaction: ethers.providers.TransactionRequest): Promise { + const result = await this.viemPublicClient.call({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + }); + if (typeof result === 'object' && result && 'data' in result) { + return result.data as string; + } + return result as string; + } + + // Stub methods for ethers compatibility (not used by EIP4361AuthProvider) + async getBlockNumber(): Promise { return 0; } + async getGasPrice(): Promise { return ethers.BigNumber.from(0); } + async getFeeData(): Promise { return null; } + async getBalance(): Promise { return ethers.BigNumber.from(0); } + async getTransactionCount(): Promise { return 0; } + async getCode(): Promise { return '0x'; } + async getStorageAt(): Promise { return '0x'; } + async sendTransaction(): Promise { throw new Error('Not implemented'); } + async getTransaction(): Promise { return null; } + async getTransactionReceipt(): Promise { return null; } + async getLogs(): Promise { return []; } + async getBlock(): Promise { return null; } + async getBlockWithTransactions(): Promise { return null; } + async resolveName(): Promise { return null; } + async lookupAddress(): Promise { return null; } + async waitForTransaction(): Promise { return null; } + + // Event emitter methods (not used by EIP4361AuthProvider) + on(): this { return this; } + off(): this { return this; } + removeAllListeners(): this { return this; } + listenerCount(): number { return 0; } + listeners(): any[] { return []; } + emit(): boolean { return false; } +} + +/** + * A signer that wraps viem Account for auth provider compatibility + * + * This class implements only the methods needed for EIP4361AuthProvider to work. + */ +class ViemAuthSigner { + private viemAccount: Account; + private provider: ethers.providers.Provider; + + constructor(viemAccount: Account, provider: ethers.providers.Provider) { + this.viemAccount = viemAccount; + this.provider = provider; + } + + get address(): string { + return this.viemAccount.address; + } + + getAddress(): Promise { + return Promise.resolve(this.viemAccount.address); + } + + async signMessage(message: string | Uint8Array): Promise { + checkViemAvailability(); + // Convert message to hex if it's Uint8Array + const messageToSign = typeof message === 'string' ? message : ethers.utils.hexlify(message); + return await this.viemAccount.signMessage({ message: messageToSign }); + } + + async signTypedData(domain: any, types: any, message: any): Promise { + checkViemAvailability(); + return await this.viemAccount.signTypedData({ + domain, + types, + message, + primaryType: Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', + }); + } + + getProvider(): ethers.providers.Provider { + return this.provider; + } + + // Required ethers signer properties and stub methods + _isSigner = true; + + // Stub methods for ethers Signer compatibility (not used by EIP4361AuthProvider) + async signTransaction(): Promise { throw new Error('Not implemented'); } + connect(): this { return this; } + async getBalance(): Promise { return ethers.BigNumber.from(0); } + async getTransactionCount(): Promise { return 0; } + async getGasPrice(): Promise { return ethers.BigNumber.from(0); } + async getFeeData(): Promise { return null; } + async estimateGas(): Promise { return ethers.BigNumber.from(0); } + async call(): Promise { return '0x'; } + async sendTransaction(): Promise { throw new Error('Not implemented'); } + async getChainId(): Promise { return (await this.provider.getNetwork()).chainId; } + async resolveName(): Promise { return null; } + checkTransaction(): any { return {}; } + populateTransaction(): Promise { return Promise.resolve({}); } +} + +/** + * Create an ethers-compatible provider from viem PublicClient + * Minimal version for auth provider compatibility + */ +export function createEthersProvider(viemPublicClient: PublicClient): ethers.providers.Provider { + checkViemAvailability(); + // Use type assertion since we implement the minimal interface needed for auth + return new ViemAuthProvider(viemPublicClient) as unknown as ethers.providers.Provider; +} + +/** + * Create an ethers-compatible signer from viem Account + * Minimal version for auth provider compatibility + */ +export function createEthersSigner(viemAccount: Account, provider: ethers.providers.Provider): ethers.Signer { + checkViemAvailability(); + // Use type assertion since we implement the minimal interface needed for auth + return new ViemAuthSigner(viemAccount, provider) as unknown as ethers.Signer; +} diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md new file mode 100644 index 000000000..4a370bb92 --- /dev/null +++ b/packages/taco/VIEM_SUPPORT.md @@ -0,0 +1,154 @@ +# Viem Support + +The TACo SDK supports [viem](https://viem.sh) for encryption and decryption +operations. + +## Installation + +Viem is optional. Install it only if you want to use viem instead of ethers.js: + +```bash +npm install viem +``` + +### For Authentication Providers + +If you need viem-compatible authentication providers (like `ViemEIP4361AuthProvider`), install the taco-auth package: + +```bash +npm install @nucypher/taco-auth viem +``` + +## Sample Usage + +```typescript +import { createPublicClient, http } from 'viem'; +import { polygonAmoy } from 'viem/chains'; +import { privateKeyToAccount } from 'viem/accounts'; +import { encryptWithViem, decryptWithViem } from '@nucypher/taco'; +import * as conditions from '@nucypher/taco/conditions'; + +// Create viem client +const viemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(), +}); +// Create account +const viemAccount = privateKeyToAccount('0x...'); + +// Create access condition +const condition = conditions.predefined.erc20Balance({ + contractAddress: '0x...', + standardContractType: 'ERC20', + chain: 80002, + method: 'balanceOf', + parameters: [':userAddress'], + returnValueTest: { + comparator: '>', + value: 0, + }, +}); + +// Encrypt a message +const encryptedKit = await encryptWithViem( + viemPublicClient, + 'lynx', + 'Hello, secret!', + condition, + 27, // ritual ID + viemAccount, +); + +// Decrypt the message +const decryptedMessage = await decryptWithViem( + viemPublicClient, + 'lynx', + encryptedKit, +); + +console.log(new TextDecoder().decode(decryptedMessage)); // "Hello, secret!" +``` + +### Viem-Compatible Functions + +#### `encryptWithViem(viemPublicClient, domain, message, condition, ritualId, viemAccount)` + +Encrypts a message using viem objects. + +- `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations +- `domain`: `Domain` - TACo domain ('lynx', 'TESTNET', 'MAINNET') +- `message`: `Uint8Array | string` - Message to encrypt +- `condition`: `Condition` - Access condition for decryption +- `ritualId`: `number` - DKG ritual ID +- `viemAccount`: `Account` - Viem account for signing + +Returns: `Promise` + +#### `decryptWithViem(viemPublicClient, domain, messageKit, context?, porterUris?)` + +Decrypts a message using viem objects. + +- `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations +- `domain`: `Domain` - TACo domain +- `messageKit`: `ThresholdMessageKit` - Encrypted message kit +- `context?`: `ConditionContext` - Optional context for conditions +- `porterUris?`: `string[]` - Optional Porter service URIs + +Returns: `Promise` + +## Viem Authentication Providers + +For applications that need authentication providers compatible with viem, use the `@nucypher/taco-auth` package: + +### ViemEIP4361AuthProvider + +Creates an EIP-4361 compliant authentication provider from viem objects: + +```typescript +import { createPublicClient, createWalletClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; +import { polygonAmoy } from 'viem/chains'; +import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; + +const publicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(), +}); +const account = privateKeyToAccount('0x...'); + +const authProvider = new ViemEIP4361AuthProvider( + publicClient, + account, + { + domain: 'my-app.com', + uri: 'https://my-app.com' + } +); + +const authSignature = await authProvider.getOrCreateAuthSignature(); +``` + +**Parameters:** +- `viemPublicClient`: `PublicClient` - Viem public client for network operations +- `viemAccount`: `Account` - Viem account for signing +- `options?`: `EIP4361AuthProviderParams` - Optional domain and URI for EIP-4361 messages + +**Methods:** +- `getOrCreateAuthSignature()`: Returns authentication signature for TACo operations +- `ethersProvider`: Getter for underlying ethers-compatible auth provider + +## Package Architecture + +### @nucypher/taco +- **Purpose**: Core encryption and decryption functionality +- **Viem Functions**: `encryptWithViem()`, `decryptWithViem()` +- **Dependencies**: Only viem functions for encryption operations + +### @nucypher/taco-auth +- **Purpose**: Authentication providers and signing utilities +- **Viem Functions**: `ViemEIP4361AuthProvider` +- **Dependencies**: Viem authentication and EIP-4361 signing + +This separation follows clean architecture principles - use the appropriate package based on your needs: +- **Encryption only**: Install `@nucypher/taco` + `viem` +- **Authentication required**: Install both `@nucypher/taco` + `@nucypher/taco-auth` + `viem` diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts new file mode 100644 index 000000000..97ea57c37 --- /dev/null +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -0,0 +1,261 @@ +import { beforeAll, describe, expect, test } from 'vitest'; + +import { fromBytes, toBytes } from '@nucypher/shared'; +import { + USER_ADDRESS_PARAM_DEFAULT, +} from '@nucypher/taco-auth'; +import { createPublicClient, createWalletClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; +import { polygonAmoy } from 'viem/chains'; +import { conditions, initialize, ThresholdMessageKit } from '../src'; +import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; +import { CompoundCondition } from '../src/conditions/compound-condition'; +import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; +import { UINT256_MAX } from '../test/test-utils'; + +const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; +const ENCRYPTOR_PRIVATE_KEY = + '0x900edb9e8214b2353f82aa195e915128f419a92cfb8bbc0f4784f10ef4112b86'; +const CONSUMER_PRIVATE_KEY = + '0xf307e165339cb5deb2b8ec59c31a5c0a957b8e8453ce7fe8a19d9a4c8acf36d4'; +const DOMAIN = 'lynx'; +const RITUAL_ID = 27; +const CHAIN_ID = 80002; + +// Create viem accounts from private keys +const encryptorAccount = privateKeyToAccount( + ENCRYPTOR_PRIVATE_KEY as `0x${string}`, +); +const consumerAccount = privateKeyToAccount( + CONSUMER_PRIVATE_KEY as `0x${string}`, +); + +describe('Viem Encrypt/Decrypt Integration Test', () => { + let viemPublicClient: any; + let viemWalletClient: any; + + beforeAll(async () => { + // Create viem clients + viemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + viemWalletClient = createWalletClient({ + account: consumerAccount, + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + // Initialize the library + await initialize(); + + // Verify network connection + const chainId = await viemPublicClient.getChainId(); + if (chainId !== CHAIN_ID) { + throw new Error( + `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${chainId}`, + ); + } + }); + + test('should encrypt and decrypt a message with viem using RPC balance condition', async () => { + // Create test message + const messageString = 'This is a secret viem message 🔐'; + const message = toBytes(messageString); + + // Create conditions + const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + const balanceLessThanMaxUintBigInt = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '<', + // max uint256 + value: UINT256_MAX, + }, + }); + + const compoundCondition = CompoundCondition.and([ + hasPositiveBalance, + balanceLessThanMaxUintBigInt, + ]); + + // Encrypt message using viem + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + compoundCondition, + RITUAL_ID, + encryptorAccount, + ); + + const encryptedBytes = messageKit.toBytes(); + + // Prepare for decryption + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using viem-native auth provider + if ( + conditionContext.requestedContextParameters.has( + USER_ADDRESS_PARAM_DEFAULT, + ) + ) { + // Use the new ViemEIP4361AuthProvider - no manual conversion needed! + const viemAuthProvider = new ViemEIP4361AuthProvider( + viemPublicClient, + consumerAccount, + ); + + // Get the underlying ethers auth provider for context compatibility + const ethersAuthProvider = viemAuthProvider.ethersProvider; + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + ethersAuthProvider, + ); + } + + // Decrypt message using viem + const decryptedBytes = await decryptWithViem( + viemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout + + test('should encrypt and decrypt with viem using simple positive balance condition', async () => { + // Create test message + const messageString = + 'This viem message tests simple balance condition'; + const message = toBytes(messageString); + + // Create simple positive balance condition (avoids problematic allowlist condition) + const positiveBalanceCondition = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + // Encrypt message with viem using simple condition + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + positiveBalanceCondition, + RITUAL_ID, + encryptorAccount, + ); + + const encryptedBytes = messageKit.toBytes(); + + // Prepare for decryption + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using ViemEIP4361AuthProvider + const viemAuthProvider = new ViemEIP4361AuthProvider( + viemPublicClient, + consumerAccount, + ); + + // Get the ethers-compatible auth provider for context + const ethersAuthProvider = viemAuthProvider.ethersProvider; + conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider); + + // Decrypt message using viem + const decryptedBytes = await decryptWithViem( + viemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption was successful + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout + + test('should work with different viem account types', async () => { + // This test verifies viem integration works with different account configurations + const messageString = 'Testing different viem account types'; + const message = toBytes(messageString); + + // Create a simple condition + const simpleCondition = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + // Test encryption with viem account + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + simpleCondition, + RITUAL_ID, + encryptorAccount, + ); + + // Test decryption with different viem client setup + const anotherViemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + const messageKitFromBytes = ThresholdMessageKit.fromBytes( + messageKit.toBytes(), + ); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using ViemEIP4361AuthProvider with different client + const viemAuthProvider = new ViemEIP4361AuthProvider( + anotherViemPublicClient, + consumerAccount, + ); + + // Get the ethers-compatible auth provider + const ethersAuthProvider = viemAuthProvider.ethersProvider; + conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider); + + // Decrypt using the different client + const decryptedBytes = await decryptWithViem( + anotherViemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout +}); diff --git a/packages/taco/package.json b/packages/taco/package.json index 39fcf9f7e..b3e4b49bf 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -49,6 +49,14 @@ "semver": "^7.7.1", "zod": "^3.24.2" }, + "peerDependencies": { + "viem": "^2.0.0" + }, + "peerDependenciesMeta": { + "viem": { + "optional": true + } + }, "devDependencies": { "@nucypher/test-utils": "workspace:*", "@types/semver": "^7.7.0", diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 698685a1b..10e26035f 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -12,3 +12,6 @@ export { export * as conditions from './conditions'; export { decrypt, encrypt, encryptWithPublicKey } from './taco'; + +// Viem-compatible functions +export { decryptWithViem, encryptWithViem } from './viem-taco'; diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts new file mode 100644 index 000000000..cb473ca65 --- /dev/null +++ b/packages/taco/src/viem-taco.ts @@ -0,0 +1,134 @@ +import { ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { Domain } from '@nucypher/shared'; + +// Dynamic viem types (available only when viem is installed) +// instead of `import type { Account, PublicClient } from 'viem';` +type Account = any; +type PublicClient = any; + +import { Condition } from './conditions/condition'; +import { ConditionContext } from './conditions/context'; +import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; +import { createEthersProvider, createEthersSigner } from './wrappers'; + +/** + * Encrypts a message under given conditions using viem clients. + * + * This is a viem-compatible version of the encrypt function that accepts viem clients + * instead of ethers providers and signers. + * + * @export + * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations + * @param {Domain} domain - Represents the logical network for encryption (must match ritualId) + * @param {Uint8Array | string} message - The message to be encrypted + * @param {Condition} condition - Condition under which the message will be encrypted + * @param {number} ritualId - The ID of the DKG Ritual to be used for encryption + * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization + * + * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit + * + * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown + * + * @example + * ```typescript + * import { createPublicClient, createWalletClient, http } from 'viem'; + * import { polygonAmoy } from 'viem/chains'; + * import { privateKeyToAccount } from 'viem/accounts'; + * + * // Using explicit clients + * const viemPublicClient = createPublicClient({ + * chain: polygonAmoy, + * transport: http() + * }); + * + * const viemAuthSigner = privateKeyToAccount('0x...'); + * + * const encrypted = await encryptWithViem( + * viemPublicClient, // Your viem public client + * 'lynx', // TACo domain + * 'Hello, secret!', // Message to encrypt + * condition, // Access condition + * 27, // Ritual ID + * viemAuthSigner // Your viem account + * ); + * ``` + */ +export const encryptWithViem = async ( + viemPublicClient: PublicClient, + domain: Domain, + message: Uint8Array | string, + condition: Condition, + ritualId: number, + viemAuthSigner: Account, +): Promise => { + // Create ethers-compatible provider and signer from viem objects + const ethersProvider = createEthersProvider(viemPublicClient); + const ethersSigner = createEthersSigner(viemAuthSigner, ethersProvider); + + // Use the existing ethers-based encrypt function + return await ethersEncrypt( + ethersProvider, + domain, + message, + condition, + ritualId, + ethersSigner, + ); +}; + +/** + * Decrypts an encrypted message using viem clients. + * + * This is a viem-compatible version of the decrypt function that accepts viem clients + * instead of ethers providers. + * + * @export + * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations + * @param {Domain} domain - Represents the logical network for decryption (must match ritualId) + * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted + * @param {ConditionContext} context - Optional context data used for decryption time values + * @param {string[]} [porterUris] - Optional URI(s) for the Porter service + * + * @returns {Promise} Returns Promise that resolves with a decrypted message + * + * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error + * + * @example + * ```typescript + * import { createPublicClient, http } from 'viem'; + * import { polygonAmoy } from 'viem/chains'; + * + * const viemPublicClient = createPublicClient({ + * chain: polygonAmoy, + * transport: http() + * }); + * + * const decrypted = await decryptWithViem( + * viemPublicClient, + * 'lynx', + * messageKit, + * context + * ); + * + + * ``` + */ +export const decryptWithViem = async ( + viemPublicClient: PublicClient, + domain: Domain, + messageKit: ThresholdMessageKit, + context?: ConditionContext, + porterUris?: string[], +): Promise => { + // Create ethers-compatible provider from viem object + const ethersProvider = createEthersProvider(viemPublicClient); + + // Use the existing ethers-based decrypt function + return await ethersDecrypt( + ethersProvider, + domain, + messageKit, + context, + porterUris, + ); +}; diff --git a/packages/taco/src/wrappers/index.ts b/packages/taco/src/wrappers/index.ts new file mode 100644 index 000000000..f1c331620 --- /dev/null +++ b/packages/taco/src/wrappers/index.ts @@ -0,0 +1,6 @@ +// Viem adapter utilities +export { + createEthersFromViem, + createEthersProvider, + createEthersSigner, +} from './viem-wrappers'; diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts new file mode 100644 index 000000000..1121fd1e9 --- /dev/null +++ b/packages/taco/src/wrappers/viem-wrappers.ts @@ -0,0 +1,343 @@ +import { ethers } from 'ethers'; + +// Dynamic viem types (available only when viem is installed) +// instead of `import type { Account, PublicClient, WalletClient } from 'viem';` +type Account = any; +type PublicClient = any; +type WalletClient = any; + +/** + * Checks if viem is available and throws a helpful error if not + */ +function checkViemAvailability(): void { + try { + // Try to actually require viem to check if it's available + require('viem'); + } catch (error) { + throw new Error( + 'viem is required for viem wrapper functions. Install it with: npm install viem', + ); + } +} + +/** + * Dynamically imports viem types for runtime type checking + */ +async function importViem() { + checkViemAvailability(); + return await import('viem'); +} + +/** + * A provider that wraps viem PublicClient to work with ethers.js + */ +class ViemWrappedProvider { + private viemPublicClient: PublicClient; + + constructor(viemPublicClient: PublicClient) { + this.viemPublicClient = viemPublicClient; + } + + async getNetwork(): Promise { + const chainId = await this.viemPublicClient.getChainId(); + return { + name: this.viemPublicClient.chain?.name || `chain-${chainId}`, + chainId, + }; + } + + async getBlockNumber(): Promise { + return Number(await this.viemPublicClient.getBlockNumber()); + } + + async getGasPrice(): Promise { + const gasPrice = await this.viemPublicClient.getGasPrice(); + return ethers.BigNumber.from(gasPrice.toString()); + } + + async getBalance(address: string, blockTag?: string | number): Promise { + const balance = await this.viemPublicClient.getBalance({ + address: address as `0x${string}`, + }); + return ethers.BigNumber.from(balance.toString()); + } + + async getTransactionCount(address: string, blockTag?: string | number): Promise { + return await this.viemPublicClient.getTransactionCount({ + address: address as `0x${string}`, + }); + } + + async getCode(address: string, blockTag?: string | number): Promise { + return await this.viemPublicClient.getCode({ + address: address as `0x${string}`, + }); + } + + async call(transaction: ethers.providers.TransactionRequest, blockTag?: string | number): Promise { + const result = await this.viemPublicClient.call({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + }); + // viem returns {data: "0x..."} but ethers expects just "0x..." + if (typeof result === 'object' && result && 'data' in result) { + return result.data as string; + } + return result as string; + } + + async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + const gas = await this.viemPublicClient.estimateGas({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + }); + return ethers.BigNumber.from(gas.toString()); + } + + async getBlock(blockHashOrBlockTag: string | number): Promise { + if (typeof blockHashOrBlockTag === 'string' && blockHashOrBlockTag.startsWith('0x')) { + return await this.viemPublicClient.getBlock({ + blockHash: blockHashOrBlockTag as `0x${string}`, + }); + } else { + return await this.viemPublicClient.getBlock({ + blockNumber: BigInt(blockHashOrBlockTag), + }); + } + } + + async getTransaction(transactionHash: string): Promise { + return await this.viemPublicClient.getTransaction({ + hash: transactionHash as `0x${string}`, + }); + } + + async getTransactionReceipt(transactionHash: string): Promise { + return await this.viemPublicClient.getTransactionReceipt({ + hash: transactionHash as `0x${string}`, + }); + } + + async waitForTransaction(transactionHash: string): Promise { + return await this.viemPublicClient.waitForTransactionReceipt({ + hash: transactionHash as `0x${string}`, + }); + } + + // Additional methods that ethers contracts might need + async resolveName(name: string): Promise { + return null; // ENS resolution not implemented + } + + async lookupAddress(address: string): Promise { + return null; // Reverse ENS lookup not implemented + } + + async getFeeData(): Promise { + const gasPrice = await this.getGasPrice(); + return { + gasPrice, + maxFeePerGas: null, + maxPriorityFeePerGas: null, + lastBaseFeePerGas: null, + }; + } + + // Mark this as a viem wrapped provider + _isViemWrappedProvider = true; + + // Additional required Provider methods (stubs for compatibility) + async getStorageAt(address: string, position: string, blockTag?: string | number): Promise { + throw new Error('getStorageAt not implemented in viem wrapper'); + } + + async sendTransaction(signedTransaction: string): Promise { + throw new Error('sendTransaction not implemented in viem wrapper'); + } + + async getBlockWithTransactions(blockHashOrBlockTag: string | number): Promise { + throw new Error('getBlockWithTransactions not implemented in viem wrapper'); + } + + async getLogs(filter: any): Promise { + throw new Error('getLogs not implemented in viem wrapper'); + } + + // Ethers provider interface compatibility + connection?: any; + _network?: ethers.providers.Network; + _isProvider = true; + + // Additional stubs for compatibility + async on(): Promise { return this; } + async once(): Promise { return this; } + async off(): Promise { return this; } + async emit(): Promise { return false; } + async listenerCount(): Promise { return 0; } + async listeners(): Promise { return []; } + async removeAllListeners(): Promise { return this; } + async addListener(): Promise { return this; } + async removeListener(): Promise { return this; } + + get _viemPublicClient() { + return this.viemPublicClient; + } +} + +/** + * Creates an ethers.js provider from a viem public client + * + * @param viemPublicClient - Viem PublicClient to wrap as ethers provider + * @returns ethers.providers.Provider compatible with TACo SDK + */ +export function createEthersProvider( + viemPublicClient: PublicClient, +): ethers.providers.Provider { + // Check if viem is available + checkViemAvailability(); + + return new ViemWrappedProvider(viemPublicClient) as unknown as ethers.providers.Provider; +} + +/** + * Creates an ethers.js signer from a viem account and provider + * + * @param viemAccount - The viem account (from wallet client or account) + * @param provider - Ethers provider (can be created with createEthersProvider) + * @returns ethers.Signer compatible with TACo SDK + */ +export function createEthersSigner( + viemAccount: Account, + provider: ethers.providers.Provider, +): ethers.Signer { + // Check if viem is available + checkViemAvailability(); + + const signerAdapter = { + address: viemAccount.address, + provider, + + async getAddress(): Promise { + return viemAccount.address; + }, + + async signMessage(message: ethers.utils.Bytes | string): Promise { + const messageToSign = + typeof message === 'string' + ? message + : typeof message === 'object' && message.constructor === Uint8Array + ? new TextDecoder().decode(message as Uint8Array) + : String(message); + + if (!viemAccount.signMessage) { + throw new Error('Account does not support message signing'); + } + return await viemAccount.signMessage({ message: messageToSign }); + }, + + async signTransaction( + transaction: ethers.providers.TransactionRequest, + ): Promise { + if (!viemAccount.signTransaction) { + throw new Error('Account does not support transaction signing'); + } + + // Convert ethers transaction to viem format + const viemTx: any = { + to: transaction.to as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + data: transaction.data as `0x${string}`, + gas: transaction.gasLimit + ? BigInt(transaction.gasLimit.toString()) + : undefined, + gasPrice: transaction.gasPrice + ? BigInt(transaction.gasPrice.toString()) + : undefined, + nonce: transaction.nonce ? Number(transaction.nonce) : undefined, + }; + + return await viemAccount.signTransaction(viemTx); + }, + + async signTypedData( + domain: any, + types: Record, + message: Record, + ): Promise { + if (!viemAccount.signTypedData) { + throw new Error('Account does not support typed data signing'); + } + + return await viemAccount.signTypedData({ + domain, + types, + message, + primaryType: + Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', + }); + }, + + connect(provider: ethers.providers.Provider): ethers.Signer { + return createEthersSigner(viemAccount, provider); + }, + + // Additional signer methods for ethers compatibility + async getBalance() { + const balance = await provider.getBalance(viemAccount.address); + return balance; + }, + + async getTransactionCount() { + return await provider.getTransactionCount(viemAccount.address); + }, + + async estimateGas(transaction: ethers.providers.TransactionRequest) { + return await provider.estimateGas(transaction); + }, + + async call(transaction: ethers.providers.TransactionRequest) { + return await provider.call(transaction); + }, + + async sendTransaction(transaction: ethers.providers.TransactionRequest) { + throw new Error( + 'sendTransaction not implemented for viem wrapper - use signTransaction instead', + ); + }, + + // Type identification + _isSigner: true, + _isViemWrappedSigner: true, + _viemAccount: viemAccount, + }; + + return signerAdapter as unknown as ethers.Signer; +} + +/** + * Convenience function to create both provider and signer from viem clients + * + * @param viemPublicClient - Viem public client for provider functionality + * @param viemWalletClient - Viem wallet client for signing functionality + * @returns Object with ethers provider and signer + */ +export function createEthersFromViem( + viemPublicClient: PublicClient, + viemWalletClient: WalletClient, +) { + // Check if viem is available + checkViemAvailability(); + + if (!viemWalletClient.account) { + throw new Error('Wallet client must have an account attached'); + } + + const provider = createEthersProvider(viemPublicClient); + const signer = createEthersSigner(viemWalletClient.account, provider); + + return { provider, signer }; +} diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts new file mode 100644 index 000000000..7f7a96dc5 --- /dev/null +++ b/packages/taco/test/viem-unit.test.ts @@ -0,0 +1,169 @@ +import { + FerveoVariant, + initialize, + SessionStaticSecret, +} from '@nucypher/nucypher-core'; +import * as tacoAuth from '@nucypher/taco-auth'; +import { USER_ADDRESS_PARAM_DEFAULT } from '@nucypher/taco-auth'; +import { + aliceSecretKeyBytes, + fakeDkgFlow, + fakePorterUri, + fakeProvider, + fakeTDecFlow, + mockGetRitualIdFromPublicKey, + mockTacoDecrypt, + TEST_CHAIN_ID, + TEST_SIWE_PARAMS, +} from '@nucypher/test-utils'; +import { beforeAll, describe, expect, it, vi } from 'vitest'; + +import { conditions, domains, toBytes } from '../src'; +import { ConditionContext } from '../src/conditions/context'; +import { encryptWithViem, decryptWithViem } from '../src/viem-taco'; +import { createEthersProvider, createEthersSigner, createEthersFromViem } from '../src/wrappers/viem-wrappers'; + +import { + fakeDkgRitual, + mockDkgParticipants, + mockGetActiveRitual, + mockGetParticipants, + mockMakeSessionKey, +} from './test-utils'; + +// Shared test variables +const message = 'this is a secret viem message'; +const ownsNFT = new conditions.predefined.erc721.ERC721Ownership({ + contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', + parameters: [3591], + chain: TEST_CHAIN_ID, +}); + +describe('viem unit tests', () => { + beforeAll(async () => { + await initialize(); + }); + + describe('viem availability checks', () => { + it('should check if viem functions are exported', () => { + expect(encryptWithViem).toBeDefined(); + expect(decryptWithViem).toBeDefined(); + expect(typeof encryptWithViem).toBe('function'); + expect(typeof decryptWithViem).toBe('function'); + }); + + it('should check if wrapper functions exist', () => { + expect(createEthersProvider).toBeDefined(); + expect(createEthersSigner).toBeDefined(); + expect(createEthersFromViem).toBeDefined(); + }); + }); + + describe('viem encrypt/decrypt with mocked adapters', () => { + it('encrypts and decrypts using viem functions', async () => { + const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); + const mockedDkgRitual = fakeDkgRitual(mockedDkg); + const mockEthersProvider = fakeProvider(aliceSecretKeyBytes); + const mockEthersSigner = mockEthersProvider.getSigner(); + + // Mock the viem clients + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + } as any; + + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn(), + } as any; + + // Mock the adapter functions to return ethers objects + const createEthersProviderSpy = vi.spyOn(await import('../src/wrappers/viem-wrappers'), 'createEthersProvider') + .mockReturnValue(mockEthersProvider); + const createEthersSignerSpy = vi.spyOn(await import('../src/wrappers/viem-wrappers'), 'createEthersSigner') + .mockReturnValue(mockEthersSigner); + + const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); + + // Test encryption + const messageKit = await encryptWithViem( + mockViemPublicClient, + domains.DEVNET, + message, + ownsNFT, + mockedDkg.ritualId, + mockViemAccount, + ); + + expect(createEthersProviderSpy).toHaveBeenCalledWith(mockViemPublicClient); + expect(createEthersSignerSpy).toHaveBeenCalledWith(mockViemAccount, mockEthersProvider); + expect(getFinalizedRitualSpy).toHaveBeenCalled(); + expect(messageKit).toBeDefined(); + + // Setup decryption mocks + const { decryptionShares } = fakeTDecFlow({ + ...mockedDkg, + message: toBytes(message), + dkgPublicKey: mockedDkg.dkg.publicKey(), + thresholdMessageKit: messageKit, + }); + const { participantSecrets, participants } = await mockDkgParticipants( + mockedDkg.ritualId, + ); + const requesterSessionKey = SessionStaticSecret.random(); + const decryptSpy = mockTacoDecrypt( + mockedDkg.ritualId, + decryptionShares, + participantSecrets, + requesterSessionKey.publicKey(), + ); + const getParticipantsSpy = mockGetParticipants(participants); + const sessionKeySpy = mockMakeSessionKey(requesterSessionKey); + const getRitualIdFromPublicKey = mockGetRitualIdFromPublicKey( + mockedDkg.ritualId, + ); + const getRitualSpy = mockGetActiveRitual(mockedDkgRitual); + + const authProvider = new tacoAuth.EIP4361AuthProvider( + mockEthersProvider, + mockEthersSigner, + TEST_SIWE_PARAMS, + ); + + const conditionContext = ConditionContext.fromMessageKit(messageKit); + conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, authProvider); + + // Test decryption + const decryptedMessage = await decryptWithViem( + mockViemPublicClient, + domains.DEVNET, + messageKit, + conditionContext, + [fakePorterUri], + ); + + expect(decryptedMessage).toEqual(toBytes(message)); + expect(getParticipantsSpy).toHaveBeenCalled(); + expect(sessionKeySpy).toHaveBeenCalled(); + expect(getRitualIdFromPublicKey).toHaveBeenCalled(); + expect(getRitualSpy).toHaveBeenCalled(); + expect(decryptSpy).toHaveBeenCalled(); + + // Clean up spies + createEthersProviderSpy.mockRestore(); + createEthersSignerSpy.mockRestore(); + }); + + it('decrypts without optional parameters', async () => { + // This test just verifies the function exists and has the right signature + expect(decryptWithViem).toBeDefined(); + expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? + }); + }); + + describe('function signatures', () => { + it('should have correct function signatures', () => { + expect(encryptWithViem.length).toBe(6); // viemPublicClient, domain, message, condition, ritualId, viemAccount + expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? + }); + }); +}); diff --git a/packages/taco/test/viem-wrappers.test.ts b/packages/taco/test/viem-wrappers.test.ts new file mode 100644 index 000000000..d2f9fe377 --- /dev/null +++ b/packages/taco/test/viem-wrappers.test.ts @@ -0,0 +1,122 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { + createEthersFromViem, + createEthersProvider, + createEthersSigner, +} from '../src/wrappers/viem-wrappers'; + +describe('viem wrapper utilities', () => { + describe('function exports', () => { + it('should export all wrapper functions', () => { + expect(createEthersProvider).toBeDefined(); + expect(createEthersSigner).toBeDefined(); + expect(createEthersFromViem).toBeDefined(); + expect(typeof createEthersProvider).toBe('function'); + expect(typeof createEthersSigner).toBe('function'); + expect(typeof createEthersFromViem).toBe('function'); + }); + }); + + describe('createEthersProvider', () => { + it('should create a provider from viem client', () => { + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), + call: vi.fn().mockResolvedValue('0x'), + getBalance: vi.fn().mockResolvedValue(BigInt(0)), + getTransactionCount: vi.fn().mockResolvedValue(0), + estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), + getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), + } as any; + + const provider = createEthersProvider(mockViemPublicClient); + + expect(provider).toBeDefined(); + expect(provider.getNetwork).toBeDefined(); + expect(provider.getBlockNumber).toBeDefined(); + expect(provider.call).toBeDefined(); + expect(provider.getBalance).toBeDefined(); + expect(provider.getTransactionCount).toBeDefined(); + expect(provider.getGasPrice).toBeDefined(); + }); + }); + + describe('createEthersSigner', () => { + it('should create a signer from viem account', () => { + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + signTransaction: vi.fn().mockResolvedValue('0xsignedtx'), + } as any; + + const mockProvider = { + getNetwork: vi.fn().mockResolvedValue({ chainId: 80002 }), + } as any; + + const signer = createEthersSigner(mockViemAccount, mockProvider); + + expect(signer).toBeDefined(); + expect(signer.getAddress).toBeDefined(); + expect(signer.signMessage).toBeDefined(); + expect(signer.signTransaction).toBeDefined(); + expect(signer.provider).toBe(mockProvider); + }); + }); + + describe('createEthersFromViem', () => { + it('should create both provider and signer', () => { + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), + call: vi.fn().mockResolvedValue('0x'), + getBalance: vi.fn().mockResolvedValue(BigInt(0)), + getTransactionCount: vi.fn().mockResolvedValue(0), + estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), + getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), + } as any; + + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + } as any; + + const mockViemWalletClient = { + account: mockViemAccount, + } as any; + + const { provider, signer } = createEthersFromViem( + mockViemPublicClient, + mockViemWalletClient + ); + + expect(provider).toBeDefined(); + expect(signer).toBeDefined(); + expect(signer.provider).toBe(provider); + }); + + it('should throw error when wallet client has no account', () => { + const mockViemPublicClient = {} as any; + const mockViemWalletClient = { + account: undefined, + } as any; + + expect(() => createEthersFromViem( + mockViemPublicClient, + mockViemWalletClient + )).toThrow('Wallet client must have an account attached'); + }); + }); + + describe('error handling', () => { + it('should handle missing viem gracefully', () => { + // This test verifies that the functions exist and are callable + expect(createEthersProvider).toBeDefined(); + expect(createEthersSigner).toBeDefined(); + expect(createEthersFromViem).toBeDefined(); + expect(typeof createEthersProvider).toBe('function'); + expect(typeof createEthersSigner).toBe('function'); + expect(typeof createEthersFromViem).toBe('function'); + }); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 558fd750b..86dc69568 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,6 @@ overrides: nth-check@<2.0.1: '>=2.0.1' importers: - .: dependencies: '@changesets/cli': @@ -39,7 +38,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -105,7 +104,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -129,7 +128,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.3(webpack-cli@6.0.1)) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -145,7 +144,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1)) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -157,16 +156,16 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.101.3(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.101.3(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.101.3(webpack-cli@6.0.1)) + version: 5.6.3(webpack@5.99.9) process: specifier: ^0.11.10 version: 0.11.10 @@ -214,7 +213,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.3(webpack-cli@6.0.1)) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -230,7 +229,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1)) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -242,13 +241,13 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.101.3(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.101.3(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.101.3(webpack-cli@6.0.1)) + version: 5.6.3(webpack@5.99.9) react-refresh: specifier: ^0.17.0 version: 0.17.0 @@ -352,10 +351,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.101.3(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.101.3(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -474,10 +473,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.101.3(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.101.3(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) webpack: specifier: ^5.99.9 version: 5.101.3(webpack-cli@6.0.1) @@ -579,6 +578,9 @@ importers: semver: specifier: ^7.7.1 version: 7.7.1 + viem: + specifier: ^2.0.0 + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -609,7 +611,10 @@ importers: version: link:../shared siwe: specifier: ^3.0.0 - version: 3.0.0(ethers@5.8.0) + version: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + viem: + specifier: ^2.0.0 + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -637,1657 +642,2511 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) packages: + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: '>=10' } '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: '>=6.0.0' } '@apideck/better-ajv-errors@0.3.6': - resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==, + } + engines: { node: '>=10' } peerDependencies: ajv: '>=8' '@aptos-labs/aptos-cli@1.0.2': - resolution: {integrity: sha512-PYPsd0Kk3ynkxNfe3S4fanI3DiUICCoh4ibQderbvjPFL5A0oK6F4lPEO2t0MDsQySTk2t4vh99Xjy6Bd9y+aQ==} + resolution: + { + integrity: sha512-PYPsd0Kk3ynkxNfe3S4fanI3DiUICCoh4ibQderbvjPFL5A0oK6F4lPEO2t0MDsQySTk2t4vh99Xjy6Bd9y+aQ==, + } hasBin: true '@aptos-labs/aptos-client@1.1.0': - resolution: {integrity: sha512-rkGVjQufVONAwnMcjIbdPRmJnAoqBFxd8IXVUBJIVlDXkPgjW+Vj0P3z31CxDFE4mVBN6Wpu30BeBzCW/+IDPQ==} - engines: {node: '>=15.10.0'} + resolution: + { + integrity: sha512-rkGVjQufVONAwnMcjIbdPRmJnAoqBFxd8IXVUBJIVlDXkPgjW+Vj0P3z31CxDFE4mVBN6Wpu30BeBzCW/+IDPQ==, + } + engines: { node: '>=15.10.0' } peerDependencies: axios: ^1.8.0 got: ^11.8.6 '@aptos-labs/aptos-dynamic-transaction-composer@0.1.3': - resolution: {integrity: sha512-bJl+Zq5QbhpcPIJakAkl9tnT3T02mxCYhZThQDhUmjsOZ5wMRlKJ0P7aaq1dmlybSHkVj7vRgOy2t86/NDKKng==} + resolution: + { + integrity: sha512-bJl+Zq5QbhpcPIJakAkl9tnT3T02mxCYhZThQDhUmjsOZ5wMRlKJ0P7aaq1dmlybSHkVj7vRgOy2t86/NDKKng==, + } '@aptos-labs/script-composer-pack@0.0.9': - resolution: {integrity: sha512-Y3kA1rgF65HETgoTn2omDymsgO+fnZouPLrKJZ9sbxTGdOekIIHtGee3A2gk84eCqa02ZKBumZmP+IDCXRtU/g==} + resolution: + { + integrity: sha512-Y3kA1rgF65HETgoTn2omDymsgO+fnZouPLrKJZ9sbxTGdOekIIHtGee3A2gk84eCqa02ZKBumZmP+IDCXRtU/g==, + } '@aptos-labs/ts-sdk@1.37.1': - resolution: {integrity: sha512-l3kmbADrUPNEdnzt6Q4ehYJjky2jiSSRfpPtprctZSvAR/vXfKore1X07FQcx/LCZV9dIccw39zSgh9HBLUaIg==} - engines: {node: '>=20.0.0'} + resolution: + { + integrity: sha512-l3kmbADrUPNEdnzt6Q4ehYJjky2jiSSRfpPtprctZSvAR/vXfKore1X07FQcx/LCZV9dIccw39zSgh9HBLUaIg==, + } + engines: { node: '>=20.0.0' } '@astronautlabs/jsonpath@1.1.2': - resolution: {integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==} + resolution: + { + integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==, + } '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, + } + engines: { node: '>=6.9.0' } '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==, + } + engines: { node: '>=6.9.0' } '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==, + } + engines: { node: '>=6.9.0' } '@babel/eslint-parser@7.27.0': - resolution: {integrity: sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + resolution: + { + integrity: sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==, + } + engines: { node: ^10.13.0 || ^12.13.0 || >=14.0.0 } peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==, + } + engines: { node: '>=6.9.0' } '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-create-class-features-plugin@7.27.0': - resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-define-polyfill-provider@0.6.4': - resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} + resolution: + { + integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==, + } peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==, + } + engines: { node: '>=6.9.0' } '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==, + } + engines: { node: '>=6.9.0' } '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, + } + engines: { node: '>=6.9.0' } '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, + } + engines: { node: '>=6.9.0' } '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==, + } + engines: { node: '>=6.9.0' } '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==, + } + engines: { node: '>=6.9.0' } '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==, + } + engines: { node: '>=6.0.0' } hasBin: true '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.13.0 '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-proposal-class-properties@7.18.6': resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-decorators@7.25.9': - resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-numeric-separator@7.18.6': resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-optional-chaining@7.21.0': resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-methods@7.18.6': resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-property-in-object@7.21.11': resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + resolution: + { + integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + resolution: + { + integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + resolution: + { + integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-decorators@7.25.9': - resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-flow@7.26.0': - resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + resolution: + { + integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + resolution: + { + integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + resolution: + { + integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + resolution: + { + integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + resolution: + { + integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + resolution: + { + integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + resolution: + { + integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, + } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoping@7.27.0': - resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.12.0 '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-flow-strip-types@7.26.5': - resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-constant-elements@7.25.9': - resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-display-name@7.25.9': - resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-development@7.25.9': - resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx@7.25.9': - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-pure-annotations@7.25.9': - resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regenerator@7.27.0': - resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-runtime@7.26.10': - resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typescript@7.27.0': - resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0 '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + resolution: + { + integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, + } peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 '@babel/preset-react@7.26.3': - resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/preset-typescript@7.27.0': - resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==, + } + engines: { node: '>=6.9.0' } peerDependencies: '@babel/core': ^7.0.0-0 '@babel/runtime@7.27.0': - resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==, + } + engines: { node: '>=6.9.0' } '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==, + } + engines: { node: '>=6.9.0' } '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==, + } + engines: { node: '>=6.9.0' } '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==, + } + engines: { node: '>=6.9.0' } '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + resolution: + { + integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, + } '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==, + } + engines: { node: '>=18' } '@changesets/apply-release-plan@7.0.10': - resolution: {integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==} + resolution: + { + integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==, + } '@changesets/assemble-release-plan@6.0.6': - resolution: {integrity: sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg==} + resolution: + { + integrity: sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg==, + } '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + resolution: + { + integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==, + } '@changesets/cli@2.28.1': - resolution: {integrity: sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==} + resolution: + { + integrity: sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==, + } hasBin: true '@changesets/config@3.1.1': - resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + resolution: + { + integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==, + } '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + resolution: + { + integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==, + } '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + resolution: + { + integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==, + } '@changesets/get-release-plan@4.0.8': - resolution: {integrity: sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ==} + resolution: + { + integrity: sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ==, + } '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + resolution: + { + integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==, + } '@changesets/git@3.0.2': - resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + resolution: + { + integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==, + } '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + resolution: + { + integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==, + } '@changesets/parse@0.4.1': - resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + resolution: + { + integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==, + } '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + resolution: + { + integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==, + } '@changesets/read@0.6.3': - resolution: {integrity: sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg==} + resolution: + { + integrity: sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg==, + } '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + resolution: + { + integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==, + } '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + resolution: + { + integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==, + } '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + resolution: + { + integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==, + } '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + resolution: + { + integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==, + } '@commander-js/extra-typings@12.1.0': - resolution: {integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==} + resolution: + { + integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==, + } peerDependencies: commander: ~12.1.0 '@commitlint/config-validator@19.8.0': - resolution: {integrity: sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==} - engines: {node: '>=v18'} + resolution: + { + integrity: sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==, + } + engines: { node: '>=v18' } '@commitlint/execute-rule@19.8.0': - resolution: {integrity: sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==} - engines: {node: '>=v18'} + resolution: + { + integrity: sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==, + } + engines: { node: '>=v18' } '@commitlint/load@19.8.0': - resolution: {integrity: sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==} - engines: {node: '>=v18'} + resolution: + { + integrity: sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==, + } + engines: { node: '>=v18' } '@commitlint/resolve-extends@19.8.0': - resolution: {integrity: sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==} - engines: {node: '>=v18'} + resolution: + { + integrity: sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==, + } + engines: { node: '>=v18' } '@commitlint/types@19.8.0': - resolution: {integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==} - engines: {node: '>=v18'} + resolution: + { + integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==, + } + engines: { node: '>=v18' } '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, + } + engines: { node: '>=12' } '@csstools/normalize.css@12.1.1': - resolution: {integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==} + resolution: + { + integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==, + } '@csstools/postcss-cascade-layers@1.1.1': - resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-color-function@1.1.1': - resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-font-format-keywords@1.0.1': - resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-hwb-function@1.0.2': - resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-ic-unit@1.0.1': - resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-is-pseudo-class@2.0.7': - resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-nested-calc@1.0.0': - resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-normalize-display-values@1.0.1': - resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-oklab-function@1.1.1': - resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-progressive-custom-properties@1.3.0': - resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.3 '@csstools/postcss-stepped-value-functions@1.0.1': - resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-text-decoration-shorthand@1.0.0': - resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-trigonometric-functions@1.0.2': - resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} - engines: {node: ^14 || >=16} + resolution: + { + integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==, + } + engines: { node: ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/postcss-unset-value@1.0.2': - resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 '@csstools/selector-specificity@2.2.0': - resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} - engines: {node: ^14 || ^16 || >=18} + resolution: + { + integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==, + } + engines: { node: ^14 || ^16 || >=18 } peerDependencies: postcss-selector-parser: ^6.0.10 '@discoveryjs/json-ext@0.6.3': - resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} - engines: {node: '>=14.17.0'} + resolution: + { + integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==, + } + engines: { node: '>=14.17.0' } '@emnapi/core@1.4.0': - resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==} + resolution: + { + integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==, + } '@emnapi/runtime@1.4.0': - resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} + resolution: + { + integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==, + } - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + resolution: + { + integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==, + } '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, + } + engines: { node: '>=12' } cpu: [ppc64] os: [aix] '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==, + } + engines: { node: '>=18' } cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.16.17': - resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==, + } + engines: { node: '>=12' } cpu: [arm64] os: [android] '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, + } + engines: { node: '>=12' } cpu: [arm64] os: [android] '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==, + } + engines: { node: '>=18' } cpu: [arm64] os: [android] '@esbuild/android-arm@0.16.17': - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==, + } + engines: { node: '>=12' } cpu: [arm] os: [android] '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, + } + engines: { node: '>=12' } cpu: [arm] os: [android] '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==, + } + engines: { node: '>=18' } cpu: [arm] os: [android] '@esbuild/android-x64@0.16.17': - resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==, + } + engines: { node: '>=12' } cpu: [x64] os: [android] '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, + } + engines: { node: '>=12' } cpu: [x64] os: [android] '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==, + } + engines: { node: '>=18' } cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.16.17': - resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==, + } + engines: { node: '>=12' } cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, + } + engines: { node: '>=12' } cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==, + } + engines: { node: '>=18' } cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.16.17': - resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==, + } + engines: { node: '>=12' } cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, + } + engines: { node: '>=12' } cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==, + } + engines: { node: '>=18' } cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.16.17': - resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==, + } + engines: { node: '>=12' } cpu: [arm64] os: [freebsd] '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, + } + engines: { node: '>=12' } cpu: [arm64] os: [freebsd] '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==, + } + engines: { node: '>=18' } cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.16.17': - resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==, + } + engines: { node: '>=12' } cpu: [x64] os: [freebsd] '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, + } + engines: { node: '>=12' } cpu: [x64] os: [freebsd] '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==, + } + engines: { node: '>=18' } cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.16.17': - resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==, + } + engines: { node: '>=12' } cpu: [arm64] os: [linux] '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, + } + engines: { node: '>=12' } cpu: [arm64] os: [linux] '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==, + } + engines: { node: '>=18' } cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.16.17': - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==, + } + engines: { node: '>=12' } cpu: [arm] os: [linux] '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, + } + engines: { node: '>=12' } cpu: [arm] os: [linux] '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==, + } + engines: { node: '>=18' } cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.16.17': - resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==, + } + engines: { node: '>=12' } cpu: [ia32] os: [linux] '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, + } + engines: { node: '>=12' } cpu: [ia32] os: [linux] '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==, + } + engines: { node: '>=18' } cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.16.17': - resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==, + } + engines: { node: '>=12' } cpu: [loong64] os: [linux] '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, + } + engines: { node: '>=12' } cpu: [loong64] os: [linux] '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==, + } + engines: { node: '>=18' } cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.16.17': - resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==, + } + engines: { node: '>=12' } cpu: [mips64el] os: [linux] '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, + } + engines: { node: '>=12' } cpu: [mips64el] os: [linux] '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==, + } + engines: { node: '>=18' } cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.16.17': - resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==, + } + engines: { node: '>=12' } cpu: [ppc64] os: [linux] '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, + } + engines: { node: '>=12' } cpu: [ppc64] os: [linux] '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==, + } + engines: { node: '>=18' } cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.16.17': - resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==, + } + engines: { node: '>=12' } cpu: [riscv64] os: [linux] '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, + } + engines: { node: '>=12' } cpu: [riscv64] os: [linux] '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==, + } + engines: { node: '>=18' } cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.16.17': - resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==, + } + engines: { node: '>=12' } cpu: [s390x] os: [linux] '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, + } + engines: { node: '>=12' } cpu: [s390x] os: [linux] '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==, + } + engines: { node: '>=18' } cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.16.17': - resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==, + } + engines: { node: '>=12' } cpu: [x64] os: [linux] '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, + } + engines: { node: '>=12' } cpu: [x64] os: [linux] '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==, + } + engines: { node: '>=18' } cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==, + } + engines: { node: '>=18' } cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.16.17': - resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==, + } + engines: { node: '>=12' } cpu: [x64] os: [netbsd] '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, + } + engines: { node: '>=12' } cpu: [x64] os: [netbsd] '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==, + } + engines: { node: '>=18' } cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==, + } + engines: { node: '>=18' } cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.16.17': - resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==, + } + engines: { node: '>=12' } cpu: [x64] os: [openbsd] '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, + } + engines: { node: '>=12' } cpu: [x64] os: [openbsd] '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==, + } + engines: { node: '>=18' } cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.16.17': - resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==, + } + engines: { node: '>=12' } cpu: [x64] os: [sunos] '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, + } + engines: { node: '>=12' } cpu: [x64] os: [sunos] '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==, + } + engines: { node: '>=18' } cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.16.17': - resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==, + } + engines: { node: '>=12' } cpu: [arm64] os: [win32] '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, + } + engines: { node: '>=12' } cpu: [arm64] os: [win32] '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==, + } + engines: { node: '>=18' } cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.16.17': - resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==, + } + engines: { node: '>=12' } cpu: [ia32] os: [win32] '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, + } + engines: { node: '>=12' } cpu: [ia32] os: [win32] '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==, + } + engines: { node: '>=18' } cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.16.17': - resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==, + } + engines: { node: '>=12' } cpu: [x64] os: [win32] '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, + } + engines: { node: '>=12' } cpu: [x64] os: [win32] '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==, + } + engines: { node: '>=18' } cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { + integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } '@ethersproject/abi@5.8.0': - resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + resolution: + { + integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==, + } '@ethersproject/abstract-provider@5.8.0': - resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + resolution: + { + integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==, + } '@ethersproject/abstract-signer@5.8.0': - resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + resolution: + { + integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==, + } '@ethersproject/address@5.8.0': - resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + resolution: + { + integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==, + } '@ethersproject/base64@5.8.0': - resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + resolution: + { + integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==, + } '@ethersproject/basex@5.8.0': - resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} + resolution: + { + integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==, + } '@ethersproject/bignumber@5.8.0': - resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + resolution: + { + integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==, + } '@ethersproject/bytes@5.8.0': - resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + resolution: + { + integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==, + } '@ethersproject/constants@5.8.0': - resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + resolution: + { + integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==, + } '@ethersproject/contracts@5.8.0': - resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} + resolution: + { + integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==, + } '@ethersproject/hash@5.8.0': - resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + resolution: + { + integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==, + } '@ethersproject/hdnode@5.8.0': - resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} + resolution: + { + integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==, + } '@ethersproject/json-wallets@5.8.0': - resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} + resolution: + { + integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==, + } '@ethersproject/keccak256@5.8.0': - resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + resolution: + { + integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==, + } '@ethersproject/logger@5.8.0': - resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + resolution: + { + integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==, + } '@ethersproject/networks@5.8.0': - resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + resolution: + { + integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==, + } '@ethersproject/pbkdf2@5.8.0': - resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} + resolution: + { + integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==, + } '@ethersproject/properties@5.8.0': - resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + resolution: + { + integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==, + } '@ethersproject/providers@5.8.0': - resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} + resolution: + { + integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==, + } '@ethersproject/random@5.8.0': - resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} + resolution: + { + integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==, + } '@ethersproject/rlp@5.8.0': - resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + resolution: + { + integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==, + } '@ethersproject/sha2@5.8.0': - resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} + resolution: + { + integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==, + } '@ethersproject/signing-key@5.8.0': - resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + resolution: + { + integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==, + } '@ethersproject/solidity@5.8.0': - resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} + resolution: + { + integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==, + } '@ethersproject/strings@5.8.0': - resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + resolution: + { + integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==, + } '@ethersproject/transactions@5.8.0': - resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + resolution: + { + integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==, + } '@ethersproject/units@5.8.0': - resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} + resolution: + { + integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==, + } '@ethersproject/wallet@5.8.0': - resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} + resolution: + { + integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==, + } '@ethersproject/web@5.8.0': - resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + resolution: + { + integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==, + } '@ethersproject/wordlists@5.8.0': - resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} + resolution: + { + integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==, + } '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: '>=12.22' } '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead '@hutson/parse-repository-url@3.0.2': - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - - '@img/sharp-darwin-arm64@0.34.3': - resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} + resolution: + { + integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, + } + engines: { node: '>=6.9.0' } + + '@img/sharp-darwin-arm64@0.34.2': + resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.3': - resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} + '@img/sharp-darwin-x64@0.34.2': + resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.0': - resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.0': - resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.0': - resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.2.0': - resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.2.0': - resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.2.0': - resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.2.0': - resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.2.0': - resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.2.0': - resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.3': - resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} + '@img/sharp-linux-arm64@0.34.2': + resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.3': - resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} + '@img/sharp-linux-arm@0.34.2': + resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-ppc64@0.34.3': - resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ppc64] - os: [linux] - - '@img/sharp-linux-s390x@0.34.3': - resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} + '@img/sharp-linux-s390x@0.34.2': + resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.3': - resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} + '@img/sharp-linux-x64@0.34.2': + resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.3': - resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} + '@img/sharp-linuxmusl-arm64@0.34.2': + resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.3': - resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} + '@img/sharp-linuxmusl-x64@0.34.2': + resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.3': - resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} + '@img/sharp-wasm32@0.34.2': + resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.3': - resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} + '@img/sharp-win32-arm64@0.34.2': + resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.3': - resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} + '@img/sharp-win32-ia32@0.34.2': + resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.3': - resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} + '@img/sharp-win32-x64@0.34.2': + resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] '@irys/arweave@0.0.2': - resolution: {integrity: sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg==} + resolution: + { + integrity: sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg==, + } '@irys/query@0.0.8': - resolution: {integrity: sha512-J8zCZDos2vFogSbroCJHZJq5gnPZEal01Iy3duXAotjIMgrI2ElDANiqEbaP1JAImR1jdUo1ChJnZB7MRLN9Hw==} - engines: {node: '>=16.10.0'} + resolution: + { + integrity: sha512-J8zCZDos2vFogSbroCJHZJq5gnPZEal01Iy3duXAotjIMgrI2ElDANiqEbaP1JAImR1jdUo1ChJnZB7MRLN9Hw==, + } + engines: { node: '>=16.10.0' } '@irys/sdk@0.1.24': resolution: {integrity: sha512-8vpgd4o/B1KaChPDgSBcLjAJapi16t/6wlV0SIPEJefbPdDKVuPyK36N3SlFeMkYexrBdqQOkLomHxBaWs0pLA==} engines: {node: '>=16.10.0'} - deprecated: 'Arweave support is deprecated - We recommend migrating to the Irys datachain: https://migrate-to.irys.xyz/' hasBin: true '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: '>=12' } '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, + } + engines: { node: '>=8' } '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, + } + engines: { node: '>=8' } '@jest/console@27.5.1': - resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/console@28.1.3': - resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } '@jest/core@27.5.1': - resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -2295,20 +3154,32 @@ packages: optional: true '@jest/environment@27.5.1': - resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/fake-timers@27.5.1': - resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/globals@27.5.1': - resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/reporters@27.5.1': - resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -2316,267 +3187,465 @@ packages: optional: true '@jest/schemas@28.1.3': - resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } '@jest/source-map@27.5.1': - resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/test-result@27.5.1': - resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/test-result@28.1.3': - resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } '@jest/test-sequencer@27.5.1': - resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/transform@27.5.1': - resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/types@27.5.1': - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } '@jest/types@28.1.3': - resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, + } + engines: { node: '>=6.0.0' } '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: '>=6.0.0' } '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: '>=6.0.0' } '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + resolution: + { + integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, + } '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + resolution: + { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + resolution: + { + integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==, + } '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + resolution: + { + integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, + } '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/buffers@1.0.0': - resolution: {integrity: sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==} - engines: {node: '>=10.0'} + resolution: + { + integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==, + } + engines: { node: '>=10.0' } peerDependencies: tslib: '2' - '@jsonjoy.com/codegen@1.0.0': - resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + '@jsonjoy.com/json-pack@1.2.0': + resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.11.0': - resolution: {integrity: sha512-nLqSTAYwpk+5ZQIoVp7pfd/oSKNWlEdvTq2LzVA4r2wtWZg6v+5u0VgBOaDJuUfNOuw/4Ysq6glN5QKSrOCgrA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pointer@1.0.2': - resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.9.0': - resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + '@jsonjoy.com/util@1.6.0': + resolution: {integrity: sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + resolution: + { + integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==, + } '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + resolution: + { + integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==, + } '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + resolution: + { + integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==, + } '@metamask/detect-provider@2.0.0': - resolution: {integrity: sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==, + } + engines: { node: '>=14.0.0' } '@napi-rs/wasm-runtime@0.2.7': - resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} + resolution: + { + integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==, + } '@near-js/crypto@0.0.3': - resolution: {integrity: sha512-3WC2A1a1cH8Cqrx+0iDjp1ASEEhxN/KHEMENYb0KZH6Hp5bXIY7Akt4quC7JlgJS5ESvEiLa40tS5h0zAhBWGw==} + resolution: + { + integrity: sha512-3WC2A1a1cH8Cqrx+0iDjp1ASEEhxN/KHEMENYb0KZH6Hp5bXIY7Akt4quC7JlgJS5ESvEiLa40tS5h0zAhBWGw==, + } '@near-js/crypto@0.0.4': - resolution: {integrity: sha512-2mSIVv6mZway1rQvmkktrXAFoUvy7POjrHNH3LekKZCMCs7qMM/23Hz2+APgxZPqoV2kjarSNOEYJjxO7zQ/rQ==} + resolution: + { + integrity: sha512-2mSIVv6mZway1rQvmkktrXAFoUvy7POjrHNH3LekKZCMCs7qMM/23Hz2+APgxZPqoV2kjarSNOEYJjxO7zQ/rQ==, + } '@near-js/keystores-browser@0.0.3': - resolution: {integrity: sha512-Ve/JQ1SBxdNk3B49lElJ8Y54AoBY+yOStLvdnUIpe2FBOczzwDCkcnPcMDV0NMwVlHpEnOWICWHbRbAkI5Vs+A==} + resolution: + { + integrity: sha512-Ve/JQ1SBxdNk3B49lElJ8Y54AoBY+yOStLvdnUIpe2FBOczzwDCkcnPcMDV0NMwVlHpEnOWICWHbRbAkI5Vs+A==, + } '@near-js/keystores@0.0.3': - resolution: {integrity: sha512-mnwLYUt4Td8u1I4QE1FBx2d9hMt3ofiriE93FfOluJ4XiqRqVFakFYiHg6pExg5iEkej/sXugBUFeQ4QizUnew==} + resolution: + { + integrity: sha512-mnwLYUt4Td8u1I4QE1FBx2d9hMt3ofiriE93FfOluJ4XiqRqVFakFYiHg6pExg5iEkej/sXugBUFeQ4QizUnew==, + } '@near-js/keystores@0.0.4': - resolution: {integrity: sha512-+vKafmDpQGrz5py1liot2hYSjPGXwihveeN+BL11aJlLqZnWBgYJUWCXG+uyGjGXZORuy2hzkKK6Hi+lbKOfVA==} + resolution: + { + integrity: sha512-+vKafmDpQGrz5py1liot2hYSjPGXwihveeN+BL11aJlLqZnWBgYJUWCXG+uyGjGXZORuy2hzkKK6Hi+lbKOfVA==, + } '@near-js/providers@0.0.4': - resolution: {integrity: sha512-g/2pJTYmsIlTW4mGqeRlqDN9pZeN+1E2/wfoMIf3p++boBVxVlaSebtQgawXAf2lkfhb9RqXz5pHqewXIkTBSw==} + resolution: + { + integrity: sha512-g/2pJTYmsIlTW4mGqeRlqDN9pZeN+1E2/wfoMIf3p++boBVxVlaSebtQgawXAf2lkfhb9RqXz5pHqewXIkTBSw==, + } '@near-js/signers@0.0.3': - resolution: {integrity: sha512-u1R+DDIua5PY1PDFnpVYqdMgQ7c4dyeZsfqMjE7CtgzdqupgTYCXzJjBubqMlAyAx843PoXmLt6CSSKcMm0WUA==} + resolution: + { + integrity: sha512-u1R+DDIua5PY1PDFnpVYqdMgQ7c4dyeZsfqMjE7CtgzdqupgTYCXzJjBubqMlAyAx843PoXmLt6CSSKcMm0WUA==, + } '@near-js/signers@0.0.4': - resolution: {integrity: sha512-xCglo3U/WIGsz/izPGFMegS5Q3PxOHYB8a1E7RtVhNm5QdqTlQldLCm/BuMg2G/u1l1ZZ0wdvkqRTG9joauf3Q==} + resolution: + { + integrity: sha512-xCglo3U/WIGsz/izPGFMegS5Q3PxOHYB8a1E7RtVhNm5QdqTlQldLCm/BuMg2G/u1l1ZZ0wdvkqRTG9joauf3Q==, + } '@near-js/transactions@0.1.0': - resolution: {integrity: sha512-OrrDFqhX0rtH+6MV3U3iS+zmzcPQI+L4GJi9na4Uf8FgpaVPF0mtSmVrpUrS5CC3LwWCzcYF833xGYbXOV4Kfg==} + resolution: + { + integrity: sha512-OrrDFqhX0rtH+6MV3U3iS+zmzcPQI+L4GJi9na4Uf8FgpaVPF0mtSmVrpUrS5CC3LwWCzcYF833xGYbXOV4Kfg==, + } '@near-js/transactions@0.1.1': - resolution: {integrity: sha512-Fk83oLLFK7nz4thawpdv9bGyMVQ2i48iUtZEVYhuuuqevl17tSXMlhle9Me1ZbNyguJG/cWPdNybe1UMKpyGxA==} + resolution: + { + integrity: sha512-Fk83oLLFK7nz4thawpdv9bGyMVQ2i48iUtZEVYhuuuqevl17tSXMlhle9Me1ZbNyguJG/cWPdNybe1UMKpyGxA==, + } '@near-js/types@0.0.3': - resolution: {integrity: sha512-gC3iGUT+r2JjVsE31YharT+voat79ToMUMLCGozHjp/R/UW1M2z4hdpqTUoeWUBGBJuVc810gNTneHGx0jvzwQ==} + resolution: + { + integrity: sha512-gC3iGUT+r2JjVsE31YharT+voat79ToMUMLCGozHjp/R/UW1M2z4hdpqTUoeWUBGBJuVc810gNTneHGx0jvzwQ==, + } '@near-js/types@0.0.4': - resolution: {integrity: sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg==} + resolution: + { + integrity: sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg==, + } '@near-js/utils@0.0.3': - resolution: {integrity: sha512-J72n/EL0VfLRRb4xNUF4rmVrdzMkcmkwJOhBZSTWz3PAZ8LqNeU9ZConPfMvEr6lwdaD33ZuVv70DN6IIjPr1A==} + resolution: + { + integrity: sha512-J72n/EL0VfLRRb4xNUF4rmVrdzMkcmkwJOhBZSTWz3PAZ8LqNeU9ZConPfMvEr6lwdaD33ZuVv70DN6IIjPr1A==, + } '@near-js/utils@0.0.4': - resolution: {integrity: sha512-mPUEPJbTCMicGitjEGvQqOe8AS7O4KkRCxqd0xuE/X6gXF1jz1pYMZn4lNUeUz2C84YnVSGLAM0o9zcN6Y4hiA==} + resolution: + { + integrity: sha512-mPUEPJbTCMicGitjEGvQqOe8AS7O4KkRCxqd0xuE/X6gXF1jz1pYMZn4lNUeUz2C84YnVSGLAM0o9zcN6Y4hiA==, + } '@next/env@15.3.4': - resolution: {integrity: sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ==} + resolution: + { + integrity: sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ==, + } '@next/eslint-plugin-next@14.0.4': - resolution: {integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==} + resolution: + { + integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==, + } '@next/swc-darwin-arm64@15.3.4': - resolution: {integrity: sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [darwin] '@next/swc-darwin-x64@15.3.4': - resolution: {integrity: sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==, + } + engines: { node: '>= 10' } cpu: [x64] os: [darwin] '@next/swc-linux-arm64-gnu@15.3.4': - resolution: {integrity: sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [linux] '@next/swc-linux-arm64-musl@15.3.4': - resolution: {integrity: sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [linux] '@next/swc-linux-x64-gnu@15.3.4': - resolution: {integrity: sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==, + } + engines: { node: '>= 10' } cpu: [x64] os: [linux] '@next/swc-linux-x64-musl@15.3.4': - resolution: {integrity: sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==, + } + engines: { node: '>= 10' } cpu: [x64] os: [linux] '@next/swc-win32-arm64-msvc@15.3.4': - resolution: {integrity: sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==, + } + engines: { node: '>= 10' } cpu: [arm64] os: [win32] '@next/swc-win32-x64-msvc@15.3.4': - resolution: {integrity: sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==, + } + engines: { node: '>= 10' } cpu: [x64] os: [win32] '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + resolution: + { + integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==, + } + + '@noble/ciphers@1.3.0': + resolution: + { + integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==, + } + engines: { node: ^14.21.3 || >=16 } + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} '@noble/curves@1.8.1': - resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + resolution: + { + integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==, + } + engines: { node: ^14.21.3 || >=16 } + + '@noble/curves@1.9.2': + resolution: + { + integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==, + } + engines: { node: ^14.21.3 || >=16 } + + '@noble/curves@1.9.2': + resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} engines: {node: ^14.21.3 || >=16} '@noble/ed25519@1.7.3': - resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} + resolution: + { + integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==, + } '@noble/hashes@1.7.1': - resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + resolution: + { + integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==, + } + engines: { node: ^14.21.3 || >=16 } + + '@noble/hashes@1.8.0': + resolution: + { + integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==, + } + engines: { node: ^14.21.3 || >=16 } + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: '>= 8' } '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: '>= 8' } '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: '>= 8' } '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} + resolution: + { + integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==, + } + engines: { node: '>=12.4.0' } '@nucypher/nucypher-contracts@0.25.0': - resolution: {integrity: sha512-4fRPKY6RzkXY1Zv2O0auJZsvP6z7tuj+Fsy83yJvADqFwRuIJfSlwgSgLwISX6q838SRG/Ve2i+sMLZRaVJfYw==} + resolution: + { + integrity: sha512-4fRPKY6RzkXY1Zv2O0auJZsvP6z7tuj+Fsy83yJvADqFwRuIJfSlwgSgLwISX6q838SRG/Ve2i+sMLZRaVJfYw==, + } '@nucypher/nucypher-core@0.14.5': - resolution: {integrity: sha512-Q3kBuJL0qtTtnxrM5DEQauQUvDlXmwubm9u1h7gbyLhs+aZNC9WDyjEUbE43+uahlHu4k1hKEMxD1gjV165ChA==} + resolution: + { + integrity: sha512-Q3kBuJL0qtTtnxrM5DEQauQUvDlXmwubm9u1h7gbyLhs+aZNC9WDyjEUbE43+uahlHu4k1hKEMxD1gjV165ChA==, + } '@nucypher/shared@0.5.0': - resolution: {integrity: sha512-Y+0oEgVtoud4BP/pvj2elPm5igrQ8AAUwYYmUiLpXNqQMRF4zFnYaGbl+xhKk45CYG8S9cDKJEN8nopzVADTNw==} - engines: {node: '>=18', pnpm: '>=8.0.0'} + resolution: + { + integrity: sha512-Y+0oEgVtoud4BP/pvj2elPm5igrQ8AAUwYYmUiLpXNqQMRF4zFnYaGbl+xhKk45CYG8S9cDKJEN8nopzVADTNw==, + } + engines: { node: '>=18', pnpm: '>=8.0.0' } '@nucypher/taco-auth@0.3.0': - resolution: {integrity: sha512-z3s7kzshUkR/F5Xd0/TBFePvqW0sweta+WbZ5I+4OGsMrS2TkWm4uamvhf+NYhi3jvPjOplTWUbBH99JDCd+AQ==} - engines: {node: '>=18', pnpm: '>=8.0.0'} + resolution: + { + integrity: sha512-z3s7kzshUkR/F5Xd0/TBFePvqW0sweta+WbZ5I+4OGsMrS2TkWm4uamvhf+NYhi3jvPjOplTWUbBH99JDCd+AQ==, + } + engines: { node: '>=18', pnpm: '>=8.0.0' } '@nucypher/taco@0.6.0': - resolution: {integrity: sha512-LehkMgoM7VDgqg3kqvMX8PFOiVgyFMVAqsbdbcffj31z2tf7C0q8RBinj61YDaLotx++py6us6M+T2cJAywnaA==} - engines: {node: '>=18', pnpm: '>=8.0.0'} + resolution: + { + integrity: sha512-LehkMgoM7VDgqg3kqvMX8PFOiVgyFMVAqsbdbcffj31z2tf7C0q8RBinj61YDaLotx++py6us6M+T2cJAywnaA==, + } + engines: { node: '>=18', pnpm: '>=8.0.0' } '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: '>=14' } '@pmmmwh/react-refresh-webpack-plugin@0.5.15': - resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} - engines: {node: '>= 10.13'} + resolution: + { + integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==, + } + engines: { node: '>= 10.13' } peerDependencies: '@types/webpack': 4.x || 5.x react-refresh: '>=0.10.0 <1.0.0' @@ -2600,8 +3669,8 @@ packages: webpack-plugin-serve: optional: true - '@pmmmwh/react-refresh-webpack-plugin@0.6.1': - resolution: {integrity: sha512-95DXXJxNkpYu+sqmpDp7vbw9JCyiNpHuCsvuMuOgVFrKQlwEIn9Y1+NNIQJq+zFL+eWyxw6htthB5CtdwJupNA==} + '@pmmmwh/react-refresh-webpack-plugin@0.6.0': + resolution: {integrity: sha512-AAc+QWfZ1KQ/e1C6OHWVlxU+ks6zFGOA44IJUlvju7RlDS8nsX6poPFOIlsg/rTofO9vKov12+WCjMhKkRKD5g==} engines: {node: '>=18.12'} peerDependencies: '@types/webpack': 5.x @@ -2627,14 +3696,23 @@ packages: optional: true '@randlabs/communication-bridge@1.0.1': - resolution: {integrity: sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==} + resolution: + { + integrity: sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==, + } '@randlabs/myalgo-connect@1.4.2': - resolution: {integrity: sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA==} + resolution: + { + integrity: sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA==, + } '@rollup/plugin-babel@5.3.1': - resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, + } + engines: { node: '>= 10.0.0' } peerDependencies: '@babel/core': ^7.0.0 '@types/babel__core': ^7.1.9 @@ -2644,274 +3722,502 @@ packages: optional: true '@rollup/plugin-node-resolve@11.2.1': - resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==, + } + engines: { node: '>= 10.0.0' } peerDependencies: rollup: ^1.20.0||^2.0.0 '@rollup/plugin-replace@2.4.2': - resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + resolution: + { + integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, + } peerDependencies: rollup: ^1.20.0 || ^2.0.0 '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} + resolution: + { + integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, + } + engines: { node: '>= 8.0.0' } peerDependencies: rollup: ^1.20.0||^2.0.0 '@rollup/rollup-android-arm-eabi@4.37.0': - resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} + resolution: + { + integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==, + } cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.37.0': - resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} + resolution: + { + integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==, + } cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.37.0': - resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} + resolution: + { + integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==, + } cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.37.0': - resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} + resolution: + { + integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==, + } cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.37.0': - resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} + resolution: + { + integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==, + } cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.37.0': - resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} + resolution: + { + integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==, + } cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.37.0': - resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} + resolution: + { + integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==, + } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.37.0': - resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} + resolution: + { + integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==, + } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.37.0': - resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} + resolution: + { + integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==, + } cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.37.0': - resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} + resolution: + { + integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==, + } cpu: [arm64] os: [linux] '@rollup/rollup-linux-loongarch64-gnu@4.37.0': - resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} + resolution: + { + integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==, + } cpu: [loong64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': - resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} + resolution: + { + integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==, + } cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.37.0': - resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} + resolution: + { + integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==, + } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-riscv64-musl@4.37.0': - resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} + resolution: + { + integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==, + } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.37.0': - resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} + resolution: + { + integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==, + } cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.37.0': - resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} + resolution: + { + integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==, + } cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.37.0': - resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} + resolution: + { + integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==, + } cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.37.0': - resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} + resolution: + { + integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==, + } cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.37.0': - resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} + resolution: + { + integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==, + } cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.37.0': - resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} + resolution: + { + integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==, + } cpu: [x64] os: [win32] '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + resolution: + { + integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, + } '@rushstack/eslint-patch@1.11.0': - resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} + resolution: + { + integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==, + } '@scure/base@1.2.4': - resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} + resolution: + { + integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==, + } + + '@scure/base@1.2.6': + resolution: + { + integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==, + } + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} '@scure/bip32@1.6.2': - resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + resolution: + { + integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==, + } + + '@scure/bip32@1.7.0': + resolution: + { + integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==, + } + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} '@scure/bip39@1.5.4': - resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + resolution: + { + integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==, + } + + '@scure/bip39@1.6.0': + resolution: + { + integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==, + } + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} '@sinclair/typebox@0.24.51': - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + resolution: + { + integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==, + } '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, + } + engines: { node: '>=10' } '@sinonjs/commons@1.8.6': - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + resolution: + { + integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, + } '@sinonjs/fake-timers@8.1.0': - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + resolution: + { + integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==, + } '@skypack/package-check@0.2.2': - resolution: {integrity: sha512-T4Wyi9lUuz0a1C2OHuzqZ0aFOCI0AmaGTb2LP9sHgWdoHXlB3JU02gfBpa0Y081G/gFsJYpQ/R0iCJRzF/nknw==} + resolution: + { + integrity: sha512-T4Wyi9lUuz0a1C2OHuzqZ0aFOCI0AmaGTb2LP9sHgWdoHXlB3JU02gfBpa0Y081G/gFsJYpQ/R0iCJRzF/nknw==, + } hasBin: true '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} + resolution: + { + integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==, + } + engines: { node: '>=5.10' } '@solana/web3.js@1.98.0': - resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} + resolution: + { + integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==, + } '@spruceid/siwe-parser@3.0.0': - resolution: {integrity: sha512-Y92k63ilw/8jH9Ry4G2e7lQd0jZAvb0d/Q7ssSD0D9mp/Zt2aCXIc3g0ny9yhplpAx1QXHsMz/JJptHK/zDGdw==} + resolution: + { + integrity: sha512-Y92k63ilw/8jH9Ry4G2e7lQd0jZAvb0d/Q7ssSD0D9mp/Zt2aCXIc3g0ny9yhplpAx1QXHsMz/JJptHK/zDGdw==, + } '@stablelib/binary@1.0.1': - resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} + resolution: + { + integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==, + } '@stablelib/int@1.0.1': - resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + resolution: + { + integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==, + } '@stablelib/random@1.0.2': - resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} + resolution: + { + integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==, + } '@stablelib/wipe@1.0.1': - resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + resolution: + { + integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==, + } '@supercharge/promise-pool@3.2.0': - resolution: {integrity: sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg==, + } + engines: { node: '>=8' } '@surma/rollup-plugin-off-main-thread@2.2.3': - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + resolution: + { + integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, + } '@svgr/babel-plugin-add-jsx-attribute@5.4.0': - resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': - resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': - resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': - resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-svg-dynamic-title@5.4.0': - resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-svg-em-dimensions@5.4.0': - resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-transform-react-native-svg@5.4.0': - resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==, + } + engines: { node: '>=10' } '@svgr/babel-plugin-transform-svg-component@5.5.0': - resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==, + } + engines: { node: '>=10' } '@svgr/babel-preset@5.5.0': - resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==, + } + engines: { node: '>=10' } '@svgr/core@5.5.0': - resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==, + } + engines: { node: '>=10' } '@svgr/hast-util-to-babel-ast@5.5.0': - resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==, + } + engines: { node: '>=10' } '@svgr/plugin-jsx@5.5.0': - resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==, + } + engines: { node: '>=10' } '@svgr/plugin-svgo@5.5.0': - resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==, + } + engines: { node: '>=10' } '@svgr/webpack@5.5.0': - resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==, + } + engines: { node: '>=10' } '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + resolution: + { + integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, + } '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + resolution: + { + integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==, + } '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==, + } + engines: { node: '>=10' } '@tootallnate/once@1.1.2': - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, + } + engines: { node: '>= 6' } '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, + } + engines: { node: '>=10.13.0' } '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + resolution: + { + integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==, + } '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + resolution: + { + integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, + } '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + resolution: + { + integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, + } '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + resolution: + { + integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, + } '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + resolution: + { + integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==, + } '@typechain/ethers-v5@11.1.2': - resolution: {integrity: sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==} + resolution: + { + integrity: sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==, + } peerDependencies: '@ethersproject/abi': ^5.0.0 '@ethersproject/providers': ^5.0.0 @@ -2920,217 +4226,430 @@ packages: typescript: '>=4.3.0' '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + resolution: + { + integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, + } '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + resolution: + { + integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==, + } '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + } '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + resolution: + { + integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==, + } '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + resolution: + { + integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, + } '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + resolution: + { + integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==, + } '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + resolution: + { + integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==, + } '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + resolution: + { + integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==, + } '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + resolution: + { + integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + } '@types/conventional-commits-parser@5.0.1': - resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + resolution: + { + integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==, + } '@types/deep-equal@1.0.4': - resolution: {integrity: sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==} + resolution: + { + integrity: sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==, + } '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + resolution: + { + integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==, + } '@types/eslint@8.56.12': - resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + resolution: + { + integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==, + } '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + resolution: + { + integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==, + } '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + resolution: + { + integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==, + } '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + resolution: + { + integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, + } '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + resolution: + { + integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==, + } '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + resolution: + { + integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==, + } '@types/express-serve-static-core@5.0.6': - resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + resolution: + { + integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==, + } '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + resolution: + { + integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, + } '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + resolution: + { + integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, + } '@types/html-minifier-terser@6.1.0': - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + resolution: + { + integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==, + } '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + resolution: + { + integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, + } '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + resolution: + { + integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, + } '@types/http-proxy@1.17.16': - resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} + resolution: + { + integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==, + } '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + resolution: + { + integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, + } '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + resolution: + { + integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, + } '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + resolution: + { + integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, + } '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + resolution: + { + integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, + } '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + resolution: + { + integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, + } '@types/lodash@4.17.16': - resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + resolution: + { + integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==, + } '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + resolution: + { + integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, + } '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + resolution: + { + integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==, + } '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + resolution: + { + integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, + } '@types/node@11.11.6': - resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==} + resolution: + { + integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==, + } '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + resolution: + { + integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, + } - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/node@20.11.30': + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + + '@types/node@20.17.28': + resolution: {integrity: sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==} + + '@types/node@22.13.14': + resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + resolution: + { + integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, + } '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + resolution: + { + integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, + } '@types/prettier@2.7.3': - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + resolution: + { + integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==, + } '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + resolution: + { + integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==, + } '@types/q@1.5.8': - resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} + resolution: + { + integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==, + } '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + resolution: + { + integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==, + } '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + resolution: + { + integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + } '@types/react-copy-to-clipboard@5.0.7': - resolution: {integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==} + resolution: + { + integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==, + } '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + resolution: + { + integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==, + } '@types/react-dom@18.3.5': - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + resolution: + { + integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==, + } peerDependencies: '@types/react': ^18.0.0 '@types/react@18.3.20': - resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} + resolution: + { + integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==, + } '@types/react@18.3.5': - resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} + resolution: + { + integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==, + } '@types/resolve@1.17.1': - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + resolution: + { + integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, + } '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + resolution: + { + integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==, + } '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + resolution: + { + integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, + } '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + resolution: + { + integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==, + } '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + resolution: + { + integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==, + } '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + resolution: + { + integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, + } '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + resolution: + { + integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==, + } '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + resolution: + { + integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, + } '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + resolution: + { + integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==, + } '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + resolution: + { + integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, + } '@types/tmp@0.2.6': - resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} + resolution: + { + integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==, + } '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + resolution: + { + integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, + } '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + resolution: + { + integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==, + } '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + resolution: + { + integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==, + } '@types/ws@8.18.0': - resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} + resolution: + { + integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==, + } '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + resolution: + { + integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, + } '@types/yargs@16.0.9': - resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} + resolution: + { + integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==, + } '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + resolution: + { + integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==, + } '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: '@typescript-eslint/parser': ^5.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3140,8 +4659,11 @@ packages: optional: true '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { + integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha eslint: ^7.0.0 || ^8.0.0 @@ -3151,14 +4673,20 @@ packages: optional: true '@typescript-eslint/experimental-utils@5.62.0': - resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' @@ -3167,8 +4695,11 @@ packages: optional: true '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { + integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 typescript: '*' @@ -3177,16 +4708,25 @@ packages: optional: true '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { + integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: '*' typescript: '*' @@ -3195,8 +4735,11 @@ packages: optional: true '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { + integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==, + } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 typescript: '*' @@ -3205,16 +4748,25 @@ packages: optional: true '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { + integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3222,8 +4774,11 @@ packages: optional: true '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { + integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: typescript: '*' peerDependenciesMeta: @@ -3231,116 +4786,185 @@ packages: optional: true '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { + integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { + integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==, + } + engines: { node: ^16.0.0 || >=18.0.0 } '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + resolution: + { + integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, + } '@uniswap/token-lists@1.0.0-beta.34': - resolution: {integrity: sha512-Hc3TfrFaupg0M84e/Zv7BoF+fmMWDV15mZ5s8ZQt2qZxUcNw2GQW+L6L/2k74who31G+p1m3GRYbJpAo7d1pqA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Hc3TfrFaupg0M84e/Zv7BoF+fmMWDV15mZ5s8ZQt2qZxUcNw2GQW+L6L/2k74who31G+p1m3GRYbJpAo7d1pqA==, + } + engines: { node: '>=10' } '@unrs/resolver-binding-darwin-arm64@1.3.2': - resolution: {integrity: sha512-ddnlXgRi0Fog5+7U5Q1qY62wl95Q1lB4tXQX1UIA9YHmRCHN2twaQW0/4tDVGCvTVEU3xEayU7VemEr7GcBYUw==} + resolution: + { + integrity: sha512-ddnlXgRi0Fog5+7U5Q1qY62wl95Q1lB4tXQX1UIA9YHmRCHN2twaQW0/4tDVGCvTVEU3xEayU7VemEr7GcBYUw==, + } cpu: [arm64] os: [darwin] '@unrs/resolver-binding-darwin-x64@1.3.2': - resolution: {integrity: sha512-tnl9xoEeg503jis+LW5cuq4hyLGQyqaoBL8VdPSqcewo/FL1C8POHbzl+AL25TidWYJD+R6bGUTE381kA1sT9w==} + resolution: + { + integrity: sha512-tnl9xoEeg503jis+LW5cuq4hyLGQyqaoBL8VdPSqcewo/FL1C8POHbzl+AL25TidWYJD+R6bGUTE381kA1sT9w==, + } cpu: [x64] os: [darwin] '@unrs/resolver-binding-freebsd-x64@1.3.2': - resolution: {integrity: sha512-zyPn9LFCCjhKPeCtECZaiMUgkYN/VpLb4a9Xv7QriJmTaQxsuDtXqOHifrzUXIhorJTyS+5MOKDuNL0X9I4EHA==} + resolution: + { + integrity: sha512-zyPn9LFCCjhKPeCtECZaiMUgkYN/VpLb4a9Xv7QriJmTaQxsuDtXqOHifrzUXIhorJTyS+5MOKDuNL0X9I4EHA==, + } cpu: [x64] os: [freebsd] '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.2': - resolution: {integrity: sha512-UWx56Wh59Ro69fe+Wfvld4E1n9KG0e3zeouWLn8eSasyi/yVH/7ZW3CLTVFQ81oMKSpXwr5u6RpzttDXZKiO4g==} + resolution: + { + integrity: sha512-UWx56Wh59Ro69fe+Wfvld4E1n9KG0e3zeouWLn8eSasyi/yVH/7ZW3CLTVFQ81oMKSpXwr5u6RpzttDXZKiO4g==, + } cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm-musleabihf@1.3.2': - resolution: {integrity: sha512-VYGQXsOEJtfaoY2fOm8Z9ii5idFaHFYlrq3yMFZPaFKo8ufOXYm8hnfru7qetbM9MX116iWaPC0ZX5sK+1Dr+g==} + resolution: + { + integrity: sha512-VYGQXsOEJtfaoY2fOm8Z9ii5idFaHFYlrq3yMFZPaFKo8ufOXYm8hnfru7qetbM9MX116iWaPC0ZX5sK+1Dr+g==, + } cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm64-gnu@1.3.2': - resolution: {integrity: sha512-3zP420zxJfYPD1rGp2/OTIBxF8E3+/6VqCG+DEO6kkDgBiloa7Y8pw1o7N9BfgAC+VC8FPZsFXhV2lpx+lLRMQ==} + resolution: + { + integrity: sha512-3zP420zxJfYPD1rGp2/OTIBxF8E3+/6VqCG+DEO6kkDgBiloa7Y8pw1o7N9BfgAC+VC8FPZsFXhV2lpx+lLRMQ==, + } cpu: [arm64] os: [linux] '@unrs/resolver-binding-linux-arm64-musl@1.3.2': - resolution: {integrity: sha512-ZWjSleUgr88H4Kei7yT4PlPqySTuWN1OYDDcdbmMCtLWFly3ed+rkrcCb3gvqXdDbYrGOtzv3g2qPEN+WWNv5Q==} + resolution: + { + integrity: sha512-ZWjSleUgr88H4Kei7yT4PlPqySTuWN1OYDDcdbmMCtLWFly3ed+rkrcCb3gvqXdDbYrGOtzv3g2qPEN+WWNv5Q==, + } cpu: [arm64] os: [linux] '@unrs/resolver-binding-linux-ppc64-gnu@1.3.2': - resolution: {integrity: sha512-p+5OvYJ2UOlpjes3WfBlxyvQok2u26hLyPxLFHkYlfzhZW0juhvBf/tvewz1LDFe30M7zL9cF4OOO5dcvtk+cw==} + resolution: + { + integrity: sha512-p+5OvYJ2UOlpjes3WfBlxyvQok2u26hLyPxLFHkYlfzhZW0juhvBf/tvewz1LDFe30M7zL9cF4OOO5dcvtk+cw==, + } cpu: [ppc64] os: [linux] '@unrs/resolver-binding-linux-s390x-gnu@1.3.2': - resolution: {integrity: sha512-yweY7I6SqNn3kvj6vE4PQRo7j8Oz6+NiUhmgciBNAUOuI3Jq0bnW29hbHJdxZRSN1kYkQnSkbbA1tT8VnK816w==} + resolution: + { + integrity: sha512-yweY7I6SqNn3kvj6vE4PQRo7j8Oz6+NiUhmgciBNAUOuI3Jq0bnW29hbHJdxZRSN1kYkQnSkbbA1tT8VnK816w==, + } cpu: [s390x] os: [linux] '@unrs/resolver-binding-linux-x64-gnu@1.3.2': - resolution: {integrity: sha512-fNIvtzJcGN9hzWTIayrTSk2+KHQrqKbbY+I88xMVMOFV9t4AXha4veJdKaIuuks+2JNr6GuuNdsL7+exywZ32w==} + resolution: + { + integrity: sha512-fNIvtzJcGN9hzWTIayrTSk2+KHQrqKbbY+I88xMVMOFV9t4AXha4veJdKaIuuks+2JNr6GuuNdsL7+exywZ32w==, + } cpu: [x64] os: [linux] '@unrs/resolver-binding-linux-x64-musl@1.3.2': - resolution: {integrity: sha512-OaFEw8WAjiwBGxutQgkWhoAGB5BQqZJ8Gjt/mW+m6DWNjimcxU22uWCuEtfw1CIwLlKPOzsgH0429fWmZcTGkg==} + resolution: + { + integrity: sha512-OaFEw8WAjiwBGxutQgkWhoAGB5BQqZJ8Gjt/mW+m6DWNjimcxU22uWCuEtfw1CIwLlKPOzsgH0429fWmZcTGkg==, + } cpu: [x64] os: [linux] '@unrs/resolver-binding-wasm32-wasi@1.3.2': - resolution: {integrity: sha512-u+sumtO7M0AGQ9bNQrF4BHNpUyxo23FM/yXZfmVAicTQ+mXtG06O7pm5zQUw3Mr4jRs2I84uh4O0hd8bdouuvQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-u+sumtO7M0AGQ9bNQrF4BHNpUyxo23FM/yXZfmVAicTQ+mXtG06O7pm5zQUw3Mr4jRs2I84uh4O0hd8bdouuvQ==, + } + engines: { node: '>=14.0.0' } cpu: [wasm32] '@unrs/resolver-binding-win32-arm64-msvc@1.3.2': - resolution: {integrity: sha512-ZAJKy95vmDIHsRFuPNqPQRON8r2mSMf3p9DoX+OMOhvu2c8OXGg8MvhGRf3PNg45ozRrPdXDnngURKgaFfpGoQ==} + resolution: + { + integrity: sha512-ZAJKy95vmDIHsRFuPNqPQRON8r2mSMf3p9DoX+OMOhvu2c8OXGg8MvhGRf3PNg45ozRrPdXDnngURKgaFfpGoQ==, + } cpu: [arm64] os: [win32] '@unrs/resolver-binding-win32-ia32-msvc@1.3.2': - resolution: {integrity: sha512-nQG4YFAS2BLoKVQFK/FrWJvFATI5DQUWQrcPcsWG9Ve5BLLHZuPOrJ2SpAJwLXQrRv6XHSFAYGI8wQpBg/CiFA==} + resolution: + { + integrity: sha512-nQG4YFAS2BLoKVQFK/FrWJvFATI5DQUWQrcPcsWG9Ve5BLLHZuPOrJ2SpAJwLXQrRv6XHSFAYGI8wQpBg/CiFA==, + } cpu: [ia32] os: [win32] '@unrs/resolver-binding-win32-x64-msvc@1.3.2': - resolution: {integrity: sha512-XBWpUP0mHya6yGBwNefhyEa6V7HgYKCxEAY4qhTm/PcAQyBPNmjj97VZJOJkVdUsyuuii7xmq0pXWX/c2aToHQ==} + resolution: + { + integrity: sha512-XBWpUP0mHya6yGBwNefhyEa6V7HgYKCxEAY4qhTm/PcAQyBPNmjj97VZJOJkVdUsyuuii7xmq0pXWX/c2aToHQ==, + } cpu: [x64] os: [win32] '@usedapp/core@1.2.16': - resolution: {integrity: sha512-IgJzxItngsSDoVemXChFqiqqvV9gjp7OvEaM2ajZ3GZPA3JMBKw+tPBwhjjjKvnHgcIpE4kEBaWaosYqMzQG0Q==} + resolution: + { + integrity: sha512-IgJzxItngsSDoVemXChFqiqqvV9gjp7OvEaM2ajZ3GZPA3JMBKw+tPBwhjjjKvnHgcIpE4kEBaWaosYqMzQG0Q==, + } hasBin: true peerDependencies: ethers: ^5 react: '*' '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + resolution: + { + integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==, + } peerDependencies: '@vitest/browser': 3.2.4 vitest: 3.2.4 @@ -3349,10 +4973,16 @@ packages: optional: true '@vitest/expect@3.0.9': - resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} + resolution: + { + integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==, + } '@vitest/mocker@3.0.9': - resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} + resolution: + { + integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==, + } peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -3363,82 +4993,151 @@ packages: optional: true '@vitest/pretty-format@3.0.9': - resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} + resolution: + { + integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==, + } '@vitest/runner@3.0.9': - resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} + resolution: + { + integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==, + } '@vitest/snapshot@3.0.9': - resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} + resolution: + { + integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==, + } '@vitest/spy@3.0.9': - resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} + resolution: + { + integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==, + } '@vitest/utils@3.0.9': - resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} + resolution: + { + integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==, + } '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + resolution: + { + integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==, + } '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + resolution: + { + integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==, + } '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + resolution: + { + integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==, + } '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + resolution: + { + integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==, + } '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + resolution: + { + integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==, + } '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + resolution: + { + integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==, + } '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + resolution: + { + integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==, + } '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + resolution: + { + integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==, + } '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + resolution: + { + integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==, + } '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + resolution: + { + integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==, + } '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + resolution: + { + integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==, + } '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + resolution: + { + integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==, + } '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + resolution: + { + integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==, + } '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + resolution: + { + integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==, + } '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + resolution: + { + integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==, + } '@webpack-cli/configtest@3.0.1': - resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==, + } + engines: { node: '>=18.12.0' } peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x '@webpack-cli/info@3.0.1': - resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==, + } + engines: { node: '>=18.12.0' } peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x '@webpack-cli/serve@3.0.1': - resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==, + } + engines: { node: '>=18.12.0' } peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x @@ -3448,84 +5147,151 @@ packages: optional: true '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + resolution: + { + integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + } '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + resolution: + { + integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + } JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + resolution: + { + integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, + } hasBin: true abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: '>= 0.6' } acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + resolution: + { + integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==, + } acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==, + } + engines: { node: '>=10.13.0' } peerDependencies: acorn: ^8.14.0 acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, + } + engines: { node: '>=0.4.0' } acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==, + } + engines: { node: '>=0.4.0' } acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, + } + engines: { node: '>=0.4.0' } hasBin: true acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==, + } + engines: { node: '>=0.4.0' } hasBin: true acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, + } + engines: { node: '>=0.4.0' } hasBin: true add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + resolution: + { + integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, + } address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==, + } + engines: { node: '>= 10.0.0' } adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} + resolution: + { + integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==, + } + engines: { node: '>=8.9' } aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + resolution: + { + integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==, + } agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: '>= 6.0.0' } agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} + resolution: + { + integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==, + } + engines: { node: '>= 8.0.0' } ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + resolution: + { + integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, + } peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -3533,877 +5299,1551 @@ packages: optional: true ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + resolution: + { + integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + } peerDependencies: ajv: ^6.9.1 ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + resolution: + { + integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==, + } peerDependencies: ajv: ^8.8.2 ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + resolution: + { + integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, + } algo-msgpack-with-bigint@2.1.1: - resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==, + } + engines: { node: '>= 10' } algosdk@1.24.1: - resolution: {integrity: sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==, + } + engines: { node: '>=14.0.0' } anser@2.3.2: - resolution: {integrity: sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==} + resolution: + { + integrity: sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==, + } ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, + } + engines: { node: '>=6' } ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, + } + engines: { node: '>=8' } ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} + resolution: + { + integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==, + } + engines: { '0': node >= 0.8.0 } hasBin: true ansi-html@0.0.9: - resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==} - engines: {'0': node >= 0.8.0} + resolution: + { + integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==, + } + engines: { '0': node >= 0.8.0 } hasBin: true ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: '>=8' } ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, + } + engines: { node: '>=12' } ansi-sequence-parser@1.1.3: - resolution: {integrity: sha512-+fksAx9eG3Ab6LDnLs3ZqZa8KVJ/jYnX+D4Qe1azX+LFGFAXqynCQLOdLpNYN/l9e7l6hMWwZbrnctqr6eSQSw==} + resolution: + { + integrity: sha512-+fksAx9eG3Ab6LDnLs3ZqZa8KVJ/jYnX+D4Qe1azX+LFGFAXqynCQLOdLpNYN/l9e7l6hMWwZbrnctqr6eSQSw==, + } ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: '>=4' } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: '>=8' } ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, + } + engines: { node: '>=10' } ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: '>=12' } any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: '>= 8' } apg-js@4.4.0: - resolution: {integrity: sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==} + resolution: + { + integrity: sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==, + } arbundles@0.10.1: - resolution: {integrity: sha512-QYFepxessLCirvRkQK9iQmjxjHz+s50lMNGRwZwpyPWLohuf6ISyj1gkFXJHlMT+rNSrsHxb532glHnKbjwu3A==} + resolution: + { + integrity: sha512-QYFepxessLCirvRkQK9iQmjxjHz+s50lMNGRwZwpyPWLohuf6ISyj1gkFXJHlMT+rNSrsHxb532glHnKbjwu3A==, + } arconnect@0.4.2: - resolution: {integrity: sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==} + resolution: + { + integrity: sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==, + } arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + resolution: + { + integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, + } arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, + } + engines: { node: '>= 0.4' } array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==, + } + engines: { node: '>=6' } array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==, + } + engines: { node: '>=8' } array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, + } + engines: { node: '>= 0.4' } array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + } array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + resolution: + { + integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, + } array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, + } + engines: { node: '>= 0.4' } array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: '>=8' } array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, + } + engines: { node: '>= 0.4' } array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==, + } + engines: { node: '>= 0.4' } array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, + } + engines: { node: '>= 0.4' } array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, + } + engines: { node: '>= 0.4' } array.prototype.reduce@1.0.8: - resolution: {integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==, + } + engines: { node: '>= 0.4' } array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, + } + engines: { node: '>= 0.4' } arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, + } + engines: { node: '>= 0.4' } arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, + } + engines: { node: '>=0.10.0' } arweave-stream-tx@1.2.2: - resolution: {integrity: sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ==} + resolution: + { + integrity: sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ==, + } peerDependencies: arweave: ^1.10.0 arweave@1.15.0: - resolution: {integrity: sha512-sYfq2yJwkJLthRADsfHygNP+L7fTCyprTjOLYnpP8zaqwywddoNO3UpTk6XGjEiyyU3WfxoFLRLpzx+llZx1WA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-sYfq2yJwkJLthRADsfHygNP+L7fTCyprTjOLYnpP8zaqwywddoNO3UpTk6XGjEiyyU3WfxoFLRLpzx+llZx1WA==, + } + engines: { node: '>=18' } asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + resolution: + { + integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, + } asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + resolution: + { + integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==, + } asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + resolution: + { + integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==, + } assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: '>=12' } ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + resolution: + { + integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, + } - ast-v8-to-istanbul@0.3.5: - resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==} + ast-v8-to-istanbul@0.3.3: + resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, + } + engines: { node: '>= 0.4' } async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + resolution: + { + integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, + } async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + resolution: + { + integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, + } asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + { + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + } at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, + } + engines: { node: '>= 4.0.0' } autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==, + } + engines: { node: ^10 || ^12 || >=14 } hasBin: true peerDependencies: postcss: ^8.1.0 available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: '>= 0.4' } axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==, + } + engines: { node: '>=4' } - axios-retry@4.5.0: - resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} - peerDependencies: - axios: 0.x || 1.x - - axios@1.11.0: - resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} + axios-retry@3.9.1: + resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==} axios@1.8.4: - resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + resolution: + { + integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==, + } axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, + } + engines: { node: '>= 0.4' } babel-jest@27.5.1: - resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } peerDependencies: '@babel/core': ^7.8.0 babel-loader@8.4.1: - resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} - engines: {node: '>= 8.9'} + resolution: + { + integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==, + } + engines: { node: '>= 8.9' } peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, + } + engines: { node: '>=8' } babel-plugin-jest-hoist@27.5.1: - resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + resolution: + { + integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, + } + engines: { node: '>=10', npm: '>=6' } babel-plugin-named-asset-import@0.3.8: - resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} + resolution: + { + integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==, + } peerDependencies: '@babel/core': ^7.1.0 babel-plugin-polyfill-corejs2@0.4.13: - resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} + resolution: + { + integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==, + } peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + resolution: + { + integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==, + } peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-regenerator@0.6.4: - resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} + resolution: + { + integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==, + } peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} + resolution: + { + integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==, + } babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + resolution: + { + integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==, + } peerDependencies: '@babel/core': ^7.0.0 babel-preset-jest@27.5.1: - resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } peerDependencies: '@babel/core': ^7.0.0 babel-preset-react-app@10.1.0: - resolution: {integrity: sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==} + resolution: + { + integrity: sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==, + } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + resolution: + { + integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==, + } base-x@4.0.1: - resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} + resolution: + { + integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==, + } base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } base64url@3.0.1: - resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==, + } + engines: { node: '>=6.0.0' } batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + resolution: + { + integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==, + } bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + resolution: + { + integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==, + } better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==, + } + engines: { node: '>=4' } bfj@7.1.0: - resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} - engines: {node: '>= 8.0.0'} + resolution: + { + integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==, + } + engines: { node: '>= 8.0.0' } big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + resolution: + { + integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, + } bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==, + } + engines: { node: '>= 10.0.0' } bignumber.js@9.1.2: - resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + resolution: + { + integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==, + } bignumber.js@9.3.1: - resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + resolution: + { + integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==, + } binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: '>=8' } bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + resolution: + { + integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, + } bip39-light@1.0.7: - resolution: {integrity: sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q==} + resolution: + { + integrity: sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q==, + } bip39@3.0.2: - resolution: {integrity: sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==} + resolution: + { + integrity: sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==, + } bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + resolution: + { + integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, + } bn.js@4.12.1: - resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + resolution: + { + integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==, + } bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + resolution: + { + integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==, + } body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==, + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } bonjour-service@1.3.0: - resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + resolution: + { + integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==, + } boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + resolution: + { + integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==, + } brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: '>=8' } brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + resolution: + { + integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, + } brotli-size@4.0.0: - resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} - engines: {node: '>= 10.16.0'} + resolution: + { + integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==, + } + engines: { node: '>= 10.16.0' } browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + resolution: + { + integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==, + } browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + resolution: + { + integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, + } browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + resolution: + { + integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==, + } browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + resolution: + { + integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==, + } browserify-rsa@4.1.1: - resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==, + } + engines: { node: '>= 0.10' } browserify-sign@4.2.3: - resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} - engines: {node: '>= 0.12'} + resolution: + { + integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==, + } + engines: { node: '>= 0.12' } browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + resolution: + { + integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==, + } bs58@5.0.0: - resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + resolution: + { + integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==, + } bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + resolution: + { + integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, + } buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + resolution: + { + integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, + } buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} + resolution: + { + integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==, + } + engines: { node: '>=6.14.2' } builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, + } + engines: { node: '>=6' } bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==, + } + engines: { node: '>=18' } bundle-require@4.2.1: - resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } peerDependencies: esbuild: '>=0.17' - bundlemon-utils@2.0.1: - resolution: {integrity: sha512-7wxHoOlzICvQyMRfVqoBpnM5pJt1JdcUxsYPNiFx3RlVmUEANh2xdEyoyTsVCqzeJC3rn+AbPuiermBwA3szAQ==} - engines: {node: '>=18'} + bundlemon-utils@1.2.1: + resolution: {integrity: sha512-ydFZrI68L5j6hB9y88XGlbOp2lEwZHsDZl31ljHoi+wKE32glbuXMU0d0vQJLiR7Eq6uS0nDNYSmeoFHiV9R2g==} + engines: {node: '>=14.16'} - bundlemon@3.1.0: - resolution: {integrity: sha512-8PAomH/fzAD/aXUKmphKmPm4Tl2L7mo51AAalO0EVAZE0cik58AM2x0CVdw4jutD069U2rSyRQstxHo2NEr+9Q==} - engines: {node: '>=18'} + bundlemon@2.1.0: + resolution: {integrity: sha512-zvsN7VDNeCtGIR+XUXobjxCSmnsUBqVe5ap2hMQnZOumfKAUJ6WVn/tnJOmt7TJfkXHeUKGi2sHARl7qrL+WDg==} + engines: {node: '>=14.16'} hasBin: true busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + resolution: + { + integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, + } + engines: { node: '>=10.16.0' } bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: '>= 0.8' } cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: '>=8' } cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} + resolution: + { + integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==, + } + engines: { node: '>=10.6.0' } cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==, + } + engines: { node: '>=8' } cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==, + } + engines: { node: '>=6' } call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, + } + engines: { node: '>= 0.4' } call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, + } + engines: { node: '>= 0.4' } call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, + } + engines: { node: '>= 0.4' } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: '>=6' } camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + resolution: + { + integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, + } camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: '>= 6' } camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, + } + engines: { node: '>=8' } camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, + } + engines: { node: '>=6' } camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: '>=10' } caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + resolution: + { + integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, + } caniuse-lite@1.0.30001707: - resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} + resolution: + { + integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==, + } case-sensitive-paths-webpack-plugin@2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==, + } + engines: { node: '>=4' } chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==, + } + engines: { node: '>=12' } chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: '>=4' } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: '>=10' } chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { + integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, + } + engines: { node: '>=10' } char-regex@2.0.2: - resolution: {integrity: sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==, + } + engines: { node: '>=12.20' } chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + resolution: + { + integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, + } check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, + } + engines: { node: '>= 16' } check-types@11.2.3: - resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} + resolution: + { + integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==, + } chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: '>= 8.10.0' } chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==, + } + engines: { node: '>=6.0' } ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, + } + engines: { node: '>=8' } cipher-base@1.0.6: - resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==, + } + engines: { node: '>= 0.10' } cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + resolution: + { + integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==, + } clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} + resolution: + { + integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==, + } + engines: { node: '>= 10.0' } cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: '>=8' } cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, + } + engines: { node: '>=6' } cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, + } + engines: { node: '>= 10' } client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + resolution: + { + integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, + } cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + resolution: + { + integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, + } clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, + } + engines: { node: '>=6' } clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + resolution: + { + integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==, + } clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + } + engines: { node: '>=0.8' } co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + resolution: + { + integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, + } + engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } coa@2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} + resolution: + { + integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==, + } + engines: { node: '>= 4.0' } collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + resolution: + { + integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, + } color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: '>=7.0.0' } color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: '>=12.5.0' } colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + resolution: + { + integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, + } colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + } + engines: { node: '>= 0.8' } command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==, + } + engines: { node: '>=4.0.0' } command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==, + } + engines: { node: '>=8.0.0' } commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==, + } + engines: { node: '>=16' } commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, + } + engines: { node: '>=18' } commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, + } + engines: { node: '>=18' } commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: '>= 6' } commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: '>= 10' } commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + commitizen@4.3.1: - resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==, + } + engines: { node: '>= 12' } hasBin: true common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, + } + engines: { node: '>=4.0.0' } commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + resolution: + { + integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, + } compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + resolution: + { + integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, + } compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, + } + engines: { node: '>= 0.6' } compression@1.8.0: - resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==, + } + engines: { node: '>= 0.8.0' } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + resolution: + { + integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, + } + engines: { '0': node >= 6.0 } confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + resolution: + { + integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==, + } connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==, + } + engines: { node: '>=0.8' } content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + } + engines: { node: '>= 0.6' } content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: '>= 0.6' } conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, + } + engines: { node: '>=10' } conventional-changelog-atom@2.0.8: - resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==, + } + engines: { node: '>=10' } conventional-changelog-codemirror@2.0.8: - resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==, + } + engines: { node: '>=10' } conventional-changelog-config-spec@2.1.0: - resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + resolution: + { + integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==, + } conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==, + } + engines: { node: '>=10' } conventional-changelog-core@4.2.4: - resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==, + } + engines: { node: '>=10' } conventional-changelog-ember@2.0.9: - resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==, + } + engines: { node: '>=10' } conventional-changelog-eslint@3.0.9: - resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==, + } + engines: { node: '>=10' } conventional-changelog-express@2.0.6: - resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==, + } + engines: { node: '>=10' } conventional-changelog-jquery@3.0.11: - resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==, + } + engines: { node: '>=10' } conventional-changelog-jshint@2.0.9: - resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==, + } + engines: { node: '>=10' } conventional-changelog-preset-loader@2.3.4: - resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==, + } + engines: { node: '>=10' } conventional-changelog-writer@5.0.1: - resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==, + } + engines: { node: '>=10' } hasBin: true conventional-changelog@3.1.25: - resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==, + } + engines: { node: '>=10' } conventional-commit-types@3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + resolution: + { + integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==, + } conventional-commits-filter@2.0.7: - resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==, + } + engines: { node: '>=10' } conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, + } + engines: { node: '>=10' } hasBin: true conventional-recommended-bump@6.1.0: - resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==, + } + engines: { node: '>=10' } hasBin: true convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + resolution: + { + integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, + } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==, + } + engines: { node: '>= 0.6' } copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + resolution: + { + integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==, + } - copy-webpack-plugin@13.0.1: - resolution: {integrity: sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==} + copy-webpack-plugin@13.0.0: + resolution: {integrity: sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.1.0 core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} + resolution: + { + integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==, + } core-js-pure@3.41.0: - resolution: {integrity: sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==} + resolution: + { + integrity: sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==, + } core-js@3.41.0: - resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} + resolution: + { + integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==, + } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } cosmiconfig-typescript-loader@6.1.0: - resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} - engines: {node: '>=v18'} + resolution: + { + integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==, + } + engines: { node: '>=v18' } peerDependencies: '@types/node': '*' cosmiconfig: '>=9' typescript: '>=5' cosmiconfig@6.0.0: - resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==, + } + engines: { node: '>=8' } cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, + } + engines: { node: '>=10' } cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==, + } + engines: { node: '>=14' } peerDependencies: typescript: '>=4.9.5' peerDependenciesMeta: @@ -4411,8 +6851,11 @@ packages: optional: true cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, + } + engines: { node: '>=14' } peerDependencies: typescript: '>=4.9.5' peerDependenciesMeta: @@ -4420,59 +6863,98 @@ packages: optional: true create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + resolution: + { + integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==, + } create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + resolution: + { + integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, + } create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + resolution: + { + integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, + } create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + { + integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, + } cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + resolution: + { + integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==, + } cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} + resolution: + { + integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==, + } + engines: { node: '>=4.8' } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: '>= 8' } crypto-browserify@3.12.1: - resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==, + } + engines: { node: '>= 0.10' } crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, + } + engines: { node: '>=8' } css-blank-pseudo@3.0.3: - resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==, + } + engines: { node: ^12 || ^14 || >=16 } hasBin: true peerDependencies: postcss: ^8.4 css-declaration-sorter@6.4.1: - resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==, + } + engines: { node: ^10 || ^12 || >=14 } peerDependencies: postcss: ^8.0.9 css-has-pseudo@3.0.4: - resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==, + } + engines: { node: ^12 || ^14 || >=16 } hasBin: true peerDependencies: postcss: ^8.4 css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==, + } + engines: { node: '>= 12.13.0' } peerDependencies: '@rspack/core': 0.x || 1.x webpack: ^5.0.0 @@ -4483,8 +6965,11 @@ packages: optional: true css-minimizer-webpack-plugin@3.4.1: - resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==, + } + engines: { node: '>= 12.13.0' } peerDependencies: '@parcel/css': '*' clean-css: '*' @@ -4502,125 +6987,218 @@ packages: optional: true css-prefers-color-scheme@6.0.3: - resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==, + } + engines: { node: ^12 || ^14 || >=16 } hasBin: true peerDependencies: postcss: ^8.4 css-select-base-adapter@0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + resolution: + { + integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==, + } css-select@2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + resolution: + { + integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==, + } css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + resolution: + { + integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, + } css-tree@1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==, + } + engines: { node: '>=8.0.0' } css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, + } + engines: { node: '>=8.0.0' } css-what@3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==, + } + engines: { node: '>= 6' } css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + } + engines: { node: '>= 6' } cssdb@7.11.2: - resolution: {integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==} + resolution: + { + integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==, + } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: '>=4' } hasBin: true cssnano-preset-default@5.2.14: - resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 cssnano-utils@3.1.0: - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 cssnano@5.1.15: - resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, + } + engines: { node: '>=8.0.0' } cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + resolution: + { + integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, + } cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + resolution: + { + integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==, + } cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, + } + engines: { node: '>=8' } csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + resolution: + { + integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==, + } csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + resolution: + { + integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==, + } csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + resolution: + { + integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==, + } csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} + resolution: + { + integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==, + } + engines: { node: '>= 0.1.90' } cz-conventional-changelog@3.3.0: - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, + } + engines: { node: '>= 10' } damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + resolution: + { + integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, + } dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, + } + engines: { node: '>=8' } data-urls@2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==, + } + engines: { node: '>=10' } data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, + } + engines: { node: '>= 0.4' } data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, + } + engines: { node: '>= 0.4' } data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, + } + engines: { node: '>= 0.4' } dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + resolution: + { + integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, + } debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -4628,7 +7206,10 @@ packages: optional: true debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -4636,8 +7217,11 @@ packages: optional: true debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -4645,8 +7229,11 @@ packages: optional: true debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, + } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -4654,404 +7241,715 @@ packages: optional: true decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, + } + engines: { node: '>=0.10.0' } decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, + } + engines: { node: '>=0.10.0' } decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + resolution: + { + integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==, + } decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, + } + engines: { node: '>=10' } dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + resolution: + { + integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, + } deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: '>=6' } deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==, + } + engines: { node: '>= 0.4' } deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, + } + engines: { node: '>=4.0.0' } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: '>=0.10.0' } default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==, + } + engines: { node: '>=18' } default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==, + } + engines: { node: '>=18' } default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==, + } + engines: { node: '>= 10' } defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, + } + engines: { node: '>=10' } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: '>= 0.4' } define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: '>=8' } define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==, + } + engines: { node: '>=12' } define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: '>= 0.4' } delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==, + } + engines: { node: '>=10' } delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + } + engines: { node: '>=0.4.0' } depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, + } + engines: { node: '>= 0.6' } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: '>= 0.8' } des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + resolution: + { + integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==, + } destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, + } + engines: { node: '>=0.10.0' } detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, + } + engines: { node: '>=8' } detect-indent@7.0.1: - resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==, + } + engines: { node: '>=12.20' } detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==, + } + engines: { node: '>=8' } detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, + } + engines: { node: '>=8' } detect-newline@4.0.1: - resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + resolution: + { + integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, + } detect-port-alt@1.1.6: - resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} - engines: {node: '>= 4.2.1'} + resolution: + { + integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==, + } + engines: { node: '>= 4.2.1' } hasBin: true didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } diff-sequences@27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + resolution: + { + integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, + } + engines: { node: '>=0.3.1' } diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + resolution: + { + integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==, + } dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: '>=8' } dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==, + } + engines: { node: '>=6' } doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, + } + engines: { node: '>=0.10.0' } doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: '>=6.0.0' } dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + resolution: + { + integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==, + } dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + resolution: + { + integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==, + } dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + resolution: + { + integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, + } domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + resolution: + { + integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==, + } domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} - deprecated: Use your platform's native DOMException instead domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, + } + engines: { node: '>= 4' } domutils@1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + resolution: + { + integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==, + } domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + resolution: + { + integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, + } dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + resolution: + { + integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, + } dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, + } + engines: { node: '>=8' } dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + resolution: + { + integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==, + } dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==, + } + engines: { node: '>=10' } dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + resolution: + { + integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==, + } + engines: { node: '>=12' } + + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} dotgitignore@2.1.0: - resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==, + } + engines: { node: '>=6' } dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: '>= 0.4' } duplexer@0.1.1: - resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} + resolution: + { + integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==, + } duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + resolution: + { + integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, + } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==, + } + engines: { node: '>=0.10.0' } hasBin: true electron-to-chromium@1.5.128: - resolution: {integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==} + resolution: + { + integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==, + } elliptic@6.6.1: - resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + resolution: + { + integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==, + } email-addresses@5.0.0: - resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} + resolution: + { + integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==, + } emittery@0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==, + } + engines: { node: '>=12' } emittery@0.8.1: - resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==, + } + engines: { node: '>=10' } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, + } + engines: { node: '>= 4' } encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: '>= 0.8' } encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, + } + engines: { node: '>= 0.8' } - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==, + } + engines: { node: '>=10.13.0' } enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, + } + engines: { node: '>=8.6' } entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + resolution: + { + integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, + } env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: '>=6' } envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==, + } + engines: { node: '>=4' } hasBin: true error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + resolution: + { + integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==, + } es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==, + } + engines: { node: '>= 0.4' } es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + resolution: + { + integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==, + } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: '>= 0.4' } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: '>= 0.4' } es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + resolution: + { + integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, + } es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==, + } + engines: { node: '>= 0.4' } es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + resolution: + { + integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==, + } es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + } + engines: { node: '>= 0.4' } es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: '>= 0.4' } es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, + } + engines: { node: '>= 0.4' } es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, + } + engines: { node: '>= 0.4' } es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + resolution: + { + integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==, + } es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + resolution: + { + integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==, + } esbuild-loader@2.21.0: - resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} + resolution: + { + integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==, + } peerDependencies: webpack: ^4.40.0 || ^5.0.0 esbuild@0.16.17: - resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==, + } + engines: { node: '>=12' } hasBin: true esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, + } + engines: { node: '>=12' } hasBin: true esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==, + } + engines: { node: '>=18' } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: '>=6' } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: '>=0.8.0' } escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, + } + engines: { node: '>=8' } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: '>=10' } escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, + } + engines: { node: '>=4.0' } hasBin: true escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, + } + engines: { node: '>=6.0' } hasBin: true eslint-config-next@14.0.4: - resolution: {integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==} + resolution: + { + integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==, + } peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -5060,14 +7958,20 @@ packages: optional: true eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + resolution: + { + integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, + } hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-config-react-app@7.0.1: - resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==, + } + engines: { node: '>=14.0.0' } peerDependencies: eslint: ^8.0.0 typescript: '*' @@ -5076,17 +7980,26 @@ packages: optional: true eslint-config-typestrict@1.0.5: - resolution: {integrity: sha512-6W48TD8kXMpj9lUTBoDWFKI+qRpgPQPKy9NPIf2cP56HiT6RBO9g7uvApvvl0DtfmAKP1kXbbI+Mg6xVROrXZA==} + resolution: + { + integrity: sha512-6W48TD8kXMpj9lUTBoDWFKI+qRpgPQPKy9NPIf2cP56HiT6RBO9g7uvApvvl0DtfmAKP1kXbbI+Mg6xVROrXZA==, + } peerDependencies: '@typescript-eslint/eslint-plugin': ^5 eslint-plugin-sonarjs: '*' eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + resolution: + { + integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, + } eslint-import-resolver-typescript@3.10.0: - resolution: {integrity: sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { + integrity: sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==, + } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: eslint: '*' eslint-plugin-import: '*' @@ -5098,8 +8011,11 @@ packages: optional: true eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==, + } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -5119,22 +8035,31 @@ packages: optional: true eslint-plugin-eslint-comments@3.2.0: - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} + resolution: + { + integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==, + } + engines: { node: '>=6.5.0' } peerDependencies: eslint: '>=4.19.1' eslint-plugin-flowtype@8.0.3: - resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==, + } + engines: { node: '>=12.0.0' } peerDependencies: '@babel/plugin-syntax-flow': ^7.14.5 '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==, + } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 @@ -5143,8 +8068,11 @@ packages: optional: true eslint-plugin-jest@25.7.0: - resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + resolution: + { + integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } peerDependencies: '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -5156,52 +8084,76 @@ packages: optional: true eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==, + } + engines: { node: '>=4.0' } peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 eslint-plugin-no-only-tests@3.3.0: - resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} - engines: {node: '>=5.0.0'} + resolution: + { + integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==, + } + engines: { node: '>=5.0.0' } eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==, + } + engines: { node: '>=10' } peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: - resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==, + } + engines: { node: '>=10' } peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==, + } + engines: { node: '>=4' } peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-plugin-simple-import-sort@10.0.0: - resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} + resolution: + { + integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==, + } peerDependencies: eslint: '>=5.0.0' eslint-plugin-sonarjs@0.23.0: - resolution: {integrity: sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==, + } + engines: { node: '>=14' } peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 eslint-plugin-testing-library@5.11.1: - resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + resolution: + { + integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6' } peerDependencies: eslint: ^7.5.0 || ^8.0.0 - eslint-plugin-unused-imports@4.2.0: - resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} + eslint-plugin-unused-imports@4.1.4: + resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^9.0.0 || ^8.0.0 @@ -5210,24 +8162,39 @@ packages: optional: true eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: '>=8.0.0' } eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, + } + engines: { node: '>=10' } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-webpack-plugin@3.2.0: - resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==, + } + engines: { node: '>= 12.13.0' } peerDependencies: eslint: ^7.0.0 || ^8.0.0 webpack: ^5.0.0 @@ -5235,148 +8202,257 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } esprima@1.2.2: - resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==, + } + engines: { node: '>=0.4.0' } hasBin: true esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: '>=4' } hasBin: true esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, + } + engines: { node: '>=0.10' } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: '>=4.0' } estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: '>=4.0' } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: '>=4.0' } estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + resolution: + { + integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==, + } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: '>=0.10.0' } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: '>= 0.6' } ethers@5.8.0: - resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} + resolution: + { + integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==, + } eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: '>=0.8.x' } evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + resolution: + { + integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, + } execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: '>=10' } exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, + } + engines: { node: '>= 0.8.0' } expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, + } + engines: { node: '>=0.10.0' } expect-type@1.2.0: - resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==, + } + engines: { node: '>=12.0.0' } expect@27.5.1: - resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } exponential-backoff@3.1.2: - resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + resolution: + { + integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==, + } express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} + resolution: + { + integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==, + } + engines: { node: '>= 0.10.0' } extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + resolution: + { + integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==, + } external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, + } + engines: { node: '>=4' } eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} + resolution: + { + integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==, + } + engines: { node: '> 0.1.90' } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, + } + engines: { node: '>=8.6.0' } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + resolution: + { + integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==, + } fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + resolution: + { + integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==, + } fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} + resolution: + { + integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, + } + engines: { node: '>= 4.9.1' } fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + resolution: + { + integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, + } faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, + } + engines: { node: '>=0.8.0' } fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + resolution: + { + integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, + } fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + resolution: + { + integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==, + } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5384,8 +8460,11 @@ packages: optional: true fetch-mock@9.11.0: - resolution: {integrity: sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==, + } + engines: { node: '>=4.0.0' } peerDependencies: node-fetch: '*' peerDependenciesMeta: @@ -5393,93 +8472,162 @@ packages: optional: true figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, + } + engines: { node: '>=8' } file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } file-loader@6.2.0: - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==, + } + engines: { node: '>= 10.13.0' } peerDependencies: webpack: ^4.0.0 || ^5.0.0 file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + resolution: + { + integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, + } filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + resolution: + { + integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, + } filename-reserved-regex@2.0.0: - resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==, + } + engines: { node: '>=4' } filenamify@4.3.0: - resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==, + } + engines: { node: '>=8' } filesize@8.0.7: - resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==, + } + engines: { node: '>= 0.4.0' } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: '>=8' } finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==, + } + engines: { node: '>= 0.8' } find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==, + } + engines: { node: '>=8' } find-node-modules@2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + resolution: + { + integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==, + } find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==, + } + engines: { node: '>=4.0.0' } find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + resolution: + { + integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, + } find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, + } + engines: { node: '>=4' } find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, + } + engines: { node: '>=6' } find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: '>=8' } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: '>=10' } findup-sync@4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==, + } + engines: { node: '>= 8' } flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } hasBin: true flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + resolution: + { + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, + } follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, + } + engines: { node: '>=4.0' } peerDependencies: debug: '*' peerDependenciesMeta: @@ -5487,16 +8635,25 @@ packages: optional: true for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, + } + engines: { node: '>= 0.4' } foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, + } + engines: { node: '>=14' } fork-ts-checker-webpack-plugin@6.5.3: - resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} - engines: {node: '>=10', yarn: '>=1.0.0'} + resolution: + { + integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==, + } + engines: { node: '>=10', yarn: '>=1.0.0' } peerDependencies: eslint: '>= 6' typescript: '>= 2.7' @@ -5509,328 +8666,572 @@ packages: optional: true form-data@3.0.3: - resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==, + } + engines: { node: '>= 6' } form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==, + } + engines: { node: '>= 6' } form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==, + } + engines: { node: '>= 6' } forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: '>= 0.6' } fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + resolution: + { + integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, + } fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: '>= 0.6' } fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, + } + engines: { node: '>=12' } fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} - engines: {node: '>=14.14'} + resolution: + { + integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==, + } + engines: { node: '>=14.14' } fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { + integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, + } + engines: { node: '>=6 <7 || >=8' } fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, + } + engines: { node: '>=6 <7 || >=8' } fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, + } + engines: { node: '>=10' } fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + resolution: + { + integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==, + } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, + } + engines: { node: '>= 0.4' } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: '>=6.9.0' } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, + } + engines: { node: '>= 0.4' } get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + resolution: + { + integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, + } get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, + } + engines: { node: '>=8.0.0' } get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} + resolution: + { + integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, + } + engines: { node: '>=6.9.0' } hasBin: true get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: '>= 0.4' } get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==, + } + engines: { node: '>=12' } get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, + } + engines: { node: '>=8' } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: '>=10' } get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, + } + engines: { node: '>= 0.4' } get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + resolution: + { + integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, + } gh-pages@6.3.0: - resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==, + } + engines: { node: '>=10' } hasBin: true git-hooks-list@3.2.0: - resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} + resolution: + { + integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==, + } git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, + } + engines: { node: '>=10' } hasBin: true git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, + } + engines: { node: '>=4' } git-semver-tags@4.1.1: - resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==, + } + engines: { node: '>=10' } hasBin: true gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + resolution: + { + integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, + } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: '>= 6' } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: '>=10.13.0' } glob-to-regex.js@1.0.1: - resolution: {integrity: sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==} - engines: {node: '>=10.0'} + resolution: + { + integrity: sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==, + } + engines: { node: '>=10.0' } peerDependencies: tslib: '2' glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + resolution: + { + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, + } hasBin: true glob@11.0.1: - resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==, + } + engines: { node: 20 || >=22 } hasBin: true glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==, + } + engines: { node: '>=18' } global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, + } + engines: { node: '>=0.10.0' } global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, + } + engines: { node: '>=6' } global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, + } + engines: { node: '>=0.10.0' } global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, + } + engines: { node: '>=6' } globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: '>=4' } globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, + } + engines: { node: '>=8' } globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: '>= 0.4' } globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: '>=10' } gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: '>= 0.4' } got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} + resolution: + { + integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==, + } + engines: { node: '>=10.19.0' } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==, + } + engines: { node: '>=10' } handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + resolution: + { + integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==, + } handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} + resolution: + { + integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, + } + engines: { node: '>=0.4.7' } hasBin: true hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, + } + engines: { node: '>=6' } harmony-reflect@1.6.2: - resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} + resolution: + { + integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==, + } has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, + } + engines: { node: '>= 0.4' } has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: '>=4' } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: '>=8' } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, + } + engines: { node: '>= 0.4' } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: '>= 0.4' } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: '>= 0.4' } hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==, + } + engines: { node: '>= 0.10' } hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + resolution: + { + integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, + } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: '>= 0.4' } he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + { + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, + } hasBin: true hi-base32@0.5.1: - resolution: {integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==} + resolution: + { + integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==, + } hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + resolution: + { + integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, + } homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, + } + engines: { node: '>=0.10.0' } hoopy@0.1.4: - resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} - engines: {node: '>= 6.0.0'} + resolution: + { + integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==, + } + engines: { node: '>= 6.0.0' } hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + resolution: + { + integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, + } hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, + } + engines: { node: '>=10' } hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + resolution: + { + integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==, + } html-encoding-sniffer@2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==, + } + engines: { node: '>=10' } html-entities@2.5.3: - resolution: {integrity: sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw==} + resolution: + { + integrity: sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw==, + } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { + integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, + } html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, + } + engines: { node: '>=12' } hasBin: true html-webpack-plugin@5.6.3: - resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==, + } + engines: { node: '>=10.13.0' } peerDependencies: '@rspack/core': 0.x || 1.x webpack: ^5.20.0 @@ -5841,36 +9242,60 @@ packages: optional: true htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + resolution: + { + integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==, + } - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + resolution: + { + integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==, + } http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==, + } + engines: { node: '>= 0.6' } http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==, + } + engines: { node: '>= 0.6' } http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: '>= 0.8' } http-parser-js@0.5.9: - resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} + resolution: + { + integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==, + } http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, + } + engines: { node: '>= 6' } http-proxy-middleware@2.0.7: - resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==, + } + engines: { node: '>=12.0.0' } peerDependencies: '@types/express': ^4.17.13 peerDependenciesMeta: @@ -5878,8 +9303,11 @@ packages: optional: true http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==, + } + engines: { node: '>=12.0.0' } peerDependencies: '@types/express': ^4.17.13 peerDependenciesMeta: @@ -5887,425 +9315,758 @@ packages: optional: true http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, + } + engines: { node: '>=8.0.0' } http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} + resolution: + { + integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==, + } + engines: { node: '>=10.19.0' } https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + } + engines: { node: '>= 6' } human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + resolution: + { + integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==, + } hasBin: true human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: '>=10.17.0' } humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + resolution: + { + integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, + } hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} + resolution: + { + integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==, + } + engines: { node: '>=10.18' } iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: '>=0.10.0' } iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: '>=0.10.0' } icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + resolution: + { + integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, + } identity-obj-proxy@3.0.0: - resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==, + } + engines: { node: '>=4' } ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, + } + engines: { node: '>= 4' } immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + resolution: + { + integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==, + } import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, + } + engines: { node: '>=6' } import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==, + } + engines: { node: '>=8' } hasBin: true import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + resolution: + { + integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==, + } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: '>=0.8.19' } indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: '>=8' } inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + resolution: + { + integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, + } inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + resolution: + { + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, + } ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { + integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, + } + engines: { node: '>=12.0.0' } inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==, + } + engines: { node: '>=12.0.0' } internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, + } + engines: { node: '>= 0.4' } interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==, + } + engines: { node: '>=10.13.0' } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: '>= 0.10' } ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==, + } + engines: { node: '>= 10' } is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==, + } + engines: { node: '>= 0.4' } is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, + } + engines: { node: '>= 0.4' } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, + } + engines: { node: '>= 0.4' } is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, + } + engines: { node: '>= 0.4' } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: '>=8' } is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, + } + engines: { node: '>= 0.4' } is-bun-module@2.0.0: - resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + resolution: + { + integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==, + } is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: '>= 0.4' } is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, + } + engines: { node: '>= 0.4' } is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, + } + engines: { node: '>= 0.4' } is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, + } + engines: { node: '>= 0.4' } is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: '>=8' } hasBin: true is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } hasBin: true is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: '>=0.10.0' } is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, + } + engines: { node: '>= 0.4' } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: '>=8' } is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, + } + engines: { node: '>=6' } is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, + } + engines: { node: '>= 0.4' } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: '>=0.10.0' } is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, + } + engines: { node: '>=14.16' } hasBin: true is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, + } + engines: { node: '>=8' } is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, + } + engines: { node: '>= 0.4' } is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + resolution: + { + integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, + } is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==, + } + engines: { node: '>=16' } is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, + } + engines: { node: '>= 0.4' } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: '>=0.12.0' } is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, + } + engines: { node: '>=0.10.0' } is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, + } + engines: { node: '>=8' } is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: '>=8' } is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, + } + engines: { node: '>=0.10.0' } is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==, + } + engines: { node: '>=10' } is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: '>=12' } is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, + } + engines: { node: '>=0.10.0' } is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + resolution: + { + integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, + } is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, + } + engines: { node: '>= 0.4' } is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, + } + engines: { node: '>=0.10.0' } is-retry-allowed@2.2.0: - resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==, + } + engines: { node: '>=10' } is-root@2.1.0: - resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==, + } + engines: { node: '>=6' } is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, + } + engines: { node: '>= 0.4' } is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, + } + engines: { node: '>= 0.4' } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: '>=8' } is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, + } + engines: { node: '>= 0.4' } is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==, + } + engines: { node: '>=4' } is-subset@0.1.1: - resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} + resolution: + { + integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==, + } is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, + } + engines: { node: '>= 0.4' } is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, + } + engines: { node: '>=0.10.0' } is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, + } + engines: { node: '>= 0.4' } is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + resolution: + { + integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, + } is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: '>=10' } is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + resolution: + { + integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, + } is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, + } + engines: { node: '>= 0.4' } is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, + } + engines: { node: '>= 0.4' } is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, + } + engines: { node: '>= 0.4' } is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, + } + engines: { node: '>=0.10.0' } is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: '>=8' } is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, + } + engines: { node: '>=16' } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, + } + engines: { node: '>=0.10.0' } isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + resolution: + { + integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==, + } + peerDependencies: + ws: '*' + + isows@1.0.7: + resolution: + { + integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==, + } + peerDependencies: + ws: '*' + + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} peerDependencies: ws: '*' istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, + } + engines: { node: '>=8' } istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, + } + engines: { node: '>=8' } istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, + } + engines: { node: '>=10' } istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, + } + engines: { node: '>=10' } istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==, + } + engines: { node: '>=10' } istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, + } + engines: { node: '>=8' } iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==, + } + engines: { node: '>= 0.4' } jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } jackspeak@4.1.0: - resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==, + } + engines: { node: 20 || >=22 } jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==, + } + engines: { node: '>=10' } hasBin: true jayson@4.1.3: - resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==, + } + engines: { node: '>=8' } hasBin: true jest-changed-files@27.5.1: - resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-circus@27.5.1: - resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-cli@27.5.1: - resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -6314,8 +10075,11 @@ packages: optional: true jest-config@27.5.1: - resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } peerDependencies: ts-node: '>=9.0.0' peerDependenciesMeta: @@ -6323,60 +10087,102 @@ packages: optional: true jest-diff@27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-docblock@27.5.1: - resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-each@27.5.1: - resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-environment-jsdom@27.5.1: - resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-environment-node@27.5.1: - resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-get-type@27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-haste-map@27.5.1: - resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-jasmine2@27.5.1: - resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-leak-detector@27.5.1: - resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-matcher-utils@27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-message-util@27.5.1: - resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-message-util@28.1.3: - resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } jest-mock@27.5.1: - resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, + } + engines: { node: '>=6' } peerDependencies: jest-resolve: '*' peerDependenciesMeta: @@ -6384,78 +10190,132 @@ packages: optional: true jest-regex-util@27.5.1: - resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-regex-util@28.0.2: - resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } jest-resolve-dependencies@27.5.1: - resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-resolve@27.5.1: - resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-runner@27.5.1: - resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-runtime@27.5.1: - resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-serializer@27.5.1: - resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-snapshot@27.5.1: - resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-util@27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-util@28.1.3: - resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } jest-validate@27.5.1: - resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-watch-typeahead@1.1.0: - resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { + integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: jest: ^27.0.0 || ^28.0.0 jest-watcher@27.5.1: - resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } jest-watcher@28.1.3: - resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, + } + engines: { node: '>= 10.13.0' } jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, + } + engines: { node: '>= 10.13.0' } jest-worker@28.1.3: - resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } jest@27.5.1: - resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -6464,46 +10324,82 @@ packages: optional: true jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + resolution: + { + integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==, + } hasBin: true jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + resolution: + { + integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==, + } hasBin: true joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, + } + engines: { node: '>=10' } js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + resolution: + { + integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==, + } js-sha256@0.9.0: - resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + resolution: + { + integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==, + } js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + resolution: + { + integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==, + } js-sha512@0.8.0: - resolution: {integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==} + resolution: + { + integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==, + } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + resolution: + { + integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, + } js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } hasBin: true js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } hasBin: true jsdom@16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==, + } + engines: { node: '>=10' } peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: @@ -6511,517 +10407,933 @@ packages: optional: true jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, + } + engines: { node: '>=6' } hasBin: true jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, + } + engines: { node: '>=6' } hasBin: true json-bigint@1.0.0: - resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + resolution: + { + integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==, + } json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + resolution: + { + integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, + } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + resolution: + { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, + } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + resolution: + { + integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, + } json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + resolution: + { + integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, + } hasBin: true json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: '>=6' } hasBin: true jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + resolution: + { + integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, + } jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { + integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, + } jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + resolution: + { + integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, + } + engines: { '0': node >= 0.2.0 } jsonpath@1.1.1: - resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} + resolution: + { + integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==, + } jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, + } + engines: { node: '>=0.10.0' } jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, + } + engines: { node: '>=4.0' } jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==, + } + engines: { node: '>=18' } keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==, + } + engines: { node: '>=10.0.0' } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: '>=0.10.0' } kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: '>=6' } kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: '>=6' } klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, + } + engines: { node: '>= 8' } language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + resolution: + { + integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==, + } language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==, + } + engines: { node: '>=0.10' } launch-editor@2.10.0: - resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} + resolution: + { + integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==, + } leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, + } + engines: { node: '>=6' } levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, + } + engines: { node: '>= 0.8.0' } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: '>= 0.8.0' } lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: '>=10' } lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, + } + engines: { node: '>=14' } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, + } + engines: { node: '>=4' } load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} + resolution: + { + integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, + } + engines: { node: '>=6.11.5' } loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + resolution: + { + integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==, + } + engines: { node: '>=8.9.0' } loader-utils@3.3.1: - resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==, + } + engines: { node: '>= 12.13.0' } locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, + } + engines: { node: '>=4' } locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, + } + engines: { node: '>=6' } locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: '>=8' } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: '>=10' } lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + resolution: + { + integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, + } lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + resolution: + { + integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, + } lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + resolution: + { + integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, + } lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } lodash.map@4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + resolution: + { + integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==, + } lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + resolution: + { + integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, + } lodash.pickby@4.6.0: - resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} + resolution: + { + integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, + } lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + resolution: + { + integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, + } lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + resolution: + { + integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, + } lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + resolution: + { + integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, + } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: '>=10' } longest@2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==, + } + engines: { node: '>=0.10.0' } loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } hasBin: true loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + resolution: + { + integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==, + } lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + resolution: + { + integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, + } lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==, + } + engines: { node: '>=8' } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==, + } + engines: { node: 20 || >=22 } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: '>=10' } lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + resolution: + { + integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==, + } magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + resolution: + { + integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, + } magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + resolution: + { + integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, + } magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + resolution: + { + integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==, + } make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, + } + engines: { node: '>=8' } make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, + } + engines: { node: '>=10' } make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + resolution: + { + integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, + } makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + resolution: + { + integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, + } map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, + } + engines: { node: '>=0.10.0' } map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, + } + engines: { node: '>=8' } marked@4.3.0: - resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==, + } + engines: { node: '>= 12' } hasBin: true math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: '>= 0.4' } md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + resolution: + { + integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, + } mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + resolution: + { + integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, + } mdn-data@2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + resolution: + { + integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==, + } media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: '>= 0.6' } memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - - memfs@4.38.2: - resolution: {integrity: sha512-FpWsVHpAkoSh/LfY1BgAl72BVd374ooMRtDi2VqzBycX4XEfvC0XKACCe0C9VRZoYq5viuoyTv6lYXZ/Q7TrLQ==} + resolution: + { + integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==, + } + engines: { node: '>= 4.0.0' } + + memfs@4.17.2: + resolution: {integrity: sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==} engines: {node: '>= 4.0.0'} memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} + resolution: + { + integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==, + } + engines: { node: '>= 0.10.0' } meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, + } + engines: { node: '>=10' } merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + resolution: + { + integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, + } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: '>= 8' } merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + resolution: + { + integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==, + } methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, + } + engines: { node: '>= 0.6' } micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: '>=8.6' } miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + resolution: + { + integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==, + } hasBin: true mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: '>= 0.6' } mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, + } + engines: { node: '>= 0.6' } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: '>= 0.6' } mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: '>=4' } hasBin: true mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: '>=6' } mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, + } + engines: { node: '>=4' } mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, + } + engines: { node: '>=10' } min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, + } + engines: { node: '>=4' } mini-css-extract-plugin@2.9.2: - resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==, + } + engines: { node: '>= 12.13.0' } peerDependencies: webpack: ^5.0.0 minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + resolution: + { + integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, + } minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + resolution: + { + integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, + } minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==, + } + engines: { node: 20 || >=22 } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, + } + engines: { node: '>=10' } minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + } + engines: { node: '>=16 || 14 >=14.17' } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: '>=16 || 14 >=14.17' } minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, + } + engines: { node: '>= 6' } minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + resolution: + { + integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==, + } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: '>=16 || 14 >=14.17' } mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} + resolution: + { + integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==, + } + engines: { node: '>= 8.0.0' } mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + resolution: + { + integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, + } hasBin: true mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: '>=10' } hasBin: true modified-zod2md@0.1.5-modified.4: - resolution: {integrity: sha512-zwt4KieUJco2141MUrI52wRG0kdVoIZ1bEveE8TmcbWMhVE7wD72pdKx1o8qXhBW+d3RACuxF90oGuhu/KnzDw==} + resolution: + { + integrity: sha512-zwt4KieUJco2141MUrI52wRG0kdVoIZ1bEveE8TmcbWMhVE7wD72pdKx1o8qXhBW+d3RACuxF90oGuhu/KnzDw==, + } hasBin: true peerDependencies: zod: ^3.22.0 modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, + } + engines: { node: '>=0.10.0' } mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + } + engines: { node: '>=4' } ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + resolution: + { + integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==, + } hasBin: true multistream@4.1.0: - resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + resolution: + { + integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==, + } mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} + resolution: + { + integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, + } hasBin: true mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + resolution: + { + integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, + } mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } nanoclone@0.2.1: - resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} + resolution: + { + integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==, + } nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true nanoid@3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + resolution: + { + integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, + } natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } near-hd-key@1.2.1: - resolution: {integrity: sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg==} + resolution: + { + integrity: sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg==, + } near-seed-phrase@0.2.1: - resolution: {integrity: sha512-feMuums+kVL3LSuPcP4ld07xHCb2mu6z48SGfP3W+8tl1Qm5xIcjiQzY2IDPBvFgajRDxWSb8GzsRHoInazByw==} + resolution: + { + integrity: sha512-feMuums+kVL3LSuPcP4ld07xHCb2mu6z48SGfP3W+8tl1Qm5xIcjiQzY2IDPBvFgajRDxWSb8GzsRHoInazByw==, + } negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: '>= 0.6' } negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==, + } + engines: { node: '>= 0.6' } neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } next@15.3.4: - resolution: {integrity: sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + resolution: + { + integrity: sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA==, + } + engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 } hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -7041,20 +11353,35 @@ packages: optional: true nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + resolution: + { + integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, + } no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + resolution: + { + integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, + } node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + resolution: + { + integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==, + } node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + resolution: + { + integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==, + } node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} + resolution: + { + integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, + } + engines: { node: 4.x || >=6.0.0 } peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -7062,524 +11389,903 @@ packages: optional: true node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: '>= 6.13.0' } node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + resolution: + { + integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==, + } hasBin: true node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + resolution: + { + integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, + } node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + resolution: + { + integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, + } normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + resolution: + { + integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, + } normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, + } + engines: { node: '>=10' } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: '>=0.10.0' } normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: '>=0.10.0' } normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, + } + engines: { node: '>=10' } npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==, + } + engines: { node: '>= 4' } hasBin: true npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: '>=8' } nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + resolution: + { + integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==, + } object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: '>=0.10.0' } object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: '>= 6' } object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, + } + engines: { node: '>= 0.4' } object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==, + } + engines: { node: '>= 0.4' } object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: '>= 0.4' } object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, + } + engines: { node: '>= 0.4' } object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==, + } + engines: { node: '>= 0.4' } object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, + } + engines: { node: '>= 0.4' } object.getownpropertydescriptors@2.1.8: - resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==, + } + engines: { node: '>= 0.8' } object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, + } + engines: { node: '>= 0.4' } object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, + } + engines: { node: '>= 0.4' } obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + resolution: + { + integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==, + } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: '>= 0.8' } on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, + } + engines: { node: '>= 0.8' } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: '>=6' } + + open@10.1.2: + resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} engines: {node: '>=18'} open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: '>=12' } optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, + } + engines: { node: '>= 0.8.0' } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: '>= 0.8.0' } ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + } + engines: { node: '>=10' } os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, + } + engines: { node: '>=0.10.0' } outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + resolution: + { + integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==, + } own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, + } + engines: { node: '>= 0.4' } + + ox@0.8.6: + resolution: + { + integrity: sha512-eiKcgiVVEGDtEpEdFi1EGoVVI48j6icXHce9nFwCNM7CKG3uoCXKdr4TPhS00Iy1TR2aWSF1ltPD0x/YgqIL9w==, + } + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.8.6: + resolution: {integrity: sha512-eiKcgiVVEGDtEpEdFi1EGoVVI48j6icXHce9nFwCNM7CKG3uoCXKdr4TPhS00Iy1TR2aWSF1ltPD0x/YgqIL9w==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==, + } + engines: { node: '>=8' } p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==, + } + engines: { node: '>=8' } p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, + } + engines: { node: '>=4' } p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: '>=6' } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: '>=10' } p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, + } + engines: { node: '>=4' } p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, + } + engines: { node: '>=6' } p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: '>=8' } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: '>=10' } p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==, + } + engines: { node: '>=6' } p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==, + } + engines: { node: '>=8' } p-retry@6.2.1: - resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} - engines: {node: '>=16.17'} + resolution: + { + integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==, + } + engines: { node: '>=16.17' } p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, + } + engines: { node: '>=4' } p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: '>=6' } package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + resolution: + { + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, + } package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + resolution: + { + integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==, + } param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + resolution: + { + integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, + } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: '>=6' } parse-asn1@5.1.7: - resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==, + } + engines: { node: '>= 0.10' } parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, + } + engines: { node: '>=4' } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: '>=8' } parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, + } + engines: { node: '>=0.10.0' } parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + resolution: + { + integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, + } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: '>= 0.8' } pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + resolution: + { + integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, + } path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, + } + engines: { node: '>=4' } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: '>=8' } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: '>=0.10.0' } path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, + } + engines: { node: '>=4' } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: '>=8' } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: '>=16 || 14 >=14.18' } path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} + resolution: + { + integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==, + } + engines: { node: 20 || >=22 } path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + resolution: + { + integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==, + } path-to-regexp@2.4.0: - resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==} + resolution: + { + integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==, + } path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, + } + engines: { node: '>=4' } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: '>=8' } pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} + resolution: + { + integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==, + } + engines: { node: '>= 14.16' } pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, + } + engines: { node: '>=0.12' } performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + resolution: + { + integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, + } picocolors@0.2.1: - resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + resolution: + { + integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==, + } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: '>=8.6' } picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, + } + engines: { node: '>=12' } pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==, + } + engines: { node: '>=0.10' } hasBin: true pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: '>=0.10.0' } pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, + } + engines: { node: '>=4' } pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: '>=6' } pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, + } + engines: { node: '>= 6' } pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: '>=8' } pkg-up@3.1.0: - resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==, + } + engines: { node: '>=8' } poseidon-lite@0.2.1: - resolution: {integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==} + resolution: + { + integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==, + } possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==, + } + engines: { node: '>= 0.4' } postcss-attribute-case-insensitive@5.0.2: - resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-browser-comments@4.0.0: - resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==, + } + engines: { node: '>=8' } peerDependencies: browserslist: '>=4' postcss: '>=8' postcss-calc@8.2.4: - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} + resolution: + { + integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==, + } peerDependencies: postcss: ^8.2.2 postcss-clamp@4.1.0: - resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} - engines: {node: '>=7.6.0'} + resolution: + { + integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, + } + engines: { node: '>=7.6.0' } peerDependencies: postcss: ^8.4.6 postcss-color-functional-notation@4.2.4: - resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-color-hex-alpha@8.0.4: - resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.4 postcss-color-rebeccapurple@7.1.1: - resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-colormin@5.3.1: - resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-convert-values@5.1.3: - resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-custom-media@8.0.2: - resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.3 postcss-custom-properties@12.1.11: - resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-custom-selectors@6.0.3: - resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.3 postcss-dir-pseudo-class@6.0.5: - resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-discard-comments@5.1.2: - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-discard-duplicates@5.1.0: - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-discard-empty@5.1.1: - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-discard-overridden@5.1.0: - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-double-position-gradients@3.1.2: - resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-env-function@4.0.6: - resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.4 postcss-flexbugs-fixes@5.0.2: - resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} + resolution: + { + integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==, + } peerDependencies: postcss: ^8.1.4 postcss-focus-visible@6.0.4: - resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.4 postcss-focus-within@5.0.4: - resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.4 postcss-font-variant@5.0.0: - resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} + resolution: + { + integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, + } peerDependencies: postcss: ^8.1.0 postcss-gap-properties@3.0.5: - resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-image-set-function@4.0.7: - resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: '>=14.0.0' } peerDependencies: postcss: ^8.0.0 postcss-initial@4.0.1: - resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} + resolution: + { + integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==, + } peerDependencies: postcss: ^8.0.0 postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} + resolution: + { + integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, + } + engines: { node: ^12 || ^14 || >= 16 } peerDependencies: postcss: ^8.4.21 postcss-lab-function@4.2.1: - resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, + } + engines: { node: '>= 14' } peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -7590,266 +12296,407 @@ packages: optional: true postcss-loader@6.2.1: - resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==, + } + engines: { node: '>= 12.13.0' } peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 postcss-logical@5.0.4: - resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.4 postcss-media-minmax@5.0.0: - resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==, + } + engines: { node: '>=10.0.0' } peerDependencies: postcss: ^8.1.0 postcss-merge-longhand@5.1.7: - resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-merge-rules@5.1.4: - resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-minify-font-values@5.1.0: - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-minify-gradients@5.1.1: - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-minify-params@5.1.4: - resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-minify-selectors@5.2.1: - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} + resolution: + { + integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, + } + engines: { node: '>=12.0' } peerDependencies: postcss: ^8.2.14 postcss-nesting@10.2.0: - resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-normalize-charset@5.1.0: - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize-display-values@5.1.0: - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize-positions@5.1.1: - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize-repeat-style@5.1.1: - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize-string@5.1.0: - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize-timing-functions@5.1.0: - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize-unicode@5.1.1: - resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize-url@5.1.0: - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize-whitespace@5.1.1: - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-normalize@10.0.1: - resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==, + } + engines: { node: '>= 12' } peerDependencies: browserslist: '>= 4' postcss: '>= 8' postcss-opacity-percentage@1.1.3: - resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-ordered-values@5.1.3: - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-overflow-shorthand@3.0.4: - resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-page-break@3.0.4: - resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} + resolution: + { + integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, + } peerDependencies: postcss: ^8 postcss-place@7.0.5: - resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-preset-env@7.8.3: - resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-pseudo-class-any-link@7.1.6: - resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-reduce-initial@5.1.2: - resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-reduce-transforms@5.1.0: - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-replace-overflow-wrap@4.0.0: - resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} + resolution: + { + integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, + } peerDependencies: postcss: ^8.0.3 postcss-selector-not@6.0.1: - resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} - engines: {node: ^12 || ^14 || >=16} + resolution: + { + integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==, + } + engines: { node: ^12 || ^14 || >=16 } peerDependencies: postcss: ^8.2 postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, + } + engines: { node: '>=4' } postcss-selector-parser@7.1.0: - resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==, + } + engines: { node: '>=4' } postcss-svgo@5.1.0: - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-unique-selectors@5.1.1: - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } postcss@7.0.39: - resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==, + } + engines: { node: '>=6.0.0' } postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, + } + engines: { node: ^10 || ^12 || >=14 } postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, + } + engines: { node: ^10 || ^12 || >=14 } prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, + } + engines: { node: '>= 0.8.0' } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: '>= 0.8.0' } prettier-plugin-organize-imports@3.2.4: - resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} + resolution: + { + integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==, + } peerDependencies: '@volar/vue-language-plugin-pug': ^1.0.4 '@volar/vue-typescript': ^1.0.4 @@ -7862,137 +12709,228 @@ packages: optional: true prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, + } + engines: { node: '>=10.13.0' } hasBin: true prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, + } + engines: { node: '>=14' } hasBin: true pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, + } + engines: { node: '>=6' } pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + resolution: + { + integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==, + } pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { + integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, + } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } pretty-format@28.1.3: - resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + resolution: + { + integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==, + } + engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + resolution: + { + integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, + } + engines: { node: '>= 0.6.0' } promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + resolution: + { + integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==, + } prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: '>= 6' } prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + resolution: + { + integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, + } property-expr@2.0.6: - resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + resolution: + { + integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==, + } proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: '>= 0.10' } proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + resolution: + { + integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, + } psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + resolution: + { + integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==, + } public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + resolution: + { + integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==, + } - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: '>=6' } q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - deprecated: |- - You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, + } + engines: { node: '>=0.6' } qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==, + } + engines: { node: '>=0.6' } quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + resolution: + { + integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==, + } querystring@0.2.1: resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + resolution: + { + integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, + } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, + } + engines: { node: '>=8' } quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, + } + engines: { node: '>=10' } raf@3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + resolution: + { + integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, + } randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + resolution: + { + integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==, + } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: '>= 0.6' } raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: '>= 0.8' } react-app-polyfill@3.0.0: - resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==, + } + engines: { node: '>=14' } react-copy-to-clipboard@5.1.0: - resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} + resolution: + { + integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==, + } peerDependencies: react: ^15.3.0 || 16 || 17 || 18 react-dev-utils@12.0.1: - resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==, + } + engines: { node: '>=14' } peerDependencies: typescript: '>=2.7' webpack: '>=4' @@ -8001,33 +12939,57 @@ packages: optional: true react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + resolution: + { + integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, + } peerDependencies: react: ^18.3.1 react-error-overlay@6.1.0: - resolution: {integrity: sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==} + resolution: + { + integrity: sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==, + } react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + resolution: + { + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, + } react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + resolution: + { + integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, + } react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + resolution: + { + integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, + } react-refresh@0.11.0: - resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==, + } + engines: { node: '>=0.10.0' } react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==, + } + engines: { node: '>=0.10.0' } react-scripts@5.0.1: - resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==, + } + engines: { node: '>=14.0.0' } hasBin: true peerDependencies: eslint: '*' @@ -8038,146 +13000,260 @@ packages: optional: true react-spinners@0.14.1: - resolution: {integrity: sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag==} + resolution: + { + integrity: sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag==, + } peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, + } + engines: { node: '>=0.10.0' } read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, + } + engines: { node: '>=4' } read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, + } + engines: { node: '>=8' } read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, + } + engines: { node: '>=4' } read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, + } + engines: { node: '>=8' } read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==, + } + engines: { node: '>=6' } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: '>= 6' } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: '>=8.10.0' } rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==, + } + engines: { node: '>= 10.13.0' } recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, + } + engines: { node: '>=6.0.0' } redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, + } + engines: { node: '>=8' } reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==, + } + engines: { node: '>=6' } reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, + } + engines: { node: '>= 0.4' } regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==, + } + engines: { node: '>=4' } regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + resolution: + { + integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, + } regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + resolution: + { + integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, + } regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + resolution: + { + integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, + } regex-parser@2.3.1: - resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} + resolution: + { + integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==, + } regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, + } + engines: { node: '>= 0.4' } regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==, + } + engines: { node: '>=4' } regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + resolution: + { + integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==, + } regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + resolution: + { + integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==, + } hasBin: true relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, + } + engines: { node: '>= 0.10' } renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + resolution: + { + integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==, + } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: '>=0.10.0' } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: '>=0.10.0' } requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolution: + { + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + } resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolution: + { + integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, + } resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, + } + engines: { node: '>=8' } resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, + } + engines: { node: '>=0.10.0' } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: '>=4' } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + } + engines: { node: '>=8' } resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } resolve-url-loader@4.0.0: - resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} - engines: {node: '>=8.9'} + resolution: + { + integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==, + } + engines: { node: '>=8.9' } peerDependencies: rework: 1.0.1 rework-visit: 1.0.0 @@ -8188,105 +13264,175 @@ packages: optional: true resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==, + } + engines: { node: '>=10' } resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, + } + engines: { node: '>= 0.4' } hasBin: true resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + resolution: + { + integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, + } hasBin: true responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + resolution: + { + integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==, + } restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: '>=8' } retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, + } + engines: { node: '>= 4' } reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { + integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, + } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + resolution: + { + integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==, + } hasBin: true ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + resolution: + { + integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, + } rollup-plugin-terser@7.0.2: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: rollup: ^2.0.0 rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==, + } + engines: { node: '>=10.0.0' } hasBin: true rollup@4.37.0: - resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==, + } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true rpc-websockets@9.1.1: - resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} + resolution: + { + integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==, + } run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==, + } + engines: { node: '>=18' } run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, + } + engines: { node: '>=0.12.0' } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + resolution: + { + integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, + } safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, + } + engines: { node: '>=0.4' } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, + } + engines: { node: '>= 0.4' } safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, + } + engines: { node: '>= 0.4' } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } sanitize.css@13.0.0: - resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} + resolution: + { + integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==, + } sass-loader@12.6.0: - resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==, + } + engines: { node: '>= 12.13.0' } peerDependencies: fibers: '>= 3.1.0' node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -8304,418 +13450,732 @@ packages: optional: true sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + resolution: + { + integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, + } saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==, + } + engines: { node: '>=10' } scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + resolution: + { + integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, + } schema-utils@2.7.0: - resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} - engines: {node: '>= 8.9.0'} + resolution: + { + integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==, + } + engines: { node: '>= 8.9.0' } schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} + resolution: + { + integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==, + } + engines: { node: '>= 8.9.0' } schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, + } + engines: { node: '>= 10.13.0' } schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==, + } + engines: { node: '>= 10.13.0' } schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==, + } + engines: { node: '>= 10.13.0' } scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + resolution: + { + integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==, + } secp256k1@5.0.1: - resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==, + } + engines: { node: '>=18.0.0' } select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + resolution: + { + integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==, + } selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + } + engines: { node: '>=10' } semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + resolution: + { + integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, + } hasBin: true semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } hasBin: true semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, + } + engines: { node: '>=10' } hasBin: true semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==, + } + engines: { node: '>=10' } hasBin: true send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, + } + engines: { node: '>= 0.8.0' } serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + resolution: + { + integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, + } serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + resolution: + { + integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, + } serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==, + } + engines: { node: '>= 0.8.0' } serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, + } + engines: { node: '>= 0.8.0' } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: '>= 0.4' } set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: '>= 0.4' } set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, + } + engines: { node: '>= 0.4' } setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + resolution: + { + integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==, + } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + resolution: + { + integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, + } hasBin: true shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - sharp@0.34.3: - resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} + resolution: + { + integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, + } + engines: { node: '>=8' } + + sharp@0.34.2: + resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, + } + engines: { node: '>=0.10.0' } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: '>=8' } shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, + } + engines: { node: '>=0.10.0' } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: '>=8' } shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==, + } + engines: { node: '>= 0.4' } shiki@0.14.7: - resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + resolution: + { + integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==, + } side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: '>= 0.4' } side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: '>= 0.4' } side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: '>= 0.4' } side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: '>= 0.4' } siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: '>=14' } simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } siwe@3.0.0: - resolution: {integrity: sha512-P2/ry7dHYJA6JJ5+veS//Gn2XDwNb3JMvuD6xiXX8L/PJ1SNVD4a3a8xqEbmANx+7kNQcD8YAh1B9bNKKvRy/g==} + resolution: + { + integrity: sha512-P2/ry7dHYJA6JJ5+veS//Gn2XDwNb3JMvuD6xiXX8L/PJ1SNVD4a3a8xqEbmANx+7kNQcD8YAh1B9bNKKvRy/g==, + } peerDependencies: ethers: ^5.6.8 || ^6.0.8 slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: '>=8' } slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==, + } + engines: { node: '>=12' } sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + resolution: + { + integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==, + } sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + resolution: + { + integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==, + } sort-package-json@2.15.1: - resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} + resolution: + { + integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==, + } hasBin: true source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + resolution: + { + integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==, + } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: '>=0.10.0' } source-map-loader@3.0.2: - resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==, + } + engines: { node: '>= 12.13.0' } peerDependencies: webpack: ^5.0.0 source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: '>=0.10.0' } source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: '>= 8' } source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + resolution: + { + integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==, + } spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + resolution: + { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + resolution: + { + integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==, + } spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + resolution: + { + integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==, + } spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==, + } + engines: { node: '>=6.0.0' } split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + resolution: + { + integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, + } split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + resolution: + { + integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, + } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + resolution: + { + integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==, + } stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, + } + engines: { node: '>=10' } stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + resolution: + { + integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==, + } standard-version@9.5.0: - resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==, + } + engines: { node: '>=10' } hasBin: true static-eval@2.0.2: - resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + resolution: + { + integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==, + } statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, + } + engines: { node: '>= 0.6' } statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: '>= 0.8' } std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + resolution: + { + integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==, + } std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + resolution: + { + integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, + } stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==, + } + engines: { node: '>= 0.4' } stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + resolution: + { + integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==, + } stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + resolution: + { + integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==, + } streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, + } + engines: { node: '>=10.0.0' } string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + resolution: + { + integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==, + } string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, + } + engines: { node: '>=10' } string-length@5.0.1: - resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} - engines: {node: '>=12.20'} + resolution: + { + integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==, + } + engines: { node: '>=12.20' } string-natural-compare@3.0.1: - resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} + resolution: + { + integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==, + } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: '>=8' } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: '>=12' } string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==, + } + engines: { node: '>= 0.4' } string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==, + } + engines: { node: '>= 0.4' } string.prototype.padend@3.1.6: - resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==, + } + engines: { node: '>= 0.4' } string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + resolution: + { + integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, + } string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, + } + engines: { node: '>= 0.4' } string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, + } + engines: { node: '>= 0.4' } string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: '>= 0.4' } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, + } + engines: { node: '>=4' } stringify-package@1.0.1: resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} - deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: '>=8' } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: '>=12' } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: '>=4' } strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, + } + engines: { node: '>=8' } strip-comments@2.0.1: - resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==, + } + engines: { node: '>=10' } strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: '>=6' } strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, + } + engines: { node: '>=8' } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: '>=8' } strip-outer@1.0.1: - resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==, + } + engines: { node: '>=0.10.0' } style-loader@3.3.4: - resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==, + } + engines: { node: '>= 12.13.0' } peerDependencies: webpack: ^5.0.0 styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==, + } + engines: { node: '>= 12.0.0' } peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' @@ -8727,93 +14187,152 @@ packages: optional: true stylehacks@5.1.1: - resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} - engines: {node: ^10 || ^12 || >=14.0} + resolution: + { + integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==, + } + engines: { node: ^10 || ^12 || >=14.0 } peerDependencies: postcss: ^8.2.15 sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { + integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, + } + engines: { node: '>=16 || 14 >=14.17' } hasBin: true superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==, + } + engines: { node: '>=14.0.0' } supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: '>=4' } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: '>=8' } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: '>=10' } supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, + } + engines: { node: '>=8' } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: '>= 0.4' } svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + resolution: + { + integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==, + } svgo@1.3.2: resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} engines: {node: '>=4.0.0'} - deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. hasBin: true svgo@2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, + } + engines: { node: '>=10.13.0' } hasBin: true symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + resolution: + { + integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, + } table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==, + } + engines: { node: '>=8.0.0' } tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==, + } + engines: { node: '>=14.0.0' } hasBin: true tapable@1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==, + } + engines: { node: '>=6' } tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + } + engines: { node: '>=6' } temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, + } + engines: { node: '>=8' } tempy@0.6.0: - resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==, + } + engines: { node: '>=10' } term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==, + } + engines: { node: '>=8' } terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==, + } + engines: { node: '>=8' } terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==, + } + engines: { node: '>= 10.13.0' } peerDependencies: '@swc/core': '*' esbuild: '*' @@ -8828,157 +14347,277 @@ packages: optional: true terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==, + } + engines: { node: '>=10' } hasBin: true test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, + } + engines: { node: '>=8' } test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==, + } + engines: { node: '>=18' } text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + resolution: + { + integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==, + } text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, + } + engines: { node: '>=0.10' } text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: '>=0.8' } thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } - thingies@2.5.0: - resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 throat@6.0.2: - resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + resolution: + { + integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==, + } through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + resolution: + { + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, + } through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + resolution: + { + integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, + } through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + resolution: + { + integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, + } thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + resolution: + { + integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==, + } tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, + } + engines: { node: '>=12.0.0' } tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==, + } + engines: { node: ^18.0.0 || >=20.0.0 } tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, + } + engines: { node: '>=14.0.0' } tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==, + } + engines: { node: '>=14.0.0' } tmp-promise@3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + resolution: + { + integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==, + } tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + resolution: + { + integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, + } + engines: { node: '>=0.6.0' } tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} + resolution: + { + integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==, + } + engines: { node: '>=14.14' } tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + resolution: + { + integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, + } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: '>=8.0' } toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + resolution: + { + integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==, + } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: '>=0.6' } toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + resolution: + { + integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==, + } tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==, + } + engines: { node: '>=6' } tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + resolution: + { + integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, + } tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + resolution: + { + integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, + } tr46@2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==, + } + engines: { node: '>=8' } tree-dump@1.0.3: - resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} - engines: {node: '>=10.0'} + resolution: + { + integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==, + } + engines: { node: '>=10.0' } peerDependencies: tslib: '2' trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, + } + engines: { node: '>=8' } trim-repeated@1.0.0: - resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==, + } + engines: { node: '>=0.10.0' } tryer@1.0.1: - resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + resolution: + { + integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==, + } ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==, + } + engines: { node: '>=16' } peerDependencies: typescript: '>=4.2.0' ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + resolution: + { + integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==, + } hasBin: true ts-essentials@7.0.3: - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + resolution: + { + integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==, + } peerDependencies: typescript: '>=3.7.0' ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + resolution: + { + integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==, + } hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -8992,259 +14631,471 @@ packages: optional: true ts-unused-exports@10.1.0: - resolution: {integrity: sha512-QA11Dpwkm5Apfe9s/UkFzHEpbiBxKy0VQ72YRAoqq9VgNbxvvIOcS5Kgm1MCitOec9YU6nf51DEWnmL6jkP2Yg==} + resolution: + { + integrity: sha512-QA11Dpwkm5Apfe9s/UkFzHEpbiBxKy0VQ72YRAoqq9VgNbxvvIOcS5Kgm1MCitOec9YU6nf51DEWnmL6jkP2Yg==, + } hasBin: true peerDependencies: typescript: '>=3.8.3' tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + resolution: + { + integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, + } tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + resolution: + { + integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, + } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, + } + 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' + 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' tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + resolution: + { + integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==, + } type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, + } + engines: { node: '>= 0.8.0' } type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: '>= 0.8.0' } type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, + } + engines: { node: '>=4' } type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, + } + engines: { node: '>=10' } type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, + } + engines: { node: '>=10' } type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: '>=10' } type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, + } + engines: { node: '>=10' } type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, + } + engines: { node: '>=8' } type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, + } + engines: { node: '>=8' } type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: '>= 0.6' } typechain@8.3.2: - resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + resolution: + { + integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==, + } hasBin: true peerDependencies: typescript: '>=4.3.0' typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, + } + engines: { node: '>= 0.4' } typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, + } + engines: { node: '>= 0.4' } typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, + } + engines: { node: '>= 0.4' } typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, + } + engines: { node: '>= 0.4' } typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + resolution: + { + integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==, + } typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + resolution: + { + integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, + } typedoc-plugin-coverage@2.2.0: - resolution: {integrity: sha512-/hq9nwSNBz2p7+VYfljT/zFSmaxN8tlfcIp6CCAaQN6VIxXCciYFIqR+pcckRhjmfHIeSJ5uy2OpCt5F683npA==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-/hq9nwSNBz2p7+VYfljT/zFSmaxN8tlfcIp6CCAaQN6VIxXCciYFIqR+pcckRhjmfHIeSJ5uy2OpCt5F683npA==, + } + engines: { node: '>= 16' } peerDependencies: typedoc: ^0.22.12 || 0.23.x || 0.24.x || 0.25.x typedoc-plugin-missing-exports@2.3.0: - resolution: {integrity: sha512-iI9ITNNLlbsLCBBeYDyu0Qqp3GN/9AGyWNKg8bctRXuZEPT7G1L+0+MNWG9MsHcf/BFmNbXL0nQ8mC/tXRicog==} + resolution: + { + integrity: sha512-iI9ITNNLlbsLCBBeYDyu0Qqp3GN/9AGyWNKg8bctRXuZEPT7G1L+0+MNWG9MsHcf/BFmNbXL0nQ8mC/tXRicog==, + } peerDependencies: typedoc: 0.24.x || 0.25.x typedoc-plugin-zod@1.4.0: - resolution: {integrity: sha512-Mr4hoEfjIR1xjp0RqtEyfba03NDUE4jLvgErg0VQz9L60eCVLcUrV0x+71+B7rykDMexrTx0I9Yk6SS0PuSbKw==} + resolution: + { + integrity: sha512-Mr4hoEfjIR1xjp0RqtEyfba03NDUE4jLvgErg0VQz9L60eCVLcUrV0x+71+B7rykDMexrTx0I9Yk6SS0PuSbKw==, + } peerDependencies: typedoc: 0.23.x || 0.24.x || 0.25.x || 0.26.x || 0.27.x || 0.28.x typedoc@0.25.13: - resolution: {integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==} - engines: {node: '>= 16'} + resolution: + { + integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==, + } + engines: { node: '>= 16' } hasBin: true peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x + typescript: + 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || + 5.4.x typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + resolution: + { + integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, + } + engines: { node: '>=4.2.0' } hasBin: true typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, + } + engines: { node: '>=14.17' } hasBin: true typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==, + } + engines: { node: '>=14.17' } hasBin: true typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==, + } + engines: { node: '>=8' } typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==, + } + engines: { node: '>=8' } uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==, + } + engines: { node: '>=0.8.0' } hasBin: true unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, + } + engines: { node: '>= 0.4' } underscore@1.12.1: resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==, + } + engines: { node: '>=4' } unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, + } + engines: { node: '>=4' } unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==, + } + engines: { node: '>=4' } unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, + } + engines: { node: '>=4' } unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, + } + engines: { node: '>=8' } universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, + } + engines: { node: '>= 4.0.0' } universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, + } + engines: { node: '>= 4.0.0' } universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: '>= 10.0.0' } unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: '>= 0.8' } unquote@1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + resolution: + { + integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==, + } unrs-resolver@1.3.2: - resolution: {integrity: sha512-ZKQBC351Ubw0PY8xWhneIfb6dygTQeUHtCcNGd0QB618zabD/WbFMYdRyJ7xeVT+6G82K5v/oyZO0QSHFtbIuw==} + resolution: + { + integrity: sha512-ZKQBC351Ubw0PY8xWhneIfb6dygTQeUHtCcNGd0QB618zabD/WbFMYdRyJ7xeVT+6G82K5v/oyZO0QSHFtbIuw==, + } upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, + } + engines: { node: '>=4' } update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + resolution: + { + integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, + } hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + resolution: + { + integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, + } utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} + resolution: + { + integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==, + } + engines: { node: '>=6.14.2' } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } util.promisify@1.0.1: - resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} + resolution: + { + integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==, + } utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + resolution: + { + integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==, + } utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: '>= 0.4.0' } uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } hasBin: true v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + resolution: + { + integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, + } v8-to-istanbul@8.1.1: - resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} - engines: {node: '>=10.12.0'} + resolution: + { + integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==, + } + engines: { node: '>=10.12.0' } validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: '>= 0.8' } + + viem@2.33.3: + resolution: + { + integrity: sha512-aWDr6i6r3OfNCs0h9IieHFhn7xQJJ8YsuA49+9T5JRyGGAkWhLgcbLq2YMecgwM7HdUZpx1vPugZjsShqNi7Gw==, + } + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.33.3: + resolution: {integrity: sha512-aWDr6i6r3OfNCs0h9IieHFhn7xQJJ8YsuA49+9T5JRyGGAkWhLgcbLq2YMecgwM7HdUZpx1vPugZjsShqNi7Gw==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true vite-node@3.0.9: - resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { + integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true vite@6.2.3: - resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { + integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true peerDependencies: '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 @@ -9283,8 +15134,11 @@ packages: optional: true vitest@3.0.9: - resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { + integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true peerDependencies: '@edge-runtime/vm': '*' @@ -9311,55 +15165,96 @@ packages: optional: true vlq@2.0.4: - resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==} + resolution: + { + integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==, + } vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + resolution: + { + integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==, + } vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + resolution: + { + integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==, + } vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + resolution: + { + integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==, + } w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. w3c-xmlserializer@2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==, + } + engines: { node: '>=10' } walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + resolution: + { + integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, + } watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==, + } + engines: { node: '>=10.13.0' } wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + resolution: + { + integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==, + } wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + resolution: + { + integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, + } webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + resolution: + { + integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, + } webidl-conversions@5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==, + } + engines: { node: '>=8' } webidl-conversions@6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} + resolution: + { + integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==, + } + engines: { node: '>=10.4' } webpack-cli@6.0.1: - resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} - engines: {node: '>=18.12.0'} + resolution: + { + integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==, + } + engines: { node: '>=18.12.0' } hasBin: true peerDependencies: webpack: ^5.82.0 @@ -9372,14 +15267,20 @@ packages: optional: true webpack-dev-middleware@5.3.4: - resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==, + } + engines: { node: '>= 12.13.0' } peerDependencies: webpack: ^4.0.0 || ^5.0.0 webpack-dev-middleware@7.4.2: - resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==, + } + engines: { node: '>= 18.12.0' } peerDependencies: webpack: ^5.0.0 peerDependenciesMeta: @@ -9387,8 +15288,11 @@ packages: optional: true webpack-dev-server@4.15.2: - resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==, + } + engines: { node: '>= 12.13.0' } hasBin: true peerDependencies: webpack: ^4.37.0 || ^5.0.0 @@ -9400,8 +15304,11 @@ packages: optional: true webpack-dev-server@5.2.2: - resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==, + } + engines: { node: '>= 18.12.0' } hasBin: true peerDependencies: webpack: ^5.0.0 @@ -9413,28 +15320,40 @@ packages: optional: true webpack-manifest-plugin@4.1.1: - resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} - engines: {node: '>=12.22.0'} + resolution: + { + integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==, + } + engines: { node: '>=12.22.0' } peerDependencies: webpack: ^4.44.2 || ^5.47.0 webpack-merge@6.0.1: - resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} - engines: {node: '>=18.0.0'} + resolution: + { + integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==, + } + engines: { node: '>=18.0.0' } webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + resolution: + { + integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==, + } webpack-sources@2.3.1: - resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} - engines: {node: '>=10.13.0'} - - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + resolution: + { + integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==, + } + engines: { node: '>=10.13.0' } + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.101.3: - resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} + webpack@5.99.9: + resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -9444,157 +15363,278 @@ packages: optional: true websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, + } + engines: { node: '>=0.8.0' } websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, + } + engines: { node: '>=0.8.0' } whatwg-encoding@1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + resolution: + { + integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==, + } whatwg-fetch@3.6.20: - resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + resolution: + { + integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==, + } whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + resolution: + { + integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==, + } whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + resolution: + { + integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, + } whatwg-url@6.5.0: - resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + resolution: + { + integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==, + } whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + resolution: + { + integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, + } whatwg-url@8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==, + } + engines: { node: '>=10' } which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, + } + engines: { node: '>= 0.4' } which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, + } + engines: { node: '>= 0.4' } which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, + } + engines: { node: '>= 0.4' } which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==, + } + engines: { node: '>= 0.4' } which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + resolution: + { + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, + } hasBin: true which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: '>= 8' } hasBin: true why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: '>=8' } hasBin: true wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + resolution: + { + integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==, + } word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: '>=0.10.0' } wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + resolution: + { + integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, + } wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==, + } + engines: { node: '>=8.0.0' } workbox-background-sync@6.6.0: - resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} + resolution: + { + integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==, + } workbox-broadcast-update@6.6.0: - resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} + resolution: + { + integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==, + } workbox-build@6.6.0: - resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==, + } + engines: { node: '>=10.0.0' } workbox-cacheable-response@6.6.0: resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} - deprecated: workbox-background-sync@6.6.0 workbox-core@6.6.0: - resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} + resolution: + { + integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==, + } workbox-expiration@6.6.0: - resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} + resolution: + { + integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==, + } workbox-google-analytics@6.6.0: resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} - deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained workbox-navigation-preload@6.6.0: - resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} + resolution: + { + integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==, + } workbox-precaching@6.6.0: - resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} + resolution: + { + integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==, + } workbox-range-requests@6.6.0: - resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} + resolution: + { + integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==, + } workbox-recipes@6.6.0: - resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} + resolution: + { + integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==, + } workbox-routing@6.6.0: - resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} + resolution: + { + integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==, + } workbox-strategies@6.6.0: - resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} + resolution: + { + integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==, + } workbox-streams@6.6.0: - resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} + resolution: + { + integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==, + } workbox-sw@6.6.0: - resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} + resolution: + { + integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==, + } workbox-webpack-plugin@6.6.0: - resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==, + } + engines: { node: '>=10.0.0' } peerDependencies: webpack: ^4.4.0 || ^5.9.0 workbox-window@6.6.0: - resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + resolution: + { + integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==, + } wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, + } + engines: { node: '>=8' } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: '>=10' } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: '>=12' } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + resolution: + { + integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==, + } ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} + resolution: + { + integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==, + } + engines: { node: '>=8.3.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -9605,8 +15645,11 @@ packages: optional: true ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, + } + engines: { node: '>=10.0.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -9617,8 +15660,11 @@ packages: optional: true ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==, + } + engines: { node: '>=10.0.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -9628,64 +15674,131 @@ packages: utf-8-validate: optional: true - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} + ws@8.18.2: + resolution: + { + integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==, + } + 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 + + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + 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 xml-name-validator@3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + resolution: + { + integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==, + } xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + resolution: + { + integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, + } xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: '>=0.4' } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: '>=10' } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, + } + engines: { node: '>= 6' } yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==, + } + engines: { node: '>= 14' } hasBin: true yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, + } + engines: { node: '>=10' } yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, + } + engines: { node: '>=10' } yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, + } + engines: { node: '>=6' } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: '>=10' } yup@0.32.11: - resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==, + } + engines: { node: '>=10' } zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + resolution: + { + integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==, + } snapshots: + '@adraffy/ens-normalize@1.11.0': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -11991,14 +18104,22 @@ snapshots: dependencies: eslint-scope: 5.1.1 + '@noble/ciphers@1.3.0': {} + '@noble/curves@1.8.1': dependencies: '@noble/hashes': 1.7.1 + '@noble/curves@1.9.2': + dependencies: + '@noble/hashes': 1.8.0 + '@noble/ed25519@1.7.3': {} '@noble/hashes@1.7.1': {} + '@noble/hashes@1.8.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -12037,7 +18158,7 @@ snapshots: dependencies: '@ethersproject/abstract-signer': 5.8.0 '@nucypher/shared': 0.5.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - siwe: 3.0.0(ethers@5.8.0) + siwe: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) zod: 3.24.2 transitivePeerDependencies: - bufferutil @@ -12072,12 +18193,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: type-fest: 0.21.3 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - '@pmmmwh/react-refresh-webpack-plugin@0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1))': + '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: anser: 2.3.2 core-js-pure: 3.41.0 @@ -12199,17 +18320,30 @@ snapshots: '@scure/base@1.2.4': {} + '@scure/base@1.2.6': {} + '@scure/bip32@1.6.2': dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/base': 1.2.4 + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@scure/bip39@1.5.4': dependencies: '@noble/hashes': 1.7.1 '@scure/base': 1.2.4 + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@sinclair/typebox@0.24.51': {} '@sindresorhus/is@4.6.0': {} @@ -12910,7 +19044,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -12925,7 +19059,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -13045,17 +19179,17 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1))': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1))': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1))': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) @@ -13073,6 +19207,11 @@ snapshots: abab@2.0.6: {} + abitype@1.0.8(typescript@5.8.2)(zod@3.24.2): + optionalDependencies: + typescript: 5.8.2 + zod: 3.24.2 + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -13450,7 +19589,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) babel-plugin-istanbul@6.1.1: dependencies: @@ -14199,7 +20338,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.1(webpack@5.101.3(webpack-cli@6.0.1)): + copy-webpack-plugin@13.0.0(webpack@5.99.9): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 @@ -14347,7 +20486,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) css-minimizer-webpack-plugin@3.4.1(webpack@5.101.3): dependencies: @@ -14357,7 +20496,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) css-prefers-color-scheme@6.0.3(postcss@8.5.3): dependencies: @@ -14928,7 +21067,7 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.101.3(webpack-cli@6.0.1)): + esbuild-loader@2.21.0(webpack@5.99.9): dependencies: esbuild: 0.16.17 joycon: 3.1.1 @@ -15052,7 +21191,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -15071,7 +21210,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -15137,7 +21276,7 @@ snapshots: tinyglobby: 0.2.12 unrs-resolver: 1.3.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -15151,24 +21290,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -15225,36 +21354,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - 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: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) - 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 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -15265,7 +21365,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15459,7 +21559,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.0 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) eslint@8.57.0: dependencies: @@ -15763,17 +21863,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.101.3(webpack-cli@6.0.1)): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.101.3(webpack-cli@6.0.1) - - file-loader@6.2.0(webpack@5.101.3): + file-loader@6.2.0(webpack@5.99.9): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) file-uri-to-path@1.0.0: {} @@ -15886,7 +21980,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.8.2 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: eslint: 8.57.1 @@ -16273,17 +22367,7 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-webpack-plugin@5.6.3(webpack@5.101.3(webpack-cli@6.0.1)): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - optionalDependencies: - webpack: 5.101.3(webpack-cli@6.0.1) - - html-webpack-plugin@5.6.3(webpack@5.101.3): + html-webpack-plugin@5.6.3(webpack@5.99.9): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16291,7 +22375,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) htmlparser2@6.1.0: dependencies: @@ -16699,6 +22783,10 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + istanbul-lib-coverage@3.2.2: {} istanbul-lib-instrument@5.2.1: @@ -17589,7 +23677,7 @@ snapshots: dependencies: schema-utils: 4.3.0 tapable: 2.2.1 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} @@ -17920,6 +24008,21 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + ox@0.8.6(typescript@5.8.2)(zod@3.24.2): + dependencies: + '@adraffy/ens-normalize': 1.11.0 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - zod + p-cancelable@2.1.1: {} p-filter@2.1.0: @@ -18254,7 +24357,7 @@ snapshots: klona: 2.0.6 postcss: 8.5.3 semver: 7.7.1 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) postcss-logical@5.0.4(postcss@8.5.3): dependencies: @@ -18696,7 +24799,7 @@ snapshots: shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -18764,14 +24867,14 @@ snapshots: resolve-url-loader: 4.0.0 sass-loader: 12.6.0(webpack@5.101.3) semver: 7.7.1 - source-map-loader: 3.0.2(webpack@5.101.3) - style-loader: 3.3.4(webpack@5.101.3) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - terser-webpack-plugin: 5.3.14(webpack@5.101.3) - webpack: 5.101.3 - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - webpack-manifest-plugin: 4.1.1(webpack@5.101.3) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.101.3) + source-map-loader: 3.0.2(webpack@5.99.9) + style-loader: 3.3.4(webpack@5.99.9) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) + terser-webpack-plugin: 5.3.14(webpack@5.99.9) + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) + webpack-manifest-plugin: 4.1.1(webpack@5.99.9) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) optionalDependencies: fsevents: 2.3.3 typescript: 5.8.2 @@ -19114,7 +25217,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) sax@1.2.4: {} @@ -19356,7 +25459,7 @@ snapshots: sisteransi@1.0.5: {} - siwe@3.0.0(ethers@5.8.0): + siwe@3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@spruceid/siwe-parser': 3.0.0 '@stablelib/random': 1.0.2 @@ -19394,7 +25497,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) source-map-support@0.5.21: dependencies: @@ -19645,7 +25748,7 @@ snapshots: style-loader@3.3.4(webpack@5.101.3): dependencies: - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) styled-jsx@5.1.6(react@18.3.1): dependencies: @@ -19773,23 +25876,14 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.101.3(webpack-cli@6.0.1)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.0 - serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.101.3(webpack-cli@6.0.1) - - terser-webpack-plugin@5.3.14(webpack@5.101.3): + terser-webpack-plugin@5.3.14(webpack@5.99.9): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) terser@5.39.0: dependencies: @@ -20195,13 +26289,42 @@ snapshots: vary@1.1.2: {} - vite-node@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + viem@2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2): + dependencies: + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.8.6(typescript@5.8.2)(zod@3.24.2) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-node@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-node@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -20216,7 +26339,7 @@ snapshots: - tsx - yaml - vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite@6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -20228,7 +26351,19 @@ snapshots: terser: 5.39.0 yaml: 2.7.0 - vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): + vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.37.0 + optionalDependencies: + '@types/node': 22.13.14 + fsevents: 2.3.3 + jiti: 2.4.2 + terser: 5.39.0 + yaml: 2.7.0 + + vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -20251,7 +26386,46 @@ snapshots: vite-node: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 20.17.28 + jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + dependencies: + '@vitest/expect': 3.0.9 + '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/pretty-format': 3.0.9 + '@vitest/runner': 3.0.9 + '@vitest/snapshot': 3.0.9 + '@vitest/spy': 3.0.9 + '@vitest/utils': 3.0.9 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.0 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.8.1 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.13.14 jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti @@ -20311,9 +26485,9 @@ snapshots: webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1)) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1)) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.101.3))(webpack@5.101.3(webpack-cli@6.0.1)) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -20334,9 +26508,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.0 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) - webpack-dev-middleware@7.4.2(webpack@5.101.3(webpack-cli@6.0.1)): + webpack-dev-middleware@7.4.2(webpack@5.99.9): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -20380,7 +26554,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) transitivePeerDependencies: - bufferutil - debug @@ -20415,7 +26589,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.101.3(webpack-cli@6.0.1)) + webpack-dev-middleware: 7.4.2(webpack@5.99.9) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1) @@ -20429,7 +26603,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.101.3): dependencies: tapable: 2.2.1 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 2.3.1 webpack-merge@6.0.1: @@ -20450,48 +26624,15 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.101.3: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.24.4 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.6.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.101.3) - watchpack: 2.4.2 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.101.3(webpack-cli@6.0.1): + webpack@5.99.9(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) + acorn: 8.14.1 browserslist: 4.24.4 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 @@ -20506,9 +26647,9 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.101.3(webpack-cli@6.0.1)) + terser-webpack-plugin: 5.3.14(webpack@5.99.9) watchpack: 2.4.2 - webpack-sources: 3.3.3 + webpack-sources: 3.2.3 optionalDependencies: webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) transitivePeerDependencies: @@ -20733,7 +26874,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.101.3 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -20787,9 +26928,10 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - wsl-utils@0.1.0: - dependencies: - is-wsl: 3.1.0 + ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 xml-name-validator@3.0.0: {} From 692186031268d1ff7926fcebe96aef466e742ac5 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 13 Aug 2025 21:42:47 +0200 Subject: [PATCH 02/97] fix: resolve lint issues for CI/CD pipeline - Added eslint disable comments for necessary any types in dynamic viem type declarations - Fixed import order in examples and tests - Added file-level eslint disables for complex wrapper implementations - Resolved all lint errors while maintaining functionality --- examples/pre/nextjs/next-env.d.ts | 2 +- .../src/providers/viem/viem-auth-providers.ts | 4 +- .../src/providers/viem/viem-wrappers.ts | 17 ++ packages/taco/package.json | 14 +- .../taco/src/examples/viem-auth-example.ts | 81 +++++++ packages/taco/src/examples/viem-usage.ts | 213 ++++++++++++++++++ packages/taco/src/viem-taco.ts | 3 +- packages/taco/src/wrappers/viem-wrappers.ts | 2 + packages/taco/test/viem-unit.test.ts | 6 +- packages/taco/test/viem-wrappers.test.ts | 1 + 10 files changed, 331 insertions(+), 12 deletions(-) create mode 100644 packages/taco/src/examples/viem-auth-example.ts create mode 100644 packages/taco/src/examples/viem-usage.ts diff --git a/examples/pre/nextjs/next-env.d.ts b/examples/pre/nextjs/next-env.d.ts index 40c3d6809..1b3be0840 100644 --- a/examples/pre/nextjs/next-env.d.ts +++ b/examples/pre/nextjs/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts index 9c5bca591..a36cf69ff 100644 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -2,8 +2,10 @@ import { EIP4361AuthProvider, EIP4361AuthProviderParams } from '../eip4361/eip43 import { createEthersProvider, createEthersSigner } from './viem-wrappers'; -// Dynamic viem types (available only when viem is installed) +// Dynamic viem types (available only when viem is installed) +// eslint-disable-next-line @typescript-eslint/no-explicit-any type Account = any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any type PublicClient = any; /** diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts index 6a090a22e..22104e5e9 100644 --- a/packages/taco-auth/src/providers/viem/viem-wrappers.ts +++ b/packages/taco-auth/src/providers/viem/viem-wrappers.ts @@ -1,7 +1,9 @@ import { ethers } from 'ethers'; // Dynamic viem types (available only when viem is installed) +// eslint-disable-next-line @typescript-eslint/no-explicit-any type Account = any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any type PublicClient = any; /** @@ -52,21 +54,30 @@ class ViemAuthProvider { } // Stub methods for ethers compatibility (not used by EIP4361AuthProvider) + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getBlockNumber(): Promise { return 0; } async getGasPrice(): Promise { return ethers.BigNumber.from(0); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getFeeData(): Promise { return null; } async getBalance(): Promise { return ethers.BigNumber.from(0); } async getTransactionCount(): Promise { return 0; } async getCode(): Promise { return '0x'; } async getStorageAt(): Promise { return '0x'; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async sendTransaction(): Promise { throw new Error('Not implemented'); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getTransaction(): Promise { return null; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getTransactionReceipt(): Promise { return null; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getLogs(): Promise { return []; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getBlock(): Promise { return null; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getBlockWithTransactions(): Promise { return null; } async resolveName(): Promise { return null; } async lookupAddress(): Promise { return null; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async waitForTransaction(): Promise { return null; } // Event emitter methods (not used by EIP4361AuthProvider) @@ -74,6 +85,7 @@ class ViemAuthProvider { off(): this { return this; } removeAllListeners(): this { return this; } listenerCount(): number { return 0; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any listeners(): any[] { return []; } emit(): boolean { return false; } } @@ -107,6 +119,7 @@ class ViemAuthSigner { return await this.viemAccount.signMessage({ message: messageToSign }); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async signTypedData(domain: any, types: any, message: any): Promise { checkViemAvailability(); return await this.viemAccount.signTypedData({ @@ -130,13 +143,17 @@ class ViemAuthSigner { async getBalance(): Promise { return ethers.BigNumber.from(0); } async getTransactionCount(): Promise { return 0; } async getGasPrice(): Promise { return ethers.BigNumber.from(0); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getFeeData(): Promise { return null; } async estimateGas(): Promise { return ethers.BigNumber.from(0); } async call(): Promise { return '0x'; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async sendTransaction(): Promise { throw new Error('Not implemented'); } async getChainId(): Promise { return (await this.provider.getNetwork()).chainId; } async resolveName(): Promise { return null; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any checkTransaction(): any { return {}; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any populateTransaction(): Promise { return Promise.resolve({}); } } diff --git a/packages/taco/package.json b/packages/taco/package.json index b3e4b49bf..2fa965ad8 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -49,6 +49,13 @@ "semver": "^7.7.1", "zod": "^3.24.2" }, + "devDependencies": { + "@nucypher/test-utils": "workspace:*", + "@types/semver": "^7.7.0", + "dotenv": "^16.5.0", + "glob": "^11.0.1", + "modified-zod2md": "0.1.5-modified.4" + }, "peerDependencies": { "viem": "^2.0.0" }, @@ -57,13 +64,6 @@ "optional": true } }, - "devDependencies": { - "@nucypher/test-utils": "workspace:*", - "@types/semver": "^7.7.0", - "dotenv": "^16.5.0", - "glob": "^11.0.1", - "modified-zod2md": "0.1.5-modified.4" - }, "engines": { "node": ">=18", "pnpm": ">=8.0.0" diff --git a/packages/taco/src/examples/viem-auth-example.ts b/packages/taco/src/examples/viem-auth-example.ts new file mode 100644 index 000000000..38fe1224a --- /dev/null +++ b/packages/taco/src/examples/viem-auth-example.ts @@ -0,0 +1,81 @@ +/** + * Example demonstrating how to use ViemEIP4361AuthProvider with viem clients + */ +import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; +import { createPublicClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; +import { polygon } from 'viem/chains'; +// Domain is a type, not a value - just use string literals for example +// import { Domain } from '@nucypher/shared'; + +async function viemAuthExample() { + // Create viem clients + const publicClient = createPublicClient({ + chain: polygon, + transport: http('https://polygon-rpc.com'), + }); + + // Create account from private key + const account = privateKeyToAccount('0x...' as `0x${string}`); + + // Create viem-compatible auth provider + const authProvider = new ViemEIP4361AuthProvider( + publicClient, + account, + { + // EIP4361AuthProviderParams only accepts domain and uri + domain: 'my-app.com', + uri: 'https://my-app.com', + } + ); + + // Get or create authentication signature + const authSignature = await authProvider.getOrCreateAuthSignature(); + console.log('Auth signature:', authSignature); + + // Use the auth provider with TACo domain (example) + const domain = 'testnet'; // or 'mainnet' - Domain is a type alias for string + + // The auth provider is now ready to be used with TACo operations + // For example, in a condition context or with custom authentication flows + + return { + authProvider, + authSignature, + domain, + }; +} + +// Export example function +export { viemAuthExample }; + +// Example of creating different types of auth providers +export async function createViemAuthProviders() { + const publicClient = createPublicClient({ + chain: polygon, + transport: http('https://polygon-rpc.com'), + }); + + const account = privateKeyToAccount('0x...' as `0x${string}`); + + // Simple auth provider (minimal configuration) + const simpleAuthProvider = new ViemEIP4361AuthProvider( + publicClient, + account + ); + + // Configured auth provider with custom options + const configuredAuthProvider = new ViemEIP4361AuthProvider( + publicClient, + account, + { + domain: 'dapp.example.com', + uri: 'https://dapp.example.com/login', + } + ); + + return { + simpleAuthProvider, + configuredAuthProvider, + }; +} diff --git a/packages/taco/src/examples/viem-usage.ts b/packages/taco/src/examples/viem-usage.ts new file mode 100644 index 000000000..979102152 --- /dev/null +++ b/packages/taco/src/examples/viem-usage.ts @@ -0,0 +1,213 @@ +/** + * Example usage of TACo SDK with viem + * + * This example demonstrates how to use the new viem-compatible functions + * for encryption and decryption with TACo. + */ + +// import { createPublicClient, createWalletClient, http } from 'viem'; +// import { polygonAmoy } from 'viem/chains'; +// import { privateKeyToAccount } from 'viem/accounts'; +// import { +// encryptWithViem, +// decryptWithViem +// } from '../index'; +// import * as conditions from '../conditions'; + +/** + * Example 1: Using viem clients directly with the new viem-compatible functions + */ +export async function exampleWithViemClients() { + // This example shows how you would use it (commented out due to viem dependency) + /* + // 1. Create viem clients (your existing setup) + const viemPublicClient = createPublicClient({ + chain: polygonAmoy, // or your main app's chain + transport: http() + }); + + const viemAccount = privateKeyToAccount('0x...'); + const viemWalletClient = createWalletClient({ + account: viemAccount, + chain: polygonAmoy, + transport: http() + }); + + // 2. Create a condition (same as before) + const condition = conditions.predefined.erc20Balance({ + contractAddress: '0x...', + standardContractType: 'ERC20', + chain: 80002, // Polygon Amoy + method: 'balanceOf', + parameters: [':userAddress'], + returnValueTest: { + comparator: '>=', + value: 1000000000000000000 // 1 token + } + }); + + // 3. Encrypt using viem (automatically handles network conversion) + const encryptedKit = await encryptWithViem( + viemPublicClient, // Your viem public client + 'lynx', // TACo domain + 'Hello, secret!', // Message to encrypt + condition, // Access condition + 27, // Ritual ID + viemAccount // Your viem account + ); + + // 4. Decrypt using viem + const decryptedMessage = await decryptWithViem( + viemPublicClient, + 'lynx', + encryptedKit + ); + + console.log('Decrypted:', new TextDecoder().decode(decryptedMessage)); + */ +} + +/** + * Example 2: Using TACo domain convenience functions (recommended for most use cases) + */ +export async function exampleWithTacoDomain() { + /* + const account = privateKeyToAccount('0x...'); + + const condition = conditions.predefined.timelock({ + returnValueTest: { + comparator: '>', + value: Math.floor(Date.now() / 1000) + 3600 // 1 hour from now + } + }); + + // Encrypt - automatically uses correct network for TACo domain + const encryptedKit = await encryptForTacoDomain( + 'lynx', // TACo domain - automatically creates Polygon Amoy provider + 'Hello, secret!', // Message + condition, // Condition + 27, // Ritual ID + account // Your account + ); + + // Decrypt - automatically uses correct network for TACo domain + const decryptedMessage = await decryptForTacoDomain( + 'lynx', + encryptedKit + ); + + console.log('Decrypted:', new TextDecoder().decode(decryptedMessage)); + */ +} + +/** + * Example 3: Browser usage with MetaMask + */ +export async function exampleWithBrowserWallet() { + /* + // In a browser environment with MetaMask + import { createWalletClient, custom } from 'viem'; + + // Connect to MetaMask + const [viemAccount] = await window.ethereum.request({ + method: 'eth_requestAccounts' + }); + + const viemWalletClient = createWalletClient({ + transport: custom(window.ethereum), + account: viemAccount + }); + + // Encrypt - user will sign through MetaMask + const encryptedKit = await encryptForTacoDomain( + 'lynx', + 'Hello from browser!', + condition, + 27, + viemWalletClient.account + ); + + // Decrypt + const decryptedMessage = await decryptForTacoDomain( + 'lynx', + encryptedKit + ); + */ +} + +/** + * Example 5: Network separation (your main app on one network, TACo on another) + */ +export async function exampleNetworkSeparation() { + /* + // Your main app might be on Ethereum mainnet + const viemMainnetClient = createPublicClient({ + chain: mainnet, + transport: http() + }); + + const viemAccount = privateKeyToAccount('0x...'); + + // But TACo operations happen on Polygon Amoy + // The encryptForTacoDomain function handles this automatically + const encryptedKit = await encryptForTacoDomain( + 'lynx', // Uses Polygon Amoy regardless of your main app's network + 'Cross-chain secret!', + condition, + 27, + viemAccount // Same account, different network for TACo ops + ); + + // This is exactly what your TacoEncryption class does! + */ +} + +/** + * Example 6: Using ViemEIP4361AuthProvider for authentication + */ +export async function exampleWithViemAuthProvider() { + /* + // Import the viem auth provider + import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; + + // Create viem clients (same as before) + const viemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http() + }); + + const viemAccount = privateKeyToAccount('0x...'); + + // Create a viem-native auth provider + const authProvider = new ViemEIP4361AuthProvider( + viemPublicClient, + viemAccount, + { + domain: 'my-dapp.com', + statement: 'Sign in to access encrypted content', + uri: 'https://my-dapp.com/auth', + version: '1', + chainId: polygonAmoy.id, + nonce: 'secure-random-nonce', + issuedAt: new Date().toISOString(), + expirationTime: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), // 24 hours + } + ); + + // Get authentication signature + const authSignature = await authProvider.getOrCreateAuthSignature(); + console.log('Auth signature:', authSignature); + + // Use the auth provider in your application + // (The auth provider handles all the viem ↔ ethers conversion internally) + + // You can also access the underlying ethers provider if needed + const ethersAuthProvider = authProvider.getEthersAuthProvider(); + + // Benefits: + // ✅ No manual viem ↔ ethers conversion + // ✅ Clean viem-native API + // ✅ Automatic signing through viem account + // ✅ Full EIP4361 compliance + */ +} diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index cb473ca65..f56c0a640 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -2,8 +2,9 @@ import { ThresholdMessageKit } from '@nucypher/nucypher-core'; import { Domain } from '@nucypher/shared'; // Dynamic viem types (available only when viem is installed) -// instead of `import type { Account, PublicClient } from 'viem';` +// eslint-disable-next-line @typescript-eslint/no-explicit-any type Account = any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any type PublicClient = any; import { Condition } from './conditions/condition'; diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts index 1121fd1e9..971d02dd0 100644 --- a/packages/taco/src/wrappers/viem-wrappers.ts +++ b/packages/taco/src/wrappers/viem-wrappers.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unused-vars */ import { ethers } from 'ethers'; // Dynamic viem types (available only when viem is installed) diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts index 7f7a96dc5..c5347d427 100644 --- a/packages/taco/test/viem-unit.test.ts +++ b/packages/taco/test/viem-unit.test.ts @@ -20,8 +20,8 @@ import { beforeAll, describe, expect, it, vi } from 'vitest'; import { conditions, domains, toBytes } from '../src'; import { ConditionContext } from '../src/conditions/context'; -import { encryptWithViem, decryptWithViem } from '../src/viem-taco'; -import { createEthersProvider, createEthersSigner, createEthersFromViem } from '../src/wrappers/viem-wrappers'; +import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; +import { createEthersFromViem, createEthersProvider, createEthersSigner } from '../src/wrappers/viem-wrappers'; import { fakeDkgRitual, @@ -67,10 +67,12 @@ describe('viem unit tests', () => { const mockEthersSigner = mockEthersProvider.getSigner(); // Mock the viem clients + // eslint-disable-next-line @typescript-eslint/no-explicit-any const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), } as any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn(), diff --git a/packages/taco/test/viem-wrappers.test.ts b/packages/taco/test/viem-wrappers.test.ts index d2f9fe377..fe35e34cb 100644 --- a/packages/taco/test/viem-wrappers.test.ts +++ b/packages/taco/test/viem-wrappers.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { describe, expect, it, vi } from 'vitest'; import { From faf5674a113ff6d1e848016f8c7f1aff3dbd9d53 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 13 Aug 2025 21:43:48 +0200 Subject: [PATCH 03/97] fix: resolve final lint issues in test files - Fixed eslint disable comment placement for any type assertions - Ensured all CI/CD lint checks pass successfully --- packages/taco/test/viem-unit.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts index c5347d427..958c4d0c2 100644 --- a/packages/taco/test/viem-unit.test.ts +++ b/packages/taco/test/viem-unit.test.ts @@ -66,16 +66,16 @@ describe('viem unit tests', () => { const mockEthersProvider = fakeProvider(aliceSecretKeyBytes); const mockEthersSigner = mockEthersProvider.getSigner(); - // Mock the viem clients - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // Mock the viem clients const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), + // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; - // eslint-disable-next-line @typescript-eslint/no-explicit-any const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn(), + // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; // Mock the adapter functions to return ethers objects From 446a98343bd70809cae1f5506a2a2d7f7b593b3c Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 13 Aug 2025 22:04:38 +0200 Subject: [PATCH 04/97] mock more functions at a unit test (to prevent making unnecessary network calls) --- packages/taco/test/viem-unit.test.ts | 46 ++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts index 958c4d0c2..9cc1395b4 100644 --- a/packages/taco/test/viem-unit.test.ts +++ b/packages/taco/test/viem-unit.test.ts @@ -21,7 +21,11 @@ import { beforeAll, describe, expect, it, vi } from 'vitest'; import { conditions, domains, toBytes } from '../src'; import { ConditionContext } from '../src/conditions/context'; import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; -import { createEthersFromViem, createEthersProvider, createEthersSigner } from '../src/wrappers/viem-wrappers'; +import { + createEthersFromViem, + createEthersProvider, + createEthersSigner, +} from '../src/wrappers/viem-wrappers'; import { fakeDkgRitual, @@ -66,22 +70,36 @@ describe('viem unit tests', () => { const mockEthersProvider = fakeProvider(aliceSecretKeyBytes); const mockEthersSigner = mockEthersProvider.getSigner(); - // Mock the viem clients + // Mock the viem clients with more complete interfaces const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), - // eslint-disable-next-line @typescript-eslint/no-explicit-any + call: vi.fn().mockResolvedValue('0x'), + getNetwork: vi + .fn() + .mockResolvedValue({ chainId: 80002, name: 'polygon-amoy' }), + readContract: vi.fn().mockResolvedValue('0x'), + // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn(), - // eslint-disable-next-line @typescript-eslint/no-explicit-any + signMessage: vi.fn().mockResolvedValue('0x'), + signTypedData: vi.fn().mockResolvedValue('0x'), + // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; // Mock the adapter functions to return ethers objects - const createEthersProviderSpy = vi.spyOn(await import('../src/wrappers/viem-wrappers'), 'createEthersProvider') + const createEthersProviderSpy = vi + .spyOn( + await import('../src/wrappers/viem-wrappers'), + 'createEthersProvider', + ) .mockReturnValue(mockEthersProvider); - const createEthersSignerSpy = vi.spyOn(await import('../src/wrappers/viem-wrappers'), 'createEthersSigner') + const createEthersSignerSpy = vi + .spyOn( + await import('../src/wrappers/viem-wrappers'), + 'createEthersSigner', + ) .mockReturnValue(mockEthersSigner); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); @@ -96,8 +114,13 @@ describe('viem unit tests', () => { mockViemAccount, ); - expect(createEthersProviderSpy).toHaveBeenCalledWith(mockViemPublicClient); - expect(createEthersSignerSpy).toHaveBeenCalledWith(mockViemAccount, mockEthersProvider); + expect(createEthersProviderSpy).toHaveBeenCalledWith( + mockViemPublicClient, + ); + expect(createEthersSignerSpy).toHaveBeenCalledWith( + mockViemAccount, + mockEthersProvider, + ); expect(getFinalizedRitualSpy).toHaveBeenCalled(); expect(messageKit).toBeDefined(); @@ -132,7 +155,10 @@ describe('viem unit tests', () => { ); const conditionContext = ConditionContext.fromMessageKit(messageKit); - conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, authProvider); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); // Test decryption const decryptedMessage = await decryptWithViem( From 666e8a4ce1fd9f98808a6254bca8ffc708ba1722 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 13 Aug 2025 22:23:26 +0200 Subject: [PATCH 05/97] increase a test timeout --- packages/taco/test/viem-unit.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts index 9cc1395b4..52c211cfd 100644 --- a/packages/taco/test/viem-unit.test.ts +++ b/packages/taco/test/viem-unit.test.ts @@ -186,7 +186,7 @@ describe('viem unit tests', () => { expect(decryptWithViem).toBeDefined(); expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? }); - }); + }, 10000); describe('function signatures', () => { it('should have correct function signatures', () => { From fac718857461caf9abeec4186cb79dda86991e91 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 13 Aug 2025 23:06:22 +0200 Subject: [PATCH 06/97] improve structure --- .../src/providers/viem/base-interfaces.ts | 200 ++++++++ .../src/providers/viem/viem-auth-providers.ts | 29 +- .../src/providers/viem/viem-wrappers.ts | 334 ++++++++++---- .../viem-encrypt-decrypt.test.ts | 432 +++++++++--------- .../taco/src/examples/viem-auth-example.ts | 25 +- packages/taco/src/viem-taco.ts | 23 +- packages/taco/src/wrappers/base-interfaces.ts | 200 ++++++++ packages/taco/src/wrappers/viem-wrappers.ts | 359 +++++++-------- packages/taco/test/viem-unit.test.ts | 12 +- packages/taco/test/viem-wrappers.test.ts | 15 +- 10 files changed, 1097 insertions(+), 532 deletions(-) create mode 100644 packages/taco-auth/src/providers/viem/base-interfaces.ts create mode 100644 packages/taco/src/wrappers/base-interfaces.ts diff --git a/packages/taco-auth/src/providers/viem/base-interfaces.ts b/packages/taco-auth/src/providers/viem/base-interfaces.ts new file mode 100644 index 000000000..fe2e3b9f5 --- /dev/null +++ b/packages/taco-auth/src/providers/viem/base-interfaces.ts @@ -0,0 +1,200 @@ +import { ethers } from 'ethers'; + +/** + * Minimal Provider interface needed by TACo auth providers + * + * This defines the minimal contract that both ethers providers and viem-wrapped providers + * must satisfy for TACo authentication providers to work correctly. + * + * Ethers providers naturally satisfy this interface due to structural typing. + * Viem wrappers implement this interface explicitly. + */ +export interface TacoAuthProvider { + /** + * Get network information including chainId + * @returns Promise resolving to network information + */ + getNetwork(): Promise; + + /** + * Make a read-only call to a contract + * Required for DKG coordinator and condition evaluation + */ + call( + transaction: ethers.providers.TransactionRequest, + blockTag?: string | number, + ): Promise; + + /** + * Get current block number + * Required for some condition evaluations + */ + getBlockNumber(): Promise; + + /** + * Get balance of an address + * Required for balance-based conditions + */ + getBalance( + address: string, + blockTag?: string | number, + ): Promise; + + /** + * Get transaction count (nonce) for an address + * Required for some contract operations + */ + getTransactionCount( + address: string, + blockTag?: string | number, + ): Promise; + + /** + * Get contract code at an address + * Required for contract validation + */ + getCode(address: string, blockTag?: string | number): Promise; + + /** + * Estimate gas for a transaction + * Required for transaction preparation + */ + estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise; + + /** + * Get gas price information + * Required for transaction preparation + */ + getGasPrice(): Promise; + + /** + * Get fee data (gas price, max fees) + * Required for EIP-1559 transactions + */ + getFeeData(): Promise; + + /** + * Get block information + * Required for some condition evaluations + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getBlock(blockHashOrBlockTag: string | number): Promise; + + /** + * Get transaction information + * Required for transaction monitoring + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getTransaction(transactionHash: string): Promise; + + /** + * Get transaction receipt + * Required for transaction confirmation + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getTransactionReceipt(transactionHash: string): Promise; + + /** + * Wait for transaction confirmation + * Required for transaction monitoring + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + waitForTransaction(transactionHash: string): Promise; + + /** + * Resolve ENS name to address + * Optional for ENS support + */ + resolveName(name: string): Promise; + + /** + * Reverse resolve address to ENS name + * Optional for ENS support + */ + lookupAddress(address: string): Promise; +} + +/** + * Minimal Signer interface needed by TACo auth providers + * + * This defines the minimal contract that both ethers signers and viem-wrapped signers + * must satisfy for TACo authentication providers to work correctly. + * + * Ethers signers naturally satisfy this interface due to structural typing. + * Viem wrappers implement this interface explicitly. + */ +export interface TacoAuthSigner { + /** + * The provider attached to this signer + * Required for compatibility with ethers signers + */ + readonly provider: TacoAuthProvider; + + /** + * Get the signer's address + * @returns Promise resolving to the signer's Ethereum address + */ + getAddress(): Promise; + + /** + * Sign a message with the signer + * @param message - Message to sign (string or Uint8Array) + * @returns Promise resolving to the signature + */ + signMessage(message: string | Uint8Array): Promise; + + /** + * Sign a transaction + * Required for transaction broadcasting + */ + signTransaction( + transaction: ethers.providers.TransactionRequest, + ): Promise; + + /** + * Sign typed data (EIP-712) + * Required for structured message signing + */ + signTypedData( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + domain: any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + types: Record, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + message: Record, + ): Promise; + + /** + * Connect to a different provider + * Required for provider switching + */ + connect(provider: TacoAuthProvider): TacoAuthSigner; + + /** + * Get balance of the signer's address + * Convenience method using attached provider + */ + getBalance(): Promise; + + /** + * Get transaction count for the signer's address + * Convenience method using attached provider + */ + getTransactionCount(): Promise; + + /** + * Estimate gas for a transaction + * Convenience method using attached provider + */ + estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise; + + /** + * Make a read-only call + * Convenience method using attached provider + */ + call(transaction: ethers.providers.TransactionRequest): Promise; +} diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts index a36cf69ff..91ed934d5 100644 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -1,4 +1,9 @@ -import { EIP4361AuthProvider, EIP4361AuthProviderParams } from '../eip4361/eip4361'; +import { ethers } from 'ethers'; + +import { + EIP4361AuthProvider, + EIP4361AuthProviderParams, +} from '../eip4361/eip4361'; import { createEthersProvider, createEthersSigner } from './viem-wrappers'; @@ -10,29 +15,29 @@ type PublicClient = any; /** * Viem-compatible EIP4361 authentication provider. - * + * * This class provides a clean viem-native API for EIP4361 authentication * while internally handling the conversion to ethers.js objects that the * underlying EIP4361AuthProvider expects. - * + * * @example * ```typescript * import { createPublicClient, http } from 'viem'; * import { privateKeyToAccount } from 'viem/accounts'; * import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; - * + * * const publicClient = createPublicClient({ * chain: polygon, * transport: http() * }); * const account = privateKeyToAccount('0x...'); - * + * * const authProvider = new ViemEIP4361AuthProvider( * publicClient, * account, * { domain: 'my-app.com', uri: 'https://my-app.com' } * ); - * + * * const signature = await authProvider.getOrCreateAuthSignature(); * ``` */ @@ -41,7 +46,7 @@ export class ViemEIP4361AuthProvider { /** * Create a new ViemEIP4361AuthProvider - * + * * @param viemPublicClient - viem PublicClient for blockchain interactions * @param viemAccount - viem Account for signing operations * @param options - Optional EIP4361 parameters (domain, uri) @@ -49,17 +54,19 @@ export class ViemEIP4361AuthProvider { constructor( viemPublicClient: PublicClient, viemAccount: Account, - options?: EIP4361AuthProviderParams + options?: EIP4361AuthProviderParams, ) { // Convert viem objects to ethers objects internally const ethersProvider = createEthersProvider(viemPublicClient); const ethersSigner = createEthersSigner(viemAccount, ethersProvider); // Create the underlying ethers auth provider + // Type assertions are safe here because our TacoProvider/TacoSigner interfaces + // are designed to be compatible with ethers Provider/Signer interfaces this.ethersAuthProvider = new EIP4361AuthProvider( - ethersProvider, - ethersSigner, - options + ethersProvider as unknown as ethers.providers.Provider, + ethersSigner as unknown as ethers.Signer, + options, ); } diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts index 22104e5e9..1f2c5e4c7 100644 --- a/packages/taco-auth/src/providers/viem/viem-wrappers.ts +++ b/packages/taco-auth/src/providers/viem/viem-wrappers.ts @@ -1,36 +1,48 @@ import { ethers } from 'ethers'; -// Dynamic viem types (available only when viem is installed) -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type Account = any; +import { TacoAuthProvider, TacoAuthSigner } from './base-interfaces'; + +// Dynamic imports and types for viem compatibility // eslint-disable-next-line @typescript-eslint/no-explicit-any type PublicClient = any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type Account = any; /** - * Checks if viem is available and throws a helpful error if not + * Check if viem is available and throw helpful error if not */ -function checkViemAvailability(): void { +async function checkViemAvailability(): Promise { try { - require('viem'); + await import('viem'); } catch (error) { throw new Error( - 'viem is required for viem auth providers. Install it with: npm install viem', + 'viem is required for viem wrapper functions. Install it with: npm install viem', ); } } /** * A minimal provider that wraps viem PublicClient for auth provider compatibility - * - * This class implements only the methods needed for EIP4361AuthProvider to work. - * It uses type assertion to satisfy the ethers.providers.Provider interface - * without implementing all methods. + * + * This class implements only the methods needed for TACo authentication providers. + * It implements the TacoAuthProvider interface, defining just the essential methods. */ -class ViemAuthProvider { +class ViemAuthProvider implements TacoAuthProvider { private viemPublicClient: PublicClient; + // Ethers.js compatibility properties to pass internal validation + readonly _isProvider: boolean = true; + readonly _network: Promise; + // Additional properties that ethers contracts might expect + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly formatter?: any = undefined; + readonly _networkPromise?: Promise; + constructor(viemPublicClient: PublicClient) { this.viemPublicClient = viemPublicClient; + // Initialize network promise for ethers compatibility + this._network = this.getNetwork(); + this._networkPromise = this._network; } async getNetwork(): Promise { @@ -41,11 +53,18 @@ class ViemAuthProvider { }; } - async call(transaction: ethers.providers.TransactionRequest): Promise { + // Additional method needed for some advanced TACo features (e.g., condition evaluation) + async call( + transaction: ethers.providers.TransactionRequest, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { const result = await this.viemPublicClient.call({ to: transaction.to as `0x${string}`, data: transaction.data as `0x${string}`, - value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, }); if (typeof result === 'object' && result && 'data' in result) { return result.data as string; @@ -53,72 +72,174 @@ class ViemAuthProvider { return result as string; } - // Stub methods for ethers compatibility (not used by EIP4361AuthProvider) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getBlockNumber(): Promise { return 0; } - async getGasPrice(): Promise { return ethers.BigNumber.from(0); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getFeeData(): Promise { return null; } - async getBalance(): Promise { return ethers.BigNumber.from(0); } - async getTransactionCount(): Promise { return 0; } - async getCode(): Promise { return '0x'; } - async getStorageAt(): Promise { return '0x'; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async sendTransaction(): Promise { throw new Error('Not implemented'); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getTransaction(): Promise { return null; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getTransactionReceipt(): Promise { return null; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getLogs(): Promise { return []; } + async getBlockNumber(): Promise { + return Number(await this.viemPublicClient.getBlockNumber()); + } + + async getBalance( + address: string, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { + const balance = await this.viemPublicClient.getBalance({ + address: address as `0x${string}`, + }); + return ethers.BigNumber.from(balance.toString()); + } + + async getTransactionCount( + address: string, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { + return Number( + await this.viemPublicClient.getTransactionCount({ + address: address as `0x${string}`, + }), + ); + } + + async getCode( + address: string, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { + return ( + (await this.viemPublicClient.getCode({ + address: address as `0x${string}`, + })) || '0x' + ); + } + + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { + const gasEstimate = await this.viemPublicClient.estimateGas({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + from: transaction.from as `0x${string}`, + }); + return ethers.BigNumber.from(gasEstimate.toString()); + } + + async getGasPrice(): Promise { + const gasPrice = await this.viemPublicClient.getGasPrice(); + return ethers.BigNumber.from(gasPrice.toString()); + } + + async getFeeData(): Promise { + const feeData = await this.viemPublicClient.getFeeHistory({ + blockCount: 4, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + blockNumber: 'latest' as any, + rewardPercentiles: [25, 50, 75], + }); + // Use the latest base fee and priority fee + const latestBaseFee = + feeData.baseFeePerGas[feeData.baseFeePerGas.length - 1]; + const latestReward = feeData.reward?.[feeData.reward.length - 1]; + const medianPriorityFee = latestReward ? latestReward[1] : BigInt(0); + + return { + maxFeePerGas: ethers.BigNumber.from( + (latestBaseFee + medianPriorityFee).toString(), + ), + maxPriorityFeePerGas: ethers.BigNumber.from(medianPriorityFee.toString()), + gasPrice: ethers.BigNumber.from(latestBaseFee.toString()), + lastBaseFeePerGas: ethers.BigNumber.from(latestBaseFee.toString()), + }; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getBlock(): Promise { return null; } + async getBlock(blockHashOrBlockTag: string | number): Promise { + return await this.viemPublicClient.getBlock({ + blockNumber: + typeof blockHashOrBlockTag === 'number' + ? BigInt(blockHashOrBlockTag) + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + ('latest' as any), + blockHash: + typeof blockHashOrBlockTag === 'string' && + blockHashOrBlockTag.startsWith('0x') + ? (blockHashOrBlockTag as `0x${string}`) + : undefined, + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getBlockWithTransactions(): Promise { return null; } - async resolveName(): Promise { return null; } - async lookupAddress(): Promise { return null; } + async getTransaction(transactionHash: string): Promise { + return await this.viemPublicClient.getTransaction({ + hash: transactionHash as `0x${string}`, + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any - async waitForTransaction(): Promise { return null; } - - // Event emitter methods (not used by EIP4361AuthProvider) - on(): this { return this; } - off(): this { return this; } - removeAllListeners(): this { return this; } - listenerCount(): number { return 0; } + async getTransactionReceipt(transactionHash: string): Promise { + return await this.viemPublicClient.getTransactionReceipt({ + hash: transactionHash as `0x${string}`, + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any - listeners(): any[] { return []; } - emit(): boolean { return false; } + async waitForTransaction(transactionHash: string): Promise { + return await this.viemPublicClient.waitForTransactionReceipt({ + hash: transactionHash as `0x${string}`, + }); + } + + async resolveName(name: string): Promise { + try { + return await this.viemPublicClient.getEnsAddress({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + name: name as any, + }); + } catch { + return null; + } + } + + async lookupAddress(address: string): Promise { + try { + return await this.viemPublicClient.getEnsName({ + address: address as `0x${string}`, + }); + } catch { + return null; + } + } } /** * A signer that wraps viem Account for auth provider compatibility - * - * This class implements only the methods needed for EIP4361AuthProvider to work. + * + * This class implements the TacoAuthSigner interface, providing only the methods + * needed for TACo authentication providers to work. */ -class ViemAuthSigner { +class ViemAuthSigner implements TacoAuthSigner { private viemAccount: Account; - private provider: ethers.providers.Provider; + public readonly provider: TacoAuthProvider; - constructor(viemAccount: Account, provider: ethers.providers.Provider) { + constructor(viemAccount: Account, provider: TacoAuthProvider) { this.viemAccount = viemAccount; this.provider = provider; } - get address(): string { + async getAddress(): Promise { return this.viemAccount.address; } - getAddress(): Promise { - return Promise.resolve(this.viemAccount.address); - } - async signMessage(message: string | Uint8Array): Promise { checkViemAvailability(); // Convert message to hex if it's Uint8Array - const messageToSign = typeof message === 'string' ? message : ethers.utils.hexlify(message); + const messageToSign = + typeof message === 'string' ? message : ethers.utils.hexlify(message); return await this.viemAccount.signMessage({ message: messageToSign }); } + // Additional method needed for EIP4361 auth (signTypedData for SIWE) // eslint-disable-next-line @typescript-eslint/no-explicit-any async signTypedData(domain: any, types: any, message: any): Promise { checkViemAvailability(); @@ -126,53 +247,86 @@ class ViemAuthSigner { domain, types, message, - primaryType: Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', + primaryType: + Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', }); } - getProvider(): ethers.providers.Provider { - return this.provider; + // Additional required methods for full TacoAuthSigner interface + async signTransaction( + transaction: ethers.providers.TransactionRequest, + ): Promise { + checkViemAvailability(); + // Convert ethers transaction format to viem format + const viemTransaction = { + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + gas: transaction.gasLimit + ? BigInt(transaction.gasLimit.toString()) + : undefined, + gasPrice: transaction.gasPrice + ? BigInt(transaction.gasPrice.toString()) + : undefined, + maxFeePerGas: transaction.maxFeePerGas + ? BigInt(transaction.maxFeePerGas.toString()) + : undefined, + maxPriorityFeePerGas: transaction.maxPriorityFeePerGas + ? BigInt(transaction.maxPriorityFeePerGas.toString()) + : undefined, + nonce: transaction.nonce, + }; + return await this.viemAccount.signTransaction(viemTransaction); } - // Required ethers signer properties and stub methods - _isSigner = true; - - // Stub methods for ethers Signer compatibility (not used by EIP4361AuthProvider) - async signTransaction(): Promise { throw new Error('Not implemented'); } - connect(): this { return this; } - async getBalance(): Promise { return ethers.BigNumber.from(0); } - async getTransactionCount(): Promise { return 0; } - async getGasPrice(): Promise { return ethers.BigNumber.from(0); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getFeeData(): Promise { return null; } - async estimateGas(): Promise { return ethers.BigNumber.from(0); } - async call(): Promise { return '0x'; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async sendTransaction(): Promise { throw new Error('Not implemented'); } - async getChainId(): Promise { return (await this.provider.getNetwork()).chainId; } - async resolveName(): Promise { return null; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - checkTransaction(): any { return {}; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - populateTransaction(): Promise { return Promise.resolve({}); } + connect(provider: TacoAuthProvider): TacoAuthSigner { + return new ViemAuthSigner(this.viemAccount, provider); + } + + async getBalance(): Promise { + return await this.provider.getBalance(this.viemAccount.address); + } + + async getTransactionCount(): Promise { + return await this.provider.getTransactionCount(this.viemAccount.address); + } + + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { + return await this.provider.estimateGas(transaction); + } + + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { + return await this.provider.call(transaction); + } } /** - * Create an ethers-compatible provider from viem PublicClient - * Minimal version for auth provider compatibility + * Create a TACo-compatible provider from viem PublicClient + * + * Returns a provider that implements TacoAuthProvider interface with only + * the methods needed for TACo authentication providers. */ -export function createEthersProvider(viemPublicClient: PublicClient): ethers.providers.Provider { +export function createEthersProvider(viemPublicClient: PublicClient) { checkViemAvailability(); - // Use type assertion since we implement the minimal interface needed for auth - return new ViemAuthProvider(viemPublicClient) as unknown as ethers.providers.Provider; + return new ViemAuthProvider(viemPublicClient) as unknown as TacoAuthProvider; } /** - * Create an ethers-compatible signer from viem Account - * Minimal version for auth provider compatibility + * Create a TACo-compatible signer from viem Account + * + * Returns a signer that implements TacoAuthSigner interface with only + * the methods needed for TACo authentication providers. */ -export function createEthersSigner(viemAccount: Account, provider: ethers.providers.Provider): ethers.Signer { +export function createEthersSigner( + viemAccount: Account, + provider: TacoAuthProvider, +) { checkViemAvailability(); - // Use type assertion since we implement the minimal interface needed for auth - return new ViemAuthSigner(viemAccount, provider) as unknown as ethers.Signer; + return new ViemAuthSigner(viemAccount, provider) as unknown as TacoAuthSigner; } diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts index 97ea57c37..ba267c4b0 100644 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -3,12 +3,12 @@ import { beforeAll, describe, expect, test } from 'vitest'; import { fromBytes, toBytes } from '@nucypher/shared'; import { USER_ADDRESS_PARAM_DEFAULT, + ViemEIP4361AuthProvider, } from '@nucypher/taco-auth'; import { createPublicClient, createWalletClient, http } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; import { conditions, initialize, ThresholdMessageKit } from '../src'; -import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; import { CompoundCondition } from '../src/conditions/compound-condition'; import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; import { UINT256_MAX } from '../test/test-utils'; @@ -30,232 +30,242 @@ const consumerAccount = privateKeyToAccount( CONSUMER_PRIVATE_KEY as `0x${string}`, ); -describe('Viem Encrypt/Decrypt Integration Test', () => { - let viemPublicClient: any; - let viemWalletClient: any; - - beforeAll(async () => { - // Create viem clients - viemPublicClient = createPublicClient({ - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), +describe.skipIf(!process.env.RUNNING_IN_CI)( + 'Viem Encrypt/Decrypt Integration Test', + () => { + let viemPublicClient: any; + let viemWalletClient: any; + + beforeAll(async () => { + // Create viem clients + viemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + viemWalletClient = createWalletClient({ + account: consumerAccount, + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + // Initialize the library + await initialize(); + + // Verify network connection + const chainId = await viemPublicClient.getChainId(); + if (chainId !== CHAIN_ID) { + throw new Error( + `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${chainId}`, + ); + } }); - viemWalletClient = createWalletClient({ - account: consumerAccount, - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); + test('should encrypt and decrypt a message with viem using RPC balance condition', async () => { + // Create test message + const messageString = 'This is a secret viem message 🔐'; + const message = toBytes(messageString); + + // Create conditions + const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + const balanceLessThanMaxUintBigInt = new conditions.base.rpc.RpcCondition( + { + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '<', + // max uint256 + value: UINT256_MAX, + }, + }, + ); - // Initialize the library - await initialize(); + const compoundCondition = CompoundCondition.and([ + hasPositiveBalance, + balanceLessThanMaxUintBigInt, + ]); - // Verify network connection - const chainId = await viemPublicClient.getChainId(); - if (chainId !== CHAIN_ID) { - throw new Error( - `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${chainId}`, + // Encrypt message using viem + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + compoundCondition, + RITUAL_ID, + encryptorAccount, ); - } - }); - - test('should encrypt and decrypt a message with viem using RPC balance condition', async () => { - // Create test message - const messageString = 'This is a secret viem message 🔐'; - const message = toBytes(messageString); - - // Create conditions - const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); - const balanceLessThanMaxUintBigInt = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '<', - // max uint256 - value: UINT256_MAX, - }, - }); + const encryptedBytes = messageKit.toBytes(); + + // Prepare for decryption + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using viem-native auth provider + if ( + conditionContext.requestedContextParameters.has( + USER_ADDRESS_PARAM_DEFAULT, + ) + ) { + // Use the new ViemEIP4361AuthProvider - no manual conversion needed! + const viemAuthProvider = new ViemEIP4361AuthProvider( + viemPublicClient, + consumerAccount, + ); + + // Get the underlying ethers auth provider for context compatibility + const ethersAuthProvider = viemAuthProvider.ethersProvider; + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + ethersAuthProvider, + ); + } + + // Decrypt message using viem + const decryptedBytes = await decryptWithViem( + viemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout + + test('should encrypt and decrypt with viem using simple positive balance condition', async () => { + // Create test message + const messageString = 'This viem message tests simple balance condition'; + const message = toBytes(messageString); + + // Create simple positive balance condition (avoids problematic allowlist condition) + const positiveBalanceCondition = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + // Encrypt message with viem using simple condition + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + positiveBalanceCondition, + RITUAL_ID, + encryptorAccount, + ); - const compoundCondition = CompoundCondition.and([ - hasPositiveBalance, - balanceLessThanMaxUintBigInt, - ]); - - // Encrypt message using viem - const messageKit = await encryptWithViem( - viemPublicClient, - DOMAIN, - message, - compoundCondition, - RITUAL_ID, - encryptorAccount, - ); - - const encryptedBytes = messageKit.toBytes(); - - // Prepare for decryption - const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using viem-native auth provider - if ( - conditionContext.requestedContextParameters.has( - USER_ADDRESS_PARAM_DEFAULT, - ) - ) { - // Use the new ViemEIP4361AuthProvider - no manual conversion needed! + const encryptedBytes = messageKit.toBytes(); + + // Prepare for decryption + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using ViemEIP4361AuthProvider const viemAuthProvider = new ViemEIP4361AuthProvider( viemPublicClient, consumerAccount, ); - - // Get the underlying ethers auth provider for context compatibility + + // Get the ethers-compatible auth provider for context const ethersAuthProvider = viemAuthProvider.ethersProvider; conditionContext.addAuthProvider( USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider, ); - } - - // Decrypt message using viem - const decryptedBytes = await decryptWithViem( - viemPublicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout - - test('should encrypt and decrypt with viem using simple positive balance condition', async () => { - // Create test message - const messageString = - 'This viem message tests simple balance condition'; - const message = toBytes(messageString); - - // Create simple positive balance condition (avoids problematic allowlist condition) - const positiveBalanceCondition = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); - // Encrypt message with viem using simple condition - const messageKit = await encryptWithViem( - viemPublicClient, - DOMAIN, - message, - positiveBalanceCondition, - RITUAL_ID, - encryptorAccount, - ); - - const encryptedBytes = messageKit.toBytes(); - - // Prepare for decryption - const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using ViemEIP4361AuthProvider - const viemAuthProvider = new ViemEIP4361AuthProvider( - viemPublicClient, - consumerAccount, - ); - - // Get the ethers-compatible auth provider for context - const ethersAuthProvider = viemAuthProvider.ethersProvider; - conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider); - - // Decrypt message using viem - const decryptedBytes = await decryptWithViem( - viemPublicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption was successful - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout - - test('should work with different viem account types', async () => { - // This test verifies viem integration works with different account configurations - const messageString = 'Testing different viem account types'; - const message = toBytes(messageString); - - // Create a simple condition - const simpleCondition = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); + // Decrypt message using viem + const decryptedBytes = await decryptWithViem( + viemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption was successful + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout + + test('should work with different viem account types', async () => { + // This test verifies viem integration works with different account configurations + const messageString = 'Testing different viem account types'; + const message = toBytes(messageString); + + // Create a simple condition + const simpleCondition = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + // Test encryption with viem account + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + simpleCondition, + RITUAL_ID, + encryptorAccount, + ); - // Test encryption with viem account - const messageKit = await encryptWithViem( - viemPublicClient, - DOMAIN, - message, - simpleCondition, - RITUAL_ID, - encryptorAccount, - ); - - // Test decryption with different viem client setup - const anotherViemPublicClient = createPublicClient({ - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); + // Test decryption with different viem client setup + const anotherViemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + const messageKitFromBytes = ThresholdMessageKit.fromBytes( + messageKit.toBytes(), + ); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using ViemEIP4361AuthProvider with different client + const viemAuthProvider = new ViemEIP4361AuthProvider( + anotherViemPublicClient, + consumerAccount, + ); - const messageKitFromBytes = ThresholdMessageKit.fromBytes( - messageKit.toBytes(), - ); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using ViemEIP4361AuthProvider with different client - const viemAuthProvider = new ViemEIP4361AuthProvider( - anotherViemPublicClient, - consumerAccount, - ); - - // Get the ethers-compatible auth provider - const ethersAuthProvider = viemAuthProvider.ethersProvider; - conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider); - - // Decrypt using the different client - const decryptedBytes = await decryptWithViem( - anotherViemPublicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout -}); + // Get the ethers-compatible auth provider + const ethersAuthProvider = viemAuthProvider.ethersProvider; + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + ethersAuthProvider, + ); + + // Decrypt using the different client + const decryptedBytes = await decryptWithViem( + anotherViemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout + }, +); diff --git a/packages/taco/src/examples/viem-auth-example.ts b/packages/taco/src/examples/viem-auth-example.ts index 38fe1224a..db731144f 100644 --- a/packages/taco/src/examples/viem-auth-example.ts +++ b/packages/taco/src/examples/viem-auth-example.ts @@ -19,15 +19,11 @@ async function viemAuthExample() { const account = privateKeyToAccount('0x...' as `0x${string}`); // Create viem-compatible auth provider - const authProvider = new ViemEIP4361AuthProvider( - publicClient, - account, - { - // EIP4361AuthProviderParams only accepts domain and uri - domain: 'my-app.com', - uri: 'https://my-app.com', - } - ); + const authProvider = new ViemEIP4361AuthProvider(publicClient, account, { + // EIP4361AuthProviderParams only accepts domain and uri + domain: 'my-app.com', + uri: 'https://my-app.com', + }); // Get or create authentication signature const authSignature = await authProvider.getOrCreateAuthSignature(); @@ -35,10 +31,10 @@ async function viemAuthExample() { // Use the auth provider with TACo domain (example) const domain = 'testnet'; // or 'mainnet' - Domain is a type alias for string - + // The auth provider is now ready to be used with TACo operations // For example, in a condition context or with custom authentication flows - + return { authProvider, authSignature, @@ -59,10 +55,7 @@ export async function createViemAuthProviders() { const account = privateKeyToAccount('0x...' as `0x${string}`); // Simple auth provider (minimal configuration) - const simpleAuthProvider = new ViemEIP4361AuthProvider( - publicClient, - account - ); + const simpleAuthProvider = new ViemEIP4361AuthProvider(publicClient, account); // Configured auth provider with custom options const configuredAuthProvider = new ViemEIP4361AuthProvider( @@ -71,7 +64,7 @@ export async function createViemAuthProviders() { { domain: 'dapp.example.com', uri: 'https://dapp.example.com/login', - } + }, ); return { diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index f56c0a640..bb1e92b54 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -1,5 +1,6 @@ import { ThresholdMessageKit } from '@nucypher/nucypher-core'; import { Domain } from '@nucypher/shared'; +import { ethers } from 'ethers'; // Dynamic viem types (available only when viem is installed) // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -62,18 +63,19 @@ export const encryptWithViem = async ( ritualId: number, viemAuthSigner: Account, ): Promise => { - // Create ethers-compatible provider and signer from viem objects - const ethersProvider = createEthersProvider(viemPublicClient); - const ethersSigner = createEthersSigner(viemAuthSigner, ethersProvider); + // Create TACo-compatible provider and signer from viem objects + const tacoProvider = createEthersProvider(viemPublicClient); + const tacoSigner = createEthersSigner(viemAuthSigner, tacoProvider); - // Use the existing ethers-based encrypt function + // Use the existing ethers-based encrypt function with type assertions + // Our interfaces provide all the methods that the TACo SDK actually uses return await ethersEncrypt( - ethersProvider, + tacoProvider as unknown as ethers.providers.Provider, domain, message, condition, ritualId, - ethersSigner, + tacoSigner as unknown as ethers.Signer, ); }; @@ -121,12 +123,13 @@ export const decryptWithViem = async ( context?: ConditionContext, porterUris?: string[], ): Promise => { - // Create ethers-compatible provider from viem object - const ethersProvider = createEthersProvider(viemPublicClient); + // Create TACo-compatible provider from viem object + const tacoProvider = createEthersProvider(viemPublicClient); - // Use the existing ethers-based decrypt function + // Use the existing ethers-based decrypt function with type assertion + // Our interface provides all the methods that the TACo SDK actually uses return await ethersDecrypt( - ethersProvider, + tacoProvider as unknown as ethers.providers.Provider, domain, messageKit, context, diff --git a/packages/taco/src/wrappers/base-interfaces.ts b/packages/taco/src/wrappers/base-interfaces.ts new file mode 100644 index 000000000..698b1718e --- /dev/null +++ b/packages/taco/src/wrappers/base-interfaces.ts @@ -0,0 +1,200 @@ +import { ethers } from 'ethers'; + +/** + * Minimal Provider interface needed by TACo SDK + * + * This defines the minimal contract that both ethers providers and viem-wrapped providers + * must satisfy for the TACo SDK to work correctly. + * + * Ethers providers naturally satisfy this interface due to structural typing. + * Viem wrappers implement this interface explicitly. + */ +export interface TacoProvider { + /** + * Get network information including chainId + * @returns Promise resolving to network information + */ + getNetwork(): Promise; + + /** + * Make a read-only call to a contract + * Required for DKG coordinator and condition evaluation + */ + call( + transaction: ethers.providers.TransactionRequest, + blockTag?: string | number, + ): Promise; + + /** + * Get current block number + * Required for some condition evaluations + */ + getBlockNumber(): Promise; + + /** + * Get balance of an address + * Required for balance-based conditions + */ + getBalance( + address: string, + blockTag?: string | number, + ): Promise; + + /** + * Get transaction count (nonce) for an address + * Required for some contract operations + */ + getTransactionCount( + address: string, + blockTag?: string | number, + ): Promise; + + /** + * Get contract code at an address + * Required for contract validation + */ + getCode(address: string, blockTag?: string | number): Promise; + + /** + * Estimate gas for a transaction + * Required for transaction preparation + */ + estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise; + + /** + * Get gas price information + * Required for transaction preparation + */ + getGasPrice(): Promise; + + /** + * Get fee data (gas price, max fees) + * Required for EIP-1559 transactions + */ + getFeeData(): Promise; + + /** + * Get block information + * Required for some condition evaluations + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getBlock(blockHashOrBlockTag: string | number): Promise; + + /** + * Get transaction information + * Required for transaction monitoring + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getTransaction(transactionHash: string): Promise; + + /** + * Get transaction receipt + * Required for transaction confirmation + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getTransactionReceipt(transactionHash: string): Promise; + + /** + * Wait for transaction confirmation + * Required for transaction monitoring + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + waitForTransaction(transactionHash: string): Promise; + + /** + * Resolve ENS name to address + * Optional for ENS support + */ + resolveName(name: string): Promise; + + /** + * Reverse resolve address to ENS name + * Optional for ENS support + */ + lookupAddress(address: string): Promise; +} + +/** + * Minimal Signer interface needed by TACo SDK + * + * This defines the minimal contract that both ethers signers and viem-wrapped signers + * must satisfy for the TACo SDK to work correctly. + * + * Ethers signers naturally satisfy this interface due to structural typing. + * Viem wrappers implement this interface explicitly. + */ +export interface TacoSigner { + /** + * The provider attached to this signer + * Required for compatibility with ethers signers + */ + readonly provider: TacoProvider; + + /** + * Get the signer's address + * @returns Promise resolving to the signer's Ethereum address + */ + getAddress(): Promise; + + /** + * Sign a message with the signer + * @param message - Message to sign (string or Uint8Array) + * @returns Promise resolving to the signature + */ + signMessage(message: string | Uint8Array): Promise; + + /** + * Sign a transaction + * Required for transaction broadcasting + */ + signTransaction( + transaction: ethers.providers.TransactionRequest, + ): Promise; + + /** + * Sign typed data (EIP-712) + * Required for structured message signing + */ + signTypedData( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + domain: any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + types: Record, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + message: Record, + ): Promise; + + /** + * Connect to a different provider + * Required for provider switching + */ + connect(provider: TacoProvider): TacoSigner; + + /** + * Get balance of the signer's address + * Convenience method using attached provider + */ + getBalance(): Promise; + + /** + * Get transaction count for the signer's address + * Convenience method using attached provider + */ + getTransactionCount(): Promise; + + /** + * Estimate gas for a transaction + * Convenience method using attached provider + */ + estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise; + + /** + * Make a read-only call + * Convenience method using attached provider + */ + call(transaction: ethers.providers.TransactionRequest): Promise; +} diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts index 971d02dd0..250fa3a98 100644 --- a/packages/taco/src/wrappers/viem-wrappers.ts +++ b/packages/taco/src/wrappers/viem-wrappers.ts @@ -1,20 +1,21 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-unused-vars */ import { ethers } from 'ethers'; +import { TacoProvider, TacoSigner } from './base-interfaces'; + // Dynamic viem types (available only when viem is installed) -// instead of `import type { Account, PublicClient, WalletClient } from 'viem';` +// eslint-disable-next-line @typescript-eslint/no-explicit-any type Account = any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any type PublicClient = any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any type WalletClient = any; /** - * Checks if viem is available and throws a helpful error if not + * Check if viem is available and throw helpful error if not */ -function checkViemAvailability(): void { +async function checkViemAvailability(): Promise { try { - // Try to actually require viem to check if it's available - require('viem'); + await import('viem'); } catch (error) { throw new Error( 'viem is required for viem wrapper functions. Install it with: npm install viem', @@ -23,21 +24,26 @@ function checkViemAvailability(): void { } /** - * Dynamically imports viem types for runtime type checking - */ -async function importViem() { - checkViemAvailability(); - return await import('viem'); -} - -/** - * A provider that wraps viem PublicClient to work with ethers.js + * A provider that wraps viem PublicClient for TACo SDK compatibility + * + * This class implements the TacoProvider interface, providing only the methods + * needed for the TACo SDK to work correctly. */ -class ViemWrappedProvider { +class ViemTacoProvider implements TacoProvider { private viemPublicClient: PublicClient; + // Ethers.js compatibility properties for contract validation + readonly _isProvider: boolean = true; + readonly _network: Promise; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly formatter?: any = undefined; + readonly _networkPromise?: Promise; + constructor(viemPublicClient: PublicClient) { this.viemPublicClient = viemPublicClient; + // Initialize network for ethers compatibility + this._network = this.getNetwork(); + this._networkPromise = this._network; } async getNetwork(): Promise { @@ -57,30 +63,48 @@ class ViemWrappedProvider { return ethers.BigNumber.from(gasPrice.toString()); } - async getBalance(address: string, blockTag?: string | number): Promise { + async getBalance( + address: string, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { const balance = await this.viemPublicClient.getBalance({ address: address as `0x${string}`, }); return ethers.BigNumber.from(balance.toString()); } - async getTransactionCount(address: string, blockTag?: string | number): Promise { + async getTransactionCount( + address: string, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { return await this.viemPublicClient.getTransactionCount({ address: address as `0x${string}`, }); } - async getCode(address: string, blockTag?: string | number): Promise { + async getCode( + address: string, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { return await this.viemPublicClient.getCode({ address: address as `0x${string}`, }); } - async call(transaction: ethers.providers.TransactionRequest, blockTag?: string | number): Promise { + async call( + transaction: ethers.providers.TransactionRequest, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { const result = await this.viemPublicClient.call({ to: transaction.to as `0x${string}`, data: transaction.data as `0x${string}`, - value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, }); // viem returns {data: "0x..."} but ethers expects just "0x..." if (typeof result === 'object' && result && 'data' in result) { @@ -89,17 +113,25 @@ class ViemWrappedProvider { return result as string; } - async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { const gas = await this.viemPublicClient.estimateGas({ to: transaction.to as `0x${string}`, data: transaction.data as `0x${string}`, - value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, }); - return ethers.BigNumber.from(gas.toString()); + return gas; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getBlock(blockHashOrBlockTag: string | number): Promise { - if (typeof blockHashOrBlockTag === 'string' && blockHashOrBlockTag.startsWith('0x')) { + if ( + typeof blockHashOrBlockTag === 'string' && + blockHashOrBlockTag.startsWith('0x') + ) { return await this.viemPublicClient.getBlock({ blockHash: blockHashOrBlockTag as `0x${string}`, }); @@ -110,18 +142,21 @@ class ViemWrappedProvider { } } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getTransaction(transactionHash: string): Promise { return await this.viemPublicClient.getTransaction({ hash: transactionHash as `0x${string}`, }); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async getTransactionReceipt(transactionHash: string): Promise { return await this.viemPublicClient.getTransactionReceipt({ hash: transactionHash as `0x${string}`, }); } + // eslint-disable-next-line @typescript-eslint/no-explicit-any async waitForTransaction(transactionHash: string): Promise { return await this.viemPublicClient.waitForTransactionReceipt({ hash: transactionHash as `0x${string}`, @@ -129,11 +164,13 @@ class ViemWrappedProvider { } // Additional methods that ethers contracts might need - async resolveName(name: string): Promise { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async resolveName(_name: string): Promise { return null; // ENS resolution not implemented } - async lookupAddress(address: string): Promise { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async lookupAddress(_address: string): Promise { return null; // Reverse ENS lookup not implemented } @@ -146,178 +183,135 @@ class ViemWrappedProvider { lastBaseFeePerGas: null, }; } +} + +/** + * Create a TACo-compatible provider from viem PublicClient + * + * Returns a provider that implements TacoProvider interface with only + * the methods needed for TACo SDK operations. + */ +export function createEthersProvider( + viemPublicClient: PublicClient, +): TacoProvider { + checkViemAvailability(); + return new ViemTacoProvider(viemPublicClient); +} + +/** + * A signer that wraps viem Account for TACo SDK compatibility + * + * This class implements the TacoSigner interface, providing only the methods + * needed for the TACo SDK to work correctly. + */ +class ViemTacoSigner implements TacoSigner { + private viemAccount: Account; + public readonly provider: TacoProvider; - // Mark this as a viem wrapped provider - _isViemWrappedProvider = true; - - // Additional required Provider methods (stubs for compatibility) - async getStorageAt(address: string, position: string, blockTag?: string | number): Promise { - throw new Error('getStorageAt not implemented in viem wrapper'); + constructor(viemAccount: Account, provider: TacoProvider) { + this.viemAccount = viemAccount; + this.provider = provider; } - async sendTransaction(signedTransaction: string): Promise { - throw new Error('sendTransaction not implemented in viem wrapper'); + async getAddress(): Promise { + return this.viemAccount.address; } - async getBlockWithTransactions(blockHashOrBlockTag: string | number): Promise { - throw new Error('getBlockWithTransactions not implemented in viem wrapper'); + async signMessage(message: string | Uint8Array): Promise { + checkViemAvailability(); + const messageToSign = + typeof message === 'string' ? message : new TextDecoder().decode(message); + return await this.viemAccount.signMessage({ message: messageToSign }); } - async getLogs(filter: any): Promise { - throw new Error('getLogs not implemented in viem wrapper'); + async signTransaction( + transaction: ethers.providers.TransactionRequest, + ): Promise { + checkViemAvailability(); + if (!this.viemAccount.signTransaction) { + throw new Error('Account does not support transaction signing'); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const viemTx: any = { + to: transaction.to as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + data: transaction.data as `0x${string}`, + gas: transaction.gasLimit + ? BigInt(transaction.gasLimit.toString()) + : undefined, + gasPrice: transaction.gasPrice + ? BigInt(transaction.gasPrice.toString()) + : undefined, + nonce: transaction.nonce ? Number(transaction.nonce) : undefined, + }; + + return await this.viemAccount.signTransaction(viemTx); } - // Ethers provider interface compatibility - connection?: any; - _network?: ethers.providers.Network; - _isProvider = true; - - // Additional stubs for compatibility - async on(): Promise { return this; } - async once(): Promise { return this; } - async off(): Promise { return this; } - async emit(): Promise { return false; } - async listenerCount(): Promise { return 0; } - async listeners(): Promise { return []; } - async removeAllListeners(): Promise { return this; } - async addListener(): Promise { return this; } - async removeListener(): Promise { return this; } - - get _viemPublicClient() { - return this.viemPublicClient; + async signTypedData( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + domain: any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + types: Record, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + message: Record, + ): Promise { + checkViemAvailability(); + if (!this.viemAccount.signTypedData) { + throw new Error('Account does not support typed data signing'); + } + + return await this.viemAccount.signTypedData({ + domain, + types, + message, + primaryType: + Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', + }); } -} -/** - * Creates an ethers.js provider from a viem public client - * - * @param viemPublicClient - Viem PublicClient to wrap as ethers provider - * @returns ethers.providers.Provider compatible with TACo SDK - */ -export function createEthersProvider( - viemPublicClient: PublicClient, -): ethers.providers.Provider { - // Check if viem is available - checkViemAvailability(); + connect(provider: TacoProvider): TacoSigner { + return new ViemTacoSigner(this.viemAccount, provider); + } + + async getBalance( + blockTag?: ethers.providers.BlockTag, + ): Promise { + return await this.provider.getBalance(this.viemAccount.address, blockTag); + } + + async getTransactionCount(): Promise { + return await this.provider.getTransactionCount(this.viemAccount.address); + } - return new ViemWrappedProvider(viemPublicClient) as unknown as ethers.providers.Provider; + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { + return await this.provider.estimateGas(transaction); + } + + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { + return await this.provider.call(transaction); + } } /** - * Creates an ethers.js signer from a viem account and provider + * Create a TACo-compatible signer from viem Account * - * @param viemAccount - The viem account (from wallet client or account) - * @param provider - Ethers provider (can be created with createEthersProvider) - * @returns ethers.Signer compatible with TACo SDK + * Returns a signer that implements TacoSigner interface with only + * the methods needed for TACo SDK operations. */ export function createEthersSigner( viemAccount: Account, - provider: ethers.providers.Provider, -): ethers.Signer { - // Check if viem is available + provider: TacoProvider, +): TacoSigner { checkViemAvailability(); - - const signerAdapter = { - address: viemAccount.address, - provider, - - async getAddress(): Promise { - return viemAccount.address; - }, - - async signMessage(message: ethers.utils.Bytes | string): Promise { - const messageToSign = - typeof message === 'string' - ? message - : typeof message === 'object' && message.constructor === Uint8Array - ? new TextDecoder().decode(message as Uint8Array) - : String(message); - - if (!viemAccount.signMessage) { - throw new Error('Account does not support message signing'); - } - return await viemAccount.signMessage({ message: messageToSign }); - }, - - async signTransaction( - transaction: ethers.providers.TransactionRequest, - ): Promise { - if (!viemAccount.signTransaction) { - throw new Error('Account does not support transaction signing'); - } - - // Convert ethers transaction to viem format - const viemTx: any = { - to: transaction.to as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - data: transaction.data as `0x${string}`, - gas: transaction.gasLimit - ? BigInt(transaction.gasLimit.toString()) - : undefined, - gasPrice: transaction.gasPrice - ? BigInt(transaction.gasPrice.toString()) - : undefined, - nonce: transaction.nonce ? Number(transaction.nonce) : undefined, - }; - - return await viemAccount.signTransaction(viemTx); - }, - - async signTypedData( - domain: any, - types: Record, - message: Record, - ): Promise { - if (!viemAccount.signTypedData) { - throw new Error('Account does not support typed data signing'); - } - - return await viemAccount.signTypedData({ - domain, - types, - message, - primaryType: - Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', - }); - }, - - connect(provider: ethers.providers.Provider): ethers.Signer { - return createEthersSigner(viemAccount, provider); - }, - - // Additional signer methods for ethers compatibility - async getBalance() { - const balance = await provider.getBalance(viemAccount.address); - return balance; - }, - - async getTransactionCount() { - return await provider.getTransactionCount(viemAccount.address); - }, - - async estimateGas(transaction: ethers.providers.TransactionRequest) { - return await provider.estimateGas(transaction); - }, - - async call(transaction: ethers.providers.TransactionRequest) { - return await provider.call(transaction); - }, - - async sendTransaction(transaction: ethers.providers.TransactionRequest) { - throw new Error( - 'sendTransaction not implemented for viem wrapper - use signTransaction instead', - ); - }, - - // Type identification - _isSigner: true, - _isViemWrappedSigner: true, - _viemAccount: viemAccount, - }; - - return signerAdapter as unknown as ethers.Signer; + return new ViemTacoSigner(viemAccount, provider); } /** @@ -325,13 +319,12 @@ export function createEthersSigner( * * @param viemPublicClient - Viem public client for provider functionality * @param viemWalletClient - Viem wallet client for signing functionality - * @returns Object with ethers provider and signer + * @returns Object with TACo provider and signer */ export function createEthersFromViem( viemPublicClient: PublicClient, viemWalletClient: WalletClient, -) { - // Check if viem is available +): { provider: TacoProvider; signer: TacoSigner } { checkViemAvailability(); if (!viemWalletClient.account) { diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts index 52c211cfd..032f908e0 100644 --- a/packages/taco/test/viem-unit.test.ts +++ b/packages/taco/test/viem-unit.test.ts @@ -68,7 +68,13 @@ describe('viem unit tests', () => { const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); const mockedDkgRitual = fakeDkgRitual(mockedDkg); const mockEthersProvider = fakeProvider(aliceSecretKeyBytes); - const mockEthersSigner = mockEthersProvider.getSigner(); + const mockEthersSigner = { + ...mockEthersProvider.getSigner(), + signTypedData: vi.fn().mockResolvedValue('0x'), + }; + // Type assertion for test compatibility + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const typedSigner = mockEthersSigner as any; // Mock the viem clients with more complete interfaces const mockViemPublicClient = { @@ -100,7 +106,7 @@ describe('viem unit tests', () => { await import('../src/wrappers/viem-wrappers'), 'createEthersSigner', ) - .mockReturnValue(mockEthersSigner); + .mockReturnValue(typedSigner); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); @@ -150,7 +156,7 @@ describe('viem unit tests', () => { const authProvider = new tacoAuth.EIP4361AuthProvider( mockEthersProvider, - mockEthersSigner, + typedSigner, TEST_SIWE_PARAMS, ); diff --git a/packages/taco/test/viem-wrappers.test.ts b/packages/taco/test/viem-wrappers.test.ts index fe35e34cb..c89e5f411 100644 --- a/packages/taco/test/viem-wrappers.test.ts +++ b/packages/taco/test/viem-wrappers.test.ts @@ -32,7 +32,7 @@ describe('viem wrapper utilities', () => { } as any; const provider = createEthersProvider(mockViemPublicClient); - + expect(provider).toBeDefined(); expect(provider.getNetwork).toBeDefined(); expect(provider.getBlockNumber).toBeDefined(); @@ -56,7 +56,7 @@ describe('viem wrapper utilities', () => { } as any; const signer = createEthersSigner(mockViemAccount, mockProvider); - + expect(signer).toBeDefined(); expect(signer.getAddress).toBeDefined(); expect(signer.signMessage).toBeDefined(); @@ -88,9 +88,9 @@ describe('viem wrapper utilities', () => { const { provider, signer } = createEthersFromViem( mockViemPublicClient, - mockViemWalletClient + mockViemWalletClient, ); - + expect(provider).toBeDefined(); expect(signer).toBeDefined(); expect(signer.provider).toBe(provider); @@ -102,10 +102,9 @@ describe('viem wrapper utilities', () => { account: undefined, } as any; - expect(() => createEthersFromViem( - mockViemPublicClient, - mockViemWalletClient - )).toThrow('Wallet client must have an account attached'); + expect(() => + createEthersFromViem(mockViemPublicClient, mockViemWalletClient), + ).toThrow('Wallet client must have an account attached'); }); }); From d281d81bd579b0b3af25c8d586ac02e45d7f8718 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 14 Aug 2025 12:42:00 +0200 Subject: [PATCH 07/97] some improvements to viem check code and structure --- packages/shared/package.json | 8 + packages/shared/src/index.ts | 1 + packages/shared/src/viem-utils.ts | 36 +++ .../src/providers/viem/viem-auth-providers.ts | 19 +- .../src/providers/viem/viem-wrappers.ts | 38 +--- .../viem-encrypt-decrypt.test.ts | 8 +- packages/taco/package.json | 3 +- .../taco/src/examples/viem-auth-example.ts | 74 ------ packages/taco/src/examples/viem-usage.ts | 213 ------------------ packages/taco/src/viem-taco.ts | 6 +- packages/taco/src/wrappers/viem-wrappers.ts | 57 ++--- packages/taco/test/viem-unit.test.ts | 4 +- packages/taco/test/viem-wrappers.test.ts | 20 +- pnpm-lock.yaml | 9 +- 14 files changed, 118 insertions(+), 378 deletions(-) create mode 100644 packages/shared/src/viem-utils.ts delete mode 100644 packages/taco/src/examples/viem-auth-example.ts delete mode 100644 packages/taco/src/examples/viem-usage.ts diff --git a/packages/shared/package.json b/packages/shared/package.json index 79d0d3ea1..e74a6567a 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -60,6 +60,14 @@ "standard-version": "^9.5.0", "typechain": "^8.3.2" }, + "peerDependencies": { + "viem": "^2.0.0" + }, + "peerDependenciesMeta": { + "viem": { + "optional": true + } + }, "engines": { "node": ">=18", "pnpm": ">=8.0.0" diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 526d9cc5b..78cd11609 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -3,6 +3,7 @@ export * from './porter'; export * from './schemas'; export type * from './types'; export * from './utils'; +export * from './viem-utils'; export * from './web3'; // Re-exports diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts new file mode 100644 index 000000000..affc97f3e --- /dev/null +++ b/packages/shared/src/viem-utils.ts @@ -0,0 +1,36 @@ +// Shared viem utilities for TACo packages +// This provides consistent viem integration utilities across packages + +// Dynamic imports and types for viem compatibility +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type PublicClient = any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Account = any; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WalletClient = any; + +let isViemAvailable = false; + +/** + * Check if viem is available and throw helpful error if not + */ +export async function checkViemAvailability(): Promise { + if (isViemAvailable) { + return; + } + try { + await import('viem'); + isViemAvailable = true; + } catch (error) { + throw new Error( + 'viem is required for viem wrapper functions. Install it with: npm install viem', + ); + } +} + +/** + * Reset viem availability flag (primarily for testing) + */ +export function resetViemAvailability(): void { + isViemAvailable = false; +} diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts index 91ed934d5..121475fac 100644 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -44,6 +44,13 @@ type PublicClient = any; export class ViemEIP4361AuthProvider { private ethersAuthProvider: EIP4361AuthProvider; + /** + * Private constructor - use create() static method instead + */ + private constructor(ethersAuthProvider: EIP4361AuthProvider) { + this.ethersAuthProvider = ethersAuthProvider; + } + /** * Create a new ViemEIP4361AuthProvider * @@ -51,23 +58,25 @@ export class ViemEIP4361AuthProvider { * @param viemAccount - viem Account for signing operations * @param options - Optional EIP4361 parameters (domain, uri) */ - constructor( + static async create( viemPublicClient: PublicClient, viemAccount: Account, options?: EIP4361AuthProviderParams, - ) { + ): Promise { // Convert viem objects to ethers objects internally - const ethersProvider = createEthersProvider(viemPublicClient); - const ethersSigner = createEthersSigner(viemAccount, ethersProvider); + const ethersProvider = await createEthersProvider(viemPublicClient); + const ethersSigner = await createEthersSigner(viemAccount, ethersProvider); // Create the underlying ethers auth provider // Type assertions are safe here because our TacoProvider/TacoSigner interfaces // are designed to be compatible with ethers Provider/Signer interfaces - this.ethersAuthProvider = new EIP4361AuthProvider( + const ethersAuthProvider = new EIP4361AuthProvider( ethersProvider as unknown as ethers.providers.Provider, ethersSigner as unknown as ethers.Signer, options, ); + + return new ViemEIP4361AuthProvider(ethersAuthProvider); } /** diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts index 1f2c5e4c7..3dd1b35cc 100644 --- a/packages/taco-auth/src/providers/viem/viem-wrappers.ts +++ b/packages/taco-auth/src/providers/viem/viem-wrappers.ts @@ -1,26 +1,12 @@ +import { + type Account, + checkViemAvailability, + type PublicClient, +} from '@nucypher/shared'; import { ethers } from 'ethers'; import { TacoAuthProvider, TacoAuthSigner } from './base-interfaces'; -// Dynamic imports and types for viem compatibility -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type PublicClient = any; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type Account = any; - -/** - * Check if viem is available and throw helpful error if not - */ -async function checkViemAvailability(): Promise { - try { - await import('viem'); - } catch (error) { - throw new Error( - 'viem is required for viem wrapper functions. Install it with: npm install viem', - ); - } -} - /** * A minimal provider that wraps viem PublicClient for auth provider compatibility * @@ -232,7 +218,7 @@ class ViemAuthSigner implements TacoAuthSigner { } async signMessage(message: string | Uint8Array): Promise { - checkViemAvailability(); + await checkViemAvailability(); // Convert message to hex if it's Uint8Array const messageToSign = typeof message === 'string' ? message : ethers.utils.hexlify(message); @@ -242,7 +228,7 @@ class ViemAuthSigner implements TacoAuthSigner { // Additional method needed for EIP4361 auth (signTypedData for SIWE) // eslint-disable-next-line @typescript-eslint/no-explicit-any async signTypedData(domain: any, types: any, message: any): Promise { - checkViemAvailability(); + await checkViemAvailability(); return await this.viemAccount.signTypedData({ domain, types, @@ -256,7 +242,7 @@ class ViemAuthSigner implements TacoAuthSigner { async signTransaction( transaction: ethers.providers.TransactionRequest, ): Promise { - checkViemAvailability(); + await checkViemAvailability(); // Convert ethers transaction format to viem format const viemTransaction = { to: transaction.to as `0x${string}`, @@ -312,8 +298,8 @@ class ViemAuthSigner implements TacoAuthSigner { * Returns a provider that implements TacoAuthProvider interface with only * the methods needed for TACo authentication providers. */ -export function createEthersProvider(viemPublicClient: PublicClient) { - checkViemAvailability(); +export async function createEthersProvider(viemPublicClient: PublicClient) { + await checkViemAvailability(); return new ViemAuthProvider(viemPublicClient) as unknown as TacoAuthProvider; } @@ -323,10 +309,10 @@ export function createEthersProvider(viemPublicClient: PublicClient) { * Returns a signer that implements TacoAuthSigner interface with only * the methods needed for TACo authentication providers. */ -export function createEthersSigner( +export async function createEthersSigner( viemAccount: Account, provider: TacoAuthProvider, ) { - checkViemAvailability(); + await checkViemAvailability(); return new ViemAuthSigner(viemAccount, provider) as unknown as TacoAuthSigner; } diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts index ba267c4b0..2ac5312c7 100644 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -118,8 +118,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( USER_ADDRESS_PARAM_DEFAULT, ) ) { - // Use the new ViemEIP4361AuthProvider - no manual conversion needed! - const viemAuthProvider = new ViemEIP4361AuthProvider( + const viemAuthProvider = await ViemEIP4361AuthProvider.create( viemPublicClient, consumerAccount, ); @@ -179,12 +178,11 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); // Add auth provider using ViemEIP4361AuthProvider - const viemAuthProvider = new ViemEIP4361AuthProvider( + const viemAuthProvider = await ViemEIP4361AuthProvider.create( viemPublicClient, consumerAccount, ); - // Get the ethers-compatible auth provider for context const ethersAuthProvider = viemAuthProvider.ethersProvider; conditionContext.addAuthProvider( USER_ADDRESS_PARAM_DEFAULT, @@ -243,7 +241,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); // Add auth provider using ViemEIP4361AuthProvider with different client - const viemAuthProvider = new ViemEIP4361AuthProvider( + const viemAuthProvider = await ViemEIP4361AuthProvider.create( anotherViemPublicClient, consumerAccount, ); diff --git a/packages/taco/package.json b/packages/taco/package.json index 2fa965ad8..998080d2d 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -54,7 +54,8 @@ "@types/semver": "^7.7.0", "dotenv": "^16.5.0", "glob": "^11.0.1", - "modified-zod2md": "0.1.5-modified.4" + "modified-zod2md": "0.1.5-modified.4", + "viem": "^2.0.0" }, "peerDependencies": { "viem": "^2.0.0" diff --git a/packages/taco/src/examples/viem-auth-example.ts b/packages/taco/src/examples/viem-auth-example.ts deleted file mode 100644 index db731144f..000000000 --- a/packages/taco/src/examples/viem-auth-example.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Example demonstrating how to use ViemEIP4361AuthProvider with viem clients - */ -import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; -import { createPublicClient, http } from 'viem'; -import { privateKeyToAccount } from 'viem/accounts'; -import { polygon } from 'viem/chains'; -// Domain is a type, not a value - just use string literals for example -// import { Domain } from '@nucypher/shared'; - -async function viemAuthExample() { - // Create viem clients - const publicClient = createPublicClient({ - chain: polygon, - transport: http('https://polygon-rpc.com'), - }); - - // Create account from private key - const account = privateKeyToAccount('0x...' as `0x${string}`); - - // Create viem-compatible auth provider - const authProvider = new ViemEIP4361AuthProvider(publicClient, account, { - // EIP4361AuthProviderParams only accepts domain and uri - domain: 'my-app.com', - uri: 'https://my-app.com', - }); - - // Get or create authentication signature - const authSignature = await authProvider.getOrCreateAuthSignature(); - console.log('Auth signature:', authSignature); - - // Use the auth provider with TACo domain (example) - const domain = 'testnet'; // or 'mainnet' - Domain is a type alias for string - - // The auth provider is now ready to be used with TACo operations - // For example, in a condition context or with custom authentication flows - - return { - authProvider, - authSignature, - domain, - }; -} - -// Export example function -export { viemAuthExample }; - -// Example of creating different types of auth providers -export async function createViemAuthProviders() { - const publicClient = createPublicClient({ - chain: polygon, - transport: http('https://polygon-rpc.com'), - }); - - const account = privateKeyToAccount('0x...' as `0x${string}`); - - // Simple auth provider (minimal configuration) - const simpleAuthProvider = new ViemEIP4361AuthProvider(publicClient, account); - - // Configured auth provider with custom options - const configuredAuthProvider = new ViemEIP4361AuthProvider( - publicClient, - account, - { - domain: 'dapp.example.com', - uri: 'https://dapp.example.com/login', - }, - ); - - return { - simpleAuthProvider, - configuredAuthProvider, - }; -} diff --git a/packages/taco/src/examples/viem-usage.ts b/packages/taco/src/examples/viem-usage.ts deleted file mode 100644 index 979102152..000000000 --- a/packages/taco/src/examples/viem-usage.ts +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Example usage of TACo SDK with viem - * - * This example demonstrates how to use the new viem-compatible functions - * for encryption and decryption with TACo. - */ - -// import { createPublicClient, createWalletClient, http } from 'viem'; -// import { polygonAmoy } from 'viem/chains'; -// import { privateKeyToAccount } from 'viem/accounts'; -// import { -// encryptWithViem, -// decryptWithViem -// } from '../index'; -// import * as conditions from '../conditions'; - -/** - * Example 1: Using viem clients directly with the new viem-compatible functions - */ -export async function exampleWithViemClients() { - // This example shows how you would use it (commented out due to viem dependency) - /* - // 1. Create viem clients (your existing setup) - const viemPublicClient = createPublicClient({ - chain: polygonAmoy, // or your main app's chain - transport: http() - }); - - const viemAccount = privateKeyToAccount('0x...'); - const viemWalletClient = createWalletClient({ - account: viemAccount, - chain: polygonAmoy, - transport: http() - }); - - // 2. Create a condition (same as before) - const condition = conditions.predefined.erc20Balance({ - contractAddress: '0x...', - standardContractType: 'ERC20', - chain: 80002, // Polygon Amoy - method: 'balanceOf', - parameters: [':userAddress'], - returnValueTest: { - comparator: '>=', - value: 1000000000000000000 // 1 token - } - }); - - // 3. Encrypt using viem (automatically handles network conversion) - const encryptedKit = await encryptWithViem( - viemPublicClient, // Your viem public client - 'lynx', // TACo domain - 'Hello, secret!', // Message to encrypt - condition, // Access condition - 27, // Ritual ID - viemAccount // Your viem account - ); - - // 4. Decrypt using viem - const decryptedMessage = await decryptWithViem( - viemPublicClient, - 'lynx', - encryptedKit - ); - - console.log('Decrypted:', new TextDecoder().decode(decryptedMessage)); - */ -} - -/** - * Example 2: Using TACo domain convenience functions (recommended for most use cases) - */ -export async function exampleWithTacoDomain() { - /* - const account = privateKeyToAccount('0x...'); - - const condition = conditions.predefined.timelock({ - returnValueTest: { - comparator: '>', - value: Math.floor(Date.now() / 1000) + 3600 // 1 hour from now - } - }); - - // Encrypt - automatically uses correct network for TACo domain - const encryptedKit = await encryptForTacoDomain( - 'lynx', // TACo domain - automatically creates Polygon Amoy provider - 'Hello, secret!', // Message - condition, // Condition - 27, // Ritual ID - account // Your account - ); - - // Decrypt - automatically uses correct network for TACo domain - const decryptedMessage = await decryptForTacoDomain( - 'lynx', - encryptedKit - ); - - console.log('Decrypted:', new TextDecoder().decode(decryptedMessage)); - */ -} - -/** - * Example 3: Browser usage with MetaMask - */ -export async function exampleWithBrowserWallet() { - /* - // In a browser environment with MetaMask - import { createWalletClient, custom } from 'viem'; - - // Connect to MetaMask - const [viemAccount] = await window.ethereum.request({ - method: 'eth_requestAccounts' - }); - - const viemWalletClient = createWalletClient({ - transport: custom(window.ethereum), - account: viemAccount - }); - - // Encrypt - user will sign through MetaMask - const encryptedKit = await encryptForTacoDomain( - 'lynx', - 'Hello from browser!', - condition, - 27, - viemWalletClient.account - ); - - // Decrypt - const decryptedMessage = await decryptForTacoDomain( - 'lynx', - encryptedKit - ); - */ -} - -/** - * Example 5: Network separation (your main app on one network, TACo on another) - */ -export async function exampleNetworkSeparation() { - /* - // Your main app might be on Ethereum mainnet - const viemMainnetClient = createPublicClient({ - chain: mainnet, - transport: http() - }); - - const viemAccount = privateKeyToAccount('0x...'); - - // But TACo operations happen on Polygon Amoy - // The encryptForTacoDomain function handles this automatically - const encryptedKit = await encryptForTacoDomain( - 'lynx', // Uses Polygon Amoy regardless of your main app's network - 'Cross-chain secret!', - condition, - 27, - viemAccount // Same account, different network for TACo ops - ); - - // This is exactly what your TacoEncryption class does! - */ -} - -/** - * Example 6: Using ViemEIP4361AuthProvider for authentication - */ -export async function exampleWithViemAuthProvider() { - /* - // Import the viem auth provider - import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; - - // Create viem clients (same as before) - const viemPublicClient = createPublicClient({ - chain: polygonAmoy, - transport: http() - }); - - const viemAccount = privateKeyToAccount('0x...'); - - // Create a viem-native auth provider - const authProvider = new ViemEIP4361AuthProvider( - viemPublicClient, - viemAccount, - { - domain: 'my-dapp.com', - statement: 'Sign in to access encrypted content', - uri: 'https://my-dapp.com/auth', - version: '1', - chainId: polygonAmoy.id, - nonce: 'secure-random-nonce', - issuedAt: new Date().toISOString(), - expirationTime: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), // 24 hours - } - ); - - // Get authentication signature - const authSignature = await authProvider.getOrCreateAuthSignature(); - console.log('Auth signature:', authSignature); - - // Use the auth provider in your application - // (The auth provider handles all the viem ↔ ethers conversion internally) - - // You can also access the underlying ethers provider if needed - const ethersAuthProvider = authProvider.getEthersAuthProvider(); - - // Benefits: - // ✅ No manual viem ↔ ethers conversion - // ✅ Clean viem-native API - // ✅ Automatic signing through viem account - // ✅ Full EIP4361 compliance - */ -} diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index bb1e92b54..a7a41f66f 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -64,8 +64,8 @@ export const encryptWithViem = async ( viemAuthSigner: Account, ): Promise => { // Create TACo-compatible provider and signer from viem objects - const tacoProvider = createEthersProvider(viemPublicClient); - const tacoSigner = createEthersSigner(viemAuthSigner, tacoProvider); + const tacoProvider = await createEthersProvider(viemPublicClient); + const tacoSigner = await createEthersSigner(viemAuthSigner, tacoProvider); // Use the existing ethers-based encrypt function with type assertions // Our interfaces provide all the methods that the TACo SDK actually uses @@ -124,7 +124,7 @@ export const decryptWithViem = async ( porterUris?: string[], ): Promise => { // Create TACo-compatible provider from viem object - const tacoProvider = createEthersProvider(viemPublicClient); + const tacoProvider = await createEthersProvider(viemPublicClient); // Use the existing ethers-based decrypt function with type assertion // Our interface provides all the methods that the TACo SDK actually uses diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts index 250fa3a98..4b7b8ae18 100644 --- a/packages/taco/src/wrappers/viem-wrappers.ts +++ b/packages/taco/src/wrappers/viem-wrappers.ts @@ -1,28 +1,13 @@ +import { + type Account, + checkViemAvailability, + type PublicClient, + type WalletClient, +} from '@nucypher/shared'; import { ethers } from 'ethers'; import { TacoProvider, TacoSigner } from './base-interfaces'; -// Dynamic viem types (available only when viem is installed) -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type Account = any; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type PublicClient = any; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type WalletClient = any; - -/** - * Check if viem is available and throw helpful error if not - */ -async function checkViemAvailability(): Promise { - try { - await import('viem'); - } catch (error) { - throw new Error( - 'viem is required for viem wrapper functions. Install it with: npm install viem', - ); - } -} - /** * A provider that wraps viem PublicClient for TACo SDK compatibility * @@ -123,7 +108,7 @@ class ViemTacoProvider implements TacoProvider { ? BigInt(transaction.value.toString()) : undefined, }); - return gas; + return ethers.BigNumber.from(gas.toString()); } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -191,10 +176,10 @@ class ViemTacoProvider implements TacoProvider { * Returns a provider that implements TacoProvider interface with only * the methods needed for TACo SDK operations. */ -export function createEthersProvider( +export async function createEthersProvider( viemPublicClient: PublicClient, -): TacoProvider { - checkViemAvailability(); +): Promise { + await checkViemAvailability(); return new ViemTacoProvider(viemPublicClient); } @@ -218,7 +203,7 @@ class ViemTacoSigner implements TacoSigner { } async signMessage(message: string | Uint8Array): Promise { - checkViemAvailability(); + await checkViemAvailability(); const messageToSign = typeof message === 'string' ? message : new TextDecoder().decode(message); return await this.viemAccount.signMessage({ message: messageToSign }); @@ -227,7 +212,7 @@ class ViemTacoSigner implements TacoSigner { async signTransaction( transaction: ethers.providers.TransactionRequest, ): Promise { - checkViemAvailability(); + await checkViemAvailability(); if (!this.viemAccount.signTransaction) { throw new Error('Account does not support transaction signing'); } @@ -259,7 +244,7 @@ class ViemTacoSigner implements TacoSigner { // eslint-disable-next-line @typescript-eslint/no-explicit-any message: Record, ): Promise { - checkViemAvailability(); + await checkViemAvailability(); if (!this.viemAccount.signTypedData) { throw new Error('Account does not support typed data signing'); } @@ -306,11 +291,11 @@ class ViemTacoSigner implements TacoSigner { * Returns a signer that implements TacoSigner interface with only * the methods needed for TACo SDK operations. */ -export function createEthersSigner( +export async function createEthersSigner( viemAccount: Account, provider: TacoProvider, -): TacoSigner { - checkViemAvailability(); +): Promise { + await checkViemAvailability(); return new ViemTacoSigner(viemAccount, provider); } @@ -321,18 +306,18 @@ export function createEthersSigner( * @param viemWalletClient - Viem wallet client for signing functionality * @returns Object with TACo provider and signer */ -export function createEthersFromViem( +export async function createEthersFromViem( viemPublicClient: PublicClient, viemWalletClient: WalletClient, -): { provider: TacoProvider; signer: TacoSigner } { - checkViemAvailability(); +): Promise<{ provider: TacoProvider; signer: TacoSigner }> { + await checkViemAvailability(); if (!viemWalletClient.account) { throw new Error('Wallet client must have an account attached'); } - const provider = createEthersProvider(viemPublicClient); - const signer = createEthersSigner(viemWalletClient.account, provider); + const provider = await createEthersProvider(viemPublicClient); + const signer = await createEthersSigner(viemWalletClient.account, provider); return { provider, signer }; } diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts index 032f908e0..acf74306c 100644 --- a/packages/taco/test/viem-unit.test.ts +++ b/packages/taco/test/viem-unit.test.ts @@ -100,13 +100,13 @@ describe('viem unit tests', () => { await import('../src/wrappers/viem-wrappers'), 'createEthersProvider', ) - .mockReturnValue(mockEthersProvider); + .mockResolvedValue(mockEthersProvider); const createEthersSignerSpy = vi .spyOn( await import('../src/wrappers/viem-wrappers'), 'createEthersSigner', ) - .mockReturnValue(typedSigner); + .mockResolvedValue(typedSigner); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); diff --git a/packages/taco/test/viem-wrappers.test.ts b/packages/taco/test/viem-wrappers.test.ts index c89e5f411..1dab4a29b 100644 --- a/packages/taco/test/viem-wrappers.test.ts +++ b/packages/taco/test/viem-wrappers.test.ts @@ -20,7 +20,7 @@ describe('viem wrapper utilities', () => { }); describe('createEthersProvider', () => { - it('should create a provider from viem client', () => { + it('should create a provider from viem client', async () => { const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), @@ -31,7 +31,7 @@ describe('viem wrapper utilities', () => { getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), } as any; - const provider = createEthersProvider(mockViemPublicClient); + const provider = await createEthersProvider(mockViemPublicClient); expect(provider).toBeDefined(); expect(provider.getNetwork).toBeDefined(); @@ -44,7 +44,7 @@ describe('viem wrapper utilities', () => { }); describe('createEthersSigner', () => { - it('should create a signer from viem account', () => { + it('should create a signer from viem account', async () => { const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn().mockResolvedValue('0xsignature'), @@ -55,7 +55,7 @@ describe('viem wrapper utilities', () => { getNetwork: vi.fn().mockResolvedValue({ chainId: 80002 }), } as any; - const signer = createEthersSigner(mockViemAccount, mockProvider); + const signer = await createEthersSigner(mockViemAccount, mockProvider); expect(signer).toBeDefined(); expect(signer.getAddress).toBeDefined(); @@ -66,7 +66,7 @@ describe('viem wrapper utilities', () => { }); describe('createEthersFromViem', () => { - it('should create both provider and signer', () => { + it('should create both provider and signer', async () => { const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), @@ -86,7 +86,7 @@ describe('viem wrapper utilities', () => { account: mockViemAccount, } as any; - const { provider, signer } = createEthersFromViem( + const { provider, signer } = await createEthersFromViem( mockViemPublicClient, mockViemWalletClient, ); @@ -96,15 +96,15 @@ describe('viem wrapper utilities', () => { expect(signer.provider).toBe(provider); }); - it('should throw error when wallet client has no account', () => { + it('should throw error when wallet client has no account', async () => { const mockViemPublicClient = {} as any; const mockViemWalletClient = { account: undefined, } as any; - expect(() => - createEthersFromViem(mockViemPublicClient, mockViemWalletClient), - ).toThrow('Wallet client must have an account attached'); + await expect( + createEthersFromViem(mockViemPublicClient, mockViemWalletClient) + ).rejects.toThrow('Wallet client must have an account attached'); }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86dc69568..6bea1b9c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -529,6 +529,9 @@ importers: qs: specifier: ^6.14.0 version: 6.14.0 + viem: + specifier: ^2.0.0 + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -578,9 +581,6 @@ importers: semver: specifier: ^7.7.1 version: 7.7.1 - viem: - specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -600,6 +600,9 @@ importers: modified-zod2md: specifier: 0.1.5-modified.4 version: 0.1.5-modified.4(zod@3.24.2) + viem: + specifier: ^2.0.0 + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) packages/taco-auth: dependencies: From cf80375a20fb675a6616c647ccc059d2b4603ff1 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 14 Aug 2025 13:29:47 +0200 Subject: [PATCH 08/97] update comments and docs --- packages/shared/src/viem-utils.ts | 70 ++++++++++++++++--- .../src/providers/viem/viem-auth-providers.ts | 5 +- packages/taco/README.md | 39 +++++++++++ packages/taco/VIEM_SUPPORT.md | 11 ++- 4 files changed, 110 insertions(+), 15 deletions(-) diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index affc97f3e..c7a76c6ab 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -1,24 +1,79 @@ -// Shared viem utilities for TACo packages -// This provides consistent viem integration utilities across packages +/** + * Shared viem utilities for TACo packages + * + * This module provides consistent viem integration utilities across all TACo packages, + * eliminating code duplication while maintaining clean architecture. + * + * Features: + * - Optional viem dependency handling with helpful error messages + * - Dynamic import pattern that's webpack-compatible + * - Centralized type definitions for viem objects + * - Runtime availability checking with caching + * + * Usage: + * ```typescript + * import { checkViemAvailability, type PublicClient } from '@nucypher/shared'; + * + * async function myViemFunction(client: PublicClient) { + * await checkViemAvailability(); // Ensures viem is available + * // ... use viem functionality + * } + * ``` + */ -// Dynamic imports and types for viem compatibility +// Dynamic type definitions for viem objects +// Using 'any' types to avoid compile-time viem dependency +// These will be properly typed when viem is actually imported + +/** + * Viem PublicClient type for read operations + * @see https://viem.sh/docs/clients/public + */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export type PublicClient = any; + +/** + * Viem Account type for signing operations + * @see https://viem.sh/docs/accounts/privateKey + */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Account = any; + +/** + * Viem WalletClient type for wallet operations + * @see https://viem.sh/docs/clients/wallet + */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export type WalletClient = any; +// Internal state for tracking viem availability let isViemAvailable = false; /** - * Check if viem is available and throw helpful error if not + * Check if viem is available and dynamically import it + * + * This function performs a dynamic import of viem to check availability. + * It uses caching to avoid repeated imports and provides helpful error + * messages when viem is not installed. + * + * @throws {Error} When viem is not installed with installation instructions + * @example + * ```typescript + * try { + * await checkViemAvailability(); + * // viem is available, safe to use viem functions + * } catch (error) { + * console.error(error.message); // "viem is required..." + * } + * ``` */ export async function checkViemAvailability(): Promise { if (isViemAvailable) { return; } try { + // Use direct string literal for webpack compatibility + // This prevents "Critical dependency: the request of a dependency is an expression" warnings await import('viem'); isViemAvailable = true; } catch (error) { @@ -27,10 +82,3 @@ export async function checkViemAvailability(): Promise { ); } } - -/** - * Reset viem availability flag (primarily for testing) - */ -export function resetViemAvailability(): void { - isViemAvailable = false; -} diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts index 121475fac..db90dec96 100644 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -19,6 +19,9 @@ type PublicClient = any; * This class provides a clean viem-native API for EIP4361 authentication * while internally handling the conversion to ethers.js objects that the * underlying EIP4361AuthProvider expects. + * + * **Note**: This class uses a static factory method pattern for async + * initialization. Use `ViemEIP4361AuthProvider.create()` instead of `new`. * * @example * ```typescript @@ -32,7 +35,7 @@ type PublicClient = any; * }); * const account = privateKeyToAccount('0x...'); * - * const authProvider = new ViemEIP4361AuthProvider( + * const authProvider = await ViemEIP4361AuthProvider.create( * publicClient, * account, * { domain: 'my-app.com', uri: 'https://my-app.com' } diff --git a/packages/taco/README.md b/packages/taco/README.md index 0fd7afc6f..afd7ba6f0 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -64,6 +64,45 @@ const decryptedMessage = await decrypt( ); ``` +## Viem Support + +The TACo SDK also supports [viem](https://viem.sh) as an alternative to ethers.js: + +```bash +$ yarn add @nucypher/taco viem +``` + +```typescript +import { encryptWithViem, decryptWithViem } from '@nucypher/taco'; +import { createPublicClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; + +const viemClient = createPublicClient({ + chain: polygonAmoy, + transport: http(), +}); +const viemAccount = privateKeyToAccount('0x...'); + +// Encrypt with viem +const messageKit = await encryptWithViem( + viemClient, + 'testnet', + 'my secret message', + ownsNFT, + ritualId, + viemAccount, +); + +// Decrypt with viem +const decryptedMessage = await decryptWithViem( + viemClient, + 'testnet', + messageKit, +); +``` + +For detailed viem documentation, see [VIEM_SUPPORT.md](./VIEM_SUPPORT.md). + ## Learn more Please find developer documentation for diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index 4a370bb92..3a7af254d 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -116,39 +116,44 @@ const publicClient = createPublicClient({ }); const account = privateKeyToAccount('0x...'); -const authProvider = new ViemEIP4361AuthProvider( +const authProvider = await ViemEIP4361AuthProvider.create( publicClient, account, { domain: 'my-app.com', - uri: 'https://my-app.com' - } + uri: 'https://my-app.com', + }, ); const authSignature = await authProvider.getOrCreateAuthSignature(); ``` **Parameters:** + - `viemPublicClient`: `PublicClient` - Viem public client for network operations - `viemAccount`: `Account` - Viem account for signing - `options?`: `EIP4361AuthProviderParams` - Optional domain and URI for EIP-4361 messages **Methods:** + - `getOrCreateAuthSignature()`: Returns authentication signature for TACo operations - `ethersProvider`: Getter for underlying ethers-compatible auth provider ## Package Architecture ### @nucypher/taco + - **Purpose**: Core encryption and decryption functionality - **Viem Functions**: `encryptWithViem()`, `decryptWithViem()` - **Dependencies**: Only viem functions for encryption operations ### @nucypher/taco-auth + - **Purpose**: Authentication providers and signing utilities - **Viem Functions**: `ViemEIP4361AuthProvider` - **Dependencies**: Viem authentication and EIP-4361 signing This separation follows clean architecture principles - use the appropriate package based on your needs: + - **Encryption only**: Install `@nucypher/taco` + `viem` - **Authentication required**: Install both `@nucypher/taco` + `@nucypher/taco-auth` + `viem` From b9462a2ba2b40f78bad6f7403952ad5e0660284b Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 14 Aug 2025 13:34:55 +0200 Subject: [PATCH 09/97] minor enhancement --- packages/taco-auth/src/providers/viem/viem-wrappers.ts | 9 +++++++-- packages/taco/src/wrappers/viem-wrappers.ts | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts index 3dd1b35cc..e030d84aa 100644 --- a/packages/taco-auth/src/providers/viem/viem-wrappers.ts +++ b/packages/taco-auth/src/providers/viem/viem-wrappers.ts @@ -275,8 +275,13 @@ class ViemAuthSigner implements TacoAuthSigner { return await this.provider.getBalance(this.viemAccount.address); } - async getTransactionCount(): Promise { - return await this.provider.getTransactionCount(this.viemAccount.address); + async getTransactionCount( + blockTag?: ethers.providers.BlockTag, + ): Promise { + return await this.provider.getTransactionCount( + this.viemAccount.address, + blockTag, + ); } async estimateGas( diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts index 4b7b8ae18..47d843d73 100644 --- a/packages/taco/src/wrappers/viem-wrappers.ts +++ b/packages/taco/src/wrappers/viem-wrappers.ts @@ -268,8 +268,13 @@ class ViemTacoSigner implements TacoSigner { return await this.provider.getBalance(this.viemAccount.address, blockTag); } - async getTransactionCount(): Promise { - return await this.provider.getTransactionCount(this.viemAccount.address); + async getTransactionCount( + blockTag?: ethers.providers.BlockTag, + ): Promise { + return await this.provider.getTransactionCount( + this.viemAccount.address, + blockTag, + ); } async estimateGas( From 10d39f4845ac9b654c1e48732d8ee28f30d292c3 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 14 Aug 2025 23:45:13 +0200 Subject: [PATCH 10/97] refactor: extract common viem provider/signer logic into shared base classes --- packages/shared/src/viem-utils.ts | 325 +++++++++++++++++- .../src/providers/viem/viem-wrappers.ts | 280 +-------------- packages/taco/src/viem-taco.ts | 11 +- packages/taco/src/wrappers/viem-wrappers.ts | 259 +------------- 4 files changed, 363 insertions(+), 512 deletions(-) diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index c7a76c6ab..a0dbe1b13 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -9,18 +9,20 @@ * - Dynamic import pattern that's webpack-compatible * - Centralized type definitions for viem objects * - Runtime availability checking with caching + * - Common wrapper implementations for providers and signers * * Usage: * ```typescript - * import { checkViemAvailability, type PublicClient } from '@nucypher/shared'; + * import { checkViemAvailability, type PublicClient, ViemProviderBase } from '@nucypher/shared'; * - * async function myViemFunction(client: PublicClient) { - * await checkViemAvailability(); // Ensures viem is available - * // ... use viem functionality + * class MyViemProvider extends ViemProviderBase { + * // Add package-specific methods * } * ``` */ +import { ethers } from 'ethers'; + // Dynamic type definitions for viem objects // Using 'any' types to avoid compile-time viem dependency // These will be properly typed when viem is actually imported @@ -82,3 +84,318 @@ export async function checkViemAvailability(): Promise { ); } } + +/** + * Base provider class that implements common viem-to-ethers provider wrapper functionality + * + * This class contains all the shared implementation logic between taco and taco-auth packages. + * Package-specific provider classes can extend this to add additional methods. + */ +export abstract class ViemProviderBase { + protected viemPublicClient: PublicClient; + + // Ethers.js compatibility properties for contract validation + readonly _isProvider: boolean = true; + readonly _network: Promise<{ name: string; chainId: number }>; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + readonly formatter?: any = undefined; + readonly _networkPromise?: Promise<{ name: string; chainId: number }>; + + constructor(viemPublicClient: PublicClient) { + this.viemPublicClient = viemPublicClient; + // Initialize network for ethers compatibility + this._network = this.getNetwork(); + this._networkPromise = this._network; + } + + async getNetwork(): Promise<{ name: string; chainId: number }> { + const chainId = await this.viemPublicClient.getChainId(); + return { + name: this.viemPublicClient.chain?.name || `chain-${chainId}`, + chainId, + }; + } + + /** + * Get network information in ethers.providers.Network format + * This is a common method used by both taco and taco-auth providers + */ + async getEthersNetwork(): Promise { + const chainId = await this.viemPublicClient.getChainId(); + const name = this.viemPublicClient.chain?.name || `chain-${chainId}`; + return { + name, + chainId, + }; + } + + async getBlockNumber(): Promise { + return Number(await this.viemPublicClient.getBlockNumber()); + } + + async getBalance( + address: string, + blockTag?: string | number, + ): Promise { + let block: bigint | 'latest' | 'pending' | undefined; + if (blockTag === 'latest' || blockTag === 'pending') { + block = blockTag; + } else if (typeof blockTag === 'number') { + block = BigInt(blockTag); + } else if (typeof blockTag === 'string') { + // Handle hex block numbers + block = BigInt(blockTag); + } else { + block = undefined; // Latest + } + + const balance = await this.viemPublicClient.getBalance({ + address: address as `0x${string}`, + blockNumber: block, + }); + return ethers.BigNumber.from(balance.toString()); + } + + async getTransactionCount( + address: string, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { + return await this.viemPublicClient.getTransactionCount({ + address: address as `0x${string}`, + }); + } + + async getCode( + address: string, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { + return await this.viemPublicClient.getCode({ + address: address as `0x${string}`, + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async call( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + transaction: any, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _blockTag?: string | number, + ): Promise { + const result = await this.viemPublicClient.call({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + }); + // viem may return "0x..." (string) or {data: "0x..."} (object) + if (typeof result === 'object' && result && 'data' in result) { + return result.data as string; + } + return result as string; + } + + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { + const viemTransaction = { + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + }; + const gas = await this.viemPublicClient.estimateGas(viemTransaction); + return ethers.BigNumber.from(gas.toString()); + } + + async getGasPrice(): Promise { + const gasPrice = await this.viemPublicClient.getGasPrice(); + return ethers.BigNumber.from(gasPrice.toString()); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async getBlock(blockHashOrBlockTag: string | number): Promise { + if ( + typeof blockHashOrBlockTag === 'string' && + blockHashOrBlockTag.startsWith('0x') + ) { + return await this.viemPublicClient.getBlock({ + blockHash: blockHashOrBlockTag as `0x${string}`, + }); + } else { + return await this.viemPublicClient.getBlock({ + blockNumber: BigInt(blockHashOrBlockTag), + }); + } + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async getTransaction(transactionHash: string): Promise { + return await this.viemPublicClient.getTransaction({ + hash: transactionHash as `0x${string}`, + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async getTransactionReceipt(transactionHash: string): Promise { + return await this.viemPublicClient.getTransactionReceipt({ + hash: transactionHash as `0x${string}`, + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async waitForTransaction(transactionHash: string): Promise { + return await this.viemPublicClient.waitForTransactionReceipt({ + hash: transactionHash as `0x${string}`, + }); + } + + async getFeeData(): Promise { + const feeData = await this.viemPublicClient.getFeeHistory({ + blockCount: 4, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + blockNumber: 'latest' as any, + rewardPercentiles: [25, 50, 75], + }); + // Use the latest base fee and priority fee + const latestBaseFee = + feeData.baseFeePerGas[feeData.baseFeePerGas.length - 1]; + const latestReward = feeData.reward?.[feeData.reward.length - 1]; + const medianPriorityFee = latestReward ? latestReward[1] : BigInt(0); + + return { + maxFeePerGas: ethers.BigNumber.from( + (latestBaseFee + medianPriorityFee).toString(), + ), + maxPriorityFeePerGas: ethers.BigNumber.from(medianPriorityFee.toString()), + gasPrice: ethers.BigNumber.from(latestBaseFee.toString()), + lastBaseFeePerGas: ethers.BigNumber.from(latestBaseFee.toString()), + }; + } + + async resolveName(name: string): Promise { + try { + return await this.viemPublicClient.getEnsAddress({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + name: name as any, + }); + } catch { + return null; + } + } + + async lookupAddress(address: string): Promise { + try { + return await this.viemPublicClient.getEnsName({ + address: address as `0x${string}`, + }); + } catch { + return null; + } + } +} + +/** + * Base signer class that implements common viem-to-ethers signer wrapper functionality + * + * This class contains all the shared implementation logic between taco and taco-auth packages. + * Package-specific signer classes can extend this to add additional methods. + */ +export abstract class ViemSignerBase { + protected viemAccount: Account; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public readonly provider: any; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + constructor(viemAccount: Account, provider: any) { + this.viemAccount = viemAccount; + this.provider = provider; + } + + async getAddress(): Promise { + return this.viemAccount.address; + } + + async signMessage(message: string | Uint8Array): Promise { + await checkViemAvailability(); + // Convert message to hex if it's Uint8Array for compatibility + const messageToSign = + typeof message === 'string' ? message : ethers.utils.hexlify(message); + return await this.viemAccount.signMessage({ message: messageToSign }); + } + + async getBalance(): Promise { + return await this.provider.getBalance(this.viemAccount.address); + } + + async getTransactionCount(): Promise { + return await this.provider.getTransactionCount(this.viemAccount.address); + } + + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { + return await this.provider.estimateGas(transaction); + } + + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { + return await this.provider.call(transaction); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async signTypedData( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + domain: any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + types: Record, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + message: Record, + ): Promise { + await checkViemAvailability(); + if (!this.viemAccount.signTypedData) { + throw new Error('Account does not support typed data signing'); + } + + return await this.viemAccount.signTypedData({ + domain, + types, + message, + primaryType: + Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async signTransaction( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + transaction: any, + ): Promise { + await checkViemAvailability(); + if (!this.viemAccount.signTransaction) { + throw new Error('Account does not support transaction signing'); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const viemTx: any = { + to: transaction.to as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + data: transaction.data as `0x${string}`, + gas: transaction.gasLimit + ? BigInt(transaction.gasLimit.toString()) + : undefined, + gasPrice: transaction.gasPrice + ? BigInt(transaction.gasPrice.toString()) + : undefined, + nonce: transaction.nonce ? Number(transaction.nonce) : undefined, + }; + + return await this.viemAccount.signTransaction(viemTx); + } +} diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts index e030d84aa..938d7116e 100644 --- a/packages/taco-auth/src/providers/viem/viem-wrappers.ts +++ b/packages/taco-auth/src/providers/viem/viem-wrappers.ts @@ -2,6 +2,8 @@ import { type Account, checkViemAvailability, type PublicClient, + ViemProviderBase, + ViemSignerBase, } from '@nucypher/shared'; import { ethers } from 'ethers'; @@ -10,291 +12,45 @@ import { TacoAuthProvider, TacoAuthSigner } from './base-interfaces'; /** * A minimal provider that wraps viem PublicClient for auth provider compatibility * - * This class implements only the methods needed for TACo authentication providers. - * It implements the TacoAuthProvider interface, defining just the essential methods. + * This class extends ViemProviderBase and adds ethers.js specific formatting + * for TACo authentication providers. */ -class ViemAuthProvider implements TacoAuthProvider { - private viemPublicClient: PublicClient; - - // Ethers.js compatibility properties to pass internal validation - readonly _isProvider: boolean = true; - readonly _network: Promise; - // Additional properties that ethers contracts might expect - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly formatter?: any = undefined; - readonly _networkPromise?: Promise; +class ViemAuthProvider extends ViemProviderBase implements TacoAuthProvider { + // Override network type for ethers compatibility + override readonly _network: Promise; + override readonly _networkPromise?: Promise; constructor(viemPublicClient: PublicClient) { - this.viemPublicClient = viemPublicClient; - // Initialize network promise for ethers compatibility + super(viemPublicClient); + // Initialize network for ethers compatibility with correct type this._network = this.getNetwork(); this._networkPromise = this._network; } - async getNetwork(): Promise { - const chainId = await this.viemPublicClient.getChainId(); - return { - name: this.viemPublicClient.chain?.name || `chain-${chainId}`, - chainId, - }; - } - - // Additional method needed for some advanced TACo features (e.g., condition evaluation) - async call( - transaction: ethers.providers.TransactionRequest, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { - const result = await this.viemPublicClient.call({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - }); - if (typeof result === 'object' && result && 'data' in result) { - return result.data as string; - } - return result as string; - } - - async getBlockNumber(): Promise { - return Number(await this.viemPublicClient.getBlockNumber()); - } - - async getBalance( - address: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { - const balance = await this.viemPublicClient.getBalance({ - address: address as `0x${string}`, - }); - return ethers.BigNumber.from(balance.toString()); - } - - async getTransactionCount( - address: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { - return Number( - await this.viemPublicClient.getTransactionCount({ - address: address as `0x${string}`, - }), - ); + override async getNetwork(): Promise { + return await this.getEthersNetwork(); } - async getCode( - address: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { - return ( - (await this.viemPublicClient.getCode({ - address: address as `0x${string}`, - })) || '0x' - ); - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - const gasEstimate = await this.viemPublicClient.estimateGas({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - from: transaction.from as `0x${string}`, - }); - return ethers.BigNumber.from(gasEstimate.toString()); - } - - async getGasPrice(): Promise { - const gasPrice = await this.viemPublicClient.getGasPrice(); - return ethers.BigNumber.from(gasPrice.toString()); - } - - async getFeeData(): Promise { - const feeData = await this.viemPublicClient.getFeeHistory({ - blockCount: 4, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - blockNumber: 'latest' as any, - rewardPercentiles: [25, 50, 75], - }); - // Use the latest base fee and priority fee - const latestBaseFee = - feeData.baseFeePerGas[feeData.baseFeePerGas.length - 1]; - const latestReward = feeData.reward?.[feeData.reward.length - 1]; - const medianPriorityFee = latestReward ? latestReward[1] : BigInt(0); - - return { - maxFeePerGas: ethers.BigNumber.from( - (latestBaseFee + medianPriorityFee).toString(), - ), - maxPriorityFeePerGas: ethers.BigNumber.from(medianPriorityFee.toString()), - gasPrice: ethers.BigNumber.from(latestBaseFee.toString()), - lastBaseFeePerGas: ethers.BigNumber.from(latestBaseFee.toString()), - }; - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getBlock(blockHashOrBlockTag: string | number): Promise { - return await this.viemPublicClient.getBlock({ - blockNumber: - typeof blockHashOrBlockTag === 'number' - ? BigInt(blockHashOrBlockTag) - : // eslint-disable-next-line @typescript-eslint/no-explicit-any - ('latest' as any), - blockHash: - typeof blockHashOrBlockTag === 'string' && - blockHashOrBlockTag.startsWith('0x') - ? (blockHashOrBlockTag as `0x${string}`) - : undefined, - }); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getTransaction(transactionHash: string): Promise { - return await this.viemPublicClient.getTransaction({ - hash: transactionHash as `0x${string}`, - }); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getTransactionReceipt(transactionHash: string): Promise { - return await this.viemPublicClient.getTransactionReceipt({ - hash: transactionHash as `0x${string}`, - }); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async waitForTransaction(transactionHash: string): Promise { - return await this.viemPublicClient.waitForTransactionReceipt({ - hash: transactionHash as `0x${string}`, - }); - } - - async resolveName(name: string): Promise { - try { - return await this.viemPublicClient.getEnsAddress({ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - name: name as any, - }); - } catch { - return null; - } - } - - async lookupAddress(address: string): Promise { - try { - return await this.viemPublicClient.getEnsName({ - address: address as `0x${string}`, - }); - } catch { - return null; - } - } + // Base class now handles ethers.BigNumber conversion and common methods directly } /** * A signer that wraps viem Account for auth provider compatibility * - * This class implements the TacoAuthSigner interface, providing only the methods - * needed for TACo authentication providers to work. + * This class extends ViemSignerBase and adds ethers.js specific formatting + * for TACo authentication providers. */ -class ViemAuthSigner implements TacoAuthSigner { - private viemAccount: Account; - public readonly provider: TacoAuthProvider; +class ViemAuthSigner extends ViemSignerBase implements TacoAuthSigner { + public override readonly provider: TacoAuthProvider; constructor(viemAccount: Account, provider: TacoAuthProvider) { - this.viemAccount = viemAccount; + super(viemAccount, provider); this.provider = provider; } - async getAddress(): Promise { - return this.viemAccount.address; - } - - async signMessage(message: string | Uint8Array): Promise { - await checkViemAvailability(); - // Convert message to hex if it's Uint8Array - const messageToSign = - typeof message === 'string' ? message : ethers.utils.hexlify(message); - return await this.viemAccount.signMessage({ message: messageToSign }); - } - - // Additional method needed for EIP4361 auth (signTypedData for SIWE) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async signTypedData(domain: any, types: any, message: any): Promise { - await checkViemAvailability(); - return await this.viemAccount.signTypedData({ - domain, - types, - message, - primaryType: - Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', - }); - } - - // Additional required methods for full TacoAuthSigner interface - async signTransaction( - transaction: ethers.providers.TransactionRequest, - ): Promise { - await checkViemAvailability(); - // Convert ethers transaction format to viem format - const viemTransaction = { - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - gas: transaction.gasLimit - ? BigInt(transaction.gasLimit.toString()) - : undefined, - gasPrice: transaction.gasPrice - ? BigInt(transaction.gasPrice.toString()) - : undefined, - maxFeePerGas: transaction.maxFeePerGas - ? BigInt(transaction.maxFeePerGas.toString()) - : undefined, - maxPriorityFeePerGas: transaction.maxPriorityFeePerGas - ? BigInt(transaction.maxPriorityFeePerGas.toString()) - : undefined, - nonce: transaction.nonce, - }; - return await this.viemAccount.signTransaction(viemTransaction); - } - connect(provider: TacoAuthProvider): TacoAuthSigner { return new ViemAuthSigner(this.viemAccount, provider); } - - async getBalance(): Promise { - return await this.provider.getBalance(this.viemAccount.address); - } - - async getTransactionCount( - blockTag?: ethers.providers.BlockTag, - ): Promise { - return await this.provider.getTransactionCount( - this.viemAccount.address, - blockTag, - ); - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return await this.provider.estimateGas(transaction); - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return await this.provider.call(transaction); - } } /** diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index a7a41f66f..48e57e22d 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -81,7 +81,7 @@ export const encryptWithViem = async ( /** * Decrypts an encrypted message using viem clients. - * + * * This is a viem-compatible version of the decrypt function that accepts viem clients * instead of ethers providers. * @@ -95,27 +95,28 @@ export const encryptWithViem = async ( * @returns {Promise} Returns Promise that resolves with a decrypted message * * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error - * + * * @example * ```typescript * import { createPublicClient, http } from 'viem'; * import { polygonAmoy } from 'viem/chains'; - * + * * const viemPublicClient = createPublicClient({ * chain: polygonAmoy, * transport: http() * }); - * + * * const decrypted = await decryptWithViem( * viemPublicClient, * 'lynx', * messageKit, * context * ); - * + * * ``` */ + export const decryptWithViem = async ( viemPublicClient: PublicClient, domain: Domain, diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts index 47d843d73..485c41f84 100644 --- a/packages/taco/src/wrappers/viem-wrappers.ts +++ b/packages/taco/src/wrappers/viem-wrappers.ts @@ -2,6 +2,8 @@ import { type Account, checkViemAvailability, type PublicClient, + ViemProviderBase, + ViemSignerBase, type WalletClient, } from '@nucypher/shared'; import { ethers } from 'ethers'; @@ -11,163 +13,26 @@ import { TacoProvider, TacoSigner } from './base-interfaces'; /** * A provider that wraps viem PublicClient for TACo SDK compatibility * - * This class implements the TacoProvider interface, providing only the methods - * needed for the TACo SDK to work correctly. + * This class extends ViemProviderBase and adds ethers.js specific formatting + * for the TACo SDK requirements. */ -class ViemTacoProvider implements TacoProvider { - private viemPublicClient: PublicClient; - - // Ethers.js compatibility properties for contract validation - readonly _isProvider: boolean = true; - readonly _network: Promise; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly formatter?: any = undefined; - readonly _networkPromise?: Promise; +class ViemTacoProvider extends ViemProviderBase implements TacoProvider { + // Override network type for ethers compatibility + override readonly _network: Promise; + override readonly _networkPromise?: Promise; constructor(viemPublicClient: PublicClient) { - this.viemPublicClient = viemPublicClient; - // Initialize network for ethers compatibility + super(viemPublicClient); + // Initialize network for ethers compatibility with correct type this._network = this.getNetwork(); this._networkPromise = this._network; } - async getNetwork(): Promise { - const chainId = await this.viemPublicClient.getChainId(); - return { - name: this.viemPublicClient.chain?.name || `chain-${chainId}`, - chainId, - }; - } - - async getBlockNumber(): Promise { - return Number(await this.viemPublicClient.getBlockNumber()); - } - - async getGasPrice(): Promise { - const gasPrice = await this.viemPublicClient.getGasPrice(); - return ethers.BigNumber.from(gasPrice.toString()); - } - - async getBalance( - address: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { - const balance = await this.viemPublicClient.getBalance({ - address: address as `0x${string}`, - }); - return ethers.BigNumber.from(balance.toString()); - } - - async getTransactionCount( - address: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { - return await this.viemPublicClient.getTransactionCount({ - address: address as `0x${string}`, - }); - } - - async getCode( - address: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { - return await this.viemPublicClient.getCode({ - address: address as `0x${string}`, - }); - } - - async call( - transaction: ethers.providers.TransactionRequest, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { - const result = await this.viemPublicClient.call({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - }); - // viem returns {data: "0x..."} but ethers expects just "0x..." - if (typeof result === 'object' && result && 'data' in result) { - return result.data as string; - } - return result as string; - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - const gas = await this.viemPublicClient.estimateGas({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - }); - return ethers.BigNumber.from(gas.toString()); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getBlock(blockHashOrBlockTag: string | number): Promise { - if ( - typeof blockHashOrBlockTag === 'string' && - blockHashOrBlockTag.startsWith('0x') - ) { - return await this.viemPublicClient.getBlock({ - blockHash: blockHashOrBlockTag as `0x${string}`, - }); - } else { - return await this.viemPublicClient.getBlock({ - blockNumber: BigInt(blockHashOrBlockTag), - }); - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getTransaction(transactionHash: string): Promise { - return await this.viemPublicClient.getTransaction({ - hash: transactionHash as `0x${string}`, - }); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getTransactionReceipt(transactionHash: string): Promise { - return await this.viemPublicClient.getTransactionReceipt({ - hash: transactionHash as `0x${string}`, - }); + override async getNetwork(): Promise { + return await this.getEthersNetwork(); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async waitForTransaction(transactionHash: string): Promise { - return await this.viemPublicClient.waitForTransactionReceipt({ - hash: transactionHash as `0x${string}`, - }); - } - - // Additional methods that ethers contracts might need - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async resolveName(_name: string): Promise { - return null; // ENS resolution not implemented - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - async lookupAddress(_address: string): Promise { - return null; // Reverse ENS lookup not implemented - } - - async getFeeData(): Promise { - const gasPrice = await this.getGasPrice(); - return { - gasPrice, - maxFeePerGas: null, - maxPriorityFeePerGas: null, - lastBaseFeePerGas: null, - }; - } + // Base class now handles ethers.BigNumber conversion and common methods directly } /** @@ -186,108 +51,20 @@ export async function createEthersProvider( /** * A signer that wraps viem Account for TACo SDK compatibility * - * This class implements the TacoSigner interface, providing only the methods - * needed for the TACo SDK to work correctly. + * This class extends ViemSignerBase and adds ethers.js specific formatting + * for the TACo SDK requirements. */ -class ViemTacoSigner implements TacoSigner { - private viemAccount: Account; - public readonly provider: TacoProvider; +class ViemTacoSigner extends ViemSignerBase implements TacoSigner { + public override readonly provider: TacoProvider; constructor(viemAccount: Account, provider: TacoProvider) { - this.viemAccount = viemAccount; + super(viemAccount, provider); this.provider = provider; } - async getAddress(): Promise { - return this.viemAccount.address; - } - - async signMessage(message: string | Uint8Array): Promise { - await checkViemAvailability(); - const messageToSign = - typeof message === 'string' ? message : new TextDecoder().decode(message); - return await this.viemAccount.signMessage({ message: messageToSign }); - } - - async signTransaction( - transaction: ethers.providers.TransactionRequest, - ): Promise { - await checkViemAvailability(); - if (!this.viemAccount.signTransaction) { - throw new Error('Account does not support transaction signing'); - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const viemTx: any = { - to: transaction.to as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - data: transaction.data as `0x${string}`, - gas: transaction.gasLimit - ? BigInt(transaction.gasLimit.toString()) - : undefined, - gasPrice: transaction.gasPrice - ? BigInt(transaction.gasPrice.toString()) - : undefined, - nonce: transaction.nonce ? Number(transaction.nonce) : undefined, - }; - - return await this.viemAccount.signTransaction(viemTx); - } - - async signTypedData( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - domain: any, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - types: Record, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - message: Record, - ): Promise { - await checkViemAvailability(); - if (!this.viemAccount.signTypedData) { - throw new Error('Account does not support typed data signing'); - } - - return await this.viemAccount.signTypedData({ - domain, - types, - message, - primaryType: - Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', - }); - } - connect(provider: TacoProvider): TacoSigner { return new ViemTacoSigner(this.viemAccount, provider); } - - async getBalance( - blockTag?: ethers.providers.BlockTag, - ): Promise { - return await this.provider.getBalance(this.viemAccount.address, blockTag); - } - - async getTransactionCount( - blockTag?: ethers.providers.BlockTag, - ): Promise { - return await this.provider.getTransactionCount( - this.viemAccount.address, - blockTag, - ); - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return await this.provider.estimateGas(transaction); - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return await this.provider.call(transaction); - } } /** From bb7e5e0a8d8f20c8cbb819fb26b41503b94a47cd Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 15 Aug 2025 01:02:49 +0200 Subject: [PATCH 11/97] more cleanup refactoring --- packages/shared/src/viem-utils.ts | 32 +-- .../src/providers/viem/base-interfaces.ts | 200 ------------------ .../src/providers/viem/viem-wrappers.ts | 43 ++-- packages/taco/src/viem-taco.ts | 1 - packages/taco/src/wrappers/base-interfaces.ts | 200 ------------------ packages/taco/src/wrappers/viem-wrappers.ts | 35 +-- packages/taco/test/viem-unit.test.ts | 13 +- 7 files changed, 37 insertions(+), 487 deletions(-) delete mode 100644 packages/taco-auth/src/providers/viem/base-interfaces.ts delete mode 100644 packages/taco/src/wrappers/base-interfaces.ts diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index a0dbe1b13..60bad98bb 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -96,31 +96,17 @@ export abstract class ViemProviderBase { // Ethers.js compatibility properties for contract validation readonly _isProvider: boolean = true; - readonly _network: Promise<{ name: string; chainId: number }>; + readonly _network: Promise; // eslint-disable-next-line @typescript-eslint/no-explicit-any readonly formatter?: any = undefined; - readonly _networkPromise?: Promise<{ name: string; chainId: number }>; constructor(viemPublicClient: PublicClient) { this.viemPublicClient = viemPublicClient; // Initialize network for ethers compatibility this._network = this.getNetwork(); - this._networkPromise = this._network; } - async getNetwork(): Promise<{ name: string; chainId: number }> { - const chainId = await this.viemPublicClient.getChainId(); - return { - name: this.viemPublicClient.chain?.name || `chain-${chainId}`, - chainId, - }; - } - - /** - * Get network information in ethers.providers.Network format - * This is a common method used by both taco and taco-auth providers - */ - async getEthersNetwork(): Promise { + async getNetwork(): Promise { const chainId = await this.viemPublicClient.getChainId(); const name = this.viemPublicClient.chain?.name || `chain-${chainId}`; return { @@ -256,8 +242,7 @@ export abstract class ViemProviderBase { async getFeeData(): Promise { const feeData = await this.viemPublicClient.getFeeHistory({ blockCount: 4, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - blockNumber: 'latest' as any, + blockNumber: 'latest' as const, rewardPercentiles: [25, 50, 75], }); // Use the latest base fee and priority fee @@ -279,8 +264,7 @@ export abstract class ViemProviderBase { async resolveName(name: string): Promise { try { return await this.viemPublicClient.getEnsAddress({ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - name: name as any, + name: name as string, }); } catch { return null; @@ -299,18 +283,16 @@ export abstract class ViemProviderBase { } /** - * Base signer class that implements common viem-to-ethers signer wrapper functionality + * Base class for signers that wrap viem Account objects * * This class contains all the shared implementation logic between taco and taco-auth packages. * Package-specific signer classes can extend this to add additional methods. */ export abstract class ViemSignerBase { protected viemAccount: Account; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public readonly provider: any; + public readonly provider: ViemProviderBase; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - constructor(viemAccount: Account, provider: any) { + constructor(viemAccount: Account, provider: ViemProviderBase) { this.viemAccount = viemAccount; this.provider = provider; } diff --git a/packages/taco-auth/src/providers/viem/base-interfaces.ts b/packages/taco-auth/src/providers/viem/base-interfaces.ts deleted file mode 100644 index fe2e3b9f5..000000000 --- a/packages/taco-auth/src/providers/viem/base-interfaces.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { ethers } from 'ethers'; - -/** - * Minimal Provider interface needed by TACo auth providers - * - * This defines the minimal contract that both ethers providers and viem-wrapped providers - * must satisfy for TACo authentication providers to work correctly. - * - * Ethers providers naturally satisfy this interface due to structural typing. - * Viem wrappers implement this interface explicitly. - */ -export interface TacoAuthProvider { - /** - * Get network information including chainId - * @returns Promise resolving to network information - */ - getNetwork(): Promise; - - /** - * Make a read-only call to a contract - * Required for DKG coordinator and condition evaluation - */ - call( - transaction: ethers.providers.TransactionRequest, - blockTag?: string | number, - ): Promise; - - /** - * Get current block number - * Required for some condition evaluations - */ - getBlockNumber(): Promise; - - /** - * Get balance of an address - * Required for balance-based conditions - */ - getBalance( - address: string, - blockTag?: string | number, - ): Promise; - - /** - * Get transaction count (nonce) for an address - * Required for some contract operations - */ - getTransactionCount( - address: string, - blockTag?: string | number, - ): Promise; - - /** - * Get contract code at an address - * Required for contract validation - */ - getCode(address: string, blockTag?: string | number): Promise; - - /** - * Estimate gas for a transaction - * Required for transaction preparation - */ - estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise; - - /** - * Get gas price information - * Required for transaction preparation - */ - getGasPrice(): Promise; - - /** - * Get fee data (gas price, max fees) - * Required for EIP-1559 transactions - */ - getFeeData(): Promise; - - /** - * Get block information - * Required for some condition evaluations - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getBlock(blockHashOrBlockTag: string | number): Promise; - - /** - * Get transaction information - * Required for transaction monitoring - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getTransaction(transactionHash: string): Promise; - - /** - * Get transaction receipt - * Required for transaction confirmation - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getTransactionReceipt(transactionHash: string): Promise; - - /** - * Wait for transaction confirmation - * Required for transaction monitoring - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - waitForTransaction(transactionHash: string): Promise; - - /** - * Resolve ENS name to address - * Optional for ENS support - */ - resolveName(name: string): Promise; - - /** - * Reverse resolve address to ENS name - * Optional for ENS support - */ - lookupAddress(address: string): Promise; -} - -/** - * Minimal Signer interface needed by TACo auth providers - * - * This defines the minimal contract that both ethers signers and viem-wrapped signers - * must satisfy for TACo authentication providers to work correctly. - * - * Ethers signers naturally satisfy this interface due to structural typing. - * Viem wrappers implement this interface explicitly. - */ -export interface TacoAuthSigner { - /** - * The provider attached to this signer - * Required for compatibility with ethers signers - */ - readonly provider: TacoAuthProvider; - - /** - * Get the signer's address - * @returns Promise resolving to the signer's Ethereum address - */ - getAddress(): Promise; - - /** - * Sign a message with the signer - * @param message - Message to sign (string or Uint8Array) - * @returns Promise resolving to the signature - */ - signMessage(message: string | Uint8Array): Promise; - - /** - * Sign a transaction - * Required for transaction broadcasting - */ - signTransaction( - transaction: ethers.providers.TransactionRequest, - ): Promise; - - /** - * Sign typed data (EIP-712) - * Required for structured message signing - */ - signTypedData( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - domain: any, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - types: Record, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - message: Record, - ): Promise; - - /** - * Connect to a different provider - * Required for provider switching - */ - connect(provider: TacoAuthProvider): TacoAuthSigner; - - /** - * Get balance of the signer's address - * Convenience method using attached provider - */ - getBalance(): Promise; - - /** - * Get transaction count for the signer's address - * Convenience method using attached provider - */ - getTransactionCount(): Promise; - - /** - * Estimate gas for a transaction - * Convenience method using attached provider - */ - estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise; - - /** - * Make a read-only call - * Convenience method using attached provider - */ - call(transaction: ethers.providers.TransactionRequest): Promise; -} diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts index 938d7116e..f38587dd5 100644 --- a/packages/taco-auth/src/providers/viem/viem-wrappers.ts +++ b/packages/taco-auth/src/providers/viem/viem-wrappers.ts @@ -5,9 +5,6 @@ import { ViemProviderBase, ViemSignerBase, } from '@nucypher/shared'; -import { ethers } from 'ethers'; - -import { TacoAuthProvider, TacoAuthSigner } from './base-interfaces'; /** * A minimal provider that wraps viem PublicClient for auth provider compatibility @@ -15,23 +12,10 @@ import { TacoAuthProvider, TacoAuthSigner } from './base-interfaces'; * This class extends ViemProviderBase and adds ethers.js specific formatting * for TACo authentication providers. */ -class ViemAuthProvider extends ViemProviderBase implements TacoAuthProvider { - // Override network type for ethers compatibility - override readonly _network: Promise; - override readonly _networkPromise?: Promise; - +class ViemAuthProvider extends ViemProviderBase { constructor(viemPublicClient: PublicClient) { super(viemPublicClient); - // Initialize network for ethers compatibility with correct type - this._network = this.getNetwork(); - this._networkPromise = this._network; - } - - override async getNetwork(): Promise { - return await this.getEthersNetwork(); } - - // Base class now handles ethers.BigNumber conversion and common methods directly } /** @@ -40,15 +24,12 @@ class ViemAuthProvider extends ViemProviderBase implements TacoAuthProvider { * This class extends ViemSignerBase and adds ethers.js specific formatting * for TACo authentication providers. */ -class ViemAuthSigner extends ViemSignerBase implements TacoAuthSigner { - public override readonly provider: TacoAuthProvider; - - constructor(viemAccount: Account, provider: TacoAuthProvider) { +class ViemAuthSigner extends ViemSignerBase { + constructor(viemAccount: Account, provider: ViemProviderBase) { super(viemAccount, provider); - this.provider = provider; } - connect(provider: TacoAuthProvider): TacoAuthSigner { + connect(provider: ViemProviderBase): ViemSignerBase { return new ViemAuthSigner(this.viemAccount, provider); } } @@ -56,24 +37,26 @@ class ViemAuthSigner extends ViemSignerBase implements TacoAuthSigner { /** * Create a TACo-compatible provider from viem PublicClient * - * Returns a provider that implements TacoAuthProvider interface with only + * Returns a provider based on ViemProviderBase with all * the methods needed for TACo authentication providers. */ -export async function createEthersProvider(viemPublicClient: PublicClient) { +export async function createEthersProvider( + viemPublicClient: PublicClient, +): Promise { await checkViemAvailability(); - return new ViemAuthProvider(viemPublicClient) as unknown as TacoAuthProvider; + return new ViemAuthProvider(viemPublicClient); } /** * Create a TACo-compatible signer from viem Account * - * Returns a signer that implements TacoAuthSigner interface with only + * Returns a signer based on ViemSignerBase with all * the methods needed for TACo authentication providers. */ export async function createEthersSigner( viemAccount: Account, - provider: TacoAuthProvider, -) { + provider: ViemProviderBase, +): Promise { await checkViemAvailability(); - return new ViemAuthSigner(viemAccount, provider) as unknown as TacoAuthSigner; + return new ViemAuthSigner(viemAccount, provider); } diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index 48e57e22d..e873d0175 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -113,7 +113,6 @@ export const encryptWithViem = async ( * context * ); * - * ``` */ diff --git a/packages/taco/src/wrappers/base-interfaces.ts b/packages/taco/src/wrappers/base-interfaces.ts deleted file mode 100644 index 698b1718e..000000000 --- a/packages/taco/src/wrappers/base-interfaces.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { ethers } from 'ethers'; - -/** - * Minimal Provider interface needed by TACo SDK - * - * This defines the minimal contract that both ethers providers and viem-wrapped providers - * must satisfy for the TACo SDK to work correctly. - * - * Ethers providers naturally satisfy this interface due to structural typing. - * Viem wrappers implement this interface explicitly. - */ -export interface TacoProvider { - /** - * Get network information including chainId - * @returns Promise resolving to network information - */ - getNetwork(): Promise; - - /** - * Make a read-only call to a contract - * Required for DKG coordinator and condition evaluation - */ - call( - transaction: ethers.providers.TransactionRequest, - blockTag?: string | number, - ): Promise; - - /** - * Get current block number - * Required for some condition evaluations - */ - getBlockNumber(): Promise; - - /** - * Get balance of an address - * Required for balance-based conditions - */ - getBalance( - address: string, - blockTag?: string | number, - ): Promise; - - /** - * Get transaction count (nonce) for an address - * Required for some contract operations - */ - getTransactionCount( - address: string, - blockTag?: string | number, - ): Promise; - - /** - * Get contract code at an address - * Required for contract validation - */ - getCode(address: string, blockTag?: string | number): Promise; - - /** - * Estimate gas for a transaction - * Required for transaction preparation - */ - estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise; - - /** - * Get gas price information - * Required for transaction preparation - */ - getGasPrice(): Promise; - - /** - * Get fee data (gas price, max fees) - * Required for EIP-1559 transactions - */ - getFeeData(): Promise; - - /** - * Get block information - * Required for some condition evaluations - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getBlock(blockHashOrBlockTag: string | number): Promise; - - /** - * Get transaction information - * Required for transaction monitoring - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getTransaction(transactionHash: string): Promise; - - /** - * Get transaction receipt - * Required for transaction confirmation - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - getTransactionReceipt(transactionHash: string): Promise; - - /** - * Wait for transaction confirmation - * Required for transaction monitoring - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - waitForTransaction(transactionHash: string): Promise; - - /** - * Resolve ENS name to address - * Optional for ENS support - */ - resolveName(name: string): Promise; - - /** - * Reverse resolve address to ENS name - * Optional for ENS support - */ - lookupAddress(address: string): Promise; -} - -/** - * Minimal Signer interface needed by TACo SDK - * - * This defines the minimal contract that both ethers signers and viem-wrapped signers - * must satisfy for the TACo SDK to work correctly. - * - * Ethers signers naturally satisfy this interface due to structural typing. - * Viem wrappers implement this interface explicitly. - */ -export interface TacoSigner { - /** - * The provider attached to this signer - * Required for compatibility with ethers signers - */ - readonly provider: TacoProvider; - - /** - * Get the signer's address - * @returns Promise resolving to the signer's Ethereum address - */ - getAddress(): Promise; - - /** - * Sign a message with the signer - * @param message - Message to sign (string or Uint8Array) - * @returns Promise resolving to the signature - */ - signMessage(message: string | Uint8Array): Promise; - - /** - * Sign a transaction - * Required for transaction broadcasting - */ - signTransaction( - transaction: ethers.providers.TransactionRequest, - ): Promise; - - /** - * Sign typed data (EIP-712) - * Required for structured message signing - */ - signTypedData( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - domain: any, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - types: Record, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - message: Record, - ): Promise; - - /** - * Connect to a different provider - * Required for provider switching - */ - connect(provider: TacoProvider): TacoSigner; - - /** - * Get balance of the signer's address - * Convenience method using attached provider - */ - getBalance(): Promise; - - /** - * Get transaction count for the signer's address - * Convenience method using attached provider - */ - getTransactionCount(): Promise; - - /** - * Estimate gas for a transaction - * Convenience method using attached provider - */ - estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise; - - /** - * Make a read-only call - * Convenience method using attached provider - */ - call(transaction: ethers.providers.TransactionRequest): Promise; -} diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts index 485c41f84..6f67f2f5c 100644 --- a/packages/taco/src/wrappers/viem-wrappers.ts +++ b/packages/taco/src/wrappers/viem-wrappers.ts @@ -6,9 +6,6 @@ import { ViemSignerBase, type WalletClient, } from '@nucypher/shared'; -import { ethers } from 'ethers'; - -import { TacoProvider, TacoSigner } from './base-interfaces'; /** * A provider that wraps viem PublicClient for TACo SDK compatibility @@ -16,23 +13,10 @@ import { TacoProvider, TacoSigner } from './base-interfaces'; * This class extends ViemProviderBase and adds ethers.js specific formatting * for the TACo SDK requirements. */ -class ViemTacoProvider extends ViemProviderBase implements TacoProvider { - // Override network type for ethers compatibility - override readonly _network: Promise; - override readonly _networkPromise?: Promise; - +class ViemTacoProvider extends ViemProviderBase { constructor(viemPublicClient: PublicClient) { super(viemPublicClient); - // Initialize network for ethers compatibility with correct type - this._network = this.getNetwork(); - this._networkPromise = this._network; - } - - override async getNetwork(): Promise { - return await this.getEthersNetwork(); } - - // Base class now handles ethers.BigNumber conversion and common methods directly } /** @@ -43,7 +27,7 @@ class ViemTacoProvider extends ViemProviderBase implements TacoProvider { */ export async function createEthersProvider( viemPublicClient: PublicClient, -): Promise { +): Promise { await checkViemAvailability(); return new ViemTacoProvider(viemPublicClient); } @@ -54,15 +38,12 @@ export async function createEthersProvider( * This class extends ViemSignerBase and adds ethers.js specific formatting * for the TACo SDK requirements. */ -class ViemTacoSigner extends ViemSignerBase implements TacoSigner { - public override readonly provider: TacoProvider; - - constructor(viemAccount: Account, provider: TacoProvider) { +class ViemTacoSigner extends ViemSignerBase { + constructor(viemAccount: Account, provider: ViemProviderBase) { super(viemAccount, provider); - this.provider = provider; } - connect(provider: TacoProvider): TacoSigner { + connect(provider: ViemProviderBase): ViemSignerBase { return new ViemTacoSigner(this.viemAccount, provider); } } @@ -75,8 +56,8 @@ class ViemTacoSigner extends ViemSignerBase implements TacoSigner { */ export async function createEthersSigner( viemAccount: Account, - provider: TacoProvider, -): Promise { + provider: ViemProviderBase, +): Promise { await checkViemAvailability(); return new ViemTacoSigner(viemAccount, provider); } @@ -91,7 +72,7 @@ export async function createEthersSigner( export async function createEthersFromViem( viemPublicClient: PublicClient, viemWalletClient: WalletClient, -): Promise<{ provider: TacoProvider; signer: TacoSigner }> { +): Promise<{ provider: ViemProviderBase; signer: ViemSignerBase }> { await checkViemAvailability(); if (!viemWalletClient.account) { diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts index acf74306c..ddff267d4 100644 --- a/packages/taco/test/viem-unit.test.ts +++ b/packages/taco/test/viem-unit.test.ts @@ -94,13 +94,18 @@ describe('viem unit tests', () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; - // Mock the adapter functions to return ethers objects + const mockViemProvider = { + ...fakeProvider(aliceSecretKeyBytes), + viemPublicClient: mockViemPublicClient, // Add the required viem property + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } as any; + const createEthersProviderSpy = vi .spyOn( await import('../src/wrappers/viem-wrappers'), 'createEthersProvider', ) - .mockResolvedValue(mockEthersProvider); + .mockResolvedValue(mockViemProvider); const createEthersSignerSpy = vi .spyOn( await import('../src/wrappers/viem-wrappers'), @@ -125,7 +130,7 @@ describe('viem unit tests', () => { ); expect(createEthersSignerSpy).toHaveBeenCalledWith( mockViemAccount, - mockEthersProvider, + mockViemProvider, ); expect(getFinalizedRitualSpy).toHaveBeenCalled(); expect(messageKit).toBeDefined(); @@ -155,7 +160,7 @@ describe('viem unit tests', () => { const getRitualSpy = mockGetActiveRitual(mockedDkgRitual); const authProvider = new tacoAuth.EIP4361AuthProvider( - mockEthersProvider, + mockViemProvider, typedSigner, TEST_SIWE_PARAMS, ); From 91a66e5ba54a4a64e78d6b5116031cad19710cb8 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Sun, 17 Aug 2025 18:41:52 +0200 Subject: [PATCH 12/97] some renaming and minor edits --- .../taco-auth/src/providers/viem/index.ts | 2 +- .../{viem-wrappers.ts => viem-adapters.ts} | 14 ++----- .../src/providers/viem/viem-auth-providers.ts | 9 +++-- packages/taco/src/viem-taco.ts | 8 ++-- packages/taco/src/wrappers/index.ts | 6 +-- .../{viem-wrappers.ts => viem-adapters.ts} | 8 ++-- ...wrappers.test.ts => viem-adapters.test.ts} | 34 ++++++++-------- .../{viem-unit.test.ts => viem-taco.test.ts} | 40 +++++++------------ 8 files changed, 54 insertions(+), 67 deletions(-) rename packages/taco-auth/src/providers/viem/{viem-wrappers.ts => viem-adapters.ts} (72%) rename packages/taco/src/wrappers/{viem-wrappers.ts => viem-adapters.ts} (89%) rename packages/taco/test/{viem-wrappers.test.ts => viem-adapters.test.ts} (79%) rename packages/taco/test/{viem-unit.test.ts => viem-taco.test.ts} (85%) diff --git a/packages/taco-auth/src/providers/viem/index.ts b/packages/taco-auth/src/providers/viem/index.ts index 46d967630..7b9e17261 100644 --- a/packages/taco-auth/src/providers/viem/index.ts +++ b/packages/taco-auth/src/providers/viem/index.ts @@ -1,3 +1,3 @@ export { ViemEIP4361AuthProvider } from './viem-auth-providers'; export type { EIP4361AuthProviderParams } from './viem-auth-providers'; -export { createEthersProvider, createEthersSigner } from './viem-wrappers'; +export { createTacoCompatibleProvider, createTacoCompatibleSigner } from './viem-adapters'; diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-adapters.ts similarity index 72% rename from packages/taco-auth/src/providers/viem/viem-wrappers.ts rename to packages/taco-auth/src/providers/viem/viem-adapters.ts index f38587dd5..1cb6630ef 100644 --- a/packages/taco-auth/src/providers/viem/viem-wrappers.ts +++ b/packages/taco-auth/src/providers/viem/viem-adapters.ts @@ -7,10 +7,7 @@ import { } from '@nucypher/shared'; /** - * A minimal provider that wraps viem PublicClient for auth provider compatibility - * - * This class extends ViemProviderBase and adds ethers.js specific formatting - * for TACo authentication providers. + * Minimal provider implementation for auth providers */ class ViemAuthProvider extends ViemProviderBase { constructor(viemPublicClient: PublicClient) { @@ -19,10 +16,7 @@ class ViemAuthProvider extends ViemProviderBase { } /** - * A signer that wraps viem Account for auth provider compatibility - * - * This class extends ViemSignerBase and adds ethers.js specific formatting - * for TACo authentication providers. + * Minimal signer implementation for auth providers */ class ViemAuthSigner extends ViemSignerBase { constructor(viemAccount: Account, provider: ViemProviderBase) { @@ -40,7 +34,7 @@ class ViemAuthSigner extends ViemSignerBase { * Returns a provider based on ViemProviderBase with all * the methods needed for TACo authentication providers. */ -export async function createEthersProvider( +export async function createTacoCompatibleProvider( viemPublicClient: PublicClient, ): Promise { await checkViemAvailability(); @@ -53,7 +47,7 @@ export async function createEthersProvider( * Returns a signer based on ViemSignerBase with all * the methods needed for TACo authentication providers. */ -export async function createEthersSigner( +export async function createTacoCompatibleSigner( viemAccount: Account, provider: ViemProviderBase, ): Promise { diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts index db90dec96..f158a940e 100644 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -5,7 +5,10 @@ import { EIP4361AuthProviderParams, } from '../eip4361/eip4361'; -import { createEthersProvider, createEthersSigner } from './viem-wrappers'; +import { + createTacoCompatibleProvider, + createTacoCompatibleSigner, +} from './viem-adapters'; // Dynamic viem types (available only when viem is installed) // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -67,8 +70,8 @@ export class ViemEIP4361AuthProvider { options?: EIP4361AuthProviderParams, ): Promise { // Convert viem objects to ethers objects internally - const ethersProvider = await createEthersProvider(viemPublicClient); - const ethersSigner = await createEthersSigner(viemAccount, ethersProvider); + const ethersProvider = await createTacoCompatibleProvider(viemPublicClient); + const ethersSigner = await createTacoCompatibleSigner(viemAccount, ethersProvider); // Create the underlying ethers auth provider // Type assertions are safe here because our TacoProvider/TacoSigner interfaces diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index e873d0175..d0353663f 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -11,7 +11,7 @@ type PublicClient = any; import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; -import { createEthersProvider, createEthersSigner } from './wrappers'; +import { createTacoCompatibleProvider, createTacoCompatibleSigner } from './wrappers'; /** * Encrypts a message under given conditions using viem clients. @@ -64,8 +64,8 @@ export const encryptWithViem = async ( viemAuthSigner: Account, ): Promise => { // Create TACo-compatible provider and signer from viem objects - const tacoProvider = await createEthersProvider(viemPublicClient); - const tacoSigner = await createEthersSigner(viemAuthSigner, tacoProvider); + const tacoProvider = await createTacoCompatibleProvider(viemPublicClient); + const tacoSigner = await createTacoCompatibleSigner(viemAuthSigner, tacoProvider); // Use the existing ethers-based encrypt function with type assertions // Our interfaces provide all the methods that the TACo SDK actually uses @@ -124,7 +124,7 @@ export const decryptWithViem = async ( porterUris?: string[], ): Promise => { // Create TACo-compatible provider from viem object - const tacoProvider = await createEthersProvider(viemPublicClient); + const tacoProvider = await createTacoCompatibleProvider(viemPublicClient); // Use the existing ethers-based decrypt function with type assertion // Our interface provides all the methods that the TACo SDK actually uses diff --git a/packages/taco/src/wrappers/index.ts b/packages/taco/src/wrappers/index.ts index f1c331620..06a5ab158 100644 --- a/packages/taco/src/wrappers/index.ts +++ b/packages/taco/src/wrappers/index.ts @@ -1,6 +1,6 @@ // Viem adapter utilities export { createEthersFromViem, - createEthersProvider, - createEthersSigner, -} from './viem-wrappers'; + createTacoCompatibleProvider, + createTacoCompatibleSigner, +} from './viem-adapters'; diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-adapters.ts similarity index 89% rename from packages/taco/src/wrappers/viem-wrappers.ts rename to packages/taco/src/wrappers/viem-adapters.ts index 6f67f2f5c..e6bf8204c 100644 --- a/packages/taco/src/wrappers/viem-wrappers.ts +++ b/packages/taco/src/wrappers/viem-adapters.ts @@ -25,7 +25,7 @@ class ViemTacoProvider extends ViemProviderBase { * Returns a provider that implements TacoProvider interface with only * the methods needed for TACo SDK operations. */ -export async function createEthersProvider( +export async function createTacoCompatibleProvider( viemPublicClient: PublicClient, ): Promise { await checkViemAvailability(); @@ -54,7 +54,7 @@ class ViemTacoSigner extends ViemSignerBase { * Returns a signer that implements TacoSigner interface with only * the methods needed for TACo SDK operations. */ -export async function createEthersSigner( +export async function createTacoCompatibleSigner( viemAccount: Account, provider: ViemProviderBase, ): Promise { @@ -79,8 +79,8 @@ export async function createEthersFromViem( throw new Error('Wallet client must have an account attached'); } - const provider = await createEthersProvider(viemPublicClient); - const signer = await createEthersSigner(viemWalletClient.account, provider); + const provider = await createTacoCompatibleProvider(viemPublicClient); + const signer = await createTacoCompatibleSigner(viemWalletClient.account, provider); return { provider, signer }; } diff --git a/packages/taco/test/viem-wrappers.test.ts b/packages/taco/test/viem-adapters.test.ts similarity index 79% rename from packages/taco/test/viem-wrappers.test.ts rename to packages/taco/test/viem-adapters.test.ts index 1dab4a29b..ce3f17593 100644 --- a/packages/taco/test/viem-wrappers.test.ts +++ b/packages/taco/test/viem-adapters.test.ts @@ -3,23 +3,23 @@ import { describe, expect, it, vi } from 'vitest'; import { createEthersFromViem, - createEthersProvider, - createEthersSigner, -} from '../src/wrappers/viem-wrappers'; + createTacoCompatibleProvider, + createTacoCompatibleSigner, +} from '../src/wrappers/viem-adapters'; -describe('viem wrapper utilities', () => { +describe('viem adapter utilities', () => { describe('function exports', () => { - it('should export all wrapper functions', () => { - expect(createEthersProvider).toBeDefined(); - expect(createEthersSigner).toBeDefined(); + it('should export all adapter functions', () => { + expect(createTacoCompatibleProvider).toBeDefined(); + expect(createTacoCompatibleSigner).toBeDefined(); expect(createEthersFromViem).toBeDefined(); - expect(typeof createEthersProvider).toBe('function'); - expect(typeof createEthersSigner).toBe('function'); + expect(typeof createTacoCompatibleProvider).toBe('function'); + expect(typeof createTacoCompatibleSigner).toBe('function'); expect(typeof createEthersFromViem).toBe('function'); }); }); - describe('createEthersProvider', () => { + describe('createTacoCompatibleProvider', () => { it('should create a provider from viem client', async () => { const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), @@ -31,7 +31,7 @@ describe('viem wrapper utilities', () => { getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), } as any; - const provider = await createEthersProvider(mockViemPublicClient); + const provider = await createTacoCompatibleProvider(mockViemPublicClient); expect(provider).toBeDefined(); expect(provider.getNetwork).toBeDefined(); @@ -43,7 +43,7 @@ describe('viem wrapper utilities', () => { }); }); - describe('createEthersSigner', () => { + describe('createTacoCompatibleSigner', () => { it('should create a signer from viem account', async () => { const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', @@ -55,7 +55,7 @@ describe('viem wrapper utilities', () => { getNetwork: vi.fn().mockResolvedValue({ chainId: 80002 }), } as any; - const signer = await createEthersSigner(mockViemAccount, mockProvider); + const signer = await createTacoCompatibleSigner(mockViemAccount, mockProvider); expect(signer).toBeDefined(); expect(signer.getAddress).toBeDefined(); @@ -111,11 +111,11 @@ describe('viem wrapper utilities', () => { describe('error handling', () => { it('should handle missing viem gracefully', () => { // This test verifies that the functions exist and are callable - expect(createEthersProvider).toBeDefined(); - expect(createEthersSigner).toBeDefined(); + expect(createTacoCompatibleProvider).toBeDefined(); + expect(createTacoCompatibleSigner).toBeDefined(); expect(createEthersFromViem).toBeDefined(); - expect(typeof createEthersProvider).toBe('function'); - expect(typeof createEthersSigner).toBe('function'); + expect(typeof createTacoCompatibleProvider).toBe('function'); + expect(typeof createTacoCompatibleSigner).toBe('function'); expect(typeof createEthersFromViem).toBe('function'); }); }); diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-taco.test.ts similarity index 85% rename from packages/taco/test/viem-unit.test.ts rename to packages/taco/test/viem-taco.test.ts index ddff267d4..a9c5b057f 100644 --- a/packages/taco/test/viem-unit.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -21,11 +21,7 @@ import { beforeAll, describe, expect, it, vi } from 'vitest'; import { conditions, domains, toBytes } from '../src'; import { ConditionContext } from '../src/conditions/context'; import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; -import { - createEthersFromViem, - createEthersProvider, - createEthersSigner, -} from '../src/wrappers/viem-wrappers'; + import { fakeDkgRitual, @@ -43,27 +39,21 @@ const ownsNFT = new conditions.predefined.erc721.ERC721Ownership({ chain: TEST_CHAIN_ID, }); -describe('viem unit tests', () => { +describe('viem TACo integration', () => { beforeAll(async () => { await initialize(); }); - describe('viem availability checks', () => { - it('should check if viem functions are exported', () => { + describe('viem TACo functions', () => { + it('should export viem TACo integration functions', () => { expect(encryptWithViem).toBeDefined(); expect(decryptWithViem).toBeDefined(); expect(typeof encryptWithViem).toBe('function'); expect(typeof decryptWithViem).toBe('function'); }); - - it('should check if wrapper functions exist', () => { - expect(createEthersProvider).toBeDefined(); - expect(createEthersSigner).toBeDefined(); - expect(createEthersFromViem).toBeDefined(); - }); }); - describe('viem encrypt/decrypt with mocked adapters', () => { + describe('TACo encryption workflow', () => { it('encrypts and decrypts using viem functions', async () => { const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); const mockedDkgRitual = fakeDkgRitual(mockedDkg); @@ -100,16 +90,16 @@ describe('viem unit tests', () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; - const createEthersProviderSpy = vi + const createTacoCompatibleProviderSpy = vi .spyOn( - await import('../src/wrappers/viem-wrappers'), - 'createEthersProvider', + await import('../src/wrappers/viem-adapters'), + 'createTacoCompatibleProvider', ) .mockResolvedValue(mockViemProvider); - const createEthersSignerSpy = vi + const createTacoCompatibleSignerSpy = vi .spyOn( - await import('../src/wrappers/viem-wrappers'), - 'createEthersSigner', + await import('../src/wrappers/viem-adapters'), + 'createTacoCompatibleSigner', ) .mockResolvedValue(typedSigner); @@ -125,10 +115,10 @@ describe('viem unit tests', () => { mockViemAccount, ); - expect(createEthersProviderSpy).toHaveBeenCalledWith( + expect(createTacoCompatibleProviderSpy).toHaveBeenCalledWith( mockViemPublicClient, ); - expect(createEthersSignerSpy).toHaveBeenCalledWith( + expect(createTacoCompatibleSignerSpy).toHaveBeenCalledWith( mockViemAccount, mockViemProvider, ); @@ -188,8 +178,8 @@ describe('viem unit tests', () => { expect(decryptSpy).toHaveBeenCalled(); // Clean up spies - createEthersProviderSpy.mockRestore(); - createEthersSignerSpy.mockRestore(); + createTacoCompatibleProviderSpy.mockRestore(); + createTacoCompatibleSignerSpy.mockRestore(); }); it('decrypts without optional parameters', async () => { From aefbe1cfdee2c9ea9e1bbf7740f6d24d01e55b06 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Sun, 17 Aug 2025 18:44:47 +0200 Subject: [PATCH 13/97] undo formatting and unnecessary changes --- examples/pre/nextjs/next-env.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/pre/nextjs/next-env.d.ts b/examples/pre/nextjs/next-env.d.ts index 1b3be0840..40c3d6809 100644 --- a/examples/pre/nextjs/next-env.d.ts +++ b/examples/pre/nextjs/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. From 0b4accae359072d4f85582a5dcde4f60b92cd485 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Sun, 17 Aug 2025 20:12:15 +0200 Subject: [PATCH 14/97] tiny edits according to review comments --- packages/shared/src/viem-utils.ts | 2 +- .../taco-auth/src/providers/viem/viem-auth-providers.ts | 7 +------ packages/taco/src/viem-taco.ts | 8 +------- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 60bad98bb..47744a9d6 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -80,7 +80,7 @@ export async function checkViemAvailability(): Promise { isViemAvailable = true; } catch (error) { throw new Error( - 'viem is required for viem wrapper functions. Install it with: npm install viem', + 'viem is required for viem wrapper functions. Install it with: npm install viem@^2.0.0', ); } } diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts index f158a940e..b1ef8edf8 100644 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -1,3 +1,4 @@ +import { type Account, type PublicClient } from '@nucypher/shared'; import { ethers } from 'ethers'; import { @@ -10,12 +11,6 @@ import { createTacoCompatibleSigner, } from './viem-adapters'; -// Dynamic viem types (available only when viem is installed) -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type Account = any; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type PublicClient = any; - /** * Viem-compatible EIP4361 authentication provider. * diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index d0353663f..b4f9cc99a 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -1,13 +1,7 @@ import { ThresholdMessageKit } from '@nucypher/nucypher-core'; -import { Domain } from '@nucypher/shared'; +import { type Account, Domain, type PublicClient } from '@nucypher/shared'; import { ethers } from 'ethers'; -// Dynamic viem types (available only when viem is installed) -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type Account = any; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type PublicClient = any; - import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; From 9d78ec16eba71466f004e6fd767cb793b9650780 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 19 Aug 2025 16:48:08 +0200 Subject: [PATCH 15/97] enhance the usage of viem types --- packages/shared/src/viem-utils.ts | 166 ++++++++++++------ .../viem-encrypt-decrypt.test.ts | 5 +- packages/taco/src/viem-taco.ts | 10 +- 3 files changed, 127 insertions(+), 54 deletions(-) diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 47744a9d6..574122e12 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -23,30 +23,89 @@ import { ethers } from 'ethers'; -// Dynamic type definitions for viem objects -// Using 'any' types to avoid compile-time viem dependency -// These will be properly typed when viem is actually imported +// Type helper: Use the real type from 'viem' if available, otherwise fallback to 'any' +// This pattern preserves type safety for consumers who have 'viem' installed, but does not break for others. +// See: https://github.com/microsoft/TypeScript/issues/47663#issuecomment-1367016530 +// Dynamic imports resolve to 'unknown' when module is not available, no compile-time errors occur +type _ViemPublicClient = import('viem').PublicClient; +type _ViemAccount = import('viem').Account; +type _ViemWalletClient = import('viem').WalletClient; +type _ViemBlock = import('viem').Block; +type _ViemTransaction = import('viem').Transaction; +type _ViemTransactionReceipt = import('viem').TransactionReceipt; +type _ViemTypedDataDomain = import('viem').TypedDataDomain; +type _ViemTypedDataParameter = import('viem').TypedDataParameter; +type _ViemTransactionRequest = import('viem').TransactionRequest; /** * Viem PublicClient type for read operations * @see https://viem.sh/docs/clients/public */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type PublicClient = any; - +export type PublicClient = [unknown] extends [_ViemPublicClient] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _ViemPublicClient; /** * Viem Account type for signing operations * @see https://viem.sh/docs/accounts/privateKey */ // eslint-disable-next-line @typescript-eslint/no-explicit-any -export type Account = any; +export type Account = [unknown] extends [_ViemAccount] ? any : _ViemAccount; /** * Viem WalletClient type for wallet operations * @see https://viem.sh/docs/clients/wallet */ +export type WalletClient = [unknown] extends [_ViemWalletClient] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _ViemWalletClient; + +/** + * Viem Block type for block operations + */ // eslint-disable-next-line @typescript-eslint/no-explicit-any -export type WalletClient = any; +export type ViemBlock = [unknown] extends [_ViemBlock] ? any : _ViemBlock; + +/** + * Viem Transaction type for transaction operations + */ +export type ViemTransaction = [unknown] extends [_ViemTransaction] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _ViemTransaction; + +/** + * Viem TransactionReceipt type for transaction receipt operations + */ +export type ViemTransactionReceipt = [unknown] extends [_ViemTransactionReceipt] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _ViemTransactionReceipt; + +/** + * Viem TypedDataDomain type for EIP-712 domain + */ +export type ViemTypedDataDomain = [unknown] extends [_ViemTypedDataDomain] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _ViemTypedDataDomain; + +/** + * Viem TypedDataParameter type for EIP-712 parameters + */ +export type ViemTypedDataParameter = [unknown] extends [_ViemTypedDataParameter] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _ViemTypedDataParameter; + +/** + * Viem TransactionRequest type for transaction requests + */ +export type ViemTransactionRequest = [unknown] extends [_ViemTransactionRequest] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _ViemTransactionRequest; // Internal state for tracking viem availability let isViemAvailable = false; @@ -97,8 +156,7 @@ export abstract class ViemProviderBase { // Ethers.js compatibility properties for contract validation readonly _isProvider: boolean = true; readonly _network: Promise; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly formatter?: any = undefined; + readonly formatter?: undefined = undefined; constructor(viemPublicClient: PublicClient) { this.viemPublicClient = viemPublicClient; @@ -123,22 +181,36 @@ export abstract class ViemProviderBase { address: string, blockTag?: string | number, ): Promise { - let block: bigint | 'latest' | 'pending' | undefined; - if (blockTag === 'latest' || blockTag === 'pending') { - block = blockTag; - } else if (typeof blockTag === 'number') { - block = BigInt(blockTag); - } else if (typeof blockTag === 'string') { - // Handle hex block numbers - block = BigInt(blockTag); + const address_0x = address as `0x${string}`; + let balance: bigint; + + if ( + blockTag === 'latest' || + blockTag === 'pending' || + blockTag === 'earliest' || + blockTag === 'safe' || + blockTag === 'finalized' + ) { + // Use blockTag for predefined string values + balance = await this.viemPublicClient.getBalance({ + address: address_0x, + blockTag: blockTag, + }); + } else if ( + typeof blockTag === 'number' || + (typeof blockTag === 'string' && blockTag.startsWith('0x')) + ) { + // Use blockNumber for hex string values + balance = await this.viemPublicClient.getBalance({ + address: address_0x, + blockNumber: BigInt(blockTag), + }); } else { - block = undefined; // Latest + // Default case (undefined or unrecognized) - use latest + balance = await this.viemPublicClient.getBalance({ + address: address_0x, + }); } - - const balance = await this.viemPublicClient.getBalance({ - address: address as `0x${string}`, - blockNumber: block, - }); return ethers.BigNumber.from(balance.toString()); } @@ -156,16 +228,14 @@ export abstract class ViemProviderBase { address: string, // eslint-disable-next-line @typescript-eslint/no-unused-vars _blockTag?: string | number, - ): Promise { + ): Promise<`0x${string}` | undefined> { return await this.viemPublicClient.getCode({ address: address as `0x${string}`, }); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any async call( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - transaction: any, + transaction: ethers.providers.TransactionRequest, // eslint-disable-next-line @typescript-eslint/no-unused-vars _blockTag?: string | number, ): Promise { @@ -202,8 +272,7 @@ export abstract class ViemProviderBase { return ethers.BigNumber.from(gasPrice.toString()); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getBlock(blockHashOrBlockTag: string | number): Promise { + async getBlock(blockHashOrBlockTag: string | number): Promise { if ( typeof blockHashOrBlockTag === 'string' && blockHashOrBlockTag.startsWith('0x') @@ -218,22 +287,23 @@ export abstract class ViemProviderBase { } } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getTransaction(transactionHash: string): Promise { + async getTransaction(transactionHash: string): Promise { return await this.viemPublicClient.getTransaction({ hash: transactionHash as `0x${string}`, }); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async getTransactionReceipt(transactionHash: string): Promise { + async getTransactionReceipt( + transactionHash: string, + ): Promise { return await this.viemPublicClient.getTransactionReceipt({ hash: transactionHash as `0x${string}`, }); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async waitForTransaction(transactionHash: string): Promise { + async waitForTransaction( + transactionHash: string, + ): Promise { return await this.viemPublicClient.waitForTransactionReceipt({ hash: transactionHash as `0x${string}`, }); @@ -242,7 +312,7 @@ export abstract class ViemProviderBase { async getFeeData(): Promise { const feeData = await this.viemPublicClient.getFeeHistory({ blockCount: 4, - blockNumber: 'latest' as const, + blockTag: 'latest' as const, rewardPercentiles: [25, 50, 75], }); // Use the latest base fee and priority fee @@ -303,6 +373,9 @@ export abstract class ViemSignerBase { async signMessage(message: string | Uint8Array): Promise { await checkViemAvailability(); + if (!this.viemAccount.signMessage) { + throw new Error('Account does not support message signing'); + } // Convert message to hex if it's Uint8Array for compatibility const messageToSign = typeof message === 'string' ? message : ethers.utils.hexlify(message); @@ -329,14 +402,10 @@ export abstract class ViemSignerBase { return await this.provider.call(transaction); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any async signTypedData( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - domain: any, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - types: Record, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - message: Record, + domain: ViemTypedDataDomain, + types: Record, + message: Record, ): Promise { await checkViemAvailability(); if (!this.viemAccount.signTypedData) { @@ -352,18 +421,15 @@ export abstract class ViemSignerBase { }); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any async signTransaction( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - transaction: any, + transaction: ethers.providers.TransactionRequest, ): Promise { await checkViemAvailability(); if (!this.viemAccount.signTransaction) { throw new Error('Account does not support transaction signing'); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const viemTx: any = { + const viemTx = { to: transaction.to as `0x${string}`, value: transaction.value ? BigInt(transaction.value.toString()) @@ -376,7 +442,7 @@ export abstract class ViemSignerBase { ? BigInt(transaction.gasPrice.toString()) : undefined, nonce: transaction.nonce ? Number(transaction.nonce) : undefined, - }; + } as const; return await this.viemAccount.signTransaction(viemTx); } diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts index 2ac5312c7..e9375718b 100644 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -1,6 +1,7 @@ import { beforeAll, describe, expect, test } from 'vitest'; import { fromBytes, toBytes } from '@nucypher/shared'; +import { PublicClient, WalletClient } from '@nucypher/shared/src/viem-utils'; import { USER_ADDRESS_PARAM_DEFAULT, ViemEIP4361AuthProvider, @@ -33,8 +34,8 @@ const consumerAccount = privateKeyToAccount( describe.skipIf(!process.env.RUNNING_IN_CI)( 'Viem Encrypt/Decrypt Integration Test', () => { - let viemPublicClient: any; - let viemWalletClient: any; + let viemPublicClient: PublicClient; + let viemWalletClient: WalletClient; beforeAll(async () => { // Create viem clients diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index b4f9cc99a..6717c5990 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -5,7 +5,10 @@ import { ethers } from 'ethers'; import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; -import { createTacoCompatibleProvider, createTacoCompatibleSigner } from './wrappers'; +import { + createTacoCompatibleProvider, + createTacoCompatibleSigner, +} from './wrappers'; /** * Encrypts a message under given conditions using viem clients. @@ -59,7 +62,10 @@ export const encryptWithViem = async ( ): Promise => { // Create TACo-compatible provider and signer from viem objects const tacoProvider = await createTacoCompatibleProvider(viemPublicClient); - const tacoSigner = await createTacoCompatibleSigner(viemAuthSigner, tacoProvider); + const tacoSigner = await createTacoCompatibleSigner( + viemAuthSigner, + tacoProvider, + ); // Use the existing ethers-based encrypt function with type assertions // Our interfaces provide all the methods that the TACo SDK actually uses From b71fe9aa4a76be428e1bd4ae73f4a768390a0326 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 25 Aug 2025 11:37:57 +0200 Subject: [PATCH 16/97] use function overloading for viem objects instead of different names --- packages/taco/README.md | 54 ++++++-- packages/taco/VIEM_SUPPORT.md | 108 ++++++++++++---- .../viem-encrypt-decrypt.test.ts | 14 +-- packages/taco/src/encrypt-decrypt.ts | 117 ++++++++++++++++++ packages/taco/src/index.ts | 6 +- packages/taco/src/viem-taco.ts | 13 +- packages/taco/test/viem-taco.test.ts | 22 ++-- 7 files changed, 270 insertions(+), 64 deletions(-) create mode 100644 packages/taco/src/encrypt-decrypt.ts diff --git a/packages/taco/README.md b/packages/taco/README.md index afd7ba6f0..7378f3e96 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -66,16 +66,20 @@ const decryptedMessage = await decrypt( ## Viem Support -The TACo SDK also supports [viem](https://viem.sh) as an alternative to ethers.js: +The TACo SDK supports both [ethers.js](https://docs.ethers.org/) natively, and [viem](https://viem.sh) through function overloads. The same `encrypt` and `decrypt` functions work with both libraries: ```bash $ yarn add @nucypher/taco viem ``` ```typescript -import { encryptWithViem, decryptWithViem } from '@nucypher/taco'; +import { encrypt, decrypt, conditions, domains, initialize } from '@nucypher/taco'; import { createPublicClient, http } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; +import { polygonAmoy } from 'viem/chains'; + +// Initialize TACo +await initialize(); const viemClient = createPublicClient({ chain: polygonAmoy, @@ -83,24 +87,56 @@ const viemClient = createPublicClient({ }); const viemAccount = privateKeyToAccount('0x...'); -// Encrypt with viem -const messageKit = await encryptWithViem( - viemClient, - 'testnet', +const ownsNFT = new conditions.predefined.ERC721Ownership({ + contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', + parameters: [3591], + chain: 5, +}); + +// Same function names work with viem - TypeScript automatically selects the right overload +const messageKit = await encrypt( + viemClient, // viem PublicClient + domains.TESTNET, 'my secret message', ownsNFT, ritualId, - viemAccount, + viemAccount, // viem Account ); // Decrypt with viem -const decryptedMessage = await decryptWithViem( +const decryptedMessage = await decrypt( viemClient, - 'testnet', + domains.TESTNET, messageKit, ); ``` +### Automatic Library Detection + +TypeScript automatically detects which library you're using based on the parameter types: + +```typescript +// Using ethers.js - automatically uses ethers implementation +const ethersEncrypted = await encrypt( + ethersProvider, // ethers.providers.Provider + domains.TESTNET, + message, + condition, + ritualId, + ethersSigner // ethers.Signer +); + +// Using viem - automatically uses viem implementation +const viemEncrypted = await encrypt( + viemPublicClient, // viem PublicClient + domains.TESTNET, + message, + condition, + ritualId, + viemAccount // viem Account +); +``` + For detailed viem documentation, see [VIEM_SUPPORT.md](./VIEM_SUPPORT.md). ## Learn more diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index 3a7af254d..fee03dfad 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -1,7 +1,6 @@ # Viem Support -The TACo SDK supports [viem](https://viem.sh) for encryption and decryption -operations. +The TACo SDK provides unified `encrypt` and `decrypt` functions that work seamlessly with both [ethers.js](https://docs.ethers.org/) and [viem](https://viem.sh) through TypeScript function overloads. The same function names automatically detect which library you're using based on parameter types. ## Installation @@ -19,14 +18,18 @@ If you need viem-compatible authentication providers (like `ViemEIP4361AuthProvi npm install @nucypher/taco-auth viem ``` -## Sample Usage +## Function Overloads + +The same `encrypt` and `decrypt` functions work with both ethers.js and viem. TypeScript automatically selects the correct implementation based on your parameter types: ```typescript +import { encrypt, decrypt, conditions, domains, initialize } from '@nucypher/taco'; import { createPublicClient, http } from 'viem'; import { polygonAmoy } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; -import { encryptWithViem, decryptWithViem } from '@nucypher/taco'; -import * as conditions from '@nucypher/taco/conditions'; + +// Initialize TACo +await initialize(); // Create viem client const viemPublicClient = createPublicClient({ @@ -37,11 +40,9 @@ const viemPublicClient = createPublicClient({ const viemAccount = privateKeyToAccount('0x...'); // Create access condition -const condition = conditions.predefined.erc20Balance({ +const condition = new conditions.predefined.erc20.ERC20Balance({ contractAddress: '0x...', - standardContractType: 'ERC20', chain: 80002, - method: 'balanceOf', parameters: [':userAddress'], returnValueTest: { comparator: '>', @@ -49,52 +50,107 @@ const condition = conditions.predefined.erc20Balance({ }, }); -// Encrypt a message -const encryptedKit = await encryptWithViem( - viemPublicClient, - 'lynx', +// Same function names work with viem - TypeScript automatically detects the right overload +const encryptedKit = await encrypt( + viemPublicClient, // viem PublicClient - TypeScript detects this + domains.DEVNET, // or 'lynx' 'Hello, secret!', condition, 27, // ritual ID - viemAccount, + viemAccount, // viem Account - TypeScript detects this ); -// Decrypt the message -const decryptedMessage = await decryptWithViem( +// Same decrypt function works with viem +const decryptedMessage = await decrypt( viemPublicClient, - 'lynx', + domains.DEVNET, encryptedKit, ); console.log(new TextDecoder().decode(decryptedMessage)); // "Hello, secret!" ``` -### Viem-Compatible Functions +## Automatic Library Detection -#### `encryptWithViem(viemPublicClient, domain, message, condition, ritualId, viemAccount)` +The overload system automatically detects which library you're using: -Encrypts a message using viem objects. +```typescript +import { encrypt, decrypt, domains } from '@nucypher/taco'; +import { ethers } from 'ethers'; +import { createPublicClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; +// Using ethers.js - automatically uses ethers implementation +const ethersEncrypted = await encrypt( + ethersProvider, // ethers.providers.Provider + domains.TESTNET, + message, + condition, + ritualId, + ethersSigner // ethers.Signer +); + +// Using viem - automatically uses viem implementation +const viemEncrypted = await encrypt( + viemPublicClient, // viem PublicClient + domains.TESTNET, + message, + condition, + ritualId, + viemAccount // viem Account +); + +// Both return the same ThresholdMessageKit type +// Both can be decrypted with either library +``` + +## Function Signatures + +The overloaded functions support both ethers.js and viem parameter types: + +### `encrypt()` - Viem Overload + +```typescript +function encrypt( + viemPublicClient: PublicClient, + domain: Domain, + message: Uint8Array | string, + condition: Condition, + ritualId: number, + viemAuthSigner: Account, +): Promise +``` + +**Parameters:** - `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations -- `domain`: `Domain` - TACo domain ('lynx', 'TESTNET', 'MAINNET') +- `domain`: `Domain` - TACo domain ('lynx', 'tapir', 'mainnet') - `message`: `Uint8Array | string` - Message to encrypt - `condition`: `Condition` - Access condition for decryption - `ritualId`: `number` - DKG ritual ID -- `viemAccount`: `Account` - Viem account for signing +- `viemAuthSigner`: `Account` - Viem account for signing -Returns: `Promise` +**Returns:** `Promise` -#### `decryptWithViem(viemPublicClient, domain, messageKit, context?, porterUris?)` +### `decrypt()` - Viem Overload -Decrypts a message using viem objects. +```typescript +function decrypt( + viemPublicClient: PublicClient, + domain: Domain, + messageKit: ThresholdMessageKit, + context?: ConditionContext, + porterUris?: string[], +): Promise +``` +**Parameters:** - `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations - `domain`: `Domain` - TACo domain - `messageKit`: `ThresholdMessageKit` - Encrypted message kit - `context?`: `ConditionContext` - Optional context for conditions - `porterUris?`: `string[]` - Optional Porter service URIs -Returns: `Promise` +**Returns:** `Promise` ## Viem Authentication Providers @@ -144,7 +200,7 @@ const authSignature = await authProvider.getOrCreateAuthSignature(); ### @nucypher/taco - **Purpose**: Core encryption and decryption functionality -- **Viem Functions**: `encryptWithViem()`, `decryptWithViem()` +- **Viem Functions**: `encrypt()`, `decrypt()` (automatic overload detection) - **Dependencies**: Only viem functions for encryption operations ### @nucypher/taco-auth diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts index e9375718b..f9d24ea0d 100644 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -11,7 +11,7 @@ import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; import { conditions, initialize, ThresholdMessageKit } from '../src'; import { CompoundCondition } from '../src/conditions/compound-condition'; -import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; +import { decrypt, encrypt } from '../src/viem-taco'; import { UINT256_MAX } from '../test/test-utils'; const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; @@ -97,7 +97,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( ]); // Encrypt message using viem - const messageKit = await encryptWithViem( + const messageKit = await encrypt( viemPublicClient, DOMAIN, message, @@ -133,7 +133,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( } // Decrypt message using viem - const decryptedBytes = await decryptWithViem( + const decryptedBytes = await decrypt( viemPublicClient, DOMAIN, messageKitFromBytes, @@ -162,7 +162,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( }); // Encrypt message with viem using simple condition - const messageKit = await encryptWithViem( + const messageKit = await encrypt( viemPublicClient, DOMAIN, message, @@ -191,7 +191,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( ); // Decrypt message using viem - const decryptedBytes = await decryptWithViem( + const decryptedBytes = await decrypt( viemPublicClient, DOMAIN, messageKitFromBytes, @@ -220,7 +220,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( }); // Test encryption with viem account - const messageKit = await encryptWithViem( + const messageKit = await encrypt( viemPublicClient, DOMAIN, message, @@ -255,7 +255,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( ); // Decrypt using the different client - const decryptedBytes = await decryptWithViem( + const decryptedBytes = await decrypt( anotherViemPublicClient, DOMAIN, messageKitFromBytes, diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts new file mode 100644 index 000000000..0952509c2 --- /dev/null +++ b/packages/taco/src/encrypt-decrypt.ts @@ -0,0 +1,117 @@ +import { ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { type Account, Domain, type PublicClient } from '@nucypher/shared'; +import { ethers } from 'ethers'; + +import { Condition } from './conditions/condition'; +import { ConditionContext } from './conditions/context'; +import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; +import { decrypt as viemDecrypt, encrypt as viemEncrypt } from './viem-taco'; + +// Function overloads for encrypt +export function encrypt( + provider: ethers.providers.Provider, + domain: Domain, + message: Uint8Array | string, + condition: Condition, + ritualId: number, + authSigner: ethers.Signer, +): Promise; + +export function encrypt( + viemPublicClient: PublicClient, + domain: Domain, + message: Uint8Array | string, + condition: Condition, + ritualId: number, + viemAuthSigner: Account, +): Promise; + +// Implementation that routes to the appropriate function +export async function encrypt( + providerOrClient: ethers.providers.Provider | PublicClient, + domain: Domain, + message: Uint8Array | string, + condition: Condition, + ritualId: number, + signerOrAccount: ethers.Signer | Account, +): Promise { + // Type guard to determine if we're using viem or ethers + if (isViemClient(providerOrClient)) { + return viemEncrypt( + providerOrClient as PublicClient, + domain, + message, + condition, + ritualId, + signerOrAccount as Account, + ); + } else { + return ethersEncrypt( + providerOrClient as ethers.providers.Provider, + domain, + message, + condition, + ritualId, + signerOrAccount as ethers.Signer, + ); + } +} + +// Function overloads for decrypt +export function decrypt( + provider: ethers.providers.Provider, + domain: Domain, + messageKit: ThresholdMessageKit, + context?: ConditionContext, + porterUris?: string[], +): Promise; + +export function decrypt( + viemPublicClient: PublicClient, + domain: Domain, + messageKit: ThresholdMessageKit, + context?: ConditionContext, + porterUris?: string[], +): Promise; + +// Implementation that routes to the appropriate function +export async function decrypt( + providerOrClient: ethers.providers.Provider | PublicClient, + domain: Domain, + messageKit: ThresholdMessageKit, + context?: ConditionContext, + porterUris?: string[], +): Promise { + // Type guard to determine if we're using viem or ethers + if (isViemClient(providerOrClient)) { + return viemDecrypt( + providerOrClient as PublicClient, + domain, + messageKit, + context, + porterUris, + ); + } else { + return ethersDecrypt( + providerOrClient as ethers.providers.Provider, + domain, + messageKit, + context, + porterUris, + ); + } +} + +// Type guard to determine if the client is a viem PublicClient +function isViemClient( + client: ethers.providers.Provider | PublicClient, +): client is PublicClient { + // Viem clients have a 'mode' property and 'chain' property + return ( + typeof client === 'object' && + client !== null && + 'mode' in client && + 'chain' in client && + !('provider' in client) // ethers providers have this + ); +} diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 10e26035f..5ef4fc7d9 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -11,7 +11,5 @@ export { export * as conditions from './conditions'; -export { decrypt, encrypt, encryptWithPublicKey } from './taco'; - -// Viem-compatible functions -export { decryptWithViem, encryptWithViem } from './viem-taco'; +export { decrypt, encrypt } from './encrypt-decrypt'; +export { encryptWithPublicKey } from './taco'; diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index 6717c5990..a4da17665 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -13,7 +13,7 @@ import { /** * Encrypts a message under given conditions using viem clients. * - * This is a viem-compatible version of the encrypt function that accepts viem clients + * This is a viem-compatible overload of the encrypt function that accepts viem clients * instead of ethers providers and signers. * * @export @@ -42,7 +42,7 @@ import { * * const viemAuthSigner = privateKeyToAccount('0x...'); * - * const encrypted = await encryptWithViem( + * const encrypted = await encrypt( * viemPublicClient, // Your viem public client * 'lynx', // TACo domain * 'Hello, secret!', // Message to encrypt @@ -52,7 +52,7 @@ import { * ); * ``` */ -export const encryptWithViem = async ( +export const encrypt = async ( viemPublicClient: PublicClient, domain: Domain, message: Uint8Array | string, @@ -82,7 +82,7 @@ export const encryptWithViem = async ( /** * Decrypts an encrypted message using viem clients. * - * This is a viem-compatible version of the decrypt function that accepts viem clients + * This is a viem-compatible overload of the decrypt function that accepts viem clients * instead of ethers providers. * * @export @@ -106,7 +106,7 @@ export const encryptWithViem = async ( * transport: http() * }); * - * const decrypted = await decryptWithViem( + * const decrypted = await decrypt( * viemPublicClient, * 'lynx', * messageKit, @@ -115,8 +115,7 @@ export const encryptWithViem = async ( * * ``` */ - -export const decryptWithViem = async ( +export const decrypt = async ( viemPublicClient: PublicClient, domain: Domain, messageKit: ThresholdMessageKit, diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index a9c5b057f..183a3ca23 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -20,7 +20,7 @@ import { beforeAll, describe, expect, it, vi } from 'vitest'; import { conditions, domains, toBytes } from '../src'; import { ConditionContext } from '../src/conditions/context'; -import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; +import { decrypt, encrypt } from '../src/viem-taco'; import { @@ -46,10 +46,10 @@ describe('viem TACo integration', () => { describe('viem TACo functions', () => { it('should export viem TACo integration functions', () => { - expect(encryptWithViem).toBeDefined(); - expect(decryptWithViem).toBeDefined(); - expect(typeof encryptWithViem).toBe('function'); - expect(typeof decryptWithViem).toBe('function'); + expect(encrypt).toBeDefined(); + expect(decrypt).toBeDefined(); + expect(typeof encrypt).toBe('function'); + expect(typeof decrypt).toBe('function'); }); }); @@ -106,7 +106,7 @@ describe('viem TACo integration', () => { const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); // Test encryption - const messageKit = await encryptWithViem( + const messageKit = await encrypt( mockViemPublicClient, domains.DEVNET, message, @@ -162,7 +162,7 @@ describe('viem TACo integration', () => { ); // Test decryption - const decryptedMessage = await decryptWithViem( + const decryptedMessage = await decrypt( mockViemPublicClient, domains.DEVNET, messageKit, @@ -184,15 +184,15 @@ describe('viem TACo integration', () => { it('decrypts without optional parameters', async () => { // This test just verifies the function exists and has the right signature - expect(decryptWithViem).toBeDefined(); - expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? + expect(decrypt).toBeDefined(); + expect(decrypt.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? }); }, 10000); describe('function signatures', () => { it('should have correct function signatures', () => { - expect(encryptWithViem.length).toBe(6); // viemPublicClient, domain, message, condition, ritualId, viemAccount - expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? + expect(encrypt.length).toBe(6); // viemPublicClient, domain, message, condition, ritualId, viemAccount + expect(decrypt.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? }); }); }); From f61b212422b350e8f0676cb51f8d832da9104eba Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 26 Aug 2025 10:07:19 +0200 Subject: [PATCH 17/97] add viem auth provider to the list of provider types --- packages/taco/src/conditions/context/context.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/taco/src/conditions/context/context.ts b/packages/taco/src/conditions/context/context.ts index c22993ac8..e52e21acd 100644 --- a/packages/taco/src/conditions/context/context.ts +++ b/packages/taco/src/conditions/context/context.ts @@ -6,6 +6,7 @@ import { EIP4361AuthProvider, SingleSignOnEIP4361AuthProvider, USER_ADDRESS_PARAM_DEFAULT, + ViemEIP4361AuthProvider, } from '@nucypher/taco-auth'; import { CoreConditions, CoreContext } from '../../types'; @@ -45,13 +46,15 @@ const ERR_AUTH_PROVIDER_NOT_NEEDED_FOR_CONTEXT_PARAM = (param: string) => type AuthProviderType = | typeof EIP4361AuthProvider | typeof EIP1271AuthProvider - | typeof SingleSignOnEIP4361AuthProvider; + | typeof SingleSignOnEIP4361AuthProvider + | typeof ViemEIP4361AuthProvider; const EXPECTED_AUTH_PROVIDER_TYPES: Record = { [USER_ADDRESS_PARAM_DEFAULT]: [ EIP4361AuthProvider, EIP1271AuthProvider, SingleSignOnEIP4361AuthProvider, + ViemEIP4361AuthProvider, ], }; From f0c284e773f5c9ffb86fcb641142160de22b94d7 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 26 Aug 2025 11:12:57 +0200 Subject: [PATCH 18/97] enhance viem check and logging a bit --- packages/taco/src/encrypt-decrypt.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts index 0952509c2..99007ac75 100644 --- a/packages/taco/src/encrypt-decrypt.ts +++ b/packages/taco/src/encrypt-decrypt.ts @@ -37,6 +37,9 @@ export async function encrypt( ): Promise { // Type guard to determine if we're using viem or ethers if (isViemClient(providerOrClient)) { + console.trace( + 'viem encrypt function will be used as viem client has been detected', + ); return viemEncrypt( providerOrClient as PublicClient, domain, @@ -46,6 +49,9 @@ export async function encrypt( signerOrAccount as Account, ); } else { + console.trace( + 'ethers encrypt function will be used as viem client has not been detected', + ); return ethersEncrypt( providerOrClient as ethers.providers.Provider, domain, @@ -84,6 +90,9 @@ export async function decrypt( ): Promise { // Type guard to determine if we're using viem or ethers if (isViemClient(providerOrClient)) { + console.trace( + 'viem decrypt function will be used as viem client has been detected', + ); return viemDecrypt( providerOrClient as PublicClient, domain, @@ -92,6 +101,9 @@ export async function decrypt( porterUris, ); } else { + console.trace( + 'ethers decrypt function will be used as viem client has not been detected', + ); return ethersDecrypt( providerOrClient as ethers.providers.Provider, domain, @@ -106,12 +118,8 @@ export async function decrypt( function isViemClient( client: ethers.providers.Provider | PublicClient, ): client is PublicClient { - // Viem clients have a 'mode' property and 'chain' property + // If it's not an ethers provider, and it has `chain` property, assume it's a viem client return ( - typeof client === 'object' && - client !== null && - 'mode' in client && - 'chain' in client && - !('provider' in client) // ethers providers have this + !(client instanceof ethers.providers.BaseProvider) && 'chain' in client ); } From c41100968c186ae6b31604fd2993aaac7d8adfa0 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 26 Aug 2025 13:18:14 +0200 Subject: [PATCH 19/97] remove unused blockTag parameter from viem provider methods --- packages/shared/src/viem-utils.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 574122e12..0364378c5 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -214,30 +214,29 @@ export abstract class ViemProviderBase { return ethers.BigNumber.from(balance.toString()); } - async getTransactionCount( - address: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise { + /** + * @remarks The _blockTag?: string | number parameter is not used in TACo and so it is not implemented + */ + async getTransactionCount(address: string): Promise { return await this.viemPublicClient.getTransactionCount({ address: address as `0x${string}`, }); } - async getCode( - address: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, - ): Promise<`0x${string}` | undefined> { + /** + * @remarks The _blockTag?: string | number parameter is not used in TACo and so it is not implemented + */ + async getCode(address: string): Promise<`0x${string}` | undefined> { return await this.viemPublicClient.getCode({ address: address as `0x${string}`, }); } + /** + * @remarks The _blockTag?: string | number parameter is not used in TACo and so it is not implemented + */ async call( transaction: ethers.providers.TransactionRequest, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - _blockTag?: string | number, ): Promise { const result = await this.viemPublicClient.call({ to: transaction.to as `0x${string}`, From a8881ff119880e8a0f4033175bd92ef12c916ed2 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:00:22 +0200 Subject: [PATCH 20/97] feat: implement unified TacoProvider/TacoSigner interfaces with viem adapters --- packages/shared/src/index.ts | 1 + packages/shared/src/taco-interfaces.ts | 125 ++++++++++++ packages/shared/src/viem-utils.ts | 83 +------- .../taco-auth/src/providers/viem/index.ts | 2 +- .../src/providers/viem/viem-adapters.ts | 159 +++++++++++++-- .../src/providers/viem/viem-auth-providers.ts | 8 +- packages/taco/src/viem-taco.ts | 27 +-- packages/taco/src/wrappers/index.ts | 6 +- packages/taco/src/wrappers/viem-adapters.ts | 188 ++++++++++++++---- packages/taco/test/viem-adapters.test.ts | 59 +++--- packages/taco/test/viem-taco.test.ts | 16 +- 11 files changed, 489 insertions(+), 185 deletions(-) create mode 100644 packages/shared/src/taco-interfaces.ts diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 78cd11609..13bd0bd87 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,6 +1,7 @@ export * from './contracts'; export * from './porter'; export * from './schemas'; +export * from './taco-interfaces'; export type * from './types'; export * from './utils'; export * from './viem-utils'; diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts new file mode 100644 index 000000000..4b3d7e966 --- /dev/null +++ b/packages/shared/src/taco-interfaces.ts @@ -0,0 +1,125 @@ +import { ethers } from 'ethers'; + +import type { ViemTypedDataDomain, ViemTypedDataParameter } from './viem-utils'; + +/** + * Basic TACo Provider interface + * + * This interface defines the minimal provider contract needed for TACo operations. + * It abstracts away the underlying blockchain library (ethers, viem, etc.) and + * focuses only on the methods that TACo actually uses. + */ +export interface TacoProvider { + /** + * Get network information + */ + getNetwork(): Promise; + + /** + * Make a contract call + */ + call(transaction: ethers.providers.TransactionRequest): Promise; + + /** + * Get the current block number + */ + getBlockNumber(): Promise; + + /** + * Get balance for an address + */ + getBalance(address: string, blockTag?: string | number): Promise; + + /** + * Get transaction count for an address + */ + getTransactionCount(address: string): Promise; + + /** + * Get code at an address + */ + getCode(address: string): Promise; + + /** + * Estimate gas for a transaction + */ + estimateGas(transaction: ethers.providers.TransactionRequest): Promise; + + /** + * Get current gas price + */ + getGasPrice(): Promise; + + /** + * Get fee data for EIP-1559 transactions + */ + getFeeData(): Promise; + + /** + * Resolve ENS name to address + */ + resolveName(name: string): Promise; + + /** + * Lookup ENS name for address + */ + lookupAddress(address: string): Promise; +} + +/** + * Basic TACo Signer interface + * + * This interface defines the minimal signer contract needed for TACo operations. + * It abstracts away the underlying blockchain library (ethers, viem, etc.) and + * focuses only on the methods that TACo actually uses. + */ +export interface TacoSigner { + /** + * The provider associated with this signer + */ + readonly provider: TacoProvider; + + /** + * Get the address of this signer + */ + getAddress(): Promise; + + /** + * Sign a message + */ + signMessage(message: string | Uint8Array): Promise; + + /** + * Sign typed data (EIP-712) + */ + signTypedData( + domain: ViemTypedDataDomain, + types: Record, + message: Record, + ): Promise; + + /** + * Get balance for this signer's address + */ + getBalance(): Promise; + + /** + * Get transaction count for this signer's address + */ + getTransactionCount(): Promise; + + /** + * Estimate gas for a transaction + */ + estimateGas(transaction: ethers.providers.TransactionRequest): Promise; + + /** + * Make a contract call using this signer's address + */ + call(transaction: ethers.providers.TransactionRequest): Promise; + + /** + * Connect this signer to a different provider + */ + connect(provider: TacoProvider): TacoSigner; +} diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 0364378c5..0b902709f 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -31,11 +31,8 @@ type _ViemPublicClient = import('viem').PublicClient; type _ViemAccount = import('viem').Account; type _ViemWalletClient = import('viem').WalletClient; type _ViemBlock = import('viem').Block; -type _ViemTransaction = import('viem').Transaction; -type _ViemTransactionReceipt = import('viem').TransactionReceipt; type _ViemTypedDataDomain = import('viem').TypedDataDomain; type _ViemTypedDataParameter = import('viem').TypedDataParameter; -type _ViemTransactionRequest = import('viem').TransactionRequest; /** * Viem PublicClient type for read operations @@ -67,25 +64,10 @@ export type WalletClient = [unknown] extends [_ViemWalletClient] // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ViemBlock = [unknown] extends [_ViemBlock] ? any : _ViemBlock; -/** - * Viem Transaction type for transaction operations - */ -export type ViemTransaction = [unknown] extends [_ViemTransaction] - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - any - : _ViemTransaction; - -/** - * Viem TransactionReceipt type for transaction receipt operations - */ -export type ViemTransactionReceipt = [unknown] extends [_ViemTransactionReceipt] - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - any - : _ViemTransactionReceipt; - /** * Viem TypedDataDomain type for EIP-712 domain */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any export type ViemTypedDataDomain = [unknown] extends [_ViemTypedDataDomain] ? // eslint-disable-next-line @typescript-eslint/no-explicit-any any @@ -99,14 +81,6 @@ export type ViemTypedDataParameter = [unknown] extends [_ViemTypedDataParameter] any : _ViemTypedDataParameter; -/** - * Viem TransactionRequest type for transaction requests - */ -export type ViemTransactionRequest = [unknown] extends [_ViemTransactionRequest] - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - any - : _ViemTransactionRequest; - // Internal state for tracking viem availability let isViemAvailable = false; @@ -286,28 +260,6 @@ export abstract class ViemProviderBase { } } - async getTransaction(transactionHash: string): Promise { - return await this.viemPublicClient.getTransaction({ - hash: transactionHash as `0x${string}`, - }); - } - - async getTransactionReceipt( - transactionHash: string, - ): Promise { - return await this.viemPublicClient.getTransactionReceipt({ - hash: transactionHash as `0x${string}`, - }); - } - - async waitForTransaction( - transactionHash: string, - ): Promise { - return await this.viemPublicClient.waitForTransactionReceipt({ - hash: transactionHash as `0x${string}`, - }); - } - async getFeeData(): Promise { const feeData = await this.viemPublicClient.getFeeHistory({ blockCount: 4, @@ -360,6 +312,9 @@ export abstract class ViemProviderBase { export abstract class ViemSignerBase { protected viemAccount: Account; public readonly provider: ViemProviderBase; + + // Ethers.js compatibility properties for contract validation + readonly _isSigner: boolean = true; constructor(viemAccount: Account, provider: ViemProviderBase) { this.viemAccount = viemAccount; @@ -420,29 +375,9 @@ export abstract class ViemSignerBase { }); } - async signTransaction( - transaction: ethers.providers.TransactionRequest, - ): Promise { - await checkViemAvailability(); - if (!this.viemAccount.signTransaction) { - throw new Error('Account does not support transaction signing'); - } - - const viemTx = { - to: transaction.to as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - data: transaction.data as `0x${string}`, - gas: transaction.gasLimit - ? BigInt(transaction.gasLimit.toString()) - : undefined, - gasPrice: transaction.gasPrice - ? BigInt(transaction.gasPrice.toString()) - : undefined, - nonce: transaction.nonce ? Number(transaction.nonce) : undefined, - } as const; - - return await this.viemAccount.signTransaction(viemTx); - } + /** + * Connect this signer to a different provider + * This method should be implemented by concrete signer classes + */ + abstract connect(provider: ViemProviderBase): ViemSignerBase; } diff --git a/packages/taco-auth/src/providers/viem/index.ts b/packages/taco-auth/src/providers/viem/index.ts index 7b9e17261..8d9808655 100644 --- a/packages/taco-auth/src/providers/viem/index.ts +++ b/packages/taco-auth/src/providers/viem/index.ts @@ -1,3 +1,3 @@ export { ViemEIP4361AuthProvider } from './viem-auth-providers'; export type { EIP4361AuthProviderParams } from './viem-auth-providers'; -export { createTacoCompatibleProvider, createTacoCompatibleSigner } from './viem-adapters'; +export { createTacoProvider, createTacoSigner } from './viem-adapters'; diff --git a/packages/taco-auth/src/providers/viem/viem-adapters.ts b/packages/taco-auth/src/providers/viem/viem-adapters.ts index 1cb6630ef..bad6ebe3c 100644 --- a/packages/taco-auth/src/providers/viem/viem-adapters.ts +++ b/packages/taco-auth/src/providers/viem/viem-adapters.ts @@ -2,55 +2,174 @@ import { type Account, checkViemAvailability, type PublicClient, + type TacoProvider, + type TacoSigner, ViemProviderBase, ViemSignerBase, } from '@nucypher/shared'; +import { ethers } from 'ethers'; /** - * Minimal provider implementation for auth providers + * Viem adapter for TACo Auth Provider + * + * This adapter implements the TacoProvider interface using viem wrappers + * specifically for authentication operations. */ -class ViemAuthProvider extends ViemProviderBase { +class ViemTacoAuthProviderAdapter implements TacoProvider { + private readonly viemWrapper: ViemProviderBase; + + constructor(viemWrapper: ViemProviderBase) { + this.viemWrapper = viemWrapper; + } + + async getNetwork(): Promise { + return this.viemWrapper.getNetwork(); + } + + async call(transaction: ethers.providers.TransactionRequest): Promise { + return this.viemWrapper.call(transaction); + } + + async getBlockNumber(): Promise { + return this.viemWrapper.getBlockNumber(); + } + + async getBalance(address: string, blockTag?: string | number): Promise { + return this.viemWrapper.getBalance(address, blockTag); + } + + async getTransactionCount(address: string): Promise { + return this.viemWrapper.getTransactionCount(address); + } + + async getCode(address: string): Promise { + return this.viemWrapper.getCode(address); + } + + async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + return this.viemWrapper.estimateGas(transaction); + } + + async getGasPrice(): Promise { + return this.viemWrapper.getGasPrice(); + } + + async getFeeData(): Promise { + return this.viemWrapper.getFeeData(); + } + + async resolveName(name: string): Promise { + return this.viemWrapper.resolveName(name); + } + + async lookupAddress(address: string): Promise { + return this.viemWrapper.lookupAddress(address); + } +} + +/** + * Viem adapter for TACo Auth Signer + * + * This adapter implements the TacoSigner interface using viem wrappers + * specifically for authentication operations. + */ +class ViemTacoAuthSignerAdapter implements TacoSigner { + private readonly viemWrapper: ViemSignerBase; + public readonly provider: TacoProvider; + + constructor(viemWrapper: ViemSignerBase, provider: TacoProvider) { + this.viemWrapper = viemWrapper; + this.provider = provider; + } + + async getAddress() { + return this.viemWrapper.getAddress(); + } + + async signMessage(message: string | Uint8Array) { + return this.viemWrapper.signMessage(message); + } + + async signTypedData( + domain: import('@nucypher/shared').ViemTypedDataDomain, + types: Record, + message: Record, + ): Promise { + return this.viemWrapper.signTypedData(domain, types, message); + } + + async getBalance() { + return this.viemWrapper.getBalance(); + } + + async getTransactionCount() { + return this.viemWrapper.getTransactionCount(); + } + + async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + return this.viemWrapper.estimateGas(transaction); + } + + async call(transaction: ethers.providers.TransactionRequest): Promise { + return this.viemWrapper.call(transaction); + } + + connect(provider: TacoProvider): TacoSigner { + if (!(provider instanceof ViemTacoAuthProviderAdapter)) { + throw new Error('Provider must be a ViemTacoAuthProviderAdapter'); + } + const newViemWrapper = this.viemWrapper.connect(provider['viemWrapper']); + return new ViemTacoAuthSignerAdapter(newViemWrapper, provider); + } +} + +/** + * Concrete viem provider wrapper implementation for auth + */ +class ConcreteViemAuthProvider extends ViemProviderBase { constructor(viemPublicClient: PublicClient) { super(viemPublicClient); } } /** - * Minimal signer implementation for auth providers + * Concrete viem signer wrapper implementation for auth */ -class ViemAuthSigner extends ViemSignerBase { +class ConcreteViemAuthSigner extends ViemSignerBase { constructor(viemAccount: Account, provider: ViemProviderBase) { super(viemAccount, provider); } connect(provider: ViemProviderBase): ViemSignerBase { - return new ViemAuthSigner(this.viemAccount, provider); + return new ConcreteViemAuthSigner(this['viemAccount'], provider); } } /** - * Create a TACo-compatible provider from viem PublicClient - * - * Returns a provider based on ViemProviderBase with all - * the methods needed for TACo authentication providers. + * Create a TACo auth provider adapter from viem PublicClient */ -export async function createTacoCompatibleProvider( +export async function createTacoProvider( viemPublicClient: PublicClient, -): Promise { +): Promise { await checkViemAvailability(); - return new ViemAuthProvider(viemPublicClient); + const viemWrapper = new ConcreteViemAuthProvider(viemPublicClient); + return new ViemTacoAuthProviderAdapter(viemWrapper); } /** - * Create a TACo-compatible signer from viem Account - * - * Returns a signer based on ViemSignerBase with all - * the methods needed for TACo authentication providers. + * Create a TACo auth signer adapter from viem Account */ -export async function createTacoCompatibleSigner( +export async function createTacoSigner( viemAccount: Account, - provider: ViemProviderBase, -): Promise { + provider: TacoProvider, +): Promise { await checkViemAvailability(); - return new ViemAuthSigner(viemAccount, provider); + + if (!(provider instanceof ViemTacoAuthProviderAdapter)) { + throw new Error('Provider must be a ViemTacoAuthProviderAdapter'); + } + + const viemWrapper = new ConcreteViemAuthSigner(viemAccount, provider['viemWrapper']); + return new ViemTacoAuthSignerAdapter(viemWrapper, provider); } + diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts index b1ef8edf8..a502001df 100644 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -7,8 +7,8 @@ import { } from '../eip4361/eip4361'; import { - createTacoCompatibleProvider, - createTacoCompatibleSigner, + createTacoProvider, + createTacoSigner, } from './viem-adapters'; /** @@ -65,8 +65,8 @@ export class ViemEIP4361AuthProvider { options?: EIP4361AuthProviderParams, ): Promise { // Convert viem objects to ethers objects internally - const ethersProvider = await createTacoCompatibleProvider(viemPublicClient); - const ethersSigner = await createTacoCompatibleSigner(viemAccount, ethersProvider); + const ethersProvider = await createTacoProvider(viemPublicClient); + const ethersSigner = await createTacoSigner(viemAccount, ethersProvider); // Create the underlying ethers auth provider // Type assertions are safe here because our TacoProvider/TacoSigner interfaces diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index a4da17665..83e99dfae 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -1,13 +1,17 @@ import { ThresholdMessageKit } from '@nucypher/nucypher-core'; -import { type Account, Domain, type PublicClient } from '@nucypher/shared'; +import { + type Account, + type Domain, + type PublicClient, +} from '@nucypher/shared'; import { ethers } from 'ethers'; import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; import { - createTacoCompatibleProvider, - createTacoCompatibleSigner, + createTacoProvider, + createTacoSigner, } from './wrappers'; /** @@ -60,15 +64,12 @@ export const encrypt = async ( ritualId: number, viemAuthSigner: Account, ): Promise => { - // Create TACo-compatible provider and signer from viem objects - const tacoProvider = await createTacoCompatibleProvider(viemPublicClient); - const tacoSigner = await createTacoCompatibleSigner( - viemAuthSigner, - tacoProvider, - ); + // Create TACo provider and signer adapters from viem objects + const tacoProvider = await createTacoProvider(viemPublicClient); + const tacoSigner = await createTacoSigner(viemAuthSigner, tacoProvider); // Use the existing ethers-based encrypt function with type assertions - // Our interfaces provide all the methods that the TACo SDK actually uses + // Our adapters provide all the methods that the TACo SDK actually uses return await ethersEncrypt( tacoProvider as unknown as ethers.providers.Provider, domain, @@ -122,11 +123,11 @@ export const decrypt = async ( context?: ConditionContext, porterUris?: string[], ): Promise => { - // Create TACo-compatible provider from viem object - const tacoProvider = await createTacoCompatibleProvider(viemPublicClient); + // Create TACo provider adapter from viem object + const tacoProvider = await createTacoProvider(viemPublicClient); // Use the existing ethers-based decrypt function with type assertion - // Our interface provides all the methods that the TACo SDK actually uses + // Our adapter provides all the methods that the TACo SDK actually uses return await ethersDecrypt( tacoProvider as unknown as ethers.providers.Provider, domain, diff --git a/packages/taco/src/wrappers/index.ts b/packages/taco/src/wrappers/index.ts index 06a5ab158..74b319df1 100644 --- a/packages/taco/src/wrappers/index.ts +++ b/packages/taco/src/wrappers/index.ts @@ -1,6 +1,6 @@ // Viem adapter utilities export { - createEthersFromViem, - createTacoCompatibleProvider, - createTacoCompatibleSigner, + createTacoFromViem, + createTacoProvider, + createTacoSigner, } from './viem-adapters'; diff --git a/packages/taco/src/wrappers/viem-adapters.ts b/packages/taco/src/wrappers/viem-adapters.ts index e6bf8204c..301b82a29 100644 --- a/packages/taco/src/wrappers/viem-adapters.ts +++ b/packages/taco/src/wrappers/viem-adapters.ts @@ -2,85 +2,203 @@ import { type Account, checkViemAvailability, type PublicClient, + type TacoProvider, + type TacoSigner, ViemProviderBase, ViemSignerBase, type WalletClient, } from '@nucypher/shared'; +import { ethers } from 'ethers'; /** - * A provider that wraps viem PublicClient for TACo SDK compatibility - * - * This class extends ViemProviderBase and adds ethers.js specific formatting - * for the TACo SDK requirements. + * Viem adapter for TACo Provider + * + * This adapter implements the TacoProvider interface using viem wrappers. + * It bridges the gap between the generic TACo interface and viem-specific implementations. */ -class ViemTacoProvider extends ViemProviderBase { - constructor(viemPublicClient: PublicClient) { - super(viemPublicClient); +class ViemTacoProviderAdapter implements TacoProvider { + private readonly viemWrapper: ViemProviderBase; + + constructor(viemWrapper: ViemProviderBase) { + this.viemWrapper = viemWrapper; + } + + async getNetwork(): Promise { + return this.viemWrapper.getNetwork(); + } + + async call(transaction: ethers.providers.TransactionRequest): Promise { + return this.viemWrapper.call(transaction); + } + + async getBlockNumber(): Promise { + return this.viemWrapper.getBlockNumber(); + } + + async getBalance(address: string, blockTag?: string | number): Promise { + return this.viemWrapper.getBalance(address, blockTag); + } + + async getTransactionCount(address: string): Promise { + return this.viemWrapper.getTransactionCount(address); + } + + async getCode(address: string): Promise { + return this.viemWrapper.getCode(address); + } + + async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + return this.viemWrapper.estimateGas(transaction); + } + + async getGasPrice(): Promise { + return this.viemWrapper.getGasPrice(); + } + + async getFeeData(): Promise { + return this.viemWrapper.getFeeData(); + } + + async resolveName(name: string): Promise { + return this.viemWrapper.resolveName(name); + } + + async lookupAddress(address: string): Promise { + return this.viemWrapper.lookupAddress(address); } } /** - * Create a TACo-compatible provider from viem PublicClient - * - * Returns a provider that implements TacoProvider interface with only - * the methods needed for TACo SDK operations. + * Viem adapter for TACo Signer + * + * This adapter implements the TacoSigner interface using viem wrappers. + * It bridges the gap between the generic TACo interface and viem-specific implementations. */ -export async function createTacoCompatibleProvider( - viemPublicClient: PublicClient, -): Promise { - await checkViemAvailability(); - return new ViemTacoProvider(viemPublicClient); +class ViemTacoSignerAdapter implements TacoSigner { + private readonly viemWrapper: ViemSignerBase; + public readonly provider: TacoProvider; + + constructor(viemWrapper: ViemSignerBase, provider: TacoProvider) { + this.viemWrapper = viemWrapper; + this.provider = provider; + } + + async getAddress(): Promise { + return this.viemWrapper.getAddress(); + } + + async signMessage(message: string | Uint8Array): Promise { + return this.viemWrapper.signMessage(message); + } + + async signTypedData( + domain: import('@nucypher/shared').ViemTypedDataDomain, + types: Record, + message: Record, + ): Promise { + return this.viemWrapper.signTypedData(domain, types, message); + } + + async getBalance(): Promise { + return this.viemWrapper.getBalance(); + } + + async getTransactionCount(): Promise { + return this.viemWrapper.getTransactionCount(); + } + + async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + return this.viemWrapper.estimateGas(transaction); + } + + async call(transaction: ethers.providers.TransactionRequest): Promise { + return this.viemWrapper.call(transaction); + } + + connect(provider: TacoProvider): TacoSigner { + // For viem adapters, we need to create a new signer with the new provider + if (!(provider instanceof ViemTacoProviderAdapter)) { + throw new Error('Provider must be a ViemTacoProviderAdapter'); + } + const newViemWrapper = this.viemWrapper.connect(provider['viemWrapper']); + return new ViemTacoSignerAdapter(newViemWrapper, provider); + } } /** - * A signer that wraps viem Account for TACo SDK compatibility - * - * This class extends ViemSignerBase and adds ethers.js specific formatting - * for the TACo SDK requirements. + * Concrete viem provider wrapper implementation */ -class ViemTacoSigner extends ViemSignerBase { +class ConcreteViemProvider extends ViemProviderBase { + constructor(viemPublicClient: PublicClient) { + super(viemPublicClient); + } +} + +/** + * Concrete viem signer wrapper implementation + */ +class ConcreteViemSigner extends ViemSignerBase { constructor(viemAccount: Account, provider: ViemProviderBase) { super(viemAccount, provider); } connect(provider: ViemProviderBase): ViemSignerBase { - return new ViemTacoSigner(this.viemAccount, provider); + return new ConcreteViemSigner(this['viemAccount'], provider); } } /** - * Create a TACo-compatible signer from viem Account + * Create a TACo provider adapter from viem PublicClient + * + * This function creates a viem wrapper and then wraps it in a TacoProvider adapter. + */ +export async function createTacoProvider( + viemPublicClient: PublicClient, +): Promise { + await checkViemAvailability(); + const viemWrapper = new ConcreteViemProvider(viemPublicClient); + return new ViemTacoProviderAdapter(viemWrapper); +} + +/** + * Create a TACo signer adapter from viem Account * - * Returns a signer that implements TacoSigner interface with only - * the methods needed for TACo SDK operations. + * This function creates a viem wrapper and then wraps it in a TacoSigner adapter. */ -export async function createTacoCompatibleSigner( +export async function createTacoSigner( viemAccount: Account, - provider: ViemProviderBase, -): Promise { + provider: TacoProvider, +): Promise { await checkViemAvailability(); - return new ViemTacoSigner(viemAccount, provider); + + if (!(provider instanceof ViemTacoProviderAdapter)) { + throw new Error('Provider must be a ViemTacoProviderAdapter'); + } + + const viemWrapper = new ConcreteViemSigner(viemAccount, provider['viemWrapper']); + return new ViemTacoSignerAdapter(viemWrapper, provider); } /** - * Convenience function to create both provider and signer from viem clients + * Convenience function to create both provider and signer adapters from viem clients * * @param viemPublicClient - Viem public client for provider functionality * @param viemWalletClient - Viem wallet client for signing functionality - * @returns Object with TACo provider and signer + * @returns Object with TACo provider and signer adapters */ -export async function createEthersFromViem( +export async function createTacoFromViem( viemPublicClient: PublicClient, viemWalletClient: WalletClient, -): Promise<{ provider: ViemProviderBase; signer: ViemSignerBase }> { +): Promise<{ provider: TacoProvider; signer: TacoSigner }> { await checkViemAvailability(); if (!viemWalletClient.account) { throw new Error('Wallet client must have an account attached'); } - const provider = await createTacoCompatibleProvider(viemPublicClient); - const signer = await createTacoCompatibleSigner(viemWalletClient.account, provider); + const provider = await createTacoProvider(viemPublicClient); + const signer = await createTacoSigner(viemWalletClient.account, provider); return { provider, signer }; } + diff --git a/packages/taco/test/viem-adapters.test.ts b/packages/taco/test/viem-adapters.test.ts index ce3f17593..61576c4f3 100644 --- a/packages/taco/test/viem-adapters.test.ts +++ b/packages/taco/test/viem-adapters.test.ts @@ -2,24 +2,24 @@ import { describe, expect, it, vi } from 'vitest'; import { - createEthersFromViem, - createTacoCompatibleProvider, - createTacoCompatibleSigner, + createTacoFromViem, + createTacoProvider, + createTacoSigner, } from '../src/wrappers/viem-adapters'; describe('viem adapter utilities', () => { describe('function exports', () => { it('should export all adapter functions', () => { - expect(createTacoCompatibleProvider).toBeDefined(); - expect(createTacoCompatibleSigner).toBeDefined(); - expect(createEthersFromViem).toBeDefined(); - expect(typeof createTacoCompatibleProvider).toBe('function'); - expect(typeof createTacoCompatibleSigner).toBe('function'); - expect(typeof createEthersFromViem).toBe('function'); + expect(createTacoProvider).toBeDefined(); + expect(createTacoSigner).toBeDefined(); + expect(createTacoFromViem).toBeDefined(); + expect(typeof createTacoProvider).toBe('function'); + expect(typeof createTacoSigner).toBe('function'); + expect(typeof createTacoFromViem).toBe('function'); }); }); - describe('createTacoCompatibleProvider', () => { + describe('createTacoProvider', () => { it('should create a provider from viem client', async () => { const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), @@ -31,7 +31,7 @@ describe('viem adapter utilities', () => { getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), } as any; - const provider = await createTacoCompatibleProvider(mockViemPublicClient); + const provider = await createTacoProvider(mockViemPublicClient); expect(provider).toBeDefined(); expect(provider.getNetwork).toBeDefined(); @@ -43,29 +43,34 @@ describe('viem adapter utilities', () => { }); }); - describe('createTacoCompatibleSigner', () => { + describe('createTacoSigner', () => { it('should create a signer from viem account', async () => { const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn().mockResolvedValue('0xsignature'), - signTransaction: vi.fn().mockResolvedValue('0xsignedtx'), } as any; - const mockProvider = { - getNetwork: vi.fn().mockResolvedValue({ chainId: 80002 }), + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), + call: vi.fn().mockResolvedValue('0x'), + getBalance: vi.fn().mockResolvedValue(BigInt(0)), + getTransactionCount: vi.fn().mockResolvedValue(0), + estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), + getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), } as any; - const signer = await createTacoCompatibleSigner(mockViemAccount, mockProvider); + const tacoProvider = await createTacoProvider(mockViemPublicClient); + const signer = await createTacoSigner(mockViemAccount, tacoProvider); expect(signer).toBeDefined(); expect(signer.getAddress).toBeDefined(); expect(signer.signMessage).toBeDefined(); - expect(signer.signTransaction).toBeDefined(); - expect(signer.provider).toBe(mockProvider); + expect(signer.provider).toBe(tacoProvider); }); }); - describe('createEthersFromViem', () => { + describe('createTacoFromViem', () => { it('should create both provider and signer', async () => { const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), @@ -86,7 +91,7 @@ describe('viem adapter utilities', () => { account: mockViemAccount, } as any; - const { provider, signer } = await createEthersFromViem( + const { provider, signer } = await createTacoFromViem( mockViemPublicClient, mockViemWalletClient, ); @@ -103,7 +108,7 @@ describe('viem adapter utilities', () => { } as any; await expect( - createEthersFromViem(mockViemPublicClient, mockViemWalletClient) + createTacoFromViem(mockViemPublicClient, mockViemWalletClient) ).rejects.toThrow('Wallet client must have an account attached'); }); }); @@ -111,12 +116,12 @@ describe('viem adapter utilities', () => { describe('error handling', () => { it('should handle missing viem gracefully', () => { // This test verifies that the functions exist and are callable - expect(createTacoCompatibleProvider).toBeDefined(); - expect(createTacoCompatibleSigner).toBeDefined(); - expect(createEthersFromViem).toBeDefined(); - expect(typeof createTacoCompatibleProvider).toBe('function'); - expect(typeof createTacoCompatibleSigner).toBe('function'); - expect(typeof createEthersFromViem).toBe('function'); + expect(createTacoProvider).toBeDefined(); + expect(createTacoSigner).toBeDefined(); + expect(createTacoFromViem).toBeDefined(); + expect(typeof createTacoProvider).toBe('function'); + expect(typeof createTacoSigner).toBe('function'); + expect(typeof createTacoFromViem).toBe('function'); }); }); }); diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 183a3ca23..25b8e1b99 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -90,16 +90,16 @@ describe('viem TACo integration', () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; - const createTacoCompatibleProviderSpy = vi + const createTacoProviderSpy = vi .spyOn( await import('../src/wrappers/viem-adapters'), - 'createTacoCompatibleProvider', + 'createTacoProvider', ) .mockResolvedValue(mockViemProvider); - const createTacoCompatibleSignerSpy = vi + const createTacoSignerSpy = vi .spyOn( await import('../src/wrappers/viem-adapters'), - 'createTacoCompatibleSigner', + 'createTacoSigner', ) .mockResolvedValue(typedSigner); @@ -115,10 +115,10 @@ describe('viem TACo integration', () => { mockViemAccount, ); - expect(createTacoCompatibleProviderSpy).toHaveBeenCalledWith( + expect(createTacoProviderSpy).toHaveBeenCalledWith( mockViemPublicClient, ); - expect(createTacoCompatibleSignerSpy).toHaveBeenCalledWith( + expect(createTacoSignerSpy).toHaveBeenCalledWith( mockViemAccount, mockViemProvider, ); @@ -178,8 +178,8 @@ describe('viem TACo integration', () => { expect(decryptSpy).toHaveBeenCalled(); // Clean up spies - createTacoCompatibleProviderSpy.mockRestore(); - createTacoCompatibleSignerSpy.mockRestore(); + createTacoProviderSpy.mockRestore(); + createTacoSignerSpy.mockRestore(); }); it('decrypts without optional parameters', async () => { From d8c27547f9787b1ea167a9cd293a2893ef583cea Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 27 Aug 2025 00:33:14 +0200 Subject: [PATCH 21/97] fix ethers compatibility --- packages/shared/src/taco-interfaces.ts | 33 +++++++++++---- .../src/providers/viem/viem-adapters.ts | 41 ++++++++++++++----- packages/taco/src/wrappers/viem-adapters.ts | 6 +++ 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index 4b3d7e966..b9af46a4d 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -4,12 +4,17 @@ import type { ViemTypedDataDomain, ViemTypedDataParameter } from './viem-utils'; /** * Basic TACo Provider interface - * + * * This interface defines the minimal provider contract needed for TACo operations. - * It abstracts away the underlying blockchain library (ethers, viem, etc.) and + * It abstracts away the underlying blockchain library (ethers, viem, etc.) and * focuses only on the methods that TACo actually uses. */ export interface TacoProvider { + /** + * Ethers.js compatibility property for contract validation + */ + readonly _isProvider: true; + /** * Get network information */ @@ -28,7 +33,10 @@ export interface TacoProvider { /** * Get balance for an address */ - getBalance(address: string, blockTag?: string | number): Promise; + getBalance( + address: string, + blockTag?: string | number, + ): Promise; /** * Get transaction count for an address @@ -43,7 +51,9 @@ export interface TacoProvider { /** * Estimate gas for a transaction */ - estimateGas(transaction: ethers.providers.TransactionRequest): Promise; + estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise; /** * Get current gas price @@ -68,14 +78,19 @@ export interface TacoProvider { /** * Basic TACo Signer interface - * + * * This interface defines the minimal signer contract needed for TACo operations. - * It abstracts away the underlying blockchain library (ethers, viem, etc.) and + * It abstracts away the underlying blockchain library (ethers, viem, etc.) and * focuses only on the methods that TACo actually uses. */ export interface TacoSigner { /** - * The provider associated with this signer + * Ethers.js compatibility property for contract validation + */ + readonly _isSigner: true; + + /** + * The provider this signer is connected to */ readonly provider: TacoProvider; @@ -111,7 +126,9 @@ export interface TacoSigner { /** * Estimate gas for a transaction */ - estimateGas(transaction: ethers.providers.TransactionRequest): Promise; + estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise; /** * Make a contract call using this signer's address diff --git a/packages/taco-auth/src/providers/viem/viem-adapters.ts b/packages/taco-auth/src/providers/viem/viem-adapters.ts index bad6ebe3c..a7836f93c 100644 --- a/packages/taco-auth/src/providers/viem/viem-adapters.ts +++ b/packages/taco-auth/src/providers/viem/viem-adapters.ts @@ -11,13 +11,16 @@ import { ethers } from 'ethers'; /** * Viem adapter for TACo Auth Provider - * + * * This adapter implements the TacoProvider interface using viem wrappers * specifically for authentication operations. */ class ViemTacoAuthProviderAdapter implements TacoProvider { private readonly viemWrapper: ViemProviderBase; + // Ethers.js compatibility property for contract validation + readonly _isProvider = true; + constructor(viemWrapper: ViemProviderBase) { this.viemWrapper = viemWrapper; } @@ -26,7 +29,9 @@ class ViemTacoAuthProviderAdapter implements TacoProvider { return this.viemWrapper.getNetwork(); } - async call(transaction: ethers.providers.TransactionRequest): Promise { + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { return this.viemWrapper.call(transaction); } @@ -34,7 +39,10 @@ class ViemTacoAuthProviderAdapter implements TacoProvider { return this.viemWrapper.getBlockNumber(); } - async getBalance(address: string, blockTag?: string | number): Promise { + async getBalance( + address: string, + blockTag?: string | number, + ): Promise { return this.viemWrapper.getBalance(address, blockTag); } @@ -46,7 +54,9 @@ class ViemTacoAuthProviderAdapter implements TacoProvider { return this.viemWrapper.getCode(address); } - async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { return this.viemWrapper.estimateGas(transaction); } @@ -69,7 +79,7 @@ class ViemTacoAuthProviderAdapter implements TacoProvider { /** * Viem adapter for TACo Auth Signer - * + * * This adapter implements the TacoSigner interface using viem wrappers * specifically for authentication operations. */ @@ -77,6 +87,9 @@ class ViemTacoAuthSignerAdapter implements TacoSigner { private readonly viemWrapper: ViemSignerBase; public readonly provider: TacoProvider; + // Ethers.js compatibility property for contract validation + readonly _isSigner = true; + constructor(viemWrapper: ViemSignerBase, provider: TacoProvider) { this.viemWrapper = viemWrapper; this.provider = provider; @@ -106,11 +119,15 @@ class ViemTacoAuthSignerAdapter implements TacoSigner { return this.viemWrapper.getTransactionCount(); } - async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { return this.viemWrapper.estimateGas(transaction); } - async call(transaction: ethers.providers.TransactionRequest): Promise { + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { return this.viemWrapper.call(transaction); } @@ -164,12 +181,14 @@ export async function createTacoSigner( provider: TacoProvider, ): Promise { await checkViemAvailability(); - + if (!(provider instanceof ViemTacoAuthProviderAdapter)) { throw new Error('Provider must be a ViemTacoAuthProviderAdapter'); } - - const viemWrapper = new ConcreteViemAuthSigner(viemAccount, provider['viemWrapper']); + + const viemWrapper = new ConcreteViemAuthSigner( + viemAccount, + provider['viemWrapper'], + ); return new ViemTacoAuthSignerAdapter(viemWrapper, provider); } - diff --git a/packages/taco/src/wrappers/viem-adapters.ts b/packages/taco/src/wrappers/viem-adapters.ts index 301b82a29..ff7353adc 100644 --- a/packages/taco/src/wrappers/viem-adapters.ts +++ b/packages/taco/src/wrappers/viem-adapters.ts @@ -19,6 +19,9 @@ import { ethers } from 'ethers'; class ViemTacoProviderAdapter implements TacoProvider { private readonly viemWrapper: ViemProviderBase; + // Ethers.js compatibility property for contract validation + readonly _isProvider = true; + constructor(viemWrapper: ViemProviderBase) { this.viemWrapper = viemWrapper; } @@ -78,6 +81,9 @@ class ViemTacoSignerAdapter implements TacoSigner { private readonly viemWrapper: ViemSignerBase; public readonly provider: TacoProvider; + // Ethers.js compatibility property for contract validation + readonly _isSigner = true; + constructor(viemWrapper: ViemSignerBase, provider: TacoProvider) { this.viemWrapper = viemWrapper; this.provider = provider; From 8e473aa8c9f1a591e0df3ff77ee0a3b088ff5f6f Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 27 Aug 2025 17:47:37 +0200 Subject: [PATCH 22/97] few cleanups --- packages/shared/src/viem-utils.ts | 4 +- .../src/providers/viem/viem-adapters.ts | 6 ++- packages/taco/src/wrappers/viem-adapters.ts | 41 +++++++++++++------ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 0b902709f..27b17a3b1 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -127,8 +127,6 @@ export async function checkViemAvailability(): Promise { export abstract class ViemProviderBase { protected viemPublicClient: PublicClient; - // Ethers.js compatibility properties for contract validation - readonly _isProvider: boolean = true; readonly _network: Promise; readonly formatter?: undefined = undefined; @@ -312,7 +310,7 @@ export abstract class ViemProviderBase { export abstract class ViemSignerBase { protected viemAccount: Account; public readonly provider: ViemProviderBase; - + // Ethers.js compatibility properties for contract validation readonly _isSigner: boolean = true; diff --git a/packages/taco-auth/src/providers/viem/viem-adapters.ts b/packages/taco-auth/src/providers/viem/viem-adapters.ts index a7836f93c..71f9e3f9a 100644 --- a/packages/taco-auth/src/providers/viem/viem-adapters.ts +++ b/packages/taco-auth/src/providers/viem/viem-adapters.ts @@ -6,6 +6,8 @@ import { type TacoSigner, ViemProviderBase, ViemSignerBase, + type ViemTypedDataDomain, + type ViemTypedDataParameter, } from '@nucypher/shared'; import { ethers } from 'ethers'; @@ -104,8 +106,8 @@ class ViemTacoAuthSignerAdapter implements TacoSigner { } async signTypedData( - domain: import('@nucypher/shared').ViemTypedDataDomain, - types: Record, + domain: ViemTypedDataDomain, + types: Record, message: Record, ): Promise { return this.viemWrapper.signTypedData(domain, types, message); diff --git a/packages/taco/src/wrappers/viem-adapters.ts b/packages/taco/src/wrappers/viem-adapters.ts index ff7353adc..c1d441185 100644 --- a/packages/taco/src/wrappers/viem-adapters.ts +++ b/packages/taco/src/wrappers/viem-adapters.ts @@ -6,13 +6,15 @@ import { type TacoSigner, ViemProviderBase, ViemSignerBase, + type ViemTypedDataDomain, + type ViemTypedDataParameter, type WalletClient, } from '@nucypher/shared'; import { ethers } from 'ethers'; /** * Viem adapter for TACo Provider - * + * * This adapter implements the TacoProvider interface using viem wrappers. * It bridges the gap between the generic TACo interface and viem-specific implementations. */ @@ -30,7 +32,9 @@ class ViemTacoProviderAdapter implements TacoProvider { return this.viemWrapper.getNetwork(); } - async call(transaction: ethers.providers.TransactionRequest): Promise { + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { return this.viemWrapper.call(transaction); } @@ -38,7 +42,10 @@ class ViemTacoProviderAdapter implements TacoProvider { return this.viemWrapper.getBlockNumber(); } - async getBalance(address: string, blockTag?: string | number): Promise { + async getBalance( + address: string, + blockTag?: string | number, + ): Promise { return this.viemWrapper.getBalance(address, blockTag); } @@ -50,7 +57,9 @@ class ViemTacoProviderAdapter implements TacoProvider { return this.viemWrapper.getCode(address); } - async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { return this.viemWrapper.estimateGas(transaction); } @@ -73,7 +82,7 @@ class ViemTacoProviderAdapter implements TacoProvider { /** * Viem adapter for TACo Signer - * + * * This adapter implements the TacoSigner interface using viem wrappers. * It bridges the gap between the generic TACo interface and viem-specific implementations. */ @@ -98,8 +107,8 @@ class ViemTacoSignerAdapter implements TacoSigner { } async signTypedData( - domain: import('@nucypher/shared').ViemTypedDataDomain, - types: Record, + domain: ViemTypedDataDomain, + types: Record, message: Record, ): Promise { return this.viemWrapper.signTypedData(domain, types, message); @@ -113,11 +122,15 @@ class ViemTacoSignerAdapter implements TacoSigner { return this.viemWrapper.getTransactionCount(); } - async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + async estimateGas( + transaction: ethers.providers.TransactionRequest, + ): Promise { return this.viemWrapper.estimateGas(transaction); } - async call(transaction: ethers.providers.TransactionRequest): Promise { + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { return this.viemWrapper.call(transaction); } @@ -176,12 +189,15 @@ export async function createTacoSigner( provider: TacoProvider, ): Promise { await checkViemAvailability(); - + if (!(provider instanceof ViemTacoProviderAdapter)) { throw new Error('Provider must be a ViemTacoProviderAdapter'); } - - const viemWrapper = new ConcreteViemSigner(viemAccount, provider['viemWrapper']); + + const viemWrapper = new ConcreteViemSigner( + viemAccount, + provider['viemWrapper'], + ); return new ViemTacoSignerAdapter(viemWrapper, provider); } @@ -207,4 +223,3 @@ export async function createTacoFromViem( return { provider, signer }; } - From 84b47f9b833f23ce6264f45a414e9d08c88fc63e Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 27 Aug 2025 18:20:10 +0200 Subject: [PATCH 23/97] tiny touches --- .../src/providers/viem/viem-adapters.ts | 3 ++- packages/taco/src/encrypt-decrypt.ts | 19 ++++++++++++++++--- packages/taco/src/viem-taco.ts | 11 ++--------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/taco-auth/src/providers/viem/viem-adapters.ts b/packages/taco-auth/src/providers/viem/viem-adapters.ts index 71f9e3f9a..c61d1503d 100644 --- a/packages/taco-auth/src/providers/viem/viem-adapters.ts +++ b/packages/taco-auth/src/providers/viem/viem-adapters.ts @@ -87,11 +87,12 @@ class ViemTacoAuthProviderAdapter implements TacoProvider { */ class ViemTacoAuthSignerAdapter implements TacoSigner { private readonly viemWrapper: ViemSignerBase; - public readonly provider: TacoProvider; // Ethers.js compatibility property for contract validation readonly _isSigner = true; + public readonly provider: TacoProvider; + constructor(viemWrapper: ViemSignerBase, provider: TacoProvider) { this.viemWrapper = viemWrapper; this.provider = provider; diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts index 99007ac75..eabb3e6f0 100644 --- a/packages/taco/src/encrypt-decrypt.ts +++ b/packages/taco/src/encrypt-decrypt.ts @@ -118,8 +118,21 @@ export async function decrypt( function isViemClient( client: ethers.providers.Provider | PublicClient, ): client is PublicClient { - // If it's not an ethers provider, and it has `chain` property, assume it's a viem client - return ( - !(client instanceof ethers.providers.BaseProvider) && 'chain' in client + const hasViemProperties = 'chain' in client; + const hasViemMethods = + typeof (client as { getChainId: () => Promise }).getChainId === + 'function'; + const isNotEthersProvider = !( + client instanceof ethers.providers.BaseProvider ); + + console.trace('Viem detection debug:', { + hasViemProperties, + hasViemMethods, + isNotEthersProvider, + clientType: (client as { type: string }).type, + client, + }); + + return isNotEthersProvider && (hasViemProperties || hasViemMethods); } diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index 83e99dfae..8fe9dabef 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -1,18 +1,11 @@ import { ThresholdMessageKit } from '@nucypher/nucypher-core'; -import { - type Account, - type Domain, - type PublicClient, -} from '@nucypher/shared'; +import { type Account, type Domain, type PublicClient } from '@nucypher/shared'; import { ethers } from 'ethers'; import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; -import { - createTacoProvider, - createTacoSigner, -} from './wrappers'; +import { createTacoProvider, createTacoSigner } from './wrappers'; /** * Encrypts a message under given conditions using viem clients. From 70680eeee54978f7a0314f240009b86a614bdb0c Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 28 Aug 2025 19:52:44 +0200 Subject: [PATCH 24/97] reduce few loggings --- packages/taco/src/encrypt-decrypt.ts | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts index eabb3e6f0..89bfd4a2e 100644 --- a/packages/taco/src/encrypt-decrypt.ts +++ b/packages/taco/src/encrypt-decrypt.ts @@ -37,7 +37,7 @@ export async function encrypt( ): Promise { // Type guard to determine if we're using viem or ethers if (isViemClient(providerOrClient)) { - console.trace( + console.debug( 'viem encrypt function will be used as viem client has been detected', ); return viemEncrypt( @@ -49,7 +49,7 @@ export async function encrypt( signerOrAccount as Account, ); } else { - console.trace( + console.debug( 'ethers encrypt function will be used as viem client has not been detected', ); return ethersEncrypt( @@ -90,7 +90,7 @@ export async function decrypt( ): Promise { // Type guard to determine if we're using viem or ethers if (isViemClient(providerOrClient)) { - console.trace( + console.debug( 'viem decrypt function will be used as viem client has been detected', ); return viemDecrypt( @@ -101,7 +101,7 @@ export async function decrypt( porterUris, ); } else { - console.trace( + console.debug( 'ethers decrypt function will be used as viem client has not been detected', ); return ethersDecrypt( @@ -126,13 +126,5 @@ function isViemClient( client instanceof ethers.providers.BaseProvider ); - console.trace('Viem detection debug:', { - hasViemProperties, - hasViemMethods, - isNotEthersProvider, - clientType: (client as { type: string }).type, - client, - }); - return isNotEthersProvider && (hasViemProperties || hasViemMethods); } From 1c0a409ed3ede4a5082cc9329c2a7c7f0b2e6b57 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 1 Sep 2025 15:15:02 +0200 Subject: [PATCH 25/97] Apply suggestions from code review Co-authored-by: Manuel Montenegro --- packages/shared/src/viem-utils.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 27b17a3b1..756ff68d8 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -187,7 +187,7 @@ export abstract class ViemProviderBase { } /** - * @remarks The _blockTag?: string | number parameter is not used in TACo and so it is not implemented + * @remarks The _blockTag?: string | number parameter is not used in TACo, so it is not implemented */ async getTransactionCount(address: string): Promise { return await this.viemPublicClient.getTransactionCount({ @@ -196,7 +196,7 @@ export abstract class ViemProviderBase { } /** - * @remarks The _blockTag?: string | number parameter is not used in TACo and so it is not implemented + * @remarks The _blockTag?: string | number parameter is not used in TACo, so it is not implemented */ async getCode(address: string): Promise<`0x${string}` | undefined> { return await this.viemPublicClient.getCode({ @@ -205,7 +205,7 @@ export abstract class ViemProviderBase { } /** - * @remarks The _blockTag?: string | number parameter is not used in TACo and so it is not implemented + * @remarks The _blockTag?: string | number parameter is not used in TACo, so it is not implemented */ async call( transaction: ethers.providers.TransactionRequest, From df8d2f9fd64aecdfe267b3fd8e0a694a12723940 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 4 Sep 2025 14:52:54 +0200 Subject: [PATCH 26/97] add provider-signer compatibility validation for mixing viem and ethers types --- packages/taco/src/encrypt-decrypt.ts | 44 +++++++++++++++++++++++ packages/taco/test/taco.test.ts | 52 ++++++++++++++++++++++++++++ packages/taco/test/viem-taco.test.ts | 5 +-- 3 files changed, 97 insertions(+), 4 deletions(-) diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts index 89bfd4a2e..59e5744cb 100644 --- a/packages/taco/src/encrypt-decrypt.ts +++ b/packages/taco/src/encrypt-decrypt.ts @@ -35,6 +35,9 @@ export async function encrypt( ritualId: number, signerOrAccount: ethers.Signer | Account, ): Promise { + // Validate that provider and signer types are compatible + validateProviderSignerCompatibility(providerOrClient, signerOrAccount); + // Type guard to determine if we're using viem or ethers if (isViemClient(providerOrClient)) { console.debug( @@ -128,3 +131,44 @@ function isViemClient( return isNotEthersProvider && (hasViemProperties || hasViemMethods); } + +// Type guard to determine if the signer is a viem Account +function isViemAccount( + signer: ethers.Signer | Account, +): signer is Account { + // Check for viem Account properties + const hasViemAccountProperties = + 'address' in signer && + typeof (signer as { address: string }).address === 'string' && + !('provider' in signer); // ethers.Signer has provider property + + // Check if it's not an ethers.Signer + const isNotEthersSigner = !(signer instanceof ethers.Signer); + + return isNotEthersSigner && hasViemAccountProperties; +} + +// Validate that provider and signer types are compatible +function validateProviderSignerCompatibility( + providerOrClient: ethers.providers.Provider | PublicClient, + signerOrAccount: ethers.Signer | Account, +): void { + const isViemProvider = isViemClient(providerOrClient); + const isViemSigner = isViemAccount(signerOrAccount); + + if (isViemProvider && !isViemSigner) { + throw new Error( + 'Type mismatch: viem PublicClient provided but ethers.Signer detected. ' + + 'When using viem, please provide a viem Account. ' + + 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)' + ); + } + + if (!isViemProvider && isViemSigner) { + throw new Error( + 'Type mismatch: ethers.Provider provided but viem Account detected. ' + + 'When using ethers, please provide an ethers.Signer. ' + + 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)' + ); + } +} diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index e035f211f..873dda482 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -136,4 +136,56 @@ describe('taco', () => { new Set([customParamKey, USER_ADDRESS_PARAM_DEFAULT]), ); }); + + it('should throw error when ethers provider is used with viem account', async () => { + const ethersProvider = fakeProvider(aliceSecretKeyBytes); + + // Mock viem account (no provider property, distinguishes from ethers.Signer) + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: () => Promise.resolve('0x'), + signTypedData: () => Promise.resolve('0x'), + }; + + // Should throw type mismatch error + await expect( + taco.encrypt( + ethersProvider, // ethers provider + domains.DEVNET, + message, + ownsNFT, + 0, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + mockViemAccount as any, // viem account - MISMATCH! + ), + ).rejects.toThrow( + 'Type mismatch: ethers.Provider provided but viem Account detected', + ); + }); + + it('should throw error when viem client is used with ethers signer', async () => { + const ethersProvider = fakeProvider(aliceSecretKeyBytes); + const ethersSigner = ethersProvider.getSigner(); + + // Mock viem client (chain property makes isViemClient return true) + const mockViemClient = { + chain: { id: 80002, name: 'polygon-amoy' }, + getChainId: () => Promise.resolve(80002), + }; + + // Should throw type mismatch error + await expect( + taco.encrypt( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + mockViemClient as any, // viem client + domains.DEVNET, + message, + ownsNFT, + 0, + ethersSigner, // ethers signer - MISMATCH! + ), + ).rejects.toThrow( + 'Type mismatch: viem PublicClient provided but ethers.Signer detected', + ); + }); }); diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 25b8e1b99..36f3681e3 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -22,7 +22,6 @@ import { conditions, domains, toBytes } from '../src'; import { ConditionContext } from '../src/conditions/context'; import { decrypt, encrypt } from '../src/viem-taco'; - import { fakeDkgRitual, mockDkgParticipants, @@ -115,9 +114,7 @@ describe('viem TACo integration', () => { mockViemAccount, ); - expect(createTacoProviderSpy).toHaveBeenCalledWith( - mockViemPublicClient, - ); + expect(createTacoProviderSpy).toHaveBeenCalledWith(mockViemPublicClient); expect(createTacoSignerSpy).toHaveBeenCalledWith( mockViemAccount, mockViemProvider, From bbe0012ce26ef8acdd1f11ddcdac7b42ba7b45a2 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 4 Sep 2025 14:57:22 +0200 Subject: [PATCH 27/97] Apply suggestions from code review Co-authored-by: Derek Pierre --- packages/shared/src/taco-interfaces.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index b9af46a4d..db971bcd1 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -5,7 +5,7 @@ import type { ViemTypedDataDomain, ViemTypedDataParameter } from './viem-utils'; /** * Basic TACo Provider interface * - * This interface defines the minimal provider contract needed for TACo operations. + * This interface defines the minimal provider functionality needed for TACo operations. * It abstracts away the underlying blockchain library (ethers, viem, etc.) and * focuses only on the methods that TACo actually uses. */ @@ -79,7 +79,7 @@ export interface TacoProvider { /** * Basic TACo Signer interface * - * This interface defines the minimal signer contract needed for TACo operations. + * This interface defines the minimal signer functionality needed for TACo operations. * It abstracts away the underlying blockchain library (ethers, viem, etc.) and * focuses only on the methods that TACo actually uses. */ From 372f95ebb522aab665a11d0cdea39b424809168f Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:07:48 +0200 Subject: [PATCH 28/97] update TacoSigner to use only ethers types --- packages/shared/src/taco-interfaces.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index db971bcd1..552339f02 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -1,6 +1,4 @@ -import { ethers } from 'ethers'; - -import type { ViemTypedDataDomain, ViemTypedDataParameter } from './viem-utils'; +import { ethers, TypedDataDomain, TypedDataField } from 'ethers'; /** * Basic TACo Provider interface @@ -108,8 +106,8 @@ export interface TacoSigner { * Sign typed data (EIP-712) */ signTypedData( - domain: ViemTypedDataDomain, - types: Record, + domain: TypedDataDomain, + types: Record>, message: Record, ): Promise; From ac7b498b2ff43a3ca168b9ca6c4b748e37a962ec Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 4 Sep 2025 17:39:11 +0200 Subject: [PATCH 29/97] refactor: move viem adapters to shared package and unify implementation --- packages/shared/src/index.ts | 1 + .../wrappers => shared/src}/viem-adapters.ts | 58 ++++-- .../test/viem-adapters.test.ts | 2 +- .../eip4361-viem.ts} | 18 +- packages/taco-auth/src/providers/index.ts | 2 +- .../taco-auth/src/providers/viem/index.ts | 3 - .../src/providers/viem/viem-adapters.ts | 197 ------------------ packages/taco/src/viem-taco.ts | 2 +- packages/taco/src/wrappers/index.ts | 6 - packages/taco/test/viem-taco.test.ts | 10 +- 10 files changed, 49 insertions(+), 250 deletions(-) rename packages/{taco/src/wrappers => shared/src}/viem-adapters.ts (75%) rename packages/{taco => shared}/test/viem-adapters.test.ts (99%) rename packages/taco-auth/src/providers/{viem/viem-auth-providers.ts => eip4361/eip4361-viem.ts} (93%) delete mode 100644 packages/taco-auth/src/providers/viem/index.ts delete mode 100644 packages/taco-auth/src/providers/viem/viem-adapters.ts delete mode 100644 packages/taco/src/wrappers/index.ts diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 13bd0bd87..5c4af95ce 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -4,6 +4,7 @@ export * from './schemas'; export * from './taco-interfaces'; export type * from './types'; export * from './utils'; +export * from './viem-adapters'; export * from './viem-utils'; export * from './web3'; diff --git a/packages/taco/src/wrappers/viem-adapters.ts b/packages/shared/src/viem-adapters.ts similarity index 75% rename from packages/taco/src/wrappers/viem-adapters.ts rename to packages/shared/src/viem-adapters.ts index c1d441185..6d7f5e0e9 100644 --- a/packages/taco/src/wrappers/viem-adapters.ts +++ b/packages/shared/src/viem-adapters.ts @@ -1,24 +1,25 @@ +import { ethers, TypedDataDomain, TypedDataField } from 'ethers'; + +import { type TacoProvider, type TacoSigner } from './taco-interfaces'; import { type Account, checkViemAvailability, type PublicClient, - type TacoProvider, - type TacoSigner, ViemProviderBase, ViemSignerBase, type ViemTypedDataDomain, type ViemTypedDataParameter, type WalletClient, -} from '@nucypher/shared'; -import { ethers } from 'ethers'; +} from './viem-utils'; /** - * Viem adapter for TACo Provider + * Unified Viem Provider Adapter * * This adapter implements the TacoProvider interface using viem wrappers. - * It bridges the gap between the generic TACo interface and viem-specific implementations. + * It bridges the gap between viem and ethers.js interfaces. + * Used by both taco and taco-auth packages to avoid code duplication. */ -class ViemTacoProviderAdapter implements TacoProvider { +export class ViemProviderAdapter implements TacoProvider { private readonly viemWrapper: ViemProviderBase; // Ethers.js compatibility property for contract validation @@ -81,12 +82,13 @@ class ViemTacoProviderAdapter implements TacoProvider { } /** - * Viem adapter for TACo Signer + * Unified Viem Signer Adapter * * This adapter implements the TacoSigner interface using viem wrappers. - * It bridges the gap between the generic TACo interface and viem-specific implementations. + * It bridges the gap between viem and ethers.js interfaces. + * Used by both taco and taco-auth packages to avoid code duplication. */ -class ViemTacoSignerAdapter implements TacoSigner { +class ViemSignerAdapter implements TacoSigner { private readonly viemWrapper: ViemSignerBase; public readonly provider: TacoProvider; @@ -107,11 +109,17 @@ class ViemTacoSignerAdapter implements TacoSigner { } async signTypedData( - domain: ViemTypedDataDomain, - types: Record, + domain: TypedDataDomain, + types: Record>, message: Record, ): Promise { - return this.viemWrapper.signTypedData(domain, types, message); + // Convert ethers types to viem types for compatibility + const viemDomain = domain as unknown as ViemTypedDataDomain; + const viemTypes = types as unknown as Record< + string, + readonly ViemTypedDataParameter[] + >; + return this.viemWrapper.signTypedData(viemDomain, viemTypes, message); } async getBalance(): Promise { @@ -136,18 +144,21 @@ class ViemTacoSignerAdapter implements TacoSigner { connect(provider: TacoProvider): TacoSigner { // For viem adapters, we need to create a new signer with the new provider - if (!(provider instanceof ViemTacoProviderAdapter)) { - throw new Error('Provider must be a ViemTacoProviderAdapter'); + if (!(provider instanceof ViemProviderAdapter)) { + throw new Error('Provider must be a ViemProviderAdapter'); } - const newViemWrapper = this.viemWrapper.connect(provider['viemWrapper']); - return new ViemTacoSignerAdapter(newViemWrapper, provider); + const newViemWrapper = this.viemWrapper.connect( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (provider as any).viemWrapper, + ); + return new ViemSignerAdapter(newViemWrapper, provider); } } /** * Concrete viem provider wrapper implementation */ -class ConcreteViemProvider extends ViemProviderBase { +export class ConcreteViemProvider extends ViemProviderBase { constructor(viemPublicClient: PublicClient) { super(viemPublicClient); } @@ -176,7 +187,7 @@ export async function createTacoProvider( ): Promise { await checkViemAvailability(); const viemWrapper = new ConcreteViemProvider(viemPublicClient); - return new ViemTacoProviderAdapter(viemWrapper); + return new ViemProviderAdapter(viemWrapper); } /** @@ -190,15 +201,16 @@ export async function createTacoSigner( ): Promise { await checkViemAvailability(); - if (!(provider instanceof ViemTacoProviderAdapter)) { - throw new Error('Provider must be a ViemTacoProviderAdapter'); + if (!(provider instanceof ViemProviderAdapter)) { + throw new Error('Provider must be a ViemProviderAdapter'); } const viemWrapper = new ConcreteViemSigner( viemAccount, - provider['viemWrapper'], + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (provider as any).viemWrapper, ); - return new ViemTacoSignerAdapter(viemWrapper, provider); + return new ViemSignerAdapter(viemWrapper, provider); } /** diff --git a/packages/taco/test/viem-adapters.test.ts b/packages/shared/test/viem-adapters.test.ts similarity index 99% rename from packages/taco/test/viem-adapters.test.ts rename to packages/shared/test/viem-adapters.test.ts index 61576c4f3..d86357e26 100644 --- a/packages/taco/test/viem-adapters.test.ts +++ b/packages/shared/test/viem-adapters.test.ts @@ -5,7 +5,7 @@ import { createTacoFromViem, createTacoProvider, createTacoSigner, -} from '../src/wrappers/viem-adapters'; +} from '@nucypher/shared'; describe('viem adapter utilities', () => { describe('function exports', () => { diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts similarity index 93% rename from packages/taco-auth/src/providers/viem/viem-auth-providers.ts rename to packages/taco-auth/src/providers/eip4361/eip4361-viem.ts index a502001df..bc2c37c49 100644 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts @@ -1,15 +1,15 @@ -import { type Account, type PublicClient } from '@nucypher/shared'; +import { + createTacoProvider, + createTacoSigner, + type Account, + type PublicClient, +} from '@nucypher/shared'; import { ethers } from 'ethers'; import { EIP4361AuthProvider, EIP4361AuthProviderParams, -} from '../eip4361/eip4361'; - -import { - createTacoProvider, - createTacoSigner, -} from './viem-adapters'; +} from './eip4361'; /** * Viem-compatible EIP4361 authentication provider. @@ -17,7 +17,7 @@ import { * This class provides a clean viem-native API for EIP4361 authentication * while internally handling the conversion to ethers.js objects that the * underlying EIP4361AuthProvider expects. - * + * * **Note**: This class uses a static factory method pattern for async * initialization. Use `ViemEIP4361AuthProvider.create()` instead of `new`. * @@ -95,5 +95,3 @@ export class ViemEIP4361AuthProvider { } } -// Export type for consumers -export type { EIP4361AuthProviderParams }; diff --git a/packages/taco-auth/src/providers/index.ts b/packages/taco-auth/src/providers/index.ts index b1bcd4e23..3c414f857 100644 --- a/packages/taco-auth/src/providers/index.ts +++ b/packages/taco-auth/src/providers/index.ts @@ -7,4 +7,4 @@ export { } from './eip4361/auth'; export * from './eip4361/eip4361'; export * from './eip4361/external-eip4361'; -export * from './viem'; +export { ViemEIP4361AuthProvider } from './eip4361/eip4361-viem'; diff --git a/packages/taco-auth/src/providers/viem/index.ts b/packages/taco-auth/src/providers/viem/index.ts deleted file mode 100644 index 8d9808655..000000000 --- a/packages/taco-auth/src/providers/viem/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { ViemEIP4361AuthProvider } from './viem-auth-providers'; -export type { EIP4361AuthProviderParams } from './viem-auth-providers'; -export { createTacoProvider, createTacoSigner } from './viem-adapters'; diff --git a/packages/taco-auth/src/providers/viem/viem-adapters.ts b/packages/taco-auth/src/providers/viem/viem-adapters.ts deleted file mode 100644 index c61d1503d..000000000 --- a/packages/taco-auth/src/providers/viem/viem-adapters.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { - type Account, - checkViemAvailability, - type PublicClient, - type TacoProvider, - type TacoSigner, - ViemProviderBase, - ViemSignerBase, - type ViemTypedDataDomain, - type ViemTypedDataParameter, -} from '@nucypher/shared'; -import { ethers } from 'ethers'; - -/** - * Viem adapter for TACo Auth Provider - * - * This adapter implements the TacoProvider interface using viem wrappers - * specifically for authentication operations. - */ -class ViemTacoAuthProviderAdapter implements TacoProvider { - private readonly viemWrapper: ViemProviderBase; - - // Ethers.js compatibility property for contract validation - readonly _isProvider = true; - - constructor(viemWrapper: ViemProviderBase) { - this.viemWrapper = viemWrapper; - } - - async getNetwork(): Promise { - return this.viemWrapper.getNetwork(); - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return this.viemWrapper.call(transaction); - } - - async getBlockNumber(): Promise { - return this.viemWrapper.getBlockNumber(); - } - - async getBalance( - address: string, - blockTag?: string | number, - ): Promise { - return this.viemWrapper.getBalance(address, blockTag); - } - - async getTransactionCount(address: string): Promise { - return this.viemWrapper.getTransactionCount(address); - } - - async getCode(address: string): Promise { - return this.viemWrapper.getCode(address); - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return this.viemWrapper.estimateGas(transaction); - } - - async getGasPrice(): Promise { - return this.viemWrapper.getGasPrice(); - } - - async getFeeData(): Promise { - return this.viemWrapper.getFeeData(); - } - - async resolveName(name: string): Promise { - return this.viemWrapper.resolveName(name); - } - - async lookupAddress(address: string): Promise { - return this.viemWrapper.lookupAddress(address); - } -} - -/** - * Viem adapter for TACo Auth Signer - * - * This adapter implements the TacoSigner interface using viem wrappers - * specifically for authentication operations. - */ -class ViemTacoAuthSignerAdapter implements TacoSigner { - private readonly viemWrapper: ViemSignerBase; - - // Ethers.js compatibility property for contract validation - readonly _isSigner = true; - - public readonly provider: TacoProvider; - - constructor(viemWrapper: ViemSignerBase, provider: TacoProvider) { - this.viemWrapper = viemWrapper; - this.provider = provider; - } - - async getAddress() { - return this.viemWrapper.getAddress(); - } - - async signMessage(message: string | Uint8Array) { - return this.viemWrapper.signMessage(message); - } - - async signTypedData( - domain: ViemTypedDataDomain, - types: Record, - message: Record, - ): Promise { - return this.viemWrapper.signTypedData(domain, types, message); - } - - async getBalance() { - return this.viemWrapper.getBalance(); - } - - async getTransactionCount() { - return this.viemWrapper.getTransactionCount(); - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return this.viemWrapper.estimateGas(transaction); - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return this.viemWrapper.call(transaction); - } - - connect(provider: TacoProvider): TacoSigner { - if (!(provider instanceof ViemTacoAuthProviderAdapter)) { - throw new Error('Provider must be a ViemTacoAuthProviderAdapter'); - } - const newViemWrapper = this.viemWrapper.connect(provider['viemWrapper']); - return new ViemTacoAuthSignerAdapter(newViemWrapper, provider); - } -} - -/** - * Concrete viem provider wrapper implementation for auth - */ -class ConcreteViemAuthProvider extends ViemProviderBase { - constructor(viemPublicClient: PublicClient) { - super(viemPublicClient); - } -} - -/** - * Concrete viem signer wrapper implementation for auth - */ -class ConcreteViemAuthSigner extends ViemSignerBase { - constructor(viemAccount: Account, provider: ViemProviderBase) { - super(viemAccount, provider); - } - - connect(provider: ViemProviderBase): ViemSignerBase { - return new ConcreteViemAuthSigner(this['viemAccount'], provider); - } -} - -/** - * Create a TACo auth provider adapter from viem PublicClient - */ -export async function createTacoProvider( - viemPublicClient: PublicClient, -): Promise { - await checkViemAvailability(); - const viemWrapper = new ConcreteViemAuthProvider(viemPublicClient); - return new ViemTacoAuthProviderAdapter(viemWrapper); -} - -/** - * Create a TACo auth signer adapter from viem Account - */ -export async function createTacoSigner( - viemAccount: Account, - provider: TacoProvider, -): Promise { - await checkViemAvailability(); - - if (!(provider instanceof ViemTacoAuthProviderAdapter)) { - throw new Error('Provider must be a ViemTacoAuthProviderAdapter'); - } - - const viemWrapper = new ConcreteViemAuthSigner( - viemAccount, - provider['viemWrapper'], - ); - return new ViemTacoAuthSignerAdapter(viemWrapper, provider); -} diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index 8fe9dabef..e4b23c053 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -2,10 +2,10 @@ import { ThresholdMessageKit } from '@nucypher/nucypher-core'; import { type Account, type Domain, type PublicClient } from '@nucypher/shared'; import { ethers } from 'ethers'; +import { createTacoProvider, createTacoSigner } from '@nucypher/shared'; import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; -import { createTacoProvider, createTacoSigner } from './wrappers'; /** * Encrypts a message under given conditions using viem clients. diff --git a/packages/taco/src/wrappers/index.ts b/packages/taco/src/wrappers/index.ts deleted file mode 100644 index 74b319df1..000000000 --- a/packages/taco/src/wrappers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Viem adapter utilities -export { - createTacoFromViem, - createTacoProvider, - createTacoSigner, -} from './viem-adapters'; diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 36f3681e3..7531d54e1 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -90,16 +90,10 @@ describe('viem TACo integration', () => { } as any; const createTacoProviderSpy = vi - .spyOn( - await import('../src/wrappers/viem-adapters'), - 'createTacoProvider', - ) + .spyOn(await import('@nucypher/shared'), 'createTacoProvider') .mockResolvedValue(mockViemProvider); const createTacoSignerSpy = vi - .spyOn( - await import('../src/wrappers/viem-adapters'), - 'createTacoSigner', - ) + .spyOn(await import('@nucypher/shared'), 'createTacoSigner') .mockResolvedValue(typedSigner); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); From ad9f73ecfe4b54b0a7568eabc43ca1e6ac8eadb4 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 4 Sep 2025 18:28:41 +0200 Subject: [PATCH 30/97] add encryptWithPublicKey support for viem also add tests for encryptWithPublicKey :and make provider optional in TacoSigner --- packages/shared/src/taco-interfaces.ts | 4 +- packages/shared/src/viem-adapters.ts | 25 ++++-- packages/shared/src/viem-utils.ts | 18 +++- .../src/providers/eip4361/eip4361-viem.ts | 2 +- packages/taco/src/encrypt-decrypt.ts | 86 +++++++++++++------ packages/taco/src/viem-taco.ts | 55 +++++++++++- packages/taco/test/taco.test.ts | 40 +++++++++ 7 files changed, 188 insertions(+), 42 deletions(-) diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index 552339f02..26b4e4060 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -88,9 +88,9 @@ export interface TacoSigner { readonly _isSigner: true; /** - * The provider this signer is connected to + * The provider this signer is connected to (optional for signing-only operations) */ - readonly provider: TacoProvider; + readonly provider?: TacoProvider | undefined; /** * Get the address of this signer diff --git a/packages/shared/src/viem-adapters.ts b/packages/shared/src/viem-adapters.ts index 6d7f5e0e9..b7a71f5f5 100644 --- a/packages/shared/src/viem-adapters.ts +++ b/packages/shared/src/viem-adapters.ts @@ -90,12 +90,12 @@ export class ViemProviderAdapter implements TacoProvider { */ class ViemSignerAdapter implements TacoSigner { private readonly viemWrapper: ViemSignerBase; - public readonly provider: TacoProvider; + public readonly provider?: TacoProvider | undefined; // Ethers.js compatibility property for contract validation readonly _isSigner = true; - constructor(viemWrapper: ViemSignerBase, provider: TacoProvider) { + constructor(viemWrapper: ViemSignerBase, provider?: TacoProvider | undefined) { this.viemWrapper = viemWrapper; this.provider = provider; } @@ -168,11 +168,11 @@ export class ConcreteViemProvider extends ViemProviderBase { * Concrete viem signer wrapper implementation */ class ConcreteViemSigner extends ViemSignerBase { - constructor(viemAccount: Account, provider: ViemProviderBase) { + constructor(viemAccount: Account, provider?: ViemProviderBase | undefined) { super(viemAccount, provider); } - connect(provider: ViemProviderBase): ViemSignerBase { + connect(provider?: ViemProviderBase | undefined): ViemSignerBase { return new ConcreteViemSigner(this['viemAccount'], provider); } } @@ -194,21 +194,32 @@ export async function createTacoProvider( * Create a TACo signer adapter from viem Account * * This function creates a viem wrapper and then wraps it in a TacoSigner adapter. + * + * @param viemAccount - Viem account for signing operations + * @param provider - Optional TACo provider. If not provided, a minimal provider will be created for signing-only operations */ export async function createTacoSigner( viemAccount: Account, - provider: TacoProvider, + provider?: TacoProvider, +): Promise; +export async function createTacoSigner( + viemAccount: Account, +): Promise; +export async function createTacoSigner( + viemAccount: Account, + provider?: TacoProvider, ): Promise { await checkViemAvailability(); - if (!(provider instanceof ViemProviderAdapter)) { + // If provider is provided, validate it's a ViemProviderAdapter + if (provider && !(provider instanceof ViemProviderAdapter)) { throw new Error('Provider must be a ViemProviderAdapter'); } const viemWrapper = new ConcreteViemSigner( viemAccount, // eslint-disable-next-line @typescript-eslint/no-explicit-any - (provider as any).viemWrapper, + provider ? (provider as any).viemWrapper : undefined, ); return new ViemSignerAdapter(viemWrapper, provider); } diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 756ff68d8..0fcc033db 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -309,12 +309,12 @@ export abstract class ViemProviderBase { */ export abstract class ViemSignerBase { protected viemAccount: Account; - public readonly provider: ViemProviderBase; + public readonly provider?: ViemProviderBase | undefined; // Ethers.js compatibility properties for contract validation readonly _isSigner: boolean = true; - constructor(viemAccount: Account, provider: ViemProviderBase) { + constructor(viemAccount: Account, provider?: ViemProviderBase | undefined) { this.viemAccount = viemAccount; this.provider = provider; } @@ -335,22 +335,34 @@ export abstract class ViemSignerBase { } async getBalance(): Promise { + if (!this.provider) { + throw new Error('Provider is required for getBalance operation'); + } return await this.provider.getBalance(this.viemAccount.address); } async getTransactionCount(): Promise { + if (!this.provider) { + throw new Error('Provider is required for getTransactionCount operation'); + } return await this.provider.getTransactionCount(this.viemAccount.address); } async estimateGas( transaction: ethers.providers.TransactionRequest, ): Promise { + if (!this.provider) { + throw new Error('Provider is required for estimateGas operation'); + } return await this.provider.estimateGas(transaction); } async call( transaction: ethers.providers.TransactionRequest, ): Promise { + if (!this.provider) { + throw new Error('Provider is required for call operation'); + } return await this.provider.call(transaction); } @@ -377,5 +389,5 @@ export abstract class ViemSignerBase { * Connect this signer to a different provider * This method should be implemented by concrete signer classes */ - abstract connect(provider: ViemProviderBase): ViemSignerBase; + abstract connect(provider?: ViemProviderBase): ViemSignerBase; } diff --git a/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts b/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts index bc2c37c49..ce6aa177c 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts @@ -1,7 +1,7 @@ import { + type Account, createTacoProvider, createTacoSigner, - type Account, type PublicClient, } from '@nucypher/shared'; import { ethers } from 'ethers'; diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts index 59e5744cb..2f656b665 100644 --- a/packages/taco/src/encrypt-decrypt.ts +++ b/packages/taco/src/encrypt-decrypt.ts @@ -1,11 +1,19 @@ -import { ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { DkgPublicKey, ThresholdMessageKit } from '@nucypher/nucypher-core'; import { type Account, Domain, type PublicClient } from '@nucypher/shared'; import { ethers } from 'ethers'; import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; -import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; -import { decrypt as viemDecrypt, encrypt as viemEncrypt } from './viem-taco'; +import { + decrypt as ethersDecrypt, + encrypt as ethersEncrypt, + encryptWithPublicKey as ethersEncryptWithPublicKey, +} from './taco'; +import { + decrypt as viemDecrypt, + encrypt as viemEncrypt, + encryptWithPublicKey as viemEncryptWithPublicKey, +} from './viem-taco'; // Function overloads for encrypt export function encrypt( @@ -40,9 +48,6 @@ export async function encrypt( // Type guard to determine if we're using viem or ethers if (isViemClient(providerOrClient)) { - console.debug( - 'viem encrypt function will be used as viem client has been detected', - ); return viemEncrypt( providerOrClient as PublicClient, domain, @@ -52,9 +57,6 @@ export async function encrypt( signerOrAccount as Account, ); } else { - console.debug( - 'ethers encrypt function will be used as viem client has not been detected', - ); return ethersEncrypt( providerOrClient as ethers.providers.Provider, domain, @@ -66,6 +68,46 @@ export async function encrypt( } } +// Function overloads for encryptWithPublicKey +export function encryptWithPublicKey( + message: Uint8Array | string, + condition: Condition, + dkgPublicKey: DkgPublicKey, + authSigner: ethers.Signer, +): Promise; + +export function encryptWithPublicKey( + message: Uint8Array | string, + condition: Condition, + dkgPublicKey: DkgPublicKey, + viemAuthSigner: Account, +): Promise; + +// Implementation that routes to the appropriate function +export async function encryptWithPublicKey( + message: Uint8Array | string, + condition: Condition, + dkgPublicKey: DkgPublicKey, + signerOrAccount: ethers.Signer | Account, +): Promise { + // Type guard to determine if we're using viem or ethers + if (isViemAccount(signerOrAccount)) { + return viemEncryptWithPublicKey( + message, + condition, + dkgPublicKey, + signerOrAccount as Account, + ); + } else { + return ethersEncryptWithPublicKey( + message, + condition, + dkgPublicKey, + signerOrAccount as ethers.Signer, + ); + } +} + // Function overloads for decrypt export function decrypt( provider: ethers.providers.Provider, @@ -93,9 +135,6 @@ export async function decrypt( ): Promise { // Type guard to determine if we're using viem or ethers if (isViemClient(providerOrClient)) { - console.debug( - 'viem decrypt function will be used as viem client has been detected', - ); return viemDecrypt( providerOrClient as PublicClient, domain, @@ -104,9 +143,6 @@ export async function decrypt( porterUris, ); } else { - console.debug( - 'ethers decrypt function will be used as viem client has not been detected', - ); return ethersDecrypt( providerOrClient as ethers.providers.Provider, domain, @@ -133,18 +169,16 @@ function isViemClient( } // Type guard to determine if the signer is a viem Account -function isViemAccount( - signer: ethers.Signer | Account, -): signer is Account { +function isViemAccount(signer: ethers.Signer | Account): signer is Account { // Check for viem Account properties - const hasViemAccountProperties = - 'address' in signer && + const hasViemAccountProperties = + 'address' in signer && typeof (signer as { address: string }).address === 'string' && !('provider' in signer); // ethers.Signer has provider property - + // Check if it's not an ethers.Signer const isNotEthersSigner = !(signer instanceof ethers.Signer); - + return isNotEthersSigner && hasViemAccountProperties; } @@ -159,16 +193,16 @@ function validateProviderSignerCompatibility( if (isViemProvider && !isViemSigner) { throw new Error( 'Type mismatch: viem PublicClient provided but ethers.Signer detected. ' + - 'When using viem, please provide a viem Account. ' + - 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)' + 'When using viem, please provide a viem Account. ' + + 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)', ); } if (!isViemProvider && isViemSigner) { throw new Error( 'Type mismatch: ethers.Provider provided but viem Account detected. ' + - 'When using ethers, please provide an ethers.Signer. ' + - 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)' + 'When using ethers, please provide an ethers.Signer. ' + + 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)', ); } } diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts index e4b23c053..d0702ec7c 100644 --- a/packages/taco/src/viem-taco.ts +++ b/packages/taco/src/viem-taco.ts @@ -1,11 +1,11 @@ -import { ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { DkgPublicKey, ThresholdMessageKit } from '@nucypher/nucypher-core'; import { type Account, type Domain, type PublicClient } from '@nucypher/shared'; +import { createTacoProvider, createTacoSigner } from '@nucypher/shared'; import { ethers } from 'ethers'; -import { createTacoProvider, createTacoSigner } from '@nucypher/shared'; import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; -import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; +import { decrypt as ethersDecrypt, encrypt as ethersEncrypt, encryptWithPublicKey as ethersEncryptWithPublicKey } from './taco'; /** * Encrypts a message under given conditions using viem clients. @@ -73,6 +73,55 @@ export const encrypt = async ( ); }; +/** + * Encrypts a message with a public key using viem clients. + * + * This is a viem-compatible version of the encryptWithPublicKey function that accepts a viem account + * instead of an ethers signer. + * + * @export + * @param {Uint8Array | string} message - The message to be encrypted + * @param {Condition} condition - Condition under which the message will be encrypted + * @param {DkgPublicKey} dkgPublicKey - The DKG public key to use for encryption + * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization + * + * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit + * + * @throws {Error} If the encryption process throws an error, an error is thrown + * + * @example + * ```typescript + * import { privateKeyToAccount } from 'viem/accounts'; + * import { encryptWithPublicKey } from '@nucypher/taco'; + * + * const viemAuthSigner = privateKeyToAccount('0x...'); + * + * const encrypted = await encryptWithPublicKey( + * 'Hello, secret!', // Message to encrypt + * condition, // Access condition + * dkgPublicKey, // DKG public key + * viemAuthSigner // Your viem account + * ); + * ``` + */ +export const encryptWithPublicKey = async ( + message: Uint8Array | string, + condition: Condition, + dkgPublicKey: DkgPublicKey, + viemAuthSigner: Account, +): Promise => { + // Create signer without provider (signing-only operation) + const tacoSigner = await createTacoSigner(viemAuthSigner); + + // Use the existing ethers-based encryptWithPublicKey function with type assertions + return await ethersEncryptWithPublicKey( + message, + condition, + dkgPublicKey, + tacoSigner as unknown as ethers.Signer, + ); +}; + /** * Decrypts an encrypted message using viem clients. * diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index 873dda482..34ba64d33 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -188,4 +188,44 @@ describe('taco', () => { 'Type mismatch: viem PublicClient provided but ethers.Signer detected', ); }); + + describe('encryptWithPublicKey', () => { + it('encrypts with ethers.Signer', async () => { + const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); + const provider = fakeProvider(aliceSecretKeyBytes); + const signer = provider.getSigner(); + + const messageKit = await taco.encryptWithPublicKey( + message, + ownsNFT, + mockedDkg.dkg.publicKey(), + signer, + ); + + expect(messageKit).toBeDefined(); + expect(messageKit).toBeInstanceOf(Object); + }); + + it('encrypts with viem Account', async () => { + const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); + + // Mock viem account + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: () => Promise.resolve('0x'), + signTypedData: () => Promise.resolve('0x'), + }; + + const messageKit = await taco.encryptWithPublicKey( + message, + ownsNFT, + mockedDkg.dkg.publicKey(), + // eslint-disable-next-line @typescript-eslint/no-explicit-any + mockViemAccount as any, + ); + + expect(messageKit).toBeDefined(); + expect(messageKit).toBeInstanceOf(Object); + }); + }); }); From 604809e2c7de073a8c4fb57ce29c3e8bb25eee13 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 4 Sep 2025 20:25:54 +0200 Subject: [PATCH 31/97] tiny edit to correct an export --- packages/taco/src/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 5ef4fc7d9..c431fa140 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -11,5 +11,4 @@ export { export * as conditions from './conditions'; -export { decrypt, encrypt } from './encrypt-decrypt'; -export { encryptWithPublicKey } from './taco'; +export { decrypt, encrypt, encryptWithPublicKey } from './encrypt-decrypt'; From 0f082870313a5b153d90b3fc33360b435dfc458b Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 5 Sep 2025 08:15:29 +0200 Subject: [PATCH 32/97] refactor: consolidate viem support into EIP4361AuthProvider and add the related type guards to the shared package --- packages/shared/src/index.ts | 1 + packages/shared/src/type-guards.ts | 65 +++++++++++++ .../src/providers/eip4361/eip4361-viem.ts | 97 ------------------- .../src/providers/eip4361/eip4361.ts | 91 ++++++++++++++++- packages/taco-auth/src/providers/index.ts | 1 - packages/taco/VIEM_SUPPORT.md | 33 +++++-- .../viem-encrypt-decrypt.test.ts | 23 ++--- .../taco/src/conditions/context/context.ts | 5 +- packages/taco/src/encrypt-decrypt.ts | 65 ++----------- 9 files changed, 199 insertions(+), 182 deletions(-) create mode 100644 packages/shared/src/type-guards.ts delete mode 100644 packages/taco-auth/src/providers/eip4361/eip4361-viem.ts diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 5c4af95ce..533c5c61a 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -2,6 +2,7 @@ export * from './contracts'; export * from './porter'; export * from './schemas'; export * from './taco-interfaces'; +export * from './type-guards'; export type * from './types'; export * from './utils'; export * from './viem-adapters'; diff --git a/packages/shared/src/type-guards.ts b/packages/shared/src/type-guards.ts new file mode 100644 index 000000000..c38b83d2e --- /dev/null +++ b/packages/shared/src/type-guards.ts @@ -0,0 +1,65 @@ +import { ethers } from 'ethers'; + +import { Account, PublicClient } from './viem-utils'; + +/** + * Type guard to determine if the client is a viem PublicClient + */ +export function isViemClient( + client: ethers.providers.Provider | PublicClient, +): client is PublicClient { + const hasViemProperties = 'chain' in client; + const hasViemMethods = + typeof (client as { getChainId: () => Promise }).getChainId === + 'function'; + const isNotEthersProvider = !( + client instanceof ethers.providers.BaseProvider + ); + + return isNotEthersProvider && (hasViemProperties || hasViemMethods); +} + +/** + * Type guard to determine if the signer is a viem Account + */ +export function isViemAccount( + signer: ethers.Signer | Account, +): signer is Account { + // Check for viem Account properties + const hasViemAccountProperties = + 'address' in signer && + typeof (signer as { address: string }).address === 'string' && + !('provider' in signer); // ethers.Signer has provider property + + // Check if it's not an ethers.Signer + const isNotEthersSigner = !(signer instanceof ethers.Signer); + + return isNotEthersSigner && hasViemAccountProperties; +} + +/** + * Validate that provider and signer types are compatible + */ +export function validateProviderSignerCompatibility( + providerOrClient: ethers.providers.Provider | PublicClient, + signerOrAccount: ethers.Signer | Account, +): void { + const isViemProvider = isViemClient(providerOrClient); + const isViemSigner = isViemAccount(signerOrAccount); + + if (isViemProvider && !isViemSigner) { + throw new Error( + 'Type mismatch: viem PublicClient provided but ethers.Signer detected. ' + + 'When using viem, please provide a viem Account. ' + + 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)', + ); + } + + if (!isViemProvider && isViemSigner) { + throw new Error( + 'Type mismatch: ethers.Provider provided but viem Account detected. ' + + 'When using ethers, please provide an ethers.Signer. ' + + 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)', + ); + } +} diff --git a/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts b/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts deleted file mode 100644 index ce6aa177c..000000000 --- a/packages/taco-auth/src/providers/eip4361/eip4361-viem.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { - type Account, - createTacoProvider, - createTacoSigner, - type PublicClient, -} from '@nucypher/shared'; -import { ethers } from 'ethers'; - -import { - EIP4361AuthProvider, - EIP4361AuthProviderParams, -} from './eip4361'; - -/** - * Viem-compatible EIP4361 authentication provider. - * - * This class provides a clean viem-native API for EIP4361 authentication - * while internally handling the conversion to ethers.js objects that the - * underlying EIP4361AuthProvider expects. - * - * **Note**: This class uses a static factory method pattern for async - * initialization. Use `ViemEIP4361AuthProvider.create()` instead of `new`. - * - * @example - * ```typescript - * import { createPublicClient, http } from 'viem'; - * import { privateKeyToAccount } from 'viem/accounts'; - * import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; - * - * const publicClient = createPublicClient({ - * chain: polygon, - * transport: http() - * }); - * const account = privateKeyToAccount('0x...'); - * - * const authProvider = await ViemEIP4361AuthProvider.create( - * publicClient, - * account, - * { domain: 'my-app.com', uri: 'https://my-app.com' } - * ); - * - * const signature = await authProvider.getOrCreateAuthSignature(); - * ``` - */ -export class ViemEIP4361AuthProvider { - private ethersAuthProvider: EIP4361AuthProvider; - - /** - * Private constructor - use create() static method instead - */ - private constructor(ethersAuthProvider: EIP4361AuthProvider) { - this.ethersAuthProvider = ethersAuthProvider; - } - - /** - * Create a new ViemEIP4361AuthProvider - * - * @param viemPublicClient - viem PublicClient for blockchain interactions - * @param viemAccount - viem Account for signing operations - * @param options - Optional EIP4361 parameters (domain, uri) - */ - static async create( - viemPublicClient: PublicClient, - viemAccount: Account, - options?: EIP4361AuthProviderParams, - ): Promise { - // Convert viem objects to ethers objects internally - const ethersProvider = await createTacoProvider(viemPublicClient); - const ethersSigner = await createTacoSigner(viemAccount, ethersProvider); - - // Create the underlying ethers auth provider - // Type assertions are safe here because our TacoProvider/TacoSigner interfaces - // are designed to be compatible with ethers Provider/Signer interfaces - const ethersAuthProvider = new EIP4361AuthProvider( - ethersProvider as unknown as ethers.providers.Provider, - ethersSigner as unknown as ethers.Signer, - options, - ); - - return new ViemEIP4361AuthProvider(ethersAuthProvider); - } - - /** - * Get or create authentication signature - */ - async getOrCreateAuthSignature() { - return this.ethersAuthProvider.getOrCreateAuthSignature(); - } - - /** - * Get the underlying ethers auth provider (for advanced use cases) - */ - get ethersProvider(): EIP4361AuthProvider { - return this.ethersAuthProvider; - } -} - diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index 0a7481ecb..1fc4d3de9 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -1,3 +1,12 @@ +import { + type Account, + createTacoProvider, + createTacoSigner, + isViemAccount, + isViemClient, + type PublicClient, + validateProviderSignerCompatibility, +} from '@nucypher/shared'; import { ethers } from 'ethers'; import { SiweMessage } from 'siwe'; @@ -31,14 +40,30 @@ const TACO_DEFAULT_URI = 'https://taco.build'; * * Messages are valid for 2 hours from creation and stored locally keyed by the signer's address. * + * Supports both ethers.js and viem via constructor overloading and static factory methods. + * * @implements {AuthProvider} + * + * @example Ethers.js usage + * ```typescript + * const provider = new ethers.providers.JsonRpcProvider(); + * const signer = new ethers.Wallet(privateKey, provider); + * const authProvider = new EIP4361AuthProvider(provider, signer); + * ``` + * + * @example Viem usage + * ```typescript + * const publicClient = createPublicClient({ chain: polygon, transport: http() }); + * const account = privateKeyToAccount('0x...'); + * const authProvider = await EIP4361AuthProvider.create(publicClient, account); + * ``` */ export class EIP4361AuthProvider implements AuthProvider { private readonly storage: LocalStorage; private readonly providerParams: EIP4361AuthProviderParams; /** - * Creates a new EIP4361AuthProvider instance. + * Creates a new EIP4361AuthProvider instance with ethers.js objects. * * @param provider - Ethers provider used to fetch the current chainId * @param signer - Ethers signer used to sign SIWE messages @@ -68,6 +93,70 @@ export class EIP4361AuthProvider implements AuthProvider { } } + /** + * Create a new EIP4361AuthProvider instance with viem objects (async factory method). + * + * @param viemPublicClient - viem PublicClient for blockchain interactions + * @param viemAccount - viem Account for signing operations + * @param options - Optional EIP4361 parameters (domain, uri) + * @returns Promise resolving to EIP4361AuthProvider instance + */ + static async create( + viemPublicClient: PublicClient, + viemAccount: Account, + options?: EIP4361AuthProviderParams, + ): Promise; + + /** + * Create a new EIP4361AuthProvider instance with ethers.js objects (async factory method). + * + * @param provider - Ethers provider used to fetch the current chainId + * @param signer - Ethers signer used to sign SIWE messages + * @param options - Optional EIP4361 parameters (domain, uri) + * @returns Promise resolving to EIP4361AuthProvider instance + */ + static create( + provider: ethers.providers.Provider, + signer: ethers.Signer, + options?: EIP4361AuthProviderParams, + ): Promise; + + static async create( + providerOrClient: PublicClient | ethers.providers.Provider, + signerOrAccount: Account | ethers.Signer, + options?: EIP4361AuthProviderParams, + ): Promise { + // Validate that provider and signer types are compatible + validateProviderSignerCompatibility(providerOrClient, signerOrAccount); + + // Type guard to determine if we're using viem or ethers + if (isViemClient(providerOrClient) && isViemAccount(signerOrAccount)) { + // Viem path - async conversion needed + const viemPublicClient = providerOrClient as PublicClient; + const viemAccount = signerOrAccount as Account; + + const ethersProvider = await createTacoProvider(viemPublicClient); + const ethersSigner = await createTacoSigner(viemAccount, ethersProvider); + + // Type assertions are safe here because our TacoProvider/TacoSigner interfaces + // are designed to be compatible with ethers Provider/Signer interfaces + return new EIP4361AuthProvider( + ethersProvider as unknown as ethers.providers.Provider, + ethersSigner as unknown as ethers.Signer, + options, + ); + } else { + // Ethers path - direct construction (return as Promise for consistency) + return Promise.resolve( + new EIP4361AuthProvider( + providerOrClient as ethers.providers.Provider, + signerOrAccount as ethers.Signer, + options, + ), + ); + } + } + /** * Gets default domain and URI parameters based on runtime environment. * diff --git a/packages/taco-auth/src/providers/index.ts b/packages/taco-auth/src/providers/index.ts index 3c414f857..76b739f00 100644 --- a/packages/taco-auth/src/providers/index.ts +++ b/packages/taco-auth/src/providers/index.ts @@ -7,4 +7,3 @@ export { } from './eip4361/auth'; export * from './eip4361/eip4361'; export * from './eip4361/external-eip4361'; -export { ViemEIP4361AuthProvider } from './eip4361/eip4361-viem'; diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index fee03dfad..3b5edce27 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -12,7 +12,7 @@ npm install viem ### For Authentication Providers -If you need viem-compatible authentication providers (like `ViemEIP4361AuthProvider`), install the taco-auth package: +If you need authentication providers that work with viem, install the taco-auth package: ```bash npm install @nucypher/taco-auth viem @@ -156,15 +156,15 @@ function decrypt( For applications that need authentication providers compatible with viem, use the `@nucypher/taco-auth` package: -### ViemEIP4361AuthProvider +### EIP4361AuthProvider with Viem Support -Creates an EIP-4361 compliant authentication provider from viem objects: +The consolidated `EIP4361AuthProvider` now supports both ethers.js and viem through static factory methods: ```typescript -import { createPublicClient, createWalletClient, http } from 'viem'; +import { createPublicClient, http } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; -import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; +import { EIP4361AuthProvider } from '@nucypher/taco-auth'; const publicClient = createPublicClient({ chain: polygonAmoy, @@ -172,7 +172,8 @@ const publicClient = createPublicClient({ }); const account = privateKeyToAccount('0x...'); -const authProvider = await ViemEIP4361AuthProvider.create( +// Viem usage - uses async factory method +const authProvider = await EIP4361AuthProvider.create( publicClient, account, { @@ -184,16 +185,30 @@ const authProvider = await ViemEIP4361AuthProvider.create( const authSignature = await authProvider.getOrCreateAuthSignature(); ``` -**Parameters:** +**Viem Factory Method Parameters:** - `viemPublicClient`: `PublicClient` - Viem public client for network operations - `viemAccount`: `Account` - Viem account for signing - `options?`: `EIP4361AuthProviderParams` - Optional domain and URI for EIP-4361 messages +**Ethers.js Usage (for comparison):** + +```typescript +import { ethers } from 'ethers'; +import { EIP4361AuthProvider } from '@nucypher/taco-auth'; + +const provider = new ethers.providers.JsonRpcProvider(); +const signer = new ethers.Wallet('0x...', provider); + +// Ethers usage - can use constructor or factory method +const authProvider = new EIP4361AuthProvider(provider, signer); +// OR +const authProvider = await EIP4361AuthProvider.create(provider, signer); +``` + **Methods:** - `getOrCreateAuthSignature()`: Returns authentication signature for TACo operations -- `ethersProvider`: Getter for underlying ethers-compatible auth provider ## Package Architecture @@ -206,7 +221,7 @@ const authSignature = await authProvider.getOrCreateAuthSignature(); ### @nucypher/taco-auth - **Purpose**: Authentication providers and signing utilities -- **Viem Functions**: `ViemEIP4361AuthProvider` +- **Viem Functions**: `EIP4361AuthProvider.create()` with viem parameter overloading - **Dependencies**: Viem authentication and EIP-4361 signing This separation follows clean architecture principles - use the appropriate package based on your needs: diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts index f9d24ea0d..7f3c1a1a9 100644 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -3,8 +3,8 @@ import { beforeAll, describe, expect, test } from 'vitest'; import { fromBytes, toBytes } from '@nucypher/shared'; import { PublicClient, WalletClient } from '@nucypher/shared/src/viem-utils'; import { + EIP4361AuthProvider, USER_ADDRESS_PARAM_DEFAULT, - ViemEIP4361AuthProvider, } from '@nucypher/taco-auth'; import { createPublicClient, createWalletClient, http } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; @@ -119,16 +119,14 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( USER_ADDRESS_PARAM_DEFAULT, ) ) { - const viemAuthProvider = await ViemEIP4361AuthProvider.create( + const authProvider = await EIP4361AuthProvider.create( viemPublicClient, consumerAccount, ); - // Get the underlying ethers auth provider for context compatibility - const ethersAuthProvider = viemAuthProvider.ethersProvider; conditionContext.addAuthProvider( USER_ADDRESS_PARAM_DEFAULT, - ethersAuthProvider, + authProvider, ); } @@ -178,16 +176,15 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( const conditionContext = conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - // Add auth provider using ViemEIP4361AuthProvider - const viemAuthProvider = await ViemEIP4361AuthProvider.create( + // Add auth provider using consolidated EIP4361AuthProvider with viem support + const authProvider = await EIP4361AuthProvider.create( viemPublicClient, consumerAccount, ); - const ethersAuthProvider = viemAuthProvider.ethersProvider; conditionContext.addAuthProvider( USER_ADDRESS_PARAM_DEFAULT, - ethersAuthProvider, + authProvider, ); // Decrypt message using viem @@ -241,17 +238,15 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( const conditionContext = conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - // Add auth provider using ViemEIP4361AuthProvider with different client - const viemAuthProvider = await ViemEIP4361AuthProvider.create( + // Add auth provider using consolidated EIP4361AuthProvider with different client + const authProvider = await EIP4361AuthProvider.create( anotherViemPublicClient, consumerAccount, ); - // Get the ethers-compatible auth provider - const ethersAuthProvider = viemAuthProvider.ethersProvider; conditionContext.addAuthProvider( USER_ADDRESS_PARAM_DEFAULT, - ethersAuthProvider, + authProvider, ); // Decrypt using the different client diff --git a/packages/taco/src/conditions/context/context.ts b/packages/taco/src/conditions/context/context.ts index e52e21acd..c22993ac8 100644 --- a/packages/taco/src/conditions/context/context.ts +++ b/packages/taco/src/conditions/context/context.ts @@ -6,7 +6,6 @@ import { EIP4361AuthProvider, SingleSignOnEIP4361AuthProvider, USER_ADDRESS_PARAM_DEFAULT, - ViemEIP4361AuthProvider, } from '@nucypher/taco-auth'; import { CoreConditions, CoreContext } from '../../types'; @@ -46,15 +45,13 @@ const ERR_AUTH_PROVIDER_NOT_NEEDED_FOR_CONTEXT_PARAM = (param: string) => type AuthProviderType = | typeof EIP4361AuthProvider | typeof EIP1271AuthProvider - | typeof SingleSignOnEIP4361AuthProvider - | typeof ViemEIP4361AuthProvider; + | typeof SingleSignOnEIP4361AuthProvider; const EXPECTED_AUTH_PROVIDER_TYPES: Record = { [USER_ADDRESS_PARAM_DEFAULT]: [ EIP4361AuthProvider, EIP1271AuthProvider, SingleSignOnEIP4361AuthProvider, - ViemEIP4361AuthProvider, ], }; diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts index 2f656b665..173317d35 100644 --- a/packages/taco/src/encrypt-decrypt.ts +++ b/packages/taco/src/encrypt-decrypt.ts @@ -1,5 +1,12 @@ import { DkgPublicKey, ThresholdMessageKit } from '@nucypher/nucypher-core'; -import { type Account, Domain, type PublicClient } from '@nucypher/shared'; +import { + Account, + type Domain, + isViemAccount, + isViemClient, + PublicClient, + validateProviderSignerCompatibility, +} from '@nucypher/shared'; import { ethers } from 'ethers'; import { Condition } from './conditions/condition'; @@ -47,7 +54,7 @@ export async function encrypt( validateProviderSignerCompatibility(providerOrClient, signerOrAccount); // Type guard to determine if we're using viem or ethers - if (isViemClient(providerOrClient)) { + if (isViemClient(providerOrClient) && isViemAccount(signerOrAccount)) { return viemEncrypt( providerOrClient as PublicClient, domain, @@ -152,57 +159,3 @@ export async function decrypt( ); } } - -// Type guard to determine if the client is a viem PublicClient -function isViemClient( - client: ethers.providers.Provider | PublicClient, -): client is PublicClient { - const hasViemProperties = 'chain' in client; - const hasViemMethods = - typeof (client as { getChainId: () => Promise }).getChainId === - 'function'; - const isNotEthersProvider = !( - client instanceof ethers.providers.BaseProvider - ); - - return isNotEthersProvider && (hasViemProperties || hasViemMethods); -} - -// Type guard to determine if the signer is a viem Account -function isViemAccount(signer: ethers.Signer | Account): signer is Account { - // Check for viem Account properties - const hasViemAccountProperties = - 'address' in signer && - typeof (signer as { address: string }).address === 'string' && - !('provider' in signer); // ethers.Signer has provider property - - // Check if it's not an ethers.Signer - const isNotEthersSigner = !(signer instanceof ethers.Signer); - - return isNotEthersSigner && hasViemAccountProperties; -} - -// Validate that provider and signer types are compatible -function validateProviderSignerCompatibility( - providerOrClient: ethers.providers.Provider | PublicClient, - signerOrAccount: ethers.Signer | Account, -): void { - const isViemProvider = isViemClient(providerOrClient); - const isViemSigner = isViemAccount(signerOrAccount); - - if (isViemProvider && !isViemSigner) { - throw new Error( - 'Type mismatch: viem PublicClient provided but ethers.Signer detected. ' + - 'When using viem, please provide a viem Account. ' + - 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)', - ); - } - - if (!isViemProvider && isViemSigner) { - throw new Error( - 'Type mismatch: ethers.Provider provided but viem Account detected. ' + - 'When using ethers, please provide an ethers.Signer. ' + - 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)', - ); - } -} From a8acc555c1ddef3b282056ba7c41f61a900e3434 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:00:42 +0200 Subject: [PATCH 33/97] add a method doc --- packages/taco/src/encrypt-decrypt.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts index 173317d35..34ee0c5dc 100644 --- a/packages/taco/src/encrypt-decrypt.ts +++ b/packages/taco/src/encrypt-decrypt.ts @@ -90,6 +90,26 @@ export function encryptWithPublicKey( viemAuthSigner: Account, ): Promise; +/** + * Encrypts a message with the given DKG public key under a specified condition. + * Supports both ethers.js and viem signers for maximum flexibility. + * + * Note: This function can be used offline since it doesn't require network access to fetch + * the DKG public key (unlike the `encrypt` function which fetches it from the ritual). + * + * @export + * @param {Uint8Array | string} message - The message to be encrypted. + * @param {Condition} condition - Condition under which the message will be encrypted. Those conditions must be + * satisfied in order to decrypt the message. + * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption. + * @param {ethers.Signer | Account} signerOrAccount - The signer that will be used to sign the encrypter authorization. + * Can be either an ethers.js Signer or a viem Account object. + * + * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit. + * It represents the encrypted message. + * + * @throws {Error} If the encryption process throws an error, an error is thrown. + */ // Implementation that routes to the appropriate function export async function encryptWithPublicKey( message: Uint8Array | string, From 870987ffc28625961138cd3cd0fea12c33a05d20 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:10:34 +0200 Subject: [PATCH 34/97] refactor: replace viem provider/signer wrappers with direct implementations --- packages/shared/src/viem-adapters.ts | 305 ++++++++++++++++++--------- packages/shared/src/viem-utils.ts | 286 +------------------------ 2 files changed, 205 insertions(+), 386 deletions(-) diff --git a/packages/shared/src/viem-adapters.ts b/packages/shared/src/viem-adapters.ts index b7a71f5f5..7330bf424 100644 --- a/packages/shared/src/viem-adapters.ts +++ b/packages/shared/src/viem-adapters.ts @@ -5,107 +5,199 @@ import { type Account, checkViemAvailability, type PublicClient, - ViemProviderBase, - ViemSignerBase, type ViemTypedDataDomain, type ViemTypedDataParameter, type WalletClient, } from './viem-utils'; /** - * Unified Viem Provider Adapter + * Viem TACo Provider * - * This adapter implements the TacoProvider interface using viem wrappers. + * This class implements the TacoProvider interface directly using viem clients. * It bridges the gap between viem and ethers.js interfaces. * Used by both taco and taco-auth packages to avoid code duplication. */ -export class ViemProviderAdapter implements TacoProvider { - private readonly viemWrapper: ViemProviderBase; +export class ViemTacoProvider implements TacoProvider { + protected viemPublicClient: PublicClient; // Ethers.js compatibility property for contract validation readonly _isProvider = true; + readonly _network: Promise; + readonly formatter?: undefined = undefined; - constructor(viemWrapper: ViemProviderBase) { - this.viemWrapper = viemWrapper; + constructor(viemPublicClient: PublicClient) { + this.viemPublicClient = viemPublicClient; + // Initialize network for ethers compatibility + this._network = this.getNetwork(); } async getNetwork(): Promise { - return this.viemWrapper.getNetwork(); - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - return this.viemWrapper.call(transaction); + const chainId = await this.viemPublicClient.getChainId(); + const name = this.viemPublicClient.chain?.name || `chain-${chainId}`; + return { + name, + chainId, + }; } async getBlockNumber(): Promise { - return this.viemWrapper.getBlockNumber(); + return Number(await this.viemPublicClient.getBlockNumber()); } async getBalance( address: string, blockTag?: string | number, ): Promise { - return this.viemWrapper.getBalance(address, blockTag); + const address_0x = address as `0x${string}`; + let balance: bigint; + + if ( + blockTag === 'latest' || + blockTag === 'pending' || + blockTag === 'earliest' || + blockTag === 'safe' || + blockTag === 'finalized' + ) { + balance = await this.viemPublicClient.getBalance({ + address: address_0x, + blockTag: blockTag, + }); + } else if ( + typeof blockTag === 'number' || + (typeof blockTag === 'string' && blockTag.startsWith('0x')) + ) { + balance = await this.viemPublicClient.getBalance({ + address: address_0x, + blockNumber: BigInt(blockTag), + }); + } else { + balance = await this.viemPublicClient.getBalance({ + address: address_0x, + }); + } + return ethers.BigNumber.from(balance.toString()); } async getTransactionCount(address: string): Promise { - return this.viemWrapper.getTransactionCount(address); + return await this.viemPublicClient.getTransactionCount({ + address: address as `0x${string}`, + }); } - async getCode(address: string): Promise { - return this.viemWrapper.getCode(address); + async getCode(address: string): Promise<`0x${string}` | undefined> { + return await this.viemPublicClient.getCode({ + address: address as `0x${string}`, + }); + } + + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { + const result = await this.viemPublicClient.call({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + }); + if (typeof result === 'object' && result && 'data' in result) { + return result.data as string; + } + return result as string; } async estimateGas( transaction: ethers.providers.TransactionRequest, ): Promise { - return this.viemWrapper.estimateGas(transaction); + const viemTransaction = { + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + }; + const gas = await this.viemPublicClient.estimateGas(viemTransaction); + return ethers.BigNumber.from(gas.toString()); } async getGasPrice(): Promise { - return this.viemWrapper.getGasPrice(); + const gasPrice = await this.viemPublicClient.getGasPrice(); + return ethers.BigNumber.from(gasPrice.toString()); } async getFeeData(): Promise { - return this.viemWrapper.getFeeData(); + const feeData = await this.viemPublicClient.getFeeHistory({ + blockCount: 4, + blockTag: 'latest' as const, + rewardPercentiles: [25, 50, 75], + }); + const latestBaseFee = + feeData.baseFeePerGas[feeData.baseFeePerGas.length - 1]; + const latestReward = feeData.reward?.[feeData.reward.length - 1]; + const medianPriorityFee = latestReward ? latestReward[1] : BigInt(0); + + return { + maxFeePerGas: ethers.BigNumber.from( + (latestBaseFee + medianPriorityFee).toString(), + ), + maxPriorityFeePerGas: ethers.BigNumber.from(medianPriorityFee.toString()), + gasPrice: ethers.BigNumber.from(latestBaseFee.toString()), + lastBaseFeePerGas: ethers.BigNumber.from(latestBaseFee.toString()), + }; } async resolveName(name: string): Promise { - return this.viemWrapper.resolveName(name); + try { + return await this.viemPublicClient.getEnsAddress({ + name: name as string, + }); + } catch { + return null; + } } async lookupAddress(address: string): Promise { - return this.viemWrapper.lookupAddress(address); + try { + return await this.viemPublicClient.getEnsName({ + address: address as `0x${string}`, + }); + } catch { + return null; + } } } /** - * Unified Viem Signer Adapter + * Viem TACo Signer * - * This adapter implements the TacoSigner interface using viem wrappers. + * This class implements the TacoSigner interface directly using viem accounts. * It bridges the gap between viem and ethers.js interfaces. * Used by both taco and taco-auth packages to avoid code duplication. */ -class ViemSignerAdapter implements TacoSigner { - private readonly viemWrapper: ViemSignerBase; +export class ViemTacoSigner implements TacoSigner { + protected viemAccount: Account; public readonly provider?: TacoProvider | undefined; - // Ethers.js compatibility property for contract validation + // Ethers.js compatibility properties for contract validation readonly _isSigner = true; - constructor(viemWrapper: ViemSignerBase, provider?: TacoProvider | undefined) { - this.viemWrapper = viemWrapper; + constructor(viemAccount: Account, provider?: TacoProvider | undefined) { + this.viemAccount = viemAccount; this.provider = provider; } async getAddress(): Promise { - return this.viemWrapper.getAddress(); + return this.viemAccount.address; } async signMessage(message: string | Uint8Array): Promise { - return this.viemWrapper.signMessage(message); + await checkViemAvailability(); + if (!this.viemAccount.signMessage) { + throw new Error('Account does not support message signing'); + } + const messageToSign = + typeof message === 'string' ? message : ethers.utils.hexlify(message); + return await this.viemAccount.signMessage({ message: messageToSign }); } async signTypedData( @@ -113,115 +205,122 @@ class ViemSignerAdapter implements TacoSigner { types: Record>, message: Record, ): Promise { - // Convert ethers types to viem types for compatibility - const viemDomain = domain as unknown as ViemTypedDataDomain; - const viemTypes = types as unknown as Record< - string, - readonly ViemTypedDataParameter[] - >; - return this.viemWrapper.signTypedData(viemDomain, viemTypes, message); + await checkViemAvailability(); + if (!this.viemAccount.signTypedData) { + throw new Error('Account does not support typed data signing'); + } + + // Convert ethers domain to viem domain - handle BigNumberish types + let chainId: number | bigint | undefined; + if (domain.chainId === undefined || domain.chainId === null) { + chainId = undefined; + } else if (typeof domain.chainId === 'string') { + chainId = parseInt(domain.chainId); + } else if (typeof domain.chainId === 'number') { + chainId = domain.chainId; + } else if (typeof domain.chainId === 'bigint') { + chainId = domain.chainId; + } else if ( + typeof domain.chainId === 'object' && + 'toNumber' in domain.chainId + ) { + // Handle ethers BigNumber + chainId = (domain.chainId as any).toNumber(); + } else { + // Fallback for other BigNumberish types + chainId = Number(domain.chainId); + } + + const viemDomain: ViemTypedDataDomain = { + name: domain.name, + version: domain.version, + chainId, + verifyingContract: domain.verifyingContract as `0x${string}`, + salt: domain.salt as `0x${string}`, + }; + + // Convert ethers types to viem types + const viemTypes: Record = {}; + for (const [key, value] of Object.entries(types)) { + viemTypes[key] = value.map((field) => ({ + name: field.name, + type: field.type, + })); + } + + return await this.viemAccount.signTypedData({ + domain: viemDomain, + types: viemTypes, + message, + primaryType: + Object.keys(viemTypes).find((key) => key !== 'EIP712Domain') || + 'Message', + }); } async getBalance(): Promise { - return this.viemWrapper.getBalance(); + if (!this.provider) { + throw new Error('Provider is required for getBalance operation'); + } + return await this.provider.getBalance(this.viemAccount.address); } async getTransactionCount(): Promise { - return this.viemWrapper.getTransactionCount(); + if (!this.provider) { + throw new Error('Provider is required for getTransactionCount operation'); + } + return await this.provider.getTransactionCount(this.viemAccount.address); } async estimateGas( transaction: ethers.providers.TransactionRequest, ): Promise { - return this.viemWrapper.estimateGas(transaction); + if (!this.provider) { + throw new Error('Provider is required for estimateGas operation'); + } + return await this.provider.estimateGas(transaction); } async call( transaction: ethers.providers.TransactionRequest, ): Promise { - return this.viemWrapper.call(transaction); - } - - connect(provider: TacoProvider): TacoSigner { - // For viem adapters, we need to create a new signer with the new provider - if (!(provider instanceof ViemProviderAdapter)) { - throw new Error('Provider must be a ViemProviderAdapter'); + if (!this.provider) { + throw new Error('Provider is required for call operation'); } - const newViemWrapper = this.viemWrapper.connect( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (provider as any).viemWrapper, - ); - return new ViemSignerAdapter(newViemWrapper, provider); + return await this.provider.call(transaction); } -} -/** - * Concrete viem provider wrapper implementation - */ -export class ConcreteViemProvider extends ViemProviderBase { - constructor(viemPublicClient: PublicClient) { - super(viemPublicClient); - } -} - -/** - * Concrete viem signer wrapper implementation - */ -class ConcreteViemSigner extends ViemSignerBase { - constructor(viemAccount: Account, provider?: ViemProviderBase | undefined) { - super(viemAccount, provider); - } - - connect(provider?: ViemProviderBase | undefined): ViemSignerBase { - return new ConcreteViemSigner(this['viemAccount'], provider); + connect(provider: TacoProvider): TacoSigner { + return new ViemTacoSigner(this.viemAccount, provider); } } /** - * Create a TACo provider adapter from viem PublicClient + * Create a TACo provider from viem PublicClient * - * This function creates a viem wrapper and then wraps it in a TacoProvider adapter. + * This function creates a TacoProvider directly from a viem client. */ export async function createTacoProvider( viemPublicClient: PublicClient, ): Promise { await checkViemAvailability(); - const viemWrapper = new ConcreteViemProvider(viemPublicClient); - return new ViemProviderAdapter(viemWrapper); + return new ViemTacoProvider(viemPublicClient); } /** - * Create a TACo signer adapter from viem Account + * Create a TACo signer from viem Account + * + * This function creates a TacoSigner directly from a viem account. * - * This function creates a viem wrapper and then wraps it in a TacoSigner adapter. - * * @param viemAccount - Viem account for signing operations - * @param provider - Optional TACo provider. If not provided, a minimal provider will be created for signing-only operations + * @param provider - Optional TACo provider. If not provided, some operations will require a provider */ -export async function createTacoSigner( - viemAccount: Account, - provider?: TacoProvider, -): Promise; -export async function createTacoSigner( - viemAccount: Account, -): Promise; export async function createTacoSigner( viemAccount: Account, provider?: TacoProvider, ): Promise { await checkViemAvailability(); - - // If provider is provided, validate it's a ViemProviderAdapter - if (provider && !(provider instanceof ViemProviderAdapter)) { - throw new Error('Provider must be a ViemProviderAdapter'); - } - - const viemWrapper = new ConcreteViemSigner( - viemAccount, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - provider ? (provider as any).viemWrapper : undefined, - ); - return new ViemSignerAdapter(viemWrapper, provider); + return new ViemTacoSigner(viemAccount, provider); } /** diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 0fcc033db..b9f19615c 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -1,9 +1,6 @@ /** * Shared viem utilities for TACo packages * - * This module provides consistent viem integration utilities across all TACo packages, - * eliminating code duplication while maintaining clean architecture. - * * Features: * - Optional viem dependency handling with helpful error messages * - Dynamic import pattern that's webpack-compatible @@ -13,16 +10,13 @@ * * Usage: * ```typescript - * import { checkViemAvailability, type PublicClient, ViemProviderBase } from '@nucypher/shared'; + * import { checkViemAvailability, type PublicClient } from '@nucypher/shared'; * - * class MyViemProvider extends ViemProviderBase { - * // Add package-specific methods - * } + * // Use viem clients directly with TACo adapters + * const tacoProvider = await createTacoProvider(viemPublicClient); * ``` */ -import { ethers } from 'ethers'; - // Type helper: Use the real type from 'viem' if available, otherwise fallback to 'any' // This pattern preserves type safety for consumers who have 'viem' installed, but does not break for others. // See: https://github.com/microsoft/TypeScript/issues/47663#issuecomment-1367016530 @@ -117,277 +111,3 @@ export async function checkViemAvailability(): Promise { ); } } - -/** - * Base provider class that implements common viem-to-ethers provider wrapper functionality - * - * This class contains all the shared implementation logic between taco and taco-auth packages. - * Package-specific provider classes can extend this to add additional methods. - */ -export abstract class ViemProviderBase { - protected viemPublicClient: PublicClient; - - readonly _network: Promise; - readonly formatter?: undefined = undefined; - - constructor(viemPublicClient: PublicClient) { - this.viemPublicClient = viemPublicClient; - // Initialize network for ethers compatibility - this._network = this.getNetwork(); - } - - async getNetwork(): Promise { - const chainId = await this.viemPublicClient.getChainId(); - const name = this.viemPublicClient.chain?.name || `chain-${chainId}`; - return { - name, - chainId, - }; - } - - async getBlockNumber(): Promise { - return Number(await this.viemPublicClient.getBlockNumber()); - } - - async getBalance( - address: string, - blockTag?: string | number, - ): Promise { - const address_0x = address as `0x${string}`; - let balance: bigint; - - if ( - blockTag === 'latest' || - blockTag === 'pending' || - blockTag === 'earliest' || - blockTag === 'safe' || - blockTag === 'finalized' - ) { - // Use blockTag for predefined string values - balance = await this.viemPublicClient.getBalance({ - address: address_0x, - blockTag: blockTag, - }); - } else if ( - typeof blockTag === 'number' || - (typeof blockTag === 'string' && blockTag.startsWith('0x')) - ) { - // Use blockNumber for hex string values - balance = await this.viemPublicClient.getBalance({ - address: address_0x, - blockNumber: BigInt(blockTag), - }); - } else { - // Default case (undefined or unrecognized) - use latest - balance = await this.viemPublicClient.getBalance({ - address: address_0x, - }); - } - return ethers.BigNumber.from(balance.toString()); - } - - /** - * @remarks The _blockTag?: string | number parameter is not used in TACo, so it is not implemented - */ - async getTransactionCount(address: string): Promise { - return await this.viemPublicClient.getTransactionCount({ - address: address as `0x${string}`, - }); - } - - /** - * @remarks The _blockTag?: string | number parameter is not used in TACo, so it is not implemented - */ - async getCode(address: string): Promise<`0x${string}` | undefined> { - return await this.viemPublicClient.getCode({ - address: address as `0x${string}`, - }); - } - - /** - * @remarks The _blockTag?: string | number parameter is not used in TACo, so it is not implemented - */ - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - const result = await this.viemPublicClient.call({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - }); - // viem may return "0x..." (string) or {data: "0x..."} (object) - if (typeof result === 'object' && result && 'data' in result) { - return result.data as string; - } - return result as string; - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - const viemTransaction = { - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - }; - const gas = await this.viemPublicClient.estimateGas(viemTransaction); - return ethers.BigNumber.from(gas.toString()); - } - - async getGasPrice(): Promise { - const gasPrice = await this.viemPublicClient.getGasPrice(); - return ethers.BigNumber.from(gasPrice.toString()); - } - - async getBlock(blockHashOrBlockTag: string | number): Promise { - if ( - typeof blockHashOrBlockTag === 'string' && - blockHashOrBlockTag.startsWith('0x') - ) { - return await this.viemPublicClient.getBlock({ - blockHash: blockHashOrBlockTag as `0x${string}`, - }); - } else { - return await this.viemPublicClient.getBlock({ - blockNumber: BigInt(blockHashOrBlockTag), - }); - } - } - - async getFeeData(): Promise { - const feeData = await this.viemPublicClient.getFeeHistory({ - blockCount: 4, - blockTag: 'latest' as const, - rewardPercentiles: [25, 50, 75], - }); - // Use the latest base fee and priority fee - const latestBaseFee = - feeData.baseFeePerGas[feeData.baseFeePerGas.length - 1]; - const latestReward = feeData.reward?.[feeData.reward.length - 1]; - const medianPriorityFee = latestReward ? latestReward[1] : BigInt(0); - - return { - maxFeePerGas: ethers.BigNumber.from( - (latestBaseFee + medianPriorityFee).toString(), - ), - maxPriorityFeePerGas: ethers.BigNumber.from(medianPriorityFee.toString()), - gasPrice: ethers.BigNumber.from(latestBaseFee.toString()), - lastBaseFeePerGas: ethers.BigNumber.from(latestBaseFee.toString()), - }; - } - - async resolveName(name: string): Promise { - try { - return await this.viemPublicClient.getEnsAddress({ - name: name as string, - }); - } catch { - return null; - } - } - - async lookupAddress(address: string): Promise { - try { - return await this.viemPublicClient.getEnsName({ - address: address as `0x${string}`, - }); - } catch { - return null; - } - } -} - -/** - * Base class for signers that wrap viem Account objects - * - * This class contains all the shared implementation logic between taco and taco-auth packages. - * Package-specific signer classes can extend this to add additional methods. - */ -export abstract class ViemSignerBase { - protected viemAccount: Account; - public readonly provider?: ViemProviderBase | undefined; - - // Ethers.js compatibility properties for contract validation - readonly _isSigner: boolean = true; - - constructor(viemAccount: Account, provider?: ViemProviderBase | undefined) { - this.viemAccount = viemAccount; - this.provider = provider; - } - - async getAddress(): Promise { - return this.viemAccount.address; - } - - async signMessage(message: string | Uint8Array): Promise { - await checkViemAvailability(); - if (!this.viemAccount.signMessage) { - throw new Error('Account does not support message signing'); - } - // Convert message to hex if it's Uint8Array for compatibility - const messageToSign = - typeof message === 'string' ? message : ethers.utils.hexlify(message); - return await this.viemAccount.signMessage({ message: messageToSign }); - } - - async getBalance(): Promise { - if (!this.provider) { - throw new Error('Provider is required for getBalance operation'); - } - return await this.provider.getBalance(this.viemAccount.address); - } - - async getTransactionCount(): Promise { - if (!this.provider) { - throw new Error('Provider is required for getTransactionCount operation'); - } - return await this.provider.getTransactionCount(this.viemAccount.address); - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - if (!this.provider) { - throw new Error('Provider is required for estimateGas operation'); - } - return await this.provider.estimateGas(transaction); - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - if (!this.provider) { - throw new Error('Provider is required for call operation'); - } - return await this.provider.call(transaction); - } - - async signTypedData( - domain: ViemTypedDataDomain, - types: Record, - message: Record, - ): Promise { - await checkViemAvailability(); - if (!this.viemAccount.signTypedData) { - throw new Error('Account does not support typed data signing'); - } - - return await this.viemAccount.signTypedData({ - domain, - types, - message, - primaryType: - Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', - }); - } - - /** - * Connect this signer to a different provider - * This method should be implemented by concrete signer classes - */ - abstract connect(provider?: ViemProviderBase): ViemSignerBase; -} From 617fd25be4e6f2c6f06585728eb4b3373d4c0639 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 8 Sep 2025 18:50:07 +0200 Subject: [PATCH 35/97] remove un-used methods from Provider and Signer --- packages/shared/src/taco-interfaces.ts | 93 +-------- packages/shared/src/viem-adapters.ts | 211 +-------------------- packages/shared/src/viem-utils.ts | 26 --- packages/shared/test/viem-adapters.test.ts | 17 +- 4 files changed, 3 insertions(+), 344 deletions(-) diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index 26b4e4060..eb8d2e502 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -1,4 +1,4 @@ -import { ethers, TypedDataDomain, TypedDataField } from 'ethers'; +import { ethers } from 'ethers'; /** * Basic TACo Provider interface @@ -22,56 +22,6 @@ export interface TacoProvider { * Make a contract call */ call(transaction: ethers.providers.TransactionRequest): Promise; - - /** - * Get the current block number - */ - getBlockNumber(): Promise; - - /** - * Get balance for an address - */ - getBalance( - address: string, - blockTag?: string | number, - ): Promise; - - /** - * Get transaction count for an address - */ - getTransactionCount(address: string): Promise; - - /** - * Get code at an address - */ - getCode(address: string): Promise; - - /** - * Estimate gas for a transaction - */ - estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise; - - /** - * Get current gas price - */ - getGasPrice(): Promise; - - /** - * Get fee data for EIP-1559 transactions - */ - getFeeData(): Promise; - - /** - * Resolve ENS name to address - */ - resolveName(name: string): Promise; - - /** - * Lookup ENS name for address - */ - lookupAddress(address: string): Promise; } /** @@ -82,11 +32,6 @@ export interface TacoProvider { * focuses only on the methods that TACo actually uses. */ export interface TacoSigner { - /** - * Ethers.js compatibility property for contract validation - */ - readonly _isSigner: true; - /** * The provider this signer is connected to (optional for signing-only operations) */ @@ -101,40 +46,4 @@ export interface TacoSigner { * Sign a message */ signMessage(message: string | Uint8Array): Promise; - - /** - * Sign typed data (EIP-712) - */ - signTypedData( - domain: TypedDataDomain, - types: Record>, - message: Record, - ): Promise; - - /** - * Get balance for this signer's address - */ - getBalance(): Promise; - - /** - * Get transaction count for this signer's address - */ - getTransactionCount(): Promise; - - /** - * Estimate gas for a transaction - */ - estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise; - - /** - * Make a contract call using this signer's address - */ - call(transaction: ethers.providers.TransactionRequest): Promise; - - /** - * Connect this signer to a different provider - */ - connect(provider: TacoProvider): TacoSigner; } diff --git a/packages/shared/src/viem-adapters.ts b/packages/shared/src/viem-adapters.ts index 7330bf424..2c13f733d 100644 --- a/packages/shared/src/viem-adapters.ts +++ b/packages/shared/src/viem-adapters.ts @@ -1,12 +1,10 @@ -import { ethers, TypedDataDomain, TypedDataField } from 'ethers'; +import { ethers } from 'ethers'; import { type TacoProvider, type TacoSigner } from './taco-interfaces'; import { type Account, checkViemAvailability, type PublicClient, - type ViemTypedDataDomain, - type ViemTypedDataParameter, type WalletClient, } from './viem-utils'; @@ -40,56 +38,6 @@ export class ViemTacoProvider implements TacoProvider { }; } - async getBlockNumber(): Promise { - return Number(await this.viemPublicClient.getBlockNumber()); - } - - async getBalance( - address: string, - blockTag?: string | number, - ): Promise { - const address_0x = address as `0x${string}`; - let balance: bigint; - - if ( - blockTag === 'latest' || - blockTag === 'pending' || - blockTag === 'earliest' || - blockTag === 'safe' || - blockTag === 'finalized' - ) { - balance = await this.viemPublicClient.getBalance({ - address: address_0x, - blockTag: blockTag, - }); - } else if ( - typeof blockTag === 'number' || - (typeof blockTag === 'string' && blockTag.startsWith('0x')) - ) { - balance = await this.viemPublicClient.getBalance({ - address: address_0x, - blockNumber: BigInt(blockTag), - }); - } else { - balance = await this.viemPublicClient.getBalance({ - address: address_0x, - }); - } - return ethers.BigNumber.from(balance.toString()); - } - - async getTransactionCount(address: string): Promise { - return await this.viemPublicClient.getTransactionCount({ - address: address as `0x${string}`, - }); - } - - async getCode(address: string): Promise<`0x${string}` | undefined> { - return await this.viemPublicClient.getCode({ - address: address as `0x${string}`, - }); - } - async call( transaction: ethers.providers.TransactionRequest, ): Promise { @@ -105,66 +53,6 @@ export class ViemTacoProvider implements TacoProvider { } return result as string; } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - const viemTransaction = { - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - }; - const gas = await this.viemPublicClient.estimateGas(viemTransaction); - return ethers.BigNumber.from(gas.toString()); - } - - async getGasPrice(): Promise { - const gasPrice = await this.viemPublicClient.getGasPrice(); - return ethers.BigNumber.from(gasPrice.toString()); - } - - async getFeeData(): Promise { - const feeData = await this.viemPublicClient.getFeeHistory({ - blockCount: 4, - blockTag: 'latest' as const, - rewardPercentiles: [25, 50, 75], - }); - const latestBaseFee = - feeData.baseFeePerGas[feeData.baseFeePerGas.length - 1]; - const latestReward = feeData.reward?.[feeData.reward.length - 1]; - const medianPriorityFee = latestReward ? latestReward[1] : BigInt(0); - - return { - maxFeePerGas: ethers.BigNumber.from( - (latestBaseFee + medianPriorityFee).toString(), - ), - maxPriorityFeePerGas: ethers.BigNumber.from(medianPriorityFee.toString()), - gasPrice: ethers.BigNumber.from(latestBaseFee.toString()), - lastBaseFeePerGas: ethers.BigNumber.from(latestBaseFee.toString()), - }; - } - - async resolveName(name: string): Promise { - try { - return await this.viemPublicClient.getEnsAddress({ - name: name as string, - }); - } catch { - return null; - } - } - - async lookupAddress(address: string): Promise { - try { - return await this.viemPublicClient.getEnsName({ - address: address as `0x${string}`, - }); - } catch { - return null; - } - } } /** @@ -178,9 +66,6 @@ export class ViemTacoSigner implements TacoSigner { protected viemAccount: Account; public readonly provider?: TacoProvider | undefined; - // Ethers.js compatibility properties for contract validation - readonly _isSigner = true; - constructor(viemAccount: Account, provider?: TacoProvider | undefined) { this.viemAccount = viemAccount; this.provider = provider; @@ -199,100 +84,6 @@ export class ViemTacoSigner implements TacoSigner { typeof message === 'string' ? message : ethers.utils.hexlify(message); return await this.viemAccount.signMessage({ message: messageToSign }); } - - async signTypedData( - domain: TypedDataDomain, - types: Record>, - message: Record, - ): Promise { - await checkViemAvailability(); - if (!this.viemAccount.signTypedData) { - throw new Error('Account does not support typed data signing'); - } - - // Convert ethers domain to viem domain - handle BigNumberish types - let chainId: number | bigint | undefined; - if (domain.chainId === undefined || domain.chainId === null) { - chainId = undefined; - } else if (typeof domain.chainId === 'string') { - chainId = parseInt(domain.chainId); - } else if (typeof domain.chainId === 'number') { - chainId = domain.chainId; - } else if (typeof domain.chainId === 'bigint') { - chainId = domain.chainId; - } else if ( - typeof domain.chainId === 'object' && - 'toNumber' in domain.chainId - ) { - // Handle ethers BigNumber - chainId = (domain.chainId as any).toNumber(); - } else { - // Fallback for other BigNumberish types - chainId = Number(domain.chainId); - } - - const viemDomain: ViemTypedDataDomain = { - name: domain.name, - version: domain.version, - chainId, - verifyingContract: domain.verifyingContract as `0x${string}`, - salt: domain.salt as `0x${string}`, - }; - - // Convert ethers types to viem types - const viemTypes: Record = {}; - for (const [key, value] of Object.entries(types)) { - viemTypes[key] = value.map((field) => ({ - name: field.name, - type: field.type, - })); - } - - return await this.viemAccount.signTypedData({ - domain: viemDomain, - types: viemTypes, - message, - primaryType: - Object.keys(viemTypes).find((key) => key !== 'EIP712Domain') || - 'Message', - }); - } - - async getBalance(): Promise { - if (!this.provider) { - throw new Error('Provider is required for getBalance operation'); - } - return await this.provider.getBalance(this.viemAccount.address); - } - - async getTransactionCount(): Promise { - if (!this.provider) { - throw new Error('Provider is required for getTransactionCount operation'); - } - return await this.provider.getTransactionCount(this.viemAccount.address); - } - - async estimateGas( - transaction: ethers.providers.TransactionRequest, - ): Promise { - if (!this.provider) { - throw new Error('Provider is required for estimateGas operation'); - } - return await this.provider.estimateGas(transaction); - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - if (!this.provider) { - throw new Error('Provider is required for call operation'); - } - return await this.provider.call(transaction); - } - - connect(provider: TacoProvider): TacoSigner { - return new ViemTacoSigner(this.viemAccount, provider); - } } /** diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index b9f19615c..61920ef91 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -24,9 +24,6 @@ type _ViemPublicClient = import('viem').PublicClient; type _ViemAccount = import('viem').Account; type _ViemWalletClient = import('viem').WalletClient; -type _ViemBlock = import('viem').Block; -type _ViemTypedDataDomain = import('viem').TypedDataDomain; -type _ViemTypedDataParameter = import('viem').TypedDataParameter; /** * Viem PublicClient type for read operations @@ -52,29 +49,6 @@ export type WalletClient = [unknown] extends [_ViemWalletClient] any : _ViemWalletClient; -/** - * Viem Block type for block operations - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type ViemBlock = [unknown] extends [_ViemBlock] ? any : _ViemBlock; - -/** - * Viem TypedDataDomain type for EIP-712 domain - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type ViemTypedDataDomain = [unknown] extends [_ViemTypedDataDomain] - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - any - : _ViemTypedDataDomain; - -/** - * Viem TypedDataParameter type for EIP-712 parameters - */ -export type ViemTypedDataParameter = [unknown] extends [_ViemTypedDataParameter] - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - any - : _ViemTypedDataParameter; - // Internal state for tracking viem availability let isViemAvailable = false; diff --git a/packages/shared/test/viem-adapters.test.ts b/packages/shared/test/viem-adapters.test.ts index d86357e26..6059219e1 100644 --- a/packages/shared/test/viem-adapters.test.ts +++ b/packages/shared/test/viem-adapters.test.ts @@ -25,21 +25,11 @@ describe('viem adapter utilities', () => { getChainId: vi.fn().mockResolvedValue(80002), getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), call: vi.fn().mockResolvedValue('0x'), - getBalance: vi.fn().mockResolvedValue(BigInt(0)), - getTransactionCount: vi.fn().mockResolvedValue(0), - estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), - getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), } as any; - const provider = await createTacoProvider(mockViemPublicClient); - expect(provider).toBeDefined(); expect(provider.getNetwork).toBeDefined(); - expect(provider.getBlockNumber).toBeDefined(); expect(provider.call).toBeDefined(); - expect(provider.getBalance).toBeDefined(); - expect(provider.getTransactionCount).toBeDefined(); - expect(provider.getGasPrice).toBeDefined(); }); }); @@ -52,12 +42,7 @@ describe('viem adapter utilities', () => { const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), - getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), call: vi.fn().mockResolvedValue('0x'), - getBalance: vi.fn().mockResolvedValue(BigInt(0)), - getTransactionCount: vi.fn().mockResolvedValue(0), - estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), - getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), } as any; const tacoProvider = await createTacoProvider(mockViemPublicClient); @@ -108,7 +93,7 @@ describe('viem adapter utilities', () => { } as any; await expect( - createTacoFromViem(mockViemPublicClient, mockViemWalletClient) + createTacoFromViem(mockViemPublicClient, mockViemWalletClient), ).rejects.toThrow('Wallet client must have an account attached'); }); }); From 94b6c6113dab0db4d107047317ff223369134d52 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 9 Sep 2025 12:05:34 +0200 Subject: [PATCH 36/97] relax some validations and remove un-needed async promises in some returns --- packages/shared/src/taco-interfaces.ts | 2 +- packages/shared/src/type-guards.ts | 27 ---------- packages/shared/src/viem-adapters.ts | 27 +++++----- packages/shared/src/viem-utils.ts | 39 +-------------- packages/shared/test/viem-adapters.test.ts | 10 ++-- .../src/providers/eip4361/eip4361.ts | 32 +++++------- packages/taco/package.json | 2 +- packages/taco/src/encrypt-decrypt.ts | 6 +-- packages/taco/test/taco.test.ts | 49 +++++++++---------- packages/taco/test/viem-taco.test.ts | 9 +++- 10 files changed, 64 insertions(+), 139 deletions(-) diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index eb8d2e502..e80a3443d 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -11,7 +11,7 @@ export interface TacoProvider { /** * Ethers.js compatibility property for contract validation */ - readonly _isProvider: true; + readonly _isProvider: boolean; /** * Get network information diff --git a/packages/shared/src/type-guards.ts b/packages/shared/src/type-guards.ts index c38b83d2e..2f9143ed4 100644 --- a/packages/shared/src/type-guards.ts +++ b/packages/shared/src/type-guards.ts @@ -36,30 +36,3 @@ export function isViemAccount( return isNotEthersSigner && hasViemAccountProperties; } - -/** - * Validate that provider and signer types are compatible - */ -export function validateProviderSignerCompatibility( - providerOrClient: ethers.providers.Provider | PublicClient, - signerOrAccount: ethers.Signer | Account, -): void { - const isViemProvider = isViemClient(providerOrClient); - const isViemSigner = isViemAccount(signerOrAccount); - - if (isViemProvider && !isViemSigner) { - throw new Error( - 'Type mismatch: viem PublicClient provided but ethers.Signer detected. ' + - 'When using viem, please provide a viem Account. ' + - 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)', - ); - } - - if (!isViemProvider && isViemSigner) { - throw new Error( - 'Type mismatch: ethers.Provider provided but viem Account detected. ' + - 'When using ethers, please provide an ethers.Signer. ' + - 'Use either: (ethers.Provider + ethers.Signer) or (viem.PublicClient + viem.Account)', - ); - } -} diff --git a/packages/shared/src/viem-adapters.ts b/packages/shared/src/viem-adapters.ts index 2c13f733d..29bbb5f85 100644 --- a/packages/shared/src/viem-adapters.ts +++ b/packages/shared/src/viem-adapters.ts @@ -3,7 +3,6 @@ import { ethers } from 'ethers'; import { type TacoProvider, type TacoSigner } from './taco-interfaces'; import { type Account, - checkViemAvailability, type PublicClient, type WalletClient, } from './viem-utils'; @@ -76,7 +75,6 @@ export class ViemTacoSigner implements TacoSigner { } async signMessage(message: string | Uint8Array): Promise { - await checkViemAvailability(); if (!this.viemAccount.signMessage) { throw new Error('Account does not support message signing'); } @@ -84,6 +82,11 @@ export class ViemTacoSigner implements TacoSigner { typeof message === 'string' ? message : ethers.utils.hexlify(message); return await this.viemAccount.signMessage({ message: messageToSign }); } + + // connect(provider: ethers.providers.Provider): ethers.Signer { + // this.provider = provider; + // return this as unknown as ethers.Signer; + // } } /** @@ -91,10 +94,9 @@ export class ViemTacoSigner implements TacoSigner { * * This function creates a TacoProvider directly from a viem client. */ -export async function createTacoProvider( +export function createTacoProvider( viemPublicClient: PublicClient, -): Promise { - await checkViemAvailability(); +): TacoProvider { return new ViemTacoProvider(viemPublicClient); } @@ -106,11 +108,10 @@ export async function createTacoProvider( * @param viemAccount - Viem account for signing operations * @param provider - Optional TACo provider. If not provided, some operations will require a provider */ -export async function createTacoSigner( +export function createTacoSigner( viemAccount: Account, provider?: TacoProvider, -): Promise { - await checkViemAvailability(); +): TacoSigner { return new ViemTacoSigner(viemAccount, provider); } @@ -121,18 +122,16 @@ export async function createTacoSigner( * @param viemWalletClient - Viem wallet client for signing functionality * @returns Object with TACo provider and signer adapters */ -export async function createTacoFromViem( +export function createTacoFromViem( viemPublicClient: PublicClient, viemWalletClient: WalletClient, -): Promise<{ provider: TacoProvider; signer: TacoSigner }> { - await checkViemAvailability(); - +): { provider: TacoProvider; signer: TacoSigner } { if (!viemWalletClient.account) { throw new Error('Wallet client must have an account attached'); } - const provider = await createTacoProvider(viemPublicClient); - const signer = await createTacoSigner(viemWalletClient.account, provider); + const provider = createTacoProvider(viemPublicClient); + const signer = createTacoSigner(viemWalletClient.account, provider); return { provider, signer }; } diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-utils.ts index 61920ef91..75327f22f 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-utils.ts @@ -10,7 +10,7 @@ * * Usage: * ```typescript - * import { checkViemAvailability, type PublicClient } from '@nucypher/shared'; + * import { type PublicClient } from '@nucypher/shared'; * * // Use viem clients directly with TACo adapters * const tacoProvider = await createTacoProvider(viemPublicClient); @@ -48,40 +48,3 @@ export type WalletClient = [unknown] extends [_ViemWalletClient] ? // eslint-disable-next-line @typescript-eslint/no-explicit-any any : _ViemWalletClient; - -// Internal state for tracking viem availability -let isViemAvailable = false; - -/** - * Check if viem is available and dynamically import it - * - * This function performs a dynamic import of viem to check availability. - * It uses caching to avoid repeated imports and provides helpful error - * messages when viem is not installed. - * - * @throws {Error} When viem is not installed with installation instructions - * @example - * ```typescript - * try { - * await checkViemAvailability(); - * // viem is available, safe to use viem functions - * } catch (error) { - * console.error(error.message); // "viem is required..." - * } - * ``` - */ -export async function checkViemAvailability(): Promise { - if (isViemAvailable) { - return; - } - try { - // Use direct string literal for webpack compatibility - // This prevents "Critical dependency: the request of a dependency is an expression" warnings - await import('viem'); - isViemAvailable = true; - } catch (error) { - throw new Error( - 'viem is required for viem wrapper functions. Install it with: npm install viem@^2.0.0', - ); - } -} diff --git a/packages/shared/test/viem-adapters.test.ts b/packages/shared/test/viem-adapters.test.ts index 6059219e1..168b1f7c2 100644 --- a/packages/shared/test/viem-adapters.test.ts +++ b/packages/shared/test/viem-adapters.test.ts @@ -45,8 +45,8 @@ describe('viem adapter utilities', () => { call: vi.fn().mockResolvedValue('0x'), } as any; - const tacoProvider = await createTacoProvider(mockViemPublicClient); - const signer = await createTacoSigner(mockViemAccount, tacoProvider); + const tacoProvider = createTacoProvider(mockViemPublicClient); + const signer = createTacoSigner(mockViemAccount, tacoProvider); expect(signer).toBeDefined(); expect(signer.getAddress).toBeDefined(); @@ -86,15 +86,15 @@ describe('viem adapter utilities', () => { expect(signer.provider).toBe(provider); }); - it('should throw error when wallet client has no account', async () => { + it('should throw error when wallet client has no account', () => { const mockViemPublicClient = {} as any; const mockViemWalletClient = { account: undefined, } as any; - await expect( + expect(() => createTacoFromViem(mockViemPublicClient, mockViemWalletClient), - ).rejects.toThrow('Wallet client must have an account attached'); + ).toThrow('Wallet client must have an account attached'); }); }); diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index 1fc4d3de9..e448abd9c 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -5,7 +5,6 @@ import { isViemAccount, isViemClient, type PublicClient, - validateProviderSignerCompatibility, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { SiweMessage } from 'siwe'; @@ -101,11 +100,11 @@ export class EIP4361AuthProvider implements AuthProvider { * @param options - Optional EIP4361 parameters (domain, uri) * @returns Promise resolving to EIP4361AuthProvider instance */ - static async create( + static create( viemPublicClient: PublicClient, viemAccount: Account, options?: EIP4361AuthProviderParams, - ): Promise; + ): EIP4361AuthProvider; /** * Create a new EIP4361AuthProvider instance with ethers.js objects (async factory method). @@ -119,24 +118,21 @@ export class EIP4361AuthProvider implements AuthProvider { provider: ethers.providers.Provider, signer: ethers.Signer, options?: EIP4361AuthProviderParams, - ): Promise; + ): EIP4361AuthProvider; - static async create( + static create( providerOrClient: PublicClient | ethers.providers.Provider, signerOrAccount: Account | ethers.Signer, options?: EIP4361AuthProviderParams, - ): Promise { - // Validate that provider and signer types are compatible - validateProviderSignerCompatibility(providerOrClient, signerOrAccount); - + ): EIP4361AuthProvider { // Type guard to determine if we're using viem or ethers - if (isViemClient(providerOrClient) && isViemAccount(signerOrAccount)) { + if (isViemClient(providerOrClient) || isViemAccount(signerOrAccount)) { // Viem path - async conversion needed const viemPublicClient = providerOrClient as PublicClient; const viemAccount = signerOrAccount as Account; - const ethersProvider = await createTacoProvider(viemPublicClient); - const ethersSigner = await createTacoSigner(viemAccount, ethersProvider); + const ethersProvider = createTacoProvider(viemPublicClient); + const ethersSigner = createTacoSigner(viemAccount, ethersProvider); // Type assertions are safe here because our TacoProvider/TacoSigner interfaces // are designed to be compatible with ethers Provider/Signer interfaces @@ -146,13 +142,11 @@ export class EIP4361AuthProvider implements AuthProvider { options, ); } else { - // Ethers path - direct construction (return as Promise for consistency) - return Promise.resolve( - new EIP4361AuthProvider( - providerOrClient as ethers.providers.Provider, - signerOrAccount as ethers.Signer, - options, - ), + // Ethers path - direct construction + return new EIP4361AuthProvider( + providerOrClient as ethers.providers.Provider, + signerOrAccount as ethers.Signer, + options, ); } } diff --git a/packages/taco/package.json b/packages/taco/package.json index 998080d2d..c6b5f891a 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -32,7 +32,7 @@ "clean": "rm -rf dist", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "generate-zod-docs": "pnpm dlx tsx scripts/schema-docs-generation.ts", - "integration-test": "vitest run --config integration-test/vitest.config.ts", + "integration-test": "export RUNNING_IN_CI=true && vitest run --config integration-test/vitest.config.ts", "lint": "eslint --ext .ts src test", "lint:fix": "pnpm lint --fix", "package-check": "package-check", diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts index 34ee0c5dc..1e4b13496 100644 --- a/packages/taco/src/encrypt-decrypt.ts +++ b/packages/taco/src/encrypt-decrypt.ts @@ -5,7 +5,6 @@ import { isViemAccount, isViemClient, PublicClient, - validateProviderSignerCompatibility, } from '@nucypher/shared'; import { ethers } from 'ethers'; @@ -50,9 +49,6 @@ export async function encrypt( ritualId: number, signerOrAccount: ethers.Signer | Account, ): Promise { - // Validate that provider and signer types are compatible - validateProviderSignerCompatibility(providerOrClient, signerOrAccount); - // Type guard to determine if we're using viem or ethers if (isViemClient(providerOrClient) && isViemAccount(signerOrAccount)) { return viemEncrypt( @@ -93,7 +89,7 @@ export function encryptWithPublicKey( /** * Encrypts a message with the given DKG public key under a specified condition. * Supports both ethers.js and viem signers for maximum flexibility. - * + * * Note: This function can be used offline since it doesn't require network access to fetch * the DKG public key (unlike the `encrypt` function which fetches it from the ritual). * diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index 34ba64d33..fb8f1f4e2 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -137,7 +137,7 @@ describe('taco', () => { ); }); - it('should throw error when ethers provider is used with viem account', async () => { + it('should handle well when ethers provider is used with viem account', async () => { const ethersProvider = fakeProvider(aliceSecretKeyBytes); // Mock viem account (no provider property, distinguishes from ethers.Signer) @@ -147,23 +147,20 @@ describe('taco', () => { signTypedData: () => Promise.resolve('0x'), }; - // Should throw type mismatch error - await expect( - taco.encrypt( - ethersProvider, // ethers provider - domains.DEVNET, - message, - ownsNFT, - 0, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - mockViemAccount as any, // viem account - MISMATCH! - ), - ).rejects.toThrow( - 'Type mismatch: ethers.Provider provided but viem Account detected', + const messageKit = await taco.encrypt( + ethersProvider, // ethers provider + domains.DEVNET, + message, + ownsNFT, + 0, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + mockViemAccount as any, // viem account - MISMATCH! ); + + expect(messageKit).toBeDefined(); }); - it('should throw error when viem client is used with ethers signer', async () => { + it('should handle well when viem client is used with ethers signer', async () => { const ethersProvider = fakeProvider(aliceSecretKeyBytes); const ethersSigner = ethersProvider.getSigner(); @@ -174,19 +171,17 @@ describe('taco', () => { }; // Should throw type mismatch error - await expect( - taco.encrypt( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - mockViemClient as any, // viem client - domains.DEVNET, - message, - ownsNFT, - 0, - ethersSigner, // ethers signer - MISMATCH! - ), - ).rejects.toThrow( - 'Type mismatch: viem PublicClient provided but ethers.Signer detected', + const messageKit = await taco.encrypt( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + mockViemClient as any, // viem client + domains.DEVNET, + message, + ownsNFT, + 0, + ethersSigner, // ethers signer - MISMATCH! ); + + expect(messageKit).toBeDefined(); }); describe('encryptWithPublicKey', () => { diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 7531d54e1..13445aadb 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -59,6 +59,11 @@ describe('viem TACo integration', () => { const mockEthersProvider = fakeProvider(aliceSecretKeyBytes); const mockEthersSigner = { ...mockEthersProvider.getSigner(), + signMessage: vi + .fn() + .mockResolvedValue( + '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b', + ), signTypedData: vi.fn().mockResolvedValue('0x'), }; // Type assertion for test compatibility @@ -91,10 +96,10 @@ describe('viem TACo integration', () => { const createTacoProviderSpy = vi .spyOn(await import('@nucypher/shared'), 'createTacoProvider') - .mockResolvedValue(mockViemProvider); + .mockReturnValue(mockViemProvider); const createTacoSignerSpy = vi .spyOn(await import('@nucypher/shared'), 'createTacoSigner') - .mockResolvedValue(typedSigner); + .mockReturnValue(typedSigner); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); From 43554156b9b81274bc2577843bbcb3bac4918cfe Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:08:58 +0200 Subject: [PATCH 37/97] refactor: use ethers conversion utilities and make the typecheck inside them --- ...{viem-adapters.ts => ethers-viem-utils.ts} | 77 ++++---- packages/shared/src/index.ts | 4 +- packages/shared/src/taco-interfaces.ts | 10 +- packages/shared/src/type-guards.ts | 2 +- .../src/{viem-utils.ts => viem-types.ts} | 12 +- .../shared/test/ethers-viem-utils.test.ts | 61 ++++++ packages/shared/test/viem-adapters.test.ts | 112 ----------- .../src/providers/eip4361/eip4361.ts | 46 ++--- packages/taco/VIEM_SUPPORT.md | 75 +++++--- .../viem-encrypt-decrypt.test.ts | 11 +- packages/taco/src/encrypt-decrypt.ts | 177 ----------------- packages/taco/src/index.ts | 2 +- packages/taco/src/taco.ts | 143 ++++++++++++-- packages/taco/src/viem-taco.ts | 180 ------------------ packages/taco/test/viem-taco.test.ts | 6 +- 15 files changed, 307 insertions(+), 611 deletions(-) rename packages/shared/src/{viem-adapters.ts => ethers-viem-utils.ts} (67%) rename packages/shared/src/{viem-utils.ts => viem-types.ts} (79%) create mode 100644 packages/shared/test/ethers-viem-utils.test.ts delete mode 100644 packages/shared/test/viem-adapters.test.ts delete mode 100644 packages/taco/src/encrypt-decrypt.ts delete mode 100644 packages/taco/src/viem-taco.ts diff --git a/packages/shared/src/viem-adapters.ts b/packages/shared/src/ethers-viem-utils.ts similarity index 67% rename from packages/shared/src/viem-adapters.ts rename to packages/shared/src/ethers-viem-utils.ts index 29bbb5f85..27ecab13c 100644 --- a/packages/shared/src/viem-adapters.ts +++ b/packages/shared/src/ethers-viem-utils.ts @@ -1,11 +1,8 @@ import { ethers } from 'ethers'; import { type TacoProvider, type TacoSigner } from './taco-interfaces'; -import { - type Account, - type PublicClient, - type WalletClient, -} from './viem-utils'; +import { isViemAccount, isViemClient } from './type-guards'; +import { type Account, type PublicClient } from './viem-types'; /** * Viem TACo Provider @@ -63,11 +60,16 @@ export class ViemTacoProvider implements TacoProvider { */ export class ViemTacoSigner implements TacoSigner { protected viemAccount: Account; - public readonly provider?: TacoProvider | undefined; + public provider?: ethers.providers.Provider | undefined; - constructor(viemAccount: Account, provider?: TacoProvider | undefined) { + constructor( + viemAccount: Account, + provider?: ethers.providers.Provider | PublicClient | undefined, + ) { this.viemAccount = viemAccount; - this.provider = provider; + if (provider) { + this.provider = toEthersProvider(provider); + } } async getAddress(): Promise { @@ -83,10 +85,10 @@ export class ViemTacoSigner implements TacoSigner { return await this.viemAccount.signMessage({ message: messageToSign }); } - // connect(provider: ethers.providers.Provider): ethers.Signer { - // this.provider = provider; - // return this as unknown as ethers.Signer; - // } + connect(provider: ethers.providers.Provider): ethers.Signer { + this.provider = provider; + return this as unknown as ethers.Signer; + } } /** @@ -94,10 +96,16 @@ export class ViemTacoSigner implements TacoSigner { * * This function creates a TacoProvider directly from a viem client. */ -export function createTacoProvider( - viemPublicClient: PublicClient, -): TacoProvider { - return new ViemTacoProvider(viemPublicClient); +export function toEthersProvider( + provider: ethers.providers.Provider | PublicClient, +): ethers.providers.Provider { + if (isViemClient(provider)) { + return new ViemTacoProvider( + provider, + ) as unknown as ethers.providers.Provider; + } else { + return provider; + } } /** @@ -108,30 +116,17 @@ export function createTacoProvider( * @param viemAccount - Viem account for signing operations * @param provider - Optional TACo provider. If not provided, some operations will require a provider */ -export function createTacoSigner( - viemAccount: Account, - provider?: TacoProvider, -): TacoSigner { - return new ViemTacoSigner(viemAccount, provider); -} - -/** - * Convenience function to create both provider and signer adapters from viem clients - * - * @param viemPublicClient - Viem public client for provider functionality - * @param viemWalletClient - Viem wallet client for signing functionality - * @returns Object with TACo provider and signer adapters - */ -export function createTacoFromViem( - viemPublicClient: PublicClient, - viemWalletClient: WalletClient, -): { provider: TacoProvider; signer: TacoSigner } { - if (!viemWalletClient.account) { - throw new Error('Wallet client must have an account attached'); +export function toEthersSigner( + signerLike: ethers.Signer | Account, + provider?: ethers.providers.Provider | PublicClient, +): ethers.Signer { + const providerAdapter = provider ? toEthersProvider(provider) : undefined; + if (isViemAccount(signerLike)) { + return new ViemTacoSigner( + signerLike, + providerAdapter, + ) as unknown as ethers.Signer; + } else { + return signerLike as unknown as ethers.Signer; } - - const provider = createTacoProvider(viemPublicClient); - const signer = createTacoSigner(viemWalletClient.account, provider); - - return { provider, signer }; } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 533c5c61a..3d2de0471 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,12 +1,12 @@ export * from './contracts'; +export * from './ethers-viem-utils'; export * from './porter'; export * from './schemas'; export * from './taco-interfaces'; export * from './type-guards'; export type * from './types'; export * from './utils'; -export * from './viem-adapters'; -export * from './viem-utils'; +export * from './viem-types'; export * from './web3'; // Re-exports diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index e80a3443d..766b4e9dd 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -4,8 +4,9 @@ import { ethers } from 'ethers'; * Basic TACo Provider interface * * This interface defines the minimal provider functionality needed for TACo operations. - * It abstracts away the underlying blockchain library (ethers, viem, etc.) and - * focuses only on the methods that TACo actually uses. + * It contains only the methods that TACo actually uses. + * This interface is implemented by ViemTacoProvider. And any future provider implementation + * would need to implement this interface. */ export interface TacoProvider { /** @@ -28,8 +29,9 @@ export interface TacoProvider { * Basic TACo Signer interface * * This interface defines the minimal signer functionality needed for TACo operations. - * It abstracts away the underlying blockchain library (ethers, viem, etc.) and - * focuses only on the methods that TACo actually uses. + * It contains only the methods that TACo actually uses. + * This interface is implemented by ViemTacoSigner. And any future signer implementation + * would need to implement this interface. */ export interface TacoSigner { /** diff --git a/packages/shared/src/type-guards.ts b/packages/shared/src/type-guards.ts index 2f9143ed4..6e3c55831 100644 --- a/packages/shared/src/type-guards.ts +++ b/packages/shared/src/type-guards.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; -import { Account, PublicClient } from './viem-utils'; +import { Account, PublicClient } from './viem-types'; /** * Type guard to determine if the client is a viem PublicClient diff --git a/packages/shared/src/viem-utils.ts b/packages/shared/src/viem-types.ts similarity index 79% rename from packages/shared/src/viem-utils.ts rename to packages/shared/src/viem-types.ts index 75327f22f..e74ac9120 100644 --- a/packages/shared/src/viem-utils.ts +++ b/packages/shared/src/viem-types.ts @@ -13,7 +13,7 @@ * import { type PublicClient } from '@nucypher/shared'; * * // Use viem clients directly with TACo adapters - * const tacoProvider = await createTacoProvider(viemPublicClient); + * const tacoProvider = await toEthersProvider(viemPublicClient); * ``` */ @@ -23,7 +23,6 @@ // Dynamic imports resolve to 'unknown' when module is not available, no compile-time errors occur type _ViemPublicClient = import('viem').PublicClient; type _ViemAccount = import('viem').Account; -type _ViemWalletClient = import('viem').WalletClient; /** * Viem PublicClient type for read operations @@ -39,12 +38,3 @@ export type PublicClient = [unknown] extends [_ViemPublicClient] */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Account = [unknown] extends [_ViemAccount] ? any : _ViemAccount; - -/** - * Viem WalletClient type for wallet operations - * @see https://viem.sh/docs/clients/wallet - */ -export type WalletClient = [unknown] extends [_ViemWalletClient] - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - any - : _ViemWalletClient; diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts new file mode 100644 index 000000000..fa8fa86e2 --- /dev/null +++ b/packages/shared/test/ethers-viem-utils.test.ts @@ -0,0 +1,61 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { describe, expect, it, vi } from 'vitest'; + +import { toEthersProvider, toEthersSigner } from '@nucypher/shared'; + +describe('viem adapter utilities', () => { + describe('function exports', () => { + it('should export all adapter functions', () => { + expect(toEthersProvider).toBeDefined(); + expect(toEthersSigner).toBeDefined(); + expect(typeof toEthersProvider).toBe('function'); + expect(typeof toEthersSigner).toBe('function'); + }); + }); + + describe('toEthersProvider', () => { + it('should create a provider from viem client', async () => { + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), + call: vi.fn().mockResolvedValue('0x'), + } as any; + const provider = await toEthersProvider(mockViemPublicClient); + expect(provider).toBeDefined(); + expect(provider.getNetwork).toBeDefined(); + expect(provider.call).toBeDefined(); + }); + }); + + describe('toEthersSigner', () => { + it('should create a signer from viem account', async () => { + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + } as any; + + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + call: vi.fn().mockResolvedValue('0x'), + } as any; + + const tacoProvider = toEthersProvider(mockViemPublicClient); + const signer = toEthersSigner(mockViemAccount, tacoProvider); + + expect(signer).toBeDefined(); + expect(signer.getAddress).toBeDefined(); + expect(signer.signMessage).toBeDefined(); + expect(signer.provider).toBe(tacoProvider); + }); + }); + + describe('error handling', () => { + it('should handle missing viem gracefully', () => { + // This test verifies that the functions exist and are callable + expect(toEthersProvider).toBeDefined(); + expect(toEthersSigner).toBeDefined(); + expect(typeof toEthersProvider).toBe('function'); + expect(typeof toEthersSigner).toBe('function'); + }); + }); +}); diff --git a/packages/shared/test/viem-adapters.test.ts b/packages/shared/test/viem-adapters.test.ts deleted file mode 100644 index 168b1f7c2..000000000 --- a/packages/shared/test/viem-adapters.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { describe, expect, it, vi } from 'vitest'; - -import { - createTacoFromViem, - createTacoProvider, - createTacoSigner, -} from '@nucypher/shared'; - -describe('viem adapter utilities', () => { - describe('function exports', () => { - it('should export all adapter functions', () => { - expect(createTacoProvider).toBeDefined(); - expect(createTacoSigner).toBeDefined(); - expect(createTacoFromViem).toBeDefined(); - expect(typeof createTacoProvider).toBe('function'); - expect(typeof createTacoSigner).toBe('function'); - expect(typeof createTacoFromViem).toBe('function'); - }); - }); - - describe('createTacoProvider', () => { - it('should create a provider from viem client', async () => { - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), - call: vi.fn().mockResolvedValue('0x'), - } as any; - const provider = await createTacoProvider(mockViemPublicClient); - expect(provider).toBeDefined(); - expect(provider.getNetwork).toBeDefined(); - expect(provider.call).toBeDefined(); - }); - }); - - describe('createTacoSigner', () => { - it('should create a signer from viem account', async () => { - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - } as any; - - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x'), - } as any; - - const tacoProvider = createTacoProvider(mockViemPublicClient); - const signer = createTacoSigner(mockViemAccount, tacoProvider); - - expect(signer).toBeDefined(); - expect(signer.getAddress).toBeDefined(); - expect(signer.signMessage).toBeDefined(); - expect(signer.provider).toBe(tacoProvider); - }); - }); - - describe('createTacoFromViem', () => { - it('should create both provider and signer', async () => { - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), - call: vi.fn().mockResolvedValue('0x'), - getBalance: vi.fn().mockResolvedValue(BigInt(0)), - getTransactionCount: vi.fn().mockResolvedValue(0), - estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), - getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), - } as any; - - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - } as any; - - const mockViemWalletClient = { - account: mockViemAccount, - } as any; - - const { provider, signer } = await createTacoFromViem( - mockViemPublicClient, - mockViemWalletClient, - ); - - expect(provider).toBeDefined(); - expect(signer).toBeDefined(); - expect(signer.provider).toBe(provider); - }); - - it('should throw error when wallet client has no account', () => { - const mockViemPublicClient = {} as any; - const mockViemWalletClient = { - account: undefined, - } as any; - - expect(() => - createTacoFromViem(mockViemPublicClient, mockViemWalletClient), - ).toThrow('Wallet client must have an account attached'); - }); - }); - - describe('error handling', () => { - it('should handle missing viem gracefully', () => { - // This test verifies that the functions exist and are callable - expect(createTacoProvider).toBeDefined(); - expect(createTacoSigner).toBeDefined(); - expect(createTacoFromViem).toBeDefined(); - expect(typeof createTacoProvider).toBe('function'); - expect(typeof createTacoSigner).toBe('function'); - expect(typeof createTacoFromViem).toBe('function'); - }); - }); -}); diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index e448abd9c..1ae2a4dad 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -1,10 +1,8 @@ import { - type Account, - createTacoProvider, - createTacoSigner, - isViemAccount, - isViemClient, - type PublicClient, + Account, + PublicClient, + toEthersProvider, + toEthersSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { SiweMessage } from 'siwe'; @@ -93,7 +91,7 @@ export class EIP4361AuthProvider implements AuthProvider { } /** - * Create a new EIP4361AuthProvider instance with viem objects (async factory method). + * Create a new EIP4361AuthProvider instance with viem objects. * * @param viemPublicClient - viem PublicClient for blockchain interactions * @param viemAccount - viem Account for signing operations @@ -107,7 +105,7 @@ export class EIP4361AuthProvider implements AuthProvider { ): EIP4361AuthProvider; /** - * Create a new EIP4361AuthProvider instance with ethers.js objects (async factory method). + * Create a new EIP4361AuthProvider instance with ethers.js objects. * * @param provider - Ethers provider used to fetch the current chainId * @param signer - Ethers signer used to sign SIWE messages @@ -121,34 +119,14 @@ export class EIP4361AuthProvider implements AuthProvider { ): EIP4361AuthProvider; static create( - providerOrClient: PublicClient | ethers.providers.Provider, - signerOrAccount: Account | ethers.Signer, + providerOrClient: ethers.providers.Provider | PublicClient, + signerOrAccount: ethers.Signer | Account, options?: EIP4361AuthProviderParams, ): EIP4361AuthProvider { - // Type guard to determine if we're using viem or ethers - if (isViemClient(providerOrClient) || isViemAccount(signerOrAccount)) { - // Viem path - async conversion needed - const viemPublicClient = providerOrClient as PublicClient; - const viemAccount = signerOrAccount as Account; - - const ethersProvider = createTacoProvider(viemPublicClient); - const ethersSigner = createTacoSigner(viemAccount, ethersProvider); - - // Type assertions are safe here because our TacoProvider/TacoSigner interfaces - // are designed to be compatible with ethers Provider/Signer interfaces - return new EIP4361AuthProvider( - ethersProvider as unknown as ethers.providers.Provider, - ethersSigner as unknown as ethers.Signer, - options, - ); - } else { - // Ethers path - direct construction - return new EIP4361AuthProvider( - providerOrClient as ethers.providers.Provider, - signerOrAccount as ethers.Signer, - options, - ); - } + const provider = toEthersProvider(providerOrClient); + const signer = toEthersSigner(signerOrAccount, provider); + + return new EIP4361AuthProvider(provider, signer, options); } /** diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index 3b5edce27..f2553587b 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -1,6 +1,9 @@ # Viem Support -The TACo SDK provides unified `encrypt` and `decrypt` functions that work seamlessly with both [ethers.js](https://docs.ethers.org/) and [viem](https://viem.sh) through TypeScript function overloads. The same function names automatically detect which library you're using based on parameter types. +The TACo SDK provides unified `encrypt` and `decrypt` functions that work +seamlessly with both [ethers.js](https://docs.ethers.org/) and +[viem](https://viem.sh) through TypeScript function overloads. The same function +names automatically detect which library you're using based on parameter types. ## Installation @@ -12,7 +15,8 @@ npm install viem ### For Authentication Providers -If you need authentication providers that work with viem, install the taco-auth package: +If you need authentication providers that work with viem, install the taco-auth +package: ```bash npm install @nucypher/taco-auth viem @@ -20,10 +24,18 @@ npm install @nucypher/taco-auth viem ## Function Overloads -The same `encrypt` and `decrypt` functions work with both ethers.js and viem. TypeScript automatically selects the correct implementation based on your parameter types: +The same `encrypt` and `decrypt` functions work with both ethers.js and viem. +TypeScript automatically selects the correct implementation based on your +parameter types: ```typescript -import { encrypt, decrypt, conditions, domains, initialize } from '@nucypher/taco'; +import { + encrypt, + decrypt, + conditions, + domains, + initialize, +} from '@nucypher/taco'; import { createPublicClient, http } from 'viem'; import { polygonAmoy } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; @@ -31,7 +43,7 @@ import { privateKeyToAccount } from 'viem/accounts'; // Initialize TACo await initialize(); -// Create viem client +// Create viem public client const viemPublicClient = createPublicClient({ chain: polygonAmoy, transport: http(), @@ -52,12 +64,12 @@ const condition = new conditions.predefined.erc20.ERC20Balance({ // Same function names work with viem - TypeScript automatically detects the right overload const encryptedKit = await encrypt( - viemPublicClient, // viem PublicClient - TypeScript detects this - domains.DEVNET, // or 'lynx' + viemPublicClient, // viem PublicClient - TypeScript detects this + domains.DEVNET, // or 'lynx' 'Hello, secret!', condition, 27, // ritual ID - viemAccount, // viem Account - TypeScript detects this + viemAccount, // viem Account - TypeScript detects this ); // Same decrypt function works with viem @@ -82,22 +94,22 @@ import { privateKeyToAccount } from 'viem/accounts'; // Using ethers.js - automatically uses ethers implementation const ethersEncrypted = await encrypt( - ethersProvider, // ethers.providers.Provider + ethersProvider, // ethers.providers.Provider domains.TESTNET, message, condition, ritualId, - ethersSigner // ethers.Signer + ethersSigner, // ethers.Signer ); // Using viem - automatically uses viem implementation const viemEncrypted = await encrypt( - viemPublicClient, // viem PublicClient + viemPublicClient, // viem PublicClient domains.TESTNET, message, condition, ritualId, - viemAccount // viem Account + viemAccount, // viem Account ); // Both return the same ThresholdMessageKit type @@ -118,10 +130,11 @@ function encrypt( condition: Condition, ritualId: number, viemAuthSigner: Account, -): Promise +): Promise; ``` **Parameters:** + - `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations - `domain`: `Domain` - TACo domain ('lynx', 'tapir', 'mainnet') - `message`: `Uint8Array | string` - Message to encrypt @@ -140,10 +153,11 @@ function decrypt( messageKit: ThresholdMessageKit, context?: ConditionContext, porterUris?: string[], -): Promise +): Promise; ``` **Parameters:** + - `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations - `domain`: `Domain` - TACo domain - `messageKit`: `ThresholdMessageKit` - Encrypted message kit @@ -154,11 +168,13 @@ function decrypt( ## Viem Authentication Providers -For applications that need authentication providers compatible with viem, use the `@nucypher/taco-auth` package: +For applications that need authentication providers compatible with viem, use +the `@nucypher/taco-auth` package: ### EIP4361AuthProvider with Viem Support -The consolidated `EIP4361AuthProvider` now supports both ethers.js and viem through static factory methods: +The consolidated `EIP4361AuthProvider` now supports both ethers.js and viem +through static factory methods: ```typescript import { createPublicClient, http } from 'viem'; @@ -173,14 +189,10 @@ const publicClient = createPublicClient({ const account = privateKeyToAccount('0x...'); // Viem usage - uses async factory method -const authProvider = await EIP4361AuthProvider.create( - publicClient, - account, - { - domain: 'my-app.com', - uri: 'https://my-app.com', - }, -); +const authProvider = await EIP4361AuthProvider.create(publicClient, account, { + domain: 'my-app.com', + uri: 'https://my-app.com', +}); const authSignature = await authProvider.getOrCreateAuthSignature(); ``` @@ -189,7 +201,8 @@ const authSignature = await authProvider.getOrCreateAuthSignature(); - `viemPublicClient`: `PublicClient` - Viem public client for network operations - `viemAccount`: `Account` - Viem account for signing -- `options?`: `EIP4361AuthProviderParams` - Optional domain and URI for EIP-4361 messages +- `options?`: `EIP4361AuthProviderParams` - Optional domain and URI for EIP-4361 + messages **Ethers.js Usage (for comparison):** @@ -208,7 +221,8 @@ const authProvider = await EIP4361AuthProvider.create(provider, signer); **Methods:** -- `getOrCreateAuthSignature()`: Returns authentication signature for TACo operations +- `getOrCreateAuthSignature()`: Returns authentication signature for TACo + operations ## Package Architecture @@ -221,10 +235,13 @@ const authProvider = await EIP4361AuthProvider.create(provider, signer); ### @nucypher/taco-auth - **Purpose**: Authentication providers and signing utilities -- **Viem Functions**: `EIP4361AuthProvider.create()` with viem parameter overloading +- **Viem Functions**: `EIP4361AuthProvider.create()` with viem parameter + overloading - **Dependencies**: Viem authentication and EIP-4361 signing -This separation follows clean architecture principles - use the appropriate package based on your needs: +This separation follows clean architecture principles - use the appropriate +package based on your needs: - **Encryption only**: Install `@nucypher/taco` + `viem` -- **Authentication required**: Install both `@nucypher/taco` + `@nucypher/taco-auth` + `viem` +- **Authentication required**: Install both `@nucypher/taco` + + `@nucypher/taco-auth` + `viem` diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts index 7f3c1a1a9..42d724802 100644 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -1,17 +1,22 @@ import { beforeAll, describe, expect, test } from 'vitest'; import { fromBytes, toBytes } from '@nucypher/shared'; -import { PublicClient, WalletClient } from '@nucypher/shared/src/viem-utils'; import { EIP4361AuthProvider, USER_ADDRESS_PARAM_DEFAULT, } from '@nucypher/taco-auth'; -import { createPublicClient, createWalletClient, http } from 'viem'; +import { + createPublicClient, + createWalletClient, + http, + PublicClient, + WalletClient, +} from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; import { conditions, initialize, ThresholdMessageKit } from '../src'; import { CompoundCondition } from '../src/conditions/compound-condition'; -import { decrypt, encrypt } from '../src/viem-taco'; +import { decrypt, encrypt } from '../src/taco'; import { UINT256_MAX } from '../test/test-utils'; const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; diff --git a/packages/taco/src/encrypt-decrypt.ts b/packages/taco/src/encrypt-decrypt.ts deleted file mode 100644 index 1e4b13496..000000000 --- a/packages/taco/src/encrypt-decrypt.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { DkgPublicKey, ThresholdMessageKit } from '@nucypher/nucypher-core'; -import { - Account, - type Domain, - isViemAccount, - isViemClient, - PublicClient, -} from '@nucypher/shared'; -import { ethers } from 'ethers'; - -import { Condition } from './conditions/condition'; -import { ConditionContext } from './conditions/context'; -import { - decrypt as ethersDecrypt, - encrypt as ethersEncrypt, - encryptWithPublicKey as ethersEncryptWithPublicKey, -} from './taco'; -import { - decrypt as viemDecrypt, - encrypt as viemEncrypt, - encryptWithPublicKey as viemEncryptWithPublicKey, -} from './viem-taco'; - -// Function overloads for encrypt -export function encrypt( - provider: ethers.providers.Provider, - domain: Domain, - message: Uint8Array | string, - condition: Condition, - ritualId: number, - authSigner: ethers.Signer, -): Promise; - -export function encrypt( - viemPublicClient: PublicClient, - domain: Domain, - message: Uint8Array | string, - condition: Condition, - ritualId: number, - viemAuthSigner: Account, -): Promise; - -// Implementation that routes to the appropriate function -export async function encrypt( - providerOrClient: ethers.providers.Provider | PublicClient, - domain: Domain, - message: Uint8Array | string, - condition: Condition, - ritualId: number, - signerOrAccount: ethers.Signer | Account, -): Promise { - // Type guard to determine if we're using viem or ethers - if (isViemClient(providerOrClient) && isViemAccount(signerOrAccount)) { - return viemEncrypt( - providerOrClient as PublicClient, - domain, - message, - condition, - ritualId, - signerOrAccount as Account, - ); - } else { - return ethersEncrypt( - providerOrClient as ethers.providers.Provider, - domain, - message, - condition, - ritualId, - signerOrAccount as ethers.Signer, - ); - } -} - -// Function overloads for encryptWithPublicKey -export function encryptWithPublicKey( - message: Uint8Array | string, - condition: Condition, - dkgPublicKey: DkgPublicKey, - authSigner: ethers.Signer, -): Promise; - -export function encryptWithPublicKey( - message: Uint8Array | string, - condition: Condition, - dkgPublicKey: DkgPublicKey, - viemAuthSigner: Account, -): Promise; - -/** - * Encrypts a message with the given DKG public key under a specified condition. - * Supports both ethers.js and viem signers for maximum flexibility. - * - * Note: This function can be used offline since it doesn't require network access to fetch - * the DKG public key (unlike the `encrypt` function which fetches it from the ritual). - * - * @export - * @param {Uint8Array | string} message - The message to be encrypted. - * @param {Condition} condition - Condition under which the message will be encrypted. Those conditions must be - * satisfied in order to decrypt the message. - * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption. - * @param {ethers.Signer | Account} signerOrAccount - The signer that will be used to sign the encrypter authorization. - * Can be either an ethers.js Signer or a viem Account object. - * - * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit. - * It represents the encrypted message. - * - * @throws {Error} If the encryption process throws an error, an error is thrown. - */ -// Implementation that routes to the appropriate function -export async function encryptWithPublicKey( - message: Uint8Array | string, - condition: Condition, - dkgPublicKey: DkgPublicKey, - signerOrAccount: ethers.Signer | Account, -): Promise { - // Type guard to determine if we're using viem or ethers - if (isViemAccount(signerOrAccount)) { - return viemEncryptWithPublicKey( - message, - condition, - dkgPublicKey, - signerOrAccount as Account, - ); - } else { - return ethersEncryptWithPublicKey( - message, - condition, - dkgPublicKey, - signerOrAccount as ethers.Signer, - ); - } -} - -// Function overloads for decrypt -export function decrypt( - provider: ethers.providers.Provider, - domain: Domain, - messageKit: ThresholdMessageKit, - context?: ConditionContext, - porterUris?: string[], -): Promise; - -export function decrypt( - viemPublicClient: PublicClient, - domain: Domain, - messageKit: ThresholdMessageKit, - context?: ConditionContext, - porterUris?: string[], -): Promise; - -// Implementation that routes to the appropriate function -export async function decrypt( - providerOrClient: ethers.providers.Provider | PublicClient, - domain: Domain, - messageKit: ThresholdMessageKit, - context?: ConditionContext, - porterUris?: string[], -): Promise { - // Type guard to determine if we're using viem or ethers - if (isViemClient(providerOrClient)) { - return viemDecrypt( - providerOrClient as PublicClient, - domain, - messageKit, - context, - porterUris, - ); - } else { - return ethersDecrypt( - providerOrClient as ethers.providers.Provider, - domain, - messageKit, - context, - porterUris, - ); - } -} diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index c431fa140..698685a1b 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -11,4 +11,4 @@ export { export * as conditions from './conditions'; -export { decrypt, encrypt, encryptWithPublicKey } from './encrypt-decrypt'; +export { decrypt, encrypt, encryptWithPublicKey } from './taco'; diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index da1fc9ce9..16e06431a 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -5,12 +5,16 @@ import { ThresholdMessageKit, } from '@nucypher/nucypher-core'; import { + Account, DkgCoordinatorAgent, Domain, fromHexString, getPorterUris, PorterClient, + PublicClient, toBytes, + toEthersProvider, + toEthersSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { keccak256 } from 'ethers/lib/utils'; @@ -21,6 +25,35 @@ import { ConditionContext } from './conditions/context'; import { DkgClient } from './dkg'; import { retrieveAndDecrypt } from './tdec'; +/** + * Encrypts a message under given conditions using viem clients. + * + * This is a viem-compatible overload of the encrypt function that accepts viem clients + * instead of ethers providers and signers. + * + * @export + * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations + * @param {Domain} domain - Represents the logical network for encryption (must match ritualId) + * @param {Uint8Array | string} message - The message to be encrypted + * @param {Condition} condition - Condition under which the message will be encrypted + * @param {number} ritualId - The ID of the DKG Ritual to be used for encryption + * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization + * + * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit + * + * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown + + */ +// Function overloads for encrypt +export async function encrypt( + provider: ethers.providers.Provider, + domain: Domain, + message: Uint8Array | string, + condition: Condition, + ritualId: number, + authSigner: ethers.Signer, +): Promise; + /** * Encrypts a message under given conditions using a public key from an active DKG ritual. * @@ -41,14 +74,23 @@ import { retrieveAndDecrypt } from './tdec'; * * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown. */ -export const encrypt = async ( - provider: ethers.providers.Provider, +export async function encrypt( + viemPublicClient: PublicClient, domain: Domain, message: Uint8Array | string, condition: Condition, ritualId: number, - authSigner: ethers.Signer, -): Promise => { + viemAuthSigner: Account, +): Promise; + +export async function encrypt( + providerOrClient: ethers.providers.Provider | PublicClient, + domain: Domain, + message: Uint8Array | string, + condition: Condition, + ritualId: number, + signerOrAccount: ethers.Signer | Account, +): Promise { // TODO(#264): Enable ritual initialization // if (ritualId === undefined) { // ritualId = await DkgClient.initializeRitual( @@ -61,7 +103,16 @@ export const encrypt = async ( // // Given that we just initialized the ritual, this should never happen // throw new Error('Ritual ID is undefined'); // } - const dkgRitual = await DkgClient.getActiveRitual(provider, domain, ritualId); + + // Create TACo provider and signer adapters from viem objects + const providerAdapter = toEthersProvider(providerOrClient); + const authSigner = toEthersSigner(signerOrAccount, providerAdapter); + + const dkgRitual = await DkgClient.getActiveRitual( + providerAdapter, + domain, + ritualId, + ); return await encryptWithPublicKey( message, @@ -69,7 +120,7 @@ export const encrypt = async ( dkgRitual.dkgPublicKey, authSigner, ); -}; +} /** * Encrypts a message with the given DKG public key under a specified condition. @@ -86,16 +137,47 @@ export const encrypt = async ( * * @throws {Error} If the encryption process throws an error, an error is thrown. */ -export const encryptWithPublicKey = async ( +export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, authSigner: ethers.Signer, -): Promise => { +): Promise; + +/** + * Encrypts a message with the given DKG public key under a specified condition. + * + * @export + * @param {Uint8Array | string} message - The message to be encrypted. + * @param {Condition} condition - Condition under which the message will be encrypted. Those conditions must be + * satisfied in order to decrypt the message. + * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption + * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization. + * + * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit. + * It represents the encrypted message. + * + * @throws {Error} If the encryption process throws an error, an error is thrown. + */ +export async function encryptWithPublicKey( + message: Uint8Array | string, + condition: Condition, + dkgPublicKey: DkgPublicKey, + viemAuthSigner: Account, +): Promise; + +export async function encryptWithPublicKey( + message: Uint8Array | string, + condition: Condition, + dkgPublicKey: DkgPublicKey, + authOrAccount: ethers.Signer | Account, +): Promise { if (typeof message === 'string') { message = toBytes(message); } + const signer = toEthersSigner(authOrAccount); + const conditionExpr = new ConditionExpression(condition); const [ciphertext, authenticatedData] = encryptForDkg( @@ -105,14 +187,14 @@ export const encryptWithPublicKey = async ( ); const headerHash = keccak256(ciphertext.header.toBytes()); - const authorization = await authSigner.signMessage(fromHexString(headerHash)); + const authorization = await signer.signMessage(fromHexString(headerHash)); const acp = new AccessControlPolicy( authenticatedData, fromHexString(authorization), ); return new ThresholdMessageKit(ciphertext, acp); -}; +} /** * Decrypts an encrypted message. @@ -132,18 +214,53 @@ export const encryptWithPublicKey = async ( * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error, * an error is thrown. */ -export const decrypt = async ( +export function decrypt( provider: ethers.providers.Provider, domain: Domain, messageKit: ThresholdMessageKit, context?: ConditionContext, porterUris?: string[], -): Promise => { +): Promise; + +/** + * Decrypts an encrypted message. + * + * @export + * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations + * @param {Domain} domain - Represents the logical network in which the decryption will be performed. + * Must match the `ritualId`. + * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted + * @param {ConditionContext} context - Optional context data used for decryption time values for the condition(s) within the `messageKit`. + * @param {string[]} [porterUris] - Optional URI(s) for the Porter service. If not provided, a value will be obtained + * from the Domain + * + * @returns {Promise} Returns Promise that resolves with a decrypted message + * + * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error, + * an error is thrown. + */ +export function decrypt( + viemPublicClient: PublicClient, + domain: Domain, + messageKit: ThresholdMessageKit, + context?: ConditionContext, + porterUris?: string[], +): Promise; + +export async function decrypt( + providerOrClient: ethers.providers.Provider | PublicClient, + domain: Domain, + messageKit: ThresholdMessageKit, + context?: ConditionContext, + porterUris?: string[], +): Promise { const porterUrisFull: string[] = porterUris ? porterUris : await getPorterUris(domain); const porter = new PorterClient(porterUrisFull); + const provider = await toEthersProvider(providerOrClient); + const ritualId = await DkgCoordinatorAgent.getRitualIdFromPublicKey( provider, domain, @@ -157,4 +274,4 @@ export const decrypt = async ( ritualId, context, ); -}; +} diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts deleted file mode 100644 index d0702ec7c..000000000 --- a/packages/taco/src/viem-taco.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { DkgPublicKey, ThresholdMessageKit } from '@nucypher/nucypher-core'; -import { type Account, type Domain, type PublicClient } from '@nucypher/shared'; -import { createTacoProvider, createTacoSigner } from '@nucypher/shared'; -import { ethers } from 'ethers'; - -import { Condition } from './conditions/condition'; -import { ConditionContext } from './conditions/context'; -import { decrypt as ethersDecrypt, encrypt as ethersEncrypt, encryptWithPublicKey as ethersEncryptWithPublicKey } from './taco'; - -/** - * Encrypts a message under given conditions using viem clients. - * - * This is a viem-compatible overload of the encrypt function that accepts viem clients - * instead of ethers providers and signers. - * - * @export - * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations - * @param {Domain} domain - Represents the logical network for encryption (must match ritualId) - * @param {Uint8Array | string} message - The message to be encrypted - * @param {Condition} condition - Condition under which the message will be encrypted - * @param {number} ritualId - The ID of the DKG Ritual to be used for encryption - * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization - * - * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit - * - * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown - * - * @example - * ```typescript - * import { createPublicClient, createWalletClient, http } from 'viem'; - * import { polygonAmoy } from 'viem/chains'; - * import { privateKeyToAccount } from 'viem/accounts'; - * - * // Using explicit clients - * const viemPublicClient = createPublicClient({ - * chain: polygonAmoy, - * transport: http() - * }); - * - * const viemAuthSigner = privateKeyToAccount('0x...'); - * - * const encrypted = await encrypt( - * viemPublicClient, // Your viem public client - * 'lynx', // TACo domain - * 'Hello, secret!', // Message to encrypt - * condition, // Access condition - * 27, // Ritual ID - * viemAuthSigner // Your viem account - * ); - * ``` - */ -export const encrypt = async ( - viemPublicClient: PublicClient, - domain: Domain, - message: Uint8Array | string, - condition: Condition, - ritualId: number, - viemAuthSigner: Account, -): Promise => { - // Create TACo provider and signer adapters from viem objects - const tacoProvider = await createTacoProvider(viemPublicClient); - const tacoSigner = await createTacoSigner(viemAuthSigner, tacoProvider); - - // Use the existing ethers-based encrypt function with type assertions - // Our adapters provide all the methods that the TACo SDK actually uses - return await ethersEncrypt( - tacoProvider as unknown as ethers.providers.Provider, - domain, - message, - condition, - ritualId, - tacoSigner as unknown as ethers.Signer, - ); -}; - -/** - * Encrypts a message with a public key using viem clients. - * - * This is a viem-compatible version of the encryptWithPublicKey function that accepts a viem account - * instead of an ethers signer. - * - * @export - * @param {Uint8Array | string} message - The message to be encrypted - * @param {Condition} condition - Condition under which the message will be encrypted - * @param {DkgPublicKey} dkgPublicKey - The DKG public key to use for encryption - * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization - * - * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit - * - * @throws {Error} If the encryption process throws an error, an error is thrown - * - * @example - * ```typescript - * import { privateKeyToAccount } from 'viem/accounts'; - * import { encryptWithPublicKey } from '@nucypher/taco'; - * - * const viemAuthSigner = privateKeyToAccount('0x...'); - * - * const encrypted = await encryptWithPublicKey( - * 'Hello, secret!', // Message to encrypt - * condition, // Access condition - * dkgPublicKey, // DKG public key - * viemAuthSigner // Your viem account - * ); - * ``` - */ -export const encryptWithPublicKey = async ( - message: Uint8Array | string, - condition: Condition, - dkgPublicKey: DkgPublicKey, - viemAuthSigner: Account, -): Promise => { - // Create signer without provider (signing-only operation) - const tacoSigner = await createTacoSigner(viemAuthSigner); - - // Use the existing ethers-based encryptWithPublicKey function with type assertions - return await ethersEncryptWithPublicKey( - message, - condition, - dkgPublicKey, - tacoSigner as unknown as ethers.Signer, - ); -}; - -/** - * Decrypts an encrypted message using viem clients. - * - * This is a viem-compatible overload of the decrypt function that accepts viem clients - * instead of ethers providers. - * - * @export - * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations - * @param {Domain} domain - Represents the logical network for decryption (must match ritualId) - * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted - * @param {ConditionContext} context - Optional context data used for decryption time values - * @param {string[]} [porterUris] - Optional URI(s) for the Porter service - * - * @returns {Promise} Returns Promise that resolves with a decrypted message - * - * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error - * - * @example - * ```typescript - * import { createPublicClient, http } from 'viem'; - * import { polygonAmoy } from 'viem/chains'; - * - * const viemPublicClient = createPublicClient({ - * chain: polygonAmoy, - * transport: http() - * }); - * - * const decrypted = await decrypt( - * viemPublicClient, - * 'lynx', - * messageKit, - * context - * ); - * - * ``` - */ -export const decrypt = async ( - viemPublicClient: PublicClient, - domain: Domain, - messageKit: ThresholdMessageKit, - context?: ConditionContext, - porterUris?: string[], -): Promise => { - // Create TACo provider adapter from viem object - const tacoProvider = await createTacoProvider(viemPublicClient); - - // Use the existing ethers-based decrypt function with type assertion - // Our adapter provides all the methods that the TACo SDK actually uses - return await ethersDecrypt( - tacoProvider as unknown as ethers.providers.Provider, - domain, - messageKit, - context, - porterUris, - ); -}; diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 13445aadb..413354ec6 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -20,7 +20,7 @@ import { beforeAll, describe, expect, it, vi } from 'vitest'; import { conditions, domains, toBytes } from '../src'; import { ConditionContext } from '../src/conditions/context'; -import { decrypt, encrypt } from '../src/viem-taco'; +import { decrypt, encrypt } from '../src/taco'; import { fakeDkgRitual, @@ -95,10 +95,10 @@ describe('viem TACo integration', () => { } as any; const createTacoProviderSpy = vi - .spyOn(await import('@nucypher/shared'), 'createTacoProvider') + .spyOn(await import('@nucypher/shared'), 'toEthersProvider') .mockReturnValue(mockViemProvider); const createTacoSignerSpy = vi - .spyOn(await import('@nucypher/shared'), 'createTacoSigner') + .spyOn(await import('@nucypher/shared'), 'toEthersSigner') .mockReturnValue(typedSigner); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); From acc6dfa6b401ece8d2cbdd9385148dd89411f2c7 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 9 Sep 2025 15:02:07 +0200 Subject: [PATCH 38/97] refactor: introduce and use ProviderLike and SignerLike types --- packages/shared/src/ethers-viem-utils.ts | 12 +++++------- packages/shared/src/type-guards.ts | 9 +++------ packages/shared/src/types.ts | 7 +++++++ packages/taco-auth/src/providers/eip4361/eip4361.ts | 6 ++++-- packages/taco/src/taco.ts | 10 ++++++---- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/packages/shared/src/ethers-viem-utils.ts b/packages/shared/src/ethers-viem-utils.ts index 27ecab13c..611e78e43 100644 --- a/packages/shared/src/ethers-viem-utils.ts +++ b/packages/shared/src/ethers-viem-utils.ts @@ -2,6 +2,7 @@ import { ethers } from 'ethers'; import { type TacoProvider, type TacoSigner } from './taco-interfaces'; import { isViemAccount, isViemClient } from './type-guards'; +import { ProviderLike, SignerLike } from './types'; import { type Account, type PublicClient } from './viem-types'; /** @@ -62,10 +63,7 @@ export class ViemTacoSigner implements TacoSigner { protected viemAccount: Account; public provider?: ethers.providers.Provider | undefined; - constructor( - viemAccount: Account, - provider?: ethers.providers.Provider | PublicClient | undefined, - ) { + constructor(viemAccount: Account, provider?: ProviderLike | undefined) { this.viemAccount = viemAccount; if (provider) { this.provider = toEthersProvider(provider); @@ -97,7 +95,7 @@ export class ViemTacoSigner implements TacoSigner { * This function creates a TacoProvider directly from a viem client. */ export function toEthersProvider( - provider: ethers.providers.Provider | PublicClient, + provider: ProviderLike, ): ethers.providers.Provider { if (isViemClient(provider)) { return new ViemTacoProvider( @@ -117,8 +115,8 @@ export function toEthersProvider( * @param provider - Optional TACo provider. If not provided, some operations will require a provider */ export function toEthersSigner( - signerLike: ethers.Signer | Account, - provider?: ethers.providers.Provider | PublicClient, + signerLike: SignerLike, + provider?: ProviderLike, ): ethers.Signer { const providerAdapter = provider ? toEthersProvider(provider) : undefined; if (isViemAccount(signerLike)) { diff --git a/packages/shared/src/type-guards.ts b/packages/shared/src/type-guards.ts index 6e3c55831..093d3bcca 100644 --- a/packages/shared/src/type-guards.ts +++ b/packages/shared/src/type-guards.ts @@ -1,13 +1,12 @@ import { ethers } from 'ethers'; +import { ProviderLike, SignerLike } from './types'; import { Account, PublicClient } from './viem-types'; /** * Type guard to determine if the client is a viem PublicClient */ -export function isViemClient( - client: ethers.providers.Provider | PublicClient, -): client is PublicClient { +export function isViemClient(client: ProviderLike): client is PublicClient { const hasViemProperties = 'chain' in client; const hasViemMethods = typeof (client as { getChainId: () => Promise }).getChainId === @@ -22,9 +21,7 @@ export function isViemClient( /** * Type guard to determine if the signer is a viem Account */ -export function isViemAccount( - signer: ethers.Signer | Account, -): signer is Account { +export function isViemAccount(signer: SignerLike): signer is Account { // Check for viem Account properties const hasViemAccountProperties = 'address' in signer && diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 02603b3c2..ab4c6a4ef 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,3 +1,10 @@ +import { ethers } from 'ethers'; + +import { Account, PublicClient } from './viem-types'; + export type ChecksumAddress = `0x${string}`; export type HexEncodedBytes = string; export type Base64EncodedBytes = string; + +export type ProviderLike = ethers.providers.Provider | PublicClient; +export type SignerLike = ethers.Signer | Account; diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index 1ae2a4dad..27cefc525 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -1,6 +1,8 @@ import { Account, + ProviderLike, PublicClient, + SignerLike, toEthersProvider, toEthersSigner, } from '@nucypher/shared'; @@ -119,8 +121,8 @@ export class EIP4361AuthProvider implements AuthProvider { ): EIP4361AuthProvider; static create( - providerOrClient: ethers.providers.Provider | PublicClient, - signerOrAccount: ethers.Signer | Account, + providerOrClient: ProviderLike, + signerOrAccount: SignerLike, options?: EIP4361AuthProviderParams, ): EIP4361AuthProvider { const provider = toEthersProvider(providerOrClient); diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 16e06431a..a619a163b 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -11,7 +11,9 @@ import { fromHexString, getPorterUris, PorterClient, + ProviderLike, PublicClient, + SignerLike, toBytes, toEthersProvider, toEthersSigner, @@ -84,12 +86,12 @@ export async function encrypt( ): Promise; export async function encrypt( - providerOrClient: ethers.providers.Provider | PublicClient, + providerOrClient: ProviderLike, domain: Domain, message: Uint8Array | string, condition: Condition, ritualId: number, - signerOrAccount: ethers.Signer | Account, + signerOrAccount: SignerLike, ): Promise { // TODO(#264): Enable ritual initialization // if (ritualId === undefined) { @@ -170,7 +172,7 @@ export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, - authOrAccount: ethers.Signer | Account, + authOrAccount: SignerLike, ): Promise { if (typeof message === 'string') { message = toBytes(message); @@ -248,7 +250,7 @@ export function decrypt( ): Promise; export async function decrypt( - providerOrClient: ethers.providers.Provider | PublicClient, + providerOrClient: ProviderLike, domain: Domain, messageKit: ThresholdMessageKit, context?: ConditionContext, From 8e38fb1feae45871ae9990bd1ed7dd3f7057950b Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 9 Sep 2025 20:23:13 +0200 Subject: [PATCH 39/97] refactor: simplify and polish EIP4361AuthProvider and viem documentation --- packages/shared/src/ethers-viem-utils.ts | 4 - .../src/providers/eip4361/eip4361.ts | 80 +++++----- packages/taco/README.md | 4 +- packages/taco/VIEM_SUPPORT.md | 139 ++---------------- .../viem-encrypt-decrypt.test.ts | 6 +- 5 files changed, 55 insertions(+), 178 deletions(-) diff --git a/packages/shared/src/ethers-viem-utils.ts b/packages/shared/src/ethers-viem-utils.ts index 611e78e43..37b9f58ab 100644 --- a/packages/shared/src/ethers-viem-utils.ts +++ b/packages/shared/src/ethers-viem-utils.ts @@ -9,8 +9,6 @@ import { type Account, type PublicClient } from './viem-types'; * Viem TACo Provider * * This class implements the TacoProvider interface directly using viem clients. - * It bridges the gap between viem and ethers.js interfaces. - * Used by both taco and taco-auth packages to avoid code duplication. */ export class ViemTacoProvider implements TacoProvider { protected viemPublicClient: PublicClient; @@ -56,8 +54,6 @@ export class ViemTacoProvider implements TacoProvider { * Viem TACo Signer * * This class implements the TacoSigner interface directly using viem accounts. - * It bridges the gap between viem and ethers.js interfaces. - * Used by both taco and taco-auth packages to avoid code duplication. */ export class ViemTacoSigner implements TacoSigner { protected viemAccount: Account; diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index 27cefc525..0715fe1ea 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -39,7 +39,7 @@ const TACO_DEFAULT_URI = 'https://taco.build'; * * Messages are valid for 2 hours from creation and stored locally keyed by the signer's address. * - * Supports both ethers.js and viem via constructor overloading and static factory methods. + * Supports both ethers.js and viem. * * @implements {AuthProvider} * @@ -54,12 +54,14 @@ const TACO_DEFAULT_URI = 'https://taco.build'; * ```typescript * const publicClient = createPublicClient({ chain: polygon, transport: http() }); * const account = privateKeyToAccount('0x...'); - * const authProvider = await EIP4361AuthProvider.create(publicClient, account); + * const authProvider = new EIP4361AuthProvider(publicClient, account); * ``` */ export class EIP4361AuthProvider implements AuthProvider { private readonly storage: LocalStorage; private readonly providerParams: EIP4361AuthProviderParams; + private readonly provider: ethers.providers.Provider; + private readonly signer: ethers.Signer; /** * Creates a new EIP4361AuthProvider instance with ethers.js objects. @@ -80,11 +82,42 @@ export class EIP4361AuthProvider implements AuthProvider { * - Nonce: Auto-generated */ constructor( - private readonly provider: ethers.providers.Provider, - private readonly signer: ethers.Signer, + provider: ethers.providers.Provider, + signer: ethers.Signer, + providerParams?: EIP4361AuthProviderParams, + ); + + /** + * Creates a new EIP4361AuthProvider instance with viem objects. + * + * @param publicClient - Viem public client used to fetch the current chainId + * @param account - Viem account used to sign SIWE messages + * @param providerParams - Optional SIWE message configuration + * @param providerParams.domain - Domain name for the signing request (e.g. 'app.example.com'). + * Defaults to current website domain or 'taco.build' + * @param providerParams.uri - Full URI of signing request origin (e.g. 'https://app.example.com'). + * Defaults to current website URL or 'https://taco.build' + * + * The SIWE message will include: + * - A human-readable statement: "{domain} wants you to sign in with your Ethereum account: {address}" + * - Version: "1" + * - 2 hour expiration from creation time + * - Chain ID from the provided provider + * - Nonce: Auto-generated + */ + constructor( + publicClient: PublicClient, + account: Account, + providerParams?: EIP4361AuthProviderParams, + ); + constructor( + provider: ProviderLike, + signer: SignerLike, providerParams?: EIP4361AuthProviderParams, ) { this.storage = new LocalStorage(eip4361AuthSignatureSchema); + this.provider = toEthersProvider(provider); + this.signer = toEthersSigner(signer, this.provider); if (providerParams) { this.providerParams = providerParams; } else { @@ -92,45 +125,6 @@ export class EIP4361AuthProvider implements AuthProvider { } } - /** - * Create a new EIP4361AuthProvider instance with viem objects. - * - * @param viemPublicClient - viem PublicClient for blockchain interactions - * @param viemAccount - viem Account for signing operations - * @param options - Optional EIP4361 parameters (domain, uri) - * @returns Promise resolving to EIP4361AuthProvider instance - */ - static create( - viemPublicClient: PublicClient, - viemAccount: Account, - options?: EIP4361AuthProviderParams, - ): EIP4361AuthProvider; - - /** - * Create a new EIP4361AuthProvider instance with ethers.js objects. - * - * @param provider - Ethers provider used to fetch the current chainId - * @param signer - Ethers signer used to sign SIWE messages - * @param options - Optional EIP4361 parameters (domain, uri) - * @returns Promise resolving to EIP4361AuthProvider instance - */ - static create( - provider: ethers.providers.Provider, - signer: ethers.Signer, - options?: EIP4361AuthProviderParams, - ): EIP4361AuthProvider; - - static create( - providerOrClient: ProviderLike, - signerOrAccount: SignerLike, - options?: EIP4361AuthProviderParams, - ): EIP4361AuthProvider { - const provider = toEthersProvider(providerOrClient); - const signer = toEthersSigner(signerOrAccount, provider); - - return new EIP4361AuthProvider(provider, signer, options); - } - /** * Gets default domain and URI parameters based on runtime environment. * diff --git a/packages/taco/README.md b/packages/taco/README.md index 7378f3e96..57eba6183 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -66,7 +66,7 @@ const decryptedMessage = await decrypt( ## Viem Support -The TACo SDK supports both [ethers.js](https://docs.ethers.org/) natively, and [viem](https://viem.sh) through function overloads. The same `encrypt` and `decrypt` functions work with both libraries: +The TACo SDK supports both [ethers.js](https://docs.ethers.org/) natively, and [viem](https://viem.sh). The same `encrypt` and `decrypt` functions work with both libraries. Here is how to use them with viem: ```bash $ yarn add @nucypher/taco viem @@ -113,7 +113,7 @@ const decryptedMessage = await decrypt( ### Automatic Library Detection -TypeScript automatically detects which library you're using based on the parameter types: +TypeScript automatically detects which library objects you're passing and works seamlessly: ```typescript // Using ethers.js - automatically uses ethers implementation diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index f2553587b..478e40964 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -22,11 +22,11 @@ package: npm install @nucypher/taco-auth viem ``` -## Function Overloads +## Supported Libraries The same `encrypt` and `decrypt` functions work with both ethers.js and viem. -TypeScript automatically selects the correct implementation based on your -parameter types: + +Here is how to use them with viem: ```typescript import { @@ -64,12 +64,12 @@ const condition = new conditions.predefined.erc20.ERC20Balance({ // Same function names work with viem - TypeScript automatically detects the right overload const encryptedKit = await encrypt( - viemPublicClient, // viem PublicClient - TypeScript detects this + viemPublicClient, // viem PublicClient domains.DEVNET, // or 'lynx' 'Hello, secret!', condition, 27, // ritual ID - viemAccount, // viem Account - TypeScript detects this + viemAccount, // viem Account ); // Same decrypt function works with viem @@ -82,99 +82,14 @@ const decryptedMessage = await decrypt( console.log(new TextDecoder().decode(decryptedMessage)); // "Hello, secret!" ``` -## Automatic Library Detection - -The overload system automatically detects which library you're using: - -```typescript -import { encrypt, decrypt, domains } from '@nucypher/taco'; -import { ethers } from 'ethers'; -import { createPublicClient, http } from 'viem'; -import { privateKeyToAccount } from 'viem/accounts'; - -// Using ethers.js - automatically uses ethers implementation -const ethersEncrypted = await encrypt( - ethersProvider, // ethers.providers.Provider - domains.TESTNET, - message, - condition, - ritualId, - ethersSigner, // ethers.Signer -); - -// Using viem - automatically uses viem implementation -const viemEncrypted = await encrypt( - viemPublicClient, // viem PublicClient - domains.TESTNET, - message, - condition, - ritualId, - viemAccount, // viem Account -); - -// Both return the same ThresholdMessageKit type -// Both can be decrypted with either library -``` - -## Function Signatures - -The overloaded functions support both ethers.js and viem parameter types: - -### `encrypt()` - Viem Overload - -```typescript -function encrypt( - viemPublicClient: PublicClient, - domain: Domain, - message: Uint8Array | string, - condition: Condition, - ritualId: number, - viemAuthSigner: Account, -): Promise; -``` - -**Parameters:** - -- `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations -- `domain`: `Domain` - TACo domain ('lynx', 'tapir', 'mainnet') -- `message`: `Uint8Array | string` - Message to encrypt -- `condition`: `Condition` - Access condition for decryption -- `ritualId`: `number` - DKG ritual ID -- `viemAuthSigner`: `Account` - Viem account for signing - -**Returns:** `Promise` - -### `decrypt()` - Viem Overload - -```typescript -function decrypt( - viemPublicClient: PublicClient, - domain: Domain, - messageKit: ThresholdMessageKit, - context?: ConditionContext, - porterUris?: string[], -): Promise; -``` - -**Parameters:** - -- `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations -- `domain`: `Domain` - TACo domain -- `messageKit`: `ThresholdMessageKit` - Encrypted message kit -- `context?`: `ConditionContext` - Optional context for conditions -- `porterUris?`: `string[]` - Optional Porter service URIs - -**Returns:** `Promise` - -## Viem Authentication Providers +## Authentication Providers For applications that need authentication providers compatible with viem, use the `@nucypher/taco-auth` package: -### EIP4361AuthProvider with Viem Support +### EIP4361AuthProvider -The consolidated `EIP4361AuthProvider` now supports both ethers.js and viem -through static factory methods: +`EIP4361AuthProvider` also supports both ethers.js and viem: ```typescript import { createPublicClient, http } from 'viem'; @@ -188,8 +103,8 @@ const publicClient = createPublicClient({ }); const account = privateKeyToAccount('0x...'); -// Viem usage - uses async factory method -const authProvider = await EIP4361AuthProvider.create(publicClient, account, { +// Viem usage +const authProvider = new EIP4361AuthProvider(publicClient, account, { domain: 'my-app.com', uri: 'https://my-app.com', }); @@ -197,13 +112,6 @@ const authProvider = await EIP4361AuthProvider.create(publicClient, account, { const authSignature = await authProvider.getOrCreateAuthSignature(); ``` -**Viem Factory Method Parameters:** - -- `viemPublicClient`: `PublicClient` - Viem public client for network operations -- `viemAccount`: `Account` - Viem account for signing -- `options?`: `EIP4361AuthProviderParams` - Optional domain and URI for EIP-4361 - messages - **Ethers.js Usage (for comparison):** ```typescript @@ -213,34 +121,13 @@ import { EIP4361AuthProvider } from '@nucypher/taco-auth'; const provider = new ethers.providers.JsonRpcProvider(); const signer = new ethers.Wallet('0x...', provider); -// Ethers usage - can use constructor or factory method +// Ethers usage const authProvider = new EIP4361AuthProvider(provider, signer); -// OR -const authProvider = await EIP4361AuthProvider.create(provider, signer); ``` -**Methods:** - -- `getOrCreateAuthSignature()`: Returns authentication signature for TACo - operations - -## Package Architecture - -### @nucypher/taco - -- **Purpose**: Core encryption and decryption functionality -- **Viem Functions**: `encrypt()`, `decrypt()` (automatic overload detection) -- **Dependencies**: Only viem functions for encryption operations - -### @nucypher/taco-auth - -- **Purpose**: Authentication providers and signing utilities -- **Viem Functions**: `EIP4361AuthProvider.create()` with viem parameter - overloading -- **Dependencies**: Viem authentication and EIP-4361 signing +## Installation -This separation follows clean architecture principles - use the appropriate -package based on your needs: +Use the appropriate package based on your needs: - **Encryption only**: Install `@nucypher/taco` + `viem` - **Authentication required**: Install both `@nucypher/taco` + diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts index 42d724802..89909dbc0 100644 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -124,7 +124,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( USER_ADDRESS_PARAM_DEFAULT, ) ) { - const authProvider = await EIP4361AuthProvider.create( + const authProvider = new EIP4361AuthProvider( viemPublicClient, consumerAccount, ); @@ -182,7 +182,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); // Add auth provider using consolidated EIP4361AuthProvider with viem support - const authProvider = await EIP4361AuthProvider.create( + const authProvider = new EIP4361AuthProvider( viemPublicClient, consumerAccount, ); @@ -244,7 +244,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); // Add auth provider using consolidated EIP4361AuthProvider with different client - const authProvider = await EIP4361AuthProvider.create( + const authProvider = new EIP4361AuthProvider( anotherViemPublicClient, consumerAccount, ); From e70e1dea87a14fa9fe7384d9e71ed71bbc6429db Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 10 Sep 2025 11:26:34 +0200 Subject: [PATCH 40/97] refactor: reorganize viem-related files into dedicated directory and improve parameter naming --- packages/shared/src/index.ts | 6 ++--- packages/shared/src/types.ts | 2 +- .../src/{ => viem}/ethers-viem-utils.ts | 27 ++++++++++--------- packages/shared/src/{ => viem}/type-guards.ts | 17 +++++++----- .../src/{viem-types.ts => viem/types.ts} | 3 ++- .../src/providers/eip4361/eip4361.ts | 8 +++--- packages/taco/src/taco.ts | 26 +++++++++--------- 7 files changed, 48 insertions(+), 41 deletions(-) rename packages/shared/src/{ => viem}/ethers-viem-utils.ts (84%) rename packages/shared/src/{ => viem}/type-guards.ts (65%) rename packages/shared/src/{viem-types.ts => viem/types.ts} (92%) diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 3d2de0471..d77b360af 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,12 +1,12 @@ export * from './contracts'; -export * from './ethers-viem-utils'; export * from './porter'; export * from './schemas'; export * from './taco-interfaces'; -export * from './type-guards'; export type * from './types'; export * from './utils'; -export * from './viem-types'; +export * from './viem/ethers-viem-utils'; +export * from './viem/type-guards'; +export * from './viem/types'; export * from './web3'; // Re-exports diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index ab4c6a4ef..cab4084f0 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; -import { Account, PublicClient } from './viem-types'; +import { Account, PublicClient } from './viem/types'; export type ChecksumAddress = `0x${string}`; export type HexEncodedBytes = string; diff --git a/packages/shared/src/ethers-viem-utils.ts b/packages/shared/src/viem/ethers-viem-utils.ts similarity index 84% rename from packages/shared/src/ethers-viem-utils.ts rename to packages/shared/src/viem/ethers-viem-utils.ts index 37b9f58ab..cf648e669 100644 --- a/packages/shared/src/ethers-viem-utils.ts +++ b/packages/shared/src/viem/ethers-viem-utils.ts @@ -1,9 +1,10 @@ import { ethers } from 'ethers'; -import { type TacoProvider, type TacoSigner } from './taco-interfaces'; +import { type TacoProvider, type TacoSigner } from '../taco-interfaces'; +import { ProviderLike, SignerLike } from '../types'; + import { isViemAccount, isViemClient } from './type-guards'; -import { ProviderLike, SignerLike } from './types'; -import { type Account, type PublicClient } from './viem-types'; +import { type Account, type PublicClient } from './types'; /** * Viem TACo Provider @@ -59,10 +60,10 @@ export class ViemTacoSigner implements TacoSigner { protected viemAccount: Account; public provider?: ethers.providers.Provider | undefined; - constructor(viemAccount: Account, provider?: ProviderLike | undefined) { + constructor(viemAccount: Account, providerLike?: ProviderLike | undefined) { this.viemAccount = viemAccount; - if (provider) { - this.provider = toEthersProvider(provider); + if (providerLike) { + this.provider = toEthersProvider(providerLike); } } @@ -91,14 +92,14 @@ export class ViemTacoSigner implements TacoSigner { * This function creates a TacoProvider directly from a viem client. */ export function toEthersProvider( - provider: ProviderLike, + providerLike: ProviderLike, ): ethers.providers.Provider { - if (isViemClient(provider)) { + if (isViemClient(providerLike)) { return new ViemTacoProvider( - provider, + providerLike, ) as unknown as ethers.providers.Provider; } else { - return provider; + return providerLike; } } @@ -112,9 +113,11 @@ export function toEthersProvider( */ export function toEthersSigner( signerLike: SignerLike, - provider?: ProviderLike, + providerLike?: ProviderLike, ): ethers.Signer { - const providerAdapter = provider ? toEthersProvider(provider) : undefined; + const providerAdapter = providerLike + ? toEthersProvider(providerLike) + : undefined; if (isViemAccount(signerLike)) { return new ViemTacoSigner( signerLike, diff --git a/packages/shared/src/type-guards.ts b/packages/shared/src/viem/type-guards.ts similarity index 65% rename from packages/shared/src/type-guards.ts rename to packages/shared/src/viem/type-guards.ts index 093d3bcca..c36d924d9 100644 --- a/packages/shared/src/type-guards.ts +++ b/packages/shared/src/viem/type-guards.ts @@ -1,18 +1,21 @@ import { ethers } from 'ethers'; -import { ProviderLike, SignerLike } from './types'; -import { Account, PublicClient } from './viem-types'; +import { ProviderLike, SignerLike } from '../types'; + +import { Account, PublicClient } from './types'; /** * Type guard to determine if the client is a viem PublicClient */ -export function isViemClient(client: ProviderLike): client is PublicClient { - const hasViemProperties = 'chain' in client; +export function isViemClient( + providerLike: ProviderLike, +): providerLike is PublicClient { + const hasViemProperties = 'chain' in providerLike; const hasViemMethods = - typeof (client as { getChainId: () => Promise }).getChainId === - 'function'; + typeof (providerLike as { getChainId: () => Promise }) + .getChainId === 'function'; const isNotEthersProvider = !( - client instanceof ethers.providers.BaseProvider + providerLike instanceof ethers.providers.BaseProvider ); return isNotEthersProvider && (hasViemProperties || hasViemMethods); diff --git a/packages/shared/src/viem-types.ts b/packages/shared/src/viem/types.ts similarity index 92% rename from packages/shared/src/viem-types.ts rename to packages/shared/src/viem/types.ts index e74ac9120..ccbe6dbf6 100644 --- a/packages/shared/src/viem-types.ts +++ b/packages/shared/src/viem/types.ts @@ -17,7 +17,8 @@ * ``` */ -// Type helper: Use the real type from 'viem' if available, otherwise fallback to 'any' +// Type helper: Use the real type from 'viem' if available, otherwise fallback to 'any'. +// This is because viem is an optional dependency, so the viem types may or may not be present. // This pattern preserves type safety for consumers who have 'viem' installed, but does not break for others. // See: https://github.com/microsoft/TypeScript/issues/47663#issuecomment-1367016530 // Dynamic imports resolve to 'unknown' when module is not available, no compile-time errors occur diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index 0715fe1ea..57c93634c 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -111,13 +111,13 @@ export class EIP4361AuthProvider implements AuthProvider { providerParams?: EIP4361AuthProviderParams, ); constructor( - provider: ProviderLike, - signer: SignerLike, + providerLike: ProviderLike, + signerLike: SignerLike, providerParams?: EIP4361AuthProviderParams, ) { this.storage = new LocalStorage(eip4361AuthSignatureSchema); - this.provider = toEthersProvider(provider); - this.signer = toEthersSigner(signer, this.provider); + this.provider = toEthersProvider(providerLike); + this.signer = toEthersSigner(signerLike, this.provider); if (providerParams) { this.providerParams = providerParams; } else { diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index a619a163b..9e110e3bf 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -86,12 +86,12 @@ export async function encrypt( ): Promise; export async function encrypt( - providerOrClient: ProviderLike, + providerLike: ProviderLike, domain: Domain, message: Uint8Array | string, condition: Condition, ritualId: number, - signerOrAccount: SignerLike, + signerLike: SignerLike, ): Promise { // TODO(#264): Enable ritual initialization // if (ritualId === undefined) { @@ -107,8 +107,8 @@ export async function encrypt( // } // Create TACo provider and signer adapters from viem objects - const providerAdapter = toEthersProvider(providerOrClient); - const authSigner = toEthersSigner(signerOrAccount, providerAdapter); + const providerAdapter = toEthersProvider(providerLike); + const signerAdapter = toEthersSigner(signerLike, providerAdapter); const dkgRitual = await DkgClient.getActiveRitual( providerAdapter, @@ -120,7 +120,7 @@ export async function encrypt( message, condition, dkgRitual.dkgPublicKey, - authSigner, + signerAdapter, ); } @@ -154,7 +154,7 @@ export async function encryptWithPublicKey( * @param {Condition} condition - Condition under which the message will be encrypted. Those conditions must be * satisfied in order to decrypt the message. * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption - * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization. + * @param {Account} account - The viem account that will be used to sign the encrypter authorization. * * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit. * It represents the encrypted message. @@ -165,20 +165,20 @@ export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, - viemAuthSigner: Account, + authAccount: Account, ): Promise; export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, - authOrAccount: SignerLike, + signerLike: SignerLike, ): Promise { if (typeof message === 'string') { message = toBytes(message); } - const signer = toEthersSigner(authOrAccount); + const signer = toEthersSigner(signerLike); const conditionExpr = new ConditionExpression(condition); @@ -250,7 +250,7 @@ export function decrypt( ): Promise; export async function decrypt( - providerOrClient: ProviderLike, + providerLike: ProviderLike, domain: Domain, messageKit: ThresholdMessageKit, context?: ConditionContext, @@ -261,15 +261,15 @@ export async function decrypt( : await getPorterUris(domain); const porter = new PorterClient(porterUrisFull); - const provider = await toEthersProvider(providerOrClient); + const providerAdapter = await toEthersProvider(providerLike); const ritualId = await DkgCoordinatorAgent.getRitualIdFromPublicKey( - provider, + providerAdapter, domain, messageKit.acp.publicKey, ); return retrieveAndDecrypt( - provider, + providerAdapter, domain, porter, messageKit, From ba013d1c10fdeb9351fab0c7434ada0bdd11ad05 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 10 Sep 2025 13:41:12 +0200 Subject: [PATCH 41/97] add some unit tests and removed un-used property --- packages/shared/src/viem/ethers-viem-utils.ts | 1 - .../shared/test/ethers-viem-utils.test.ts | 369 +++++++++++++++++- packages/shared/test/viem-types.test.ts | 27 ++ 3 files changed, 375 insertions(+), 22 deletions(-) create mode 100644 packages/shared/test/viem-types.test.ts diff --git a/packages/shared/src/viem/ethers-viem-utils.ts b/packages/shared/src/viem/ethers-viem-utils.ts index cf648e669..786f513ca 100644 --- a/packages/shared/src/viem/ethers-viem-utils.ts +++ b/packages/shared/src/viem/ethers-viem-utils.ts @@ -17,7 +17,6 @@ export class ViemTacoProvider implements TacoProvider { // Ethers.js compatibility property for contract validation readonly _isProvider = true; readonly _network: Promise; - readonly formatter?: undefined = undefined; constructor(viemPublicClient: PublicClient) { this.viemPublicClient = viemPublicClient; diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts index fa8fa86e2..0b223b940 100644 --- a/packages/shared/test/ethers-viem-utils.test.ts +++ b/packages/shared/test/ethers-viem-utils.test.ts @@ -1,61 +1,388 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { describe, expect, it, vi } from 'vitest'; +// @ts-nocheck +import { ethers } from 'ethers'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { toEthersProvider, toEthersSigner } from '@nucypher/shared'; +import { + toEthersProvider, + toEthersSigner, + ViemTacoProvider, + ViemTacoSigner, +} from '../src/viem/ethers-viem-utils'; +import { isViemAccount, isViemClient } from '../src/viem/type-guards'; describe('viem adapter utilities', () => { describe('function exports', () => { it('should export all adapter functions', () => { expect(toEthersProvider).toBeDefined(); expect(toEthersSigner).toBeDefined(); + expect(ViemTacoProvider).toBeDefined(); + expect(ViemTacoSigner).toBeDefined(); + expect(isViemClient).toBeDefined(); + expect(isViemAccount).toBeDefined(); expect(typeof toEthersProvider).toBe('function'); expect(typeof toEthersSigner).toBe('function'); + expect(typeof isViemClient).toBe('function'); + expect(typeof isViemAccount).toBe('function'); + }); + }); + + describe('ViemTacoProvider', () => { + let mockViemPublicClient: any; + + beforeEach(() => { + mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), + call: vi.fn().mockResolvedValue('0x1234'), + chain: { + name: 'Polygon Amoy', + id: 80002, + }, + }; + }); + + it('should create provider with ethers compatibility properties', async () => { + const provider = new ViemTacoProvider(mockViemPublicClient); + + expect(provider._isProvider).toBe(true); + expect(provider._network).toBeDefined(); + expect(provider.getNetwork).toBeDefined(); + expect(provider.call).toBeDefined(); + + // Actually call the methods to ensure coverage + await provider.getNetwork(); + await provider.call({ to: '0x123', data: '0xabc' }); + }); + + it('should get network information correctly', async () => { + const provider = new ViemTacoProvider(mockViemPublicClient); + const network = await provider.getNetwork(); + + expect(network.chainId).toBe(80002); + expect(network.name).toBe('Polygon Amoy'); + expect(mockViemPublicClient.getChainId).toHaveBeenCalled(); + }); + + it('should handle missing chain name', async () => { + const clientWithoutChain = { + ...mockViemPublicClient, + chain: undefined, + }; + + const provider = new ViemTacoProvider(clientWithoutChain); + const network = await provider.getNetwork(); + + expect(network.chainId).toBe(80002); + expect(network.name).toBe('chain-80002'); + }); + + it('should handle call with transaction data', async () => { + const provider = new ViemTacoProvider(mockViemPublicClient); + const transaction = { + to: '0x1234567890123456789012345678901234567890', + data: '0xabcdef', + value: ethers.BigNumber.from('1000'), + }; + + const result = await provider.call(transaction); + + expect(result).toBe('0x1234'); + expect(mockViemPublicClient.call).toHaveBeenCalledWith({ + to: transaction.to, + data: transaction.data, + value: BigInt('1000'), + }); + }); + + it('should handle call without value', async () => { + const provider = new ViemTacoProvider(mockViemPublicClient); + const transaction = { + to: '0x1234567890123456789012345678901234567890', + data: '0xabcdef', + }; + + await provider.call(transaction); + + expect(mockViemPublicClient.call).toHaveBeenCalledWith({ + to: transaction.to, + data: transaction.data, + value: undefined, + }); + }); + + it('should handle call result with data property', async () => { + mockViemPublicClient.call.mockResolvedValue({ data: '0x5678' }); + + const provider = new ViemTacoProvider(mockViemPublicClient); + const result = await provider.call({ to: '0x123', data: '0xabc' }); + + expect(result).toBe('0x5678'); + }); + }); + + describe('ViemTacoSigner', () => { + let mockViemAccount: any; + let mockProvider: any; + + beforeEach(() => { + mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + }; + + mockProvider = { + getNetwork: vi.fn().mockResolvedValue({ chainId: 80002, name: 'test' }), + }; + }); + + it('should create signer without provider', async () => { + const signer = new ViemTacoSigner(mockViemAccount); + + expect(signer.provider).toBeUndefined(); + expect(signer.getAddress).toBeDefined(); + expect(signer.signMessage).toBeDefined(); + + // Actually call the methods to ensure coverage + await signer.getAddress(); + await signer.signMessage('test'); + }); + + it('should create signer with provider', async () => { + const signer = new ViemTacoSigner(mockViemAccount, mockProvider); + + expect(signer.provider).toBe(mockProvider); + }); + + it('should get address from viem account', async () => { + const signer = new ViemTacoSigner(mockViemAccount); + const address = await signer.getAddress(); + + expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + }); + + it('should sign string message', async () => { + const signer = new ViemTacoSigner(mockViemAccount); + const signature = await signer.signMessage('test message'); + + expect(signature).toBe('0xsignature'); + expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ + message: 'test message', + }); + }); + + it('should sign Uint8Array message', async () => { + const signer = new ViemTacoSigner(mockViemAccount); + const message = new Uint8Array([1, 2, 3, 4]); + + await signer.signMessage(message); + + expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ + message: '0x01020304', + }); + }); + + it('should throw error if account does not support signing', async () => { + const accountWithoutSigning = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + // no signMessage method + }; + + const signer = new ViemTacoSigner(accountWithoutSigning); + + await expect(signer.signMessage('test')).rejects.toThrow( + 'Account does not support message signing', + ); + }); + + it('should connect to provider', () => { + const signer = new ViemTacoSigner(mockViemAccount); + const connected = signer.connect(mockProvider); + + expect(signer.provider).toBe(mockProvider); + expect(connected).toBe(signer); }); }); describe('toEthersProvider', () => { - it('should create a provider from viem client', async () => { + it('should create provider from viem client', async () => { const mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), - getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), call: vi.fn().mockResolvedValue('0x'), + chain: { name: 'test', id: 80002 }, } as any; - const provider = await toEthersProvider(mockViemPublicClient); - expect(provider).toBeDefined(); + + const provider = toEthersProvider(mockViemPublicClient); + + expect(provider).toBeInstanceOf(ViemTacoProvider); expect(provider.getNetwork).toBeDefined(); expect(provider.call).toBeDefined(); + + // Actually call the methods to ensure coverage + const network = await provider.getNetwork(); + expect(network.chainId).toBe(80002); + expect(network.name).toBe('test'); + }); + + it('should return ethers provider unchanged', () => { + const ethersProvider = new ethers.providers.JsonRpcProvider(); + const result = toEthersProvider(ethersProvider); + + expect(result).toBe(ethersProvider); + }); + + it('should handle non-viem provider correctly', () => { + const nonViemProvider = { + someProperty: 'value', + someMethod: () => {}, + } as any; + + const result = toEthersProvider(nonViemProvider); + + expect(result).toBe(nonViemProvider); }); }); describe('toEthersSigner', () => { - it('should create a signer from viem account', async () => { + it('should create signer from viem account', async () => { const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn().mockResolvedValue('0xsignature'), } as any; - const mockViemPublicClient = { + const mockProvider = { + getNetwork: vi.fn().mockResolvedValue({ chainId: 80002, name: 'test' }), + } as any; + + const signer = toEthersSigner(mockViemAccount, mockProvider); + + expect(signer).toBeInstanceOf(ViemTacoSigner); + expect(signer.provider).toBe(mockProvider); + + // Actually call methods to ensure coverage + const address = await signer.getAddress(); + expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + }); + + it('should create signer without provider', async () => { + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsig'), + } as any; + + const signer = toEthersSigner(mockViemAccount); + + expect(signer).toBeInstanceOf(ViemTacoSigner); + expect(signer.provider).toBeUndefined(); + + // Actually call methods to ensure coverage + const address = await signer.getAddress(); + expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + }); + + it('should return ethers signer unchanged', () => { + const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); + const result = toEthersSigner(ethersSigner); + + expect(result).toBe(ethersSigner); + }); + + it('should handle non-viem signer correctly', () => { + const nonViemSigner = { + someProperty: 'value', + someMethod: () => {}, + provider: {}, // This will make it fail the isViemAccount check + } as any; + + const result = toEthersSigner(nonViemSigner); + + expect(result).toBe(nonViemSigner); + }); + + it('should create signer with provider adapter', async () => { + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + } as any; + + const mockViemClient = { getChainId: vi.fn().mockResolvedValue(80002), call: vi.fn().mockResolvedValue('0x'), + chain: { name: 'test', id: 80002 }, } as any; - const tacoProvider = toEthersProvider(mockViemPublicClient); - const signer = toEthersSigner(mockViemAccount, tacoProvider); + const result = toEthersSigner(mockViemAccount, mockViemClient); - expect(signer).toBeDefined(); - expect(signer.getAddress).toBeDefined(); - expect(signer.signMessage).toBeDefined(); - expect(signer.provider).toBe(tacoProvider); + expect(result).toBeInstanceOf(ViemTacoSigner); + expect(result.provider).toBeDefined(); + + // Actually call methods to test the provider adapter + const address = await result.getAddress(); + expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + + // Test the provider was properly adapted + const network = await result.provider.getNetwork(); + expect(network.chainId).toBe(80002); }); }); - describe('error handling', () => { - it('should handle missing viem gracefully', () => { - // This test verifies that the functions exist and are callable - expect(toEthersProvider).toBeDefined(); - expect(toEthersSigner).toBeDefined(); - expect(typeof toEthersProvider).toBe('function'); - expect(typeof toEthersSigner).toBe('function'); + describe('type guards', () => { + describe('isViemClient', () => { + it('should identify viem client by chain property', () => { + const viemClient = { + chain: { name: 'test', id: 1 }, + getChainId: vi.fn(), + }; + + expect(isViemClient(viemClient)).toBe(true); + }); + + it('should identify viem client by getChainId method', () => { + const viemClient = { + getChainId: () => Promise.resolve(1), + }; + + expect(isViemClient(viemClient)).toBe(true); + }); + + it('should reject ethers provider', () => { + const ethersProvider = new ethers.providers.JsonRpcProvider(); + + expect(isViemClient(ethersProvider)).toBe(false); + }); + + it('should reject object without viem properties', () => { + const notViemClient = { + someMethod: () => {}, + }; + + expect(isViemClient(notViemClient)).toBe(false); + }); + }); + + describe('isViemAccount', () => { + it('should identify viem account by address property', () => { + const viemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + }; + + expect(isViemAccount(viemAccount)).toBe(true); + }); + + it('should reject ethers signer', () => { + const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); + + expect(isViemAccount(ethersSigner)).toBe(false); + }); + + it('should reject object with provider property', () => { + const signerWithProvider = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + provider: {}, + }; + + expect(isViemAccount(signerWithProvider)).toBe(false); + }); }); }); }); diff --git a/packages/shared/test/viem-types.test.ts b/packages/shared/test/viem-types.test.ts new file mode 100644 index 000000000..b4c88acfa --- /dev/null +++ b/packages/shared/test/viem-types.test.ts @@ -0,0 +1,27 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { describe, expect, it } from 'vitest'; + +import type { Account, PublicClient } from '@nucypher/shared'; + +describe('viem types', () => { + it('should support viem-like client objects', () => { + const viemLikeClient: PublicClient = { + getChainId: () => Promise.resolve(80002), + call: (params: any) => Promise.resolve('0x1234'), + chain: { name: 'Polygon Amoy', id: 80002 }, + } as any; + + expect(viemLikeClient.getChainId).toBeDefined(); + expect(viemLikeClient.call).toBeDefined(); + }); + + it('should support viem-like account objects', () => { + const viemLikeAccount: Account = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: () => Promise.resolve('0xsignature'), + } as any; + + expect(viemLikeAccount.address).toBeDefined(); + expect(viemLikeAccount.signMessage).toBeDefined(); + }); +}); From 7d08d0e9111af5500b34287981333d256603ee14 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 10 Sep 2025 15:58:47 +0200 Subject: [PATCH 42/97] Update packages/taco/src/taco.ts Co-authored-by: James Campbell --- packages/taco/src/taco.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 9e110e3bf..af2160639 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -261,7 +261,7 @@ export async function decrypt( : await getPorterUris(domain); const porter = new PorterClient(porterUrisFull); - const providerAdapter = await toEthersProvider(providerLike); + const providerAdapter = toEthersProvider(providerLike); const ritualId = await DkgCoordinatorAgent.getRitualIdFromPublicKey( providerAdapter, From 1c2c7cae13b5b953fb8785d3de73a0f05bd2568d Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 10 Sep 2025 18:31:16 +0200 Subject: [PATCH 43/97] Remove un needed casting because of type inference introduced earlier --- packages/shared/src/viem/ethers-viem-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared/src/viem/ethers-viem-utils.ts b/packages/shared/src/viem/ethers-viem-utils.ts index 786f513ca..c09c0b1a8 100644 --- a/packages/shared/src/viem/ethers-viem-utils.ts +++ b/packages/shared/src/viem/ethers-viem-utils.ts @@ -123,6 +123,6 @@ export function toEthersSigner( providerAdapter, ) as unknown as ethers.Signer; } else { - return signerLike as unknown as ethers.Signer; + return signerLike; } } From a2adab1bd076cced561b344a6e393adfc1868376 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 11 Sep 2025 11:13:23 +0200 Subject: [PATCH 44/97] rename viem variables and add viem/index.ts --- packages/shared/src/index.ts | 4 +--- packages/shared/src/viem/ethers-viem-utils.ts | 12 +++++------ packages/shared/src/viem/index.ts | 3 +++ packages/shared/src/viem/types.ts | 2 +- packages/taco/README.md | 2 +- packages/taco/VIEM_SUPPORT.md | 6 +++--- .../viem-encrypt-decrypt.test.ts | 20 +++++++++---------- packages/taco/src/taco.ts | 12 +++++------ packages/taco/test/viem-taco.test.ts | 8 ++++---- 9 files changed, 35 insertions(+), 34 deletions(-) create mode 100644 packages/shared/src/viem/index.ts diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index d77b360af..776d730ed 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -4,9 +4,7 @@ export * from './schemas'; export * from './taco-interfaces'; export type * from './types'; export * from './utils'; -export * from './viem/ethers-viem-utils'; -export * from './viem/type-guards'; -export * from './viem/types'; +export * from './viem/'; export * from './web3'; // Re-exports diff --git a/packages/shared/src/viem/ethers-viem-utils.ts b/packages/shared/src/viem/ethers-viem-utils.ts index c09c0b1a8..fc9b4b1b7 100644 --- a/packages/shared/src/viem/ethers-viem-utils.ts +++ b/packages/shared/src/viem/ethers-viem-utils.ts @@ -12,21 +12,21 @@ import { type Account, type PublicClient } from './types'; * This class implements the TacoProvider interface directly using viem clients. */ export class ViemTacoProvider implements TacoProvider { - protected viemPublicClient: PublicClient; + protected publicClient: PublicClient; // Ethers.js compatibility property for contract validation readonly _isProvider = true; readonly _network: Promise; - constructor(viemPublicClient: PublicClient) { - this.viemPublicClient = viemPublicClient; + constructor(publicClient: PublicClient) { + this.publicClient = publicClient; // Initialize network for ethers compatibility this._network = this.getNetwork(); } async getNetwork(): Promise { - const chainId = await this.viemPublicClient.getChainId(); - const name = this.viemPublicClient.chain?.name || `chain-${chainId}`; + const chainId = await this.publicClient.getChainId(); + const name = this.publicClient.chain?.name || `chain-${chainId}`; return { name, chainId, @@ -36,7 +36,7 @@ export class ViemTacoProvider implements TacoProvider { async call( transaction: ethers.providers.TransactionRequest, ): Promise { - const result = await this.viemPublicClient.call({ + const result = await this.publicClient.call({ to: transaction.to as `0x${string}`, data: transaction.data as `0x${string}`, value: transaction.value diff --git a/packages/shared/src/viem/index.ts b/packages/shared/src/viem/index.ts new file mode 100644 index 000000000..32ed20217 --- /dev/null +++ b/packages/shared/src/viem/index.ts @@ -0,0 +1,3 @@ +export * from './ethers-viem-utils'; +export * from './type-guards'; +export * from './types'; diff --git a/packages/shared/src/viem/types.ts b/packages/shared/src/viem/types.ts index ccbe6dbf6..f72ffebf8 100644 --- a/packages/shared/src/viem/types.ts +++ b/packages/shared/src/viem/types.ts @@ -13,7 +13,7 @@ * import { type PublicClient } from '@nucypher/shared'; * * // Use viem clients directly with TACo adapters - * const tacoProvider = await toEthersProvider(viemPublicClient); + * const tacoProvider = await toEthersProvider(publicClient); * ``` */ diff --git a/packages/taco/README.md b/packages/taco/README.md index 57eba6183..6ce15be1b 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -128,7 +128,7 @@ const ethersEncrypted = await encrypt( // Using viem - automatically uses viem implementation const viemEncrypted = await encrypt( - viemPublicClient, // viem PublicClient + publicClient, // viem PublicClient domains.TESTNET, message, condition, diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index 478e40964..98d990f5b 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -44,7 +44,7 @@ import { privateKeyToAccount } from 'viem/accounts'; await initialize(); // Create viem public client -const viemPublicClient = createPublicClient({ +const publicClient = createPublicClient({ chain: polygonAmoy, transport: http(), }); @@ -64,7 +64,7 @@ const condition = new conditions.predefined.erc20.ERC20Balance({ // Same function names work with viem - TypeScript automatically detects the right overload const encryptedKit = await encrypt( - viemPublicClient, // viem PublicClient + publicClient, // viem PublicClient domains.DEVNET, // or 'lynx' 'Hello, secret!', condition, @@ -74,7 +74,7 @@ const encryptedKit = await encrypt( // Same decrypt function works with viem const decryptedMessage = await decrypt( - viemPublicClient, + publicClient, domains.DEVNET, encryptedKit, ); diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts index 89909dbc0..3ad0abcf8 100644 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -39,12 +39,12 @@ const consumerAccount = privateKeyToAccount( describe.skipIf(!process.env.RUNNING_IN_CI)( 'Viem Encrypt/Decrypt Integration Test', () => { - let viemPublicClient: PublicClient; + let publicClient: PublicClient; let viemWalletClient: WalletClient; beforeAll(async () => { // Create viem clients - viemPublicClient = createPublicClient({ + publicClient = createPublicClient({ chain: polygonAmoy, transport: http(RPC_PROVIDER_URL), }); @@ -59,7 +59,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( await initialize(); // Verify network connection - const chainId = await viemPublicClient.getChainId(); + const chainId = await publicClient.getChainId(); if (chainId !== CHAIN_ID) { throw new Error( `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${chainId}`, @@ -103,7 +103,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( // Encrypt message using viem const messageKit = await encrypt( - viemPublicClient, + publicClient, DOMAIN, message, compoundCondition, @@ -125,7 +125,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( ) ) { const authProvider = new EIP4361AuthProvider( - viemPublicClient, + publicClient, consumerAccount, ); @@ -137,7 +137,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( // Decrypt message using viem const decryptedBytes = await decrypt( - viemPublicClient, + publicClient, DOMAIN, messageKitFromBytes, conditionContext, @@ -166,7 +166,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( // Encrypt message with viem using simple condition const messageKit = await encrypt( - viemPublicClient, + publicClient, DOMAIN, message, positiveBalanceCondition, @@ -183,7 +183,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( // Add auth provider using consolidated EIP4361AuthProvider with viem support const authProvider = new EIP4361AuthProvider( - viemPublicClient, + publicClient, consumerAccount, ); @@ -194,7 +194,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( // Decrypt message using viem const decryptedBytes = await decrypt( - viemPublicClient, + publicClient, DOMAIN, messageKitFromBytes, conditionContext, @@ -223,7 +223,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( // Test encryption with viem account const messageKit = await encrypt( - viemPublicClient, + publicClient, DOMAIN, message, simpleCondition, diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index af2160639..655c449d7 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -34,12 +34,12 @@ import { retrieveAndDecrypt } from './tdec'; * instead of ethers providers and signers. * * @export - * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations + * @param {PublicClient} publicClient - Viem PublicClient for network operations * @param {Domain} domain - Represents the logical network for encryption (must match ritualId) * @param {Uint8Array | string} message - The message to be encrypted * @param {Condition} condition - Condition under which the message will be encrypted * @param {number} ritualId - The ID of the DKG Ritual to be used for encryption - * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization + * @param {Account} authAccount - The viem account that will be used to sign the encrypter authorization * * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit * @@ -77,12 +77,12 @@ export async function encrypt( * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown. */ export async function encrypt( - viemPublicClient: PublicClient, + publicClient: PublicClient, domain: Domain, message: Uint8Array | string, condition: Condition, ritualId: number, - viemAuthSigner: Account, + authAccount: Account, ): Promise; export async function encrypt( @@ -228,7 +228,7 @@ export function decrypt( * Decrypts an encrypted message. * * @export - * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations + * @param {PublicClient} publicClient - Viem PublicClient for network operations * @param {Domain} domain - Represents the logical network in which the decryption will be performed. * Must match the `ritualId`. * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted @@ -242,7 +242,7 @@ export function decrypt( * an error is thrown. */ export function decrypt( - viemPublicClient: PublicClient, + publicClient: PublicClient, domain: Domain, messageKit: ThresholdMessageKit, context?: ConditionContext, diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 413354ec6..a68a8bfe1 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -90,7 +90,7 @@ describe('viem TACo integration', () => { const mockViemProvider = { ...fakeProvider(aliceSecretKeyBytes), - viemPublicClient: mockViemPublicClient, // Add the required viem property + publicClient: mockViemPublicClient, // Add the required viem property // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; @@ -181,14 +181,14 @@ describe('viem TACo integration', () => { it('decrypts without optional parameters', async () => { // This test just verifies the function exists and has the right signature expect(decrypt).toBeDefined(); - expect(decrypt.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? + expect(decrypt.length).toBe(5); // publicClient, domain, messageKit, context?, porterUris? }); }, 10000); describe('function signatures', () => { it('should have correct function signatures', () => { - expect(encrypt.length).toBe(6); // viemPublicClient, domain, message, condition, ritualId, viemAccount - expect(decrypt.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? + expect(encrypt.length).toBe(6); // publicClient, domain, message, condition, ritualId, viemAccount + expect(decrypt.length).toBe(5); // publicClient, domain, messageKit, context?, porterUris? }); }); }); From f23ba9b3f7453ea93368f2940ee06858cfca09ea Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 12 Sep 2025 10:31:44 +0200 Subject: [PATCH 45/97] refactor: use TacoSigner instead of ethers.Signer and remove provider dependency from TacoSigner interface and implementations --- packages/shared/src/taco-interfaces.ts | 5 - packages/shared/src/types.ts | 4 +- packages/shared/src/viem/ethers-viem-utils.ts | 128 ------------------ packages/shared/src/viem/index.ts | 3 +- packages/shared/src/viem/taco-provider.ts | 68 ++++++++++ packages/shared/src/viem/taco-signer.ts | 48 +++++++ .../shared/test/ethers-viem-utils.test.ts | 81 ++--------- .../src/providers/eip4361/eip4361.ts | 7 +- packages/taco/src/taco.ts | 9 +- packages/taco/test/viem-taco.test.ts | 7 +- 10 files changed, 140 insertions(+), 220 deletions(-) delete mode 100644 packages/shared/src/viem/ethers-viem-utils.ts create mode 100644 packages/shared/src/viem/taco-provider.ts create mode 100644 packages/shared/src/viem/taco-signer.ts diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index 766b4e9dd..76f1d74a1 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -34,11 +34,6 @@ export interface TacoProvider { * would need to implement this interface. */ export interface TacoSigner { - /** - * The provider this signer is connected to (optional for signing-only operations) - */ - readonly provider?: TacoProvider | undefined; - /** * Get the address of this signer */ diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index cab4084f0..ad3e4adfd 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,5 +1,6 @@ import { ethers } from 'ethers'; +import { TacoSigner } from './taco-interfaces'; import { Account, PublicClient } from './viem/types'; export type ChecksumAddress = `0x${string}`; @@ -7,4 +8,5 @@ export type HexEncodedBytes = string; export type Base64EncodedBytes = string; export type ProviderLike = ethers.providers.Provider | PublicClient; -export type SignerLike = ethers.Signer | Account; + +export type SignerLike = TacoSigner | Account; diff --git a/packages/shared/src/viem/ethers-viem-utils.ts b/packages/shared/src/viem/ethers-viem-utils.ts deleted file mode 100644 index fc9b4b1b7..000000000 --- a/packages/shared/src/viem/ethers-viem-utils.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { ethers } from 'ethers'; - -import { type TacoProvider, type TacoSigner } from '../taco-interfaces'; -import { ProviderLike, SignerLike } from '../types'; - -import { isViemAccount, isViemClient } from './type-guards'; -import { type Account, type PublicClient } from './types'; - -/** - * Viem TACo Provider - * - * This class implements the TacoProvider interface directly using viem clients. - */ -export class ViemTacoProvider implements TacoProvider { - protected publicClient: PublicClient; - - // Ethers.js compatibility property for contract validation - readonly _isProvider = true; - readonly _network: Promise; - - constructor(publicClient: PublicClient) { - this.publicClient = publicClient; - // Initialize network for ethers compatibility - this._network = this.getNetwork(); - } - - async getNetwork(): Promise { - const chainId = await this.publicClient.getChainId(); - const name = this.publicClient.chain?.name || `chain-${chainId}`; - return { - name, - chainId, - }; - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - const result = await this.publicClient.call({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - }); - if (typeof result === 'object' && result && 'data' in result) { - return result.data as string; - } - return result as string; - } -} - -/** - * Viem TACo Signer - * - * This class implements the TacoSigner interface directly using viem accounts. - */ -export class ViemTacoSigner implements TacoSigner { - protected viemAccount: Account; - public provider?: ethers.providers.Provider | undefined; - - constructor(viemAccount: Account, providerLike?: ProviderLike | undefined) { - this.viemAccount = viemAccount; - if (providerLike) { - this.provider = toEthersProvider(providerLike); - } - } - - async getAddress(): Promise { - return this.viemAccount.address; - } - - async signMessage(message: string | Uint8Array): Promise { - if (!this.viemAccount.signMessage) { - throw new Error('Account does not support message signing'); - } - const messageToSign = - typeof message === 'string' ? message : ethers.utils.hexlify(message); - return await this.viemAccount.signMessage({ message: messageToSign }); - } - - connect(provider: ethers.providers.Provider): ethers.Signer { - this.provider = provider; - return this as unknown as ethers.Signer; - } -} - -/** - * Create a TACo provider from viem PublicClient - * - * This function creates a TacoProvider directly from a viem client. - */ -export function toEthersProvider( - providerLike: ProviderLike, -): ethers.providers.Provider { - if (isViemClient(providerLike)) { - return new ViemTacoProvider( - providerLike, - ) as unknown as ethers.providers.Provider; - } else { - return providerLike; - } -} - -/** - * Create a TACo signer from viem Account - * - * This function creates a TacoSigner directly from a viem account. - * - * @param viemAccount - Viem account for signing operations - * @param provider - Optional TACo provider. If not provided, some operations will require a provider - */ -export function toEthersSigner( - signerLike: SignerLike, - providerLike?: ProviderLike, -): ethers.Signer { - const providerAdapter = providerLike - ? toEthersProvider(providerLike) - : undefined; - if (isViemAccount(signerLike)) { - return new ViemTacoSigner( - signerLike, - providerAdapter, - ) as unknown as ethers.Signer; - } else { - return signerLike; - } -} diff --git a/packages/shared/src/viem/index.ts b/packages/shared/src/viem/index.ts index 32ed20217..bdce82d13 100644 --- a/packages/shared/src/viem/index.ts +++ b/packages/shared/src/viem/index.ts @@ -1,3 +1,4 @@ -export * from './ethers-viem-utils'; +export * from './taco-provider'; +export * from './taco-signer'; export * from './type-guards'; export * from './types'; diff --git a/packages/shared/src/viem/taco-provider.ts b/packages/shared/src/viem/taco-provider.ts new file mode 100644 index 000000000..a09a5a984 --- /dev/null +++ b/packages/shared/src/viem/taco-provider.ts @@ -0,0 +1,68 @@ +import { ethers } from 'ethers'; + +import { type TacoProvider } from '../taco-interfaces'; +import { ProviderLike } from '../types'; + +import { isViemClient } from './type-guards'; +import { type PublicClient } from './types'; + +/** + * Viem TACo Provider + * + * This class implements the TacoProvider interface directly using viem clients. + */ +export class ViemTacoProvider implements TacoProvider { + protected publicClient: PublicClient; + + // Ethers.js compatibility property for contract validation + readonly _isProvider = true; + readonly _network: Promise; + + constructor(publicClient: PublicClient) { + this.publicClient = publicClient; + // Initialize network for ethers compatibility + this._network = this.getNetwork(); + } + + async getNetwork(): Promise { + const chainId = await this.publicClient.getChainId(); + const name = this.publicClient.chain?.name || `chain-${chainId}`; + return { + name, + chainId, + }; + } + + async call( + transaction: ethers.providers.TransactionRequest, + ): Promise { + const result = await this.publicClient.call({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + }); + if (typeof result === 'object' && result && 'data' in result) { + return result.data as string; + } + return result as string; + } +} + +/** + * Create a TACo provider from viem PublicClient + * + * This function creates a TacoProvider directly from a viem client. + */ +export function toEthersProvider( + providerLike: ProviderLike, +): ethers.providers.Provider { + if (isViemClient(providerLike)) { + return new ViemTacoProvider( + providerLike, + ) as unknown as ethers.providers.Provider; + } else { + return providerLike; + } +} diff --git a/packages/shared/src/viem/taco-signer.ts b/packages/shared/src/viem/taco-signer.ts new file mode 100644 index 000000000..41c22d80b --- /dev/null +++ b/packages/shared/src/viem/taco-signer.ts @@ -0,0 +1,48 @@ +import { ethers } from 'ethers'; + +import { type TacoSigner } from '../taco-interfaces'; +import { SignerLike } from '../types'; + +import { isViemAccount } from './type-guards'; +import { type Account } from './types'; + +/** + * Viem TACo Signer + * + * This class implements the TacoSigner interface using viem accounts. + */ +export class ViemTacoSigner implements TacoSigner { + protected viemAccount: Account; + + constructor(viemAccount: Account) { + this.viemAccount = viemAccount; + } + + async getAddress(): Promise { + return this.viemAccount.address; + } + + async signMessage(message: string | Uint8Array): Promise { + if (!this.viemAccount.signMessage) { + throw new Error('Account does not support message signing'); + } + const messageToSign = + typeof message === 'string' ? message : ethers.utils.hexlify(message); + return await this.viemAccount.signMessage({ message: messageToSign }); + } +} + +/** + * Create a TACo signer from viem Account + * + * This function creates a TacoSigner directly from a viem account. + * + * @param signerLike - Viem account for signing operations or existing TacoSigner + */ +export function toTacoSigner(signerLike: SignerLike): TacoSigner { + if (isViemAccount(signerLike)) { + return new ViemTacoSigner(signerLike); + } else { + return signerLike; + } +} diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts index 0b223b940..e81b589d5 100644 --- a/packages/shared/test/ethers-viem-utils.test.ts +++ b/packages/shared/test/ethers-viem-utils.test.ts @@ -3,25 +3,21 @@ import { ethers } from 'ethers'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { - toEthersProvider, - toEthersSigner, - ViemTacoProvider, - ViemTacoSigner, -} from '../src/viem/ethers-viem-utils'; +import { toEthersProvider, ViemTacoProvider } from '../src/viem/taco-provider'; +import { toTacoSigner, ViemTacoSigner } from '../src/viem/taco-signer'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; describe('viem adapter utilities', () => { describe('function exports', () => { it('should export all adapter functions', () => { expect(toEthersProvider).toBeDefined(); - expect(toEthersSigner).toBeDefined(); + expect(toTacoSigner).toBeDefined(); expect(ViemTacoProvider).toBeDefined(); expect(ViemTacoSigner).toBeDefined(); expect(isViemClient).toBeDefined(); expect(isViemAccount).toBeDefined(); expect(typeof toEthersProvider).toBe('function'); - expect(typeof toEthersSigner).toBe('function'); + expect(typeof toTacoSigner).toBe('function'); expect(typeof isViemClient).toBe('function'); expect(typeof isViemAccount).toBe('function'); }); @@ -148,12 +144,6 @@ describe('viem adapter utilities', () => { await signer.signMessage('test'); }); - it('should create signer with provider', async () => { - const signer = new ViemTacoSigner(mockViemAccount, mockProvider); - - expect(signer.provider).toBe(mockProvider); - }); - it('should get address from viem account', async () => { const signer = new ViemTacoSigner(mockViemAccount); const address = await signer.getAddress(); @@ -194,14 +184,6 @@ describe('viem adapter utilities', () => { 'Account does not support message signing', ); }); - - it('should connect to provider', () => { - const signer = new ViemTacoSigner(mockViemAccount); - const connected = signer.connect(mockProvider); - - expect(signer.provider).toBe(mockProvider); - expect(connected).toBe(signer); - }); }); describe('toEthersProvider', () => { @@ -243,37 +225,16 @@ describe('viem adapter utilities', () => { }); }); - describe('toEthersSigner', () => { + describe('toTacoSigner', () => { it('should create signer from viem account', async () => { const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn().mockResolvedValue('0xsignature'), } as any; - const mockProvider = { - getNetwork: vi.fn().mockResolvedValue({ chainId: 80002, name: 'test' }), - } as any; - - const signer = toEthersSigner(mockViemAccount, mockProvider); + const signer = toTacoSigner(mockViemAccount); expect(signer).toBeInstanceOf(ViemTacoSigner); - expect(signer.provider).toBe(mockProvider); - - // Actually call methods to ensure coverage - const address = await signer.getAddress(); - expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); - }); - - it('should create signer without provider', async () => { - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsig'), - } as any; - - const signer = toEthersSigner(mockViemAccount); - - expect(signer).toBeInstanceOf(ViemTacoSigner); - expect(signer.provider).toBeUndefined(); // Actually call methods to ensure coverage const address = await signer.getAddress(); @@ -282,7 +243,7 @@ describe('viem adapter utilities', () => { it('should return ethers signer unchanged', () => { const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); - const result = toEthersSigner(ethersSigner); + const result = toTacoSigner(ethersSigner); expect(result).toBe(ethersSigner); }); @@ -294,36 +255,10 @@ describe('viem adapter utilities', () => { provider: {}, // This will make it fail the isViemAccount check } as any; - const result = toEthersSigner(nonViemSigner); + const result = toTacoSigner(nonViemSigner); expect(result).toBe(nonViemSigner); }); - - it('should create signer with provider adapter', async () => { - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - } as any; - - const mockViemClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x'), - chain: { name: 'test', id: 80002 }, - } as any; - - const result = toEthersSigner(mockViemAccount, mockViemClient); - - expect(result).toBeInstanceOf(ViemTacoSigner); - expect(result.provider).toBeDefined(); - - // Actually call methods to test the provider adapter - const address = await result.getAddress(); - expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); - - // Test the provider was properly adapted - const network = await result.provider.getNetwork(); - expect(network.chainId).toBe(80002); - }); }); describe('type guards', () => { diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index 57c93634c..ab8f307ed 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -3,8 +3,9 @@ import { ProviderLike, PublicClient, SignerLike, + TacoSigner, toEthersProvider, - toEthersSigner, + toTacoSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { SiweMessage } from 'siwe'; @@ -61,7 +62,7 @@ export class EIP4361AuthProvider implements AuthProvider { private readonly storage: LocalStorage; private readonly providerParams: EIP4361AuthProviderParams; private readonly provider: ethers.providers.Provider; - private readonly signer: ethers.Signer; + private readonly signer: TacoSigner; /** * Creates a new EIP4361AuthProvider instance with ethers.js objects. @@ -117,7 +118,7 @@ export class EIP4361AuthProvider implements AuthProvider { ) { this.storage = new LocalStorage(eip4361AuthSignatureSchema); this.provider = toEthersProvider(providerLike); - this.signer = toEthersSigner(signerLike, this.provider); + this.signer = toTacoSigner(signerLike); if (providerParams) { this.providerParams = providerParams; } else { diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 655c449d7..f308e74ef 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -14,9 +14,10 @@ import { ProviderLike, PublicClient, SignerLike, + TacoSigner, toBytes, toEthersProvider, - toEthersSigner, + toTacoSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { keccak256 } from 'ethers/lib/utils'; @@ -108,7 +109,7 @@ export async function encrypt( // Create TACo provider and signer adapters from viem objects const providerAdapter = toEthersProvider(providerLike); - const signerAdapter = toEthersSigner(signerLike, providerAdapter); + const signerAdapter = toTacoSigner(signerLike); const dkgRitual = await DkgClient.getActiveRitual( providerAdapter, @@ -143,7 +144,7 @@ export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, - authSigner: ethers.Signer, + authSigner: TacoSigner, ): Promise; /** @@ -178,7 +179,7 @@ export async function encryptWithPublicKey( message = toBytes(message); } - const signer = toEthersSigner(signerLike); + const signer = toTacoSigner(signerLike); const conditionExpr = new ConditionExpression(condition); diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index a68a8bfe1..61e67310d 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -98,7 +98,7 @@ describe('viem TACo integration', () => { .spyOn(await import('@nucypher/shared'), 'toEthersProvider') .mockReturnValue(mockViemProvider); const createTacoSignerSpy = vi - .spyOn(await import('@nucypher/shared'), 'toEthersSigner') + .spyOn(await import('@nucypher/shared'), 'toTacoSigner') .mockReturnValue(typedSigner); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); @@ -114,10 +114,7 @@ describe('viem TACo integration', () => { ); expect(createTacoProviderSpy).toHaveBeenCalledWith(mockViemPublicClient); - expect(createTacoSignerSpy).toHaveBeenCalledWith( - mockViemAccount, - mockViemProvider, - ); + expect(createTacoSignerSpy).toHaveBeenCalledWith(mockViemAccount); expect(getFinalizedRitualSpy).toHaveBeenCalled(); expect(messageKit).toBeDefined(); From 1bf799a914be0acb64b725cef074a967ee128df9 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 15 Sep 2025 12:30:52 +0200 Subject: [PATCH 46/97] refactor: replace TacoProvider with viem-to-ethers adapter --- packages/shared/src/taco-interfaces.ts | 39 +- packages/shared/src/types.ts | 12 + packages/shared/src/viem/ethers-adapter.ts | 172 ++++++++ packages/shared/src/viem/index.ts | 4 +- packages/shared/src/viem/signer-adapter.ts | 58 +++ packages/shared/src/viem/taco-provider.ts | 68 ---- packages/shared/src/viem/taco-signer.ts | 48 --- packages/shared/src/viem/type-guards.ts | 45 ++- packages/shared/src/viem/types.ts | 20 +- .../shared/test/ethers-viem-utils.test.ts | 122 +----- .../shared/test/viem-ethers-adapter.test.ts | 366 ++++++++++++++++++ packages/taco/src/taco.ts | 128 +++--- packages/taco/test/taco.test.ts | 4 + 13 files changed, 754 insertions(+), 332 deletions(-) create mode 100644 packages/shared/src/viem/ethers-adapter.ts create mode 100644 packages/shared/src/viem/signer-adapter.ts delete mode 100644 packages/shared/src/viem/taco-provider.ts delete mode 100644 packages/shared/src/viem/taco-signer.ts create mode 100644 packages/shared/test/viem-ethers-adapter.test.ts diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index 76f1d74a1..63afe188b 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -1,37 +1,14 @@ -import { ethers } from 'ethers'; - /** - * Basic TACo Provider interface + * Minimal TACo signer interface. * - * This interface defines the minimal provider functionality needed for TACo operations. - * It contains only the methods that TACo actually uses. - * This interface is implemented by ViemTacoProvider. And any future provider implementation - * would need to implement this interface. - */ -export interface TacoProvider { - /** - * Ethers.js compatibility property for contract validation - */ - readonly _isProvider: boolean; - - /** - * Get network information - */ - getNetwork(): Promise; - - /** - * Make a contract call - */ - call(transaction: ethers.providers.TransactionRequest): Promise; -} - -/** - * Basic TACo Signer interface + * This interface defines only the essential methods that TACo operations require: + * - `getAddress()`: Get the signer's address + * - `signMessage()`: Sign a message (string or bytes) * - * This interface defines the minimal signer functionality needed for TACo operations. - * It contains only the methods that TACo actually uses. - * This interface is implemented by ViemTacoSigner. And any future signer implementation - * would need to implement this interface. + * Implementations: + * - `ViemSignerAdapter`: Adapts viem Account objects to this interface + * - `ethers.Signer`: Directly compatible via structural typing (because it has the same method signatures) + * - Future signer adapters can implement this same minimal interface */ export interface TacoSigner { /** diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index ad3e4adfd..f1f62a791 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -9,4 +9,16 @@ export type Base64EncodedBytes = string; export type ProviderLike = ethers.providers.Provider | PublicClient; +/** + * Signer-like union for TACo operations. + * + * Accepts either: + * - TacoSigner (minimal TACo signer interface used internally), or + * - viem Account + * + * Note: ethers.Signer is also accepted via TypeScript structural typing + * because it implements the TacoSigner surface (getAddress, signMessage). + * Passing an ethers.Signer where a SignerLike is expected will work + * without additional adapters. + */ export type SignerLike = TacoSigner | Account; diff --git a/packages/shared/src/viem/ethers-adapter.ts b/packages/shared/src/viem/ethers-adapter.ts new file mode 100644 index 000000000..8bc687eae --- /dev/null +++ b/packages/shared/src/viem/ethers-adapter.ts @@ -0,0 +1,172 @@ +import { ethers } from 'ethers'; + +import { ProviderLike } from '../types'; + +import { isViemClient } from './type-guards'; +import type { Chain, PublicClient } from './types'; + +/** + * Viem to Ethers.js Adapter for Providers + * + * This adapter converts viem PublicClients to actual ethers.js Provider instances. + * Unlike the signer adapter which implements a minimal internal interface, + * this creates real ethers.providers.Provider objects that can be passed to + * third-party libraries expecting ethers.js providers. + * + * Key differences from signer adapter: + * - Creates ethers.providers.Provider instances + * - Currently handles only transport type: http + * - Required for external library compatibility + */ +export class ViemEthersProviderAdapter { + private readonly client: PublicClient; + + constructor(client: PublicClient) { + this.client = client; + } + + /** + * Convert viem client to ethers.js provider + * Returns an actual ethers.providers.Provider instance for use with external libraries + */ + toEthersProvider(): ethers.providers.Provider { + const { chain, transport }: PublicClient = this.client; + + if (!chain) { + throw new Error('Client must have a chain configured'); + } + + const networkish = this.createNetworkish(chain); + + // Note: We read minimal, commonly-present properties from transport. + // viem's transport internals are not a public API and may change. + // Also the we are taking only the first transport available. + // This adapter focuses on best-effort extraction of an RPC URL or EIP-1193 provider. + + // fallback transport (multiple RPC endpoints) + if (transport?.type === 'fallback') { + throw new Error('Fallback transport not supported'); + // TODO: implement with a code like the following: + // Note: The following takes only the first url of the transports urls. + // const items = transport.transports as ReturnType[]; + // const providers = items.map((t, i) => { + // const url = t?.value?.url; + // if (typeof url !== 'string' || url.length === 0) { + // throw new Error( + // `Fallback transport missing URL at index ${i} (chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + // ); + // } + // return new ethers.providers.JsonRpcProvider(url, networkish); + // }); + + // return new ethers.providers.FallbackProvider(providers); + } + + // websocket transport + if (transport?.type === 'webSocket') { + throw new Error('WebSocket transport not supported'); + // TODO: implement with a code like the following: + // const url = transport?.url as string | undefined; + // if (!url) { + // throw new Error( + // `Transport must have a URL (type=webSocket, chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + // ); + // } + // return new ethers.providers.WebSocketProvider(url, networkish); + } + + // custom (EIP-1193) transport + if (transport?.type === 'custom') { + const value = transport?.value; + const provider = value?.provider ?? value; + + // Check if it's an EIP-1193 provider (e.g., MetaMask, WalletConnect) + if (provider && typeof provider.request === 'function') { + return new ethers.providers.Web3Provider(provider, networkish); + } + + // If custom but no EIP-1193 provider found, try URL if present + + throw new Error('Custom non-EIP-1193 provider transport not supported'); + // TODO: implement with a code like the following: + // const url = value?.url ?? transport?.url; + // if (typeof url === 'string' && url.length > 0) { + // return new ethers.providers.JsonRpcProvider(url, networkish); + // } + // throw new Error( + // `Custom transport missing EIP-1193 provider or URL (chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + // ); + } + + // Default: assume HTTP-like with a URL + const url = transport?.url as string | undefined; + if (!url) { + throw new Error( + `Transport must have a URL (type=${transport?.type ?? 'unknown'}, chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + ); + } + return new ethers.providers.JsonRpcProvider(url, networkish); + } + + /** + * Get the current viem client + */ + getViemClient(): PublicClient { + return this.client; + } + + /** + * Create ethers network object from viem chain + */ + private createNetworkish(chain: Chain): ethers.providers.Networkish { + const networkish: { + chainId: number; + name: string; + ensAddress?: string; + } = { + chainId: chain.id, + name: chain.name, + }; + + // Add ENS registry address if available + if (chain.contracts?.ensRegistry?.address) { + networkish.ensAddress = chain.contracts.ensRegistry.address; + } + + return networkish; + } + + /** + * Static factory method to create adapter from viem client + */ + static from(client: PublicClient): ViemEthersProviderAdapter { + return new ViemEthersProviderAdapter(client); + } + + /** + * Static method to directly convert client to provider (convenience method) + */ + static clientToProvider(client: PublicClient): ethers.providers.Provider { + return new ViemEthersProviderAdapter(client).toEthersProvider(); + } +} + +/** + * Convert viem client or return existing ethers provider + * + * This is the main entry point for converting providers. + * It handles both viem clients (converting them to ethers providers) + * and existing ethers providers (returning them unchanged). + * + * @param providerLike - Either a viem PublicClient or an ethers.providers.Provider + * @returns An actual ethers.providers.Provider instance + */ +export function toEthersProvider( + providerLike: ProviderLike, +): ethers.providers.Provider { + if (isViemClient(providerLike)) { + return ViemEthersProviderAdapter.clientToProvider(providerLike); + } else { + return providerLike; + } +} diff --git a/packages/shared/src/viem/index.ts b/packages/shared/src/viem/index.ts index bdce82d13..bc650519f 100644 --- a/packages/shared/src/viem/index.ts +++ b/packages/shared/src/viem/index.ts @@ -1,4 +1,4 @@ -export * from './taco-provider'; -export * from './taco-signer'; +export * from './ethers-adapter'; +export * from './signer-adapter'; export * from './type-guards'; export * from './types'; diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts new file mode 100644 index 000000000..0ab9ffee1 --- /dev/null +++ b/packages/shared/src/viem/signer-adapter.ts @@ -0,0 +1,58 @@ +import { ethers } from 'ethers'; + +import { type TacoSigner } from '../taco-interfaces'; +import { SignerLike } from '../types'; + +import { isViemAccount } from './type-guards'; +import { type Account } from './types'; + +/** + * Viem Signer Adapter + * + * This adapter implements the minimal TacoSigner interface for internal library use. + * Unlike the provider adapter which creates actual ethers.js objects for external libraries, + * this only implements the specific methods that TACo internally requires. + * + * Key differences from provider adapter: + * - Implements minimal internal interface (not full ethers.Signer) + * - Only methods actually used by TACo: getAddress() and signMessage() + * - Lightweight wrapper for internal library operations + */ +export class ViemSignerAdapter implements TacoSigner { + protected viemAccount: Account; + + constructor(viemAccount: Account) { + this.viemAccount = viemAccount; + } + + async getAddress(): Promise { + return this.viemAccount.address; + } + + async signMessage(message: string | Uint8Array): Promise { + if (!this.viemAccount.signMessage) { + throw new Error('Account does not support message signing'); + } + const messageToSign = + typeof message === 'string' ? message : ethers.utils.hexlify(message); + return await this.viemAccount.signMessage({ message: messageToSign }); + } +} + +/** + * Convert viem account to TacoSigner or return existing signer + * + * This is the main entry point for creating signers for internal TACo use. + * Unlike toEthersProvider which creates actual ethers objects, + * this creates minimal adapters implementing only what TACo needs. + * + * @param signerLike - Either a viem Account or an existing TacoSigner + * @returns A TacoSigner interface implementation + */ +export function toTacoSigner(signerLike: SignerLike): TacoSigner { + if (isViemAccount(signerLike)) { + return new ViemSignerAdapter(signerLike); + } else { + return signerLike; + } +} diff --git a/packages/shared/src/viem/taco-provider.ts b/packages/shared/src/viem/taco-provider.ts deleted file mode 100644 index a09a5a984..000000000 --- a/packages/shared/src/viem/taco-provider.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { ethers } from 'ethers'; - -import { type TacoProvider } from '../taco-interfaces'; -import { ProviderLike } from '../types'; - -import { isViemClient } from './type-guards'; -import { type PublicClient } from './types'; - -/** - * Viem TACo Provider - * - * This class implements the TacoProvider interface directly using viem clients. - */ -export class ViemTacoProvider implements TacoProvider { - protected publicClient: PublicClient; - - // Ethers.js compatibility property for contract validation - readonly _isProvider = true; - readonly _network: Promise; - - constructor(publicClient: PublicClient) { - this.publicClient = publicClient; - // Initialize network for ethers compatibility - this._network = this.getNetwork(); - } - - async getNetwork(): Promise { - const chainId = await this.publicClient.getChainId(); - const name = this.publicClient.chain?.name || `chain-${chainId}`; - return { - name, - chainId, - }; - } - - async call( - transaction: ethers.providers.TransactionRequest, - ): Promise { - const result = await this.publicClient.call({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - }); - if (typeof result === 'object' && result && 'data' in result) { - return result.data as string; - } - return result as string; - } -} - -/** - * Create a TACo provider from viem PublicClient - * - * This function creates a TacoProvider directly from a viem client. - */ -export function toEthersProvider( - providerLike: ProviderLike, -): ethers.providers.Provider { - if (isViemClient(providerLike)) { - return new ViemTacoProvider( - providerLike, - ) as unknown as ethers.providers.Provider; - } else { - return providerLike; - } -} diff --git a/packages/shared/src/viem/taco-signer.ts b/packages/shared/src/viem/taco-signer.ts deleted file mode 100644 index 41c22d80b..000000000 --- a/packages/shared/src/viem/taco-signer.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { ethers } from 'ethers'; - -import { type TacoSigner } from '../taco-interfaces'; -import { SignerLike } from '../types'; - -import { isViemAccount } from './type-guards'; -import { type Account } from './types'; - -/** - * Viem TACo Signer - * - * This class implements the TacoSigner interface using viem accounts. - */ -export class ViemTacoSigner implements TacoSigner { - protected viemAccount: Account; - - constructor(viemAccount: Account) { - this.viemAccount = viemAccount; - } - - async getAddress(): Promise { - return this.viemAccount.address; - } - - async signMessage(message: string | Uint8Array): Promise { - if (!this.viemAccount.signMessage) { - throw new Error('Account does not support message signing'); - } - const messageToSign = - typeof message === 'string' ? message : ethers.utils.hexlify(message); - return await this.viemAccount.signMessage({ message: messageToSign }); - } -} - -/** - * Create a TACo signer from viem Account - * - * This function creates a TacoSigner directly from a viem account. - * - * @param signerLike - Viem account for signing operations or existing TacoSigner - */ -export function toTacoSigner(signerLike: SignerLike): TacoSigner { - if (isViemAccount(signerLike)) { - return new ViemTacoSigner(signerLike); - } else { - return signerLike; - } -} diff --git a/packages/shared/src/viem/type-guards.ts b/packages/shared/src/viem/type-guards.ts index c36d924d9..f39c0c493 100644 --- a/packages/shared/src/viem/type-guards.ts +++ b/packages/shared/src/viem/type-guards.ts @@ -5,34 +5,49 @@ import { ProviderLike, SignerLike } from '../types'; import { Account, PublicClient } from './types'; /** - * Type guard to determine if the client is a viem PublicClient + * Type guard to determine if the provider-like is a viem PublicClient + * + * Checks for: + * - Ensures it's not an ethers provider instance + * - Presence of viem-specific properties (chain) + * - Presence of viem-specific methods (getChainId) */ export function isViemClient( providerLike: ProviderLike, ): providerLike is PublicClient { - const hasViemProperties = 'chain' in providerLike; - const hasViemMethods = + // Early return if it's an ethers provider + if (providerLike instanceof ethers.providers.BaseProvider) { + return false; + } + + // Check for viem-specific properties and methods + const hasChainProperty = 'chain' in providerLike; + const hasGetChainId = typeof (providerLike as { getChainId: () => Promise }) .getChainId === 'function'; - const isNotEthersProvider = !( - providerLike instanceof ethers.providers.BaseProvider - ); - return isNotEthersProvider && (hasViemProperties || hasViemMethods); + return hasChainProperty || hasGetChainId; } /** * Type guard to determine if the signer is a viem Account + * + * Checks for: + * - Presence of viem Account properties (address as string) + * - Absence of ethers-specific properties (provider) + * - Ensures it's not an ethers Signer instance */ export function isViemAccount(signer: SignerLike): signer is Account { - // Check for viem Account properties - const hasViemAccountProperties = + if (signer instanceof ethers.Signer) { + return false; + } + + // Check for viem Account signature: + // - Has address property of type string + // - Does NOT have provider property (ethers.Signer characteristic) + return ( 'address' in signer && typeof (signer as { address: string }).address === 'string' && - !('provider' in signer); // ethers.Signer has provider property - - // Check if it's not an ethers.Signer - const isNotEthersSigner = !(signer instanceof ethers.Signer); - - return isNotEthersSigner && hasViemAccountProperties; + !('provider' in signer) // ethers.Signer has provider property + ); } diff --git a/packages/shared/src/viem/types.ts b/packages/shared/src/viem/types.ts index f72ffebf8..8fff2d1ed 100644 --- a/packages/shared/src/viem/types.ts +++ b/packages/shared/src/viem/types.ts @@ -24,6 +24,8 @@ // Dynamic imports resolve to 'unknown' when module is not available, no compile-time errors occur type _ViemPublicClient = import('viem').PublicClient; type _ViemAccount = import('viem').Account; +type _ViemChain = import('viem').Chain; +type _ViemTransport = import('viem').Transport; /** * Viem PublicClient type for read operations @@ -35,7 +37,23 @@ export type PublicClient = [unknown] extends [_ViemPublicClient] : _ViemPublicClient; /** * Viem Account type for signing operations - * @see https://viem.sh/docs/accounts/privateKey + * @see https://viem.sh/docs/accounts/local */ // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Account = [unknown] extends [_ViemAccount] ? any : _ViemAccount; + +/** + * Viem Chain type for network metadata + * @see https://viem.sh/docs/glossary/types#chain + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Chain = [unknown] extends [_ViemChain] ? any : _ViemChain; + +/** + * Viem Transport type for network metadata + * @see https://viem.sh/docs/glossary/types#transport + */ +export type Transport = [unknown] extends [_ViemTransport] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _ViemTransport; diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts index e81b589d5..48c9b6b49 100644 --- a/packages/shared/test/ethers-viem-utils.test.ts +++ b/packages/shared/test/ethers-viem-utils.test.ts @@ -3,8 +3,8 @@ import { ethers } from 'ethers'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { toEthersProvider, ViemTacoProvider } from '../src/viem/taco-provider'; -import { toTacoSigner, ViemTacoSigner } from '../src/viem/taco-signer'; +import { toEthersProvider } from '../src/viem/ethers-adapter'; +import { toTacoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; describe('viem adapter utilities', () => { @@ -12,8 +12,6 @@ describe('viem adapter utilities', () => { it('should export all adapter functions', () => { expect(toEthersProvider).toBeDefined(); expect(toTacoSigner).toBeDefined(); - expect(ViemTacoProvider).toBeDefined(); - expect(ViemTacoSigner).toBeDefined(); expect(isViemClient).toBeDefined(); expect(isViemAccount).toBeDefined(); expect(typeof toEthersProvider).toBe('function'); @@ -23,119 +21,45 @@ describe('viem adapter utilities', () => { }); }); - describe('ViemTacoProvider', () => { + describe('ethers provider interop', () => { let mockViemPublicClient: any; beforeEach(() => { mockViemPublicClient = { getChainId: vi.fn().mockResolvedValue(80002), - getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), call: vi.fn().mockResolvedValue('0x1234'), chain: { name: 'Polygon Amoy', id: 80002, + contracts: {}, + }, + transport: { + type: 'http', + url: 'https://rpc.ankr.com/polygon_amoy', }, }; }); - it('should create provider with ethers compatibility properties', async () => { - const provider = new ViemTacoProvider(mockViemPublicClient); - - expect(provider._isProvider).toBe(true); - expect(provider._network).toBeDefined(); - expect(provider.getNetwork).toBeDefined(); - expect(provider.call).toBeDefined(); - - // Actually call the methods to ensure coverage - await provider.getNetwork(); - await provider.call({ to: '0x123', data: '0xabc' }); - }); - - it('should get network information correctly', async () => { - const provider = new ViemTacoProvider(mockViemPublicClient); - const network = await provider.getNetwork(); - - expect(network.chainId).toBe(80002); - expect(network.name).toBe('Polygon Amoy'); - expect(mockViemPublicClient.getChainId).toHaveBeenCalled(); - }); - - it('should handle missing chain name', async () => { - const clientWithoutChain = { - ...mockViemPublicClient, - chain: undefined, - }; - - const provider = new ViemTacoProvider(clientWithoutChain); - const network = await provider.getNetwork(); - - expect(network.chainId).toBe(80002); - expect(network.name).toBe('chain-80002'); - }); - - it('should handle call with transaction data', async () => { - const provider = new ViemTacoProvider(mockViemPublicClient); - const transaction = { - to: '0x1234567890123456789012345678901234567890', - data: '0xabcdef', - value: ethers.BigNumber.from('1000'), - }; - - const result = await provider.call(transaction); - - expect(result).toBe('0x1234'); - expect(mockViemPublicClient.call).toHaveBeenCalledWith({ - to: transaction.to, - data: transaction.data, - value: BigInt('1000'), - }); - }); - - it('should handle call without value', async () => { - const provider = new ViemTacoProvider(mockViemPublicClient); - const transaction = { - to: '0x1234567890123456789012345678901234567890', - data: '0xabcdef', - }; - - await provider.call(transaction); - - expect(mockViemPublicClient.call).toHaveBeenCalledWith({ - to: transaction.to, - data: transaction.data, - value: undefined, - }); - }); - - it('should handle call result with data property', async () => { - mockViemPublicClient.call.mockResolvedValue({ data: '0x5678' }); - - const provider = new ViemTacoProvider(mockViemPublicClient); - const result = await provider.call({ to: '0x123', data: '0xabc' }); + it('should create an ethers provider from viem client (http)', () => { + const provider = toEthersProvider(mockViemPublicClient); - expect(result).toBe('0x5678'); + expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); }); }); - describe('ViemTacoSigner', () => { + describe('ViemSignerAdapter', () => { let mockViemAccount: any; - let mockProvider: any; beforeEach(() => { mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn().mockResolvedValue('0xsignature'), }; - - mockProvider = { - getNetwork: vi.fn().mockResolvedValue({ chainId: 80002, name: 'test' }), - }; }); it('should create signer without provider', async () => { - const signer = new ViemTacoSigner(mockViemAccount); + const signer = new ViemSignerAdapter(mockViemAccount); - expect(signer.provider).toBeUndefined(); expect(signer.getAddress).toBeDefined(); expect(signer.signMessage).toBeDefined(); @@ -145,14 +69,14 @@ describe('viem adapter utilities', () => { }); it('should get address from viem account', async () => { - const signer = new ViemTacoSigner(mockViemAccount); + const signer = new ViemSignerAdapter(mockViemAccount); const address = await signer.getAddress(); expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); }); it('should sign string message', async () => { - const signer = new ViemTacoSigner(mockViemAccount); + const signer = new ViemSignerAdapter(mockViemAccount); const signature = await signer.signMessage('test message'); expect(signature).toBe('0xsignature'); @@ -162,7 +86,7 @@ describe('viem adapter utilities', () => { }); it('should sign Uint8Array message', async () => { - const signer = new ViemTacoSigner(mockViemAccount); + const signer = new ViemSignerAdapter(mockViemAccount); const message = new Uint8Array([1, 2, 3, 4]); await signer.signMessage(message); @@ -178,7 +102,7 @@ describe('viem adapter utilities', () => { // no signMessage method }; - const signer = new ViemTacoSigner(accountWithoutSigning); + const signer = new ViemSignerAdapter(accountWithoutSigning); await expect(signer.signMessage('test')).rejects.toThrow( 'Account does not support message signing', @@ -192,18 +116,12 @@ describe('viem adapter utilities', () => { getChainId: vi.fn().mockResolvedValue(80002), call: vi.fn().mockResolvedValue('0x'), chain: { name: 'test', id: 80002 }, + transport: { type: 'http', url: 'https://rpc.ankr.com/polygon_amoy' }, } as any; const provider = toEthersProvider(mockViemPublicClient); - expect(provider).toBeInstanceOf(ViemTacoProvider); - expect(provider.getNetwork).toBeDefined(); - expect(provider.call).toBeDefined(); - - // Actually call the methods to ensure coverage - const network = await provider.getNetwork(); - expect(network.chainId).toBe(80002); - expect(network.name).toBe('test'); + expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); }); it('should return ethers provider unchanged', () => { @@ -234,7 +152,7 @@ describe('viem adapter utilities', () => { const signer = toTacoSigner(mockViemAccount); - expect(signer).toBeInstanceOf(ViemTacoSigner); + expect(signer).toBeInstanceOf(ViemSignerAdapter); // Actually call methods to ensure coverage const address = await signer.getAddress(); diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts new file mode 100644 index 000000000..782aec35a --- /dev/null +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -0,0 +1,366 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +// @ts-nocheck +import { ethers } from 'ethers'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import { + toEthersProvider, + ViemEthersProviderAdapter, +} from '../src/viem/ethers-adapter'; +import { toTacoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; +import { isViemAccount, isViemClient } from '../src/viem/type-guards'; + +describe('viem ethers adapter', () => { + describe('function exports', () => { + it('should export all adapter functions', () => { + expect(toEthersProvider).toBeDefined(); + expect(toTacoSigner).toBeDefined(); + expect(ViemEthersProviderAdapter).toBeDefined(); + expect(ViemSignerAdapter).toBeDefined(); + expect(isViemClient).toBeDefined(); + expect(isViemAccount).toBeDefined(); + expect(typeof toEthersProvider).toBe('function'); + expect(typeof toTacoSigner).toBe('function'); + expect(typeof isViemClient).toBe('function'); + expect(typeof isViemAccount).toBe('function'); + }); + }); + + describe('ViemEthersProviderAdapter', () => { + let mockViemPublicClient: any; + + beforeEach(() => { + mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + call: vi.fn().mockResolvedValue('0x'), + chain: { + id: 80002, + name: 'Polygon Amoy', + contracts: { + ensRegistry: { address: '0x123' }, + }, + }, + transport: { + type: 'http', + url: 'https://rpc.ankr.com/polygon_amoy', + }, + }; + }); + + it('should create adapter from viem client', () => { + const adapter = new ViemEthersProviderAdapter(mockViemPublicClient); + + expect(adapter).toBeInstanceOf(ViemEthersProviderAdapter); + expect(adapter.getViemClient()).toBe(mockViemPublicClient); + }); + + it('should create adapter using static factory method', () => { + const adapter = ViemEthersProviderAdapter.from(mockViemPublicClient); + + expect(adapter).toBeInstanceOf(ViemEthersProviderAdapter); + expect(adapter.getViemClient()).toBe(mockViemPublicClient); + }); + + it('should convert to ethers provider with single transport', () => { + const adapter = new ViemEthersProviderAdapter(mockViemPublicClient); + const provider = adapter.toEthersProvider(); + + expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); + }); + + it('should throw error when converting to ethers provider with fallback transport', () => { + const mockFallbackClient = { + ...mockViemPublicClient, + transport: { + type: 'fallback', + transports: [ + { value: { url: 'https://rpc1.example.com' } }, + { value: { url: 'https://rpc2.example.com' } }, + ], + }, + }; + + const adapter = new ViemEthersProviderAdapter(mockFallbackClient); + expect(() => adapter.toEthersProvider()).toThrow( + 'Fallback transport not supported', + ); + }); + + it('should throw error when converting to ethers provider with webSocket transport', () => { + const mockWebSocketClient = { + ...mockViemPublicClient, + transport: { + type: 'webSocket', + url: 'wss://example.com', + }, + }; + + const adapter = new ViemEthersProviderAdapter(mockWebSocketClient); + expect(() => adapter.toEthersProvider()).toThrow( + 'WebSocket transport not supported', + ); + }); + + it('should convert to ethers provider with custom transport (browser injected)', () => { + const mockEIP1193Provider = { + request: vi.fn(), + }; + + const mockCustomClient = { + ...mockViemPublicClient, + transport: { + type: 'custom', + value: { + provider: mockEIP1193Provider, + }, + }, + }; + + const adapter = new ViemEthersProviderAdapter(mockCustomClient); + const provider = adapter.toEthersProvider(); + expect(provider).toBeDefined(); + expect(provider.constructor.name).toBe('Web3Provider'); + }); + + it('should throw error for custom transport without provider or URL', () => { + const mockCustomClient = { + ...mockViemPublicClient, + transport: { + type: 'custom', + value: {}, + }, + }; + + const adapter = new ViemEthersProviderAdapter(mockCustomClient); + expect(() => adapter.toEthersProvider()).toThrow( + 'Custom non-EIP-1193 provider transport not supported', + ); + }); + + it('should handle missing chain', () => { + const clientWithoutChain = { + ...mockViemPublicClient, + chain: undefined, + }; + + const adapter = new ViemEthersProviderAdapter(clientWithoutChain); + + expect(() => adapter.toEthersProvider()).toThrow( + 'Client must have a chain configured', + ); + }); + + it('should handle missing transport URL', () => { + const clientWithoutUrl = { + ...mockViemPublicClient, + transport: { + type: 'http', + // missing url + }, + }; + + const adapter = new ViemEthersProviderAdapter(clientWithoutUrl); + + expect(() => adapter.toEthersProvider()).toThrow( + 'Transport must have a URL', + ); + }); + + it('should use static clientToProvider method', () => { + const provider = + ViemEthersProviderAdapter.clientToProvider(mockViemPublicClient); + + expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); + }); + }); + + describe('ViemSignerAdapter', () => { + let mockViemAccount: any; + + beforeEach(() => { + mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + }; + }); + + it('should create signer without provider', () => { + const signer = new ViemSignerAdapter(mockViemAccount); + + expect(signer).toBeInstanceOf(ViemSignerAdapter); + }); + + it('should get address from viem account', async () => { + const signer = new ViemSignerAdapter(mockViemAccount); + + const address = await signer.getAddress(); + + expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + }); + + it('should sign string message', async () => { + const signer = new ViemSignerAdapter(mockViemAccount); + + const signature = await signer.signMessage('test message'); + + expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ + message: 'test message', + }); + expect(signature).toBe('0xsignature'); + }); + + it('should sign Uint8Array message', async () => { + const signer = new ViemSignerAdapter(mockViemAccount); + const messageBytes = new Uint8Array([1, 2, 3]); + + const signature = await signer.signMessage(messageBytes); + + expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ + message: ethers.utils.hexlify(messageBytes), + }); + expect(signature).toBe('0xsignature'); + }); + + it('should throw error if account does not support signing', async () => { + const accountWithoutSigning = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + // no signMessage method + }; + + const signer = new ViemSignerAdapter(accountWithoutSigning); + + await expect(signer.signMessage('test')).rejects.toThrow( + 'Account does not support message signing', + ); + }); + }); + + describe('toEthersProvider', () => { + it('should create provider from viem client', async () => { + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + call: vi.fn().mockResolvedValue('0x'), + chain: { id: 80002, name: 'test' }, + transport: { type: 'http', url: 'https://test.com' }, + } as any; + + const provider = toEthersProvider(mockViemPublicClient); + + expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); + }); + + it('should return ethers provider unchanged', () => { + const ethersProvider = new ethers.providers.JsonRpcProvider( + 'https://test.com', + ); + const result = toEthersProvider(ethersProvider); + + expect(result).toBe(ethersProvider); + }); + + it('should handle non-viem provider correctly', () => { + const nonViemProvider = { + send: vi.fn(), + // This will make it fail the isViemClient check + } as any; + + const result = toEthersProvider(nonViemProvider); + + expect(result).toBe(nonViemProvider); + }); + }); + + describe('toTacoSigner', () => { + it('should create signer from viem account', async () => { + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + } as any; + + const signer = toTacoSigner(mockViemAccount); + + expect(signer).toBeInstanceOf(ViemSignerAdapter); + + const address = await signer.getAddress(); + expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + }); + + it('should return ethers signer unchanged', () => { + const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); + const result = toTacoSigner(ethersSigner); + + expect(result).toBe(ethersSigner); + }); + + it('should handle non-viem signer correctly', () => { + const nonViemSigner = { + getAddress: vi.fn(), + provider: {}, // This will make it fail the isViemAccount check + } as any; + + const result = toTacoSigner(nonViemSigner); + + expect(result).toBe(nonViemSigner); + }); + }); + + describe('type guards', () => { + describe('isViemClient', () => { + it('should identify viem client by chain property', () => { + const viemClient = { + chain: { id: 1, name: 'mainnet' }, + getChainId: vi.fn(), + }; + + expect(isViemClient(viemClient)).toBe(true); + }); + + it('should identify viem client by getChainId method', () => { + const viemClient = { + getChainId: vi.fn(), + }; + + expect(isViemClient(viemClient)).toBe(true); + }); + + it('should reject ethers provider', () => { + const ethersProvider = new ethers.providers.JsonRpcProvider(); + + expect(isViemClient(ethersProvider)).toBe(false); + }); + + it('should reject object without viem properties', () => { + const notViemClient = { + send: vi.fn(), + }; + + expect(isViemClient(notViemClient)).toBe(false); + }); + }); + + describe('isViemAccount', () => { + it('should identify viem account by address property', () => { + const viemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + }; + + expect(isViemAccount(viemAccount)).toBe(true); + }); + + it('should reject ethers signer', () => { + const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); + + expect(isViemAccount(ethersSigner)).toBe(false); + }); + + it('should reject object with provider property', () => { + const notViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + provider: {}, // This makes it look like an ethers signer + }; + + expect(isViemAccount(notViemAccount)).toBe(false); + }); + }); + }); +}); diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index f308e74ef..65d8d7bd4 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -29,23 +29,22 @@ import { DkgClient } from './dkg'; import { retrieveAndDecrypt } from './tdec'; /** - * Encrypts a message under given conditions using viem clients. + * Encrypts a message gated by TACo Conditions using an ethers.js provider and signer. * - * This is a viem-compatible overload of the encrypt function that accepts viem clients - * instead of ethers providers and signers. + * Use this overload when your application uses ethers.js. For viem-based apps, + * use the next overload that accepts a `PublicClient` and `Account`. * * @export - * @param {PublicClient} publicClient - Viem PublicClient for network operations - * @param {Domain} domain - Represents the logical network for encryption (must match ritualId) - * @param {Uint8Array | string} message - The message to be encrypted - * @param {Condition} condition - Condition under which the message will be encrypted - * @param {number} ritualId - The ID of the DKG Ritual to be used for encryption - * @param {Account} authAccount - The viem account that will be used to sign the encrypter authorization + * @param {ethers.providers.Provider} provider - Ethers provider for network operations. + * @param {Domain} domain - Logical TACo domain in which encryption will be performed (must match the ritual's domain). + * @param {Uint8Array | string} message - The message to be encrypted. + * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. + * @param {number} ritualId - ID of the DKG ritual whose public key will be used for encryption. + * @param {ethers.Signer} authSigner - Signer used to authorize the encryption (EIP‑191 message signature). * - * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit + * @returns {Promise} Encrypted message kit representing the ciphertext and access policy. * - * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown - + * @throws {Error} If the ritual cannot be retrieved or encryption fails. */ // Function overloads for encrypt export async function encrypt( @@ -58,24 +57,21 @@ export async function encrypt( ): Promise; /** - * Encrypts a message under given conditions using a public key from an active DKG ritual. + * Encrypts a message gated by TACo Conditions using a viem `PublicClient` and `Account`. + * + * Use this overload when your application uses viem. * * @export - * @param {ethers.providers.Provider} provider - Instance of ethers provider which is used to interact with - * your selected network. - * @param {Domain} domain - Represents the logical network in which the encryption will be performed. - * Must match the `ritualId`. - * @param {Uint8Array | string} message - The message to be encrypted. - * @param {Condition} condition - Condition under which the message will be encrypted. Those conditions must be - * satisfied in order to decrypt the message. - * @param {number} ritualId - The ID of the DKG Ritual to be used for encryption. The message will be encrypted - * under the public key of this ritual. - * @param {ethers.Signer} authSigner - The signer that will be used to sign the encrypter authorization. + * @param {PublicClient} publicClient - Viem `PublicClient` for network operations. + * @param {Domain} domain - Logical TACo domain in which encryption will be performed (must match the ritual's domain). + * @param {Uint8Array | string} message - The message to be encrypted. + * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. + * @param {number} ritualId - ID of the DKG ritual whose public key will be used for encryption. + * @param {Account} authAccount - Viem account used to authorize the encryption (message signature). * - * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit. - * It represents the encrypted message. + * @returns {Promise} Encrypted message kit representing the ciphertext and access policy. * - * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown. + * @throws {Error} If the ritual cannot be retrieved or encryption fails. */ export async function encrypt( publicClient: PublicClient, @@ -109,7 +105,6 @@ export async function encrypt( // Create TACo provider and signer adapters from viem objects const providerAdapter = toEthersProvider(providerLike); - const signerAdapter = toTacoSigner(signerLike); const dkgRitual = await DkgClient.getActiveRitual( providerAdapter, @@ -121,22 +116,20 @@ export async function encrypt( message, condition, dkgRitual.dkgPublicKey, - signerAdapter, + signerLike, ); } /** - * Encrypts a message with the given DKG public key under a specified condition. + * Encrypts a message with the given DKG public key gated by TACo Conditions. * * @export - * @param {Uint8Array | string} message - The message to be encrypted. - * @param {Condition} condition - Condition under which the message will be encrypted. Those conditions must be - * satisfied in order to decrypt the message. + * @param {Uint8Array | string} message - The message to be encrypted. + * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption - * @param {ethers.Signer} authSigner - The signer that will be used to sign the encrypter authorization. + * @param {SignerLike} authSigner - Signer used to authorize the encryption. Accepts an ethers `Signer` or a viem `Account`. * - * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit. - * It represents the encrypted message. + * @returns {Promise} Encrypted message kit representing the ciphertext and access policy. * * @throws {Error} If the encryption process throws an error, an error is thrown. */ @@ -148,17 +141,15 @@ export async function encryptWithPublicKey( ): Promise; /** - * Encrypts a message with the given DKG public key under a specified condition. + * Encrypts a message with the given DKG public key gated by TACo Conditions. * * @export - * @param {Uint8Array | string} message - The message to be encrypted. - * @param {Condition} condition - Condition under which the message will be encrypted. Those conditions must be - * satisfied in order to decrypt the message. + * @param {Uint8Array | string} message - The message to be encrypted. + * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption - * @param {Account} account - The viem account that will be used to sign the encrypter authorization. + * @param {Account} authAccount - Viem account used to authorize the encryption. * - * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit. - * It represents the encrypted message. + * @returns {Promise} Encrypted message kit representing the ciphertext and access policy. * * @throws {Error} If the encryption process throws an error, an error is thrown. */ @@ -169,6 +160,20 @@ export async function encryptWithPublicKey( authAccount: Account, ): Promise; +/** + * Encrypts a message with the given DKG public key gated by TACo Conditions. + * + * Union-type overload that accepts either a TacoSigner (minimal TACo signer interface) or a viem Account. + * This aligns with the implementation signature and enables callers that pass a + * SignerLike union to resolve against an overload. + */ +export async function encryptWithPublicKey( + message: Uint8Array | string, + condition: Condition, + dkgPublicKey: DkgPublicKey, + signerLike: SignerLike, +): Promise; + export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, @@ -200,22 +205,18 @@ export async function encryptWithPublicKey( } /** - * Decrypts an encrypted message. + * Decrypts an encrypted message (ethers overload). * * @export - * @param {ethers.providers.Provider} provider - Instance of ethers provider which is used to interact with - * your selected network. - * @param {Domain} domain - Represents the logical network in which the decryption will be performed. - * Must match the `ritualId`. - * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted - * @param {ConditionContext} context - Optional context data used for decryption time values for the condition(s) within the `messageKit`. - * @param {string[]} [porterUris] - Optional URI(s) for the Porter service. If not provided, a value will be obtained - * from the Domain + * @param {ethers.providers.Provider} provider - Ethers provider for network operations. + * @param {Domain} domain - Logical TACo domain used for decryption. + * @param {ThresholdMessageKit} messageKit - The kit containing the ciphertext and access policy. + * @param {ConditionContext} [context] - Optional context data (e.g., time values) used by conditions in the `messageKit`. + * @param {string[]} [porterUris] - Optional Porter service URI(s). If omitted, they are resolved via `getPorterUris(domain)`. * - * @returns {Promise} Returns Promise that resolves with a decrypted message + * @returns {Promise} The decrypted message bytes. * - * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error, - * an error is thrown. + * @throws {Error} If the ritual cannot be resolved, Porter retrieval fails, or decryption fails. */ export function decrypt( provider: ethers.providers.Provider, @@ -226,21 +227,18 @@ export function decrypt( ): Promise; /** - * Decrypts an encrypted message. + * Decrypts an encrypted message (viem overload). * * @export - * @param {PublicClient} publicClient - Viem PublicClient for network operations - * @param {Domain} domain - Represents the logical network in which the decryption will be performed. - * Must match the `ritualId`. - * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted - * @param {ConditionContext} context - Optional context data used for decryption time values for the condition(s) within the `messageKit`. - * @param {string[]} [porterUris] - Optional URI(s) for the Porter service. If not provided, a value will be obtained - * from the Domain + * @param {PublicClient} publicClient - Viem `PublicClient` for network operations. + * @param {Domain} domain - Logical TACo domain used for decryption. + * @param {ThresholdMessageKit} messageKit - The kit containing the ciphertext and access policy. + * @param {ConditionContext} [context] - Optional context data (e.g., time values) used by conditions in the `messageKit`. + * @param {string[]} [porterUris] - Optional Porter service URI(s). If omitted, they are resolved via `getPorterUris(domain)`. * - * @returns {Promise} Returns Promise that resolves with a decrypted message + * @returns {Promise} The decrypted message bytes. * - * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error, - * an error is thrown. + * @throws {Error} If the ritual cannot be resolved, Porter retrieval fails, or decryption fails. */ export function decrypt( publicClient: PublicClient, diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index fb8f1f4e2..57ce05f19 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -167,6 +167,10 @@ describe('taco', () => { // Mock viem client (chain property makes isViemClient return true) const mockViemClient = { chain: { id: 80002, name: 'polygon-amoy' }, + transport: { + type: 'http', + url: 'https://rpc.ankr.com/polygon_amoy', + }, getChainId: () => Promise.resolve(80002), }; From 087c0d346ef66eeb260d516127f3eb184027f98d Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 15 Sep 2025 13:21:29 +0200 Subject: [PATCH 47/97] remove a function overload and add type casting for signerLike parameter --- packages/taco/src/taco.ts | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 65d8d7bd4..2b4217fcd 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -116,7 +116,10 @@ export async function encrypt( message, condition, dkgRitual.dkgPublicKey, - signerLike, + // Casting is needed because with the function definition of encryptWithPublicKey, + // this param can be either a TacoSigner or a viem Account. But not a type that is the union of both. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + signerLike as any, ); } @@ -160,20 +163,6 @@ export async function encryptWithPublicKey( authAccount: Account, ): Promise; -/** - * Encrypts a message with the given DKG public key gated by TACo Conditions. - * - * Union-type overload that accepts either a TacoSigner (minimal TACo signer interface) or a viem Account. - * This aligns with the implementation signature and enables callers that pass a - * SignerLike union to resolve against an overload. - */ -export async function encryptWithPublicKey( - message: Uint8Array | string, - condition: Condition, - dkgPublicKey: DkgPublicKey, - signerLike: SignerLike, -): Promise; - export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, From 3120ccd3155fb99f903503346f8c88bf5c941f15 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Mon, 15 Sep 2025 19:03:30 -0400 Subject: [PATCH 48/97] Rename (to)TacoSigner to (to)TACoSigner to rename consistent with our TACo capitalization. --- packages/shared/src/taco-interfaces.ts | 2 +- packages/shared/src/types.ts | 8 ++++---- packages/shared/src/viem/signer-adapter.ts | 14 +++++++------- packages/shared/test/ethers-viem-utils.test.ts | 14 +++++++------- packages/shared/test/viem-ethers-adapter.test.ts | 14 +++++++------- .../taco-auth/src/providers/eip4361/eip4361.ts | 8 ++++---- packages/taco/src/taco.ts | 10 +++++----- packages/taco/test/viem-taco.test.ts | 2 +- 8 files changed, 36 insertions(+), 36 deletions(-) diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-interfaces.ts index 63afe188b..ab21b7e88 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-interfaces.ts @@ -10,7 +10,7 @@ * - `ethers.Signer`: Directly compatible via structural typing (because it has the same method signatures) * - Future signer adapters can implement this same minimal interface */ -export interface TacoSigner { +export interface TACoSigner { /** * Get the address of this signer */ diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index f1f62a791..bf585654a 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; -import { TacoSigner } from './taco-interfaces'; +import { TACoSigner } from './taco-interfaces'; import { Account, PublicClient } from './viem/types'; export type ChecksumAddress = `0x${string}`; @@ -13,12 +13,12 @@ export type ProviderLike = ethers.providers.Provider | PublicClient; * Signer-like union for TACo operations. * * Accepts either: - * - TacoSigner (minimal TACo signer interface used internally), or + * - TACoSigner (minimal TACo signer interface used internally), or * - viem Account * * Note: ethers.Signer is also accepted via TypeScript structural typing - * because it implements the TacoSigner surface (getAddress, signMessage). + * because it implements the TACoSigner surface (getAddress, signMessage). * Passing an ethers.Signer where a SignerLike is expected will work * without additional adapters. */ -export type SignerLike = TacoSigner | Account; +export type SignerLike = TACoSigner | Account; diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index 0ab9ffee1..89cc1d14c 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; -import { type TacoSigner } from '../taco-interfaces'; +import { type TACoSigner } from '../taco-interfaces'; import { SignerLike } from '../types'; import { isViemAccount } from './type-guards'; @@ -9,7 +9,7 @@ import { type Account } from './types'; /** * Viem Signer Adapter * - * This adapter implements the minimal TacoSigner interface for internal library use. + * This adapter implements the minimal TACoSigner interface for internal library use. * Unlike the provider adapter which creates actual ethers.js objects for external libraries, * this only implements the specific methods that TACo internally requires. * @@ -18,7 +18,7 @@ import { type Account } from './types'; * - Only methods actually used by TACo: getAddress() and signMessage() * - Lightweight wrapper for internal library operations */ -export class ViemSignerAdapter implements TacoSigner { +export class ViemSignerAdapter implements TACoSigner { protected viemAccount: Account; constructor(viemAccount: Account) { @@ -40,16 +40,16 @@ export class ViemSignerAdapter implements TacoSigner { } /** - * Convert viem account to TacoSigner or return existing signer + * Convert viem account to TACoSigner or return existing signer * * This is the main entry point for creating signers for internal TACo use. * Unlike toEthersProvider which creates actual ethers objects, * this creates minimal adapters implementing only what TACo needs. * - * @param signerLike - Either a viem Account or an existing TacoSigner - * @returns A TacoSigner interface implementation + * @param signerLike - Either a viem Account or an existing TACoSigner + * @returns A TACoSigner interface implementation */ -export function toTacoSigner(signerLike: SignerLike): TacoSigner { +export function toTACoSigner(signerLike: SignerLike): TACoSigner { if (isViemAccount(signerLike)) { return new ViemSignerAdapter(signerLike); } else { diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts index 48c9b6b49..892487732 100644 --- a/packages/shared/test/ethers-viem-utils.test.ts +++ b/packages/shared/test/ethers-viem-utils.test.ts @@ -4,18 +4,18 @@ import { ethers } from 'ethers'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { toEthersProvider } from '../src/viem/ethers-adapter'; -import { toTacoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; +import { toTACoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; describe('viem adapter utilities', () => { describe('function exports', () => { it('should export all adapter functions', () => { expect(toEthersProvider).toBeDefined(); - expect(toTacoSigner).toBeDefined(); + expect(toTACoSigner).toBeDefined(); expect(isViemClient).toBeDefined(); expect(isViemAccount).toBeDefined(); expect(typeof toEthersProvider).toBe('function'); - expect(typeof toTacoSigner).toBe('function'); + expect(typeof toTACoSigner).toBe('function'); expect(typeof isViemClient).toBe('function'); expect(typeof isViemAccount).toBe('function'); }); @@ -143,14 +143,14 @@ describe('viem adapter utilities', () => { }); }); - describe('toTacoSigner', () => { + describe('toTACoSigner', () => { it('should create signer from viem account', async () => { const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn().mockResolvedValue('0xsignature'), } as any; - const signer = toTacoSigner(mockViemAccount); + const signer = toTACoSigner(mockViemAccount); expect(signer).toBeInstanceOf(ViemSignerAdapter); @@ -161,7 +161,7 @@ describe('viem adapter utilities', () => { it('should return ethers signer unchanged', () => { const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); - const result = toTacoSigner(ethersSigner); + const result = toTACoSigner(ethersSigner); expect(result).toBe(ethersSigner); }); @@ -173,7 +173,7 @@ describe('viem adapter utilities', () => { provider: {}, // This will make it fail the isViemAccount check } as any; - const result = toTacoSigner(nonViemSigner); + const result = toTACoSigner(nonViemSigner); expect(result).toBe(nonViemSigner); }); diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 782aec35a..5a69bcd12 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -7,20 +7,20 @@ import { toEthersProvider, ViemEthersProviderAdapter, } from '../src/viem/ethers-adapter'; -import { toTacoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; +import { toTACoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; describe('viem ethers adapter', () => { describe('function exports', () => { it('should export all adapter functions', () => { expect(toEthersProvider).toBeDefined(); - expect(toTacoSigner).toBeDefined(); + expect(toTACoSigner).toBeDefined(); expect(ViemEthersProviderAdapter).toBeDefined(); expect(ViemSignerAdapter).toBeDefined(); expect(isViemClient).toBeDefined(); expect(isViemAccount).toBeDefined(); expect(typeof toEthersProvider).toBe('function'); - expect(typeof toTacoSigner).toBe('function'); + expect(typeof toTACoSigner).toBe('function'); expect(typeof isViemClient).toBe('function'); expect(typeof isViemAccount).toBe('function'); }); @@ -270,14 +270,14 @@ describe('viem ethers adapter', () => { }); }); - describe('toTacoSigner', () => { + describe('toTACoSigner', () => { it('should create signer from viem account', async () => { const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn().mockResolvedValue('0xsignature'), } as any; - const signer = toTacoSigner(mockViemAccount); + const signer = toTACoSigner(mockViemAccount); expect(signer).toBeInstanceOf(ViemSignerAdapter); @@ -287,7 +287,7 @@ describe('viem ethers adapter', () => { it('should return ethers signer unchanged', () => { const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); - const result = toTacoSigner(ethersSigner); + const result = toTACoSigner(ethersSigner); expect(result).toBe(ethersSigner); }); @@ -298,7 +298,7 @@ describe('viem ethers adapter', () => { provider: {}, // This will make it fail the isViemAccount check } as any; - const result = toTacoSigner(nonViemSigner); + const result = toTACoSigner(nonViemSigner); expect(result).toBe(nonViemSigner); }); diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index ab8f307ed..d7b0f9d34 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -3,9 +3,9 @@ import { ProviderLike, PublicClient, SignerLike, - TacoSigner, + TACoSigner, toEthersProvider, - toTacoSigner, + toTACoSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { SiweMessage } from 'siwe'; @@ -62,7 +62,7 @@ export class EIP4361AuthProvider implements AuthProvider { private readonly storage: LocalStorage; private readonly providerParams: EIP4361AuthProviderParams; private readonly provider: ethers.providers.Provider; - private readonly signer: TacoSigner; + private readonly signer: TACoSigner; /** * Creates a new EIP4361AuthProvider instance with ethers.js objects. @@ -118,7 +118,7 @@ export class EIP4361AuthProvider implements AuthProvider { ) { this.storage = new LocalStorage(eip4361AuthSignatureSchema); this.provider = toEthersProvider(providerLike); - this.signer = toTacoSigner(signerLike); + this.signer = toTACoSigner(signerLike); if (providerParams) { this.providerParams = providerParams; } else { diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 2b4217fcd..4862e434b 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -14,10 +14,10 @@ import { ProviderLike, PublicClient, SignerLike, - TacoSigner, + TACoSigner, toBytes, toEthersProvider, - toTacoSigner, + toTACoSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { keccak256 } from 'ethers/lib/utils'; @@ -117,7 +117,7 @@ export async function encrypt( condition, dkgRitual.dkgPublicKey, // Casting is needed because with the function definition of encryptWithPublicKey, - // this param can be either a TacoSigner or a viem Account. But not a type that is the union of both. + // this param can be either a TACoSigner or a viem Account. But not a type that is the union of both. // eslint-disable-next-line @typescript-eslint/no-explicit-any signerLike as any, ); @@ -140,7 +140,7 @@ export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, - authSigner: TacoSigner, + authSigner: TACoSigner, ): Promise; /** @@ -173,7 +173,7 @@ export async function encryptWithPublicKey( message = toBytes(message); } - const signer = toTacoSigner(signerLike); + const signer = toTACoSigner(signerLike); const conditionExpr = new ConditionExpression(condition); diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 61e67310d..32422f48f 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -98,7 +98,7 @@ describe('viem TACo integration', () => { .spyOn(await import('@nucypher/shared'), 'toEthersProvider') .mockReturnValue(mockViemProvider); const createTacoSignerSpy = vi - .spyOn(await import('@nucypher/shared'), 'toTacoSigner') + .spyOn(await import('@nucypher/shared'), 'toTACoSigner') .mockReturnValue(typedSigner); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); From 1d225ba1c1f02a6b06076ff87a39d2cdb969f21d Mon Sep 17 00:00:00 2001 From: derekpierre Date: Mon, 15 Sep 2025 19:41:06 -0400 Subject: [PATCH 49/97] Fix external API-typing. `TACoSigner` is an internal API and not external. Update API documentation. --- packages/shared/src/types.ts | 12 ++-------- packages/taco/src/taco.ts | 46 +++++++++++++----------------------- 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index bf585654a..e247eae7d 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,6 +1,5 @@ import { ethers } from 'ethers'; -import { TACoSigner } from './taco-interfaces'; import { Account, PublicClient } from './viem/types'; export type ChecksumAddress = `0x${string}`; @@ -12,13 +11,6 @@ export type ProviderLike = ethers.providers.Provider | PublicClient; /** * Signer-like union for TACo operations. * - * Accepts either: - * - TACoSigner (minimal TACo signer interface used internally), or - * - viem Account - * - * Note: ethers.Signer is also accepted via TypeScript structural typing - * because it implements the TACoSigner surface (getAddress, signMessage). - * Passing an ethers.Signer where a SignerLike is expected will work - * without additional adapters. + * Accepts either ethers Signer or viem Account */ -export type SignerLike = TACoSigner | Account; +export type SignerLike = ethers.Signer | Account; diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 4862e434b..2c29b53ee 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -14,7 +14,6 @@ import { ProviderLike, PublicClient, SignerLike, - TACoSigner, toBytes, toEthersProvider, toTACoSigner, @@ -29,10 +28,9 @@ import { DkgClient } from './dkg'; import { retrieveAndDecrypt } from './tdec'; /** - * Encrypts a message gated by TACo Conditions using an ethers.js provider and signer. + * Encrypts a message gated by TACo Conditions using an ethers.js `Provider` and `Signer`. * - * Use this overload when your application uses ethers.js. For viem-based apps, - * use the next overload that accepts a `PublicClient` and `Account`. + * Use this overload when your application uses ethers.js. * * @export * @param {ethers.providers.Provider} provider - Ethers provider for network operations. @@ -40,9 +38,9 @@ import { retrieveAndDecrypt } from './tdec'; * @param {Uint8Array | string} message - The message to be encrypted. * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {number} ritualId - ID of the DKG ritual whose public key will be used for encryption. - * @param {ethers.Signer} authSigner - Signer used to authorize the encryption (EIP‑191 message signature). + * @param {ethers.Signer} authSigner - Signer used to identify encryptor and verify authorization. * - * @returns {Promise} Encrypted message kit representing the ciphertext and access policy. + * @returns {Promise} Encrypted message kit representing the ciphertext and associated metadata. * * @throws {Error} If the ritual cannot be retrieved or encryption fails. */ @@ -67,9 +65,10 @@ export async function encrypt( * @param {Uint8Array | string} message - The message to be encrypted. * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {number} ritualId - ID of the DKG ritual whose public key will be used for encryption. - * @param {Account} authAccount - Viem account used to authorize the encryption (message signature). + * @param {Account} authAccount - Viem account used to identify encryptor and verify authorization. + * + * @returns {Promise} Encrypted message kit representing the ciphertext and associated metadata. * - * @returns {Promise} Encrypted message kit representing the ciphertext and access policy. * * @throws {Error} If the ritual cannot be retrieved or encryption fails. */ @@ -90,19 +89,6 @@ export async function encrypt( ritualId: number, signerLike: SignerLike, ): Promise { - // TODO(#264): Enable ritual initialization - // if (ritualId === undefined) { - // ritualId = await DkgClient.initializeRitual( - // provider, - // this.cohort.ursulaAddresses, - // true - // ); - // } - // if (ritualId === undefined) { - // // Given that we just initialized the ritual, this should never happen - // throw new Error('Ritual ID is undefined'); - // } - // Create TACo provider and signer adapters from viem objects const providerAdapter = toEthersProvider(providerLike); @@ -117,7 +103,7 @@ export async function encrypt( condition, dkgRitual.dkgPublicKey, // Casting is needed because with the function definition of encryptWithPublicKey, - // this param can be either a TACoSigner or a viem Account. But not a type that is the union of both. + // this param can be either a Signer or a viem Account. But not a type that is the union of both. // eslint-disable-next-line @typescript-eslint/no-explicit-any signerLike as any, ); @@ -130,9 +116,9 @@ export async function encrypt( * @param {Uint8Array | string} message - The message to be encrypted. * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption - * @param {SignerLike} authSigner - Signer used to authorize the encryption. Accepts an ethers `Signer` or a viem `Account`. + * @param {Signer} authSigner - Signer used to identify encryptor and verify authorization. Accepts an ethers `Signer` or a viem `Account`. * - * @returns {Promise} Encrypted message kit representing the ciphertext and access policy. + * @returns {Promise} Encrypted message kit representing the ciphertext and associated metadata. * * @throws {Error} If the encryption process throws an error, an error is thrown. */ @@ -140,7 +126,7 @@ export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, - authSigner: TACoSigner, + authSigner: ethers.Signer, ): Promise; /** @@ -150,9 +136,9 @@ export async function encryptWithPublicKey( * @param {Uint8Array | string} message - The message to be encrypted. * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption - * @param {Account} authAccount - Viem account used to authorize the encryption. + * @param {Account} authAccount - Viem account used to identify encryptor and verify authorization. * - * @returns {Promise} Encrypted message kit representing the ciphertext and access policy. + * @returns {Promise} Encrypted message kit representing the ciphertext and associated metadata. * * @throws {Error} If the encryption process throws an error, an error is thrown. */ @@ -199,8 +185,8 @@ export async function encryptWithPublicKey( * @export * @param {ethers.providers.Provider} provider - Ethers provider for network operations. * @param {Domain} domain - Logical TACo domain used for decryption. - * @param {ThresholdMessageKit} messageKit - The kit containing the ciphertext and access policy. - * @param {ConditionContext} [context] - Optional context data (e.g., time values) used by conditions in the `messageKit`. + * @param {ThresholdMessageKit} messageKit - The representation of the ciphertext and associated metadata. + * @param {ConditionContext} [context] - Optional context data required by conditions. * @param {string[]} [porterUris] - Optional Porter service URI(s). If omitted, they are resolved via `getPorterUris(domain)`. * * @returns {Promise} The decrypted message bytes. @@ -222,7 +208,7 @@ export function decrypt( * @param {PublicClient} publicClient - Viem `PublicClient` for network operations. * @param {Domain} domain - Logical TACo domain used for decryption. * @param {ThresholdMessageKit} messageKit - The kit containing the ciphertext and access policy. - * @param {ConditionContext} [context] - Optional context data (e.g., time values) used by conditions in the `messageKit`. + * @param {ConditionContext} [context] - Optional context data required by conditions. * @param {string[]} [porterUris] - Optional Porter service URI(s). If omitted, they are resolved via `getPorterUris(domain)`. * * @returns {Promise} The decrypted message bytes. From 9a44327e92775e1d10f9ab0720916d140df66d01 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Tue, 16 Sep 2025 16:23:38 -0400 Subject: [PATCH 50/97] Add viem as a dev dependency so that signatures produced from ethers and viem for the same private key can be properly tested. Fix bug in ViemSignerAdapter implementation where bytes were not being signed properly. --- packages/shared/package.json | 3 +- packages/shared/src/viem/signer-adapter.ts | 12 +- .../shared/test/ethers-viem-utils.test.ts | 4 +- .../shared/test/viem-ethers-adapter.test.ts | 49 ++-- pnpm-lock.yaml | 241 +++++++++++++----- 5 files changed, 209 insertions(+), 100 deletions(-) diff --git a/packages/shared/package.json b/packages/shared/package.json index e74a6567a..7722d9c9e 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -58,7 +58,8 @@ "@types/tmp": "^0.2.6", "cz-conventional-changelog": "^3.3.0", "standard-version": "^9.5.0", - "typechain": "^8.3.2" + "typechain": "^8.3.2", + "viem": "^2.0.0" }, "peerDependencies": { "viem": "^2.0.0" diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index 89cc1d14c..44b782034 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -1,5 +1,3 @@ -import { ethers } from 'ethers'; - import { type TACoSigner } from '../taco-interfaces'; import { SignerLike } from '../types'; @@ -33,9 +31,13 @@ export class ViemSignerAdapter implements TACoSigner { if (!this.viemAccount.signMessage) { throw new Error('Account does not support message signing'); } - const messageToSign = - typeof message === 'string' ? message : ethers.utils.hexlify(message); - return await this.viemAccount.signMessage({ message: messageToSign }); + if (typeof message === 'string') { + return await this.viemAccount.signMessage({ message }); + } else { + return await this.viemAccount.signMessage({ + message: { raw: message }, + }); + } } } diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts index 892487732..aba97141b 100644 --- a/packages/shared/test/ethers-viem-utils.test.ts +++ b/packages/shared/test/ethers-viem-utils.test.ts @@ -92,7 +92,9 @@ describe('viem adapter utilities', () => { await signer.signMessage(message); expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ - message: '0x01020304', + message: { + raw: message, + }, }); }); diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 5a69bcd12..f70fff34c 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -1,8 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ // @ts-nocheck import { ethers } from 'ethers'; +import { privateKeyToAccount } from 'viem/accounts'; import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { fromHexString } from '../src'; import { toEthersProvider, ViemEthersProviderAdapter, @@ -175,50 +177,41 @@ describe('viem ethers adapter', () => { }); describe('ViemSignerAdapter', () => { - let mockViemAccount: any; + const PRIVATE_KEY = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // 32-byte hex - beforeEach(() => { - mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - }; - }); + const viemAccount = privateKeyToAccount(PRIVATE_KEY); + const ethersSigner = new ethers.Wallet(PRIVATE_KEY); it('should create signer without provider', () => { - const signer = new ViemSignerAdapter(mockViemAccount); - - expect(signer).toBeInstanceOf(ViemSignerAdapter); + const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); + expect(viemAdaptedSigner).toBeInstanceOf(ViemSignerAdapter); }); it('should get address from viem account', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); + const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); - const address = await signer.getAddress(); - - expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + const address = await viemAdaptedSigner.getAddress(); + expect(address).toBe(ethersSigner.address); }); it('should sign string message', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); + const message = 'test message'; + const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); + const viemSignature = await viemAdaptedSigner.signMessage(message); - const signature = await signer.signMessage('test message'); - - expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ - message: 'test message', - }); - expect(signature).toBe('0xsignature'); + const ethersSignature = await ethersSigner.signMessage(message); + expect(viemSignature).toBe(ethersSignature); }); it('should sign Uint8Array message', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - const messageBytes = new Uint8Array([1, 2, 3]); + const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); + const messageBytes = fromHexString('0xdeadbeef'); - const signature = await signer.signMessage(messageBytes); + const viemSignature = await viemAdaptedSigner.signMessage(messageBytes); - expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ - message: ethers.utils.hexlify(messageBytes), - }); - expect(signature).toBe('0xsignature'); + const ethersSignature = await ethersSigner.signMessage(messageBytes); + expect(viemSignature).toBe(ethersSignature); }); it('should throw error if account does not support signing', async () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6bea1b9c2..152d1b6e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -104,7 +104,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -128,7 +128,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9) + version: 6.2.0(webpack@5.99.9(webpack-cli@6.0.1)) react: specifier: ^18.3.1 version: 18.3.1 @@ -144,7 +144,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -156,16 +156,16 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9) + version: 5.6.3(webpack@5.99.9(webpack-cli@6.0.1)) process: specifier: ^0.11.10 version: 0.11.10 @@ -213,7 +213,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9) + version: 6.2.0(webpack@5.99.9(webpack-cli@6.0.1)) react: specifier: ^18.3.1 version: 18.3.1 @@ -229,7 +229,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -241,13 +241,13 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9) + version: 5.6.3(webpack@5.99.9(webpack-cli@6.0.1)) react-refresh: specifier: ^0.17.0 version: 0.17.0 @@ -351,10 +351,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -473,10 +473,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) webpack: specifier: ^5.99.9 version: 5.101.3(webpack-cli@6.0.1) @@ -529,9 +529,6 @@ importers: qs: specifier: ^6.14.0 version: 6.14.0 - viem: - specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -560,6 +557,9 @@ importers: typechain: specifier: ^8.3.2 version: 8.3.2(typescript@5.8.2) + viem: + specifier: ^2.0.0 + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) packages/taco: dependencies: @@ -645,7 +645,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) packages: @@ -18196,12 +18196,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 optionalDependencies: type-fest: 0.21.3 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': dependencies: anser: 2.3.2 core-js-pure: 3.41.0 @@ -19047,7 +19047,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -19062,7 +19062,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -19182,17 +19182,17 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) @@ -19592,7 +19592,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 babel-plugin-istanbul@6.1.1: dependencies: @@ -20341,7 +20341,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.0(webpack@5.99.9): + copy-webpack-plugin@13.0.0(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 @@ -20489,7 +20489,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 css-minimizer-webpack-plugin@3.4.1(webpack@5.101.3): dependencies: @@ -20499,7 +20499,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 css-prefers-color-scheme@6.0.3(postcss@8.5.3): dependencies: @@ -21070,7 +21070,7 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.99.9): + esbuild-loader@2.21.0(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: esbuild: 0.16.17 joycon: 3.1.1 @@ -21194,7 +21194,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -21212,8 +21212,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -21268,6 +21268,21 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0 + eslint: 8.57.0 + get-tsconfig: 4.10.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.12 + unrs-resolver: 1.3.2 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 @@ -21279,7 +21294,7 @@ snapshots: tinyglobby: 0.2.12 unrs-resolver: 1.3.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -21293,17 +21308,28 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 @@ -21357,7 +21383,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -21368,7 +21394,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -21380,7 +21406,36 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + 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: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + 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 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -21562,7 +21617,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 eslint@8.57.0: dependencies: @@ -21866,12 +21921,18 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.99.9): + file-loader@6.2.0(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.99.9(webpack-cli@6.0.1) + file-loader@6.2.0(webpack@5.99.9): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.99.9 + file-uri-to-path@1.0.0: {} filelist@1.0.4: @@ -21983,7 +22044,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.8.2 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 optionalDependencies: eslint: 8.57.1 @@ -22370,7 +22431,7 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-webpack-plugin@5.6.3(webpack@5.99.9): + html-webpack-plugin@5.6.3(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -22380,6 +22441,16 @@ snapshots: optionalDependencies: webpack: 5.99.9(webpack-cli@6.0.1) + html-webpack-plugin@5.6.3(webpack@5.99.9): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + webpack: 5.99.9 + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -23680,7 +23751,7 @@ snapshots: dependencies: schema-utils: 4.3.0 tapable: 2.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 minimalistic-assert@1.0.1: {} @@ -24360,7 +24431,7 @@ snapshots: klona: 2.0.6 postcss: 8.5.3 semver: 7.7.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 postcss-logical@5.0.4(postcss@8.5.3): dependencies: @@ -24802,7 +24873,7 @@ snapshots: shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -24874,7 +24945,7 @@ snapshots: style-loader: 3.3.4(webpack@5.99.9) tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) terser-webpack-plugin: 5.3.14(webpack@5.99.9) - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) webpack-manifest-plugin: 4.1.1(webpack@5.99.9) workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) @@ -25220,7 +25291,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 sax@1.2.4: {} @@ -25500,7 +25571,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 source-map-support@0.5.21: dependencies: @@ -25751,7 +25822,7 @@ snapshots: style-loader@3.3.4(webpack@5.101.3): dependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 styled-jsx@5.1.6(react@18.3.1): dependencies: @@ -25879,7 +25950,7 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.99.9): + terser-webpack-plugin@5.3.14(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 @@ -25888,6 +25959,15 @@ snapshots: terser: 5.39.0 webpack: 5.99.9(webpack-cli@6.0.1) + terser-webpack-plugin@5.3.14(webpack@5.99.9): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.39.0 + webpack: 5.99.9 + terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -26366,7 +26446,7 @@ snapshots: terser: 5.39.0 yaml: 2.7.0 - vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -26405,7 +26485,7 @@ snapshots: - tsx - yaml - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -26488,9 +26568,9 @@ snapshots: webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -26511,9 +26591,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 - webpack-dev-middleware@7.4.2(webpack@5.99.9): + webpack-dev-middleware@7.4.2(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -26557,7 +26637,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 transitivePeerDependencies: - bufferutil - debug @@ -26592,7 +26672,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.99.9) + webpack-dev-middleware: 7.4.2(webpack@5.99.9(webpack-cli@6.0.1)) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1) @@ -26606,7 +26686,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.101.3): dependencies: tapable: 2.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 webpack-sources: 2.3.1 webpack-merge@6.0.1: @@ -26627,7 +26707,7 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.99.9(webpack-cli@6.0.1): + webpack@5.99.9: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.7 @@ -26653,6 +26733,37 @@ snapshots: terser-webpack-plugin: 5.3.14(webpack@5.99.9) watchpack: 2.4.2 webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.99.9(webpack-cli@6.0.1): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.1 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.14(webpack@5.99.9(webpack-cli@6.0.1)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 optionalDependencies: webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) transitivePeerDependencies: @@ -26877,7 +26988,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: From 16c026b8ccec608aff1f49f20e841ef0c89b042b Mon Sep 17 00:00:00 2001 From: derekpierre Date: Tue, 16 Sep 2025 17:03:04 -0400 Subject: [PATCH 51/97] Move toTACoSigner() and toEthersProvider() to its own module outside of the viem package; this enables the viem module to not need to be exported as part of @nucypher/shared. This makes sense since viem adapters are implementation details that other packages fon't care about. Update various imports to point to new location. --- packages/shared/src/adapters.ts | 45 +++++++++++++++++++ packages/shared/src/index.ts | 4 +- .../{taco-interfaces.ts => taco-signer.ts} | 5 +-- packages/shared/src/viem/ethers-adapter.ts | 23 ---------- packages/shared/src/viem/index.ts | 4 -- packages/shared/src/viem/signer-adapter.ts | 29 +----------- .../shared/test/ethers-viem-utils.test.ts | 4 +- .../shared/test/viem-ethers-adapter.test.ts | 8 ++-- 8 files changed, 54 insertions(+), 68 deletions(-) create mode 100644 packages/shared/src/adapters.ts rename packages/shared/src/{taco-interfaces.ts => taco-signer.ts} (61%) delete mode 100644 packages/shared/src/viem/index.ts diff --git a/packages/shared/src/adapters.ts b/packages/shared/src/adapters.ts new file mode 100644 index 000000000..ed025e792 --- /dev/null +++ b/packages/shared/src/adapters.ts @@ -0,0 +1,45 @@ +import { ethers } from 'ethers'; + +import type { TACoSigner } from './taco-signer'; +import { ProviderLike, SignerLike } from './types'; +import { ViemEthersProviderAdapter } from './viem/ethers-adapter'; +import { ViemSignerAdapter } from './viem/signer-adapter'; +import { isViemAccount, isViemClient } from './viem/type-guards'; + +/** + * Convert viem Account or ethers Signer to TACoSigner. + * + * This is the main entry point for creating signers for internal TACo use. + * Unlike toEthersProvider which creates actual ethers objects, + * this creates minimal adapters implementing only what TACo needs. + * + * @param signerLike - Either a viem Account or an ethers Signer + * @returns A TACoSigner interface implementation + */ +export function toTACoSigner(signerLike: SignerLike): TACoSigner { + if (isViemAccount(signerLike)) { + return new ViemSignerAdapter(signerLike); + } else { + return signerLike; + } +} + +/** + * Convert viem client to ethers provider or return existing ethers provider. + * + * This is the main entry point for converting providers. + * It handles both viem clients (converting them to ethers providers) + * and existing ethers providers (returning them unchanged). + * + * @param providerLike - Either a viem PublicClient or an ethers.providers.Provider + * @returns An actual ethers.providers.Provider instance + */ +export function toEthersProvider( + providerLike: ProviderLike, +): ethers.providers.Provider { + if (isViemClient(providerLike)) { + return ViemEthersProviderAdapter.clientToProvider(providerLike); + } else { + return providerLike; + } +} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 776d730ed..7e8a4b98e 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,10 +1,10 @@ +export * from './adapters'; export * from './contracts'; export * from './porter'; export * from './schemas'; -export * from './taco-interfaces'; +export * from './taco-signer'; export type * from './types'; export * from './utils'; -export * from './viem/'; export * from './web3'; // Re-exports diff --git a/packages/shared/src/taco-interfaces.ts b/packages/shared/src/taco-signer.ts similarity index 61% rename from packages/shared/src/taco-interfaces.ts rename to packages/shared/src/taco-signer.ts index ab21b7e88..a3925c526 100644 --- a/packages/shared/src/taco-interfaces.ts +++ b/packages/shared/src/taco-signer.ts @@ -5,10 +5,7 @@ * - `getAddress()`: Get the signer's address * - `signMessage()`: Sign a message (string or bytes) * - * Implementations: - * - `ViemSignerAdapter`: Adapts viem Account objects to this interface - * - `ethers.Signer`: Directly compatible via structural typing (because it has the same method signatures) - * - Future signer adapters can implement this same minimal interface + * Future signer adapters can implement this same minimal interface */ export interface TACoSigner { /** diff --git a/packages/shared/src/viem/ethers-adapter.ts b/packages/shared/src/viem/ethers-adapter.ts index 8bc687eae..ccd329988 100644 --- a/packages/shared/src/viem/ethers-adapter.ts +++ b/packages/shared/src/viem/ethers-adapter.ts @@ -1,8 +1,5 @@ import { ethers } from 'ethers'; -import { ProviderLike } from '../types'; - -import { isViemClient } from './type-guards'; import type { Chain, PublicClient } from './types'; /** @@ -150,23 +147,3 @@ export class ViemEthersProviderAdapter { return new ViemEthersProviderAdapter(client).toEthersProvider(); } } - -/** - * Convert viem client or return existing ethers provider - * - * This is the main entry point for converting providers. - * It handles both viem clients (converting them to ethers providers) - * and existing ethers providers (returning them unchanged). - * - * @param providerLike - Either a viem PublicClient or an ethers.providers.Provider - * @returns An actual ethers.providers.Provider instance - */ -export function toEthersProvider( - providerLike: ProviderLike, -): ethers.providers.Provider { - if (isViemClient(providerLike)) { - return ViemEthersProviderAdapter.clientToProvider(providerLike); - } else { - return providerLike; - } -} diff --git a/packages/shared/src/viem/index.ts b/packages/shared/src/viem/index.ts deleted file mode 100644 index bc650519f..000000000 --- a/packages/shared/src/viem/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './ethers-adapter'; -export * from './signer-adapter'; -export * from './type-guards'; -export * from './types'; diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index 44b782034..719da0c55 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -1,20 +1,11 @@ -import { type TACoSigner } from '../taco-interfaces'; -import { SignerLike } from '../types'; +import { type TACoSigner } from '../taco-signer'; -import { isViemAccount } from './type-guards'; import { type Account } from './types'; /** * Viem Signer Adapter * * This adapter implements the minimal TACoSigner interface for internal library use. - * Unlike the provider adapter which creates actual ethers.js objects for external libraries, - * this only implements the specific methods that TACo internally requires. - * - * Key differences from provider adapter: - * - Implements minimal internal interface (not full ethers.Signer) - * - Only methods actually used by TACo: getAddress() and signMessage() - * - Lightweight wrapper for internal library operations */ export class ViemSignerAdapter implements TACoSigner { protected viemAccount: Account; @@ -40,21 +31,3 @@ export class ViemSignerAdapter implements TACoSigner { } } } - -/** - * Convert viem account to TACoSigner or return existing signer - * - * This is the main entry point for creating signers for internal TACo use. - * Unlike toEthersProvider which creates actual ethers objects, - * this creates minimal adapters implementing only what TACo needs. - * - * @param signerLike - Either a viem Account or an existing TACoSigner - * @returns A TACoSigner interface implementation - */ -export function toTACoSigner(signerLike: SignerLike): TACoSigner { - if (isViemAccount(signerLike)) { - return new ViemSignerAdapter(signerLike); - } else { - return signerLike; - } -} diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts index aba97141b..0de51a81c 100644 --- a/packages/shared/test/ethers-viem-utils.test.ts +++ b/packages/shared/test/ethers-viem-utils.test.ts @@ -3,8 +3,8 @@ import { ethers } from 'ethers'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { toEthersProvider } from '../src/viem/ethers-adapter'; -import { toTACoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; +import { toEthersProvider, toTACoSigner } from '../src/adapters'; +import { ViemSignerAdapter } from '../src/viem/signer-adapter'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; describe('viem adapter utilities', () => { diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index f70fff34c..0327a8846 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -5,11 +5,9 @@ import { privateKeyToAccount } from 'viem/accounts'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { fromHexString } from '../src'; -import { - toEthersProvider, - ViemEthersProviderAdapter, -} from '../src/viem/ethers-adapter'; -import { toTACoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; +import { toEthersProvider, toTACoSigner } from '../src/adapters'; +import { ViemEthersProviderAdapter } from '../src/viem/ethers-adapter'; +import { ViemSignerAdapter } from '../src/viem/signer-adapter'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; describe('viem ethers adapter', () => { From 60c3e8ce7a3143bdcf31189032da7dd2491ba4fd Mon Sep 17 00:00:00 2001 From: derekpierre Date: Wed, 17 Sep 2025 13:03:50 -0400 Subject: [PATCH 52/97] Cleanup conversion to ethers provider, and remove excess code including unnecessary class. Update tests accordingly. --- packages/shared/src/adapters.ts | 4 +- packages/shared/src/viem/ethers-adapter.ts | 208 ++++++++---------- .../shared/test/viem-ethers-adapter.test.ts | 118 ++++------ 3 files changed, 131 insertions(+), 199 deletions(-) diff --git a/packages/shared/src/adapters.ts b/packages/shared/src/adapters.ts index ed025e792..1b17b022c 100644 --- a/packages/shared/src/adapters.ts +++ b/packages/shared/src/adapters.ts @@ -2,7 +2,7 @@ import { ethers } from 'ethers'; import type { TACoSigner } from './taco-signer'; import { ProviderLike, SignerLike } from './types'; -import { ViemEthersProviderAdapter } from './viem/ethers-adapter'; +import { viemClientToProvider } from './viem/ethers-adapter'; import { ViemSignerAdapter } from './viem/signer-adapter'; import { isViemAccount, isViemClient } from './viem/type-guards'; @@ -38,7 +38,7 @@ export function toEthersProvider( providerLike: ProviderLike, ): ethers.providers.Provider { if (isViemClient(providerLike)) { - return ViemEthersProviderAdapter.clientToProvider(providerLike); + return viemClientToProvider(providerLike); } else { return providerLike; } diff --git a/packages/shared/src/viem/ethers-adapter.ts b/packages/shared/src/viem/ethers-adapter.ts index ccd329988..b2d6d70ab 100644 --- a/packages/shared/src/viem/ethers-adapter.ts +++ b/packages/shared/src/viem/ethers-adapter.ts @@ -1,7 +1,25 @@ +import { Networkish } from '@ethersproject/providers'; import { ethers } from 'ethers'; import type { Chain, PublicClient } from './types'; +/** + * Create ethers network object from viem chain + */ +function createNetworkish(chain: Chain): ethers.providers.Networkish { + const networkish: Networkish = { + chainId: chain.id, + name: chain.name, + }; + + // Add ENS registry address if available + if (chain.contracts?.ensRegistry?.address) { + networkish.ensAddress = chain.contracts.ensRegistry.address; + } + + return networkish; +} + /** * Viem to Ethers.js Adapter for Providers * @@ -15,135 +33,87 @@ import type { Chain, PublicClient } from './types'; * - Currently handles only transport type: http * - Required for external library compatibility */ -export class ViemEthersProviderAdapter { - private readonly client: PublicClient; +/** + * Static method to directly convert client to provider (convenience method) + */ +export function viemClientToProvider( + client: PublicClient, +): ethers.providers.Provider { + const { chain, transport }: PublicClient = client; - constructor(client: PublicClient) { - this.client = client; + if (!chain) { + throw new Error('Client must have a chain configured'); } - /** - * Convert viem client to ethers.js provider - * Returns an actual ethers.providers.Provider instance for use with external libraries - */ - toEthersProvider(): ethers.providers.Provider { - const { chain, transport }: PublicClient = this.client; - - if (!chain) { - throw new Error('Client must have a chain configured'); - } - - const networkish = this.createNetworkish(chain); - - // Note: We read minimal, commonly-present properties from transport. - // viem's transport internals are not a public API and may change. - // Also the we are taking only the first transport available. - // This adapter focuses on best-effort extraction of an RPC URL or EIP-1193 provider. - - // fallback transport (multiple RPC endpoints) - if (transport?.type === 'fallback') { - throw new Error('Fallback transport not supported'); - // TODO: implement with a code like the following: - // Note: The following takes only the first url of the transports urls. - // const items = transport.transports as ReturnType[]; - // const providers = items.map((t, i) => { - // const url = t?.value?.url; - // if (typeof url !== 'string' || url.length === 0) { - // throw new Error( - // `Fallback transport missing URL at index ${i} (chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, - // ); - // } - // return new ethers.providers.JsonRpcProvider(url, networkish); - // }); - - // return new ethers.providers.FallbackProvider(providers); - } - - // websocket transport - if (transport?.type === 'webSocket') { - throw new Error('WebSocket transport not supported'); - // TODO: implement with a code like the following: - // const url = transport?.url as string | undefined; - // if (!url) { - // throw new Error( - // `Transport must have a URL (type=webSocket, chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, - // ); - // } - // return new ethers.providers.WebSocketProvider(url, networkish); - } - - // custom (EIP-1193) transport - if (transport?.type === 'custom') { - const value = transport?.value; - const provider = value?.provider ?? value; - - // Check if it's an EIP-1193 provider (e.g., MetaMask, WalletConnect) - if (provider && typeof provider.request === 'function') { - return new ethers.providers.Web3Provider(provider, networkish); - } - - // If custom but no EIP-1193 provider found, try URL if present - - throw new Error('Custom non-EIP-1193 provider transport not supported'); - // TODO: implement with a code like the following: - // const url = value?.url ?? transport?.url; - // if (typeof url === 'string' && url.length > 0) { - // return new ethers.providers.JsonRpcProvider(url, networkish); - // } - // throw new Error( - // `Custom transport missing EIP-1193 provider or URL (chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, - // ); - } - - // Default: assume HTTP-like with a URL - const url = transport?.url as string | undefined; - if (!url) { - throw new Error( - `Transport must have a URL (type=${transport?.type ?? 'unknown'}, chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, - ); - } - return new ethers.providers.JsonRpcProvider(url, networkish); + const networkish = createNetworkish(chain); + + // Note: We read minimal, commonly-present properties from transport. + // viem's transport internals are not a public API and may change. + // Also the we are taking only the first transport available. + // This adapter focuses on best-effort extraction of an RPC URL or EIP-1193 provider. + + // fallback transport (multiple RPC endpoints) + if (transport?.type === 'fallback') { + throw new Error('Fallback transport not supported'); + // TODO: implement with a code like the following: + // Note: The following takes only the first url of the transports urls. + // const items = transport.transports as ReturnType[]; + // const providers = items.map((t, i) => { + // const url = t?.value?.url; + // if (typeof url !== 'string' || url.length === 0) { + // throw new Error( + // `Fallback transport missing URL at index ${i} (chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + // ); + // } + // return new ethers.providers.JsonRpcProvider(url, networkish); + // }); + + // return new ethers.providers.FallbackProvider(providers); } - /** - * Get the current viem client - */ - getViemClient(): PublicClient { - return this.client; + // websocket transport + if (transport?.type === 'webSocket') { + throw new Error('WebSocket transport not supported'); + // TODO: implement with a code like the following: + // const url = transport?.url as string | undefined; + // if (!url) { + // throw new Error( + // `Transport must have a URL (type=webSocket, chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + // ); + // } + // return new ethers.providers.WebSocketProvider(url, networkish); } - /** - * Create ethers network object from viem chain - */ - private createNetworkish(chain: Chain): ethers.providers.Networkish { - const networkish: { - chainId: number; - name: string; - ensAddress?: string; - } = { - chainId: chain.id, - name: chain.name, - }; - - // Add ENS registry address if available - if (chain.contracts?.ensRegistry?.address) { - networkish.ensAddress = chain.contracts.ensRegistry.address; - } + // TODO: this needs to be a lot better tested + // custom (EIP-1193) transport + if (transport?.type === 'custom') { + const value = transport?.value; + const provider = value?.provider ?? value; - return networkish; - } + // Check if it's an EIP-1193 provider (e.g., MetaMask, WalletConnect) + if (provider && typeof provider.request === 'function') { + return new ethers.providers.Web3Provider(provider, networkish); + } - /** - * Static factory method to create adapter from viem client - */ - static from(client: PublicClient): ViemEthersProviderAdapter { - return new ViemEthersProviderAdapter(client); + // If custom but no EIP-1193 provider found, try URL if present + + throw new Error('Custom non-EIP-1193 provider transport not supported'); + // TODO: implement with a code like the following: + // const url = value?.url ?? transport?.url; + // if (typeof url === 'string' && url.length > 0) { + // return new ethers.providers.JsonRpcProvider(url, networkish); + // } + // throw new Error( + // `Custom transport missing EIP-1193 provider or URL (chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + // ); } - /** - * Static method to directly convert client to provider (convenience method) - */ - static clientToProvider(client: PublicClient): ethers.providers.Provider { - return new ViemEthersProviderAdapter(client).toEthersProvider(); + // Default: assume HTTP-like with a URL + const url = transport?.url as string | undefined; + if (!url) { + throw new Error( + `Transport must have a URL (type=${transport?.type ?? 'unknown'}, chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + ); } + return new ethers.providers.JsonRpcProvider(url, networkish); } diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 0327a8846..19433de1b 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -4,9 +4,10 @@ import { ethers } from 'ethers'; import { privateKeyToAccount } from 'viem/accounts'; import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { createPublicClient, fallback, http, webSocket } from 'viem'; import { fromHexString } from '../src'; import { toEthersProvider, toTACoSigner } from '../src/adapters'; -import { ViemEthersProviderAdapter } from '../src/viem/ethers-adapter'; +import { viemClientToProvider } from '../src/viem/ethers-adapter'; import { ViemSignerAdapter } from '../src/viem/signer-adapter'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; @@ -15,8 +16,7 @@ describe('viem ethers adapter', () => { it('should export all adapter functions', () => { expect(toEthersProvider).toBeDefined(); expect(toTACoSigner).toBeDefined(); - expect(ViemEthersProviderAdapter).toBeDefined(); - expect(ViemSignerAdapter).toBeDefined(); + expect(viemClientToProvider).toBeDefined(); expect(isViemClient).toBeDefined(); expect(isViemAccount).toBeDefined(); expect(typeof toEthersProvider).toBe('function'); @@ -26,13 +26,11 @@ describe('viem ethers adapter', () => { }); }); - describe('ViemEthersProviderAdapter', () => { - let mockViemPublicClient: any; + describe('viemClientToProvider', () => { + let viemClientConfig: any; beforeEach(() => { - mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x'), + viemClientConfig = { chain: { id: 80002, name: 'Polygon Amoy', @@ -40,74 +38,53 @@ describe('viem ethers adapter', () => { ensRegistry: { address: '0x123' }, }, }, - transport: { - type: 'http', - url: 'https://rpc.ankr.com/polygon_amoy', - }, + transport: http('https://rpc.ankr.com/polygon_amoy'), }; }); - it('should create adapter from viem client', () => { - const adapter = new ViemEthersProviderAdapter(mockViemPublicClient); - - expect(adapter).toBeInstanceOf(ViemEthersProviderAdapter); - expect(adapter.getViemClient()).toBe(mockViemPublicClient); - }); - - it('should create adapter using static factory method', () => { - const adapter = ViemEthersProviderAdapter.from(mockViemPublicClient); - - expect(adapter).toBeInstanceOf(ViemEthersProviderAdapter); - expect(adapter.getViemClient()).toBe(mockViemPublicClient); - }); - it('should convert to ethers provider with single transport', () => { - const adapter = new ViemEthersProviderAdapter(mockViemPublicClient); - const provider = adapter.toEthersProvider(); - + const viemClient = createPublicClient(viemClientConfig); + const provider = new viemClientToProvider(viemClient); expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); + expect(provider.connection.url).toBe('https://rpc.ankr.com/polygon_amoy'); + expect(provider.network.chainId).toBe(80002); + expect(provider.network.name).toBe('Polygon Amoy'); + // TODO: ensRegistry? }); it('should throw error when converting to ethers provider with fallback transport', () => { - const mockFallbackClient = { - ...mockViemPublicClient, - transport: { - type: 'fallback', - transports: [ - { value: { url: 'https://rpc1.example.com' } }, - { value: { url: 'https://rpc2.example.com' } }, - ], - }, + const fallbackClientConfig = { + ...viemClientConfig, + transport: fallback([ + http('https://rpc1.example.com'), + http('https://rpc2.example.com'), + ]), }; - - const adapter = new ViemEthersProviderAdapter(mockFallbackClient); - expect(() => adapter.toEthersProvider()).toThrow( + const fallbackClient = createPublicClient(fallbackClientConfig); + expect(() => viemClientToProvider(fallbackClient)).toThrow( 'Fallback transport not supported', ); }); it('should throw error when converting to ethers provider with webSocket transport', () => { - const mockWebSocketClient = { - ...mockViemPublicClient, - transport: { - type: 'webSocket', - url: 'wss://example.com', - }, + const webSocketClientConfig = { + ...viemClientConfig, + transport: webSocket('wss://example.com'), }; - - const adapter = new ViemEthersProviderAdapter(mockWebSocketClient); - expect(() => adapter.toEthersProvider()).toThrow( + const webSocketClient = createPublicClient(webSocketClientConfig); + expect(() => viemClientToProvider(webSocketClient)).toThrow( 'WebSocket transport not supported', ); }); + // TODO: this needs to be better tested i.e. tested with an actual custom transport from viem that uses EIP1193 it('should convert to ethers provider with custom transport (browser injected)', () => { const mockEIP1193Provider = { request: vi.fn(), }; const mockCustomClient = { - ...mockViemPublicClient, + ...viemClientConfig, transport: { type: 'custom', value: { @@ -116,62 +93,47 @@ describe('viem ethers adapter', () => { }, }; - const adapter = new ViemEthersProviderAdapter(mockCustomClient); - const provider = adapter.toEthersProvider(); + const provider = viemClientToProvider(mockCustomClient); expect(provider).toBeDefined(); expect(provider.constructor.name).toBe('Web3Provider'); }); + // TODO: this needs to be better tested i.e. tested with an actual custom transport from viem it('should throw error for custom transport without provider or URL', () => { const mockCustomClient = { - ...mockViemPublicClient, + ...viemClientConfig, transport: { type: 'custom', value: {}, }, }; - const adapter = new ViemEthersProviderAdapter(mockCustomClient); - expect(() => adapter.toEthersProvider()).toThrow( + expect(() => viemClientToProvider(mockCustomClient)).toThrow( 'Custom non-EIP-1193 provider transport not supported', ); }); it('should handle missing chain', () => { - const clientWithoutChain = { - ...mockViemPublicClient, + const clientWithoutChainConfig = { + ...viemClientConfig, chain: undefined, }; - const adapter = new ViemEthersProviderAdapter(clientWithoutChain); - - expect(() => adapter.toEthersProvider()).toThrow( + const clientWithoutChain = createPublicClient(clientWithoutChainConfig); + expect(() => viemClientToProvider(clientWithoutChain)).toThrow( 'Client must have a chain configured', ); }); it('should handle missing transport URL', () => { - const clientWithoutUrl = { - ...mockViemPublicClient, - transport: { - type: 'http', - // missing url - }, + const clientWithoutUrlConfig = { + ...viemClientConfig, + transport: undefined, // empty string URL }; - - const adapter = new ViemEthersProviderAdapter(clientWithoutUrl); - - expect(() => adapter.toEthersProvider()).toThrow( + expect(() => viemClientToProvider(clientWithoutUrlConfig)).toThrow( 'Transport must have a URL', ); }); - - it('should use static clientToProvider method', () => { - const provider = - ViemEthersProviderAdapter.clientToProvider(mockViemPublicClient); - - expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); - }); }); describe('ViemSignerAdapter', () => { From 18f2913017dd9958a33b09d471393d0823fd113e Mon Sep 17 00:00:00 2001 From: derekpierre Date: Wed, 17 Sep 2025 13:08:23 -0400 Subject: [PATCH 53/97] Only export types from viem module. --- packages/shared/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 7e8a4b98e..714d979dc 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -5,6 +5,7 @@ export * from './schemas'; export * from './taco-signer'; export type * from './types'; export * from './utils'; +export type * from './viem/types'; export * from './web3'; // Re-exports From 9bc24ae3181743e45ed7b888cb76a3e55599a756 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Wed, 17 Sep 2025 13:14:13 -0400 Subject: [PATCH 54/97] Remove duplicated test file - this is the same as viem-ethers-adapter.test.ts. --- .../shared/test/ethers-viem-utils.test.ts | 243 ------------------ 1 file changed, 243 deletions(-) delete mode 100644 packages/shared/test/ethers-viem-utils.test.ts diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts deleted file mode 100644 index 0de51a81c..000000000 --- a/packages/shared/test/ethers-viem-utils.test.ts +++ /dev/null @@ -1,243 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -// @ts-nocheck -import { ethers } from 'ethers'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; - -import { toEthersProvider, toTACoSigner } from '../src/adapters'; -import { ViemSignerAdapter } from '../src/viem/signer-adapter'; -import { isViemAccount, isViemClient } from '../src/viem/type-guards'; - -describe('viem adapter utilities', () => { - describe('function exports', () => { - it('should export all adapter functions', () => { - expect(toEthersProvider).toBeDefined(); - expect(toTACoSigner).toBeDefined(); - expect(isViemClient).toBeDefined(); - expect(isViemAccount).toBeDefined(); - expect(typeof toEthersProvider).toBe('function'); - expect(typeof toTACoSigner).toBe('function'); - expect(typeof isViemClient).toBe('function'); - expect(typeof isViemAccount).toBe('function'); - }); - }); - - describe('ethers provider interop', () => { - let mockViemPublicClient: any; - - beforeEach(() => { - mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x1234'), - chain: { - name: 'Polygon Amoy', - id: 80002, - contracts: {}, - }, - transport: { - type: 'http', - url: 'https://rpc.ankr.com/polygon_amoy', - }, - }; - }); - - it('should create an ethers provider from viem client (http)', () => { - const provider = toEthersProvider(mockViemPublicClient); - - expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); - }); - }); - - describe('ViemSignerAdapter', () => { - let mockViemAccount: any; - - beforeEach(() => { - mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - }; - }); - - it('should create signer without provider', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - - expect(signer.getAddress).toBeDefined(); - expect(signer.signMessage).toBeDefined(); - - // Actually call the methods to ensure coverage - await signer.getAddress(); - await signer.signMessage('test'); - }); - - it('should get address from viem account', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - const address = await signer.getAddress(); - - expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); - }); - - it('should sign string message', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - const signature = await signer.signMessage('test message'); - - expect(signature).toBe('0xsignature'); - expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ - message: 'test message', - }); - }); - - it('should sign Uint8Array message', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - const message = new Uint8Array([1, 2, 3, 4]); - - await signer.signMessage(message); - - expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ - message: { - raw: message, - }, - }); - }); - - it('should throw error if account does not support signing', async () => { - const accountWithoutSigning = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - // no signMessage method - }; - - const signer = new ViemSignerAdapter(accountWithoutSigning); - - await expect(signer.signMessage('test')).rejects.toThrow( - 'Account does not support message signing', - ); - }); - }); - - describe('toEthersProvider', () => { - it('should create provider from viem client', async () => { - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x'), - chain: { name: 'test', id: 80002 }, - transport: { type: 'http', url: 'https://rpc.ankr.com/polygon_amoy' }, - } as any; - - const provider = toEthersProvider(mockViemPublicClient); - - expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); - }); - - it('should return ethers provider unchanged', () => { - const ethersProvider = new ethers.providers.JsonRpcProvider(); - const result = toEthersProvider(ethersProvider); - - expect(result).toBe(ethersProvider); - }); - - it('should handle non-viem provider correctly', () => { - const nonViemProvider = { - someProperty: 'value', - someMethod: () => {}, - } as any; - - const result = toEthersProvider(nonViemProvider); - - expect(result).toBe(nonViemProvider); - }); - }); - - describe('toTACoSigner', () => { - it('should create signer from viem account', async () => { - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - } as any; - - const signer = toTACoSigner(mockViemAccount); - - expect(signer).toBeInstanceOf(ViemSignerAdapter); - - // Actually call methods to ensure coverage - const address = await signer.getAddress(); - expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); - }); - - it('should return ethers signer unchanged', () => { - const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); - const result = toTACoSigner(ethersSigner); - - expect(result).toBe(ethersSigner); - }); - - it('should handle non-viem signer correctly', () => { - const nonViemSigner = { - someProperty: 'value', - someMethod: () => {}, - provider: {}, // This will make it fail the isViemAccount check - } as any; - - const result = toTACoSigner(nonViemSigner); - - expect(result).toBe(nonViemSigner); - }); - }); - - describe('type guards', () => { - describe('isViemClient', () => { - it('should identify viem client by chain property', () => { - const viemClient = { - chain: { name: 'test', id: 1 }, - getChainId: vi.fn(), - }; - - expect(isViemClient(viemClient)).toBe(true); - }); - - it('should identify viem client by getChainId method', () => { - const viemClient = { - getChainId: () => Promise.resolve(1), - }; - - expect(isViemClient(viemClient)).toBe(true); - }); - - it('should reject ethers provider', () => { - const ethersProvider = new ethers.providers.JsonRpcProvider(); - - expect(isViemClient(ethersProvider)).toBe(false); - }); - - it('should reject object without viem properties', () => { - const notViemClient = { - someMethod: () => {}, - }; - - expect(isViemClient(notViemClient)).toBe(false); - }); - }); - - describe('isViemAccount', () => { - it('should identify viem account by address property', () => { - const viemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - }; - - expect(isViemAccount(viemAccount)).toBe(true); - }); - - it('should reject ethers signer', () => { - const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); - - expect(isViemAccount(ethersSigner)).toBe(false); - }); - - it('should reject object with provider property', () => { - const signerWithProvider = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - provider: {}, - }; - - expect(isViemAccount(signerWithProvider)).toBe(false); - }); - }); - }); -}); From d04625e1f5453337e1cafb4104e3eb3cb4342d6c Mon Sep 17 00:00:00 2001 From: derekpierre Date: Wed, 17 Sep 2025 14:17:41 -0400 Subject: [PATCH 55/97] Update adapter toTACoSigner and typeguard tests to test legit viem PublicClient/Account instances. --- .../shared/test/viem-ethers-adapter.test.ts | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 19433de1b..7198b2cb7 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -12,6 +12,9 @@ import { ViemSignerAdapter } from '../src/viem/signer-adapter'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; describe('viem ethers adapter', () => { + const PRIVATE_KEY = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // 32-byte hex + describe('function exports', () => { it('should export all adapter functions', () => { expect(toEthersProvider).toBeDefined(); @@ -137,9 +140,6 @@ describe('viem ethers adapter', () => { }); describe('ViemSignerAdapter', () => { - const PRIVATE_KEY = - '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // 32-byte hex - const viemAccount = privateKeyToAccount(PRIVATE_KEY); const ethersSigner = new ethers.Wallet(PRIVATE_KEY); @@ -190,15 +190,14 @@ describe('viem ethers adapter', () => { describe('toEthersProvider', () => { it('should create provider from viem client', async () => { - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x'), - chain: { id: 80002, name: 'test' }, - transport: { type: 'http', url: 'https://test.com' }, - } as any; - - const provider = toEthersProvider(mockViemPublicClient); - + const viemClient = createPublicClient({ + chain: { + id: 80002, + name: 'Polygon Amoy', + }, + transport: http('https://test.com'), + }); + const provider = toEthersProvider(viemClient); expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); }); @@ -207,7 +206,6 @@ describe('viem ethers adapter', () => { 'https://test.com', ); const result = toEthersProvider(ethersProvider); - expect(result).toBe(ethersProvider); }); @@ -218,28 +216,26 @@ describe('viem ethers adapter', () => { } as any; const result = toEthersProvider(nonViemProvider); - expect(result).toBe(nonViemProvider); }); }); describe('toTACoSigner', () => { - it('should create signer from viem account', async () => { - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - } as any; + const PRIVATE_KEY = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // 32-byte hex - const signer = toTACoSigner(mockViemAccount); + it('should create signer from viem account', async () => { + const viemAccount = privateKeyToAccount(PRIVATE_KEY); + const signer = toTACoSigner(viemAccount); expect(signer).toBeInstanceOf(ViemSignerAdapter); const address = await signer.getAddress(); - expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + expect(address).toBe(viemAccount.address); }); it('should return ethers signer unchanged', () => { - const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); + const ethersSigner = new ethers.Wallet(PRIVATE_KEY); const result = toTACoSigner(ethersSigner); expect(result).toBe(ethersSigner); @@ -252,33 +248,40 @@ describe('viem ethers adapter', () => { } as any; const result = toTACoSigner(nonViemSigner); - expect(result).toBe(nonViemSigner); }); }); describe('type guards', () => { describe('isViemClient', () => { + it('should identify actual viem client', () => { + const viemClient = createPublicClient({ + chain: { + id: 80002, + name: 'Polygon Amoy', + }, + transport: http('https://test.com'), + }); + expect(isViemClient(viemClient)).toBe(true); + }); it('should identify viem client by chain property', () => { - const viemClient = { + const viemClientByChain = { chain: { id: 1, name: 'mainnet' }, getChainId: vi.fn(), }; - - expect(isViemClient(viemClient)).toBe(true); + expect(isViemClient(viemClientByChain)).toBe(true); }); it('should identify viem client by getChainId method', () => { - const viemClient = { + const viemClientByGetChainId = { getChainId: vi.fn(), }; - expect(isViemClient(viemClient)).toBe(true); + expect(isViemClient(viemClientByGetChainId)).toBe(true); }); it('should reject ethers provider', () => { const ethersProvider = new ethers.providers.JsonRpcProvider(); - expect(isViemClient(ethersProvider)).toBe(false); }); @@ -286,23 +289,25 @@ describe('viem ethers adapter', () => { const notViemClient = { send: vi.fn(), }; - expect(isViemClient(notViemClient)).toBe(false); }); }); describe('isViemAccount', () => { + it('should identify actual viem account', () => { + const viemAccount = privateKeyToAccount(PRIVATE_KEY); + expect(isViemAccount(viemAccount)).toBe(true); + }); it('should identify viem account by address property', () => { - const viemAccount = { + const viemAccountByAddress = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', }; - expect(isViemAccount(viemAccount)).toBe(true); + expect(isViemAccount(viemAccountByAddress)).toBe(true); }); it('should reject ethers signer', () => { - const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); - + const ethersSigner = new ethers.Wallet(PRIVATE_KEY); expect(isViemAccount(ethersSigner)).toBe(false); }); From 6f0e6ef1d74a2a9797245bfb1b7d4ff326cb8814 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Wed, 17 Sep 2025 14:57:28 -0400 Subject: [PATCH 56/97] Use an actual viem signing account for tests where possible instead of mocking. Remove unneccessary test regarding presence of api function and arguments. --- packages/taco/test/taco.test.ts | 12 +++--- packages/taco/test/viem-taco.test.ts | 60 ++++++---------------------- 2 files changed, 17 insertions(+), 55 deletions(-) diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index 57ce05f19..e42749608 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -16,6 +16,7 @@ import { TEST_CHAIN_ID, TEST_SIWE_PARAMS, } from '@nucypher/test-utils'; +import { privateKeyToAccount } from 'viem/accounts'; import { beforeAll, describe, expect, it } from 'vitest'; import * as taco from '../src'; @@ -209,18 +210,15 @@ describe('taco', () => { const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); // Mock viem account - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: () => Promise.resolve('0x'), - signTypedData: () => Promise.resolve('0x'), - }; - + const privateKey = + '0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'; + const viemAccount = privateKeyToAccount(privateKey); const messageKit = await taco.encryptWithPublicKey( message, ownsNFT, mockedDkg.dkg.publicKey(), // eslint-disable-next-line @typescript-eslint/no-explicit-any - mockViemAccount as any, + viemAccount, ); expect(messageKit).toBeDefined(); diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 32422f48f..6361ec628 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -16,6 +16,7 @@ import { TEST_CHAIN_ID, TEST_SIWE_PARAMS, } from '@nucypher/test-utils'; +import { privateKeyToAccount } from 'viem/accounts'; import { beforeAll, describe, expect, it, vi } from 'vitest'; import { conditions, domains, toBytes } from '../src'; @@ -43,32 +44,10 @@ describe('viem TACo integration', () => { await initialize(); }); - describe('viem TACo functions', () => { - it('should export viem TACo integration functions', () => { - expect(encrypt).toBeDefined(); - expect(decrypt).toBeDefined(); - expect(typeof encrypt).toBe('function'); - expect(typeof decrypt).toBe('function'); - }); - }); - - describe('TACo encryption workflow', () => { + describe('TACo encryption/decryption workflow', () => { it('encrypts and decrypts using viem functions', async () => { const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); const mockedDkgRitual = fakeDkgRitual(mockedDkg); - const mockEthersProvider = fakeProvider(aliceSecretKeyBytes); - const mockEthersSigner = { - ...mockEthersProvider.getSigner(), - signMessage: vi - .fn() - .mockResolvedValue( - '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1b', - ), - signTypedData: vi.fn().mockResolvedValue('0x'), - }; - // Type assertion for test compatibility - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const typedSigner = mockEthersSigner as any; // Mock the viem clients with more complete interfaces const mockViemPublicClient = { @@ -81,12 +60,9 @@ describe('viem TACo integration', () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any } as any; - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0x'), - signTypedData: vi.fn().mockResolvedValue('0x'), - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any; + const privateKey = + '0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'; + const viemAccount = privateKeyToAccount(privateKey); const mockViemProvider = { ...fakeProvider(aliceSecretKeyBytes), @@ -97,9 +73,10 @@ describe('viem TACo integration', () => { const createTacoProviderSpy = vi .spyOn(await import('@nucypher/shared'), 'toEthersProvider') .mockReturnValue(mockViemProvider); - const createTacoSignerSpy = vi - .spyOn(await import('@nucypher/shared'), 'toTACoSigner') - .mockReturnValue(typedSigner); + const createTacoSignerSpy = vi.spyOn( + await import('@nucypher/shared'), + 'toTACoSigner', + ); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); @@ -110,11 +87,11 @@ describe('viem TACo integration', () => { message, ownsNFT, mockedDkg.ritualId, - mockViemAccount, + viemAccount, ); expect(createTacoProviderSpy).toHaveBeenCalledWith(mockViemPublicClient); - expect(createTacoSignerSpy).toHaveBeenCalledWith(mockViemAccount); + expect(createTacoSignerSpy).toHaveBeenCalledWith(viemAccount); expect(getFinalizedRitualSpy).toHaveBeenCalled(); expect(messageKit).toBeDefined(); @@ -144,7 +121,7 @@ describe('viem TACo integration', () => { const authProvider = new tacoAuth.EIP4361AuthProvider( mockViemProvider, - typedSigner, + viemAccount, TEST_SIWE_PARAMS, ); @@ -174,18 +151,5 @@ describe('viem TACo integration', () => { createTacoProviderSpy.mockRestore(); createTacoSignerSpy.mockRestore(); }); - - it('decrypts without optional parameters', async () => { - // This test just verifies the function exists and has the right signature - expect(decrypt).toBeDefined(); - expect(decrypt.length).toBe(5); // publicClient, domain, messageKit, context?, porterUris? - }); - }, 10000); - - describe('function signatures', () => { - it('should have correct function signatures', () => { - expect(encrypt.length).toBe(6); // publicClient, domain, message, condition, ritualId, viemAccount - expect(decrypt.length).toBe(5); // publicClient, domain, messageKit, context?, porterUris? - }); }); }); From be3266c3904b1653b2e15e75307e35d03c531471 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Wed, 17 Sep 2025 17:14:35 -0400 Subject: [PATCH 57/97] Simplify exports from viem directory in shared package. --- packages/shared/src/index.ts | 2 +- packages/shared/src/viem/index.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 packages/shared/src/viem/index.ts diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 714d979dc..d7828c8a6 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -5,7 +5,7 @@ export * from './schemas'; export * from './taco-signer'; export type * from './types'; export * from './utils'; -export type * from './viem/types'; +export * from './viem'; export * from './web3'; // Re-exports diff --git a/packages/shared/src/viem/index.ts b/packages/shared/src/viem/index.ts new file mode 100644 index 000000000..a2dddad71 --- /dev/null +++ b/packages/shared/src/viem/index.ts @@ -0,0 +1 @@ +export type * from './types'; From ee4f935b7c24315ab1cc537e070a57737725d683 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Wed, 17 Sep 2025 17:15:05 -0400 Subject: [PATCH 58/97] Remove export test; doesn't seem like it is actually testing anything. --- packages/shared/test/viem-ethers-adapter.test.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 7198b2cb7..8c0926531 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -15,20 +15,6 @@ describe('viem ethers adapter', () => { const PRIVATE_KEY = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // 32-byte hex - describe('function exports', () => { - it('should export all adapter functions', () => { - expect(toEthersProvider).toBeDefined(); - expect(toTACoSigner).toBeDefined(); - expect(viemClientToProvider).toBeDefined(); - expect(isViemClient).toBeDefined(); - expect(isViemAccount).toBeDefined(); - expect(typeof toEthersProvider).toBe('function'); - expect(typeof toTACoSigner).toBe('function'); - expect(typeof isViemClient).toBe('function'); - expect(typeof isViemAccount).toBe('function'); - }); - }); - describe('viemClientToProvider', () => { let viemClientConfig: any; From 0a96eb493e53ecfb681597bbd5bbfb03098b9896 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Wed, 17 Sep 2025 17:15:47 -0400 Subject: [PATCH 59/97] Remove duplicated integration test, and have the original integration test run twice, one for ethers and the other for viem. --- .../integration-test/encrypt-decrypt.test.ts | 44 ++- .../viem-encrypt-decrypt.test.ts | 270 ------------------ 2 files changed, 30 insertions(+), 284 deletions(-) delete mode 100644 packages/taco/integration-test/viem-encrypt-decrypt.test.ts diff --git a/packages/taco/integration-test/encrypt-decrypt.test.ts b/packages/taco/integration-test/encrypt-decrypt.test.ts index db1482940..4019d1d43 100644 --- a/packages/taco/integration-test/encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/encrypt-decrypt.test.ts @@ -6,6 +6,9 @@ import { USER_ADDRESS_PARAM_DEFAULT, } from '@nucypher/taco-auth'; import { ethers } from 'ethers'; +import { createPublicClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; +import { polygonAmoy } from 'viem/chains'; import { conditions, decrypt, @@ -25,31 +28,44 @@ const DOMAIN = 'lynx'; const RITUAL_ID = 27; const CHAIN_ID = 80002; -describe.skipIf(!process.env.RUNNING_IN_CI)( +describe.skipIf(!process.env.RUNNING_IN_CI).each<[string, any, any, any]>([ + [ + 'ethers', + new ethers.providers.JsonRpcProvider(RPC_PROVIDER_URL), + new ethers.Wallet(ENCRYPTOR_PRIVATE_KEY), + new ethers.Wallet(CONSUMER_PRIVATE_KEY), + ], + [ + 'viem', + createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }), + privateKeyToAccount(ENCRYPTOR_PRIVATE_KEY), + privateKeyToAccount(CONSUMER_PRIVATE_KEY), + ], +])( 'Taco Encrypt/Decrypt Integration Test', - () => { - let provider: ethers.providers.JsonRpcProvider; - let encryptorSigner: ethers.Wallet; - let consumerSigner: ethers.Wallet; - + (label, provider, encryptorSigner, consumerSigner) => { beforeAll(async () => { - provider = new ethers.providers.JsonRpcProvider(RPC_PROVIDER_URL); - encryptorSigner = new ethers.Wallet(ENCRYPTOR_PRIVATE_KEY, provider); - consumerSigner = new ethers.Wallet(CONSUMER_PRIVATE_KEY, provider); - // Initialize the library await initialize(); // Verify network connection - const network = await provider.getNetwork(); - if (network.chainId !== CHAIN_ID) { + let chainId: number; + if (provider instanceof ethers.providers.JsonRpcProvider) { + chainId = (await provider.getNetwork()).chainId; + } else { + chainId = provider.chain.id; + } + if (chainId !== CHAIN_ID) { throw new Error( - `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${network.chainId}`, + `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${chainId}`, ); } }); - test('should encrypt and decrypt a message with large condition values', async (value) => { + test(`should encrypt and decrypt a message with large condition values using ${label}`, async () => { // Create test message const messageString = 'This is a secret 🤐'; const message = toBytes(messageString); diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts deleted file mode 100644 index 3ad0abcf8..000000000 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { beforeAll, describe, expect, test } from 'vitest'; - -import { fromBytes, toBytes } from '@nucypher/shared'; -import { - EIP4361AuthProvider, - USER_ADDRESS_PARAM_DEFAULT, -} from '@nucypher/taco-auth'; -import { - createPublicClient, - createWalletClient, - http, - PublicClient, - WalletClient, -} from 'viem'; -import { privateKeyToAccount } from 'viem/accounts'; -import { polygonAmoy } from 'viem/chains'; -import { conditions, initialize, ThresholdMessageKit } from '../src'; -import { CompoundCondition } from '../src/conditions/compound-condition'; -import { decrypt, encrypt } from '../src/taco'; -import { UINT256_MAX } from '../test/test-utils'; - -const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; -const ENCRYPTOR_PRIVATE_KEY = - '0x900edb9e8214b2353f82aa195e915128f419a92cfb8bbc0f4784f10ef4112b86'; -const CONSUMER_PRIVATE_KEY = - '0xf307e165339cb5deb2b8ec59c31a5c0a957b8e8453ce7fe8a19d9a4c8acf36d4'; -const DOMAIN = 'lynx'; -const RITUAL_ID = 27; -const CHAIN_ID = 80002; - -// Create viem accounts from private keys -const encryptorAccount = privateKeyToAccount( - ENCRYPTOR_PRIVATE_KEY as `0x${string}`, -); -const consumerAccount = privateKeyToAccount( - CONSUMER_PRIVATE_KEY as `0x${string}`, -); - -describe.skipIf(!process.env.RUNNING_IN_CI)( - 'Viem Encrypt/Decrypt Integration Test', - () => { - let publicClient: PublicClient; - let viemWalletClient: WalletClient; - - beforeAll(async () => { - // Create viem clients - publicClient = createPublicClient({ - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); - - viemWalletClient = createWalletClient({ - account: consumerAccount, - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); - - // Initialize the library - await initialize(); - - // Verify network connection - const chainId = await publicClient.getChainId(); - if (chainId !== CHAIN_ID) { - throw new Error( - `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${chainId}`, - ); - } - }); - - test('should encrypt and decrypt a message with viem using RPC balance condition', async () => { - // Create test message - const messageString = 'This is a secret viem message 🔐'; - const message = toBytes(messageString); - - // Create conditions - const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); - - const balanceLessThanMaxUintBigInt = new conditions.base.rpc.RpcCondition( - { - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '<', - // max uint256 - value: UINT256_MAX, - }, - }, - ); - - const compoundCondition = CompoundCondition.and([ - hasPositiveBalance, - balanceLessThanMaxUintBigInt, - ]); - - // Encrypt message using viem - const messageKit = await encrypt( - publicClient, - DOMAIN, - message, - compoundCondition, - RITUAL_ID, - encryptorAccount, - ); - - const encryptedBytes = messageKit.toBytes(); - - // Prepare for decryption - const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using viem-native auth provider - if ( - conditionContext.requestedContextParameters.has( - USER_ADDRESS_PARAM_DEFAULT, - ) - ) { - const authProvider = new EIP4361AuthProvider( - publicClient, - consumerAccount, - ); - - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - authProvider, - ); - } - - // Decrypt message using viem - const decryptedBytes = await decrypt( - publicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout - - test('should encrypt and decrypt with viem using simple positive balance condition', async () => { - // Create test message - const messageString = 'This viem message tests simple balance condition'; - const message = toBytes(messageString); - - // Create simple positive balance condition (avoids problematic allowlist condition) - const positiveBalanceCondition = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); - - // Encrypt message with viem using simple condition - const messageKit = await encrypt( - publicClient, - DOMAIN, - message, - positiveBalanceCondition, - RITUAL_ID, - encryptorAccount, - ); - - const encryptedBytes = messageKit.toBytes(); - - // Prepare for decryption - const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using consolidated EIP4361AuthProvider with viem support - const authProvider = new EIP4361AuthProvider( - publicClient, - consumerAccount, - ); - - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - authProvider, - ); - - // Decrypt message using viem - const decryptedBytes = await decrypt( - publicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption was successful - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout - - test('should work with different viem account types', async () => { - // This test verifies viem integration works with different account configurations - const messageString = 'Testing different viem account types'; - const message = toBytes(messageString); - - // Create a simple condition - const simpleCondition = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); - - // Test encryption with viem account - const messageKit = await encrypt( - publicClient, - DOMAIN, - message, - simpleCondition, - RITUAL_ID, - encryptorAccount, - ); - - // Test decryption with different viem client setup - const anotherViemPublicClient = createPublicClient({ - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); - - const messageKitFromBytes = ThresholdMessageKit.fromBytes( - messageKit.toBytes(), - ); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using consolidated EIP4361AuthProvider with different client - const authProvider = new EIP4361AuthProvider( - anotherViemPublicClient, - consumerAccount, - ); - - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - authProvider, - ); - - // Decrypt using the different client - const decryptedBytes = await decrypt( - anotherViemPublicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout - }, -); From 75f625b9ecd78550446fd1e427c189f555a1f4d4 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Thu, 18 Sep 2025 14:00:29 -0400 Subject: [PATCH 60/97] Specify types in integration test. Check for Provider type instead of JsonRpcProvider. Co-authored-by: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> --- .../src/providers/eip4361/eip4361.ts | 1 + .../integration-test/encrypt-decrypt.test.ts | 45 ++++++++++--------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index d7b0f9d34..a5fd9a24e 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -111,6 +111,7 @@ export class EIP4361AuthProvider implements AuthProvider { account: Account, providerParams?: EIP4361AuthProviderParams, ); + constructor( providerLike: ProviderLike, signerLike: SignerLike, diff --git a/packages/taco/integration-test/encrypt-decrypt.test.ts b/packages/taco/integration-test/encrypt-decrypt.test.ts index 4019d1d43..592f071c1 100644 --- a/packages/taco/integration-test/encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/encrypt-decrypt.test.ts @@ -6,7 +6,7 @@ import { USER_ADDRESS_PARAM_DEFAULT, } from '@nucypher/taco-auth'; import { ethers } from 'ethers'; -import { createPublicClient, http } from 'viem'; +import { Account, createPublicClient, http, PublicClient } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; import { @@ -28,23 +28,28 @@ const DOMAIN = 'lynx'; const RITUAL_ID = 27; const CHAIN_ID = 80002; -describe.skipIf(!process.env.RUNNING_IN_CI).each<[string, any, any, any]>([ - [ - 'ethers', - new ethers.providers.JsonRpcProvider(RPC_PROVIDER_URL), - new ethers.Wallet(ENCRYPTOR_PRIVATE_KEY), - new ethers.Wallet(CONSUMER_PRIVATE_KEY), - ], - [ - 'viem', - createPublicClient({ - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }), - privateKeyToAccount(ENCRYPTOR_PRIVATE_KEY), - privateKeyToAccount(CONSUMER_PRIVATE_KEY), - ], -])( +describe + .skipIf(!process.env.RUNNING_IN_CI) + .each< + | [string, ethers.providers.Provider, ethers.Wallet, ethers.Wallet] + | [string, PublicClient, Account, Account] + >([ + [ + 'ethers', + new ethers.providers.JsonRpcProvider(RPC_PROVIDER_URL), + new ethers.Wallet(ENCRYPTOR_PRIVATE_KEY), + new ethers.Wallet(CONSUMER_PRIVATE_KEY), + ], + [ + 'viem', + createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }), + privateKeyToAccount(ENCRYPTOR_PRIVATE_KEY), + privateKeyToAccount(CONSUMER_PRIVATE_KEY), + ], + ])( 'Taco Encrypt/Decrypt Integration Test', (label, provider, encryptorSigner, consumerSigner) => { beforeAll(async () => { @@ -53,10 +58,10 @@ describe.skipIf(!process.env.RUNNING_IN_CI).each<[string, any, any, any]>([ // Verify network connection let chainId: number; - if (provider instanceof ethers.providers.JsonRpcProvider) { + if (provider instanceof ethers.providers.Provider) { chainId = (await provider.getNetwork()).chainId; } else { - chainId = provider.chain.id; + chainId = provider.chain!.id as number; } if (chainId !== CHAIN_ID) { throw new Error( From 578e0935c5ccf5b166c3481bfb42e84f4de42a93 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Thu, 18 Sep 2025 14:05:43 -0400 Subject: [PATCH 61/97] Rename toTACoSigner/TACoSigner to toTacoSigner/TacoSigner. --- packages/shared/src/adapters.ts | 8 ++++---- packages/shared/src/taco-signer.ts | 2 +- packages/shared/src/viem/signer-adapter.ts | 6 +++--- packages/shared/test/viem-ethers-adapter.test.ts | 10 +++++----- packages/taco-auth/src/providers/eip4361/eip4361.ts | 8 ++++---- packages/taco/src/taco.ts | 4 ++-- packages/taco/test/viem-taco.test.ts | 2 +- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/shared/src/adapters.ts b/packages/shared/src/adapters.ts index 1b17b022c..89e0b8be2 100644 --- a/packages/shared/src/adapters.ts +++ b/packages/shared/src/adapters.ts @@ -1,22 +1,22 @@ import { ethers } from 'ethers'; -import type { TACoSigner } from './taco-signer'; +import type { TacoSigner } from './taco-signer'; import { ProviderLike, SignerLike } from './types'; import { viemClientToProvider } from './viem/ethers-adapter'; import { ViemSignerAdapter } from './viem/signer-adapter'; import { isViemAccount, isViemClient } from './viem/type-guards'; /** - * Convert viem Account or ethers Signer to TACoSigner. + * Convert viem Account or ethers Signer to TacoSigner. * * This is the main entry point for creating signers for internal TACo use. * Unlike toEthersProvider which creates actual ethers objects, * this creates minimal adapters implementing only what TACo needs. * * @param signerLike - Either a viem Account or an ethers Signer - * @returns A TACoSigner interface implementation + * @returns A TacoSigner interface implementation */ -export function toTACoSigner(signerLike: SignerLike): TACoSigner { +export function toTacoSigner(signerLike: SignerLike): TacoSigner { if (isViemAccount(signerLike)) { return new ViemSignerAdapter(signerLike); } else { diff --git a/packages/shared/src/taco-signer.ts b/packages/shared/src/taco-signer.ts index a3925c526..24b0fe6f3 100644 --- a/packages/shared/src/taco-signer.ts +++ b/packages/shared/src/taco-signer.ts @@ -7,7 +7,7 @@ * * Future signer adapters can implement this same minimal interface */ -export interface TACoSigner { +export interface TacoSigner { /** * Get the address of this signer */ diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index 719da0c55..80ea3caa1 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -1,13 +1,13 @@ -import { type TACoSigner } from '../taco-signer'; +import { type TacoSigner } from '../taco-signer'; import { type Account } from './types'; /** * Viem Signer Adapter * - * This adapter implements the minimal TACoSigner interface for internal library use. + * This adapter implements the minimal TacoSigner interface for internal library use. */ -export class ViemSignerAdapter implements TACoSigner { +export class ViemSignerAdapter implements TacoSigner { protected viemAccount: Account; constructor(viemAccount: Account) { diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 8c0926531..fdc9ff4c3 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -6,7 +6,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { createPublicClient, fallback, http, webSocket } from 'viem'; import { fromHexString } from '../src'; -import { toEthersProvider, toTACoSigner } from '../src/adapters'; +import { toEthersProvider, toTacoSigner } from '../src/adapters'; import { viemClientToProvider } from '../src/viem/ethers-adapter'; import { ViemSignerAdapter } from '../src/viem/signer-adapter'; import { isViemAccount, isViemClient } from '../src/viem/type-guards'; @@ -206,13 +206,13 @@ describe('viem ethers adapter', () => { }); }); - describe('toTACoSigner', () => { + describe('toTacoSigner', () => { const PRIVATE_KEY = '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // 32-byte hex it('should create signer from viem account', async () => { const viemAccount = privateKeyToAccount(PRIVATE_KEY); - const signer = toTACoSigner(viemAccount); + const signer = toTacoSigner(viemAccount); expect(signer).toBeInstanceOf(ViemSignerAdapter); @@ -222,7 +222,7 @@ describe('viem ethers adapter', () => { it('should return ethers signer unchanged', () => { const ethersSigner = new ethers.Wallet(PRIVATE_KEY); - const result = toTACoSigner(ethersSigner); + const result = toTacoSigner(ethersSigner); expect(result).toBe(ethersSigner); }); @@ -233,7 +233,7 @@ describe('viem ethers adapter', () => { provider: {}, // This will make it fail the isViemAccount check } as any; - const result = toTACoSigner(nonViemSigner); + const result = toTacoSigner(nonViemSigner); expect(result).toBe(nonViemSigner); }); }); diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index a5fd9a24e..cfa4c765a 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -3,9 +3,9 @@ import { ProviderLike, PublicClient, SignerLike, - TACoSigner, + TacoSigner, toEthersProvider, - toTACoSigner, + toTacoSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { SiweMessage } from 'siwe'; @@ -62,7 +62,7 @@ export class EIP4361AuthProvider implements AuthProvider { private readonly storage: LocalStorage; private readonly providerParams: EIP4361AuthProviderParams; private readonly provider: ethers.providers.Provider; - private readonly signer: TACoSigner; + private readonly signer: TacoSigner; /** * Creates a new EIP4361AuthProvider instance with ethers.js objects. @@ -119,7 +119,7 @@ export class EIP4361AuthProvider implements AuthProvider { ) { this.storage = new LocalStorage(eip4361AuthSignatureSchema); this.provider = toEthersProvider(providerLike); - this.signer = toTACoSigner(signerLike); + this.signer = toTacoSigner(signerLike); if (providerParams) { this.providerParams = providerParams; } else { diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 2c29b53ee..24fccc3e5 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -16,7 +16,7 @@ import { SignerLike, toBytes, toEthersProvider, - toTACoSigner, + toTacoSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; import { keccak256 } from 'ethers/lib/utils'; @@ -159,7 +159,7 @@ export async function encryptWithPublicKey( message = toBytes(message); } - const signer = toTACoSigner(signerLike); + const signer = toTacoSigner(signerLike); const conditionExpr = new ConditionExpression(condition); diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 6361ec628..4ccd8d9aa 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -75,7 +75,7 @@ describe('viem TACo integration', () => { .mockReturnValue(mockViemProvider); const createTacoSignerSpy = vi.spyOn( await import('@nucypher/shared'), - 'toTACoSigner', + 'toTacoSigner', ); const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); From 21417c0abe22076e8a653cb6a4de6a9a2b88b282 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Thu, 18 Sep 2025 14:11:31 -0400 Subject: [PATCH 62/97] Add longer timeout for test. --- packages/taco/test/viem-taco.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts index 4ccd8d9aa..c3158d5c5 100644 --- a/packages/taco/test/viem-taco.test.ts +++ b/packages/taco/test/viem-taco.test.ts @@ -150,6 +150,6 @@ describe('viem TACo integration', () => { // Clean up spies createTacoProviderSpy.mockRestore(); createTacoSignerSpy.mockRestore(); - }); + }, 10000); // 10s timeout }); }); From 815328da6d1b43c12efb89989b5e0f11c64da9e4 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:27:45 +0200 Subject: [PATCH 63/97] chore: keep viem peer dependency only at the shared package --- packages/taco-auth/package.json | 8 -------- packages/taco/package.json | 8 -------- pnpm-lock.yaml | 3 --- 3 files changed, 19 deletions(-) diff --git a/packages/taco-auth/package.json b/packages/taco-auth/package.json index 83e4648b0..2e68475af 100644 --- a/packages/taco-auth/package.json +++ b/packages/taco-auth/package.json @@ -47,14 +47,6 @@ "devDependencies": { "@nucypher/test-utils": "workspace:*" }, - "peerDependencies": { - "viem": "^2.0.0" - }, - "peerDependenciesMeta": { - "viem": { - "optional": true - } - }, "engines": { "node": ">=18", "pnpm": ">=8.0.0" diff --git a/packages/taco/package.json b/packages/taco/package.json index c6b5f891a..6cce4aca4 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -57,14 +57,6 @@ "modified-zod2md": "0.1.5-modified.4", "viem": "^2.0.0" }, - "peerDependencies": { - "viem": "^2.0.0" - }, - "peerDependenciesMeta": { - "viem": { - "optional": true - } - }, "engines": { "node": ">=18", "pnpm": ">=8.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 152d1b6e9..e167d6a72 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -615,9 +615,6 @@ importers: siwe: specifier: ^3.0.0 version: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - viem: - specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 From d45bab93836be14a6d7a567da5624118e5aabfa0 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Sun, 21 Sep 2025 17:37:47 +0200 Subject: [PATCH 64/97] fix: update integration test cases to handle provider and signer type compatibility + few others --- .../integration-test/encrypt-decrypt.test.ts | 14 ++--- packages/taco/test/taco.test.ts | 53 +------------------ 2 files changed, 9 insertions(+), 58 deletions(-) diff --git a/packages/taco/integration-test/encrypt-decrypt.test.ts b/packages/taco/integration-test/encrypt-decrypt.test.ts index 592f071c1..49b4e698e 100644 --- a/packages/taco/integration-test/encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/encrypt-decrypt.test.ts @@ -31,8 +31,8 @@ const CHAIN_ID = 80002; describe .skipIf(!process.env.RUNNING_IN_CI) .each< - | [string, ethers.providers.Provider, ethers.Wallet, ethers.Wallet] - | [string, PublicClient, Account, Account] + | ['ethers', ethers.providers.Provider, ethers.Wallet, ethers.Wallet] + | ['viem', PublicClient, Account, Account] >([ [ 'ethers', @@ -127,10 +127,12 @@ describe USER_ADDRESS_PARAM_DEFAULT, ) ) { - const authProvider = new EIP4361AuthProvider(provider, consumerSigner, { - domain: 'localhost', - uri: 'http://localhost:3000', - }); + const authProvider = new EIP4361AuthProvider( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + provider as any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + consumerSigner as any, + ); conditionContext.addAuthProvider( USER_ADDRESS_PARAM_DEFAULT, authProvider, diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index e42749608..cf25c2bb8 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -104,7 +104,7 @@ describe('taco', () => { expect(getRitualIdFromPublicKey).toHaveBeenCalled(); expect(getRitualSpy).toHaveBeenCalled(); expect(decryptSpy).toHaveBeenCalled(); - }, 9000); // test timeout 9s (TODO: not sure why this test takes so long on CI) + }, 15000); // test timeout 15s (TODO: not sure why this test takes so long on CI) it('exposes requested parameters', async () => { const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); @@ -138,57 +138,6 @@ describe('taco', () => { ); }); - it('should handle well when ethers provider is used with viem account', async () => { - const ethersProvider = fakeProvider(aliceSecretKeyBytes); - - // Mock viem account (no provider property, distinguishes from ethers.Signer) - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: () => Promise.resolve('0x'), - signTypedData: () => Promise.resolve('0x'), - }; - - const messageKit = await taco.encrypt( - ethersProvider, // ethers provider - domains.DEVNET, - message, - ownsNFT, - 0, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - mockViemAccount as any, // viem account - MISMATCH! - ); - - expect(messageKit).toBeDefined(); - }); - - it('should handle well when viem client is used with ethers signer', async () => { - const ethersProvider = fakeProvider(aliceSecretKeyBytes); - const ethersSigner = ethersProvider.getSigner(); - - // Mock viem client (chain property makes isViemClient return true) - const mockViemClient = { - chain: { id: 80002, name: 'polygon-amoy' }, - transport: { - type: 'http', - url: 'https://rpc.ankr.com/polygon_amoy', - }, - getChainId: () => Promise.resolve(80002), - }; - - // Should throw type mismatch error - const messageKit = await taco.encrypt( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - mockViemClient as any, // viem client - domains.DEVNET, - message, - ownsNFT, - 0, - ethersSigner, // ethers signer - MISMATCH! - ); - - expect(messageKit).toBeDefined(); - }); - describe('encryptWithPublicKey', () => { it('encrypts with ethers.Signer', async () => { const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); From aa53cee0c03c9c7df0a5e262d015379c469bcb53 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Sun, 21 Sep 2025 18:20:14 +0200 Subject: [PATCH 65/97] refactor: consolidate taco tests for ethers and viem --- packages/taco/test/taco.test.ts | 258 +++++++++++++++------------ packages/taco/test/viem-taco.test.ts | 155 ---------------- packages/test-utils/package.json | 1 + packages/test-utils/src/utils.ts | 35 ++++ pnpm-lock.yaml | 238 +++++++----------------- 5 files changed, 243 insertions(+), 444 deletions(-) delete mode 100644 packages/taco/test/viem-taco.test.ts diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index cf25c2bb8..00ab9107d 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -11,12 +11,15 @@ import { fakePorterUri, fakeProvider, fakeTDecFlow, + fakeViemAccount, + fakeViemPublicClient, mockGetRitualIdFromPublicKey, mockTacoDecrypt, TEST_CHAIN_ID, TEST_SIWE_PARAMS, } from '@nucypher/test-utils'; -import { privateKeyToAccount } from 'viem/accounts'; +import { ethers } from 'ethers'; +import type { Account, PublicClient } from 'viem'; import { beforeAll, describe, expect, it } from 'vitest'; import * as taco from '../src'; @@ -31,145 +34,168 @@ import { mockMakeSessionKey, } from './test-utils'; -// Shared test variables -const message = 'this is a secret'; +// Test fixtures +const TEST_MESSAGE = 'this is a secret'; +const TEST_NFT_CONTRACT = '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77'; +const TEST_NFT_TOKEN_ID = 3591; + const ownsNFT = new conditions.predefined.erc721.ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - parameters: [3591], + contractAddress: TEST_NFT_CONTRACT, + parameters: [TEST_NFT_TOKEN_ID], chain: TEST_CHAIN_ID, }); -describe('taco', () => { +describe('TACo SDK', () => { beforeAll(async () => { await initialize(); }); - it('encrypts and decrypts', async () => { - const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); - const mockedDkgRitual = fakeDkgRitual(mockedDkg); - const provider = fakeProvider(aliceSecretKeyBytes); - const signer = provider.getSigner(); - const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); - - const messageKit = await taco.encrypt( - provider, - domains.DEVNET, - message, - ownsNFT, - mockedDkg.ritualId, - signer, - ); - expect(getFinalizedRitualSpy).toHaveBeenCalled(); - - const { decryptionShares } = fakeTDecFlow({ - ...mockedDkg, - message: toBytes(message), - dkgPublicKey: mockedDkg.dkg.publicKey(), - thresholdMessageKit: messageKit, - }); - const { participantSecrets, participants } = await mockDkgParticipants( - mockedDkg.ritualId, - ); - const requesterSessionKey = SessionStaticSecret.random(); - const decryptSpy = mockTacoDecrypt( - mockedDkg.ritualId, - decryptionShares, - participantSecrets, - requesterSessionKey.publicKey(), - ); - const getParticipantsSpy = mockGetParticipants(participants); - const sessionKeySpy = mockMakeSessionKey(requesterSessionKey); - const getRitualIdFromPublicKey = mockGetRitualIdFromPublicKey( - mockedDkg.ritualId, - ); - const getRitualSpy = mockGetActiveRitual(mockedDkgRitual); - - const authProvider = new tacoAuth.EIP4361AuthProvider( - provider, - signer, - TEST_SIWE_PARAMS, - ); - const conditionContext = ConditionContext.fromMessageKit(messageKit); - conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, authProvider); - const decryptedMessage = await taco.decrypt( - provider, - domains.DEVNET, - messageKit, - conditionContext, - [fakePorterUri], - ); - expect(decryptedMessage).toEqual(toBytes(message)); - expect(getParticipantsSpy).toHaveBeenCalled(); - expect(sessionKeySpy).toHaveBeenCalled(); - expect(getRitualIdFromPublicKey).toHaveBeenCalled(); - expect(getRitualSpy).toHaveBeenCalled(); - expect(decryptSpy).toHaveBeenCalled(); - }, 15000); // test timeout 15s (TODO: not sure why this test takes so long on CI) - - it('exposes requested parameters', async () => { - const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); - const mockedDkgRitual = fakeDkgRitual(mockedDkg); - const provider = fakeProvider(aliceSecretKeyBytes); - const signer = provider.getSigner(); - const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); - - const customParamKey = ':nftId'; - const ownsNFTWithCustomParams = - new conditions.predefined.erc721.ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - parameters: [customParamKey], - chain: TEST_CHAIN_ID, + describe.each< + | ['ethers', () => ethers.providers.Provider, () => ethers.Signer] + | ['viem', () => PublicClient, () => Account] + >([ + [ + 'ethers', + () => fakeProvider(aliceSecretKeyBytes), + () => fakeProvider(aliceSecretKeyBytes).getSigner(), + ], + [ + 'viem', + () => fakeViemPublicClient(TEST_CHAIN_ID, 'polygon-amoy'), + () => fakeViemAccount(aliceSecretKeyBytes), + ], + ])('Provider: %s', (providerType, createProvider, createSigner) => { + it('should encrypt and decrypt a message with conditions', async () => { + // Setup + const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); + const mockedDkgRitual = fakeDkgRitual(mockedDkg); + const provider = createProvider(); + const signer = createSigner(); + const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); + + // Encrypt + const messageKit = await taco.encrypt( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + provider as any, + domains.DEVNET, + TEST_MESSAGE, + ownsNFT, + mockedDkg.ritualId, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + signer as any, + ); + expect(getFinalizedRitualSpy).toHaveBeenCalled(); + + // Setup decryption mocks + const { decryptionShares } = fakeTDecFlow({ + ...mockedDkg, + message: toBytes(TEST_MESSAGE), + dkgPublicKey: mockedDkg.dkg.publicKey(), + thresholdMessageKit: messageKit, }); + const { participantSecrets, participants } = await mockDkgParticipants( + mockedDkg.ritualId, + ); + const requesterSessionKey = SessionStaticSecret.random(); + const decryptSpy = mockTacoDecrypt( + mockedDkg.ritualId, + decryptionShares, + participantSecrets, + requesterSessionKey.publicKey(), + ); + const getParticipantsSpy = mockGetParticipants(participants); + const sessionKeySpy = mockMakeSessionKey(requesterSessionKey); + const getRitualIdFromPublicKey = mockGetRitualIdFromPublicKey( + mockedDkg.ritualId, + ); + const getRitualSpy = mockGetActiveRitual(mockedDkgRitual); - const messageKit = await taco.encrypt( - provider, - domains.DEVNET, - message, - ownsNFTWithCustomParams, - mockedDkg.ritualId, - signer, - ); - expect(getFinalizedRitualSpy).toHaveBeenCalled(); - - const conditionContext = ConditionContext.fromMessageKit(messageKit); - const requestedParameters = conditionContext.requestedContextParameters; - expect(requestedParameters).toEqual( - new Set([customParamKey, USER_ADDRESS_PARAM_DEFAULT]), - ); - }); + // Setup authentication + const authProvider = new tacoAuth.EIP4361AuthProvider( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + provider as any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + signer as any, + TEST_SIWE_PARAMS, + ); + const conditionContext = ConditionContext.fromMessageKit(messageKit); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); - describe('encryptWithPublicKey', () => { - it('encrypts with ethers.Signer', async () => { - const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); - const provider = fakeProvider(aliceSecretKeyBytes); - const signer = provider.getSigner(); + // Decrypt + const decryptedMessage = await taco.decrypt( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + provider as any, + domains.DEVNET, + messageKit, + conditionContext, + [fakePorterUri], + ); - const messageKit = await taco.encryptWithPublicKey( - message, - ownsNFT, - mockedDkg.dkg.publicKey(), - signer, + // Verify + expect(decryptedMessage).toEqual(toBytes(TEST_MESSAGE)); + expect(getParticipantsSpy).toHaveBeenCalled(); + expect(sessionKeySpy).toHaveBeenCalled(); + expect(getRitualIdFromPublicKey).toHaveBeenCalled(); + expect(getRitualSpy).toHaveBeenCalled(); + expect(decryptSpy).toHaveBeenCalled(); + }, 15000); // Extended timeout for CI + + it('should handle custom condition parameters', async () => { + // Setup + const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); + const mockedDkgRitual = fakeDkgRitual(mockedDkg); + const provider = createProvider(); + const signer = createSigner(); + const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); + + // Create condition with custom parameter + const customParamKey = ':nftId'; + const ownsNFTWithCustomParams = + new conditions.predefined.erc721.ERC721Ownership({ + contractAddress: TEST_NFT_CONTRACT, + parameters: [customParamKey], + chain: TEST_CHAIN_ID, + }); + + // Encrypt with custom condition + const messageKit = await taco.encrypt( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + provider as any, + domains.DEVNET, + TEST_MESSAGE, + ownsNFTWithCustomParams, + mockedDkg.ritualId, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + signer as any, ); + expect(getFinalizedRitualSpy).toHaveBeenCalled(); - expect(messageKit).toBeDefined(); - expect(messageKit).toBeInstanceOf(Object); + // Verify parameters are exposed + const conditionContext = ConditionContext.fromMessageKit(messageKit); + const requestedParameters = conditionContext.requestedContextParameters; + expect(requestedParameters).toEqual( + new Set([customParamKey, USER_ADDRESS_PARAM_DEFAULT]), + ); }); - it('encrypts with viem Account', async () => { + it('should encrypt with public key directly', async () => { + // Setup const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); + const signer = createSigner(); - // Mock viem account - const privateKey = - '0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'; - const viemAccount = privateKeyToAccount(privateKey); + // Encrypt with public key const messageKit = await taco.encryptWithPublicKey( - message, + TEST_MESSAGE, ownsNFT, mockedDkg.dkg.publicKey(), // eslint-disable-next-line @typescript-eslint/no-explicit-any - viemAccount, + signer as any, ); + // Verify expect(messageKit).toBeDefined(); expect(messageKit).toBeInstanceOf(Object); }); diff --git a/packages/taco/test/viem-taco.test.ts b/packages/taco/test/viem-taco.test.ts deleted file mode 100644 index c3158d5c5..000000000 --- a/packages/taco/test/viem-taco.test.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { - FerveoVariant, - initialize, - SessionStaticSecret, -} from '@nucypher/nucypher-core'; -import * as tacoAuth from '@nucypher/taco-auth'; -import { USER_ADDRESS_PARAM_DEFAULT } from '@nucypher/taco-auth'; -import { - aliceSecretKeyBytes, - fakeDkgFlow, - fakePorterUri, - fakeProvider, - fakeTDecFlow, - mockGetRitualIdFromPublicKey, - mockTacoDecrypt, - TEST_CHAIN_ID, - TEST_SIWE_PARAMS, -} from '@nucypher/test-utils'; -import { privateKeyToAccount } from 'viem/accounts'; -import { beforeAll, describe, expect, it, vi } from 'vitest'; - -import { conditions, domains, toBytes } from '../src'; -import { ConditionContext } from '../src/conditions/context'; -import { decrypt, encrypt } from '../src/taco'; - -import { - fakeDkgRitual, - mockDkgParticipants, - mockGetActiveRitual, - mockGetParticipants, - mockMakeSessionKey, -} from './test-utils'; - -// Shared test variables -const message = 'this is a secret viem message'; -const ownsNFT = new conditions.predefined.erc721.ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - parameters: [3591], - chain: TEST_CHAIN_ID, -}); - -describe('viem TACo integration', () => { - beforeAll(async () => { - await initialize(); - }); - - describe('TACo encryption/decryption workflow', () => { - it('encrypts and decrypts using viem functions', async () => { - const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); - const mockedDkgRitual = fakeDkgRitual(mockedDkg); - - // Mock the viem clients with more complete interfaces - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x'), - getNetwork: vi - .fn() - .mockResolvedValue({ chainId: 80002, name: 'polygon-amoy' }), - readContract: vi.fn().mockResolvedValue('0x'), - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any; - - const privateKey = - '0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'; - const viemAccount = privateKeyToAccount(privateKey); - - const mockViemProvider = { - ...fakeProvider(aliceSecretKeyBytes), - publicClient: mockViemPublicClient, // Add the required viem property - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } as any; - - const createTacoProviderSpy = vi - .spyOn(await import('@nucypher/shared'), 'toEthersProvider') - .mockReturnValue(mockViemProvider); - const createTacoSignerSpy = vi.spyOn( - await import('@nucypher/shared'), - 'toTacoSigner', - ); - - const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); - - // Test encryption - const messageKit = await encrypt( - mockViemPublicClient, - domains.DEVNET, - message, - ownsNFT, - mockedDkg.ritualId, - viemAccount, - ); - - expect(createTacoProviderSpy).toHaveBeenCalledWith(mockViemPublicClient); - expect(createTacoSignerSpy).toHaveBeenCalledWith(viemAccount); - expect(getFinalizedRitualSpy).toHaveBeenCalled(); - expect(messageKit).toBeDefined(); - - // Setup decryption mocks - const { decryptionShares } = fakeTDecFlow({ - ...mockedDkg, - message: toBytes(message), - dkgPublicKey: mockedDkg.dkg.publicKey(), - thresholdMessageKit: messageKit, - }); - const { participantSecrets, participants } = await mockDkgParticipants( - mockedDkg.ritualId, - ); - const requesterSessionKey = SessionStaticSecret.random(); - const decryptSpy = mockTacoDecrypt( - mockedDkg.ritualId, - decryptionShares, - participantSecrets, - requesterSessionKey.publicKey(), - ); - const getParticipantsSpy = mockGetParticipants(participants); - const sessionKeySpy = mockMakeSessionKey(requesterSessionKey); - const getRitualIdFromPublicKey = mockGetRitualIdFromPublicKey( - mockedDkg.ritualId, - ); - const getRitualSpy = mockGetActiveRitual(mockedDkgRitual); - - const authProvider = new tacoAuth.EIP4361AuthProvider( - mockViemProvider, - viemAccount, - TEST_SIWE_PARAMS, - ); - - const conditionContext = ConditionContext.fromMessageKit(messageKit); - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - authProvider, - ); - - // Test decryption - const decryptedMessage = await decrypt( - mockViemPublicClient, - domains.DEVNET, - messageKit, - conditionContext, - [fakePorterUri], - ); - - expect(decryptedMessage).toEqual(toBytes(message)); - expect(getParticipantsSpy).toHaveBeenCalled(); - expect(sessionKeySpy).toHaveBeenCalled(); - expect(getRitualIdFromPublicKey).toHaveBeenCalled(); - expect(getRitualSpy).toHaveBeenCalled(); - expect(decryptSpy).toHaveBeenCalled(); - - // Clean up spies - createTacoProviderSpy.mockRestore(); - createTacoSignerSpy.mockRestore(); - }, 10000); // 10s timeout - }); -}); diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 1295e2594..e91f482d2 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -34,6 +34,7 @@ "@nucypher/taco-auth": "workspace:*", "axios": "^1.11.0", "ethers": "^5.8.0", + "viem": "^2.0.0", "vitest": "^3.0.9" }, "engines": { diff --git a/packages/test-utils/src/utils.ts b/packages/test-utils/src/utils.ts index dc328f23c..11c002468 100644 --- a/packages/test-utils/src/utils.ts +++ b/packages/test-utils/src/utils.ts @@ -45,6 +45,7 @@ import { SingleSignOnEIP4361AuthProvider, } from '@nucypher/taco-auth'; import { ethers, providers, Wallet } from 'ethers'; +import { privateKeyToAccount } from 'viem/accounts'; import { expect, MockInstance, vi } from 'vitest'; import { TEST_CONTRACT_ADDR, TEST_SIWE_PARAMS } from './variables'; @@ -99,6 +100,40 @@ export const fakeProvider = ( } as unknown as ethers.providers.Web3Provider; }; +// Viem test utilities +export const fakeViemPublicClient = ( + chainId = 80002, + chainName = 'polygon-amoy', +) => { + return { + chain: { id: chainId, name: chainName }, + transport: { + type: 'custom', + value: { + provider: { + request: vi.fn().mockImplementation(async ({ method, params }) => { + // Network detection calls + if (method === 'eth_chainId') { + return `0x${chainId.toString(16)}`; + } + // Default response for other calls + return null; + }), + }, + }, + }, + getNetwork: vi.fn().mockResolvedValue({ chainId, name: chainName }), + } as any; +}; + +export const fakeViemAccount = ( + secretKeyBytes = SecretKey.random().toBEBytes(), +) => { + // Convert bytes to hex string for viem + const privateKey = `0x${Buffer.from(secretKeyBytes).toString('hex')}`; + return privateKeyToAccount(privateKey as `0x${string}`); +}; + export const fakeAuthProviders = async ( signer?: ethers.providers.JsonRpcSigner, ) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e167d6a72..421ba0e06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -104,7 +104,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -128,7 +128,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -144,7 +144,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -156,16 +156,16 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9(webpack-cli@6.0.1)) + version: 5.6.3(webpack@5.99.9) process: specifier: ^0.11.10 version: 0.11.10 @@ -213,7 +213,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -229,7 +229,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -241,13 +241,13 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9(webpack-cli@6.0.1)) + version: 5.6.3(webpack@5.99.9) react-refresh: specifier: ^0.17.0 version: 0.17.0 @@ -351,10 +351,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -473,10 +473,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) webpack: specifier: ^5.99.9 version: 5.101.3(webpack-cli@6.0.1) @@ -640,9 +640,12 @@ importers: ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + viem: + specifier: ^2.0.0 + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) packages: @@ -18193,12 +18196,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: type-fest: 0.21.3 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': + '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: anser: 2.3.2 core-js-pure: 3.41.0 @@ -19044,7 +19047,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -19059,7 +19062,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -19179,17 +19182,17 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) @@ -19589,7 +19592,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) babel-plugin-istanbul@6.1.1: dependencies: @@ -20338,7 +20341,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.0(webpack@5.99.9(webpack-cli@6.0.1)): + copy-webpack-plugin@13.0.0(webpack@5.99.9): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 @@ -20486,7 +20489,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) css-minimizer-webpack-plugin@3.4.1(webpack@5.101.3): dependencies: @@ -20496,7 +20499,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) css-prefers-color-scheme@6.0.3(postcss@8.5.3): dependencies: @@ -21067,7 +21070,7 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.99.9(webpack-cli@6.0.1)): + esbuild-loader@2.21.0(webpack@5.99.9): dependencies: esbuild: 0.16.17 joycon: 3.1.1 @@ -21191,7 +21194,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -21209,8 +21212,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -21265,21 +21268,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 - eslint: 8.57.0 - get-tsconfig: 4.10.0 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.12 - unrs-resolver: 1.3.2 - optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 @@ -21291,7 +21279,7 @@ snapshots: tinyglobby: 0.2.12 unrs-resolver: 1.3.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -21305,28 +21293,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 @@ -21380,36 +21357,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - 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: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) - 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 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -21420,7 +21368,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -21432,7 +21380,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -21614,7 +21562,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) eslint@8.57.0: dependencies: @@ -21918,17 +21866,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.99.9(webpack-cli@6.0.1)): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.99.9): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) file-uri-to-path@1.0.0: {} @@ -22041,7 +21983,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.8.2 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: eslint: 8.57.1 @@ -22428,16 +22370,6 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-webpack-plugin@5.6.3(webpack@5.99.9(webpack-cli@6.0.1)): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) - html-webpack-plugin@5.6.3(webpack@5.99.9): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -22446,7 +22378,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) htmlparser2@6.1.0: dependencies: @@ -23748,7 +23680,7 @@ snapshots: dependencies: schema-utils: 4.3.0 tapable: 2.2.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} @@ -24428,7 +24360,7 @@ snapshots: klona: 2.0.6 postcss: 8.5.3 semver: 7.7.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) postcss-logical@5.0.4(postcss@8.5.3): dependencies: @@ -24870,7 +24802,7 @@ snapshots: shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -24942,7 +24874,7 @@ snapshots: style-loader: 3.3.4(webpack@5.99.9) tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) terser-webpack-plugin: 5.3.14(webpack@5.99.9) - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) webpack-manifest-plugin: 4.1.1(webpack@5.99.9) workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) @@ -25288,7 +25220,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) sax@1.2.4: {} @@ -25568,7 +25500,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) source-map-support@0.5.21: dependencies: @@ -25819,7 +25751,7 @@ snapshots: style-loader@3.3.4(webpack@5.101.3): dependencies: - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) styled-jsx@5.1.6(react@18.3.1): dependencies: @@ -25947,15 +25879,6 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.99.9(webpack-cli@6.0.1)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.0 - serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.99.9(webpack-cli@6.0.1) - terser-webpack-plugin@5.3.14(webpack@5.99.9): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -25963,7 +25886,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) terser@5.39.0: dependencies: @@ -26443,7 +26366,7 @@ snapshots: terser: 5.39.0 yaml: 2.7.0 - vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -26482,7 +26405,7 @@ snapshots: - tsx - yaml - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -26565,9 +26488,9 @@ snapshots: webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -26588,9 +26511,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) - webpack-dev-middleware@7.4.2(webpack@5.99.9(webpack-cli@6.0.1)): + webpack-dev-middleware@7.4.2(webpack@5.99.9): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -26634,7 +26557,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) transitivePeerDependencies: - bufferutil - debug @@ -26669,7 +26592,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.99.9(webpack-cli@6.0.1)) + webpack-dev-middleware: 7.4.2(webpack@5.99.9) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1) @@ -26683,7 +26606,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.101.3): dependencies: tapable: 2.2.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 2.3.1 webpack-merge@6.0.1: @@ -26704,37 +26627,6 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.99.9: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.4 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.6.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.99.9) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - webpack@5.99.9(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 @@ -26758,7 +26650,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.99.9(webpack-cli@6.0.1)) + terser-webpack-plugin: 5.3.14(webpack@5.99.9) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -26985,7 +26877,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: From 0dbb2fbae8020a8b42ebba9899d7a6a2b9457198 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Sun, 21 Sep 2025 19:32:59 +0200 Subject: [PATCH 66/97] test: add ENS registry tests for viem to ethers provider --- .../shared/test/viem-ethers-adapter.test.ts | 2 +- .../viem-to-ethers-ens.test.ts | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 packages/taco/integration-test/viem-to-ethers-ens.test.ts diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index fdc9ff4c3..cdba8d144 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -38,7 +38,7 @@ describe('viem ethers adapter', () => { expect(provider.connection.url).toBe('https://rpc.ankr.com/polygon_amoy'); expect(provider.network.chainId).toBe(80002); expect(provider.network.name).toBe('Polygon Amoy'); - // TODO: ensRegistry? + expect(provider.network.ensAddress).toBe('0x123'); }); it('should throw error when converting to ethers provider with fallback transport', () => { diff --git a/packages/taco/integration-test/viem-to-ethers-ens.test.ts b/packages/taco/integration-test/viem-to-ethers-ens.test.ts new file mode 100644 index 000000000..63b1d2f96 --- /dev/null +++ b/packages/taco/integration-test/viem-to-ethers-ens.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, test } from 'vitest'; + +import { toEthersProvider } from '@nucypher/shared'; +import { createPublicClient, http } from 'viem'; +import { mainnet } from 'viem/chains'; + +describe.skipIf(!process.env.RUNNING_IN_CI)('Viem-Ethers Adapter Integration Tests', () => { + describe('ENS Registry', () => { + test('should properly read ENS registry contract address from viem client converted to ethers provider', async () => { + // Test with chain that has ENS registry (mainnet) + // Note: mainnet from viem/chains includes ENS registry configuration + const mainnetViemClient = createPublicClient({ + chain: mainnet, + transport: http('https://eth.llamarpc.com'), + }); + + // Convert to ethers provider to verify ENS address mapping + const ethersProvider = toEthersProvider(mainnetViemClient); + + // Verify ENS registry is properly mapped from viem chain configuration + const expectedEnsAddress = mainnet.contracts?.ensRegistry?.address; + expect(ethersProvider.network.ensAddress).toBe(expectedEnsAddress); + // Also verify it's the known mainnet ENS registry address + expect(ethersProvider.network.ensAddress).toBe( + '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', + ); + + // Test actual ENS name resolution to verify functionality + const resolvedAddress = await ethersProvider.resolveName('vitalik.eth'); + expect(resolvedAddress).toBeTruthy(); + // Currently vitalik.eth is "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045". + // But it may change in the future. So we only check if it's a valid Ethereum address. + expect(resolvedAddress).toMatch(/^0x[a-fA-F0-9]{40}$/); // Valid Ethereum address format + }); + }); +}); From 853e45d6842974a6f7c8539fa1f608978c24f778 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 22 Sep 2025 21:57:31 +0200 Subject: [PATCH 67/97] fix: support viem WalletClient in signer adapter and improve EIP-1193 provider handling + add react-viem example --- examples/taco/react-viem/README.md | 17 ++ examples/taco/react-viem/package.json | 42 +++++ examples/taco/react-viem/public/favicon.ico | Bin 0 -> 3870 bytes examples/taco/react-viem/public/index.html | 43 +++++ examples/taco/react-viem/public/logo192.png | Bin 0 -> 5347 bytes examples/taco/react-viem/public/logo512.png | Bin 0 -> 9664 bytes examples/taco/react-viem/public/manifest.json | 25 +++ examples/taco/react-viem/public/robots.txt | 3 + examples/taco/react-viem/src/App.tsx | 164 ++++++++++++++++++ examples/taco/react-viem/src/hooks/useTaco.ts | 104 +++++++++++ examples/taco/react-viem/src/index.css | 7 + examples/taco/react-viem/src/index.tsx | 14 ++ .../taco/react-viem/src/react-app-env.d.ts | 8 + examples/taco/react-viem/tsconfig.build.json | 14 ++ examples/taco/react-viem/tsconfig.json | 20 +++ packages/shared/src/adapters.ts | 4 +- packages/shared/src/types.ts | 4 +- packages/shared/src/viem/ethers-adapter.ts | 2 +- packages/shared/src/viem/signer-adapter.ts | 42 ++++- packages/shared/src/viem/type-guards.ts | 34 ++-- packages/shared/src/viem/types.ts | 28 ++- .../shared/test/viem-ethers-adapter.test.ts | 14 +- .../src/providers/eip4361/eip4361.ts | 4 +- packages/taco/src/taco.ts | 10 +- 24 files changed, 559 insertions(+), 44 deletions(-) create mode 100644 examples/taco/react-viem/README.md create mode 100644 examples/taco/react-viem/package.json create mode 100644 examples/taco/react-viem/public/favicon.ico create mode 100644 examples/taco/react-viem/public/index.html create mode 100644 examples/taco/react-viem/public/logo192.png create mode 100644 examples/taco/react-viem/public/logo512.png create mode 100644 examples/taco/react-viem/public/manifest.json create mode 100644 examples/taco/react-viem/public/robots.txt create mode 100644 examples/taco/react-viem/src/App.tsx create mode 100644 examples/taco/react-viem/src/hooks/useTaco.ts create mode 100644 examples/taco/react-viem/src/index.css create mode 100644 examples/taco/react-viem/src/index.tsx create mode 100644 examples/taco/react-viem/src/react-app-env.d.ts create mode 100644 examples/taco/react-viem/tsconfig.build.json create mode 100644 examples/taco/react-viem/tsconfig.json diff --git a/examples/taco/react-viem/README.md b/examples/taco/react-viem/README.md new file mode 100644 index 000000000..575fbc572 --- /dev/null +++ b/examples/taco/react-viem/README.md @@ -0,0 +1,17 @@ +# `react-viem-taco` integration example + +Shows how to integrate `@nucypher/taco` into a React application using viem. +## Usage + +```bash +pnpm install +pnpm start +``` + +Next, go to [http://127.0.0.1:3000/](http://127.0.0.1:8080/) in your browser and +inspect the UI and the JS console. + +## Learn more + +Please find developer documentation for +TACo [here](https://docs.taco.build/). diff --git a/examples/taco/react-viem/package.json b/examples/taco/react-viem/package.json new file mode 100644 index 000000000..c0e4b13a7 --- /dev/null +++ b/examples/taco/react-viem/package.json @@ -0,0 +1,42 @@ +{ + "name": "taco-react-example", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "react-scripts build", + "check": "pnpm type-check && pnpm build", + "eject": "react-scripts eject", + "start": "react-scripts start", + "test": "react-scripts test", + "type-check": "tsc -p tsconfig.build.json" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "dependencies": { + "@nucypher/shared": "workspace:*", + "@nucypher/taco": "workspace:*", + "@nucypher/taco-auth": "workspace:*", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/node": "^20.17.28", + "@types/react": "^18.3.20", + "@types/react-dom": "^18.3.5", + "react-scripts": "^5.0.1" + }, + "peerDependencies": { + "ethers": "^5.7.2", + "viem": "^2.0.0" + } +} diff --git a/examples/taco/react-viem/public/favicon.ico b/examples/taco/react-viem/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a GIT binary patch literal 3870 zcma);c{J4h9>;%nil|2-o+rCuEF-(I%-F}ijC~o(k~HKAkr0)!FCj~d>`RtpD?8b; zXOC1OD!V*IsqUwzbMF1)-gEDD=A573Z-&G7^LoAC9|WO7Xc0Cx1g^Zu0u_SjAPB3vGa^W|sj)80f#V0@M_CAZTIO(t--xg= z!sii`1giyH7EKL_+Wi0ab<)&E_0KD!3Rp2^HNB*K2@PHCs4PWSA32*-^7d{9nH2_E zmC{C*N*)(vEF1_aMamw2A{ZH5aIDqiabnFdJ|y0%aS|64E$`s2ccV~3lR!u<){eS` z#^Mx6o(iP1Ix%4dv`t@!&Za-K@mTm#vadc{0aWDV*_%EiGK7qMC_(`exc>-$Gb9~W!w_^{*pYRm~G zBN{nA;cm^w$VWg1O^^<6vY`1XCD|s_zv*g*5&V#wv&s#h$xlUilPe4U@I&UXZbL z0)%9Uj&@yd03n;!7do+bfixH^FeZ-Ema}s;DQX2gY+7g0s(9;`8GyvPY1*vxiF&|w z>!vA~GA<~JUqH}d;DfBSi^IT*#lrzXl$fNpq0_T1tA+`A$1?(gLb?e#0>UELvljtQ zK+*74m0jn&)5yk8mLBv;=@}c{t0ztT<v;Avck$S6D`Z)^c0(jiwKhQsn|LDRY&w(Fmi91I7H6S;b0XM{e zXp0~(T@k_r-!jkLwd1_Vre^v$G4|kh4}=Gi?$AaJ)3I+^m|Zyj#*?Kp@w(lQdJZf4 z#|IJW5z+S^e9@(6hW6N~{pj8|NO*>1)E=%?nNUAkmv~OY&ZV;m-%?pQ_11)hAr0oAwILrlsGawpxx4D43J&K=n+p3WLnlDsQ$b(9+4 z?mO^hmV^F8MV{4Lx>(Q=aHhQ1){0d*(e&s%G=i5rq3;t{JC zmgbn5Nkl)t@fPH$v;af26lyhH!k+#}_&aBK4baYPbZy$5aFx4}ka&qxl z$=Rh$W;U)>-=S-0=?7FH9dUAd2(q#4TCAHky!$^~;Dz^j|8_wuKc*YzfdAht@Q&ror?91Dm!N03=4=O!a)I*0q~p0g$Fm$pmr$ zb;wD;STDIi$@M%y1>p&_>%?UP($15gou_ue1u0!4(%81;qcIW8NyxFEvXpiJ|H4wz z*mFT(qVx1FKufG11hByuX%lPk4t#WZ{>8ka2efjY`~;AL6vWyQKpJun2nRiZYDij$ zP>4jQXPaP$UC$yIVgGa)jDV;F0l^n(V=HMRB5)20V7&r$jmk{UUIe zVjKroK}JAbD>B`2cwNQ&GDLx8{pg`7hbA~grk|W6LgiZ`8y`{Iq0i>t!3p2}MS6S+ zO_ruKyAElt)rdS>CtF7j{&6rP-#c=7evGMt7B6`7HG|-(WL`bDUAjyn+k$mx$CH;q2Dz4x;cPP$hW=`pFfLO)!jaCL@V2+F)So3}vg|%O*^T1j>C2lx zsURO-zIJC$^$g2byVbRIo^w>UxK}74^TqUiRR#7s_X$e)$6iYG1(PcW7un-va-S&u zHk9-6Zn&>T==A)lM^D~bk{&rFzCi35>UR!ZjQkdSiNX*-;l4z9j*7|q`TBl~Au`5& z+c)*8?#-tgUR$Zd%Q3bs96w6k7q@#tUn`5rj+r@_sAVVLqco|6O{ILX&U-&-cbVa3 zY?ngHR@%l{;`ri%H*0EhBWrGjv!LE4db?HEWb5mu*t@{kv|XwK8?npOshmzf=vZA@ zVSN9sL~!sn?r(AK)Q7Jk2(|M67Uy3I{eRy z_l&Y@A>;vjkWN5I2xvFFTLX0i+`{qz7C_@bo`ZUzDugfq4+>a3?1v%)O+YTd6@Ul7 zAfLfm=nhZ`)P~&v90$&UcF+yXm9sq!qCx3^9gzIcO|Y(js^Fj)Rvq>nQAHI92ap=P z10A4@prk+AGWCb`2)dQYFuR$|H6iDE8p}9a?#nV2}LBCoCf(Xi2@szia7#gY>b|l!-U`c}@ zLdhvQjc!BdLJvYvzzzngnw51yRYCqh4}$oRCy-z|v3Hc*d|?^Wj=l~18*E~*cR_kU z{XsxM1i{V*4GujHQ3DBpl2w4FgFR48Nma@HPgnyKoIEY-MqmMeY=I<%oG~l!f<+FN z1ZY^;10j4M4#HYXP zw5eJpA_y(>uLQ~OucgxDLuf}fVs272FaMxhn4xnDGIyLXnw>Xsd^J8XhcWIwIoQ9} z%FoSJTAGW(SRGwJwb=@pY7r$uQRK3Zd~XbxU)ts!4XsJrCycrWSI?e!IqwqIR8+Jh zlRjZ`UO1I!BtJR_2~7AbkbSm%XQqxEPkz6BTGWx8e}nQ=w7bZ|eVP4?*Tb!$(R)iC z9)&%bS*u(lXqzitAN)Oo=&Ytn>%Hzjc<5liuPi>zC_nw;Z0AE3Y$Jao_Q90R-gl~5 z_xAb2J%eArrC1CN4G$}-zVvCqF1;H;abAu6G*+PDHSYFx@Tdbfox*uEd3}BUyYY-l zTfEsOqsi#f9^FoLO;ChK<554qkri&Av~SIM*{fEYRE?vH7pTAOmu2pz3X?Wn*!ROX ztd54huAk&mFBemMooL33RV-*1f0Q3_(7hl$<#*|WF9P!;r;4_+X~k~uKEqdzZ$5Al zV63XN@)j$FN#cCD;ek1R#l zv%pGrhB~KWgoCj%GT?%{@@o(AJGt*PG#l3i>lhmb_twKH^EYvacVY-6bsCl5*^~L0 zonm@lk2UvvTKr2RS%}T>^~EYqdL1q4nD%0n&Xqr^cK^`J5W;lRRB^R-O8b&HENO||mo0xaD+S=I8RTlIfVgqN@SXDr2&-)we--K7w= zJVU8?Z+7k9dy;s;^gDkQa`0nz6N{T?(A&Iz)2!DEecLyRa&FI!id#5Z7B*O2=PsR0 zEvc|8{NS^)!d)MDX(97Xw}m&kEO@5jqRaDZ!+%`wYOI<23q|&js`&o4xvjP7D_xv@ z5hEwpsp{HezI9!~6O{~)lLR@oF7?J7i>1|5a~UuoN=q&6N}EJPV_GD`&M*v8Y`^2j zKII*d_@Fi$+i*YEW+Hbzn{iQk~yP z>7N{S4)r*!NwQ`(qcN#8SRQsNK6>{)X12nbF`*7#ecO7I)Q$uZsV+xS4E7aUn+U(K baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ literal 0 HcmV?d00001 diff --git a/examples/taco/react-viem/public/index.html b/examples/taco/react-viem/public/index.html new file mode 100644 index 000000000..e65acb3de --- /dev/null +++ b/examples/taco/react-viem/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + React App + + + +
+ + + diff --git a/examples/taco/react-viem/public/logo192.png b/examples/taco/react-viem/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 GIT binary patch literal 5347 zcmZWtbyO6NvR-oO24RV%BvuJ&=?+<7=`LvyB&A_#M7mSDYw1v6DJkiYl9XjT!%$dLEBTQ8R9|wd3008in6lFF3GV-6mLi?MoP_y~}QUnaDCHI#t z7w^m$@6DI)|C8_jrT?q=f8D?0AM?L)Z}xAo^e^W>t$*Y0KlT5=@bBjT9kxb%-KNdk zeOS1tKO#ChhG7%{ApNBzE2ZVNcxbrin#E1TiAw#BlUhXllzhN$qWez5l;h+t^q#Eav8PhR2|T}y5kkflaK`ba-eoE+Z2q@o6P$)=&` z+(8}+-McnNO>e#$Rr{32ngsZIAX>GH??tqgwUuUz6kjns|LjsB37zUEWd|(&O!)DY zQLrq%Y>)Y8G`yYbYCx&aVHi@-vZ3|ebG!f$sTQqMgi0hWRJ^Wc+Ibv!udh_r%2|U) zPi|E^PK?UE!>_4`f`1k4hqqj_$+d!EB_#IYt;f9)fBOumGNyglU(ofY`yHq4Y?B%- zp&G!MRY<~ajTgIHErMe(Z8JG*;D-PJhd@RX@QatggM7+G(Lz8eZ;73)72Hfx5KDOE zkT(m}i2;@X2AT5fW?qVp?@WgN$aT+f_6eo?IsLh;jscNRp|8H}Z9p_UBO^SJXpZew zEK8fz|0Th%(Wr|KZBGTM4yxkA5CFdAj8=QSrT$fKW#tweUFqr0TZ9D~a5lF{)%-tTGMK^2tz(y2v$i%V8XAxIywrZCp=)83p(zIk6@S5AWl|Oa2hF`~~^W zI;KeOSkw1O#TiQ8;U7OPXjZM|KrnN}9arP)m0v$c|L)lF`j_rpG(zW1Qjv$=^|p*f z>)Na{D&>n`jOWMwB^TM}slgTEcjxTlUby89j1)|6ydRfWERn3|7Zd2&e7?!K&5G$x z`5U3uFtn4~SZq|LjFVrz$3iln-+ucY4q$BC{CSm7Xe5c1J<=%Oagztj{ifpaZk_bQ z9Sb-LaQMKp-qJA*bP6DzgE3`}*i1o3GKmo2pn@dj0;He}F=BgINo};6gQF8!n0ULZ zL>kC0nPSFzlcB7p41doao2F7%6IUTi_+!L`MM4o*#Y#0v~WiO8uSeAUNp=vA2KaR&=jNR2iVwG>7t%sG2x_~yXzY)7K& zk3p+O0AFZ1eu^T3s};B%6TpJ6h-Y%B^*zT&SN7C=N;g|#dGIVMSOru3iv^SvO>h4M=t-N1GSLLDqVTcgurco6)3&XpU!FP6Hlrmj}f$ zp95;b)>M~`kxuZF3r~a!rMf4|&1=uMG$;h^g=Kl;H&Np-(pFT9FF@++MMEx3RBsK?AU0fPk-#mdR)Wdkj)`>ZMl#^<80kM87VvsI3r_c@_vX=fdQ`_9-d(xiI z4K;1y1TiPj_RPh*SpDI7U~^QQ?%0&!$Sh#?x_@;ag)P}ZkAik{_WPB4rHyW#%>|Gs zdbhyt=qQPA7`?h2_8T;-E6HI#im9K>au*(j4;kzwMSLgo6u*}-K`$_Gzgu&XE)udQ zmQ72^eZd|vzI)~!20JV-v-T|<4@7ruqrj|o4=JJPlybwMg;M$Ud7>h6g()CT@wXm` zbq=A(t;RJ^{Xxi*Ff~!|3!-l_PS{AyNAU~t{h;(N(PXMEf^R(B+ZVX3 z8y0;0A8hJYp@g+c*`>eTA|3Tgv9U8#BDTO9@a@gVMDxr(fVaEqL1tl?md{v^j8aUv zm&%PX4^|rX|?E4^CkplWWNv*OKM>DxPa z!RJ)U^0-WJMi)Ksc!^ixOtw^egoAZZ2Cg;X7(5xZG7yL_;UJ#yp*ZD-;I^Z9qkP`} zwCTs0*%rIVF1sgLervtnUo&brwz?6?PXRuOCS*JI-WL6GKy7-~yi0giTEMmDs_-UX zo=+nFrW_EfTg>oY72_4Z0*uG>MnXP=c0VpT&*|rvv1iStW;*^={rP1y?Hv+6R6bxFMkxpWkJ>m7Ba{>zc_q zEefC3jsXdyS5??Mz7IET$Kft|EMNJIv7Ny8ZOcKnzf`K5Cd)&`-fTY#W&jnV0l2vt z?Gqhic}l}mCv1yUEy$%DP}4AN;36$=7aNI^*AzV(eYGeJ(Px-j<^gSDp5dBAv2#?; zcMXv#aj>%;MiG^q^$0MSg-(uTl!xm49dH!{X0){Ew7ThWV~Gtj7h%ZD zVN-R-^7Cf0VH!8O)uUHPL2mO2tmE*cecwQv_5CzWeh)ykX8r5Hi`ehYo)d{Jnh&3p z9ndXT$OW51#H5cFKa76c<%nNkP~FU93b5h-|Cb}ScHs@4Q#|}byWg;KDMJ#|l zE=MKD*F@HDBcX@~QJH%56eh~jfPO-uKm}~t7VkHxHT;)4sd+?Wc4* z>CyR*{w@4(gnYRdFq=^(#-ytb^5ESD?x<0Skhb%Pt?npNW1m+Nv`tr9+qN<3H1f<% zZvNEqyK5FgPsQ`QIu9P0x_}wJR~^CotL|n zk?dn;tLRw9jJTur4uWoX6iMm914f0AJfB@C74a;_qRrAP4E7l890P&{v<}>_&GLrW z)klculcg`?zJO~4;BBAa=POU%aN|pmZJn2{hA!d!*lwO%YSIzv8bTJ}=nhC^n}g(ld^rn#kq9Z3)z`k9lvV>y#!F4e{5c$tnr9M{V)0m(Z< z#88vX6-AW7T2UUwW`g<;8I$Jb!R%z@rCcGT)-2k7&x9kZZT66}Ztid~6t0jKb&9mm zpa}LCb`bz`{MzpZR#E*QuBiZXI#<`5qxx=&LMr-UUf~@dRk}YI2hbMsAMWOmDzYtm zjof16D=mc`^B$+_bCG$$@R0t;e?~UkF?7<(vkb70*EQB1rfUWXh$j)R2)+dNAH5%R zEBs^?N;UMdy}V};59Gu#0$q53$}|+q7CIGg_w_WlvE}AdqoS<7DY1LWS9?TrfmcvT zaypmplwn=P4;a8-%l^e?f`OpGb}%(_mFsL&GywhyN(-VROj`4~V~9bGv%UhcA|YW% zs{;nh@aDX11y^HOFXB$a7#Sr3cEtNd4eLm@Y#fc&j)TGvbbMwze zXtekX_wJqxe4NhuW$r}cNy|L{V=t#$%SuWEW)YZTH|!iT79k#?632OFse{+BT_gau zJwQcbH{b}dzKO?^dV&3nTILYlGw{27UJ72ZN){BILd_HV_s$WfI2DC<9LIHFmtyw? zQ;?MuK7g%Ym+4e^W#5}WDLpko%jPOC=aN)3!=8)s#Rnercak&b3ESRX3z{xfKBF8L z5%CGkFmGO@x?_mPGlpEej!3!AMddChabyf~nJNZxx!D&{@xEb!TDyvqSj%Y5@A{}9 zRzoBn0?x}=krh{ok3Nn%e)#~uh;6jpezhA)ySb^b#E>73e*frBFu6IZ^D7Ii&rsiU z%jzygxT-n*joJpY4o&8UXr2s%j^Q{?e-voloX`4DQyEK+DmrZh8A$)iWL#NO9+Y@!sO2f@rI!@jN@>HOA< z?q2l{^%mY*PNx2FoX+A7X3N}(RV$B`g&N=e0uvAvEN1W^{*W?zT1i#fxuw10%~))J zjx#gxoVlXREWZf4hRkgdHx5V_S*;p-y%JtGgQ4}lnA~MBz-AFdxUxU1RIT$`sal|X zPB6sEVRjGbXIP0U+?rT|y5+ev&OMX*5C$n2SBPZr`jqzrmpVrNciR0e*Wm?fK6DY& zl(XQZ60yWXV-|Ps!A{EF;=_z(YAF=T(-MkJXUoX zI{UMQDAV2}Ya?EisdEW;@pE6dt;j0fg5oT2dxCi{wqWJ<)|SR6fxX~5CzblPGr8cb zUBVJ2CQd~3L?7yfTpLNbt)He1D>*KXI^GK%<`bq^cUq$Q@uJifG>p3LU(!H=C)aEL zenk7pVg}0{dKU}&l)Y2Y2eFMdS(JS0}oZUuVaf2+K*YFNGHB`^YGcIpnBlMhO7d4@vV zv(@N}(k#REdul8~fP+^F@ky*wt@~&|(&&meNO>rKDEnB{ykAZ}k>e@lad7to>Ao$B zz<1(L=#J*u4_LB=8w+*{KFK^u00NAmeNN7pr+Pf+N*Zl^dO{LM-hMHyP6N!~`24jd zXYP|Ze;dRXKdF2iJG$U{k=S86l@pytLx}$JFFs8e)*Vi?aVBtGJ3JZUj!~c{(rw5>vuRF$`^p!P8w1B=O!skwkO5yd4_XuG^QVF z`-r5K7(IPSiKQ2|U9+`@Js!g6sfJwAHVd|s?|mnC*q zp|B|z)(8+mxXyxQ{8Pg3F4|tdpgZZSoU4P&9I8)nHo1@)9_9u&NcT^FI)6|hsAZFk zZ+arl&@*>RXBf-OZxhZerOr&dN5LW9@gV=oGFbK*J+m#R-|e6(Loz(;g@T^*oO)0R zN`N=X46b{7yk5FZGr#5&n1!-@j@g02g|X>MOpF3#IjZ_4wg{dX+G9eqS+Es9@6nC7 zD9$NuVJI}6ZlwtUm5cCAiYv0(Yi{%eH+}t)!E^>^KxB5^L~a`4%1~5q6h>d;paC9c zTj0wTCKrhWf+F#5>EgX`sl%POl?oyCq0(w0xoL?L%)|Q7d|Hl92rUYAU#lc**I&^6p=4lNQPa0 znQ|A~i0ip@`B=FW-Q;zh?-wF;Wl5!+q3GXDu-x&}$gUO)NoO7^$BeEIrd~1Dh{Tr` z8s<(Bn@gZ(mkIGnmYh_ehXnq78QL$pNDi)|QcT*|GtS%nz1uKE+E{7jdEBp%h0}%r zD2|KmYGiPa4;md-t_m5YDz#c*oV_FqXd85d@eub?9N61QuYcb3CnVWpM(D-^|CmkL z(F}L&N7qhL2PCq)fRh}XO@U`Yn<?TNGR4L(mF7#4u29{i~@k;pLsgl({YW5`Mo+p=zZn3L*4{JU;++dG9 X@eDJUQo;Ye2mwlRs?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00HAB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOcLqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf}bD7nW^Haf}_gXciYKX{QBxIPSx2Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+MHeZ*OE4v*otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W-;SmFkR8HEZJWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(|6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw23dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv&K?HS4QLoylJ|OAF z`8atBNTzJ&AQ!>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpNAR?q@1U59 zO+)QWwL8t zyip?u_nI+K$uh{y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP|(1g7i_Q<>aEAT{5(yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSDCIrjk+M1R!X7s4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt939UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>|>RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(fu}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CGJQtmgNAj^h9B#zmaMDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z!xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS}0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cFha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZG`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4aIiybZHHagF{;IcD(dPO!#=u zWfqLcPc^+7Uu#l(Bpxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2qb6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy(;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*-zxcvU4viy&Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4!Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDqs1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f!7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#iZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY|%*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkwzVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3smwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN literal 0 HcmV?d00001 diff --git a/examples/taco/react-viem/public/manifest.json b/examples/taco/react-viem/public/manifest.json new file mode 100644 index 000000000..080d6c77a --- /dev/null +++ b/examples/taco/react-viem/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/examples/taco/react-viem/public/robots.txt b/examples/taco/react-viem/public/robots.txt new file mode 100644 index 000000000..e9e57dc4d --- /dev/null +++ b/examples/taco/react-viem/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/examples/taco/react-viem/src/App.tsx b/examples/taco/react-viem/src/App.tsx new file mode 100644 index 000000000..06f2254fd --- /dev/null +++ b/examples/taco/react-viem/src/App.tsx @@ -0,0 +1,164 @@ +import { fromHexString } from '@nucypher/shared'; +import { conditions, domains, fromBytes, toHexString } from '@nucypher/taco'; +import { hexlify } from 'ethers/lib/utils'; +import { useEffect, useState } from 'react'; +import { + createPublicClient, + createWalletClient, + custom, + PublicClient, + WalletClient +} from 'viem'; +import { polygonAmoy } from 'viem/chains'; + +import useTaco from './hooks/useTaco'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare const window: any; + +const ritualId = 6; // Replace with your own ritual ID +const domain = domains.TESTNET; + +function App() { + const [publicClient, setPublicClient] = useState(); + const [walletClient, setWalletClient] = useState(); + const [message, setMessage] = useState('this is a secret'); + const [encrypting, setEncrypting] = useState(false); + const [encryptedText, setEncryptedText] = useState(''); + const [decrypting, setDecrypting] = useState(false); + const [decryptedMessage, setDecryptedMessage] = useState( + '', + ); + + const loadWeb3Provider = async () => { + if (!window.ethereum) { + console.error('You need to connect to your wallet first'); + return; + } + + // Request account access + await window.ethereum.request({ method: 'eth_requestAccounts' }); + + // Create public client for reading data + const publicClient = createPublicClient({ + chain: polygonAmoy, + transport: custom(window.ethereum), + }); + + // Get the accounts from the provider + const [account] = await window.ethereum.request({ + method: 'eth_accounts' + }); + // Create wallet client for signing the message + const walletClient = createWalletClient({ + account, + chain: polygonAmoy, + transport: custom(window.ethereum), + }); + + const chainId = await publicClient.getChainId(); + const amoyChainId = 80002; + if (chainId !== amoyChainId) { + // Switch to Polygon Amoy testnet + await window.ethereum.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: hexlify(amoyChainId) }], + }); + } + + setPublicClient(publicClient); + setWalletClient(walletClient); + }; + + useEffect(() => { + loadWeb3Provider(); + }, []); + + const { isInit, encryptDataToBytes, decryptDataFromBytes } = useTaco({ + domain, + publicClient, + walletClient, + ritualId, + }); + + if (!isInit || !publicClient || !walletClient) { + return
Loading...
; + } + + const encryptMessage = async () => { + if (!walletClient) { + return; + } + setEncrypting(true); + try { + const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ + chain: 80002, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + console.log('Encrypting message...'); + const encryptedBytes = await encryptDataToBytes( + message, + hasPositiveBalance, + ); + if (encryptedBytes) { + setEncryptedText(toHexString(encryptedBytes)); + } + } catch (e) { + console.log(e); + } + setEncrypting(false); + }; + + const decryptMessage = async () => { + if (!encryptedText || !walletClient) { + return; + } + try { + setDecrypting(true); + + console.log('Decrypting message...'); + const decryptedMessage = await decryptDataFromBytes( + fromHexString(encryptedText), + ); + if (decryptedMessage) { + setDecryptedMessage(fromBytes(decryptedMessage)); + } + } catch (e) { + console.log(e); + } + setDecrypting(false); + }; + + return ( +
+

+ Secret message:{' '} + setMessage(e.target.value)} + onClick={encryptMessage} + />{' '} + {' '} + {encrypting && 'Encrypting...'} +

+

+ Encrypted message:{' '} + setEncryptedText(e.target.value)} + />{' '} + {' '} + {decrypting && 'Decrypting...'} +

+ {decryptedMessage &&

Decrypted message: {decryptedMessage}

} +
+ ); +} + +export default App; diff --git a/examples/taco/react-viem/src/hooks/useTaco.ts b/examples/taco/react-viem/src/hooks/useTaco.ts new file mode 100644 index 000000000..1ca25d786 --- /dev/null +++ b/examples/taco/react-viem/src/hooks/useTaco.ts @@ -0,0 +1,104 @@ +import { + conditions, + decrypt, + Domain, + encrypt, + initialize, + ThresholdMessageKit, +} from '@nucypher/taco'; +import { + EIP4361AuthProvider, + USER_ADDRESS_PARAM_DEFAULT, +} from '@nucypher/taco-auth'; +import { useCallback, useEffect, useState } from 'react'; +import { createPublicClient, http, PublicClient, WalletClient } from 'viem'; +import { polygonAmoy } from 'viem/chains'; + +export default function useTaco({ + ritualId, + domain, + publicClient, + walletClient, +}: { + ritualId: number; + domain: Domain; + publicClient: PublicClient | undefined; + walletClient: WalletClient | undefined; +}) { + const [isInit, setIsInit] = useState(false); + + useEffect(() => { + initialize().then(() => setIsInit(true)); + }, []); + + const decryptDataFromBytes = useCallback( + async (encryptedBytes: Uint8Array) => { + if (!isInit || !publicClient || !walletClient) { + return; + } + + const messageKit = ThresholdMessageKit.fromBytes(encryptedBytes); + const authProvider = new EIP4361AuthProvider(publicClient, walletClient); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKit); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); + let message; + try { + message = await decrypt( + publicClient, + domain, + messageKit, + conditionContext, + ); + } catch (error) { + if ( + error instanceof Error && + JSON.stringify(error).includes('missing trie node') + ) { + // Using MetaMask Provider may cause "missing trie node". + // Which typically occurs when attempting to query a blockchain state for a specific block that has been pruned from the node's storage. + // To avoid that, a custom public client is created. + const remotePublicClient = createPublicClient({ + chain: polygonAmoy, // Using Polygon Amoy for testnet/devnet + transport: http('https://rpc-amoy.polygon.technology'), + }); + message = await decrypt( + remotePublicClient, + domain, + messageKit, + conditionContext, + ); + } else { + throw error; + } + } + return message; + }, + [isInit, publicClient, walletClient, domain], + ); + + const encryptDataToBytes = useCallback( + async (message: string, condition: conditions.condition.Condition) => { + if (!isInit || !publicClient || !walletClient) return; + const messageKit = await encrypt( + publicClient, + domain, + message, + condition, + ritualId, + walletClient, + ); + return messageKit.toBytes(); + }, + [isInit, publicClient, walletClient, domain, ritualId], + ); + + return { + isInit, + decryptDataFromBytes, + encryptDataToBytes, + }; +} diff --git a/examples/taco/react-viem/src/index.css b/examples/taco/react-viem/src/index.css new file mode 100644 index 000000000..8439a5936 --- /dev/null +++ b/examples/taco/react-viem/src/index.css @@ -0,0 +1,7 @@ +input { + font-size: 20px; +} + +button { + font-size: 15px; +} diff --git a/examples/taco/react-viem/src/index.tsx b/examples/taco/react-viem/src/index.tsx new file mode 100644 index 000000000..3f83eeaea --- /dev/null +++ b/examples/taco/react-viem/src/index.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; + +import App from './App'; +import './index.css'; + +const root = ReactDOM.createRoot( + document.getElementById('root') as HTMLElement, +); +root.render( + + + , +); diff --git a/examples/taco/react-viem/src/react-app-env.d.ts b/examples/taco/react-viem/src/react-app-env.d.ts new file mode 100644 index 000000000..8f8826530 --- /dev/null +++ b/examples/taco/react-viem/src/react-app-env.d.ts @@ -0,0 +1,8 @@ +/// +import { ExternalProvider } from '@ethersproject/providers'; + +declare global { + interface Window { + ethereum?: ExternalProvider; + } +} diff --git a/examples/taco/react-viem/tsconfig.build.json b/examples/taco/react-viem/tsconfig.build.json new file mode 100644 index 000000000..7213342cb --- /dev/null +++ b/examples/taco/react-viem/tsconfig.build.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "noEmit": true + }, + "references": [ + { + "path": "../../../packages/taco/tsconfig.es.json" + }, + ] +} diff --git a/examples/taco/react-viem/tsconfig.json b/examples/taco/react-viem/tsconfig.json new file mode 100644 index 000000000..aca306ec8 --- /dev/null +++ b/examples/taco/react-viem/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + }, + "include": ["src"], +} diff --git a/packages/shared/src/adapters.ts b/packages/shared/src/adapters.ts index 89e0b8be2..65ab0c7b5 100644 --- a/packages/shared/src/adapters.ts +++ b/packages/shared/src/adapters.ts @@ -4,7 +4,7 @@ import type { TacoSigner } from './taco-signer'; import { ProviderLike, SignerLike } from './types'; import { viemClientToProvider } from './viem/ethers-adapter'; import { ViemSignerAdapter } from './viem/signer-adapter'; -import { isViemAccount, isViemClient } from './viem/type-guards'; +import { isViemClient, isViemSignerAccount } from './viem/type-guards'; /** * Convert viem Account or ethers Signer to TacoSigner. @@ -17,7 +17,7 @@ import { isViemAccount, isViemClient } from './viem/type-guards'; * @returns A TacoSigner interface implementation */ export function toTacoSigner(signerLike: SignerLike): TacoSigner { - if (isViemAccount(signerLike)) { + if (isViemSignerAccount(signerLike)) { return new ViemSignerAdapter(signerLike); } else { return signerLike; diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index e247eae7d..9d95267fd 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; -import { Account, PublicClient } from './viem/types'; +import { PublicClient, SignerAccount } from './viem/types'; export type ChecksumAddress = `0x${string}`; export type HexEncodedBytes = string; @@ -13,4 +13,4 @@ export type ProviderLike = ethers.providers.Provider | PublicClient; * * Accepts either ethers Signer or viem Account */ -export type SignerLike = ethers.Signer | Account; +export type SignerLike = ethers.Signer | SignerAccount; diff --git a/packages/shared/src/viem/ethers-adapter.ts b/packages/shared/src/viem/ethers-adapter.ts index b2d6d70ab..2c4ea7de9 100644 --- a/packages/shared/src/viem/ethers-adapter.ts +++ b/packages/shared/src/viem/ethers-adapter.ts @@ -88,7 +88,7 @@ export function viemClientToProvider( // custom (EIP-1193) transport if (transport?.type === 'custom') { const value = transport?.value; - const provider = value?.provider ?? value; + const provider = value?.provider ?? value ?? transport; // Check if it's an EIP-1193 provider (e.g., MetaMask, WalletConnect) if (provider && typeof provider.request === 'function') { diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index 80ea3caa1..3f6df5df4 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -1,6 +1,8 @@ +import { ethers } from 'ethers'; + import { type TacoSigner } from '../taco-signer'; -import { type Account } from './types'; +import { type Address, type SignerAccount } from './types'; /** * Viem Signer Adapter @@ -8,24 +10,50 @@ import { type Account } from './types'; * This adapter implements the minimal TacoSigner interface for internal library use. */ export class ViemSignerAdapter implements TacoSigner { - protected viemAccount: Account; + protected viemAccount: SignerAccount; - constructor(viemAccount: Account) { + constructor(viemAccount: SignerAccount) { this.viemAccount = viemAccount; } - async getAddress(): Promise { - return this.viemAccount.address; + async getAddress(): Promise
{ + let address: Address | undefined; + if ('address' in this.viemAccount) { + // viemAccount is a LocalAccount + address = this.viemAccount.address; + } else if ( + 'account' in this.viemAccount && + this.viemAccount.account && + 'address' in this.viemAccount.account + ) { + // viemAccount is a WalletClient + address = this.viemAccount.account.address; + } + if (address) { + // Get the checksummed address to avoid getting + // "invalid EIP-55 address - 0x31663c14545df87044d2c5407ad0c2696b6d1402" + // that might be thrown at package siwe-parser while perform decryption + return ethers.utils.getAddress(address) as Address; + } + throw new Error( + 'Account does not support message signing. Could not retrieve account address.', + ); } async signMessage(message: string | Uint8Array): Promise { if (!this.viemAccount.signMessage) { - throw new Error('Account does not support message signing'); + throw new Error( + 'Account does not support message signing. Could not find `signMessage` method.', + ); } if (typeof message === 'string') { - return await this.viemAccount.signMessage({ message }); + return await this.viemAccount.signMessage({ + account: await this.getAddress(), + message, + }); } else { return await this.viemAccount.signMessage({ + account: await this.getAddress(), message: { raw: message }, }); } diff --git a/packages/shared/src/viem/type-guards.ts b/packages/shared/src/viem/type-guards.ts index f39c0c493..1f3b48e40 100644 --- a/packages/shared/src/viem/type-guards.ts +++ b/packages/shared/src/viem/type-guards.ts @@ -2,7 +2,7 @@ import { ethers } from 'ethers'; import { ProviderLike, SignerLike } from '../types'; -import { Account, PublicClient } from './types'; +import { PublicClient, SignerAccount } from './types'; /** * Type guard to determine if the provider-like is a viem PublicClient @@ -30,24 +30,30 @@ export function isViemClient( } /** - * Type guard to determine if the signer is a viem Account - * + * Type guard to determine if the signer is a viem account that can sign: LocalAccount or WalletClient + * Note: might need modification when supporting viem SmartAccount * Checks for: - * - Presence of viem Account properties (address as string) - * - Absence of ethers-specific properties (provider) * - Ensures it's not an ethers Signer instance + * - Absence of ethers-specific properties (provider) + * - Presence of viem Local Account properties (address as string) or viem Wallet Client properties (account.address as string) */ -export function isViemAccount(signer: SignerLike): signer is Account { - if (signer instanceof ethers.Signer) { +export function isViemSignerAccount( + signer: SignerLike, +): signer is SignerAccount { + if (signer instanceof ethers.Signer || 'provider' in signer) { return false; } - // Check for viem Account signature: - // - Has address property of type string - // - Does NOT have provider property (ethers.Signer characteristic) - return ( + // Check for viem Account properties + const hasLocalAccountProperties = + // Local Account: 'address' in signer && - typeof (signer as { address: string }).address === 'string' && - !('provider' in signer) // ethers.Signer has provider property - ); + typeof (signer as { address: string }).address === 'string'; + const hasWalletClientProperties = + // Wallet Client: + 'account' in signer && + typeof (signer as { account: { address: string } }).account.address === + 'string'; + + return hasLocalAccountProperties || hasWalletClientProperties; } diff --git a/packages/shared/src/viem/types.ts b/packages/shared/src/viem/types.ts index 8fff2d1ed..d3b5b9349 100644 --- a/packages/shared/src/viem/types.ts +++ b/packages/shared/src/viem/types.ts @@ -22,10 +22,18 @@ // This pattern preserves type safety for consumers who have 'viem' installed, but does not break for others. // See: https://github.com/microsoft/TypeScript/issues/47663#issuecomment-1367016530 // Dynamic imports resolve to 'unknown' when module is not available, no compile-time errors occur +type _Address = import('viem').Address; type _ViemPublicClient = import('viem').PublicClient; -type _ViemAccount = import('viem').Account; +type _LocalAccount = import('viem').LocalAccount; type _ViemChain = import('viem').Chain; type _ViemTransport = import('viem').Transport; +type _WalletClient = import('viem').WalletClient; + +/** + * Viem Address type (`0x${string}`) + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type Address = [unknown] extends [_Address] ? any : _Address; /** * Viem PublicClient type for read operations @@ -35,12 +43,24 @@ export type PublicClient = [unknown] extends [_ViemPublicClient] ? // eslint-disable-next-line @typescript-eslint/no-explicit-any any : _ViemPublicClient; + +export type LocalAccount = [unknown] extends [_LocalAccount] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _LocalAccount; + +export type WalletClient = [unknown] extends [_WalletClient] + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + any + : _WalletClient; + /** - * Viem Account type for signing operations + * Viem signer account type for signing operations (LocalAccount or WalletClient) + * Note: SmartAccount is not supported yet * @see https://viem.sh/docs/accounts/local + * @see https://viem.sh/docs/clients/wallet */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type Account = [unknown] extends [_ViemAccount] ? any : _ViemAccount; +export type SignerAccount = LocalAccount | WalletClient; /** * Viem Chain type for network metadata diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index cdba8d144..38a52f75a 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -9,7 +9,7 @@ import { fromHexString } from '../src'; import { toEthersProvider, toTacoSigner } from '../src/adapters'; import { viemClientToProvider } from '../src/viem/ethers-adapter'; import { ViemSignerAdapter } from '../src/viem/signer-adapter'; -import { isViemAccount, isViemClient } from '../src/viem/type-guards'; +import { isViemClient, isViemSignerAccount } from '../src/viem/type-guards'; describe('viem ethers adapter', () => { const PRIVATE_KEY = @@ -230,7 +230,7 @@ describe('viem ethers adapter', () => { it('should handle non-viem signer correctly', () => { const nonViemSigner = { getAddress: vi.fn(), - provider: {}, // This will make it fail the isViemAccount check + provider: {}, // This will make it fail the isViemSignerAccount check } as any; const result = toTacoSigner(nonViemSigner); @@ -279,22 +279,22 @@ describe('viem ethers adapter', () => { }); }); - describe('isViemAccount', () => { + describe('isViemSignerAccount', () => { it('should identify actual viem account', () => { const viemAccount = privateKeyToAccount(PRIVATE_KEY); - expect(isViemAccount(viemAccount)).toBe(true); + expect(isViemSignerAccount(viemAccount)).toBe(true); }); it('should identify viem account by address property', () => { const viemAccountByAddress = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', }; - expect(isViemAccount(viemAccountByAddress)).toBe(true); + expect(isViemSignerAccount(viemAccountByAddress)).toBe(true); }); it('should reject ethers signer', () => { const ethersSigner = new ethers.Wallet(PRIVATE_KEY); - expect(isViemAccount(ethersSigner)).toBe(false); + expect(isViemSignerAccount(ethersSigner)).toBe(false); }); it('should reject object with provider property', () => { @@ -303,7 +303,7 @@ describe('viem ethers adapter', () => { provider: {}, // This makes it look like an ethers signer }; - expect(isViemAccount(notViemAccount)).toBe(false); + expect(isViemSignerAccount(notViemAccount)).toBe(false); }); }); }); diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index cfa4c765a..2127d4469 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -1,7 +1,7 @@ import { - Account, ProviderLike, PublicClient, + SignerAccount, SignerLike, TacoSigner, toEthersProvider, @@ -108,7 +108,7 @@ export class EIP4361AuthProvider implements AuthProvider { */ constructor( publicClient: PublicClient, - account: Account, + account: SignerAccount, providerParams?: EIP4361AuthProviderParams, ); diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 24fccc3e5..3c10e4dcc 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -5,7 +5,6 @@ import { ThresholdMessageKit, } from '@nucypher/nucypher-core'; import { - Account, DkgCoordinatorAgent, Domain, fromHexString, @@ -13,6 +12,7 @@ import { PorterClient, ProviderLike, PublicClient, + SignerAccount, SignerLike, toBytes, toEthersProvider, @@ -65,7 +65,7 @@ export async function encrypt( * @param {Uint8Array | string} message - The message to be encrypted. * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {number} ritualId - ID of the DKG ritual whose public key will be used for encryption. - * @param {Account} authAccount - Viem account used to identify encryptor and verify authorization. + * @param {SignerAccount} authAccount - Viem account used to identify encryptor and verify authorization. * * @returns {Promise} Encrypted message kit representing the ciphertext and associated metadata. * @@ -78,7 +78,7 @@ export async function encrypt( message: Uint8Array | string, condition: Condition, ritualId: number, - authAccount: Account, + authAccount: SignerAccount, ): Promise; export async function encrypt( @@ -136,7 +136,7 @@ export async function encryptWithPublicKey( * @param {Uint8Array | string} message - The message to be encrypted. * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption - * @param {Account} authAccount - Viem account used to identify encryptor and verify authorization. + * @param {SignerAccount} authAccount - Viem account used to identify encryptor and verify authorization. * * @returns {Promise} Encrypted message kit representing the ciphertext and associated metadata. * @@ -146,7 +146,7 @@ export async function encryptWithPublicKey( message: Uint8Array | string, condition: Condition, dkgPublicKey: DkgPublicKey, - authAccount: Account, + authAccount: SignerAccount, ): Promise; export async function encryptWithPublicKey( From 96b9f608c632e8cb87b724a79b8aa640bcd7b1b3 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 23 Sep 2025 13:08:02 +0200 Subject: [PATCH 68/97] improve error messages and type definitions in viem adapters --- packages/shared/src/viem/ethers-adapter.ts | 6 ++++-- packages/shared/src/viem/signer-adapter.ts | 4 ++-- packages/shared/src/viem/types.ts | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/shared/src/viem/ethers-adapter.ts b/packages/shared/src/viem/ethers-adapter.ts index 2c4ea7de9..b0cfe4f0b 100644 --- a/packages/shared/src/viem/ethers-adapter.ts +++ b/packages/shared/src/viem/ethers-adapter.ts @@ -54,7 +54,9 @@ export function viemClientToProvider( // fallback transport (multiple RPC endpoints) if (transport?.type === 'fallback') { - throw new Error('Fallback transport not supported'); + throw new Error( + 'Fallback transport not supported. Please use a single HTTP transport instead.', + ); // TODO: implement with a code like the following: // Note: The following takes only the first url of the transports urls. // const items = transport.transports as ReturnType[]; @@ -112,7 +114,7 @@ export function viemClientToProvider( const url = transport?.url as string | undefined; if (!url) { throw new Error( - `Transport must have a URL (type=${transport?.type ?? 'unknown'}, chainId=${chain?.id ?? 'unknown'} name=${chain?.name ?? 'unknown'})`, + `Transport must have a URL (type=${transport?.type ?? 'unknown'}, chainId=${chain?.id ?? 'unknown'}, name=${chain?.name ?? 'unknown'})`, ); } return new ethers.providers.JsonRpcProvider(url, networkish); diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index 3f6df5df4..db84a933f 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -36,14 +36,14 @@ export class ViemSignerAdapter implements TacoSigner { return ethers.utils.getAddress(address) as Address; } throw new Error( - 'Account does not support message signing. Could not retrieve account address.', + 'Unable to retrieve address from viem account. Expected a LocalAccount with "address" property or WalletClient with "account.address" property.', ); } async signMessage(message: string | Uint8Array): Promise { if (!this.viemAccount.signMessage) { throw new Error( - 'Account does not support message signing. Could not find `signMessage` method.', + 'Account does not support message signing. Expected a LocalAccount or a WalletClient with signing capability.', ); } if (typeof message === 'string') { diff --git a/packages/shared/src/viem/types.ts b/packages/shared/src/viem/types.ts index d3b5b9349..5a378b62e 100644 --- a/packages/shared/src/viem/types.ts +++ b/packages/shared/src/viem/types.ts @@ -32,8 +32,8 @@ type _WalletClient = import('viem').WalletClient; /** * Viem Address type (`0x${string}`) */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type Address = [unknown] extends [_Address] ? any : _Address; +// Fallback to hex string +export type Address = [unknown] extends [_Address] ? `0x${string}` : _Address; /** * Viem PublicClient type for read operations From 56b33f8733a90fe1b15f1b933b66e26c6cf51686 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 23 Sep 2025 15:02:35 +0200 Subject: [PATCH 69/97] docs: clarify viem signer type as SignerAccount (LocalAccount or WalletClient) --- packages/shared/src/adapters.ts | 4 +- packages/shared/src/types.ts | 2 +- packages/shared/src/viem/type-guards.ts | 2 +- packages/shared/test/viem-types.test.ts | 4 +- packages/taco/README.md | 4 +- packages/taco/VIEM_SUPPORT.md | 2 +- .../integration-test/encrypt-decrypt.test.ts | 4 +- packages/taco/src/taco.ts | 6 +-- packages/taco/test/taco.test.ts | 6 +-- packages/test-utils/src/utils.ts | 45 +++++++++---------- 10 files changed, 37 insertions(+), 42 deletions(-) diff --git a/packages/shared/src/adapters.ts b/packages/shared/src/adapters.ts index 65ab0c7b5..fd51f29bd 100644 --- a/packages/shared/src/adapters.ts +++ b/packages/shared/src/adapters.ts @@ -7,13 +7,13 @@ import { ViemSignerAdapter } from './viem/signer-adapter'; import { isViemClient, isViemSignerAccount } from './viem/type-guards'; /** - * Convert viem Account or ethers Signer to TacoSigner. + * Convert ethers Signer or viem SignerAccount (LocalAccount or WalletClient) to TacoSigner. * * This is the main entry point for creating signers for internal TACo use. * Unlike toEthersProvider which creates actual ethers objects, * this creates minimal adapters implementing only what TACo needs. * - * @param signerLike - Either a viem Account or an ethers Signer + * @param signerLike - Either an ethers Signer or a viem SignerAccount (LocalAccount or WalletClient) * @returns A TacoSigner interface implementation */ export function toTacoSigner(signerLike: SignerLike): TacoSigner { diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index 9d95267fd..d933220f4 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -11,6 +11,6 @@ export type ProviderLike = ethers.providers.Provider | PublicClient; /** * Signer-like union for TACo operations. * - * Accepts either ethers Signer or viem Account + * Accepts either ethers Signer or viem SignerAccount (LocalAccount or WalletClient) */ export type SignerLike = ethers.Signer | SignerAccount; diff --git a/packages/shared/src/viem/type-guards.ts b/packages/shared/src/viem/type-guards.ts index 1f3b48e40..76759cff3 100644 --- a/packages/shared/src/viem/type-guards.ts +++ b/packages/shared/src/viem/type-guards.ts @@ -44,7 +44,7 @@ export function isViemSignerAccount( return false; } - // Check for viem Account properties + // Check for viem SignerAccount properties const hasLocalAccountProperties = // Local Account: 'address' in signer && diff --git a/packages/shared/test/viem-types.test.ts b/packages/shared/test/viem-types.test.ts index b4c88acfa..a066d8cd4 100644 --- a/packages/shared/test/viem-types.test.ts +++ b/packages/shared/test/viem-types.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { describe, expect, it } from 'vitest'; -import type { Account, PublicClient } from '@nucypher/shared'; +import type { PublicClient, SignerAccount } from '@nucypher/shared'; describe('viem types', () => { it('should support viem-like client objects', () => { @@ -16,7 +16,7 @@ describe('viem types', () => { }); it('should support viem-like account objects', () => { - const viemLikeAccount: Account = { + const viemLikeAccount: SignerAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: () => Promise.resolve('0xsignature'), } as any; diff --git a/packages/taco/README.md b/packages/taco/README.md index 6ce15be1b..452dd3eab 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -100,7 +100,7 @@ const messageKit = await encrypt( 'my secret message', ownsNFT, ritualId, - viemAccount, // viem Account + viemAccount, // viem Signer Account (`LocalAccount` or `WalletClient`) ); // Decrypt with viem @@ -133,7 +133,7 @@ const viemEncrypted = await encrypt( message, condition, ritualId, - viemAccount // viem Account + viemAccount // viem Signer Account (`LocalAccount` or `WalletClient`) ); ``` diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index 98d990f5b..4fbcf4533 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -69,7 +69,7 @@ const encryptedKit = await encrypt( 'Hello, secret!', condition, 27, // ritual ID - viemAccount, // viem Account + viemAccount, // viem Signer Account (`LocalAccount` or `WalletClient`) ); // Same decrypt function works with viem diff --git a/packages/taco/integration-test/encrypt-decrypt.test.ts b/packages/taco/integration-test/encrypt-decrypt.test.ts index 49b4e698e..eb1e02cd7 100644 --- a/packages/taco/integration-test/encrypt-decrypt.test.ts +++ b/packages/taco/integration-test/encrypt-decrypt.test.ts @@ -6,7 +6,7 @@ import { USER_ADDRESS_PARAM_DEFAULT, } from '@nucypher/taco-auth'; import { ethers } from 'ethers'; -import { Account, createPublicClient, http, PublicClient } from 'viem'; +import { createPublicClient, http, LocalAccount, PublicClient } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; import { @@ -32,7 +32,7 @@ describe .skipIf(!process.env.RUNNING_IN_CI) .each< | ['ethers', ethers.providers.Provider, ethers.Wallet, ethers.Wallet] - | ['viem', PublicClient, Account, Account] + | ['viem', PublicClient, LocalAccount, LocalAccount] >([ [ 'ethers', diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 3c10e4dcc..9a038dfc1 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -55,7 +55,7 @@ export async function encrypt( ): Promise; /** - * Encrypts a message gated by TACo Conditions using a viem `PublicClient` and `Account`. + * Encrypts a message gated by TACo Conditions using a viem `PublicClient` and a Signer Account (`LocalAccount` or `WalletClient`). * * Use this overload when your application uses viem. * @@ -103,7 +103,7 @@ export async function encrypt( condition, dkgRitual.dkgPublicKey, // Casting is needed because with the function definition of encryptWithPublicKey, - // this param can be either a Signer or a viem Account. But not a type that is the union of both. + // this param can be either a Signer or a viem signer account. But not a type that is the union of both. // eslint-disable-next-line @typescript-eslint/no-explicit-any signerLike as any, ); @@ -116,7 +116,7 @@ export async function encrypt( * @param {Uint8Array | string} message - The message to be encrypted. * @param {Condition} condition - Access condition (single or composite) that must be satisfied at decryption time. * @param {DkgPublicKey} dkgPublicKey - The public key of an active DKG Ritual to be used for encryption - * @param {Signer} authSigner - Signer used to identify encryptor and verify authorization. Accepts an ethers `Signer` or a viem `Account`. + * @param {Signer} authSigner - Signer used to identify encryptor and verify authorization. Accepts an ethers `Signer` or a viem Signer Account (`LocalAccount` or `WalletClient`). * * @returns {Promise} Encrypted message kit representing the ciphertext and associated metadata. * diff --git a/packages/taco/test/taco.test.ts b/packages/taco/test/taco.test.ts index 00ab9107d..89260b847 100644 --- a/packages/taco/test/taco.test.ts +++ b/packages/taco/test/taco.test.ts @@ -19,7 +19,7 @@ import { TEST_SIWE_PARAMS, } from '@nucypher/test-utils'; import { ethers } from 'ethers'; -import type { Account, PublicClient } from 'viem'; +import type { LocalAccount, PublicClient } from 'viem'; import { beforeAll, describe, expect, it } from 'vitest'; import * as taco from '../src'; @@ -52,7 +52,7 @@ describe('TACo SDK', () => { describe.each< | ['ethers', () => ethers.providers.Provider, () => ethers.Signer] - | ['viem', () => PublicClient, () => Account] + | ['viem', () => PublicClient, () => LocalAccount] >([ [ 'ethers', @@ -61,7 +61,7 @@ describe('TACo SDK', () => { ], [ 'viem', - () => fakeViemPublicClient(TEST_CHAIN_ID, 'polygon-amoy'), + () => fakeViemPublicClient(), () => fakeViemAccount(aliceSecretKeyBytes), ], ])('Provider: %s', (providerType, createProvider, createSigner) => { diff --git a/packages/test-utils/src/utils.ts b/packages/test-utils/src/utils.ts index 11c002468..fb3968156 100644 --- a/packages/test-utils/src/utils.ts +++ b/packages/test-utils/src/utils.ts @@ -45,7 +45,9 @@ import { SingleSignOnEIP4361AuthProvider, } from '@nucypher/taco-auth'; import { ethers, providers, Wallet } from 'ethers'; -import { privateKeyToAccount } from 'viem/accounts'; +import { createPublicClient, custom, PublicClient } from 'viem'; +import { LocalAccount, privateKeyToAccount } from 'viem/accounts'; +import { polygonAmoy } from 'viem/chains'; import { expect, MockInstance, vi } from 'vitest'; import { TEST_CONTRACT_ADDR, TEST_SIWE_PARAMS } from './variables'; @@ -101,34 +103,27 @@ export const fakeProvider = ( }; // Viem test utilities -export const fakeViemPublicClient = ( - chainId = 80002, - chainName = 'polygon-amoy', -) => { - return { - chain: { id: chainId, name: chainName }, - transport: { - type: 'custom', - value: { - provider: { - request: vi.fn().mockImplementation(async ({ method, params }) => { - // Network detection calls - if (method === 'eth_chainId') { - return `0x${chainId.toString(16)}`; - } - // Default response for other calls - return null; - }), - }, - }, - }, - getNetwork: vi.fn().mockResolvedValue({ chainId, name: chainName }), - } as any; +export const fakeViemPublicClient = (): PublicClient => { + // Create public client for reading data + const publicClient = createPublicClient({ + chain: polygonAmoy, + transport: custom({ + request: vi.fn().mockImplementation(async ({ method }) => { + // Network detection calls + if (method === 'eth_chainId') { + return `0x${polygonAmoy.id.toString(16)}`; + } + // Default response for other calls + return null; + }), + }), + }); + return publicClient; }; export const fakeViemAccount = ( secretKeyBytes = SecretKey.random().toBEBytes(), -) => { +): LocalAccount => { // Convert bytes to hex string for viem const privateKey = `0x${Buffer.from(secretKeyBytes).toString('hex')}`; return privateKeyToAccount(privateKey as `0x${string}`); From ce8694851d798e9092cbb026ab691c7d4e575fbe Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 23 Sep 2025 22:45:38 +0200 Subject: [PATCH 70/97] chore: update pnpm-lock.yaml --- pnpm-lock.yaml | 13452 ++++++++++++++--------------------------------- 1 file changed, 3839 insertions(+), 9613 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 421ba0e06..66fa9fdab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,7 @@ overrides: nth-check@<2.0.1: '>=2.0.1' importers: + .: dependencies: '@changesets/cli': @@ -38,7 +39,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -104,7 +105,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -128,7 +129,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9) + version: 6.2.0(webpack@5.101.3) react: specifier: ^18.3.1 version: 18.3.1 @@ -144,7 +145,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) + version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -156,16 +157,16 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.1(webpack@5.101.3) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.101.3) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9) + version: 5.6.3(webpack@5.101.3) process: specifier: ^0.11.10 version: 0.11.10 @@ -213,7 +214,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9) + version: 6.2.0(webpack@5.101.3) react: specifier: ^18.3.1 version: 18.3.1 @@ -229,7 +230,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) + version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -241,13 +242,13 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.1(webpack@5.101.3) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.101.3) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9) + version: 5.6.3(webpack@5.101.3) react-refresh: specifier: ^0.17.0 version: 0.17.0 @@ -351,10 +352,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.1(webpack@5.101.3) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.101.3) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -459,6 +460,43 @@ importers: specifier: ^5.0.1 version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + examples/taco/react-viem: + dependencies: + '@nucypher/shared': + specifier: workspace:* + version: link:../../../packages/shared + '@nucypher/taco': + specifier: workspace:* + version: link:../../../packages/taco + '@nucypher/taco-auth': + specifier: workspace:* + version: link:../../../packages/taco-auth + ethers: + specifier: ^5.7.2 + version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + viem: + specifier: ^2.0.0 + version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + devDependencies: + '@types/node': + specifier: ^20.17.28 + version: 20.19.17 + '@types/react': + specifier: ^18.3.20 + version: 18.3.20 + '@types/react-dom': + specifier: ^18.3.5 + version: 18.3.5(@types/react@18.3.20) + react-scripts: + specifier: ^5.0.1 + version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + examples/taco/webpack-5: dependencies: '@nucypher/taco': @@ -473,10 +511,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.1(webpack@5.101.3) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.101.3) webpack: specifier: ^5.99.9 version: 5.101.3(webpack-cli@6.0.1) @@ -559,7 +597,9 @@ importers: version: 8.3.2(typescript@5.8.2) viem: specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + + packages/shared/dist/es: {} packages/taco: dependencies: @@ -602,7 +642,7 @@ importers: version: 0.1.5-modified.4(zod@3.24.2) viem: specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) packages/taco-auth: dependencies: @@ -623,6 +663,10 @@ importers: specifier: workspace:* version: link:../test-utils + packages/taco-auth/dist/es: {} + + packages/taco/dist/es: {} + packages/test-utils: dependencies: '@nucypher/nucypher-core': @@ -642,10 +686,10 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) viem: specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) packages: @@ -653,2503 +697,1652 @@ packages: resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} '@alloc/quick-lru@5.2.0': - resolution: - { - integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} '@ampproject/remapping@2.3.0': - resolution: - { - integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} '@apideck/better-ajv-errors@0.3.6': - resolution: - { - integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} peerDependencies: ajv: '>=8' '@aptos-labs/aptos-cli@1.0.2': - resolution: - { - integrity: sha512-PYPsd0Kk3ynkxNfe3S4fanI3DiUICCoh4ibQderbvjPFL5A0oK6F4lPEO2t0MDsQySTk2t4vh99Xjy6Bd9y+aQ==, - } + resolution: {integrity: sha512-PYPsd0Kk3ynkxNfe3S4fanI3DiUICCoh4ibQderbvjPFL5A0oK6F4lPEO2t0MDsQySTk2t4vh99Xjy6Bd9y+aQ==} hasBin: true '@aptos-labs/aptos-client@1.1.0': - resolution: - { - integrity: sha512-rkGVjQufVONAwnMcjIbdPRmJnAoqBFxd8IXVUBJIVlDXkPgjW+Vj0P3z31CxDFE4mVBN6Wpu30BeBzCW/+IDPQ==, - } - engines: { node: '>=15.10.0' } + resolution: {integrity: sha512-rkGVjQufVONAwnMcjIbdPRmJnAoqBFxd8IXVUBJIVlDXkPgjW+Vj0P3z31CxDFE4mVBN6Wpu30BeBzCW/+IDPQ==} + engines: {node: '>=15.10.0'} peerDependencies: axios: ^1.8.0 got: ^11.8.6 '@aptos-labs/aptos-dynamic-transaction-composer@0.1.3': - resolution: - { - integrity: sha512-bJl+Zq5QbhpcPIJakAkl9tnT3T02mxCYhZThQDhUmjsOZ5wMRlKJ0P7aaq1dmlybSHkVj7vRgOy2t86/NDKKng==, - } + resolution: {integrity: sha512-bJl+Zq5QbhpcPIJakAkl9tnT3T02mxCYhZThQDhUmjsOZ5wMRlKJ0P7aaq1dmlybSHkVj7vRgOy2t86/NDKKng==} '@aptos-labs/script-composer-pack@0.0.9': - resolution: - { - integrity: sha512-Y3kA1rgF65HETgoTn2omDymsgO+fnZouPLrKJZ9sbxTGdOekIIHtGee3A2gk84eCqa02ZKBumZmP+IDCXRtU/g==, - } + resolution: {integrity: sha512-Y3kA1rgF65HETgoTn2omDymsgO+fnZouPLrKJZ9sbxTGdOekIIHtGee3A2gk84eCqa02ZKBumZmP+IDCXRtU/g==} '@aptos-labs/ts-sdk@1.37.1': - resolution: - { - integrity: sha512-l3kmbADrUPNEdnzt6Q4ehYJjky2jiSSRfpPtprctZSvAR/vXfKore1X07FQcx/LCZV9dIccw39zSgh9HBLUaIg==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-l3kmbADrUPNEdnzt6Q4ehYJjky2jiSSRfpPtprctZSvAR/vXfKore1X07FQcx/LCZV9dIccw39zSgh9HBLUaIg==} + engines: {node: '>=20.0.0'} '@astronautlabs/jsonpath@1.1.2': - resolution: - { - integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==, - } + resolution: {integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==} '@babel/code-frame@7.26.2': - resolution: - { - integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} '@babel/compat-data@7.26.8': - resolution: - { - integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} '@babel/core@7.26.10': - resolution: - { - integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} '@babel/eslint-parser@7.27.0': - resolution: - { - integrity: sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==, - } - engines: { node: ^10.13.0 || ^12.13.0 || >=14.0.0 } + resolution: {integrity: sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 '@babel/generator@7.27.0': - resolution: - { - integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.25.9': - resolution: - { - integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.0': - resolution: - { - integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.27.0': - resolution: - { - integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: - { - integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-define-polyfill-provider@0.6.4': - resolution: - { - integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==, - } + resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 '@babel/helper-member-expression-to-functions@7.25.9': - resolution: - { - integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': - resolution: - { - integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.26.0': - resolution: - { - integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-optimise-call-expression@7.25.9': - resolution: - { - integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.26.5': - resolution: - { - integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} '@babel/helper-remap-async-to-generator@7.25.9': - resolution: - { - integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-replace-supers@7.26.5': - resolution: - { - integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: - { - integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': - resolution: - { - integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.25.9': - resolution: - { - integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.25.9': - resolution: - { - integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} '@babel/helper-wrap-function@7.25.9': - resolution: - { - integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} '@babel/helpers@7.27.0': - resolution: - { - integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + engines: {node: '>=6.9.0'} '@babel/parser@7.27.0': - resolution: - { - integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} hasBin: true '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: - { - integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: - { - integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: - { - integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: - { - integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: - { - integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-proposal-class-properties@7.18.6': resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-decorators@7.25.9': - resolution: - { - integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-numeric-separator@7.18.6': resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-optional-chaining@7.21.0': resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-methods@7.18.6': resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: - { - integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-property-in-object@7.21.11': resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-async-generators@7.8.4': - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-bigint@7.8.3': - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - } + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-properties@7.12.13': - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: - { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-decorators@7.25.9': - resolution: - { - integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-flow@7.26.0': - resolution: - { - integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: - { - integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: - { - integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-json-strings@7.8.3': - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.25.9': - resolution: - { - integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.25.9': - resolution: - { - integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: - { - integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: - { - integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: - { - integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: - { - integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: - { - integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoping@7.27.0': - resolution: - { - integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-properties@7.25.9': - resolution: - { - integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-static-block@7.26.0': - resolution: - { - integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 '@babel/plugin-transform-classes@7.25.9': - resolution: - { - integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-computed-properties@7.25.9': - resolution: - { - integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-destructuring@7.25.9': - resolution: - { - integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: - { - integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: - { - integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: - { - integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: - { - integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: - { - integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: - { - integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-flow-strip-types@7.26.5': - resolution: - { - integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-for-of@7.26.9': - resolution: - { - integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-function-name@7.25.9': - resolution: - { - integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-json-strings@7.25.9': - resolution: - { - integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-literals@7.25.9': - resolution: - { - integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: - { - integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: - { - integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-amd@7.25.9': - resolution: - { - integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: - { - integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: - { - integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-umd@7.25.9': - resolution: - { - integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: - { - integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-new-target@7.25.9': - resolution: - { - integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: - { - integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: - { - integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: - { - integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-super@7.25.9': - resolution: - { - integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: - { - integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: - { - integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-parameters@7.25.9': - resolution: - { - integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-methods@7.25.9': - resolution: - { - integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: - { - integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-property-literals@7.25.9': - resolution: - { - integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-constant-elements@7.25.9': - resolution: - { - integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-display-name@7.25.9': - resolution: - { - integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-development@7.25.9': - resolution: - { - integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx@7.25.9': - resolution: - { - integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-pure-annotations@7.25.9': - resolution: - { - integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regenerator@7.27.0': - resolution: - { - integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: - { - integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-reserved-words@7.25.9': - resolution: - { - integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-runtime@7.26.10': - resolution: - { - integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: - { - integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-spread@7.25.9': - resolution: - { - integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: - { - integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-template-literals@7.26.8': - resolution: - { - integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: - { - integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typescript@7.27.0': - resolution: - { - integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: - { - integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: - { - integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: - { - integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: - { - integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/preset-env@7.26.9': - resolution: - { - integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: - { - integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, - } + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 '@babel/preset-react@7.26.3': - resolution: - { - integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/preset-typescript@7.27.0': - resolution: - { - integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/runtime@7.27.0': - resolution: - { - integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} '@babel/template@7.27.0': - resolution: - { - integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} '@babel/traverse@7.27.0': - resolution: - { - integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} '@babel/types@7.27.0': - resolution: - { - integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - } + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} '@bcoe/v8-coverage@1.0.2': - resolution: - { - integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} '@changesets/apply-release-plan@7.0.10': - resolution: - { - integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==, - } + resolution: {integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==} '@changesets/assemble-release-plan@6.0.6': - resolution: - { - integrity: sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg==, - } + resolution: {integrity: sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg==} '@changesets/changelog-git@0.2.1': - resolution: - { - integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==, - } + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} '@changesets/cli@2.28.1': - resolution: - { - integrity: sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==, - } + resolution: {integrity: sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==} hasBin: true '@changesets/config@3.1.1': - resolution: - { - integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==, - } + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} '@changesets/errors@0.2.0': - resolution: - { - integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==, - } + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} '@changesets/get-dependents-graph@2.1.3': - resolution: - { - integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==, - } + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} '@changesets/get-release-plan@4.0.8': - resolution: - { - integrity: sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ==, - } + resolution: {integrity: sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ==} '@changesets/get-version-range-type@0.4.0': - resolution: - { - integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==, - } + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} '@changesets/git@3.0.2': - resolution: - { - integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==, - } + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} '@changesets/logger@0.1.1': - resolution: - { - integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==, - } + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} '@changesets/parse@0.4.1': - resolution: - { - integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==, - } + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} '@changesets/pre@2.0.2': - resolution: - { - integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==, - } + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} '@changesets/read@0.6.3': - resolution: - { - integrity: sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg==, - } + resolution: {integrity: sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg==} '@changesets/should-skip-package@0.1.2': - resolution: - { - integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==, - } + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} '@changesets/types@4.1.0': - resolution: - { - integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==, - } + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} '@changesets/types@6.1.0': - resolution: - { - integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==, - } + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} '@changesets/write@0.4.0': - resolution: - { - integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==, - } + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} '@commander-js/extra-typings@12.1.0': - resolution: - { - integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==, - } + resolution: {integrity: sha512-wf/lwQvWAA0goIghcb91dQYpkLBcyhOhQNqG/VgWhnKzgt+UOMvra7EX/2fv70arm5RW+PUHoQHHDa6/p77Eqg==} peerDependencies: commander: ~12.1.0 '@commitlint/config-validator@19.8.0': - resolution: - { - integrity: sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==, - } - engines: { node: '>=v18' } + resolution: {integrity: sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==} + engines: {node: '>=v18'} '@commitlint/execute-rule@19.8.0': - resolution: - { - integrity: sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==, - } - engines: { node: '>=v18' } + resolution: {integrity: sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==} + engines: {node: '>=v18'} '@commitlint/load@19.8.0': - resolution: - { - integrity: sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==, - } - engines: { node: '>=v18' } + resolution: {integrity: sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==} + engines: {node: '>=v18'} '@commitlint/resolve-extends@19.8.0': - resolution: - { - integrity: sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==, - } - engines: { node: '>=v18' } + resolution: {integrity: sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==} + engines: {node: '>=v18'} '@commitlint/types@19.8.0': - resolution: - { - integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==, - } - engines: { node: '>=v18' } + resolution: {integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==} + engines: {node: '>=v18'} '@cspotcode/source-map-support@0.8.1': - resolution: - { - integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} '@csstools/normalize.css@12.1.1': - resolution: - { - integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==, - } + resolution: {integrity: sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==} '@csstools/postcss-cascade-layers@1.1.1': - resolution: - { - integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-color-function@1.1.1': - resolution: - { - integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-font-format-keywords@1.0.1': - resolution: - { - integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-hwb-function@1.0.2': - resolution: - { - integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-ic-unit@1.0.1': - resolution: - { - integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-is-pseudo-class@2.0.7': - resolution: - { - integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-nested-calc@1.0.0': - resolution: - { - integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-normalize-display-values@1.0.1': - resolution: - { - integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-oklab-function@1.1.1': - resolution: - { - integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-progressive-custom-properties@1.3.0': - resolution: - { - integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 '@csstools/postcss-stepped-value-functions@1.0.1': - resolution: - { - integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-text-decoration-shorthand@1.0.0': - resolution: - { - integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-trigonometric-functions@1.0.2': - resolution: - { - integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==, - } - engines: { node: ^14 || >=16 } + resolution: {integrity: sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==} + engines: {node: ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/postcss-unset-value@1.0.2': - resolution: - { - integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 '@csstools/selector-specificity@2.2.0': - resolution: - { - integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==, - } - engines: { node: ^14 || ^16 || >=18 } + resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} + engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.10 '@discoveryjs/json-ext@0.6.3': - resolution: - { - integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==, - } - engines: { node: '>=14.17.0' } + resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} + engines: {node: '>=14.17.0'} '@emnapi/core@1.4.0': - resolution: - { - integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==, - } + resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==} '@emnapi/runtime@1.4.0': - resolution: - { - integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==, - } + resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} '@emnapi/wasi-threads@1.0.1': - resolution: - { - integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==, - } + resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} '@esbuild/aix-ppc64@0.19.12': - resolution: - { - integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} cpu: [ppc64] os: [aix] '@esbuild/aix-ppc64@0.25.1': - resolution: - { - integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.16.17': - resolution: - { - integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + engines: {node: '>=12'} cpu: [arm64] os: [android] '@esbuild/android-arm64@0.19.12': - resolution: - { - integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} cpu: [arm64] os: [android] '@esbuild/android-arm64@0.25.1': - resolution: - { - integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.16.17': - resolution: - { - integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + engines: {node: '>=12'} cpu: [arm] os: [android] '@esbuild/android-arm@0.19.12': - resolution: - { - integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} cpu: [arm] os: [android] '@esbuild/android-arm@0.25.1': - resolution: - { - integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.16.17': - resolution: - { - integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} + engines: {node: '>=12'} cpu: [x64] os: [android] '@esbuild/android-x64@0.19.12': - resolution: - { - integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} cpu: [x64] os: [android] '@esbuild/android-x64@0.25.1': - resolution: - { - integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.16.17': - resolution: - { - integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} + engines: {node: '>=12'} cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.19.12': - resolution: - { - integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} cpu: [arm64] os: [darwin] '@esbuild/darwin-arm64@0.25.1': - resolution: - { - integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.16.17': - resolution: - { - integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} + engines: {node: '>=12'} cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.19.12': - resolution: - { - integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} cpu: [x64] os: [darwin] '@esbuild/darwin-x64@0.25.1': - resolution: - { - integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.16.17': - resolution: - { - integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} + engines: {node: '>=12'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-arm64@0.19.12': - resolution: - { - integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-arm64@0.25.1': - resolution: - { - integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.16.17': - resolution: - { - integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} + engines: {node: '>=12'} cpu: [x64] os: [freebsd] '@esbuild/freebsd-x64@0.19.12': - resolution: - { - integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} cpu: [x64] os: [freebsd] '@esbuild/freebsd-x64@0.25.1': - resolution: - { - integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.16.17': - resolution: - { - integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + engines: {node: '>=12'} cpu: [arm64] os: [linux] '@esbuild/linux-arm64@0.19.12': - resolution: - { - integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} cpu: [arm64] os: [linux] '@esbuild/linux-arm64@0.25.1': - resolution: - { - integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.16.17': - resolution: - { - integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + engines: {node: '>=12'} cpu: [arm] os: [linux] '@esbuild/linux-arm@0.19.12': - resolution: - { - integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} cpu: [arm] os: [linux] '@esbuild/linux-arm@0.25.1': - resolution: - { - integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.16.17': - resolution: - { - integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} + engines: {node: '>=12'} cpu: [ia32] os: [linux] '@esbuild/linux-ia32@0.19.12': - resolution: - { - integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} cpu: [ia32] os: [linux] '@esbuild/linux-ia32@0.25.1': - resolution: - { - integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.16.17': - resolution: - { - integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} + engines: {node: '>=12'} cpu: [loong64] os: [linux] '@esbuild/linux-loong64@0.19.12': - resolution: - { - integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} cpu: [loong64] os: [linux] '@esbuild/linux-loong64@0.25.1': - resolution: - { - integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.16.17': - resolution: - { - integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} + engines: {node: '>=12'} cpu: [mips64el] os: [linux] '@esbuild/linux-mips64el@0.19.12': - resolution: - { - integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} cpu: [mips64el] os: [linux] '@esbuild/linux-mips64el@0.25.1': - resolution: - { - integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.16.17': - resolution: - { - integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} + engines: {node: '>=12'} cpu: [ppc64] os: [linux] '@esbuild/linux-ppc64@0.19.12': - resolution: - { - integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} cpu: [ppc64] os: [linux] '@esbuild/linux-ppc64@0.25.1': - resolution: - { - integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.16.17': - resolution: - { - integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} + engines: {node: '>=12'} cpu: [riscv64] os: [linux] '@esbuild/linux-riscv64@0.19.12': - resolution: - { - integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} cpu: [riscv64] os: [linux] '@esbuild/linux-riscv64@0.25.1': - resolution: - { - integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.16.17': - resolution: - { - integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} + engines: {node: '>=12'} cpu: [s390x] os: [linux] '@esbuild/linux-s390x@0.19.12': - resolution: - { - integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} cpu: [s390x] os: [linux] '@esbuild/linux-s390x@0.25.1': - resolution: - { - integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.16.17': - resolution: - { - integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} + engines: {node: '>=12'} cpu: [x64] os: [linux] '@esbuild/linux-x64@0.19.12': - resolution: - { - integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} cpu: [x64] os: [linux] '@esbuild/linux-x64@0.25.1': - resolution: - { - integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.25.1': - resolution: - { - integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.16.17': - resolution: - { - integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} + engines: {node: '>=12'} cpu: [x64] os: [netbsd] '@esbuild/netbsd-x64@0.19.12': - resolution: - { - integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} cpu: [x64] os: [netbsd] '@esbuild/netbsd-x64@0.25.1': - resolution: - { - integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.25.1': - resolution: - { - integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.16.17': - resolution: - { - integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} + engines: {node: '>=12'} cpu: [x64] os: [openbsd] '@esbuild/openbsd-x64@0.19.12': - resolution: - { - integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} cpu: [x64] os: [openbsd] '@esbuild/openbsd-x64@0.25.1': - resolution: - { - integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.16.17': - resolution: - { - integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} + engines: {node: '>=12'} cpu: [x64] os: [sunos] '@esbuild/sunos-x64@0.19.12': - resolution: - { - integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} cpu: [x64] os: [sunos] '@esbuild/sunos-x64@0.25.1': - resolution: - { - integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.16.17': - resolution: - { - integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} + engines: {node: '>=12'} cpu: [arm64] os: [win32] '@esbuild/win32-arm64@0.19.12': - resolution: - { - integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} cpu: [arm64] os: [win32] '@esbuild/win32-arm64@0.25.1': - resolution: - { - integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.16.17': - resolution: - { - integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} + engines: {node: '>=12'} cpu: [ia32] os: [win32] '@esbuild/win32-ia32@0.19.12': - resolution: - { - integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} cpu: [ia32] os: [win32] '@esbuild/win32-ia32@0.25.1': - resolution: - { - integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.16.17': - resolution: - { - integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} + engines: {node: '>=12'} cpu: [x64] os: [win32] '@esbuild/win32-x64@0.19.12': - resolution: - { - integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} cpu: [x64] os: [win32] '@esbuild/win32-x64@0.25.1': - resolution: - { - integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.5.1': - resolution: - { - integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: - { - integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': - resolution: - { - integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@eslint/js@8.57.0': - resolution: - { - integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@eslint/js@8.57.1': - resolution: - { - integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@ethersproject/abi@5.8.0': - resolution: - { - integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==, - } + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} '@ethersproject/abstract-provider@5.8.0': - resolution: - { - integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==, - } + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} '@ethersproject/abstract-signer@5.8.0': - resolution: - { - integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==, - } + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} '@ethersproject/address@5.8.0': - resolution: - { - integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==, - } + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} '@ethersproject/base64@5.8.0': - resolution: - { - integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==, - } + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} '@ethersproject/basex@5.8.0': - resolution: - { - integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==, - } + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} '@ethersproject/bignumber@5.8.0': - resolution: - { - integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==, - } + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} '@ethersproject/bytes@5.8.0': - resolution: - { - integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==, - } + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} '@ethersproject/constants@5.8.0': - resolution: - { - integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==, - } + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} '@ethersproject/contracts@5.8.0': - resolution: - { - integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==, - } + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} '@ethersproject/hash@5.8.0': - resolution: - { - integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==, - } + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} '@ethersproject/hdnode@5.8.0': - resolution: - { - integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==, - } + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} '@ethersproject/json-wallets@5.8.0': - resolution: - { - integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==, - } + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} '@ethersproject/keccak256@5.8.0': - resolution: - { - integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==, - } + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} '@ethersproject/logger@5.8.0': - resolution: - { - integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==, - } + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} '@ethersproject/networks@5.8.0': - resolution: - { - integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==, - } + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} '@ethersproject/pbkdf2@5.8.0': - resolution: - { - integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==, - } + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} '@ethersproject/properties@5.8.0': - resolution: - { - integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==, - } + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} '@ethersproject/providers@5.8.0': - resolution: - { - integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==, - } + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} '@ethersproject/random@5.8.0': - resolution: - { - integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==, - } + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} '@ethersproject/rlp@5.8.0': - resolution: - { - integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==, - } + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} '@ethersproject/sha2@5.8.0': - resolution: - { - integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==, - } + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} '@ethersproject/signing-key@5.8.0': - resolution: - { - integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==, - } + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} '@ethersproject/solidity@5.8.0': - resolution: - { - integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==, - } + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} '@ethersproject/strings@5.8.0': - resolution: - { - integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==, - } + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} '@ethersproject/transactions@5.8.0': - resolution: - { - integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==, - } + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} '@ethersproject/units@5.8.0': - resolution: - { - integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==, - } + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} '@ethersproject/wallet@5.8.0': - resolution: - { - integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==, - } + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} '@ethersproject/web@5.8.0': - resolution: - { - integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==, - } + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} '@ethersproject/wordlists@5.8.0': - resolution: - { - integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==, - } + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: '>=12.22' } + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@hutson/parse-repository-url@3.0.2': - resolution: - { - integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, - } - engines: { node: '>=6.9.0' } - - '@img/sharp-darwin-arm64@0.34.2': - resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.2': - resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.1.0': - resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.1.0': - resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.1.0': - resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.1.0': - resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.1.0': - resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.1.0': - resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.1.0': - resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': - resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.1.0': - resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.2': - resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.2': - resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.34.2': - resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.2': - resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.2': - resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.2': - resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.2': - resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.2': - resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.2': - resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.2': - resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] '@irys/arweave@0.0.2': - resolution: - { - integrity: sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg==, - } + resolution: {integrity: sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg==} '@irys/query@0.0.8': - resolution: - { - integrity: sha512-J8zCZDos2vFogSbroCJHZJq5gnPZEal01Iy3duXAotjIMgrI2ElDANiqEbaP1JAImR1jdUo1ChJnZB7MRLN9Hw==, - } - engines: { node: '>=16.10.0' } + resolution: {integrity: sha512-J8zCZDos2vFogSbroCJHZJq5gnPZEal01Iy3duXAotjIMgrI2ElDANiqEbaP1JAImR1jdUo1ChJnZB7MRLN9Hw==} + engines: {node: '>=16.10.0'} '@irys/sdk@0.1.24': resolution: {integrity: sha512-8vpgd4o/B1KaChPDgSBcLjAJapi16t/6wlV0SIPEJefbPdDKVuPyK36N3SlFeMkYexrBdqQOkLomHxBaWs0pLA==} engines: {node: '>=16.10.0'} + deprecated: 'Arweave support is deprecated - We recommend migrating to the Irys datachain: https://migrate-to.irys.xyz/' hasBin: true '@isaacs/cliui@8.0.2': - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@istanbuljs/load-nyc-config@1.1.0': - resolution: - { - integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} '@istanbuljs/schema@0.1.3': - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} '@jest/console@27.5.1': - resolution: - { - integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/console@28.1.3': - resolution: - { - integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} '@jest/core@27.5.1': - resolution: - { - integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -3157,32 +2350,20 @@ packages: optional: true '@jest/environment@27.5.1': - resolution: - { - integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/fake-timers@27.5.1': - resolution: - { - integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/globals@27.5.1': - resolution: - { - integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/reporters@27.5.1': - resolution: - { - integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -3190,465 +2371,275 @@ packages: optional: true '@jest/schemas@28.1.3': - resolution: - { - integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} '@jest/source-map@27.5.1': - resolution: - { - integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/test-result@27.5.1': - resolution: - { - integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/test-result@28.1.3': - resolution: - { - integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} '@jest/test-sequencer@27.5.1': - resolution: - { - integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/transform@27.5.1': - resolution: - { - integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/types@27.5.1': - resolution: - { - integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} '@jest/types@28.1.3': - resolution: - { - integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} '@jridgewell/gen-mapping@0.3.8': - resolution: - { - integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} '@jridgewell/set-array@1.2.1': - resolution: - { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} '@jridgewell/source-map@0.3.6': - resolution: - { - integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, - } + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} '@jridgewell/sourcemap-codec@1.5.0': - resolution: - { - integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, - } + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': - resolution: - { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, - } + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jridgewell/trace-mapping@0.3.30': - resolution: - { - integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==, - } + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} '@jridgewell/trace-mapping@0.3.9': - resolution: - { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, - } + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} '@jsonjoy.com/base64@1.1.2': - resolution: - { - integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==, - } - engines: { node: '>=10.0' } + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.0.0': + resolution: {integrity: sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.11.0': + resolution: {integrity: sha512-nLqSTAYwpk+5ZQIoVp7pfd/oSKNWlEdvTq2LzVA4r2wtWZg6v+5u0VgBOaDJuUfNOuw/4Ysq6glN5QKSrOCgrA==} + engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.2.0': - resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/util@1.6.0': - resolution: {integrity: sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==} + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' '@leichtgewicht/ip-codec@2.0.5': - resolution: - { - integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==, - } + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} '@manypkg/find-root@1.1.0': - resolution: - { - integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==, - } + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} '@manypkg/get-packages@1.1.3': - resolution: - { - integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==, - } + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} '@metamask/detect-provider@2.0.0': - resolution: - { - integrity: sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==} + engines: {node: '>=14.0.0'} '@napi-rs/wasm-runtime@0.2.7': - resolution: - { - integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==, - } + resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} '@near-js/crypto@0.0.3': - resolution: - { - integrity: sha512-3WC2A1a1cH8Cqrx+0iDjp1ASEEhxN/KHEMENYb0KZH6Hp5bXIY7Akt4quC7JlgJS5ESvEiLa40tS5h0zAhBWGw==, - } + resolution: {integrity: sha512-3WC2A1a1cH8Cqrx+0iDjp1ASEEhxN/KHEMENYb0KZH6Hp5bXIY7Akt4quC7JlgJS5ESvEiLa40tS5h0zAhBWGw==} '@near-js/crypto@0.0.4': - resolution: - { - integrity: sha512-2mSIVv6mZway1rQvmkktrXAFoUvy7POjrHNH3LekKZCMCs7qMM/23Hz2+APgxZPqoV2kjarSNOEYJjxO7zQ/rQ==, - } + resolution: {integrity: sha512-2mSIVv6mZway1rQvmkktrXAFoUvy7POjrHNH3LekKZCMCs7qMM/23Hz2+APgxZPqoV2kjarSNOEYJjxO7zQ/rQ==} '@near-js/keystores-browser@0.0.3': - resolution: - { - integrity: sha512-Ve/JQ1SBxdNk3B49lElJ8Y54AoBY+yOStLvdnUIpe2FBOczzwDCkcnPcMDV0NMwVlHpEnOWICWHbRbAkI5Vs+A==, - } + resolution: {integrity: sha512-Ve/JQ1SBxdNk3B49lElJ8Y54AoBY+yOStLvdnUIpe2FBOczzwDCkcnPcMDV0NMwVlHpEnOWICWHbRbAkI5Vs+A==} '@near-js/keystores@0.0.3': - resolution: - { - integrity: sha512-mnwLYUt4Td8u1I4QE1FBx2d9hMt3ofiriE93FfOluJ4XiqRqVFakFYiHg6pExg5iEkej/sXugBUFeQ4QizUnew==, - } + resolution: {integrity: sha512-mnwLYUt4Td8u1I4QE1FBx2d9hMt3ofiriE93FfOluJ4XiqRqVFakFYiHg6pExg5iEkej/sXugBUFeQ4QizUnew==} '@near-js/keystores@0.0.4': - resolution: - { - integrity: sha512-+vKafmDpQGrz5py1liot2hYSjPGXwihveeN+BL11aJlLqZnWBgYJUWCXG+uyGjGXZORuy2hzkKK6Hi+lbKOfVA==, - } + resolution: {integrity: sha512-+vKafmDpQGrz5py1liot2hYSjPGXwihveeN+BL11aJlLqZnWBgYJUWCXG+uyGjGXZORuy2hzkKK6Hi+lbKOfVA==} '@near-js/providers@0.0.4': - resolution: - { - integrity: sha512-g/2pJTYmsIlTW4mGqeRlqDN9pZeN+1E2/wfoMIf3p++boBVxVlaSebtQgawXAf2lkfhb9RqXz5pHqewXIkTBSw==, - } + resolution: {integrity: sha512-g/2pJTYmsIlTW4mGqeRlqDN9pZeN+1E2/wfoMIf3p++boBVxVlaSebtQgawXAf2lkfhb9RqXz5pHqewXIkTBSw==} '@near-js/signers@0.0.3': - resolution: - { - integrity: sha512-u1R+DDIua5PY1PDFnpVYqdMgQ7c4dyeZsfqMjE7CtgzdqupgTYCXzJjBubqMlAyAx843PoXmLt6CSSKcMm0WUA==, - } + resolution: {integrity: sha512-u1R+DDIua5PY1PDFnpVYqdMgQ7c4dyeZsfqMjE7CtgzdqupgTYCXzJjBubqMlAyAx843PoXmLt6CSSKcMm0WUA==} '@near-js/signers@0.0.4': - resolution: - { - integrity: sha512-xCglo3U/WIGsz/izPGFMegS5Q3PxOHYB8a1E7RtVhNm5QdqTlQldLCm/BuMg2G/u1l1ZZ0wdvkqRTG9joauf3Q==, - } + resolution: {integrity: sha512-xCglo3U/WIGsz/izPGFMegS5Q3PxOHYB8a1E7RtVhNm5QdqTlQldLCm/BuMg2G/u1l1ZZ0wdvkqRTG9joauf3Q==} '@near-js/transactions@0.1.0': - resolution: - { - integrity: sha512-OrrDFqhX0rtH+6MV3U3iS+zmzcPQI+L4GJi9na4Uf8FgpaVPF0mtSmVrpUrS5CC3LwWCzcYF833xGYbXOV4Kfg==, - } + resolution: {integrity: sha512-OrrDFqhX0rtH+6MV3U3iS+zmzcPQI+L4GJi9na4Uf8FgpaVPF0mtSmVrpUrS5CC3LwWCzcYF833xGYbXOV4Kfg==} '@near-js/transactions@0.1.1': - resolution: - { - integrity: sha512-Fk83oLLFK7nz4thawpdv9bGyMVQ2i48iUtZEVYhuuuqevl17tSXMlhle9Me1ZbNyguJG/cWPdNybe1UMKpyGxA==, - } + resolution: {integrity: sha512-Fk83oLLFK7nz4thawpdv9bGyMVQ2i48iUtZEVYhuuuqevl17tSXMlhle9Me1ZbNyguJG/cWPdNybe1UMKpyGxA==} '@near-js/types@0.0.3': - resolution: - { - integrity: sha512-gC3iGUT+r2JjVsE31YharT+voat79ToMUMLCGozHjp/R/UW1M2z4hdpqTUoeWUBGBJuVc810gNTneHGx0jvzwQ==, - } + resolution: {integrity: sha512-gC3iGUT+r2JjVsE31YharT+voat79ToMUMLCGozHjp/R/UW1M2z4hdpqTUoeWUBGBJuVc810gNTneHGx0jvzwQ==} '@near-js/types@0.0.4': - resolution: - { - integrity: sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg==, - } + resolution: {integrity: sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg==} '@near-js/utils@0.0.3': - resolution: - { - integrity: sha512-J72n/EL0VfLRRb4xNUF4rmVrdzMkcmkwJOhBZSTWz3PAZ8LqNeU9ZConPfMvEr6lwdaD33ZuVv70DN6IIjPr1A==, - } + resolution: {integrity: sha512-J72n/EL0VfLRRb4xNUF4rmVrdzMkcmkwJOhBZSTWz3PAZ8LqNeU9ZConPfMvEr6lwdaD33ZuVv70DN6IIjPr1A==} '@near-js/utils@0.0.4': - resolution: - { - integrity: sha512-mPUEPJbTCMicGitjEGvQqOe8AS7O4KkRCxqd0xuE/X6gXF1jz1pYMZn4lNUeUz2C84YnVSGLAM0o9zcN6Y4hiA==, - } + resolution: {integrity: sha512-mPUEPJbTCMicGitjEGvQqOe8AS7O4KkRCxqd0xuE/X6gXF1jz1pYMZn4lNUeUz2C84YnVSGLAM0o9zcN6Y4hiA==} '@next/env@15.3.4': - resolution: - { - integrity: sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ==, - } + resolution: {integrity: sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ==} '@next/eslint-plugin-next@14.0.4': - resolution: - { - integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==, - } + resolution: {integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==} '@next/swc-darwin-arm64@15.3.4': - resolution: - { - integrity: sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] '@next/swc-darwin-x64@15.3.4': - resolution: - { - integrity: sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] '@next/swc-linux-arm64-gnu@15.3.4': - resolution: - { - integrity: sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@next/swc-linux-arm64-musl@15.3.4': - resolution: - { - integrity: sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@next/swc-linux-x64-gnu@15.3.4': - resolution: - { - integrity: sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] '@next/swc-linux-x64-musl@15.3.4': - resolution: - { - integrity: sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] '@next/swc-win32-arm64-msvc@15.3.4': - resolution: - { - integrity: sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] '@next/swc-win32-x64-msvc@15.3.4': - resolution: - { - integrity: sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: - { - integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==, - } - - '@noble/ciphers@1.3.0': - resolution: - { - integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==, - } - engines: { node: ^14.21.3 || >=16 } + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.8.1': - resolution: - { - integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==, - } - engines: { node: ^14.21.3 || >=16 } - - '@noble/curves@1.9.2': - resolution: - { - integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==, - } - engines: { node: ^14.21.3 || >=16 } + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} '@noble/curves@1.9.2': resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} engines: {node: ^14.21.3 || >=16} '@noble/ed25519@1.7.3': - resolution: - { - integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==, - } - - '@noble/hashes@1.7.1': - resolution: - { - integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==, - } - engines: { node: ^14.21.3 || >=16 } - - '@noble/hashes@1.8.0': - resolution: - { - integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==, - } - engines: { node: ^14.21.3 || >=16 } + resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@nolyfill/is-core-module@1.0.39': - resolution: - { - integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==, - } - engines: { node: '>=12.4.0' } + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} '@nucypher/nucypher-contracts@0.25.0': - resolution: - { - integrity: sha512-4fRPKY6RzkXY1Zv2O0auJZsvP6z7tuj+Fsy83yJvADqFwRuIJfSlwgSgLwISX6q838SRG/Ve2i+sMLZRaVJfYw==, - } + resolution: {integrity: sha512-4fRPKY6RzkXY1Zv2O0auJZsvP6z7tuj+Fsy83yJvADqFwRuIJfSlwgSgLwISX6q838SRG/Ve2i+sMLZRaVJfYw==} '@nucypher/nucypher-core@0.14.5': - resolution: - { - integrity: sha512-Q3kBuJL0qtTtnxrM5DEQauQUvDlXmwubm9u1h7gbyLhs+aZNC9WDyjEUbE43+uahlHu4k1hKEMxD1gjV165ChA==, - } + resolution: {integrity: sha512-Q3kBuJL0qtTtnxrM5DEQauQUvDlXmwubm9u1h7gbyLhs+aZNC9WDyjEUbE43+uahlHu4k1hKEMxD1gjV165ChA==} '@nucypher/shared@0.5.0': - resolution: - { - integrity: sha512-Y+0oEgVtoud4BP/pvj2elPm5igrQ8AAUwYYmUiLpXNqQMRF4zFnYaGbl+xhKk45CYG8S9cDKJEN8nopzVADTNw==, - } - engines: { node: '>=18', pnpm: '>=8.0.0' } + resolution: {integrity: sha512-Y+0oEgVtoud4BP/pvj2elPm5igrQ8AAUwYYmUiLpXNqQMRF4zFnYaGbl+xhKk45CYG8S9cDKJEN8nopzVADTNw==} + engines: {node: '>=18', pnpm: '>=8.0.0'} '@nucypher/taco-auth@0.3.0': - resolution: - { - integrity: sha512-z3s7kzshUkR/F5Xd0/TBFePvqW0sweta+WbZ5I+4OGsMrS2TkWm4uamvhf+NYhi3jvPjOplTWUbBH99JDCd+AQ==, - } - engines: { node: '>=18', pnpm: '>=8.0.0' } + resolution: {integrity: sha512-z3s7kzshUkR/F5Xd0/TBFePvqW0sweta+WbZ5I+4OGsMrS2TkWm4uamvhf+NYhi3jvPjOplTWUbBH99JDCd+AQ==} + engines: {node: '>=18', pnpm: '>=8.0.0'} '@nucypher/taco@0.6.0': - resolution: - { - integrity: sha512-LehkMgoM7VDgqg3kqvMX8PFOiVgyFMVAqsbdbcffj31z2tf7C0q8RBinj61YDaLotx++py6us6M+T2cJAywnaA==, - } - engines: { node: '>=18', pnpm: '>=8.0.0' } + resolution: {integrity: sha512-LehkMgoM7VDgqg3kqvMX8PFOiVgyFMVAqsbdbcffj31z2tf7C0q8RBinj61YDaLotx++py6us6M+T2cJAywnaA==} + engines: {node: '>=18', pnpm: '>=8.0.0'} '@pkgjs/parseargs@0.11.0': - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} '@pmmmwh/react-refresh-webpack-plugin@0.5.15': - resolution: - { - integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==, - } - engines: { node: '>= 10.13' } + resolution: {integrity: sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==} + engines: {node: '>= 10.13'} peerDependencies: '@types/webpack': 4.x || 5.x react-refresh: '>=0.10.0 <1.0.0' @@ -3672,8 +2663,8 @@ packages: webpack-plugin-serve: optional: true - '@pmmmwh/react-refresh-webpack-plugin@0.6.0': - resolution: {integrity: sha512-AAc+QWfZ1KQ/e1C6OHWVlxU+ks6zFGOA44IJUlvju7RlDS8nsX6poPFOIlsg/rTofO9vKov12+WCjMhKkRKD5g==} + '@pmmmwh/react-refresh-webpack-plugin@0.6.1': + resolution: {integrity: sha512-95DXXJxNkpYu+sqmpDp7vbw9JCyiNpHuCsvuMuOgVFrKQlwEIn9Y1+NNIQJq+zFL+eWyxw6htthB5CtdwJupNA==} engines: {node: '>=18.12'} peerDependencies: '@types/webpack': 5.x @@ -3699,23 +2690,14 @@ packages: optional: true '@randlabs/communication-bridge@1.0.1': - resolution: - { - integrity: sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==, - } + resolution: {integrity: sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==} '@randlabs/myalgo-connect@1.4.2': - resolution: - { - integrity: sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA==, - } + resolution: {integrity: sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA==} '@rollup/plugin-babel@5.3.1': - resolution: - { - integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==, - } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} peerDependencies: '@babel/core': ^7.0.0 '@types/babel__core': ^7.1.9 @@ -3725,502 +2707,274 @@ packages: optional: true '@rollup/plugin-node-resolve@11.2.1': - resolution: - { - integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==, - } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 '@rollup/plugin-replace@2.4.2': - resolution: - { - integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==, - } + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 '@rollup/pluginutils@3.1.0': - resolution: - { - integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==, - } - engines: { node: '>= 8.0.0' } + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 '@rollup/rollup-android-arm-eabi@4.37.0': - resolution: - { - integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==, - } + resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.37.0': - resolution: - { - integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==, - } + resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.37.0': - resolution: - { - integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==, - } + resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.37.0': - resolution: - { - integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==, - } + resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.37.0': - resolution: - { - integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==, - } + resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.37.0': - resolution: - { - integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==, - } + resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.37.0': - resolution: - { - integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==, - } + resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.37.0': - resolution: - { - integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==, - } + resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.37.0': - resolution: - { - integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==, - } + resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.37.0': - resolution: - { - integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==, - } + resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} cpu: [arm64] os: [linux] '@rollup/rollup-linux-loongarch64-gnu@4.37.0': - resolution: - { - integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==, - } + resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} cpu: [loong64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': - resolution: - { - integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==, - } + resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.37.0': - resolution: - { - integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==, - } + resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} cpu: [riscv64] os: [linux] '@rollup/rollup-linux-riscv64-musl@4.37.0': - resolution: - { - integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==, - } + resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.37.0': - resolution: - { - integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==, - } + resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.37.0': - resolution: - { - integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==, - } + resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.37.0': - resolution: - { - integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==, - } + resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.37.0': - resolution: - { - integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==, - } + resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.37.0': - resolution: - { - integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==, - } + resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.37.0': - resolution: - { - integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==, - } + resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} cpu: [x64] os: [win32] '@rtsao/scc@1.1.0': - resolution: - { - integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, - } + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@rushstack/eslint-patch@1.11.0': - resolution: - { - integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==, - } - - '@scure/base@1.2.4': - resolution: - { - integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==, - } - - '@scure/base@1.2.6': - resolution: - { - integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==, - } + resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==} '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - '@scure/bip32@1.6.2': - resolution: - { - integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==, - } - - '@scure/bip32@1.7.0': - resolution: - { - integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==, - } - '@scure/bip32@1.7.0': resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} - '@scure/bip39@1.5.4': - resolution: - { - integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==, - } - - '@scure/bip39@1.6.0': - resolution: - { - integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==, - } - '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} '@sinclair/typebox@0.24.51': - resolution: - { - integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==, - } + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} '@sindresorhus/is@4.6.0': - resolution: - { - integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} '@sinonjs/commons@1.8.6': - resolution: - { - integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==, - } + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} '@sinonjs/fake-timers@8.1.0': - resolution: - { - integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==, - } + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} '@skypack/package-check@0.2.2': - resolution: - { - integrity: sha512-T4Wyi9lUuz0a1C2OHuzqZ0aFOCI0AmaGTb2LP9sHgWdoHXlB3JU02gfBpa0Y081G/gFsJYpQ/R0iCJRzF/nknw==, - } + resolution: {integrity: sha512-T4Wyi9lUuz0a1C2OHuzqZ0aFOCI0AmaGTb2LP9sHgWdoHXlB3JU02gfBpa0Y081G/gFsJYpQ/R0iCJRzF/nknw==} hasBin: true '@solana/buffer-layout@4.0.1': - resolution: - { - integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==, - } - engines: { node: '>=5.10' } + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} '@solana/web3.js@1.98.0': - resolution: - { - integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==, - } + resolution: {integrity: sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==} '@spruceid/siwe-parser@3.0.0': - resolution: - { - integrity: sha512-Y92k63ilw/8jH9Ry4G2e7lQd0jZAvb0d/Q7ssSD0D9mp/Zt2aCXIc3g0ny9yhplpAx1QXHsMz/JJptHK/zDGdw==, - } + resolution: {integrity: sha512-Y92k63ilw/8jH9Ry4G2e7lQd0jZAvb0d/Q7ssSD0D9mp/Zt2aCXIc3g0ny9yhplpAx1QXHsMz/JJptHK/zDGdw==} '@stablelib/binary@1.0.1': - resolution: - { - integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==, - } + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} '@stablelib/int@1.0.1': - resolution: - { - integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==, - } + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} '@stablelib/random@1.0.2': - resolution: - { - integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==, - } + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} '@stablelib/wipe@1.0.1': - resolution: - { - integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==, - } + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} '@supercharge/promise-pool@3.2.0': - resolution: - { - integrity: sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-pj0cAALblTZBPtMltWOlZTQSLT07jIaFNeM8TWoJD1cQMgDB9mcMlVMoetiB35OzNJpqQ2b+QEtwiR9f20mADg==} + engines: {node: '>=8'} '@surma/rollup-plugin-off-main-thread@2.2.3': - resolution: - { - integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, - } + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} '@svgr/babel-plugin-add-jsx-attribute@5.4.0': - resolution: - { - integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==} + engines: {node: '>=10'} '@svgr/babel-plugin-remove-jsx-attribute@5.4.0': - resolution: - { - integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==} + engines: {node: '>=10'} '@svgr/babel-plugin-remove-jsx-empty-expression@5.0.1': - resolution: - { - integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==} + engines: {node: '>=10'} '@svgr/babel-plugin-replace-jsx-attribute-value@5.0.1': - resolution: - { - integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==} + engines: {node: '>=10'} '@svgr/babel-plugin-svg-dynamic-title@5.4.0': - resolution: - { - integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==} + engines: {node: '>=10'} '@svgr/babel-plugin-svg-em-dimensions@5.4.0': - resolution: - { - integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==} + engines: {node: '>=10'} '@svgr/babel-plugin-transform-react-native-svg@5.4.0': - resolution: - { - integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==} + engines: {node: '>=10'} '@svgr/babel-plugin-transform-svg-component@5.5.0': - resolution: - { - integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==} + engines: {node: '>=10'} '@svgr/babel-preset@5.5.0': - resolution: - { - integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==} + engines: {node: '>=10'} '@svgr/core@5.5.0': - resolution: - { - integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==} + engines: {node: '>=10'} '@svgr/hast-util-to-babel-ast@5.5.0': - resolution: - { - integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} + engines: {node: '>=10'} '@svgr/plugin-jsx@5.5.0': - resolution: - { - integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} + engines: {node: '>=10'} '@svgr/plugin-svgo@5.5.0': - resolution: - { - integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==} + engines: {node: '>=10'} '@svgr/webpack@5.5.0': - resolution: - { - integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} + engines: {node: '>=10'} '@swc/counter@0.1.3': - resolution: - { - integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, - } + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} '@swc/helpers@0.5.15': - resolution: - { - integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==, - } + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@szmarczak/http-timer@4.0.6': - resolution: - { - integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} '@tootallnate/once@1.1.2': - resolution: - { - integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} '@trysound/sax@0.2.0': - resolution: - { - integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} '@tsconfig/node10@1.0.11': - resolution: - { - integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==, - } + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@tsconfig/node12@1.0.11': - resolution: - { - integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, - } + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} '@tsconfig/node14@1.0.3': - resolution: - { - integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, - } + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} '@tsconfig/node16@1.0.4': - resolution: - { - integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, - } + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} '@tybys/wasm-util@0.9.0': - resolution: - { - integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==, - } + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} '@typechain/ethers-v5@11.1.2': - resolution: - { - integrity: sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==, - } + resolution: {integrity: sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==} peerDependencies: '@ethersproject/abi': ^5.0.0 '@ethersproject/providers': ^5.0.0 @@ -4229,430 +2983,220 @@ packages: typescript: '>=4.3.0' '@types/babel__core@7.20.5': - resolution: - { - integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, - } + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} '@types/babel__generator@7.6.8': - resolution: - { - integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==, - } + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} '@types/babel__template@7.4.4': - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - } + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} '@types/babel__traverse@7.20.7': - resolution: - { - integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==, - } + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} '@types/body-parser@1.19.5': - resolution: - { - integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, - } + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} '@types/bonjour@3.5.13': - resolution: - { - integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==, - } + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} '@types/cacheable-request@6.0.3': - resolution: - { - integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==, - } + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} '@types/connect-history-api-fallback@1.5.4': - resolution: - { - integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==, - } + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} '@types/connect@3.4.38': - resolution: - { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, - } + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} '@types/conventional-commits-parser@5.0.1': - resolution: - { - integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==, - } + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} '@types/deep-equal@1.0.4': - resolution: - { - integrity: sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==, - } + resolution: {integrity: sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==} '@types/eslint-scope@3.7.7': - resolution: - { - integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==, - } + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} '@types/eslint@8.56.12': - resolution: - { - integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==, - } + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} '@types/eslint@9.6.1': - resolution: - { - integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==, - } + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} '@types/estree@0.0.39': - resolution: - { - integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==, - } + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} '@types/estree@1.0.6': - resolution: - { - integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, - } + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} '@types/estree@1.0.7': - resolution: - { - integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==, - } + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/estree@1.0.8': - resolution: - { - integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, - } + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/express-serve-static-core@4.19.6': - resolution: - { - integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==, - } + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} '@types/express-serve-static-core@5.0.6': - resolution: - { - integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==, - } + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} '@types/express@4.17.21': - resolution: - { - integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, - } + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} '@types/graceful-fs@4.1.9': - resolution: - { - integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, - } + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} '@types/html-minifier-terser@6.1.0': - resolution: - { - integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==, - } + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} '@types/http-cache-semantics@4.0.4': - resolution: - { - integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==, - } + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} '@types/http-errors@2.0.4': - resolution: - { - integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, - } + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} '@types/http-proxy@1.17.16': - resolution: - { - integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==, - } + resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} '@types/istanbul-lib-coverage@2.0.6': - resolution: - { - integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, - } + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} '@types/istanbul-lib-report@3.0.3': - resolution: - { - integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, - } + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} '@types/istanbul-reports@3.0.4': - resolution: - { - integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, - } + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} '@types/json-schema@7.0.15': - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': - resolution: - { - integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, - } + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} '@types/keyv@3.1.4': - resolution: - { - integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==, - } + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} '@types/lodash@4.17.16': - resolution: - { - integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==, - } + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} '@types/mime@1.3.5': - resolution: - { - integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, - } + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} '@types/minimist@1.2.5': - resolution: - { - integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==, - } + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} '@types/node-forge@1.3.11': - resolution: - { - integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, - } + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} '@types/node@11.11.6': - resolution: - { - integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==, - } + resolution: {integrity: sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==} '@types/node@12.20.55': - resolution: - { - integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==, - } - - '@types/node@20.11.30': - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.17.28': - resolution: {integrity: sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==} + '@types/node@20.19.17': + resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==} - '@types/node@22.13.14': - resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} '@types/normalize-package-data@2.4.4': - resolution: - { - integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, - } + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} '@types/parse-json@4.0.2': - resolution: - { - integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, - } + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} '@types/prettier@2.7.3': - resolution: - { - integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==, - } + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} '@types/prop-types@15.7.14': - resolution: - { - integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==, - } + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} '@types/q@1.5.8': - resolution: - { - integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==, - } + resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} '@types/qs@6.9.18': - resolution: - { - integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==, - } + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} '@types/range-parser@1.2.7': - resolution: - { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, - } + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} '@types/react-copy-to-clipboard@5.0.7': - resolution: - { - integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==, - } + resolution: {integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==} '@types/react-dom@18.3.0': - resolution: - { - integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==, - } + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} '@types/react-dom@18.3.5': - resolution: - { - integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==, - } + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} peerDependencies: '@types/react': ^18.0.0 '@types/react@18.3.20': - resolution: - { - integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==, - } + resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} '@types/react@18.3.5': - resolution: - { - integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==, - } + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} '@types/resolve@1.17.1': - resolution: - { - integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==, - } + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} '@types/responselike@1.0.3': - resolution: - { - integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==, - } + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} '@types/retry@0.12.0': - resolution: - { - integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, - } + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} '@types/retry@0.12.2': - resolution: - { - integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==, - } + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} '@types/semver@7.7.0': - resolution: - { - integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==, - } + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} '@types/send@0.17.4': - resolution: - { - integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, - } + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} '@types/serve-index@1.9.4': - resolution: - { - integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==, - } + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} '@types/serve-static@1.15.7': - resolution: - { - integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, - } + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} '@types/sockjs@0.3.36': - resolution: - { - integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==, - } + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} '@types/stack-utils@2.0.3': - resolution: - { - integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, - } + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/tmp@0.2.6': - resolution: - { - integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==, - } + resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} '@types/trusted-types@2.0.7': - resolution: - { - integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, - } + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} '@types/uuid@8.3.4': - resolution: - { - integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==, - } + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} '@types/ws@7.4.7': - resolution: - { - integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==, - } + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} '@types/ws@8.18.0': - resolution: - { - integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==, - } + resolution: {integrity: sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==} '@types/yargs-parser@21.0.3': - resolution: - { - integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, - } + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} '@types/yargs@16.0.9': - resolution: - { - integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==, - } + resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} '@types/yargs@17.0.33': - resolution: - { - integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==, - } + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} '@typescript-eslint/eslint-plugin@5.62.0': - resolution: - { - integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4662,11 +3206,8 @@ packages: optional: true '@typescript-eslint/eslint-plugin@6.21.0': - resolution: - { - integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha eslint: ^7.0.0 || ^8.0.0 @@ -4676,20 +3217,14 @@ packages: optional: true '@typescript-eslint/experimental-utils@5.62.0': - resolution: - { - integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 '@typescript-eslint/parser@5.62.0': - resolution: - { - integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' @@ -4698,11 +3233,8 @@ packages: optional: true '@typescript-eslint/parser@6.21.0': - resolution: - { - integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 typescript: '*' @@ -4711,25 +3243,16 @@ packages: optional: true '@typescript-eslint/scope-manager@5.62.0': - resolution: - { - integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@typescript-eslint/scope-manager@6.21.0': - resolution: - { - integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/type-utils@5.62.0': - resolution: - { - integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' typescript: '*' @@ -4738,11 +3261,8 @@ packages: optional: true '@typescript-eslint/type-utils@6.21.0': - resolution: - { - integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 typescript: '*' @@ -4751,25 +3271,16 @@ packages: optional: true '@typescript-eslint/types@5.62.0': - resolution: - { - integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@typescript-eslint/types@6.21.0': - resolution: - { - integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} '@typescript-eslint/typescript-estree@5.62.0': - resolution: - { - integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4777,11 +3288,8 @@ packages: optional: true '@typescript-eslint/typescript-estree@6.21.0': - resolution: - { - integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4789,185 +3297,116 @@ packages: optional: true '@typescript-eslint/utils@5.62.0': - resolution: - { - integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 '@typescript-eslint/utils@6.21.0': - resolution: - { - integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 '@typescript-eslint/visitor-keys@5.62.0': - resolution: - { - integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@typescript-eslint/visitor-keys@6.21.0': - resolution: - { - integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==, - } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} '@ungap/structured-clone@1.3.0': - resolution: - { - integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, - } + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@uniswap/token-lists@1.0.0-beta.34': - resolution: - { - integrity: sha512-Hc3TfrFaupg0M84e/Zv7BoF+fmMWDV15mZ5s8ZQt2qZxUcNw2GQW+L6L/2k74who31G+p1m3GRYbJpAo7d1pqA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Hc3TfrFaupg0M84e/Zv7BoF+fmMWDV15mZ5s8ZQt2qZxUcNw2GQW+L6L/2k74who31G+p1m3GRYbJpAo7d1pqA==} + engines: {node: '>=10'} '@unrs/resolver-binding-darwin-arm64@1.3.2': - resolution: - { - integrity: sha512-ddnlXgRi0Fog5+7U5Q1qY62wl95Q1lB4tXQX1UIA9YHmRCHN2twaQW0/4tDVGCvTVEU3xEayU7VemEr7GcBYUw==, - } + resolution: {integrity: sha512-ddnlXgRi0Fog5+7U5Q1qY62wl95Q1lB4tXQX1UIA9YHmRCHN2twaQW0/4tDVGCvTVEU3xEayU7VemEr7GcBYUw==} cpu: [arm64] os: [darwin] '@unrs/resolver-binding-darwin-x64@1.3.2': - resolution: - { - integrity: sha512-tnl9xoEeg503jis+LW5cuq4hyLGQyqaoBL8VdPSqcewo/FL1C8POHbzl+AL25TidWYJD+R6bGUTE381kA1sT9w==, - } + resolution: {integrity: sha512-tnl9xoEeg503jis+LW5cuq4hyLGQyqaoBL8VdPSqcewo/FL1C8POHbzl+AL25TidWYJD+R6bGUTE381kA1sT9w==} cpu: [x64] os: [darwin] '@unrs/resolver-binding-freebsd-x64@1.3.2': - resolution: - { - integrity: sha512-zyPn9LFCCjhKPeCtECZaiMUgkYN/VpLb4a9Xv7QriJmTaQxsuDtXqOHifrzUXIhorJTyS+5MOKDuNL0X9I4EHA==, - } + resolution: {integrity: sha512-zyPn9LFCCjhKPeCtECZaiMUgkYN/VpLb4a9Xv7QriJmTaQxsuDtXqOHifrzUXIhorJTyS+5MOKDuNL0X9I4EHA==} cpu: [x64] os: [freebsd] '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.2': - resolution: - { - integrity: sha512-UWx56Wh59Ro69fe+Wfvld4E1n9KG0e3zeouWLn8eSasyi/yVH/7ZW3CLTVFQ81oMKSpXwr5u6RpzttDXZKiO4g==, - } + resolution: {integrity: sha512-UWx56Wh59Ro69fe+Wfvld4E1n9KG0e3zeouWLn8eSasyi/yVH/7ZW3CLTVFQ81oMKSpXwr5u6RpzttDXZKiO4g==} cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm-musleabihf@1.3.2': - resolution: - { - integrity: sha512-VYGQXsOEJtfaoY2fOm8Z9ii5idFaHFYlrq3yMFZPaFKo8ufOXYm8hnfru7qetbM9MX116iWaPC0ZX5sK+1Dr+g==, - } + resolution: {integrity: sha512-VYGQXsOEJtfaoY2fOm8Z9ii5idFaHFYlrq3yMFZPaFKo8ufOXYm8hnfru7qetbM9MX116iWaPC0ZX5sK+1Dr+g==} cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm64-gnu@1.3.2': - resolution: - { - integrity: sha512-3zP420zxJfYPD1rGp2/OTIBxF8E3+/6VqCG+DEO6kkDgBiloa7Y8pw1o7N9BfgAC+VC8FPZsFXhV2lpx+lLRMQ==, - } + resolution: {integrity: sha512-3zP420zxJfYPD1rGp2/OTIBxF8E3+/6VqCG+DEO6kkDgBiloa7Y8pw1o7N9BfgAC+VC8FPZsFXhV2lpx+lLRMQ==} cpu: [arm64] os: [linux] '@unrs/resolver-binding-linux-arm64-musl@1.3.2': - resolution: - { - integrity: sha512-ZWjSleUgr88H4Kei7yT4PlPqySTuWN1OYDDcdbmMCtLWFly3ed+rkrcCb3gvqXdDbYrGOtzv3g2qPEN+WWNv5Q==, - } + resolution: {integrity: sha512-ZWjSleUgr88H4Kei7yT4PlPqySTuWN1OYDDcdbmMCtLWFly3ed+rkrcCb3gvqXdDbYrGOtzv3g2qPEN+WWNv5Q==} cpu: [arm64] os: [linux] '@unrs/resolver-binding-linux-ppc64-gnu@1.3.2': - resolution: - { - integrity: sha512-p+5OvYJ2UOlpjes3WfBlxyvQok2u26hLyPxLFHkYlfzhZW0juhvBf/tvewz1LDFe30M7zL9cF4OOO5dcvtk+cw==, - } + resolution: {integrity: sha512-p+5OvYJ2UOlpjes3WfBlxyvQok2u26hLyPxLFHkYlfzhZW0juhvBf/tvewz1LDFe30M7zL9cF4OOO5dcvtk+cw==} cpu: [ppc64] os: [linux] '@unrs/resolver-binding-linux-s390x-gnu@1.3.2': - resolution: - { - integrity: sha512-yweY7I6SqNn3kvj6vE4PQRo7j8Oz6+NiUhmgciBNAUOuI3Jq0bnW29hbHJdxZRSN1kYkQnSkbbA1tT8VnK816w==, - } + resolution: {integrity: sha512-yweY7I6SqNn3kvj6vE4PQRo7j8Oz6+NiUhmgciBNAUOuI3Jq0bnW29hbHJdxZRSN1kYkQnSkbbA1tT8VnK816w==} cpu: [s390x] os: [linux] '@unrs/resolver-binding-linux-x64-gnu@1.3.2': - resolution: - { - integrity: sha512-fNIvtzJcGN9hzWTIayrTSk2+KHQrqKbbY+I88xMVMOFV9t4AXha4veJdKaIuuks+2JNr6GuuNdsL7+exywZ32w==, - } + resolution: {integrity: sha512-fNIvtzJcGN9hzWTIayrTSk2+KHQrqKbbY+I88xMVMOFV9t4AXha4veJdKaIuuks+2JNr6GuuNdsL7+exywZ32w==} cpu: [x64] os: [linux] '@unrs/resolver-binding-linux-x64-musl@1.3.2': - resolution: - { - integrity: sha512-OaFEw8WAjiwBGxutQgkWhoAGB5BQqZJ8Gjt/mW+m6DWNjimcxU22uWCuEtfw1CIwLlKPOzsgH0429fWmZcTGkg==, - } + resolution: {integrity: sha512-OaFEw8WAjiwBGxutQgkWhoAGB5BQqZJ8Gjt/mW+m6DWNjimcxU22uWCuEtfw1CIwLlKPOzsgH0429fWmZcTGkg==} cpu: [x64] os: [linux] '@unrs/resolver-binding-wasm32-wasi@1.3.2': - resolution: - { - integrity: sha512-u+sumtO7M0AGQ9bNQrF4BHNpUyxo23FM/yXZfmVAicTQ+mXtG06O7pm5zQUw3Mr4jRs2I84uh4O0hd8bdouuvQ==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-u+sumtO7M0AGQ9bNQrF4BHNpUyxo23FM/yXZfmVAicTQ+mXtG06O7pm5zQUw3Mr4jRs2I84uh4O0hd8bdouuvQ==} + engines: {node: '>=14.0.0'} cpu: [wasm32] '@unrs/resolver-binding-win32-arm64-msvc@1.3.2': - resolution: - { - integrity: sha512-ZAJKy95vmDIHsRFuPNqPQRON8r2mSMf3p9DoX+OMOhvu2c8OXGg8MvhGRf3PNg45ozRrPdXDnngURKgaFfpGoQ==, - } + resolution: {integrity: sha512-ZAJKy95vmDIHsRFuPNqPQRON8r2mSMf3p9DoX+OMOhvu2c8OXGg8MvhGRf3PNg45ozRrPdXDnngURKgaFfpGoQ==} cpu: [arm64] os: [win32] '@unrs/resolver-binding-win32-ia32-msvc@1.3.2': - resolution: - { - integrity: sha512-nQG4YFAS2BLoKVQFK/FrWJvFATI5DQUWQrcPcsWG9Ve5BLLHZuPOrJ2SpAJwLXQrRv6XHSFAYGI8wQpBg/CiFA==, - } + resolution: {integrity: sha512-nQG4YFAS2BLoKVQFK/FrWJvFATI5DQUWQrcPcsWG9Ve5BLLHZuPOrJ2SpAJwLXQrRv6XHSFAYGI8wQpBg/CiFA==} cpu: [ia32] os: [win32] '@unrs/resolver-binding-win32-x64-msvc@1.3.2': - resolution: - { - integrity: sha512-XBWpUP0mHya6yGBwNefhyEa6V7HgYKCxEAY4qhTm/PcAQyBPNmjj97VZJOJkVdUsyuuii7xmq0pXWX/c2aToHQ==, - } + resolution: {integrity: sha512-XBWpUP0mHya6yGBwNefhyEa6V7HgYKCxEAY4qhTm/PcAQyBPNmjj97VZJOJkVdUsyuuii7xmq0pXWX/c2aToHQ==} cpu: [x64] os: [win32] '@usedapp/core@1.2.16': - resolution: - { - integrity: sha512-IgJzxItngsSDoVemXChFqiqqvV9gjp7OvEaM2ajZ3GZPA3JMBKw+tPBwhjjjKvnHgcIpE4kEBaWaosYqMzQG0Q==, - } + resolution: {integrity: sha512-IgJzxItngsSDoVemXChFqiqqvV9gjp7OvEaM2ajZ3GZPA3JMBKw+tPBwhjjjKvnHgcIpE4kEBaWaosYqMzQG0Q==} hasBin: true peerDependencies: ethers: ^5 react: '*' '@vitest/coverage-v8@3.2.4': - resolution: - { - integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==, - } + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} peerDependencies: '@vitest/browser': 3.2.4 vitest: 3.2.4 @@ -4976,16 +3415,10 @@ packages: optional: true '@vitest/expect@3.0.9': - resolution: - { - integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==, - } + resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} '@vitest/mocker@3.0.9': - resolution: - { - integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==, - } + resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -4996,151 +3429,82 @@ packages: optional: true '@vitest/pretty-format@3.0.9': - resolution: - { - integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==, - } + resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} '@vitest/runner@3.0.9': - resolution: - { - integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==, - } + resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} '@vitest/snapshot@3.0.9': - resolution: - { - integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==, - } + resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} '@vitest/spy@3.0.9': - resolution: - { - integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==, - } + resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} '@vitest/utils@3.0.9': - resolution: - { - integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==, - } + resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} '@webassemblyjs/ast@1.14.1': - resolution: - { - integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==, - } + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: - { - integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==, - } + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} '@webassemblyjs/helper-api-error@1.13.2': - resolution: - { - integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==, - } + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} '@webassemblyjs/helper-buffer@1.14.1': - resolution: - { - integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==, - } + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} '@webassemblyjs/helper-numbers@1.13.2': - resolution: - { - integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==, - } + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: - { - integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==, - } + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: - { - integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==, - } + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} '@webassemblyjs/ieee754@1.13.2': - resolution: - { - integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==, - } + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} '@webassemblyjs/leb128@1.13.2': - resolution: - { - integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==, - } + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} '@webassemblyjs/utf8@1.13.2': - resolution: - { - integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==, - } + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} '@webassemblyjs/wasm-edit@1.14.1': - resolution: - { - integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==, - } + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} '@webassemblyjs/wasm-gen@1.14.1': - resolution: - { - integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==, - } + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} '@webassemblyjs/wasm-opt@1.14.1': - resolution: - { - integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==, - } + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} '@webassemblyjs/wasm-parser@1.14.1': - resolution: - { - integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==, - } + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} '@webassemblyjs/wast-printer@1.14.1': - resolution: - { - integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==, - } + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} '@webpack-cli/configtest@3.0.1': - resolution: - { - integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==, - } - engines: { node: '>=18.12.0' } + resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} + engines: {node: '>=18.12.0'} peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x '@webpack-cli/info@3.0.1': - resolution: - { - integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==, - } - engines: { node: '>=18.12.0' } + resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} + engines: {node: '>=18.12.0'} peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x '@webpack-cli/serve@3.0.1': - resolution: - { - integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==, - } - engines: { node: '>=18.12.0' } + resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} + engines: {node: '>=18.12.0'} peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x @@ -5150,32 +3514,24 @@ packages: optional: true '@xtuc/ieee754@1.2.0': - resolution: - { - integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, - } + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} '@xtuc/long@4.2.2': - resolution: - { - integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, - } + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} JSONStream@1.3.5: - resolution: - { - integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, - } + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead - abitype@1.0.8: - resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + abitype@1.1.0: + resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.22.0 + zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: typescript: optional: true @@ -5183,118 +3539,70 @@ packages: optional: true accepts@1.3.8: - resolution: - { - integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} acorn-globals@6.0.0: - resolution: - { - integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==, - } + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} acorn-import-phases@1.0.4: - resolution: - { - integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} peerDependencies: acorn: ^8.14.0 acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@7.2.0: - resolution: - { - integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} acorn-walk@8.3.4: - resolution: - { - integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} acorn@7.4.1: - resolution: - { - integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} hasBin: true acorn@8.14.1: - resolution: - { - integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} hasBin: true acorn@8.15.0: - resolution: - { - integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} hasBin: true add-stream@1.0.0: - resolution: - { - integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, - } + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} address@1.2.2: - resolution: - { - integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==, - } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} adjust-sourcemap-loader@4.0.0: - resolution: - { - integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==, - } - engines: { node: '>=8.9' } + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} aes-js@3.0.0: - resolution: - { - integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==, - } + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} agent-base@6.0.2: - resolution: - { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, - } - engines: { node: '>= 6.0.0' } + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} agentkeepalive@4.6.0: - resolution: - { - integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==, - } - engines: { node: '>= 8.0.0' } + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} ajv-formats@2.1.1: - resolution: - { - integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, - } + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -5302,1551 +3610,877 @@ packages: optional: true ajv-keywords@3.5.2: - resolution: - { - integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, - } + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 ajv-keywords@5.1.0: - resolution: - { - integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==, - } + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.17.1: - resolution: - { - integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, - } + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} algo-msgpack-with-bigint@2.1.1: - resolution: - { - integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==} + engines: {node: '>= 10'} algosdk@1.24.1: - resolution: - { - integrity: sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==} + engines: {node: '>=14.0.0'} anser@2.3.2: - resolution: - { - integrity: sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==, - } + resolution: {integrity: sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==} ansi-colors@4.1.3: - resolution: - { - integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} ansi-html-community@0.0.8: - resolution: - { - integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==, - } - engines: { '0': node >= 0.8.0 } + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} hasBin: true ansi-html@0.0.9: - resolution: - { - integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==, - } - engines: { '0': node >= 0.8.0 } + resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==} + engines: {'0': node >= 0.8.0} hasBin: true ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-regex@6.1.0: - resolution: - { - integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} ansi-sequence-parser@1.1.3: - resolution: - { - integrity: sha512-+fksAx9eG3Ab6LDnLs3ZqZa8KVJ/jYnX+D4Qe1azX+LFGFAXqynCQLOdLpNYN/l9e7l6hMWwZbrnctqr6eSQSw==, - } + resolution: {integrity: sha512-+fksAx9eG3Ab6LDnLs3ZqZa8KVJ/jYnX+D4Qe1azX+LFGFAXqynCQLOdLpNYN/l9e7l6hMWwZbrnctqr6eSQSw==} ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} any-promise@1.3.0: - resolution: - { - integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, - } + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} apg-js@4.4.0: - resolution: - { - integrity: sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==, - } + resolution: {integrity: sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==} arbundles@0.10.1: - resolution: - { - integrity: sha512-QYFepxessLCirvRkQK9iQmjxjHz+s50lMNGRwZwpyPWLohuf6ISyj1gkFXJHlMT+rNSrsHxb532glHnKbjwu3A==, - } + resolution: {integrity: sha512-QYFepxessLCirvRkQK9iQmjxjHz+s50lMNGRwZwpyPWLohuf6ISyj1gkFXJHlMT+rNSrsHxb532glHnKbjwu3A==} arconnect@0.4.2: - resolution: - { - integrity: sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==, - } + resolution: {integrity: sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==} arg@4.1.3: - resolution: - { - integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, - } + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} arg@5.0.2: - resolution: - { - integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, - } + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} aria-query@5.3.2: - resolution: - { - integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-back@3.1.0: - resolution: - { - integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} array-back@4.0.2: - resolution: - { - integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} array-buffer-byte-length@1.0.2: - resolution: - { - integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} array-flatten@1.1.1: - resolution: - { - integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, - } + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} array-ify@1.0.0: - resolution: - { - integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, - } + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} array-includes@3.1.8: - resolution: - { - integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} array.prototype.findlast@1.2.5: - resolution: - { - integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} array.prototype.findlastindex@1.2.6: - resolution: - { - integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} array.prototype.flat@1.3.3: - resolution: - { - integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} array.prototype.flatmap@1.3.3: - resolution: - { - integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} array.prototype.reduce@1.0.8: - resolution: - { - integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==} + engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: - resolution: - { - integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} arraybuffer.prototype.slice@1.0.4: - resolution: - { - integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} arrify@1.0.1: - resolution: - { - integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} arweave-stream-tx@1.2.2: - resolution: - { - integrity: sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ==, - } + resolution: {integrity: sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ==} peerDependencies: arweave: ^1.10.0 arweave@1.15.0: - resolution: - { - integrity: sha512-sYfq2yJwkJLthRADsfHygNP+L7fTCyprTjOLYnpP8zaqwywddoNO3UpTk6XGjEiyyU3WfxoFLRLpzx+llZx1WA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-sYfq2yJwkJLthRADsfHygNP+L7fTCyprTjOLYnpP8zaqwywddoNO3UpTk6XGjEiyyU3WfxoFLRLpzx+llZx1WA==} + engines: {node: '>=18'} asap@2.0.6: - resolution: - { - integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, - } + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} asn1.js@4.10.1: - resolution: - { - integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==, - } + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} asn1.js@5.4.1: - resolution: - { - integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==, - } + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} assertion-error@2.0.1: - resolution: - { - integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} ast-types-flow@0.0.8: - resolution: - { - integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, - } + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + ast-v8-to-istanbul@0.3.5: + resolution: {integrity: sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==} async-function@1.0.0: - resolution: - { - integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} async-retry@1.3.3: - resolution: - { - integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, - } + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} async@3.2.6: - resolution: - { - integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, - } + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} at-least-node@1.0.0: - resolution: - { - integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==, - } - engines: { node: '>= 4.0.0' } + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} autoprefixer@10.4.21: - resolution: - { - integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 available-typed-arrays@1.0.7: - resolution: - { - integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} axe-core@4.10.3: - resolution: - { - integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + engines: {node: '>=4'} + + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x - axios-retry@3.9.1: - resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==} + axios@1.11.0: + resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} axios@1.8.4: - resolution: - { - integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==, - } + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} axobject-query@4.1.0: - resolution: - { - integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} babel-jest@27.5.1: - resolution: - { - integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 babel-loader@8.4.1: - resolution: - { - integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==, - } - engines: { node: '>= 8.9' } + resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} + engines: {node: '>= 8.9'} peerDependencies: '@babel/core': ^7.0.0 webpack: '>=2' babel-plugin-istanbul@6.1.1: - resolution: - { - integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} babel-plugin-jest-hoist@27.5.1: - resolution: - { - integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} babel-plugin-macros@3.1.0: - resolution: - { - integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, - } - engines: { node: '>=10', npm: '>=6' } + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} babel-plugin-named-asset-import@0.3.8: - resolution: - { - integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==, - } + resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} peerDependencies: '@babel/core': ^7.1.0 babel-plugin-polyfill-corejs2@0.4.13: - resolution: - { - integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==, - } + resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-corejs3@0.11.1: - resolution: - { - integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==, - } + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-regenerator@0.6.4: - resolution: - { - integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==, - } + resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-transform-react-remove-prop-types@0.4.24: - resolution: - { - integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==, - } + resolution: {integrity: sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==} babel-preset-current-node-syntax@1.1.0: - resolution: - { - integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==, - } + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 babel-preset-jest@27.5.1: - resolution: - { - integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 babel-preset-react-app@10.1.0: - resolution: - { - integrity: sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==, - } + resolution: {integrity: sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==} balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} base-x@3.0.11: - resolution: - { - integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==, - } + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} base-x@4.0.1: - resolution: - { - integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==, - } + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} base64url@3.0.1: - resolution: - { - integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} + engines: {node: '>=6.0.0'} batch@0.6.1: - resolution: - { - integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==, - } + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} bech32@1.1.4: - resolution: - { - integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==, - } + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} better-path-resolve@1.0.0: - resolution: - { - integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} bfj@7.1.0: - resolution: - { - integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==, - } - engines: { node: '>= 8.0.0' } + resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} + engines: {node: '>= 8.0.0'} big.js@5.2.2: - resolution: - { - integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, - } + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} bigint-buffer@1.1.5: - resolution: - { - integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==, - } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} bignumber.js@9.1.2: - resolution: - { - integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==, - } + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} bignumber.js@9.3.1: - resolution: - { - integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==, - } + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} bindings@1.5.0: - resolution: - { - integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, - } + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} bip39-light@1.0.7: - resolution: - { - integrity: sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q==, - } + resolution: {integrity: sha512-WDTmLRQUsiioBdTs9BmSEmkJza+8xfJmptsNJjxnoq3EydSa/ZBXT6rm66KoT3PJIRYMnhSKNR7S9YL1l7R40Q==} bip39@3.0.2: - resolution: - { - integrity: sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==, - } + resolution: {integrity: sha512-J4E1r2N0tUylTKt07ibXvhpT2c5pyAFgvuA5q1H9uDy6dEGpjV8jmymh3MTYJDLCNbIVClSB9FbND49I6N24MQ==} bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} bluebird@3.7.2: - resolution: - { - integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==, - } + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} bn.js@4.12.1: - resolution: - { - integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==, - } + resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} bn.js@5.2.1: - resolution: - { - integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==, - } + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} body-parser@1.20.3: - resolution: - { - integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==, - } - engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} bonjour-service@1.3.0: - resolution: - { - integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==, - } + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} boolbase@1.0.0: - resolution: - { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, - } + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} borsh@0.7.0: - resolution: - { - integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==, - } + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} brorand@1.1.0: - resolution: - { - integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, - } + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} brotli-size@4.0.0: - resolution: - { - integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==, - } - engines: { node: '>= 10.16.0' } + resolution: {integrity: sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==} + engines: {node: '>= 10.16.0'} browser-process-hrtime@1.0.0: - resolution: - { - integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==, - } + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} browserify-aes@1.2.0: - resolution: - { - integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, - } + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} browserify-cipher@1.0.1: - resolution: - { - integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==, - } + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} browserify-des@1.0.2: - resolution: - { - integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==, - } + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} browserify-rsa@4.1.1: - resolution: - { - integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} + engines: {node: '>= 0.10'} browserify-sign@4.2.3: - resolution: - { - integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==, - } - engines: { node: '>= 0.12' } + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} browserslist@4.24.4: - resolution: - { - integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true bs58@4.0.1: - resolution: - { - integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==, - } + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} bs58@5.0.0: - resolution: - { - integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==, - } + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} bser@2.1.1: - resolution: - { - integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, - } + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer-xor@1.0.3: - resolution: - { - integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, - } + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} buffer@6.0.3: - resolution: - { - integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, - } + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} bufferutil@4.0.9: - resolution: - { - integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==, - } - engines: { node: '>=6.14.2' } + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} builtin-modules@3.3.0: - resolution: - { - integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} bundle-name@4.1.0: - resolution: - { - integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} bundle-require@4.2.1: - resolution: - { - integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.17' - bundlemon-utils@1.2.1: - resolution: {integrity: sha512-ydFZrI68L5j6hB9y88XGlbOp2lEwZHsDZl31ljHoi+wKE32glbuXMU0d0vQJLiR7Eq6uS0nDNYSmeoFHiV9R2g==} - engines: {node: '>=14.16'} + bundlemon-utils@2.0.1: + resolution: {integrity: sha512-7wxHoOlzICvQyMRfVqoBpnM5pJt1JdcUxsYPNiFx3RlVmUEANh2xdEyoyTsVCqzeJC3rn+AbPuiermBwA3szAQ==} + engines: {node: '>=18'} - bundlemon@2.1.0: - resolution: {integrity: sha512-zvsN7VDNeCtGIR+XUXobjxCSmnsUBqVe5ap2hMQnZOumfKAUJ6WVn/tnJOmt7TJfkXHeUKGi2sHARl7qrL+WDg==} - engines: {node: '>=14.16'} + bundlemon@3.1.0: + resolution: {integrity: sha512-8PAomH/fzAD/aXUKmphKmPm4Tl2L7mo51AAalO0EVAZE0cik58AM2x0CVdw4jutD069U2rSyRQstxHo2NEr+9Q==} + engines: {node: '>=18'} hasBin: true busboy@1.6.0: - resolution: - { - integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, - } - engines: { node: '>=10.16.0' } + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} cac@6.7.14: - resolution: - { - integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} cacheable-lookup@5.0.4: - resolution: - { - integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==, - } - engines: { node: '>=10.6.0' } + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} cacheable-request@7.0.4: - resolution: - { - integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} cachedir@2.3.0: - resolution: - { - integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} call-bind-apply-helpers@1.0.2: - resolution: - { - integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} call-bind@1.0.8: - resolution: - { - integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} call-bound@1.0.4: - resolution: - { - integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} camel-case@4.1.2: - resolution: - { - integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, - } + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} camelcase-css@2.0.1: - resolution: - { - integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} camelcase-keys@6.2.2: - resolution: - { - integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} caniuse-api@3.0.0: - resolution: - { - integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, - } + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} caniuse-lite@1.0.30001707: - resolution: - { - integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==, - } + resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} case-sensitive-paths-webpack-plugin@2.4.0: - resolution: - { - integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} + engines: {node: '>=4'} chai@5.2.0: - resolution: - { - integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} chalk@5.4.1: - resolution: - { - integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} char-regex@1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} char-regex@2.0.2: - resolution: - { - integrity: sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==, - } - engines: { node: '>=12.20' } + resolution: {integrity: sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==} + engines: {node: '>=12.20'} chardet@0.7.0: - resolution: - { - integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==, - } + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} check-error@2.1.1: - resolution: - { - integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==, - } - engines: { node: '>= 16' } + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} check-types@11.2.3: - resolution: - { - integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==, - } + resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} chokidar@3.6.0: - resolution: - { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, - } - engines: { node: '>= 8.10.0' } + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} chrome-trace-event@1.0.4: - resolution: - { - integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} cipher-base@1.0.6: - resolution: - { - integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} cjs-module-lexer@1.4.3: - resolution: - { - integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==, - } + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} clean-css@5.3.3: - resolution: - { - integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==, - } - engines: { node: '>= 10.0' } + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} cli-cursor@3.1.0: - resolution: - { - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} cli-spinners@2.9.2: - resolution: - { - integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} cli-width@3.0.0: - resolution: - { - integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} client-only@0.0.1: - resolution: - { - integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, - } + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} clone-deep@4.0.1: - resolution: - { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} clone-response@1.0.3: - resolution: - { - integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==, - } + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} co@4.6.0: - resolution: - { - integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, - } - engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} coa@2.0.2: - resolution: - { - integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==, - } - engines: { node: '>= 4.0' } + resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} + engines: {node: '>= 4.0'} collect-v8-coverage@1.0.2: - resolution: - { - integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==, - } + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: '>=7.0.0' } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: - resolution: - { - integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, - } + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} color@4.2.3: - resolution: - { - integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, - } - engines: { node: '>=12.5.0' } + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} colord@2.9.3: - resolution: - { - integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, - } + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} command-line-args@5.2.1: - resolution: - { - integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} command-line-usage@6.1.3: - resolution: - { - integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} commander@11.1.0: - resolution: - { - integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} commander@12.1.0: - resolution: - { - integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} commander@13.1.0: - resolution: - { - integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - commitizen@4.3.1: - resolution: - { - integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==, - } - engines: { node: '>= 12' } + resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} + engines: {node: '>= 12'} hasBin: true common-tags@1.8.2: - resolution: - { - integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} commondir@1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} compare-func@2.0.0: - resolution: - { - integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, - } + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} compressible@2.0.18: - resolution: - { - integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} compression@1.8.0: - resolution: - { - integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} + engines: {node: '>= 0.8.0'} concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} concat-stream@2.0.0: - resolution: - { - integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, - } - engines: { '0': node >= 6.0 } + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} confusing-browser-globals@1.0.11: - resolution: - { - integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==, - } + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} connect-history-api-fallback@2.0.0: - resolution: - { - integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} content-disposition@0.5.4: - resolution: - { - integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} conventional-changelog-angular@5.0.13: - resolution: - { - integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} conventional-changelog-atom@2.0.8: - resolution: - { - integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} conventional-changelog-codemirror@2.0.8: - resolution: - { - integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} conventional-changelog-config-spec@2.1.0: - resolution: - { - integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==, - } + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} conventional-changelog-conventionalcommits@4.6.3: - resolution: - { - integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} conventional-changelog-core@4.2.4: - resolution: - { - integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} conventional-changelog-ember@2.0.9: - resolution: - { - integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} conventional-changelog-eslint@3.0.9: - resolution: - { - integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} conventional-changelog-express@2.0.6: - resolution: - { - integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} conventional-changelog-jquery@3.0.11: - resolution: - { - integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} conventional-changelog-jshint@2.0.9: - resolution: - { - integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} conventional-changelog-preset-loader@2.3.4: - resolution: - { - integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} conventional-changelog-writer@5.0.1: - resolution: - { - integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} hasBin: true conventional-changelog@3.1.25: - resolution: - { - integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} conventional-commit-types@3.0.0: - resolution: - { - integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==, - } + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} conventional-commits-filter@2.0.7: - resolution: - { - integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} conventional-commits-parser@3.2.4: - resolution: - { - integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} hasBin: true conventional-recommended-bump@6.1.0: - resolution: - { - integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} hasBin: true convert-source-map@1.9.0: - resolution: - { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, - } + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-signature@1.0.6: - resolution: - { - integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, - } + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} cookie@0.7.1: - resolution: - { - integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} copy-to-clipboard@3.3.3: - resolution: - { - integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==, - } + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - copy-webpack-plugin@13.0.0: - resolution: {integrity: sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==} + copy-webpack-plugin@13.0.1: + resolution: {integrity: sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.1.0 core-js-compat@3.41.0: - resolution: - { - integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==, - } + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} core-js-pure@3.41.0: - resolution: - { - integrity: sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==, - } + resolution: {integrity: sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==} core-js@3.41.0: - resolution: - { - integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==, - } + resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} cosmiconfig-typescript-loader@6.1.0: - resolution: - { - integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==, - } - engines: { node: '>=v18' } + resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} + engines: {node: '>=v18'} peerDependencies: '@types/node': '*' cosmiconfig: '>=9' typescript: '>=5' cosmiconfig@6.0.0: - resolution: - { - integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} cosmiconfig@7.1.0: - resolution: - { - integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} cosmiconfig@8.3.6: - resolution: - { - integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' peerDependenciesMeta: @@ -6854,11 +4488,8 @@ packages: optional: true cosmiconfig@9.0.0: - resolution: - { - integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' peerDependenciesMeta: @@ -6866,98 +4497,59 @@ packages: optional: true create-ecdh@4.0.4: - resolution: - { - integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==, - } + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} create-hash@1.2.0: - resolution: - { - integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, - } + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} create-hmac@1.1.7: - resolution: - { - integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, - } + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} create-require@1.1.1: - resolution: - { - integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, - } + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} cross-fetch@3.2.0: - resolution: - { - integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==, - } + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} cross-spawn@6.0.6: - resolution: - { - integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==, - } - engines: { node: '>=4.8' } + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} + engines: {node: '>=4.8'} cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} crypto-browserify@3.12.1: - resolution: - { - integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} + engines: {node: '>= 0.10'} crypto-random-string@2.0.0: - resolution: - { - integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} css-blank-pseudo@3.0.3: - resolution: - { - integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==} + engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 css-declaration-sorter@6.4.1: - resolution: - { - integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 css-has-pseudo@3.0.4: - resolution: - { - integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==} + engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 css-loader@6.11.0: - resolution: - { - integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x webpack: ^5.0.0 @@ -6968,11 +4560,8 @@ packages: optional: true css-minimizer-webpack-plugin@3.4.1: - resolution: - { - integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} + engines: {node: '>= 12.13.0'} peerDependencies: '@parcel/css': '*' clean-css: '*' @@ -6990,218 +4579,125 @@ packages: optional: true css-prefers-color-scheme@6.0.3: - resolution: - { - integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} + engines: {node: ^12 || ^14 || >=16} hasBin: true peerDependencies: postcss: ^8.4 css-select-base-adapter@0.1.1: - resolution: - { - integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==, - } + resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} css-select@2.1.0: - resolution: - { - integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==, - } + resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} css-select@4.3.0: - resolution: - { - integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, - } + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} css-tree@1.0.0-alpha.37: - resolution: - { - integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} + engines: {node: '>=8.0.0'} css-tree@1.1.3: - resolution: - { - integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} css-what@3.4.2: - resolution: - { - integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} + engines: {node: '>= 6'} css-what@6.1.0: - resolution: - { - integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} cssdb@7.11.2: - resolution: - { - integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==, - } + resolution: {integrity: sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==} cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true cssnano-preset-default@5.2.14: - resolution: - { - integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 cssnano-utils@3.1.0: - resolution: - { - integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 cssnano@5.1.15: - resolution: - { - integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 csso@4.2.0: - resolution: - { - integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} cssom@0.3.8: - resolution: - { - integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==, - } + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} cssom@0.4.4: - resolution: - { - integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==, - } + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} cssstyle@2.3.0: - resolution: - { - integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} csv-generate@3.4.3: - resolution: - { - integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==, - } + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} csv-parse@4.16.3: - resolution: - { - integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==, - } + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} csv-stringify@5.6.5: - resolution: - { - integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==, - } + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} csv@5.5.3: - resolution: - { - integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==, - } - engines: { node: '>= 0.1.90' } + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} cz-conventional-changelog@3.3.0: - resolution: - { - integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} damerau-levenshtein@1.0.8: - resolution: - { - integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, - } + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dargs@7.0.0: - resolution: - { - integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} data-urls@2.0.0: - resolution: - { - integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} data-view-buffer@1.0.2: - resolution: - { - integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} data-view-byte-length@1.0.2: - resolution: - { - integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} data-view-byte-offset@1.0.1: - resolution: - { - integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} dateformat@3.0.3: - resolution: - { - integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, - } + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -7209,10 +4705,7 @@ packages: optional: true debug@3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -7220,11 +4713,8 @@ packages: optional: true debug@4.4.0: - resolution: - { - integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -7232,11 +4722,8 @@ packages: optional: true debug@4.4.1: - resolution: - { - integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -7244,715 +4731,404 @@ packages: optional: true decamelize-keys@1.1.1: - resolution: - { - integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} decamelize@1.2.0: - resolution: - { - integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} decimal.js@10.5.0: - resolution: - { - integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==, - } + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} dedent@0.7.0: - resolution: - { - integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==, - } + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} deep-eql@5.0.2: - resolution: - { - integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} deep-equal@2.2.3: - resolution: - { - integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} default-browser-id@5.0.0: - resolution: - { - integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} default-browser@5.2.1: - resolution: - { - integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} default-gateway@6.0.3: - resolution: - { - integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - } + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} defer-to-connect@2.0.1: - resolution: - { - integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} define-lazy-prop@3.0.0: - resolution: - { - integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} delay@5.0.0: - resolution: - { - integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} depd@1.1.2: - resolution: - { - integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} des.js@1.1.0: - resolution: - { - integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==, - } + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} destroy@1.2.0: - resolution: - { - integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, - } - engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} detect-file@1.0.0: - resolution: - { - integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} detect-indent@6.1.0: - resolution: - { - integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} detect-indent@7.0.1: - resolution: - { - integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==, - } - engines: { node: '>=12.20' } + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} detect-libc@2.0.4: - resolution: - { - integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} detect-newline@3.1.0: - resolution: - { - integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} detect-newline@4.0.1: - resolution: - { - integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} detect-node@2.1.0: - resolution: - { - integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, - } + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} detect-port-alt@1.1.6: - resolution: - { - integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==, - } - engines: { node: '>= 4.2.1' } + resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} + engines: {node: '>= 4.2.1'} hasBin: true didyoumean@1.2.2: - resolution: - { - integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, - } + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} diff-sequences@27.5.1: - resolution: - { - integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} diff@4.0.2: - resolution: - { - integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, - } - engines: { node: '>=0.3.1' } + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} diffie-hellman@5.0.3: - resolution: - { - integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==, - } + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dlv@1.1.3: - resolution: - { - integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, - } + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dns-packet@5.6.1: - resolution: - { - integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} doctrine@2.1.0: - resolution: - { - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} doctrine@3.0.0: - resolution: - { - integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dom-converter@0.2.0: - resolution: - { - integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==, - } + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} dom-serializer@0.2.2: - resolution: - { - integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==, - } + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} dom-serializer@1.4.1: - resolution: - { - integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, - } + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} domelementtype@1.3.1: - resolution: - { - integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==, - } + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead domhandler@4.3.1: - resolution: - { - integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} domutils@1.7.0: - resolution: - { - integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==, - } + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} domutils@2.8.0: - resolution: - { - integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, - } + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dot-case@3.0.4: - resolution: - { - integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, - } + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dot-prop@5.3.0: - resolution: - { - integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} dotenv-expand@5.1.0: - resolution: - { - integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==, - } + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} dotenv@10.0.0: - resolution: - { - integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} + engines: {node: '>=10'} dotenv@16.4.7: - resolution: - { - integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==, - } - engines: { node: '>=12' } - - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} dotgitignore@2.1.0: - resolution: - { - integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} dunder-proto@1.0.1: - resolution: - { - integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} duplexer@0.1.1: - resolution: - { - integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==, - } + resolution: {integrity: sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==} duplexer@0.1.2: - resolution: - { - integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==, - } + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} ejs@3.1.10: - resolution: - { - integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} hasBin: true electron-to-chromium@1.5.128: - resolution: - { - integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==, - } + resolution: {integrity: sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==} elliptic@6.6.1: - resolution: - { - integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==, - } + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} email-addresses@5.0.0: - resolution: - { - integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==, - } + resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} emittery@0.10.2: - resolution: - { - integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} emittery@0.8.1: - resolution: - { - integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} emojis-list@3.0.0: - resolution: - { - integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} encodeurl@1.0.2: - resolution: - { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} encodeurl@2.0.0: - resolution: - { - integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enhanced-resolve@5.18.1: - resolution: - { - integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} enquirer@2.4.1: - resolution: - { - integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} entities@2.2.0: - resolution: - { - integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, - } + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} env-paths@2.2.1: - resolution: - { - integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} envinfo@7.14.0: - resolution: - { - integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} hasBin: true error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} error-stack-parser@2.1.4: - resolution: - { - integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==, - } + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} es-abstract@1.23.9: - resolution: - { - integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} es-array-method-boxes-properly@1.0.0: - resolution: - { - integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==, - } + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} es-define-property@1.0.1: - resolution: - { - integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-get-iterator@1.1.3: - resolution: - { - integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==, - } + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} es-iterator-helpers@1.2.1: - resolution: - { - integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} es-module-lexer@1.6.0: - resolution: - { - integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==, - } + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} es-object-atoms@1.1.1: - resolution: - { - integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { - integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} es-shim-unscopables@1.1.0: - resolution: - { - integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: - resolution: - { - integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} es6-promise@4.2.8: - resolution: - { - integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==, - } + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} es6-promisify@5.0.0: - resolution: - { - integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==, - } + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} esbuild-loader@2.21.0: - resolution: - { - integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==, - } + resolution: {integrity: sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 esbuild@0.16.17: - resolution: - { - integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} + engines: {node: '>=12'} hasBin: true esbuild@0.19.12: - resolution: - { - integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} hasBin: true esbuild@0.25.1: - resolution: - { - integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} escape-string-regexp@2.0.0: - resolution: - { - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} escodegen@1.14.3: - resolution: - { - integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} hasBin: true escodegen@2.1.0: - resolution: - { - integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} hasBin: true eslint-config-next@14.0.4: - resolution: - { - integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==, - } + resolution: {integrity: sha512-9/xbOHEQOmQtqvQ1UsTQZpnA7SlDMBtuKJ//S4JnoyK3oGLhILKXdBgu/UO7lQo/2xOykQULS1qQ6p2+EpHgAQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -7961,20 +5137,14 @@ packages: optional: true eslint-config-prettier@9.1.0: - resolution: - { - integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==, - } + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-config-react-app@7.0.1: - resolution: - { - integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} + engines: {node: '>=14.0.0'} peerDependencies: eslint: ^8.0.0 typescript: '*' @@ -7983,26 +5153,17 @@ packages: optional: true eslint-config-typestrict@1.0.5: - resolution: - { - integrity: sha512-6W48TD8kXMpj9lUTBoDWFKI+qRpgPQPKy9NPIf2cP56HiT6RBO9g7uvApvvl0DtfmAKP1kXbbI+Mg6xVROrXZA==, - } + resolution: {integrity: sha512-6W48TD8kXMpj9lUTBoDWFKI+qRpgPQPKy9NPIf2cP56HiT6RBO9g7uvApvvl0DtfmAKP1kXbbI+Mg6xVROrXZA==} peerDependencies: '@typescript-eslint/eslint-plugin': ^5 eslint-plugin-sonarjs: '*' eslint-import-resolver-node@0.3.9: - resolution: - { - integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, - } + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} eslint-import-resolver-typescript@3.10.0: - resolution: - { - integrity: sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' @@ -8014,11 +5175,8 @@ packages: optional: true eslint-module-utils@2.12.0: - resolution: - { - integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -8038,31 +5196,22 @@ packages: optional: true eslint-plugin-eslint-comments@3.2.0: - resolution: - { - integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==, - } - engines: { node: '>=6.5.0' } + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' eslint-plugin-flowtype@8.0.3: - resolution: - { - integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==} + engines: {node: '>=12.0.0'} peerDependencies: '@babel/plugin-syntax-flow': ^7.14.5 '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 eslint-plugin-import@2.31.0: - resolution: - { - integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 @@ -8071,11 +5220,8 @@ packages: optional: true eslint-plugin-jest@25.7.0: - resolution: - { - integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -8087,76 +5233,52 @@ packages: optional: true eslint-plugin-jsx-a11y@6.10.2: - resolution: - { - integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 eslint-plugin-no-only-tests@3.3.0: - resolution: - { - integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==, - } - engines: { node: '>=5.0.0' } + resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} + engines: {node: '>=5.0.0'} eslint-plugin-react-hooks@4.6.2: - resolution: - { - integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: - resolution: - { - integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} + engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 eslint-plugin-react@7.37.4: - resolution: - { - integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-plugin-simple-import-sort@10.0.0: - resolution: - { - integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==, - } + resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} peerDependencies: eslint: '>=5.0.0' eslint-plugin-sonarjs@0.23.0: - resolution: - { - integrity: sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==} + engines: {node: '>=14'} peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 eslint-plugin-testing-library@5.11.1: - resolution: - { - integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6' } + resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 - eslint-plugin-unused-imports@4.1.4: - resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} + eslint-plugin-unused-imports@4.2.0: + resolution: {integrity: sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^9.0.0 || ^8.0.0 @@ -8165,39 +5287,24 @@ packages: optional: true eslint-scope@5.1.1: - resolution: - { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} eslint-scope@7.2.2: - resolution: - { - integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@2.1.0: - resolution: - { - integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-webpack-plugin@3.2.0: - resolution: - { - integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} + engines: {node: '>= 12.13.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 webpack: ^5.0.0 @@ -8205,257 +5312,148 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: - resolution: - { - integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} esprima@1.2.2: - resolution: - { - integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} + engines: {node: '>=0.4.0'} hasBin: true esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} hasBin: true esquery@1.6.0: - resolution: - { - integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} estree-walker@1.0.1: - resolution: - { - integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==, - } + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} estree-walker@3.0.3: - resolution: - { - integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, - } + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} ethers@5.8.0: - resolution: - { - integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==, - } + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} eventemitter3@4.0.7: - resolution: - { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, - } + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} eventemitter3@5.0.1: - resolution: - { - integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, - } + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: '>=0.8.x' } + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} evp_bytestokey@1.0.3: - resolution: - { - integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, - } + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} exit@0.1.2: - resolution: - { - integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} expand-tilde@2.0.2: - resolution: - { - integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} expect-type@1.2.0: - resolution: - { - integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} + engines: {node: '>=12.0.0'} expect@27.5.1: - resolution: - { - integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} exponential-backoff@3.1.2: - resolution: - { - integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==, - } + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} express@4.21.2: - resolution: - { - integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==, - } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} extendable-error@0.1.7: - resolution: - { - integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==, - } + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} external-editor@3.1.0: - resolution: - { - integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} eyes@0.1.8: - resolution: - { - integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==, - } - engines: { node: '> 0.1.90' } + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: '>=8.6.0' } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fast-stable-stringify@1.0.0: - resolution: - { - integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==, - } + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} fast-uri@3.0.6: - resolution: - { - integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==, - } + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fastest-levenshtein@1.0.16: - resolution: - { - integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, - } - engines: { node: '>= 4.9.1' } + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} fastq@1.19.1: - resolution: - { - integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, - } + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} faye-websocket@0.11.4: - resolution: - { - integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} fb-watchman@2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - } + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} fdir@6.4.3: - resolution: - { - integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==, - } + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -8463,11 +5461,8 @@ packages: optional: true fetch-mock@9.11.0: - resolution: - { - integrity: sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-PG1XUv+x7iag5p/iNHD4/jdpxL9FtVSqRMUQhPab4hVDt80T1MH5ehzVrL2IdXO9Q2iBggArFvPqjUbHFuI58Q==} + engines: {node: '>=4.0.0'} peerDependencies: node-fetch: '*' peerDependenciesMeta: @@ -8475,162 +5470,93 @@ packages: optional: true figures@3.2.0: - resolution: - { - integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} file-entry-cache@6.0.1: - resolution: - { - integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, - } - engines: { node: ^10.12.0 || >=12.0.0 } + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} file-loader@6.2.0: - resolution: - { - integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==, - } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} peerDependencies: webpack: ^4.0.0 || ^5.0.0 file-uri-to-path@1.0.0: - resolution: - { - integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, - } + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} filelist@1.0.4: - resolution: - { - integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, - } + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} filename-reserved-regex@2.0.0: - resolution: - { - integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} filenamify@4.3.0: - resolution: - { - integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} + engines: {node: '>=8'} filesize@8.0.7: - resolution: - { - integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==, - } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==} + engines: {node: '>= 0.4.0'} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} finalhandler@1.3.1: - resolution: - { - integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} find-cache-dir@3.3.2: - resolution: - { - integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} find-node-modules@2.1.3: - resolution: - { - integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==, - } + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} find-replace@3.0.0: - resolution: - { - integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} find-root@1.1.0: - resolution: - { - integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, - } + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} find-up@2.1.0: - resolution: - { - integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} find-up@3.0.0: - resolution: - { - integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} findup-sync@4.0.0: - resolution: - { - integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} flat-cache@3.2.0: - resolution: - { - integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, - } - engines: { node: ^10.12.0 || >=12.0.0 } + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} flat@5.0.2: - resolution: - { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, - } + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true flatted@3.3.3: - resolution: - { - integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, - } + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} follow-redirects@1.15.9: - resolution: - { - integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} peerDependencies: debug: '*' peerDependenciesMeta: @@ -8638,25 +5564,16 @@ packages: optional: true for-each@0.3.5: - resolution: - { - integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} foreground-child@3.3.1: - resolution: - { - integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} fork-ts-checker-webpack-plugin@6.5.3: - resolution: - { - integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==, - } - engines: { node: '>=10', yarn: '>=1.0.0' } + resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: eslint: '>= 6' typescript: '>= 2.7' @@ -8669,572 +5586,328 @@ packages: optional: true form-data@3.0.3: - resolution: - { - integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==} + engines: {node: '>= 6'} form-data@4.0.2: - resolution: - { - integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} form-data@4.0.4: - resolution: - { - integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} fraction.js@4.3.7: - resolution: - { - integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, - } + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} fresh@0.5.2: - resolution: - { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} fs-extra@10.1.0: - resolution: - { - integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} fs-extra@11.3.0: - resolution: - { - integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==, - } - engines: { node: '>=14.14' } + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} fs-extra@7.0.1: - resolution: - { - integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, - } - engines: { node: '>=6 <7 || >=8' } + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} fs-extra@8.1.0: - resolution: - { - integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==, - } - engines: { node: '>=6 <7 || >=8' } + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} fs-extra@9.1.0: - resolution: - { - integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} fs-monkey@1.0.6: - resolution: - { - integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==, - } + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} function.prototype.name@1.1.8: - resolution: - { - integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} functions-have-names@1.2.3: - resolution: - { - integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, - } + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-intrinsic@1.3.0: - resolution: - { - integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-own-enumerable-property-symbols@3.0.2: - resolution: - { - integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==, - } + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} get-package-type@0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} get-pkg-repo@4.2.1: - resolution: - { - integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} hasBin: true get-proto@1.0.1: - resolution: - { - integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-stdin@9.0.0: - resolution: - { - integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} get-stream@5.2.0: - resolution: - { - integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} get-symbol-description@1.1.0: - resolution: - { - integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} get-tsconfig@4.10.0: - resolution: - { - integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, - } + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} gh-pages@6.3.0: - resolution: - { - integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==} + engines: {node: '>=10'} hasBin: true git-hooks-list@3.2.0: - resolution: - { - integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==, - } + resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} git-raw-commits@2.0.11: - resolution: - { - integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} hasBin: true git-remote-origin-url@2.0.0: - resolution: - { - integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} git-semver-tags@4.1.1: - resolution: - { - integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} hasBin: true gitconfiglocal@1.0.0: - resolution: - { - integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, - } + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} glob-to-regex.js@1.0.1: - resolution: - { - integrity: sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==, - } - engines: { node: '>=10.0' } + resolution: {integrity: sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==} + engines: {node: '>=10.0'} peerDependencies: tslib: '2' glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} glob@10.4.5: - resolution: - { - integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, - } + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@11.0.1: - resolution: - { - integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + engines: {node: 20 || >=22} hasBin: true glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported global-directory@4.0.1: - resolution: - { - integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} global-modules@1.0.0: - resolution: - { - integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} global-modules@2.0.0: - resolution: - { - integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} global-prefix@1.0.2: - resolution: - { - integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} global-prefix@3.0.0: - resolution: - { - integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} globals@13.24.0: - resolution: - { - integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} globalthis@1.0.4: - resolution: - { - integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} gopd@1.2.0: - resolution: - { - integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} got@11.8.6: - resolution: - { - integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==, - } - engines: { node: '>=10.19.0' } + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} gzip-size@6.0.0: - resolution: - { - integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} handle-thing@2.0.1: - resolution: - { - integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==, - } + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} handlebars@4.7.8: - resolution: - { - integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, - } - engines: { node: '>=0.4.7' } + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} hasBin: true hard-rejection@2.1.0: - resolution: - { - integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} harmony-reflect@1.6.2: - resolution: - { - integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==, - } + resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} has-bigints@1.1.0: - resolution: - { - integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-proto@1.2.0: - resolution: - { - integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} has-symbols@1.1.0: - resolution: - { - integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { - integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} hash-base@3.0.5: - resolution: - { - integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} + engines: {node: '>= 0.10'} hash.js@1.1.7: - resolution: - { - integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, - } + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} he@1.2.0: - resolution: - { - integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, - } + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true hi-base32@0.5.1: - resolution: - { - integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==, - } + resolution: {integrity: sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==} hmac-drbg@1.0.1: - resolution: - { - integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, - } + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} homedir-polyfill@1.0.3: - resolution: - { - integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} hoopy@0.1.4: - resolution: - { - integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==, - } - engines: { node: '>= 6.0.0' } + resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} + engines: {node: '>= 6.0.0'} hosted-git-info@2.8.9: - resolution: - { - integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, - } + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} hosted-git-info@4.1.0: - resolution: - { - integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} hpack.js@2.1.6: - resolution: - { - integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==, - } + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} html-encoding-sniffer@2.0.1: - resolution: - { - integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} html-entities@2.5.3: - resolution: - { - integrity: sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw==, - } + resolution: {integrity: sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw==} html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} html-minifier-terser@6.1.0: - resolution: - { - integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} hasBin: true html-webpack-plugin@5.6.3: - resolution: - { - integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + engines: {node: '>=10.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x webpack: ^5.20.0 @@ -9245,60 +5918,36 @@ packages: optional: true htmlparser2@6.1.0: - resolution: - { - integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==, - } + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-deceiver@1.2.7: - resolution: - { - integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==, - } + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} http-errors@1.6.3: - resolution: - { - integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} http-errors@1.8.1: - resolution: - { - integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} http-parser-js@0.5.9: - resolution: - { - integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==, - } + resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} http-proxy-agent@4.0.1: - resolution: - { - integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} http-proxy-middleware@2.0.7: - resolution: - { - integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==} + engines: {node: '>=12.0.0'} peerDependencies: '@types/express': ^4.17.13 peerDependenciesMeta: @@ -9306,11 +5955,8 @@ packages: optional: true http-proxy-middleware@2.0.9: - resolution: - { - integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + engines: {node: '>=12.0.0'} peerDependencies: '@types/express': ^4.17.13 peerDependenciesMeta: @@ -9318,652 +5964,366 @@ packages: optional: true http-proxy@1.18.1: - resolution: - { - integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} http2-wrapper@1.0.3: - resolution: - { - integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==, - } - engines: { node: '>=10.19.0' } + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} https-proxy-agent@5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} human-id@4.1.1: - resolution: - { - integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==, - } + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: '>=10.17.0' } + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} humanize-ms@1.2.1: - resolution: - { - integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==, - } + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} hyperdyperid@1.2.0: - resolution: - { - integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==, - } - engines: { node: '>=10.18' } + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} icss-utils@5.1.0: - resolution: - { - integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==, - } - engines: { node: ^10 || ^12 || >= 14 } + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 idb@7.1.1: - resolution: - { - integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==, - } + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} identity-obj-proxy@3.0.0: - resolution: - { - integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} + engines: {node: '>=4'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} immer@9.0.21: - resolution: - { - integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==, - } + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} import-fresh@3.3.1: - resolution: - { - integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} import-local@3.2.0: - resolution: - { - integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} hasBin: true import-meta-resolve@4.1.0: - resolution: - { - integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==, - } + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: '>=0.8.19' } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} indent-string@4.0.0: - resolution: - { - integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.3: - resolution: - { - integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, - } + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} ini@4.1.1: - resolution: - { - integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} inquirer@8.2.5: - resolution: - { - integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} inquirer@8.2.6: - resolution: - { - integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} internal-slot@1.1.0: - resolution: - { - integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} interpret@3.1.1: - resolution: - { - integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} ipaddr.js@2.2.0: - resolution: - { - integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} is-arguments@1.2.0: - resolution: - { - integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} is-array-buffer@3.0.5: - resolution: - { - integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: - resolution: - { - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, - } + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} is-async-function@2.1.1: - resolution: - { - integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} is-bigint@1.1.0: - resolution: - { - integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} is-boolean-object@1.2.2: - resolution: - { - integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} is-bun-module@2.0.0: - resolution: - { - integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==, - } + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} is-core-module@2.16.1: - resolution: - { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-data-view@1.0.2: - resolution: - { - integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} is-date-object@1.1.0: - resolution: - { - integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} hasBin: true is-docker@3.0.0: - resolution: - { - integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-finalizationregistry@1.1.1: - resolution: - { - integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} is-generator-fn@2.1.0: - resolution: - { - integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} is-generator-function@1.1.0: - resolution: - { - integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-inside-container@1.0.0: - resolution: - { - integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, - } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} hasBin: true is-interactive@1.0.0: - resolution: - { - integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} is-map@2.0.3: - resolution: - { - integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-module@1.0.0: - resolution: - { - integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==, - } + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} is-network-error@1.1.0: - resolution: - { - integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} is-number-object@1.1.1: - resolution: - { - integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-obj@1.0.1: - resolution: - { - integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} is-obj@2.0.0: - resolution: - { - integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} is-path-inside@3.0.3: - resolution: - { - integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} is-plain-obj@1.1.0: - resolution: - { - integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} is-plain-obj@3.0.0: - resolution: - { - integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} is-plain-obj@4.1.0: - resolution: - { - integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} is-plain-object@2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} is-potential-custom-element-name@1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - } + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-regex@1.2.1: - resolution: - { - integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} is-regexp@1.0.0: - resolution: - { - integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} is-retry-allowed@2.2.0: - resolution: - { - integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} is-root@2.1.0: - resolution: - { - integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} is-set@2.0.3: - resolution: - { - integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.4: - resolution: - { - integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} is-string@1.1.1: - resolution: - { - integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} is-subdir@1.2.0: - resolution: - { - integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} is-subset@0.1.1: - resolution: - { - integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==, - } + resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==} is-symbol@1.1.1: - resolution: - { - integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} is-text-path@1.0.1: - resolution: - { - integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} is-typed-array@1.1.15: - resolution: - { - integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} is-typedarray@1.0.0: - resolution: - { - integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, - } + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} is-unicode-supported@0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} is-utf8@0.2.1: - resolution: - { - integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==, - } + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} is-weakmap@2.0.2: - resolution: - { - integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} is-weakref@1.1.1: - resolution: - { - integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} is-weakset@2.0.4: - resolution: - { - integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} is-windows@1.0.2: - resolution: - { - integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} is-wsl@3.1.0: - resolution: - { - integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isarray@2.0.5: - resolution: - { - integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, - } + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isobject@3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} isomorphic-ws@4.0.1: - resolution: - { - integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==, - } - peerDependencies: - ws: '*' - - isows@1.0.7: - resolution: - { - integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==, - } + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: ws: '*' @@ -9973,103 +6333,61 @@ packages: ws: '*' istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} istanbul-lib-instrument@5.2.1: - resolution: - { - integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} istanbul-lib-source-maps@4.0.1: - resolution: - { - integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} istanbul-lib-source-maps@5.0.6: - resolution: - { - integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} istanbul-reports@3.1.7: - resolution: - { - integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} iterator.prototype@1.1.5: - resolution: - { - integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jackspeak@4.1.0: - resolution: - { - integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + engines: {node: 20 || >=22} jake@10.9.2: - resolution: - { - integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} hasBin: true jayson@4.1.3: - resolution: - { - integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} + engines: {node: '>=8'} hasBin: true jest-changed-files@27.5.1: - resolution: - { - integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-circus@27.5.1: - resolution: - { - integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-cli@27.5.1: - resolution: - { - integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -10078,11 +6396,8 @@ packages: optional: true jest-config@27.5.1: - resolution: - { - integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: ts-node: '>=9.0.0' peerDependenciesMeta: @@ -10090,102 +6405,60 @@ packages: optional: true jest-diff@27.5.1: - resolution: - { - integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-docblock@27.5.1: - resolution: - { - integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-each@27.5.1: - resolution: - { - integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-environment-jsdom@27.5.1: - resolution: - { - integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-environment-node@27.5.1: - resolution: - { - integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-get-type@27.5.1: - resolution: - { - integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-haste-map@27.5.1: - resolution: - { - integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-jasmine2@27.5.1: - resolution: - { - integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-leak-detector@27.5.1: - resolution: - { - integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-matcher-utils@27.5.1: - resolution: - { - integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-message-util@27.5.1: - resolution: - { - integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-message-util@28.1.3: - resolution: - { - integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} jest-mock@27.5.1: - resolution: - { - integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-pnp-resolver@1.2.3: - resolution: - { - integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} peerDependencies: jest-resolve: '*' peerDependenciesMeta: @@ -10193,132 +6466,78 @@ packages: optional: true jest-regex-util@27.5.1: - resolution: - { - integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-regex-util@28.0.2: - resolution: - { - integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} jest-resolve-dependencies@27.5.1: - resolution: - { - integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-resolve@27.5.1: - resolution: - { - integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-runner@27.5.1: - resolution: - { - integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-runtime@27.5.1: - resolution: - { - integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-serializer@27.5.1: - resolution: - { - integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-snapshot@27.5.1: - resolution: - { - integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-util@27.5.1: - resolution: - { - integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-util@28.1.3: - resolution: - { - integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} jest-validate@27.5.1: - resolution: - { - integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-watch-typeahead@1.1.0: - resolution: - { - integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: jest: ^27.0.0 || ^28.0.0 jest-watcher@27.5.1: - resolution: - { - integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} jest-watcher@28.1.3: - resolution: - { - integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} jest-worker@26.6.2: - resolution: - { - integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==, - } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} jest-worker@27.5.1: - resolution: - { - integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, - } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} jest-worker@28.1.3: - resolution: - { - integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} jest@27.5.1: - resolution: - { - integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -10327,82 +6546,46 @@ packages: optional: true jiti@1.21.7: - resolution: - { - integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==, - } + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true jiti@2.4.2: - resolution: - { - integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==, - } + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} js-base64@3.7.7: - resolution: - { - integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==, - } + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} js-sha256@0.9.0: - resolution: - { - integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==, - } + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} js-sha3@0.8.0: - resolution: - { - integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==, - } + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} js-sha512@0.8.0: - resolution: - { - integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==, - } + resolution: {integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==} js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-tokens@9.0.1: - resolution: - { - integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, - } + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} js-yaml@3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - } + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsdom@16.7.0: - resolution: - { - integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: @@ -10410,933 +6593,517 @@ packages: optional: true jsesc@3.0.2: - resolution: - { - integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} hasBin: true jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-bigint@1.0.0: - resolution: - { - integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==, - } + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-better-errors@1.0.2: - resolution: - { - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, - } + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-schema@0.4.0: - resolution: - { - integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, - } + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json-stringify-safe@5.0.1: - resolution: - { - integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, - } + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} json5@1.0.2: - resolution: - { - integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, - } + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true jsonc-parser@3.3.1: - resolution: - { - integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, - } + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} jsonfile@4.0.0: - resolution: - { - integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, - } + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} jsonparse@1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { '0': node >= 0.2.0 } + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} jsonpath@1.1.1: - resolution: - { - integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==, - } + resolution: {integrity: sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==} jsonpointer@5.0.1: - resolution: - { - integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} jsx-ast-utils@3.3.5: - resolution: - { - integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} jwt-decode@4.0.0: - resolution: - { - integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} keccak@3.0.4: - resolution: - { - integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} kleur@4.1.5: - resolution: - { - integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} klona@2.0.6: - resolution: - { - integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} language-subtag-registry@0.3.23: - resolution: - { - integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==, - } + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: - resolution: - { - integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} launch-editor@2.10.0: - resolution: - { - integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==, - } + resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} levn@0.3.0: - resolution: - { - integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} lilconfig@2.1.0: - resolution: - { - integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} lilconfig@3.1.3: - resolution: - { - integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} load-json-file@4.0.0: - resolution: - { - integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} load-tsconfig@0.2.5: - resolution: - { - integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} loader-runner@4.3.0: - resolution: - { - integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, - } - engines: { node: '>=6.11.5' } + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} loader-utils@2.0.4: - resolution: - { - integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==, - } - engines: { node: '>=8.9.0' } + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} loader-utils@3.3.1: - resolution: - { - integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} locate-path@2.0.0: - resolution: - { - integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} locate-path@3.0.0: - resolution: - { - integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash-es@4.17.21: - resolution: - { - integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, - } + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} lodash.camelcase@4.3.0: - resolution: - { - integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, - } + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} lodash.debounce@4.0.8: - resolution: - { - integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, - } + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.ismatch@4.4.0: - resolution: - { - integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, - } + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} lodash.isplainobject@4.0.6: - resolution: - { - integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, - } + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} lodash.map@4.6.0: - resolution: - { - integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==, - } + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.mergewith@4.6.2: - resolution: - { - integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==, - } + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} lodash.pickby@4.6.0: - resolution: - { - integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==, - } + resolution: {integrity: sha512-AZV+GsS/6ckvPOVQPXSiFFacKvKB4kOQu6ynt9wz0F3LO4R9Ij4K1ddYsIytDpSgLz88JHd9P+oaLeej5/Sl7Q==} lodash.sortby@4.7.0: - resolution: - { - integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, - } + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} lodash.startcase@4.4.0: - resolution: - { - integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==, - } + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} lodash.uniq@4.5.0: - resolution: - { - integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, - } + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} log-symbols@4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} longest@2.0.1: - resolution: - { - integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true loupe@3.1.3: - resolution: - { - integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==, - } + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} lower-case@2.0.2: - resolution: - { - integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, - } + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} lowercase-keys@2.0.0: - resolution: - { - integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@11.1.0: - resolution: - { - integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 || >=22} lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} lunr@2.3.9: - resolution: - { - integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==, - } + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} magic-string@0.25.9: - resolution: - { - integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==, - } + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} magic-string@0.30.17: - resolution: - { - integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==, - } + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} magicast@0.3.5: - resolution: - { - integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==, - } + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} make-dir@3.1.0: - resolution: - { - integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} make-error@1.3.6: - resolution: - { - integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, - } + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} makeerror@1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - } + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} map-obj@1.0.1: - resolution: - { - integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} map-obj@4.3.0: - resolution: - { - integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} marked@4.3.0: - resolution: - { - integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==, - } - engines: { node: '>= 12' } + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} hasBin: true math-intrinsics@1.1.0: - resolution: - { - integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} md5.js@1.3.5: - resolution: - { - integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, - } + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} mdn-data@2.0.14: - resolution: - { - integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==, - } + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} mdn-data@2.0.4: - resolution: - { - integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==, - } + resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} memfs@3.5.3: - resolution: - { - integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==, - } - engines: { node: '>= 4.0.0' } - - memfs@4.17.2: - resolution: {integrity: sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==} + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + memfs@4.38.2: + resolution: {integrity: sha512-FpWsVHpAkoSh/LfY1BgAl72BVd374ooMRtDi2VqzBycX4XEfvC0XKACCe0C9VRZoYq5viuoyTv6lYXZ/Q7TrLQ==} engines: {node: '>= 4.0.0'} memorystream@0.3.1: - resolution: - { - integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==, - } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} meow@8.1.2: - resolution: - { - integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} merge-descriptors@1.0.3: - resolution: - { - integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, - } + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} merge@2.1.1: - resolution: - { - integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==, - } + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} methods@1.1.2: - resolution: - { - integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} miller-rabin@4.0.1: - resolution: - { - integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==, - } + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} hasBin: true mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} mime-db@1.54.0: - resolution: - { - integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} mime@1.6.0: - resolution: - { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} hasBin: true mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} mimic-response@1.0.1: - resolution: - { - integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} min-indent@1.0.1: - resolution: - { - integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} mini-css-extract-plugin@2.9.2: - resolution: - { - integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} + engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 minimalistic-assert@1.0.1: - resolution: - { - integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, - } + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} minimalistic-crypto-utils@1.0.1: - resolution: - { - integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, - } + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} minimatch@10.0.1: - resolution: - { - integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} minimatch@9.0.5: - resolution: - { - integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist-options@4.1.0: - resolution: - { - integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} minimist@1.2.7: - resolution: - { - integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==, - } + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} mixme@0.5.10: - resolution: - { - integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==, - } - engines: { node: '>= 8.0.0' } + resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} + engines: {node: '>= 8.0.0'} mkdirp@0.5.6: - resolution: - { - integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, - } + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} hasBin: true modified-zod2md@0.1.5-modified.4: - resolution: - { - integrity: sha512-zwt4KieUJco2141MUrI52wRG0kdVoIZ1bEveE8TmcbWMhVE7wD72pdKx1o8qXhBW+d3RACuxF90oGuhu/KnzDw==, - } + resolution: {integrity: sha512-zwt4KieUJco2141MUrI52wRG0kdVoIZ1bEveE8TmcbWMhVE7wD72pdKx1o8qXhBW+d3RACuxF90oGuhu/KnzDw==} hasBin: true peerDependencies: zod: ^3.22.0 modify-values@1.0.1: - resolution: - { - integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} mri@1.2.0: - resolution: - { - integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} multicast-dns@7.2.5: - resolution: - { - integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==, - } + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true multistream@4.1.0: - resolution: - { - integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==, - } + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} mustache@4.2.0: - resolution: - { - integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==, - } + resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true mute-stream@0.0.8: - resolution: - { - integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, - } + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} mz@2.7.0: - resolution: - { - integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, - } + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} nanoclone@0.2.1: - resolution: - { - integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==, - } + resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} nanoid@3.3.11: - resolution: - { - integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true nanoid@3.3.4: - resolution: - { - integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare-lite@1.4.0: - resolution: - { - integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, - } + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} near-hd-key@1.2.1: - resolution: - { - integrity: sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg==, - } + resolution: {integrity: sha512-SIrthcL5Wc0sps+2e1xGj3zceEa68TgNZDLuCx0daxmfTP7sFTB3/mtE2pYhlFsCxWoMn+JfID5E1NlzvvbRJg==} near-seed-phrase@0.2.1: - resolution: - { - integrity: sha512-feMuums+kVL3LSuPcP4ld07xHCb2mu6z48SGfP3W+8tl1Qm5xIcjiQzY2IDPBvFgajRDxWSb8GzsRHoInazByw==, - } + resolution: {integrity: sha512-feMuums+kVL3LSuPcP4ld07xHCb2mu6z48SGfP3W+8tl1Qm5xIcjiQzY2IDPBvFgajRDxWSb8GzsRHoInazByw==} negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} negotiator@0.6.4: - resolution: - { - integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} next@15.3.4: - resolution: - { - integrity: sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA==, - } - engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 } + resolution: {integrity: sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -11356,35 +7123,20 @@ packages: optional: true nice-try@1.0.5: - resolution: - { - integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==, - } + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} no-case@3.0.4: - resolution: - { - integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, - } + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} node-addon-api@2.0.2: - resolution: - { - integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==, - } + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} node-addon-api@5.1.0: - resolution: - { - integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==, - } + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -11392,267 +7144,148 @@ packages: optional: true node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: '>= 6.13.0' } + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} node-gyp-build@4.8.4: - resolution: - { - integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==, - } + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true node-int64@0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - } + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} node-releases@2.0.19: - resolution: - { - integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, - } + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} normalize-package-data@2.5.0: - resolution: - { - integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, - } + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} normalize-package-data@3.0.3: - resolution: - { - integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} normalize-range@0.1.2: - resolution: - { - integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} normalize-url@6.1.0: - resolution: - { - integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} npm-run-all@4.1.5: - resolution: - { - integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} hasBin: true npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} nth-check@2.1.1: - resolution: - { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, - } + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} nwsapi@2.2.20: - resolution: - { - integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==, - } + resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} object-hash@3.0.0: - resolution: - { - integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} object-inspect@1.13.4: - resolution: - { - integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-is@1.1.6: - resolution: - { - integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} object-keys@1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} object.assign@4.1.7: - resolution: - { - integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} object.entries@1.1.9: - resolution: - { - integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} object.fromentries@2.0.8: - resolution: - { - integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} object.getownpropertydescriptors@2.1.8: - resolution: - { - integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} + engines: {node: '>= 0.8'} object.groupby@1.0.3: - resolution: - { - integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} object.values@1.2.1: - resolution: - { - integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} obuf@1.1.2: - resolution: - { - integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==, - } + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} on-headers@1.0.2: - resolution: - { - integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: '>=6' } - - open@10.1.2: - resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} optionator@0.8.3: - resolution: - { - integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} optionator@0.9.4: - resolution: - { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} ora@5.4.1: - resolution: - { - integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} os-tmpdir@1.0.2: - resolution: - { - integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} outdent@0.5.0: - resolution: - { - integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==, - } + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} own-keys@1.0.1: - resolution: - { - integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, - } - engines: { node: '>= 0.4' } - - ox@0.8.6: - resolution: - { - integrity: sha512-eiKcgiVVEGDtEpEdFi1EGoVVI48j6icXHce9nFwCNM7CKG3uoCXKdr4TPhS00Iy1TR2aWSF1ltPD0x/YgqIL9w==, - } - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} - ox@0.8.6: - resolution: {integrity: sha512-eiKcgiVVEGDtEpEdFi1EGoVVI48j6icXHce9nFwCNM7CKG3uoCXKdr4TPhS00Iy1TR2aWSF1ltPD0x/YgqIL9w==} + ox@0.9.6: + resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -11660,635 +7293,383 @@ packages: optional: true p-cancelable@2.1.1: - resolution: - { - integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} p-filter@2.1.0: - resolution: - { - integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} p-limit@1.3.0: - resolution: - { - integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@2.0.0: - resolution: - { - integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} p-locate@3.0.0: - resolution: - { - integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} p-map@2.1.0: - resolution: - { - integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} p-retry@4.6.2: - resolution: - { - integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} p-retry@6.2.1: - resolution: - { - integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==, - } - engines: { node: '>=16.17' } + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} p-try@1.0.0: - resolution: - { - integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} package-manager-detector@0.2.11: - resolution: - { - integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==, - } + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} param-case@3.0.4: - resolution: - { - integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, - } + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parse-asn1@5.1.7: - resolution: - { - integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} parse-json@4.0.0: - resolution: - { - integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} parse-passwd@1.0.0: - resolution: - { - integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} parse5@6.0.1: - resolution: - { - integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, - } + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} pascal-case@3.1.2: - resolution: - { - integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, - } + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} path-key@2.0.1: - resolution: - { - integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: '>=16 || 14 >=14.18' } + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-scurry@2.0.0: - resolution: - { - integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} path-to-regexp@0.1.12: - resolution: - { - integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==, - } + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} path-to-regexp@2.4.0: - resolution: - { - integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==, - } + resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==} path-type@3.0.0: - resolution: - { - integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} pathe@2.0.3: - resolution: - { - integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, - } + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pathval@2.0.0: - resolution: - { - integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==, - } - engines: { node: '>= 14.16' } + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} pbkdf2@3.1.2: - resolution: - { - integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, - } - engines: { node: '>=0.12' } + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} performance-now@2.1.0: - resolution: - { - integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, - } + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} picocolors@0.2.1: - resolution: - { - integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==, - } + resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.2: - resolution: - { - integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} pidtree@0.3.1: - resolution: - { - integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} hasBin: true pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} pify@3.0.0: - resolution: - { - integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} pify@4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} pirates@4.0.7: - resolution: - { - integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} pkg-up@3.1.0: - resolution: - { - integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} poseidon-lite@0.2.1: - resolution: - { - integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==, - } + resolution: {integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==} possible-typed-array-names@1.1.0: - resolution: - { - integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} postcss-attribute-case-insensitive@5.0.2: - resolution: - { - integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-browser-comments@4.0.0: - resolution: - { - integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==} + engines: {node: '>=8'} peerDependencies: browserslist: '>=4' postcss: '>=8' postcss-calc@8.2.4: - resolution: - { - integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==, - } + resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 postcss-clamp@4.1.0: - resolution: - { - integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, - } - engines: { node: '>=7.6.0' } + resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} + engines: {node: '>=7.6.0'} peerDependencies: postcss: ^8.4.6 postcss-color-functional-notation@4.2.4: - resolution: - { - integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-color-hex-alpha@8.0.4: - resolution: - { - integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 postcss-color-rebeccapurple@7.1.1: - resolution: - { - integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-colormin@5.3.1: - resolution: - { - integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-convert-values@5.1.3: - resolution: - { - integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-custom-media@8.0.2: - resolution: - { - integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 postcss-custom-properties@12.1.11: - resolution: - { - integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-custom-selectors@6.0.3: - resolution: - { - integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.3 postcss-dir-pseudo-class@6.0.5: - resolution: - { - integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-discard-comments@5.1.2: - resolution: - { - integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-discard-duplicates@5.1.0: - resolution: - { - integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-discard-empty@5.1.1: - resolution: - { - integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-discard-overridden@5.1.0: - resolution: - { - integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-double-position-gradients@3.1.2: - resolution: - { - integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-env-function@4.0.6: - resolution: - { - integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 postcss-flexbugs-fixes@5.0.2: - resolution: - { - integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==, - } + resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 postcss-focus-visible@6.0.4: - resolution: - { - integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 postcss-focus-within@5.0.4: - resolution: - { - integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 postcss-font-variant@5.0.0: - resolution: - { - integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, - } + resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 postcss-gap-properties@3.0.5: - resolution: - { - integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-image-set-function@4.0.7: - resolution: - { - integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-import@15.1.0: - resolution: - { - integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 postcss-initial@4.0.1: - resolution: - { - integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==, - } + resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} peerDependencies: postcss: ^8.0.0 postcss-js@4.0.1: - resolution: - { - integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, - } - engines: { node: ^12 || ^14 || >= 16 } + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 postcss-lab-function@4.2.1: - resolution: - { - integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-load-config@4.0.2: - resolution: - { - integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -12299,407 +7680,266 @@ packages: optional: true postcss-loader@6.2.1: - resolution: - { - integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} + engines: {node: '>= 12.13.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 postcss-logical@5.0.4: - resolution: - { - integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.4 postcss-media-minmax@5.0.0: - resolution: - { - integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} + engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.1.0 postcss-merge-longhand@5.1.7: - resolution: - { - integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-merge-rules@5.1.4: - resolution: - { - integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-minify-font-values@5.1.0: - resolution: - { - integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-minify-gradients@5.1.1: - resolution: - { - integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-minify-params@5.1.4: - resolution: - { - integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-minify-selectors@5.2.1: - resolution: - { - integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-modules-extract-imports@3.1.0: - resolution: - { - integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==, - } - engines: { node: ^10 || ^12 || >= 14 } + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 postcss-modules-local-by-default@4.2.0: - resolution: - { - integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==, - } - engines: { node: ^10 || ^12 || >= 14 } + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 postcss-modules-scope@3.2.1: - resolution: - { - integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==, - } - engines: { node: ^10 || ^12 || >= 14 } + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 postcss-modules-values@4.0.0: - resolution: - { - integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==, - } - engines: { node: ^10 || ^12 || >= 14 } + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 postcss-nested@6.2.0: - resolution: - { - integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, - } - engines: { node: '>=12.0' } + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 postcss-nesting@10.2.0: - resolution: - { - integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-normalize-charset@5.1.0: - resolution: - { - integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize-display-values@5.1.0: - resolution: - { - integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize-positions@5.1.1: - resolution: - { - integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize-repeat-style@5.1.1: - resolution: - { - integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize-string@5.1.0: - resolution: - { - integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize-timing-functions@5.1.0: - resolution: - { - integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize-unicode@5.1.1: - resolution: - { - integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize-url@5.1.0: - resolution: - { - integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize-whitespace@5.1.1: - resolution: - { - integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-normalize@10.0.1: - resolution: - { - integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==, - } - engines: { node: '>= 12' } + resolution: {integrity: sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==} + engines: {node: '>= 12'} peerDependencies: browserslist: '>= 4' postcss: '>= 8' postcss-opacity-percentage@1.1.3: - resolution: - { - integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-ordered-values@5.1.3: - resolution: - { - integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-overflow-shorthand@3.0.4: - resolution: - { - integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-page-break@3.0.4: - resolution: - { - integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, - } + resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 postcss-place@7.0.5: - resolution: - { - integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-preset-env@7.8.3: - resolution: - { - integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-pseudo-class-any-link@7.1.6: - resolution: - { - integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-reduce-initial@5.1.2: - resolution: - { - integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-reduce-transforms@5.1.0: - resolution: - { - integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-replace-overflow-wrap@4.0.0: - resolution: - { - integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, - } + resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} peerDependencies: postcss: ^8.0.3 postcss-selector-not@6.0.1: - resolution: - { - integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==, - } - engines: { node: ^12 || ^14 || >=16 } + resolution: {integrity: sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==} + engines: {node: ^12 || ^14 || >=16} peerDependencies: postcss: ^8.2 postcss-selector-parser@6.1.2: - resolution: - { - integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} postcss-selector-parser@7.1.0: - resolution: - { - integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} postcss-svgo@5.1.0: - resolution: - { - integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-unique-selectors@5.1.1: - resolution: - { - integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} postcss@7.0.39: - resolution: - { - integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} + engines: {node: '>=6.0.0'} postcss@8.4.31: - resolution: - { - integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} postcss@8.5.3: - resolution: - { - integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} prelude-ls@1.1.2: - resolution: - { - integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} prettier-plugin-organize-imports@3.2.4: - resolution: - { - integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==, - } + resolution: {integrity: sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog==} peerDependencies: '@volar/vue-language-plugin-pug': ^1.0.4 '@volar/vue-typescript': ^1.0.4 @@ -12712,228 +7952,137 @@ packages: optional: true prettier@2.8.8: - resolution: - { - integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} hasBin: true prettier@3.5.3: - resolution: - { - integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} hasBin: true pretty-bytes@5.6.0: - resolution: - { - integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} pretty-error@4.0.0: - resolution: - { - integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==, - } + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} pretty-format@27.5.1: - resolution: - { - integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==, - } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} pretty-format@28.1.3: - resolution: - { - integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==, - } - engines: { node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0 } + resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} process@0.11.10: - resolution: - { - integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, - } - engines: { node: '>= 0.6.0' } + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} promise@8.3.0: - resolution: - { - integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==, - } + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} prop-types@15.8.1: - resolution: - { - integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, - } + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} property-expr@2.0.6: - resolution: - { - integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==, - } + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} psl@1.15.0: - resolution: - { - integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==, - } + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} public-encrypt@4.0.3: - resolution: - { - integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==, - } + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qs@6.13.0: - resolution: - { - integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} qs@6.14.0: - resolution: - { - integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} quansync@0.2.10: - resolution: - { - integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==, - } + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} querystring@0.2.1: resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. querystringify@2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - } + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-lru@4.0.1: - resolution: - { - integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} quick-lru@5.1.1: - resolution: - { - integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} raf@3.4.1: - resolution: - { - integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==, - } + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} randomfill@1.0.4: - resolution: - { - integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==, - } + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} raw-body@2.5.2: - resolution: - { - integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} react-app-polyfill@3.0.0: - resolution: - { - integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==} + engines: {node: '>=14'} react-copy-to-clipboard@5.1.0: - resolution: - { - integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==, - } + resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} peerDependencies: react: ^15.3.0 || 16 || 17 || 18 react-dev-utils@12.0.1: - resolution: - { - integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} + engines: {node: '>=14'} peerDependencies: typescript: '>=2.7' webpack: '>=4' @@ -12942,57 +8091,33 @@ packages: optional: true react-dom@18.3.1: - resolution: - { - integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, - } + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: react: ^18.3.1 react-error-overlay@6.1.0: - resolution: - { - integrity: sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==, - } + resolution: {integrity: sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==} react-is@16.13.1: - resolution: - { - integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, - } + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-is@17.0.2: - resolution: - { - integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, - } + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} react-is@18.3.1: - resolution: - { - integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, - } + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} react-refresh@0.11.0: - resolution: - { - integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} + engines: {node: '>=0.10.0'} react-refresh@0.17.0: - resolution: - { - integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} react-scripts@5.0.1: - resolution: - { - integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} + engines: {node: '>=14.0.0'} hasBin: true peerDependencies: eslint: '*' @@ -13003,260 +8128,146 @@ packages: optional: true react-spinners@0.14.1: - resolution: - { - integrity: sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag==, - } + resolution: {integrity: sha512-2Izq+qgQ08HTofCVEdcAQCXFEYfqTDdfeDQJeo/HHQiQJD4imOicNLhkfN2eh1NYEWVOX4D9ok2lhuDB0z3Aag==} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 react@18.3.1: - resolution: - { - integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} read-cache@1.0.0: - resolution: - { - integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, - } + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} read-pkg-up@3.0.0: - resolution: - { - integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} read-pkg-up@7.0.1: - resolution: - { - integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} read-pkg@3.0.0: - resolution: - { - integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} read-pkg@5.2.0: - resolution: - { - integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} read-yaml-file@1.1.0: - resolution: - { - integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: '>=8.10.0' } + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} rechoir@0.8.0: - resolution: - { - integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==, - } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} recursive-readdir@2.2.3: - resolution: - { - integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} redent@3.0.0: - resolution: - { - integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} reduce-flatten@2.0.0: - resolution: - { - integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} reflect.getprototypeof@1.0.10: - resolution: - { - integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} regenerate-unicode-properties@10.2.0: - resolution: - { - integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} regenerate@1.4.2: - resolution: - { - integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, - } + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} regenerator-runtime@0.13.11: - resolution: - { - integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, - } + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regenerator-transform@0.15.2: - resolution: - { - integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, - } + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} regex-parser@2.3.1: - resolution: - { - integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==, - } + resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} regexp.prototype.flags@1.5.4: - resolution: - { - integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} regexpu-core@6.2.0: - resolution: - { - integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} regjsgen@0.8.0: - resolution: - { - integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==, - } + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} regjsparser@0.12.0: - resolution: - { - integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==, - } + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true relateurl@0.2.7: - resolution: - { - integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} renderkid@3.0.0: - resolution: - { - integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==, - } + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} resolve-alpn@1.2.1: - resolution: - { - integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==, - } + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} resolve-cwd@3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} resolve-dir@1.0.1: - resolution: - { - integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve-url-loader@4.0.0: - resolution: - { - integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==, - } - engines: { node: '>=8.9' } + resolution: {integrity: sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==} + engines: {node: '>=8.9'} peerDependencies: rework: 1.0.1 rework-visit: 1.0.0 @@ -13267,175 +8278,105 @@ packages: optional: true resolve.exports@1.1.1: - resolution: - { - integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} resolve@1.22.10: - resolution: - { - integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: - resolution: - { - integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, - } + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true responselike@2.0.1: - resolution: - { - integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==, - } + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} restore-cursor@3.1.0: - resolution: - { - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} retry@0.13.1: - resolution: - { - integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} reusify@1.1.0: - resolution: - { - integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, - } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@5.0.10: - resolution: - { - integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==, - } + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true ripemd160@2.0.2: - resolution: - { - integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, - } + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} rollup-plugin-terser@7.0.2: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser peerDependencies: rollup: ^2.0.0 rollup@2.79.2: - resolution: - { - integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + engines: {node: '>=10.0.0'} hasBin: true rollup@4.37.0: - resolution: - { - integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==, - } - engines: { node: '>=18.0.0', npm: '>=8.0.0' } + resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rpc-websockets@9.1.1: - resolution: - { - integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==, - } + resolution: {integrity: sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==} run-applescript@7.0.0: - resolution: - { - integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} run-async@2.4.1: - resolution: - { - integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, - } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rxjs@7.8.2: - resolution: - { - integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, - } + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} safe-array-concat@1.1.3: - resolution: - { - integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, - } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safe-push-apply@1.0.0: - resolution: - { - integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} safe-regex-test@1.1.0: - resolution: - { - integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sanitize.css@13.0.0: - resolution: - { - integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==, - } + resolution: {integrity: sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==} sass-loader@12.6.0: - resolution: - { - integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} + engines: {node: '>= 12.13.0'} peerDependencies: fibers: '>= 3.1.0' node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -13453,732 +8394,418 @@ packages: optional: true sax@1.2.4: - resolution: - { - integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==, - } + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} saxes@5.0.1: - resolution: - { - integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} scheduler@0.23.2: - resolution: - { - integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, - } + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} schema-utils@2.7.0: - resolution: - { - integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==, - } - engines: { node: '>= 8.9.0' } + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} schema-utils@2.7.1: - resolution: - { - integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==, - } - engines: { node: '>= 8.9.0' } + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} schema-utils@3.3.0: - resolution: - { - integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, - } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} schema-utils@4.3.0: - resolution: - { - integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==, - } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} schema-utils@4.3.2: - resolution: - { - integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==, - } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} + engines: {node: '>= 10.13.0'} scrypt-js@3.0.1: - resolution: - { - integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==, - } + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} secp256k1@5.0.1: - resolution: - { - integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} + engines: {node: '>=18.0.0'} select-hose@2.0.0: - resolution: - { - integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==, - } + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} selfsigned@2.4.1: - resolution: - { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.7.1: - resolution: - { - integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} hasBin: true semver@7.7.2: - resolution: - { - integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} hasBin: true send@0.19.0: - resolution: - { - integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} serialize-javascript@4.0.0: - resolution: - { - integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==, - } + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} serialize-javascript@6.0.2: - resolution: - { - integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, - } + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} serve-index@1.9.1: - resolution: - { - integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} serve-static@1.16.2: - resolution: - { - integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} set-function-name@2.0.2: - resolution: - { - integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} set-proto@1.0.0: - resolution: - { - integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} setprototypeof@1.1.0: - resolution: - { - integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==, - } + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} sha.js@2.4.11: - resolution: - { - integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, - } + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true shallow-clone@3.0.1: - resolution: - { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, - } - engines: { node: '>=8' } - - sharp@0.34.2: - resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@1.2.0: - resolution: - { - integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@1.0.0: - resolution: - { - integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} shell-quote@1.8.2: - resolution: - { - integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} shiki@0.14.7: - resolution: - { - integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==, - } + resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} side-channel-list@1.0.0: - resolution: - { - integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} side-channel-map@1.0.1: - resolution: - { - integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} side-channel-weakmap@1.0.2: - resolution: - { - integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} side-channel@1.1.0: - resolution: - { - integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} siginfo@2.0.0: - resolution: - { - integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, - } + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} simple-swizzle@0.2.2: - resolution: - { - integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, - } + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} siwe@3.0.0: - resolution: - { - integrity: sha512-P2/ry7dHYJA6JJ5+veS//Gn2XDwNb3JMvuD6xiXX8L/PJ1SNVD4a3a8xqEbmANx+7kNQcD8YAh1B9bNKKvRy/g==, - } + resolution: {integrity: sha512-P2/ry7dHYJA6JJ5+veS//Gn2XDwNb3JMvuD6xiXX8L/PJ1SNVD4a3a8xqEbmANx+7kNQcD8YAh1B9bNKKvRy/g==} peerDependencies: ethers: ^5.6.8 || ^6.0.8 slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} slash@4.0.0: - resolution: - { - integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} sockjs@0.3.24: - resolution: - { - integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==, - } + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} sort-object-keys@1.1.3: - resolution: - { - integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==, - } + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} sort-package-json@2.15.1: - resolution: - { - integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==, - } + resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} hasBin: true source-list-map@2.0.1: - resolution: - { - integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==, - } + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} source-map-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} source-map-loader@3.0.2: - resolution: - { - integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==} + engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} source-map@0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead spawndamnit@3.0.1: - resolution: - { - integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==, - } + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} spdx-correct@3.2.0: - resolution: - { - integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, - } + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} spdx-exceptions@2.5.0: - resolution: - { - integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, - } + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - } + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} spdx-license-ids@3.0.21: - resolution: - { - integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==, - } + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} spdy-transport@3.0.0: - resolution: - { - integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==, - } + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} spdy@4.0.2: - resolution: - { - integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} split2@3.2.2: - resolution: - { - integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, - } + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} split@1.0.1: - resolution: - { - integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, - } + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} stable-hash@0.0.5: - resolution: - { - integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==, - } + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' stack-utils@2.0.6: - resolution: - { - integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} stackback@0.0.2: - resolution: - { - integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, - } + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} stackframe@1.3.4: - resolution: - { - integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==, - } + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} standard-version@9.5.0: - resolution: - { - integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} hasBin: true static-eval@2.0.2: - resolution: - { - integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==, - } + resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} statuses@1.5.0: - resolution: - { - integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} statuses@2.0.1: - resolution: - { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} std-env@3.8.1: - resolution: - { - integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==, - } + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} std-env@3.9.0: - resolution: - { - integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==, - } + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} stop-iteration-iterator@1.1.0: - resolution: - { - integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} stream-browserify@3.0.0: - resolution: - { - integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==, - } + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} stream-transform@2.1.3: - resolution: - { - integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==, - } + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} string-format@2.0.0: - resolution: - { - integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==, - } + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} string-length@4.0.2: - resolution: - { - integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} string-length@5.0.1: - resolution: - { - integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==, - } - engines: { node: '>=12.20' } + resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} + engines: {node: '>=12.20'} string-natural-compare@3.0.1: - resolution: - { - integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==, - } + resolution: {integrity: sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==} string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} string.prototype.includes@2.0.1: - resolution: - { - integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} string.prototype.matchall@4.0.12: - resolution: - { - integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} string.prototype.padend@3.1.6: - resolution: - { - integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: - resolution: - { - integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, - } + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} string.prototype.trim@1.2.10: - resolution: - { - integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} string.prototype.trimend@1.0.9: - resolution: - { - integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: - resolution: - { - integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} stringify-object@3.3.0: - resolution: - { - integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} stringify-package@1.0.1: resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} strip-bom@4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} strip-comments@2.0.1: - resolution: - { - integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} strip-indent@3.0.0: - resolution: - { - integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} strip-outer@1.0.1: - resolution: - { - integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} style-loader@3.3.4: - resolution: - { - integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} + engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 styled-jsx@5.1.6: - resolution: - { - integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==, - } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' @@ -14190,152 +8817,93 @@ packages: optional: true stylehacks@5.1.1: - resolution: - { - integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==, - } - engines: { node: ^10 || ^12 || >=14.0 } + resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} + engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 sucrase@3.35.0: - resolution: - { - integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true superstruct@2.0.2: - resolution: - { - integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} supports-hyperlinks@2.3.0: - resolution: - { - integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} svg-parser@2.0.4: - resolution: - { - integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==, - } + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} svgo@1.3.2: resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} engines: {node: '>=4.0.0'} + deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. hasBin: true svgo@2.8.0: - resolution: - { - integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} hasBin: true symbol-tree@3.2.4: - resolution: - { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, - } + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} table-layout@1.0.2: - resolution: - { - integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} tailwindcss@3.4.17: - resolution: - { - integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} hasBin: true tapable@1.1.3: - resolution: - { - integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} + engines: {node: '>=6'} tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} temp-dir@2.0.0: - resolution: - { - integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} tempy@0.6.0: - resolution: - { - integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} term-size@2.2.1: - resolution: - { - integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} terminal-link@2.1.1: - resolution: - { - integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} terser-webpack-plugin@5.3.14: - resolution: - { - integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==, - } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' esbuild: '*' @@ -14350,277 +8918,157 @@ packages: optional: true terser@5.39.0: - resolution: - { - integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + engines: {node: '>=10'} hasBin: true test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} test-exclude@7.0.1: - resolution: - { - integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} text-encoding-utf-8@1.0.2: - resolution: - { - integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==, - } + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} text-extensions@1.9.0: - resolution: - { - integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} text-table@0.2.0: - resolution: - { - integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, - } + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} thenify-all@1.6.0: - resolution: - { - integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} thenify@3.3.1: - resolution: - { - integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, - } + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 throat@6.0.2: - resolution: - { - integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==, - } + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} through2@2.0.5: - resolution: - { - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, - } + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} through2@4.0.2: - resolution: - { - integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==, - } + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} thunky@1.1.0: - resolution: - { - integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==, - } + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} tinybench@2.9.0: - resolution: - { - integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, - } + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.2: - resolution: - { - integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, - } + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} tinyglobby@0.2.12: - resolution: - { - integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} tinypool@1.0.2: - resolution: - { - integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==, - } - engines: { node: ^18.0.0 || >=20.0.0 } + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: - resolution: - { - integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} tinyspy@3.0.2: - resolution: - { - integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} tmp-promise@3.0.3: - resolution: - { - integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==, - } + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} tmp@0.0.33: - resolution: - { - integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, - } - engines: { node: '>=0.6.0' } + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} tmp@0.2.3: - resolution: - { - integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==, - } - engines: { node: '>=14.14' } + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} tmpl@1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - } + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} toggle-selection@1.0.6: - resolution: - { - integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==, - } + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} toposort@2.0.2: - resolution: - { - integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==, - } + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} tough-cookie@4.1.4: - resolution: - { - integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tr46@1.0.1: - resolution: - { - integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, - } + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} tr46@2.1.0: - resolution: - { - integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} tree-dump@1.0.3: - resolution: - { - integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==, - } - engines: { node: '>=10.0' } + resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} + engines: {node: '>=10.0'} peerDependencies: tslib: '2' trim-newlines@3.0.1: - resolution: - { - integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} trim-repeated@1.0.0: - resolution: - { - integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} tryer@1.0.1: - resolution: - { - integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==, - } + resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} ts-api-utils@1.4.3: - resolution: - { - integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' ts-command-line-args@2.5.1: - resolution: - { - integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==, - } + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} hasBin: true ts-essentials@7.0.3: - resolution: - { - integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==, - } + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: typescript: '>=3.7.0' ts-interface-checker@0.1.13: - resolution: - { - integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, - } + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} ts-node@10.9.2: - resolution: - { - integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==, - } + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -14634,451 +9082,256 @@ packages: optional: true ts-unused-exports@10.1.0: - resolution: - { - integrity: sha512-QA11Dpwkm5Apfe9s/UkFzHEpbiBxKy0VQ72YRAoqq9VgNbxvvIOcS5Kgm1MCitOec9YU6nf51DEWnmL6jkP2Yg==, - } + resolution: {integrity: sha512-QA11Dpwkm5Apfe9s/UkFzHEpbiBxKy0VQ72YRAoqq9VgNbxvvIOcS5Kgm1MCitOec9YU6nf51DEWnmL6jkP2Yg==} hasBin: true peerDependencies: typescript: '>=3.8.3' tsconfig-paths@3.15.0: - resolution: - { - integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, - } + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsutils@3.21.0: - resolution: - { - integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + 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' + 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' tweetnacl@1.0.3: - resolution: - { - integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==, - } + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} type-check@0.3.2: - resolution: - { - integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} type-fest@0.16.0: - resolution: - { - integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} type-fest@0.18.1: - resolution: - { - integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} type-fest@0.20.2: - resolution: - { - integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} type-fest@0.21.3: - resolution: - { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} type-fest@0.6.0: - resolution: - { - integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} type-fest@0.8.1: - resolution: - { - integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} type-is@1.6.18: - resolution: - { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} typechain@8.3.2: - resolution: - { - integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==, - } + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} hasBin: true peerDependencies: typescript: '>=4.3.0' typed-array-buffer@1.0.3: - resolution: - { - integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} typed-array-byte-length@1.0.3: - resolution: - { - integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} typed-array-byte-offset@1.0.4: - resolution: - { - integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} typed-array-length@1.0.7: - resolution: - { - integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} typedarray-to-buffer@3.1.5: - resolution: - { - integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==, - } + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} typedarray@0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} typedoc-plugin-coverage@2.2.0: - resolution: - { - integrity: sha512-/hq9nwSNBz2p7+VYfljT/zFSmaxN8tlfcIp6CCAaQN6VIxXCciYFIqR+pcckRhjmfHIeSJ5uy2OpCt5F683npA==, - } - engines: { node: '>= 16' } + resolution: {integrity: sha512-/hq9nwSNBz2p7+VYfljT/zFSmaxN8tlfcIp6CCAaQN6VIxXCciYFIqR+pcckRhjmfHIeSJ5uy2OpCt5F683npA==} + engines: {node: '>= 16'} peerDependencies: typedoc: ^0.22.12 || 0.23.x || 0.24.x || 0.25.x typedoc-plugin-missing-exports@2.3.0: - resolution: - { - integrity: sha512-iI9ITNNLlbsLCBBeYDyu0Qqp3GN/9AGyWNKg8bctRXuZEPT7G1L+0+MNWG9MsHcf/BFmNbXL0nQ8mC/tXRicog==, - } + resolution: {integrity: sha512-iI9ITNNLlbsLCBBeYDyu0Qqp3GN/9AGyWNKg8bctRXuZEPT7G1L+0+MNWG9MsHcf/BFmNbXL0nQ8mC/tXRicog==} peerDependencies: typedoc: 0.24.x || 0.25.x typedoc-plugin-zod@1.4.0: - resolution: - { - integrity: sha512-Mr4hoEfjIR1xjp0RqtEyfba03NDUE4jLvgErg0VQz9L60eCVLcUrV0x+71+B7rykDMexrTx0I9Yk6SS0PuSbKw==, - } + resolution: {integrity: sha512-Mr4hoEfjIR1xjp0RqtEyfba03NDUE4jLvgErg0VQz9L60eCVLcUrV0x+71+B7rykDMexrTx0I9Yk6SS0PuSbKw==} peerDependencies: typedoc: 0.23.x || 0.24.x || 0.25.x || 0.26.x || 0.27.x || 0.28.x typedoc@0.25.13: - resolution: - { - integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==, - } - engines: { node: '>= 16' } + resolution: {integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==} + engines: {node: '>= 16'} hasBin: true peerDependencies: - typescript: - 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || - 5.4.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x typescript@4.9.5: - resolution: - { - integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, - } - engines: { node: '>=4.2.0' } + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} hasBin: true typescript@5.2.2: - resolution: - { - integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, - } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} hasBin: true typescript@5.8.2: - resolution: - { - integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==, - } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} hasBin: true typical@4.0.0: - resolution: - { - integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} typical@5.2.0: - resolution: - { - integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} uglify-js@3.19.3: - resolution: - { - integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} hasBin: true unbox-primitive@1.1.0: - resolution: - { - integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} underscore@1.12.1: resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} unicode-canonical-property-names-ecmascript@2.0.1: - resolution: - { - integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} unicode-match-property-ecmascript@2.0.0: - resolution: - { - integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} unicode-match-property-value-ecmascript@2.2.0: - resolution: - { - integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} unicode-property-aliases-ecmascript@2.1.0: - resolution: - { - integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} unique-string@2.0.0: - resolution: - { - integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} universalify@0.1.2: - resolution: - { - integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, - } - engines: { node: '>= 4.0.0' } + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} universalify@0.2.0: - resolution: - { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, - } - engines: { node: '>= 4.0.0' } + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} unquote@1.1.1: - resolution: - { - integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==, - } + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} unrs-resolver@1.3.2: - resolution: - { - integrity: sha512-ZKQBC351Ubw0PY8xWhneIfb6dygTQeUHtCcNGd0QB618zabD/WbFMYdRyJ7xeVT+6G82K5v/oyZO0QSHFtbIuw==, - } + resolution: {integrity: sha512-ZKQBC351Ubw0PY8xWhneIfb6dygTQeUHtCcNGd0QB618zabD/WbFMYdRyJ7xeVT+6G82K5v/oyZO0QSHFtbIuw==} upath@1.2.0: - resolution: - { - integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} update-browserslist-db@1.1.3: - resolution: - { - integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, - } + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} url-parse@1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - } + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} utf-8-validate@5.0.10: - resolution: - { - integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==, - } - engines: { node: '>=6.14.2' } + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} util.promisify@1.0.1: - resolution: - { - integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==, - } + resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} utila@0.4.0: - resolution: - { - integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==, - } + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} utils-merge@1.0.1: - resolution: - { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, - } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} uuid@8.3.2: - resolution: - { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, - } + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true v8-compile-cache-lib@3.0.1: - resolution: - { - integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, - } + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} v8-to-istanbul@8.1.1: - resolution: - { - integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==, - } - engines: { node: '>=10.12.0' } + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} validate-npm-package-license@3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - } + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: '>= 0.8' } - - viem@2.33.3: - resolution: - { - integrity: sha512-aWDr6i6r3OfNCs0h9IieHFhn7xQJJ8YsuA49+9T5JRyGGAkWhLgcbLq2YMecgwM7HdUZpx1vPugZjsShqNi7Gw==, - } - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} - viem@2.33.3: - resolution: {integrity: sha512-aWDr6i6r3OfNCs0h9IieHFhn7xQJJ8YsuA49+9T5JRyGGAkWhLgcbLq2YMecgwM7HdUZpx1vPugZjsShqNi7Gw==} + viem@2.37.8: + resolution: {integrity: sha512-mL+5yvCQbRIR6QvngDQMfEiZTfNWfd+/QL5yFaOoYbpH3b1Q2ddwF7YG2eI2AcYSh9LE1gtUkbzZLFUAVyj4oQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -15086,19 +9339,13 @@ packages: optional: true vite-node@3.0.9: - resolution: - { - integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite@6.2.3: - resolution: - { - integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 @@ -15137,11 +9384,8 @@ packages: optional: true vitest@3.0.9: - resolution: - { - integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' @@ -15168,96 +9412,55 @@ packages: optional: true vlq@2.0.4: - resolution: - { - integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==, - } + resolution: {integrity: sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==} vm-browserify@1.1.2: - resolution: - { - integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==, - } + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} vscode-oniguruma@1.7.0: - resolution: - { - integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==, - } + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} vscode-textmate@8.0.0: - resolution: - { - integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==, - } + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. w3c-xmlserializer@2.0.0: - resolution: - { - integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} walker@1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - } + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} watchpack@2.4.2: - resolution: - { - integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} wbuf@1.7.3: - resolution: - { - integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==, - } + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - } + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} webidl-conversions@4.0.2: - resolution: - { - integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, - } + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} webidl-conversions@5.0.0: - resolution: - { - integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} webidl-conversions@6.1.0: - resolution: - { - integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==, - } - engines: { node: '>=10.4' } + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} webpack-cli@6.0.1: - resolution: - { - integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==, - } - engines: { node: '>=18.12.0' } + resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} + engines: {node: '>=18.12.0'} hasBin: true peerDependencies: webpack: ^5.82.0 @@ -15270,20 +9473,14 @@ packages: optional: true webpack-dev-middleware@5.3.4: - resolution: - { - integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} + engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^4.0.0 || ^5.0.0 webpack-dev-middleware@7.4.2: - resolution: - { - integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==, - } - engines: { node: '>= 18.12.0' } + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.0.0 peerDependenciesMeta: @@ -15291,11 +9488,8 @@ packages: optional: true webpack-dev-server@4.15.2: - resolution: - { - integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} + engines: {node: '>= 12.13.0'} hasBin: true peerDependencies: webpack: ^4.37.0 || ^5.0.0 @@ -15307,11 +9501,8 @@ packages: optional: true webpack-dev-server@5.2.2: - resolution: - { - integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==, - } - engines: { node: '>= 18.12.0' } + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + engines: {node: '>= 18.12.0'} hasBin: true peerDependencies: webpack: ^5.0.0 @@ -15323,40 +9514,28 @@ packages: optional: true webpack-manifest-plugin@4.1.1: - resolution: - { - integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==, - } - engines: { node: '>=12.22.0' } + resolution: {integrity: sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==} + engines: {node: '>=12.22.0'} peerDependencies: webpack: ^4.44.2 || ^5.47.0 webpack-merge@6.0.1: - resolution: - { - integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} webpack-sources@1.4.3: - resolution: - { - integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==, - } + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} webpack-sources@2.3.1: - resolution: - { - integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==, - } - engines: { node: '>=10.13.0' } - - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} + engines: {node: '>=10.13.0'} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} - webpack@5.99.9: - resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} + webpack@5.101.3: + resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -15366,278 +9545,157 @@ packages: optional: true websocket-driver@0.7.4: - resolution: - { - integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} websocket-extensions@0.1.4: - resolution: - { - integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} whatwg-encoding@1.0.5: - resolution: - { - integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==, - } + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} whatwg-fetch@3.6.20: - resolution: - { - integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==, - } + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} whatwg-mimetype@2.3.0: - resolution: - { - integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==, - } + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} whatwg-url@6.5.0: - resolution: - { - integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==, - } + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} whatwg-url@7.1.0: - resolution: - { - integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, - } + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} whatwg-url@8.7.0: - resolution: - { - integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} which-boxed-primitive@1.1.1: - resolution: - { - integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} which-builtin-type@1.2.1: - resolution: - { - integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} which-collection@1.0.2: - resolution: - { - integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-typed-array@1.1.19: - resolution: - { - integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} which@1.3.1: - resolution: - { - integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==, - } + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true why-is-node-running@2.3.0: - resolution: - { - integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} hasBin: true wildcard@2.0.1: - resolution: - { - integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==, - } + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} wordwrapjs@4.0.1: - resolution: - { - integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} workbox-background-sync@6.6.0: - resolution: - { - integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==, - } + resolution: {integrity: sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==} workbox-broadcast-update@6.6.0: - resolution: - { - integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==, - } + resolution: {integrity: sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==} workbox-build@6.6.0: - resolution: - { - integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==} + engines: {node: '>=10.0.0'} workbox-cacheable-response@6.6.0: resolution: {integrity: sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==} + deprecated: workbox-background-sync@6.6.0 workbox-core@6.6.0: - resolution: - { - integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==, - } + resolution: {integrity: sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==} workbox-expiration@6.6.0: - resolution: - { - integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==, - } + resolution: {integrity: sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==} workbox-google-analytics@6.6.0: resolution: {integrity: sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==} + deprecated: It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained workbox-navigation-preload@6.6.0: - resolution: - { - integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==, - } + resolution: {integrity: sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==} workbox-precaching@6.6.0: - resolution: - { - integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==, - } + resolution: {integrity: sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==} workbox-range-requests@6.6.0: - resolution: - { - integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==, - } + resolution: {integrity: sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==} workbox-recipes@6.6.0: - resolution: - { - integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==, - } + resolution: {integrity: sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==} workbox-routing@6.6.0: - resolution: - { - integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==, - } + resolution: {integrity: sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==} workbox-strategies@6.6.0: - resolution: - { - integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==, - } + resolution: {integrity: sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==} workbox-streams@6.6.0: - resolution: - { - integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==, - } + resolution: {integrity: sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==} workbox-sw@6.6.0: - resolution: - { - integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==, - } + resolution: {integrity: sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==} workbox-webpack-plugin@6.6.0: - resolution: - { - integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==} + engines: {node: '>=10.0.0'} peerDependencies: webpack: ^4.4.0 || ^5.9.0 workbox-window@6.6.0: - resolution: - { - integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==, - } + resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} wrap-ansi@6.2.0: - resolution: - { - integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} write-file-atomic@3.0.3: - resolution: - { - integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==, - } + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} ws@7.5.10: - resolution: - { - integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==, - } - engines: { node: '>=8.3.0' } + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -15648,11 +9706,8 @@ packages: optional: true ws@8.18.0: - resolution: - { - integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -15663,26 +9718,8 @@ packages: optional: true ws@8.18.1: - resolution: - { - integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==, - } - 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 - - ws@8.18.2: - resolution: - { - integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -15692,8 +9729,8 @@ packages: utf-8-validate: optional: true - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -15704,99 +9741,61 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xml-name-validator@3.0.0: - resolution: - { - integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==, - } + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} xmlchars@2.2.0: - resolution: - { - integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, - } + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} yaml@1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} yaml@2.7.0: - resolution: - { - integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} hasBin: true yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} yn@3.1.1: - resolution: - { - integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} yup@0.32.11: - resolution: - { - integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} + engines: {node: '>=10'} zod@3.24.2: - resolution: - { - integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==, - } + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} snapshots: @@ -15836,10 +9835,10 @@ snapshots: '@aptos-labs/aptos-cli': 1.0.2 '@aptos-labs/aptos-client': 1.1.0(axios@1.8.4)(got@11.8.6) '@aptos-labs/script-composer-pack': 0.0.9 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 eventemitter3: 5.0.1 form-data: 4.0.2 js-base64: 3.7.7 @@ -17724,6 +11723,43 @@ snapshots: jest-util: 28.1.3 slash: 3.0.0 + '@jest/core@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10)': + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 24.3.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.8 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + '@jest/core@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10)': dependencies: '@jest/console': 27.5.1 @@ -18109,9 +12145,9 @@ snapshots: '@noble/ciphers@1.3.0': {} - '@noble/curves@1.8.1': + '@noble/curves@1.9.1': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/curves@1.9.2': dependencies: @@ -18119,8 +12155,6 @@ snapshots: '@noble/ed25519@1.7.3': {} - '@noble/hashes@1.7.1': {} - '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': @@ -18196,12 +12230,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) optionalDependencies: type-fest: 0.21.3 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3)': dependencies: anser: 2.3.2 core-js-pure: 3.41.0 @@ -18321,27 +12355,14 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} - '@scure/base@1.2.4': {} - '@scure/base@1.2.6': {} - '@scure/bip32@1.6.2': - dependencies: - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 - '@scure/bip32@1.7.0': dependencies: '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@scure/bip39@1.5.4': - dependencies: - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 - '@scure/bip39@1.6.0': dependencies: '@noble/hashes': 1.8.0 @@ -18371,8 +12392,8 @@ snapshots: '@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@babel/runtime': 7.27.0 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.6.0 bigint-buffer: 1.1.5 @@ -18392,7 +12413,7 @@ snapshots: '@spruceid/siwe-parser@3.0.0': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 apg-js: 4.4.0 '@stablelib/binary@1.0.1': @@ -18664,6 +12685,10 @@ snapshots: '@types/node@12.20.55': {} + '@types/node@20.19.17': + dependencies: + undici-types: 6.21.0 + '@types/node@24.3.0': dependencies: undici-types: 7.10.0 @@ -19047,7 +13072,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -19062,7 +13087,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -19182,17 +13207,17 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) @@ -19210,7 +13235,7 @@ snapshots: abab@2.0.6: {} - abitype@1.0.8(typescript@5.8.2)(zod@3.24.2): + abitype@1.1.0(typescript@5.8.2)(zod@3.24.2): optionalDependencies: typescript: 5.8.2 zod: 3.24.2 @@ -19592,7 +13617,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) babel-plugin-istanbul@6.1.1: dependencies: @@ -20341,7 +14366,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.0(webpack@5.99.9): + copy-webpack-plugin@13.0.1(webpack@5.101.3): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 @@ -20489,7 +14514,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) css-minimizer-webpack-plugin@3.4.1(webpack@5.101.3): dependencies: @@ -20499,7 +14524,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) css-prefers-color-scheme@6.0.3(postcss@8.5.3): dependencies: @@ -21070,7 +15095,7 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.99.9): + esbuild-loader@2.21.0(webpack@5.101.3): dependencies: esbuild: 0.16.17 joycon: 3.1.1 @@ -21228,6 +15253,33 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): + dependencies: + '@babel/core': 7.26.10 + '@babel/eslint-parser': 7.27.0(@babel/core@7.26.10)(eslint@8.57.1) + '@rushstack/eslint-patch': 1.11.0 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + babel-preset-react-app: 10.1.0 + confusing-browser-globals: 1.0.11 + eslint: 8.57.1 + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) + eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) + eslint-plugin-testing-library: 5.11.1(eslint@8.57.1)(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - jest + - supports-color + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): dependencies: '@babel/core': 7.26.10 @@ -21415,6 +15467,17 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + eslint: 8.57.1 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + transitivePeerDependencies: + - supports-color + - typescript + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) @@ -21562,7 +15625,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) eslint@8.57.0: dependencies: @@ -21866,11 +15929,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.99.9): + file-loader@6.2.0(webpack@5.101.3): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) file-uri-to-path@1.0.0: {} @@ -21983,7 +16046,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.8.2 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) optionalDependencies: eslint: 8.57.1 @@ -22370,7 +16433,7 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-webpack-plugin@5.6.3(webpack@5.99.9): + html-webpack-plugin@5.6.3(webpack@5.101.3): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -22378,7 +16441,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) htmlparser2@6.1.0: dependencies: @@ -22786,9 +16849,9 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isows@1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) istanbul-lib-coverage@3.2.2: {} @@ -22903,6 +16966,27 @@ snapshots: transitivePeerDependencies: - supports-color + jest-cli@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10): + dependencies: + '@jest/core': 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.2.0 + jest-config: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + jest-cli@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10): dependencies: '@jest/core': 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10) @@ -22924,6 +17008,40 @@ snapshots: - ts-node - utf-8-validate + jest-config@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.26.10 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.26.10) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + ts-node: 10.9.2(@types/node@20.19.17)(typescript@5.8.2) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + jest-config@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 @@ -23227,6 +17345,17 @@ snapshots: leven: 3.1.0 pretty-format: 27.5.1 + jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10)): + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest-regex-util: 28.0.2 + jest-watcher: 28.1.3 + slash: 4.0.0 + string-length: 5.0.1 + strip-ansi: 7.1.0 + jest-watch-typeahead@1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10)): dependencies: ansi-escapes: 4.3.2 @@ -23277,6 +17406,18 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10): + dependencies: + '@jest/core': 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + import-local: 3.2.0 + jest-cli: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10): dependencies: '@jest/core': 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10) @@ -23680,7 +17821,7 @@ snapshots: dependencies: schema-utils: 4.3.0 tapable: 2.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} @@ -24011,15 +18152,15 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.8.6(typescript@5.8.2)(zod@3.24.2): + ox@0.9.6(typescript@5.8.2)(zod@3.24.2): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) + abitype: 1.1.0(typescript@5.8.2)(zod@3.24.2) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.2 @@ -24346,6 +18487,14 @@ snapshots: postcss: 8.5.3 postcss-value-parser: 4.2.0 + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2)): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + optionalDependencies: + postcss: 8.5.3 + ts-node: 10.9.2(@types/node@20.19.17)(typescript@5.8.2) + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)): dependencies: lilconfig: 3.1.3 @@ -24360,7 +18509,7 @@ snapshots: klona: 2.0.6 postcss: 8.5.3 semver: 7.7.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) postcss-logical@5.0.4(postcss@8.5.3): dependencies: @@ -24802,7 +18951,7 @@ snapshots: shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -24828,6 +18977,93 @@ snapshots: react-refresh@0.17.0: {} + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.26.10 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3))(webpack@5.101.3) + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1(@babel/core@7.26.10) + babel-loader: 8.4.1(@babel/core@7.26.10)(webpack@5.101.3) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.10) + babel-preset-react-app: 10.1.0 + bfj: 7.1.0 + browserslist: 4.24.4 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.11.0(webpack@5.101.3) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.101.3) + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 8.57.1 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.101.3) + file-loader: 6.2.0(webpack@5.101.3) + fs-extra: 10.1.0 + html-webpack-plugin: 5.6.3(webpack@5.101.3) + identity-obj-proxy: 3.0.0 + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.9.2(webpack@5.101.3) + postcss: 8.5.3 + postcss-flexbugs-fixes: 5.0.2(postcss@8.5.3) + postcss-loader: 6.2.1(postcss@8.5.3)(webpack@5.101.3) + postcss-normalize: 10.0.1(browserslist@4.24.4)(postcss@8.5.3) + postcss-preset-env: 7.8.3(postcss@8.5.3) + prompts: 2.4.2 + react: 18.3.1 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.8.2)(webpack@5.101.3) + react-refresh: 0.11.0 + resolve: 1.22.10 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0(webpack@5.101.3) + semver: 7.7.1 + source-map-loader: 3.0.2(webpack@5.101.3) + style-loader: 3.3.4(webpack@5.101.3) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2)) + terser-webpack-plugin: 5.3.14(webpack@5.101.3) + webpack: 5.101.3(webpack-cli@6.0.1) + webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) + webpack-manifest-plugin: 4.1.1(webpack@5.101.3) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.101.3) + optionalDependencies: + fsevents: 2.3.3 + typescript: 5.8.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10): dependencies: '@babel/core': 7.26.10 @@ -24870,14 +19106,14 @@ snapshots: resolve-url-loader: 4.0.0 sass-loader: 12.6.0(webpack@5.101.3) semver: 7.7.1 - source-map-loader: 3.0.2(webpack@5.99.9) - style-loader: 3.3.4(webpack@5.99.9) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) - terser-webpack-plugin: 5.3.14(webpack@5.99.9) - webpack: 5.99.9(webpack-cli@6.0.1) - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) - webpack-manifest-plugin: 4.1.1(webpack@5.99.9) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) + source-map-loader: 3.0.2(webpack@5.101.3) + style-loader: 3.3.4(webpack@5.101.3) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) + terser-webpack-plugin: 5.3.14(webpack@5.101.3) + webpack: 5.101.3(webpack-cli@6.0.1) + webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) + webpack-manifest-plugin: 4.1.1(webpack@5.101.3) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.101.3) optionalDependencies: fsevents: 2.3.3 typescript: 5.8.2 @@ -25220,7 +19456,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) sax@1.2.4: {} @@ -25500,7 +19736,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) source-map-support@0.5.21: dependencies: @@ -25751,7 +19987,7 @@ snapshots: style-loader@3.3.4(webpack@5.101.3): dependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) styled-jsx@5.1.6(react@18.3.1): dependencies: @@ -25832,6 +20068,33 @@ snapshots: typical: 5.2.0 wordwrapjs: 4.0.1 + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2)) + postcss-nested: 6.2.0(postcss@8.5.3) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -25879,14 +20142,14 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.99.9): + terser-webpack-plugin@5.3.14(webpack@5.101.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) terser@5.39.0: dependencies: @@ -26029,6 +20292,25 @@ snapshots: ts-interface-checker@0.1.13: {} + ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.19.17 + acorn: 8.14.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -26195,6 +20477,8 @@ snapshots: underscore@1.12.1: {} + undici-types@6.21.0: {} + undici-types@7.10.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -26292,16 +20576,16 @@ snapshots: vary@1.1.2: {} - viem@2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2): + viem@2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2): dependencies: - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) - isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.8.6(typescript@5.8.2)(zod@3.24.2) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + abitype: 1.1.0(typescript@5.8.2)(zod@3.24.2) + isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.9.6(typescript@5.8.2)(zod@3.24.2) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -26309,25 +20593,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): - dependencies: - cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 - pathe: 2.0.3 - vite: 6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - vite-node@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -26342,7 +20614,7 @@ snapshots: - tsx - yaml - vite@6.2.3(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -26354,19 +20626,7 @@ snapshots: terser: 5.39.0 yaml: 2.7.0 - vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): - dependencies: - esbuild: 0.25.1 - postcss: 8.5.3 - rollup: 4.37.0 - optionalDependencies: - '@types/node': 22.13.14 - fsevents: 2.3.3 - jiti: 2.4.2 - terser: 5.39.0 - yaml: 2.7.0 - - vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -26389,46 +20649,7 @@ snapshots: vite-node: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.17.28 - jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): - dependencies: - '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.9 - '@vitest/runner': 3.0.9 - '@vitest/snapshot': 3.0.9 - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 - chai: 5.2.0 - debug: 4.4.0 - expect-type: 1.2.0 - magic-string: 0.30.17 - pathe: 2.0.3 - std-env: 3.8.1 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinypool: 1.0.2 - tinyrainbow: 2.0.0 - vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti @@ -26488,9 +20709,9 @@ snapshots: webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.3) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -26511,9 +20732,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) - webpack-dev-middleware@7.4.2(webpack@5.99.9): + webpack-dev-middleware@7.4.2(webpack@5.101.3): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -26557,7 +20778,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) transitivePeerDependencies: - bufferutil - debug @@ -26592,7 +20813,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.99.9) + webpack-dev-middleware: 7.4.2(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1) @@ -26606,7 +20827,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.101.3): dependencies: tapable: 2.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) webpack-sources: 2.3.1 webpack-merge@6.0.1: @@ -26627,15 +20848,16 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.99.9(webpack-cli@6.0.1): + webpack@5.101.3(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.24.4 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 @@ -26650,9 +20872,9 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.99.9) + terser-webpack-plugin: 5.3.14(webpack@5.101.3) watchpack: 2.4.2 - webpack-sources: 3.2.3 + webpack-sources: 3.3.3 optionalDependencies: webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) transitivePeerDependencies: @@ -26877,7 +21099,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -26931,11 +21153,15 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + xml-name-validator@3.0.0: {} xmlchars@2.2.0: {} @@ -26978,4 +21204,4 @@ snapshots: property-expr: 2.0.6 toposort: 2.0.2 - zod@3.24.2: {} + zod@3.24.2: {} \ No newline at end of file From 30190865787e178d0e9f8fc85d33e51e639e01b3 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 12 Aug 2025 18:40:56 +0200 Subject: [PATCH 71/97] feat: add viem support with ethers.js adapter wrappers and viem auth provider --- packages/taco-auth/package.json | 8 + packages/taco-auth/src/providers/index.ts | 1 + .../taco-auth/src/providers/viem/index.ts | 3 + .../src/providers/viem/viem-auth-providers.ts | 80 ++++ .../src/providers/viem/viem-wrappers.ts | 161 +++++++ packages/taco/VIEM_SUPPORT.md | 129 +++--- .../viem-encrypt-decrypt.test.ts | 261 +++++++++++ packages/taco/package.json | 8 + packages/taco/src/index.ts | 3 + packages/taco/src/viem-taco.ts | 134 ++++++ packages/taco/src/wrappers/index.ts | 6 + packages/taco/src/wrappers/viem-wrappers.ts | 343 +++++++++++++++ packages/taco/test/viem-unit.test.ts | 169 +++++++ packages/taco/test/viem-wrappers.test.ts | 122 +++++ pnpm-lock.yaml | 415 +++++++++--------- 15 files changed, 1582 insertions(+), 261 deletions(-) create mode 100644 packages/taco-auth/src/providers/viem/index.ts create mode 100644 packages/taco-auth/src/providers/viem/viem-auth-providers.ts create mode 100644 packages/taco-auth/src/providers/viem/viem-wrappers.ts create mode 100644 packages/taco/integration-test/viem-encrypt-decrypt.test.ts create mode 100644 packages/taco/src/viem-taco.ts create mode 100644 packages/taco/src/wrappers/index.ts create mode 100644 packages/taco/src/wrappers/viem-wrappers.ts create mode 100644 packages/taco/test/viem-unit.test.ts create mode 100644 packages/taco/test/viem-wrappers.test.ts diff --git a/packages/taco-auth/package.json b/packages/taco-auth/package.json index 2e68475af..83e4648b0 100644 --- a/packages/taco-auth/package.json +++ b/packages/taco-auth/package.json @@ -47,6 +47,14 @@ "devDependencies": { "@nucypher/test-utils": "workspace:*" }, + "peerDependencies": { + "viem": "^2.0.0" + }, + "peerDependenciesMeta": { + "viem": { + "optional": true + } + }, "engines": { "node": ">=18", "pnpm": ">=8.0.0" diff --git a/packages/taco-auth/src/providers/index.ts b/packages/taco-auth/src/providers/index.ts index 76b739f00..b1bcd4e23 100644 --- a/packages/taco-auth/src/providers/index.ts +++ b/packages/taco-auth/src/providers/index.ts @@ -7,3 +7,4 @@ export { } from './eip4361/auth'; export * from './eip4361/eip4361'; export * from './eip4361/external-eip4361'; +export * from './viem'; diff --git a/packages/taco-auth/src/providers/viem/index.ts b/packages/taco-auth/src/providers/viem/index.ts new file mode 100644 index 000000000..46d967630 --- /dev/null +++ b/packages/taco-auth/src/providers/viem/index.ts @@ -0,0 +1,3 @@ +export { ViemEIP4361AuthProvider } from './viem-auth-providers'; +export type { EIP4361AuthProviderParams } from './viem-auth-providers'; +export { createEthersProvider, createEthersSigner } from './viem-wrappers'; diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts new file mode 100644 index 000000000..9c5bca591 --- /dev/null +++ b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts @@ -0,0 +1,80 @@ +import { EIP4361AuthProvider, EIP4361AuthProviderParams } from '../eip4361/eip4361'; + +import { createEthersProvider, createEthersSigner } from './viem-wrappers'; + +// Dynamic viem types (available only when viem is installed) +type Account = any; +type PublicClient = any; + +/** + * Viem-compatible EIP4361 authentication provider. + * + * This class provides a clean viem-native API for EIP4361 authentication + * while internally handling the conversion to ethers.js objects that the + * underlying EIP4361AuthProvider expects. + * + * @example + * ```typescript + * import { createPublicClient, http } from 'viem'; + * import { privateKeyToAccount } from 'viem/accounts'; + * import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; + * + * const publicClient = createPublicClient({ + * chain: polygon, + * transport: http() + * }); + * const account = privateKeyToAccount('0x...'); + * + * const authProvider = new ViemEIP4361AuthProvider( + * publicClient, + * account, + * { domain: 'my-app.com', uri: 'https://my-app.com' } + * ); + * + * const signature = await authProvider.getOrCreateAuthSignature(); + * ``` + */ +export class ViemEIP4361AuthProvider { + private ethersAuthProvider: EIP4361AuthProvider; + + /** + * Create a new ViemEIP4361AuthProvider + * + * @param viemPublicClient - viem PublicClient for blockchain interactions + * @param viemAccount - viem Account for signing operations + * @param options - Optional EIP4361 parameters (domain, uri) + */ + constructor( + viemPublicClient: PublicClient, + viemAccount: Account, + options?: EIP4361AuthProviderParams + ) { + // Convert viem objects to ethers objects internally + const ethersProvider = createEthersProvider(viemPublicClient); + const ethersSigner = createEthersSigner(viemAccount, ethersProvider); + + // Create the underlying ethers auth provider + this.ethersAuthProvider = new EIP4361AuthProvider( + ethersProvider, + ethersSigner, + options + ); + } + + /** + * Get or create authentication signature + */ + async getOrCreateAuthSignature() { + return this.ethersAuthProvider.getOrCreateAuthSignature(); + } + + /** + * Get the underlying ethers auth provider (for advanced use cases) + */ + get ethersProvider(): EIP4361AuthProvider { + return this.ethersAuthProvider; + } +} + +// Export type for consumers +export type { EIP4361AuthProviderParams }; diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts new file mode 100644 index 000000000..6a090a22e --- /dev/null +++ b/packages/taco-auth/src/providers/viem/viem-wrappers.ts @@ -0,0 +1,161 @@ +import { ethers } from 'ethers'; + +// Dynamic viem types (available only when viem is installed) +type Account = any; +type PublicClient = any; + +/** + * Checks if viem is available and throws a helpful error if not + */ +function checkViemAvailability(): void { + try { + require('viem'); + } catch (error) { + throw new Error( + 'viem is required for viem auth providers. Install it with: npm install viem', + ); + } +} + +/** + * A minimal provider that wraps viem PublicClient for auth provider compatibility + * + * This class implements only the methods needed for EIP4361AuthProvider to work. + * It uses type assertion to satisfy the ethers.providers.Provider interface + * without implementing all methods. + */ +class ViemAuthProvider { + private viemPublicClient: PublicClient; + + constructor(viemPublicClient: PublicClient) { + this.viemPublicClient = viemPublicClient; + } + + async getNetwork(): Promise { + const chainId = await this.viemPublicClient.getChainId(); + return { + name: this.viemPublicClient.chain?.name || `chain-${chainId}`, + chainId, + }; + } + + async call(transaction: ethers.providers.TransactionRequest): Promise { + const result = await this.viemPublicClient.call({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + }); + if (typeof result === 'object' && result && 'data' in result) { + return result.data as string; + } + return result as string; + } + + // Stub methods for ethers compatibility (not used by EIP4361AuthProvider) + async getBlockNumber(): Promise { return 0; } + async getGasPrice(): Promise { return ethers.BigNumber.from(0); } + async getFeeData(): Promise { return null; } + async getBalance(): Promise { return ethers.BigNumber.from(0); } + async getTransactionCount(): Promise { return 0; } + async getCode(): Promise { return '0x'; } + async getStorageAt(): Promise { return '0x'; } + async sendTransaction(): Promise { throw new Error('Not implemented'); } + async getTransaction(): Promise { return null; } + async getTransactionReceipt(): Promise { return null; } + async getLogs(): Promise { return []; } + async getBlock(): Promise { return null; } + async getBlockWithTransactions(): Promise { return null; } + async resolveName(): Promise { return null; } + async lookupAddress(): Promise { return null; } + async waitForTransaction(): Promise { return null; } + + // Event emitter methods (not used by EIP4361AuthProvider) + on(): this { return this; } + off(): this { return this; } + removeAllListeners(): this { return this; } + listenerCount(): number { return 0; } + listeners(): any[] { return []; } + emit(): boolean { return false; } +} + +/** + * A signer that wraps viem Account for auth provider compatibility + * + * This class implements only the methods needed for EIP4361AuthProvider to work. + */ +class ViemAuthSigner { + private viemAccount: Account; + private provider: ethers.providers.Provider; + + constructor(viemAccount: Account, provider: ethers.providers.Provider) { + this.viemAccount = viemAccount; + this.provider = provider; + } + + get address(): string { + return this.viemAccount.address; + } + + getAddress(): Promise { + return Promise.resolve(this.viemAccount.address); + } + + async signMessage(message: string | Uint8Array): Promise { + checkViemAvailability(); + // Convert message to hex if it's Uint8Array + const messageToSign = typeof message === 'string' ? message : ethers.utils.hexlify(message); + return await this.viemAccount.signMessage({ message: messageToSign }); + } + + async signTypedData(domain: any, types: any, message: any): Promise { + checkViemAvailability(); + return await this.viemAccount.signTypedData({ + domain, + types, + message, + primaryType: Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', + }); + } + + getProvider(): ethers.providers.Provider { + return this.provider; + } + + // Required ethers signer properties and stub methods + _isSigner = true; + + // Stub methods for ethers Signer compatibility (not used by EIP4361AuthProvider) + async signTransaction(): Promise { throw new Error('Not implemented'); } + connect(): this { return this; } + async getBalance(): Promise { return ethers.BigNumber.from(0); } + async getTransactionCount(): Promise { return 0; } + async getGasPrice(): Promise { return ethers.BigNumber.from(0); } + async getFeeData(): Promise { return null; } + async estimateGas(): Promise { return ethers.BigNumber.from(0); } + async call(): Promise { return '0x'; } + async sendTransaction(): Promise { throw new Error('Not implemented'); } + async getChainId(): Promise { return (await this.provider.getNetwork()).chainId; } + async resolveName(): Promise { return null; } + checkTransaction(): any { return {}; } + populateTransaction(): Promise { return Promise.resolve({}); } +} + +/** + * Create an ethers-compatible provider from viem PublicClient + * Minimal version for auth provider compatibility + */ +export function createEthersProvider(viemPublicClient: PublicClient): ethers.providers.Provider { + checkViemAvailability(); + // Use type assertion since we implement the minimal interface needed for auth + return new ViemAuthProvider(viemPublicClient) as unknown as ethers.providers.Provider; +} + +/** + * Create an ethers-compatible signer from viem Account + * Minimal version for auth provider compatibility + */ +export function createEthersSigner(viemAccount: Account, provider: ethers.providers.Provider): ethers.Signer { + checkViemAvailability(); + // Use type assertion since we implement the minimal interface needed for auth + return new ViemAuthSigner(viemAccount, provider) as unknown as ethers.Signer; +} diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index 4fbcf4533..7543669f0 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -1,9 +1,7 @@ # Viem Support -The TACo SDK provides unified `encrypt` and `decrypt` functions that work -seamlessly with both [ethers.js](https://docs.ethers.org/) and -[viem](https://viem.sh) through TypeScript function overloads. The same function -names automatically detect which library you're using based on parameter types. +The TACo SDK supports [viem](https://viem.sh) for encryption and decryption +operations. ## Installation @@ -15,36 +13,24 @@ npm install viem ### For Authentication Providers -If you need authentication providers that work with viem, install the taco-auth -package: +If you need viem-compatible authentication providers (like +`ViemEIP4361AuthProvider`), install the taco-auth package: ```bash npm install @nucypher/taco-auth viem ``` -## Supported Libraries - -The same `encrypt` and `decrypt` functions work with both ethers.js and viem. - -Here is how to use them with viem: +## Sample Usage ```typescript -import { - encrypt, - decrypt, - conditions, - domains, - initialize, -} from '@nucypher/taco'; import { createPublicClient, http } from 'viem'; import { polygonAmoy } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; +import { encryptWithViem, decryptWithViem } from '@nucypher/taco'; +import * as conditions from '@nucypher/taco/conditions'; -// Initialize TACo -await initialize(); - -// Create viem public client -const publicClient = createPublicClient({ +// Create viem client +const viemPublicClient = createPublicClient({ chain: polygonAmoy, transport: http(), }); @@ -52,9 +38,11 @@ const publicClient = createPublicClient({ const viemAccount = privateKeyToAccount('0x...'); // Create access condition -const condition = new conditions.predefined.erc20.ERC20Balance({ +const condition = conditions.predefined.erc20Balance({ contractAddress: '0x...', + standardContractType: 'ERC20', chain: 80002, + method: 'balanceOf', parameters: [':userAddress'], returnValueTest: { comparator: '>', @@ -62,40 +50,67 @@ const condition = new conditions.predefined.erc20.ERC20Balance({ }, }); -// Same function names work with viem - TypeScript automatically detects the right overload -const encryptedKit = await encrypt( - publicClient, // viem PublicClient - domains.DEVNET, // or 'lynx' +// Encrypt a message +const encryptedKit = await encryptWithViem( + viemPublicClient, + 'lynx', 'Hello, secret!', condition, 27, // ritual ID - viemAccount, // viem Signer Account (`LocalAccount` or `WalletClient`) + viemAccount, ); -// Same decrypt function works with viem -const decryptedMessage = await decrypt( - publicClient, - domains.DEVNET, +// Decrypt the message +const decryptedMessage = await decryptWithViem( + viemPublicClient, + 'lynx', encryptedKit, ); console.log(new TextDecoder().decode(decryptedMessage)); // "Hello, secret!" ``` -## Authentication Providers +### Viem-Compatible Functions + +#### `encryptWithViem(viemPublicClient, domain, message, condition, ritualId, viemAccount)` + +Encrypts a message using viem objects. + +- `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations +- `domain`: `Domain` - TACo domain ('lynx', 'TESTNET', 'MAINNET') +- `message`: `Uint8Array | string` - Message to encrypt +- `condition`: `Condition` - Access condition for decryption +- `ritualId`: `number` - DKG ritual ID +- `viemAccount`: `Account` - Viem account for signing + +Returns: `Promise` + +#### `decryptWithViem(viemPublicClient, domain, messageKit, context?, porterUris?)` + +Decrypts a message using viem objects. + +- `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations +- `domain`: `Domain` - TACo domain +- `messageKit`: `ThresholdMessageKit` - Encrypted message kit +- `context?`: `ConditionContext` - Optional context for conditions +- `porterUris?`: `string[]` - Optional Porter service URIs + +Returns: `Promise` + +## Viem Authentication Providers For applications that need authentication providers compatible with viem, use the `@nucypher/taco-auth` package: -### EIP4361AuthProvider +### ViemEIP4361AuthProvider -`EIP4361AuthProvider` also supports both ethers.js and viem: +Creates an EIP-4361 compliant authentication provider from viem objects: ```typescript -import { createPublicClient, http } from 'viem'; +import { createPublicClient, createWalletClient, http } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; -import { EIP4361AuthProvider } from '@nucypher/taco-auth'; +import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; const publicClient = createPublicClient({ chain: polygonAmoy, @@ -103,8 +118,7 @@ const publicClient = createPublicClient({ }); const account = privateKeyToAccount('0x...'); -// Viem usage -const authProvider = new EIP4361AuthProvider(publicClient, account, { +const authProvider = new ViemEIP4361AuthProvider(publicClient, account, { domain: 'my-app.com', uri: 'https://my-app.com', }); @@ -112,22 +126,35 @@ const authProvider = new EIP4361AuthProvider(publicClient, account, { const authSignature = await authProvider.getOrCreateAuthSignature(); ``` -**Ethers.js Usage (for comparison):** +**Parameters:** -```typescript -import { ethers } from 'ethers'; -import { EIP4361AuthProvider } from '@nucypher/taco-auth'; +- `viemPublicClient`: `PublicClient` - Viem public client for network operations +- `viemAccount`: `Account` - Viem account for signing +- `options?`: `EIP4361AuthProviderParams` - Optional domain and URI for EIP-4361 + messages -const provider = new ethers.providers.JsonRpcProvider(); -const signer = new ethers.Wallet('0x...', provider); +**Methods:** -// Ethers usage -const authProvider = new EIP4361AuthProvider(provider, signer); -``` +- `getOrCreateAuthSignature()`: Returns authentication signature for TACo + operations +- `ethersProvider`: Getter for underlying ethers-compatible auth provider -## Installation +## Package Architecture + +### @nucypher/taco + +- **Purpose**: Core encryption and decryption functionality +- **Viem Functions**: `encryptWithViem()`, `decryptWithViem()` +- **Dependencies**: Only viem functions for encryption operations + +### @nucypher/taco-auth + +- **Purpose**: Authentication providers and signing utilities +- **Viem Functions**: `ViemEIP4361AuthProvider` +- **Dependencies**: Viem authentication and EIP-4361 signing -Use the appropriate package based on your needs: +This separation follows clean architecture principles - use the appropriate +package based on your needs: - **Encryption only**: Install `@nucypher/taco` + `viem` - **Authentication required**: Install both `@nucypher/taco` + diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts new file mode 100644 index 000000000..97ea57c37 --- /dev/null +++ b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts @@ -0,0 +1,261 @@ +import { beforeAll, describe, expect, test } from 'vitest'; + +import { fromBytes, toBytes } from '@nucypher/shared'; +import { + USER_ADDRESS_PARAM_DEFAULT, +} from '@nucypher/taco-auth'; +import { createPublicClient, createWalletClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; +import { polygonAmoy } from 'viem/chains'; +import { conditions, initialize, ThresholdMessageKit } from '../src'; +import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; +import { CompoundCondition } from '../src/conditions/compound-condition'; +import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; +import { UINT256_MAX } from '../test/test-utils'; + +const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; +const ENCRYPTOR_PRIVATE_KEY = + '0x900edb9e8214b2353f82aa195e915128f419a92cfb8bbc0f4784f10ef4112b86'; +const CONSUMER_PRIVATE_KEY = + '0xf307e165339cb5deb2b8ec59c31a5c0a957b8e8453ce7fe8a19d9a4c8acf36d4'; +const DOMAIN = 'lynx'; +const RITUAL_ID = 27; +const CHAIN_ID = 80002; + +// Create viem accounts from private keys +const encryptorAccount = privateKeyToAccount( + ENCRYPTOR_PRIVATE_KEY as `0x${string}`, +); +const consumerAccount = privateKeyToAccount( + CONSUMER_PRIVATE_KEY as `0x${string}`, +); + +describe('Viem Encrypt/Decrypt Integration Test', () => { + let viemPublicClient: any; + let viemWalletClient: any; + + beforeAll(async () => { + // Create viem clients + viemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + viemWalletClient = createWalletClient({ + account: consumerAccount, + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + // Initialize the library + await initialize(); + + // Verify network connection + const chainId = await viemPublicClient.getChainId(); + if (chainId !== CHAIN_ID) { + throw new Error( + `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${chainId}`, + ); + } + }); + + test('should encrypt and decrypt a message with viem using RPC balance condition', async () => { + // Create test message + const messageString = 'This is a secret viem message 🔐'; + const message = toBytes(messageString); + + // Create conditions + const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + const balanceLessThanMaxUintBigInt = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '<', + // max uint256 + value: UINT256_MAX, + }, + }); + + const compoundCondition = CompoundCondition.and([ + hasPositiveBalance, + balanceLessThanMaxUintBigInt, + ]); + + // Encrypt message using viem + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + compoundCondition, + RITUAL_ID, + encryptorAccount, + ); + + const encryptedBytes = messageKit.toBytes(); + + // Prepare for decryption + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using viem-native auth provider + if ( + conditionContext.requestedContextParameters.has( + USER_ADDRESS_PARAM_DEFAULT, + ) + ) { + // Use the new ViemEIP4361AuthProvider - no manual conversion needed! + const viemAuthProvider = new ViemEIP4361AuthProvider( + viemPublicClient, + consumerAccount, + ); + + // Get the underlying ethers auth provider for context compatibility + const ethersAuthProvider = viemAuthProvider.ethersProvider; + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + ethersAuthProvider, + ); + } + + // Decrypt message using viem + const decryptedBytes = await decryptWithViem( + viemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout + + test('should encrypt and decrypt with viem using simple positive balance condition', async () => { + // Create test message + const messageString = + 'This viem message tests simple balance condition'; + const message = toBytes(messageString); + + // Create simple positive balance condition (avoids problematic allowlist condition) + const positiveBalanceCondition = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + // Encrypt message with viem using simple condition + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + positiveBalanceCondition, + RITUAL_ID, + encryptorAccount, + ); + + const encryptedBytes = messageKit.toBytes(); + + // Prepare for decryption + const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using ViemEIP4361AuthProvider + const viemAuthProvider = new ViemEIP4361AuthProvider( + viemPublicClient, + consumerAccount, + ); + + // Get the ethers-compatible auth provider for context + const ethersAuthProvider = viemAuthProvider.ethersProvider; + conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider); + + // Decrypt message using viem + const decryptedBytes = await decryptWithViem( + viemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption was successful + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout + + test('should work with different viem account types', async () => { + // This test verifies viem integration works with different account configurations + const messageString = 'Testing different viem account types'; + const message = toBytes(messageString); + + // Create a simple condition + const simpleCondition = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + // Test encryption with viem account + const messageKit = await encryptWithViem( + viemPublicClient, + DOMAIN, + message, + simpleCondition, + RITUAL_ID, + encryptorAccount, + ); + + // Test decryption with different viem client setup + const anotherViemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + const messageKitFromBytes = ThresholdMessageKit.fromBytes( + messageKit.toBytes(), + ); + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); + + // Add auth provider using ViemEIP4361AuthProvider with different client + const viemAuthProvider = new ViemEIP4361AuthProvider( + anotherViemPublicClient, + consumerAccount, + ); + + // Get the ethers-compatible auth provider + const ethersAuthProvider = viemAuthProvider.ethersProvider; + conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider); + + // Decrypt using the different client + const decryptedBytes = await decryptWithViem( + anotherViemPublicClient, + DOMAIN, + messageKitFromBytes, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption + expect(decryptedMessageString).toEqual(messageString); + }, 15000); // 15s timeout +}); diff --git a/packages/taco/package.json b/packages/taco/package.json index 6cce4aca4..29c91da27 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -49,6 +49,14 @@ "semver": "^7.7.1", "zod": "^3.24.2" }, + "peerDependencies": { + "viem": "^2.0.0" + }, + "peerDependenciesMeta": { + "viem": { + "optional": true + } + }, "devDependencies": { "@nucypher/test-utils": "workspace:*", "@types/semver": "^7.7.0", diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 698685a1b..10e26035f 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -12,3 +12,6 @@ export { export * as conditions from './conditions'; export { decrypt, encrypt, encryptWithPublicKey } from './taco'; + +// Viem-compatible functions +export { decryptWithViem, encryptWithViem } from './viem-taco'; diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts new file mode 100644 index 000000000..cb473ca65 --- /dev/null +++ b/packages/taco/src/viem-taco.ts @@ -0,0 +1,134 @@ +import { ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { Domain } from '@nucypher/shared'; + +// Dynamic viem types (available only when viem is installed) +// instead of `import type { Account, PublicClient } from 'viem';` +type Account = any; +type PublicClient = any; + +import { Condition } from './conditions/condition'; +import { ConditionContext } from './conditions/context'; +import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; +import { createEthersProvider, createEthersSigner } from './wrappers'; + +/** + * Encrypts a message under given conditions using viem clients. + * + * This is a viem-compatible version of the encrypt function that accepts viem clients + * instead of ethers providers and signers. + * + * @export + * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations + * @param {Domain} domain - Represents the logical network for encryption (must match ritualId) + * @param {Uint8Array | string} message - The message to be encrypted + * @param {Condition} condition - Condition under which the message will be encrypted + * @param {number} ritualId - The ID of the DKG Ritual to be used for encryption + * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization + * + * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit + * + * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown + * + * @example + * ```typescript + * import { createPublicClient, createWalletClient, http } from 'viem'; + * import { polygonAmoy } from 'viem/chains'; + * import { privateKeyToAccount } from 'viem/accounts'; + * + * // Using explicit clients + * const viemPublicClient = createPublicClient({ + * chain: polygonAmoy, + * transport: http() + * }); + * + * const viemAuthSigner = privateKeyToAccount('0x...'); + * + * const encrypted = await encryptWithViem( + * viemPublicClient, // Your viem public client + * 'lynx', // TACo domain + * 'Hello, secret!', // Message to encrypt + * condition, // Access condition + * 27, // Ritual ID + * viemAuthSigner // Your viem account + * ); + * ``` + */ +export const encryptWithViem = async ( + viemPublicClient: PublicClient, + domain: Domain, + message: Uint8Array | string, + condition: Condition, + ritualId: number, + viemAuthSigner: Account, +): Promise => { + // Create ethers-compatible provider and signer from viem objects + const ethersProvider = createEthersProvider(viemPublicClient); + const ethersSigner = createEthersSigner(viemAuthSigner, ethersProvider); + + // Use the existing ethers-based encrypt function + return await ethersEncrypt( + ethersProvider, + domain, + message, + condition, + ritualId, + ethersSigner, + ); +}; + +/** + * Decrypts an encrypted message using viem clients. + * + * This is a viem-compatible version of the decrypt function that accepts viem clients + * instead of ethers providers. + * + * @export + * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations + * @param {Domain} domain - Represents the logical network for decryption (must match ritualId) + * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted + * @param {ConditionContext} context - Optional context data used for decryption time values + * @param {string[]} [porterUris] - Optional URI(s) for the Porter service + * + * @returns {Promise} Returns Promise that resolves with a decrypted message + * + * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error + * + * @example + * ```typescript + * import { createPublicClient, http } from 'viem'; + * import { polygonAmoy } from 'viem/chains'; + * + * const viemPublicClient = createPublicClient({ + * chain: polygonAmoy, + * transport: http() + * }); + * + * const decrypted = await decryptWithViem( + * viemPublicClient, + * 'lynx', + * messageKit, + * context + * ); + * + + * ``` + */ +export const decryptWithViem = async ( + viemPublicClient: PublicClient, + domain: Domain, + messageKit: ThresholdMessageKit, + context?: ConditionContext, + porterUris?: string[], +): Promise => { + // Create ethers-compatible provider from viem object + const ethersProvider = createEthersProvider(viemPublicClient); + + // Use the existing ethers-based decrypt function + return await ethersDecrypt( + ethersProvider, + domain, + messageKit, + context, + porterUris, + ); +}; diff --git a/packages/taco/src/wrappers/index.ts b/packages/taco/src/wrappers/index.ts new file mode 100644 index 000000000..f1c331620 --- /dev/null +++ b/packages/taco/src/wrappers/index.ts @@ -0,0 +1,6 @@ +// Viem adapter utilities +export { + createEthersFromViem, + createEthersProvider, + createEthersSigner, +} from './viem-wrappers'; diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts new file mode 100644 index 000000000..1121fd1e9 --- /dev/null +++ b/packages/taco/src/wrappers/viem-wrappers.ts @@ -0,0 +1,343 @@ +import { ethers } from 'ethers'; + +// Dynamic viem types (available only when viem is installed) +// instead of `import type { Account, PublicClient, WalletClient } from 'viem';` +type Account = any; +type PublicClient = any; +type WalletClient = any; + +/** + * Checks if viem is available and throws a helpful error if not + */ +function checkViemAvailability(): void { + try { + // Try to actually require viem to check if it's available + require('viem'); + } catch (error) { + throw new Error( + 'viem is required for viem wrapper functions. Install it with: npm install viem', + ); + } +} + +/** + * Dynamically imports viem types for runtime type checking + */ +async function importViem() { + checkViemAvailability(); + return await import('viem'); +} + +/** + * A provider that wraps viem PublicClient to work with ethers.js + */ +class ViemWrappedProvider { + private viemPublicClient: PublicClient; + + constructor(viemPublicClient: PublicClient) { + this.viemPublicClient = viemPublicClient; + } + + async getNetwork(): Promise { + const chainId = await this.viemPublicClient.getChainId(); + return { + name: this.viemPublicClient.chain?.name || `chain-${chainId}`, + chainId, + }; + } + + async getBlockNumber(): Promise { + return Number(await this.viemPublicClient.getBlockNumber()); + } + + async getGasPrice(): Promise { + const gasPrice = await this.viemPublicClient.getGasPrice(); + return ethers.BigNumber.from(gasPrice.toString()); + } + + async getBalance(address: string, blockTag?: string | number): Promise { + const balance = await this.viemPublicClient.getBalance({ + address: address as `0x${string}`, + }); + return ethers.BigNumber.from(balance.toString()); + } + + async getTransactionCount(address: string, blockTag?: string | number): Promise { + return await this.viemPublicClient.getTransactionCount({ + address: address as `0x${string}`, + }); + } + + async getCode(address: string, blockTag?: string | number): Promise { + return await this.viemPublicClient.getCode({ + address: address as `0x${string}`, + }); + } + + async call(transaction: ethers.providers.TransactionRequest, blockTag?: string | number): Promise { + const result = await this.viemPublicClient.call({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + }); + // viem returns {data: "0x..."} but ethers expects just "0x..." + if (typeof result === 'object' && result && 'data' in result) { + return result.data as string; + } + return result as string; + } + + async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { + const gas = await this.viemPublicClient.estimateGas({ + to: transaction.to as `0x${string}`, + data: transaction.data as `0x${string}`, + value: transaction.value ? BigInt(transaction.value.toString()) : undefined, + }); + return ethers.BigNumber.from(gas.toString()); + } + + async getBlock(blockHashOrBlockTag: string | number): Promise { + if (typeof blockHashOrBlockTag === 'string' && blockHashOrBlockTag.startsWith('0x')) { + return await this.viemPublicClient.getBlock({ + blockHash: blockHashOrBlockTag as `0x${string}`, + }); + } else { + return await this.viemPublicClient.getBlock({ + blockNumber: BigInt(blockHashOrBlockTag), + }); + } + } + + async getTransaction(transactionHash: string): Promise { + return await this.viemPublicClient.getTransaction({ + hash: transactionHash as `0x${string}`, + }); + } + + async getTransactionReceipt(transactionHash: string): Promise { + return await this.viemPublicClient.getTransactionReceipt({ + hash: transactionHash as `0x${string}`, + }); + } + + async waitForTransaction(transactionHash: string): Promise { + return await this.viemPublicClient.waitForTransactionReceipt({ + hash: transactionHash as `0x${string}`, + }); + } + + // Additional methods that ethers contracts might need + async resolveName(name: string): Promise { + return null; // ENS resolution not implemented + } + + async lookupAddress(address: string): Promise { + return null; // Reverse ENS lookup not implemented + } + + async getFeeData(): Promise { + const gasPrice = await this.getGasPrice(); + return { + gasPrice, + maxFeePerGas: null, + maxPriorityFeePerGas: null, + lastBaseFeePerGas: null, + }; + } + + // Mark this as a viem wrapped provider + _isViemWrappedProvider = true; + + // Additional required Provider methods (stubs for compatibility) + async getStorageAt(address: string, position: string, blockTag?: string | number): Promise { + throw new Error('getStorageAt not implemented in viem wrapper'); + } + + async sendTransaction(signedTransaction: string): Promise { + throw new Error('sendTransaction not implemented in viem wrapper'); + } + + async getBlockWithTransactions(blockHashOrBlockTag: string | number): Promise { + throw new Error('getBlockWithTransactions not implemented in viem wrapper'); + } + + async getLogs(filter: any): Promise { + throw new Error('getLogs not implemented in viem wrapper'); + } + + // Ethers provider interface compatibility + connection?: any; + _network?: ethers.providers.Network; + _isProvider = true; + + // Additional stubs for compatibility + async on(): Promise { return this; } + async once(): Promise { return this; } + async off(): Promise { return this; } + async emit(): Promise { return false; } + async listenerCount(): Promise { return 0; } + async listeners(): Promise { return []; } + async removeAllListeners(): Promise { return this; } + async addListener(): Promise { return this; } + async removeListener(): Promise { return this; } + + get _viemPublicClient() { + return this.viemPublicClient; + } +} + +/** + * Creates an ethers.js provider from a viem public client + * + * @param viemPublicClient - Viem PublicClient to wrap as ethers provider + * @returns ethers.providers.Provider compatible with TACo SDK + */ +export function createEthersProvider( + viemPublicClient: PublicClient, +): ethers.providers.Provider { + // Check if viem is available + checkViemAvailability(); + + return new ViemWrappedProvider(viemPublicClient) as unknown as ethers.providers.Provider; +} + +/** + * Creates an ethers.js signer from a viem account and provider + * + * @param viemAccount - The viem account (from wallet client or account) + * @param provider - Ethers provider (can be created with createEthersProvider) + * @returns ethers.Signer compatible with TACo SDK + */ +export function createEthersSigner( + viemAccount: Account, + provider: ethers.providers.Provider, +): ethers.Signer { + // Check if viem is available + checkViemAvailability(); + + const signerAdapter = { + address: viemAccount.address, + provider, + + async getAddress(): Promise { + return viemAccount.address; + }, + + async signMessage(message: ethers.utils.Bytes | string): Promise { + const messageToSign = + typeof message === 'string' + ? message + : typeof message === 'object' && message.constructor === Uint8Array + ? new TextDecoder().decode(message as Uint8Array) + : String(message); + + if (!viemAccount.signMessage) { + throw new Error('Account does not support message signing'); + } + return await viemAccount.signMessage({ message: messageToSign }); + }, + + async signTransaction( + transaction: ethers.providers.TransactionRequest, + ): Promise { + if (!viemAccount.signTransaction) { + throw new Error('Account does not support transaction signing'); + } + + // Convert ethers transaction to viem format + const viemTx: any = { + to: transaction.to as `0x${string}`, + value: transaction.value + ? BigInt(transaction.value.toString()) + : undefined, + data: transaction.data as `0x${string}`, + gas: transaction.gasLimit + ? BigInt(transaction.gasLimit.toString()) + : undefined, + gasPrice: transaction.gasPrice + ? BigInt(transaction.gasPrice.toString()) + : undefined, + nonce: transaction.nonce ? Number(transaction.nonce) : undefined, + }; + + return await viemAccount.signTransaction(viemTx); + }, + + async signTypedData( + domain: any, + types: Record, + message: Record, + ): Promise { + if (!viemAccount.signTypedData) { + throw new Error('Account does not support typed data signing'); + } + + return await viemAccount.signTypedData({ + domain, + types, + message, + primaryType: + Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', + }); + }, + + connect(provider: ethers.providers.Provider): ethers.Signer { + return createEthersSigner(viemAccount, provider); + }, + + // Additional signer methods for ethers compatibility + async getBalance() { + const balance = await provider.getBalance(viemAccount.address); + return balance; + }, + + async getTransactionCount() { + return await provider.getTransactionCount(viemAccount.address); + }, + + async estimateGas(transaction: ethers.providers.TransactionRequest) { + return await provider.estimateGas(transaction); + }, + + async call(transaction: ethers.providers.TransactionRequest) { + return await provider.call(transaction); + }, + + async sendTransaction(transaction: ethers.providers.TransactionRequest) { + throw new Error( + 'sendTransaction not implemented for viem wrapper - use signTransaction instead', + ); + }, + + // Type identification + _isSigner: true, + _isViemWrappedSigner: true, + _viemAccount: viemAccount, + }; + + return signerAdapter as unknown as ethers.Signer; +} + +/** + * Convenience function to create both provider and signer from viem clients + * + * @param viemPublicClient - Viem public client for provider functionality + * @param viemWalletClient - Viem wallet client for signing functionality + * @returns Object with ethers provider and signer + */ +export function createEthersFromViem( + viemPublicClient: PublicClient, + viemWalletClient: WalletClient, +) { + // Check if viem is available + checkViemAvailability(); + + if (!viemWalletClient.account) { + throw new Error('Wallet client must have an account attached'); + } + + const provider = createEthersProvider(viemPublicClient); + const signer = createEthersSigner(viemWalletClient.account, provider); + + return { provider, signer }; +} diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts new file mode 100644 index 000000000..7f7a96dc5 --- /dev/null +++ b/packages/taco/test/viem-unit.test.ts @@ -0,0 +1,169 @@ +import { + FerveoVariant, + initialize, + SessionStaticSecret, +} from '@nucypher/nucypher-core'; +import * as tacoAuth from '@nucypher/taco-auth'; +import { USER_ADDRESS_PARAM_DEFAULT } from '@nucypher/taco-auth'; +import { + aliceSecretKeyBytes, + fakeDkgFlow, + fakePorterUri, + fakeProvider, + fakeTDecFlow, + mockGetRitualIdFromPublicKey, + mockTacoDecrypt, + TEST_CHAIN_ID, + TEST_SIWE_PARAMS, +} from '@nucypher/test-utils'; +import { beforeAll, describe, expect, it, vi } from 'vitest'; + +import { conditions, domains, toBytes } from '../src'; +import { ConditionContext } from '../src/conditions/context'; +import { encryptWithViem, decryptWithViem } from '../src/viem-taco'; +import { createEthersProvider, createEthersSigner, createEthersFromViem } from '../src/wrappers/viem-wrappers'; + +import { + fakeDkgRitual, + mockDkgParticipants, + mockGetActiveRitual, + mockGetParticipants, + mockMakeSessionKey, +} from './test-utils'; + +// Shared test variables +const message = 'this is a secret viem message'; +const ownsNFT = new conditions.predefined.erc721.ERC721Ownership({ + contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', + parameters: [3591], + chain: TEST_CHAIN_ID, +}); + +describe('viem unit tests', () => { + beforeAll(async () => { + await initialize(); + }); + + describe('viem availability checks', () => { + it('should check if viem functions are exported', () => { + expect(encryptWithViem).toBeDefined(); + expect(decryptWithViem).toBeDefined(); + expect(typeof encryptWithViem).toBe('function'); + expect(typeof decryptWithViem).toBe('function'); + }); + + it('should check if wrapper functions exist', () => { + expect(createEthersProvider).toBeDefined(); + expect(createEthersSigner).toBeDefined(); + expect(createEthersFromViem).toBeDefined(); + }); + }); + + describe('viem encrypt/decrypt with mocked adapters', () => { + it('encrypts and decrypts using viem functions', async () => { + const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); + const mockedDkgRitual = fakeDkgRitual(mockedDkg); + const mockEthersProvider = fakeProvider(aliceSecretKeyBytes); + const mockEthersSigner = mockEthersProvider.getSigner(); + + // Mock the viem clients + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + } as any; + + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn(), + } as any; + + // Mock the adapter functions to return ethers objects + const createEthersProviderSpy = vi.spyOn(await import('../src/wrappers/viem-wrappers'), 'createEthersProvider') + .mockReturnValue(mockEthersProvider); + const createEthersSignerSpy = vi.spyOn(await import('../src/wrappers/viem-wrappers'), 'createEthersSigner') + .mockReturnValue(mockEthersSigner); + + const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); + + // Test encryption + const messageKit = await encryptWithViem( + mockViemPublicClient, + domains.DEVNET, + message, + ownsNFT, + mockedDkg.ritualId, + mockViemAccount, + ); + + expect(createEthersProviderSpy).toHaveBeenCalledWith(mockViemPublicClient); + expect(createEthersSignerSpy).toHaveBeenCalledWith(mockViemAccount, mockEthersProvider); + expect(getFinalizedRitualSpy).toHaveBeenCalled(); + expect(messageKit).toBeDefined(); + + // Setup decryption mocks + const { decryptionShares } = fakeTDecFlow({ + ...mockedDkg, + message: toBytes(message), + dkgPublicKey: mockedDkg.dkg.publicKey(), + thresholdMessageKit: messageKit, + }); + const { participantSecrets, participants } = await mockDkgParticipants( + mockedDkg.ritualId, + ); + const requesterSessionKey = SessionStaticSecret.random(); + const decryptSpy = mockTacoDecrypt( + mockedDkg.ritualId, + decryptionShares, + participantSecrets, + requesterSessionKey.publicKey(), + ); + const getParticipantsSpy = mockGetParticipants(participants); + const sessionKeySpy = mockMakeSessionKey(requesterSessionKey); + const getRitualIdFromPublicKey = mockGetRitualIdFromPublicKey( + mockedDkg.ritualId, + ); + const getRitualSpy = mockGetActiveRitual(mockedDkgRitual); + + const authProvider = new tacoAuth.EIP4361AuthProvider( + mockEthersProvider, + mockEthersSigner, + TEST_SIWE_PARAMS, + ); + + const conditionContext = ConditionContext.fromMessageKit(messageKit); + conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, authProvider); + + // Test decryption + const decryptedMessage = await decryptWithViem( + mockViemPublicClient, + domains.DEVNET, + messageKit, + conditionContext, + [fakePorterUri], + ); + + expect(decryptedMessage).toEqual(toBytes(message)); + expect(getParticipantsSpy).toHaveBeenCalled(); + expect(sessionKeySpy).toHaveBeenCalled(); + expect(getRitualIdFromPublicKey).toHaveBeenCalled(); + expect(getRitualSpy).toHaveBeenCalled(); + expect(decryptSpy).toHaveBeenCalled(); + + // Clean up spies + createEthersProviderSpy.mockRestore(); + createEthersSignerSpy.mockRestore(); + }); + + it('decrypts without optional parameters', async () => { + // This test just verifies the function exists and has the right signature + expect(decryptWithViem).toBeDefined(); + expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? + }); + }); + + describe('function signatures', () => { + it('should have correct function signatures', () => { + expect(encryptWithViem.length).toBe(6); // viemPublicClient, domain, message, condition, ritualId, viemAccount + expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? + }); + }); +}); diff --git a/packages/taco/test/viem-wrappers.test.ts b/packages/taco/test/viem-wrappers.test.ts new file mode 100644 index 000000000..d2f9fe377 --- /dev/null +++ b/packages/taco/test/viem-wrappers.test.ts @@ -0,0 +1,122 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { + createEthersFromViem, + createEthersProvider, + createEthersSigner, +} from '../src/wrappers/viem-wrappers'; + +describe('viem wrapper utilities', () => { + describe('function exports', () => { + it('should export all wrapper functions', () => { + expect(createEthersProvider).toBeDefined(); + expect(createEthersSigner).toBeDefined(); + expect(createEthersFromViem).toBeDefined(); + expect(typeof createEthersProvider).toBe('function'); + expect(typeof createEthersSigner).toBe('function'); + expect(typeof createEthersFromViem).toBe('function'); + }); + }); + + describe('createEthersProvider', () => { + it('should create a provider from viem client', () => { + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), + call: vi.fn().mockResolvedValue('0x'), + getBalance: vi.fn().mockResolvedValue(BigInt(0)), + getTransactionCount: vi.fn().mockResolvedValue(0), + estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), + getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), + } as any; + + const provider = createEthersProvider(mockViemPublicClient); + + expect(provider).toBeDefined(); + expect(provider.getNetwork).toBeDefined(); + expect(provider.getBlockNumber).toBeDefined(); + expect(provider.call).toBeDefined(); + expect(provider.getBalance).toBeDefined(); + expect(provider.getTransactionCount).toBeDefined(); + expect(provider.getGasPrice).toBeDefined(); + }); + }); + + describe('createEthersSigner', () => { + it('should create a signer from viem account', () => { + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + signTransaction: vi.fn().mockResolvedValue('0xsignedtx'), + } as any; + + const mockProvider = { + getNetwork: vi.fn().mockResolvedValue({ chainId: 80002 }), + } as any; + + const signer = createEthersSigner(mockViemAccount, mockProvider); + + expect(signer).toBeDefined(); + expect(signer.getAddress).toBeDefined(); + expect(signer.signMessage).toBeDefined(); + expect(signer.signTransaction).toBeDefined(); + expect(signer.provider).toBe(mockProvider); + }); + }); + + describe('createEthersFromViem', () => { + it('should create both provider and signer', () => { + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), + call: vi.fn().mockResolvedValue('0x'), + getBalance: vi.fn().mockResolvedValue(BigInt(0)), + getTransactionCount: vi.fn().mockResolvedValue(0), + estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), + getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), + } as any; + + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + } as any; + + const mockViemWalletClient = { + account: mockViemAccount, + } as any; + + const { provider, signer } = createEthersFromViem( + mockViemPublicClient, + mockViemWalletClient + ); + + expect(provider).toBeDefined(); + expect(signer).toBeDefined(); + expect(signer.provider).toBe(provider); + }); + + it('should throw error when wallet client has no account', () => { + const mockViemPublicClient = {} as any; + const mockViemWalletClient = { + account: undefined, + } as any; + + expect(() => createEthersFromViem( + mockViemPublicClient, + mockViemWalletClient + )).toThrow('Wallet client must have an account attached'); + }); + }); + + describe('error handling', () => { + it('should handle missing viem gracefully', () => { + // This test verifies that the functions exist and are callable + expect(createEthersProvider).toBeDefined(); + expect(createEthersSigner).toBeDefined(); + expect(createEthersFromViem).toBeDefined(); + expect(typeof createEthersProvider).toBe('function'); + expect(typeof createEthersSigner).toBe('function'); + expect(typeof createEthersFromViem).toBe('function'); + }); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66fa9fdab..4ce0a529b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,7 +39,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -105,7 +105,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -129,7 +129,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.3) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -145,7 +145,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -157,16 +157,16 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.101.3) + version: 13.0.0(webpack@5.99.9) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.101.3) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.101.3) + version: 5.6.3(webpack@5.99.9) process: specifier: ^0.11.10 version: 0.11.10 @@ -214,7 +214,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.101.3) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -230,7 +230,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -242,13 +242,13 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.101.3) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.101.3) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.101.3) + version: 5.6.3(webpack@5.99.9) react-refresh: specifier: ^0.17.0 version: 0.17.0 @@ -352,10 +352,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.101.3) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.101.3) + version: 2.21.0(webpack@5.99.9) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -511,10 +511,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.101.3) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.101.3) + version: 2.21.0(webpack@5.99.9) webpack: specifier: ^5.99.9 version: 5.101.3(webpack-cli@6.0.1) @@ -621,6 +621,9 @@ importers: semver: specifier: ^7.7.1 version: 7.7.1 + viem: + specifier: ^2.0.0 + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -655,6 +658,9 @@ importers: siwe: specifier: ^3.0.0 version: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + viem: + specifier: ^2.0.0 + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -689,10 +695,13 @@ importers: version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) packages: + '@adraffy/ens-normalize@1.11.0': + resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} @@ -2584,8 +2593,8 @@ packages: resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.1': - resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} engines: {node: ^14.21.3 || >=16} '@noble/curves@1.9.2': @@ -2595,6 +2604,10 @@ packages: '@noble/ed25519@1.7.3': resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -2832,9 +2845,18 @@ packages: '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + '@scure/bip32@1.7.0': resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} @@ -3525,13 +3547,12 @@ packages: abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - abitype@1.1.0: - resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: typescript: '>=5.0.4' - zod: ^3.22.0 || ^4.0.0 + zod: ^3 >=3.22.0 peerDependenciesMeta: typescript: optional: true @@ -6332,6 +6353,11 @@ packages: peerDependencies: ws: '*' + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -7284,8 +7310,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - ox@0.9.6: - resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} + ox@0.8.6: + resolution: {integrity: sha512-eiKcgiVVEGDtEpEdFi1EGoVVI48j6icXHce9nFwCNM7CKG3uoCXKdr4TPhS00Iy1TR2aWSF1ltPD0x/YgqIL9w==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -9330,8 +9356,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - viem@2.37.8: - resolution: {integrity: sha512-mL+5yvCQbRIR6QvngDQMfEiZTfNWfd+/QL5yFaOoYbpH3b1Q2ddwF7YG2eI2AcYSh9LE1gtUkbzZLFUAVyj4oQ==} + viem@2.33.3: + resolution: {integrity: sha512-aWDr6i6r3OfNCs0h9IieHFhn7xQJJ8YsuA49+9T5JRyGGAkWhLgcbLq2YMecgwM7HdUZpx1vPugZjsShqNi7Gw==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -9729,8 +9755,8 @@ packages: utf-8-validate: optional: true - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9741,10 +9767,6 @@ packages: utf-8-validate: optional: true - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} - xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -9801,6 +9823,8 @@ snapshots: '@adraffy/ens-normalize@1.11.0': {} + '@adraffy/ens-normalize@1.11.0': {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -12145,9 +12169,9 @@ snapshots: '@noble/ciphers@1.3.0': {} - '@noble/curves@1.9.1': + '@noble/curves@1.8.1': dependencies: - '@noble/hashes': 1.8.0 + '@noble/hashes': 1.7.1 '@noble/curves@1.9.2': dependencies: @@ -12155,6 +12179,8 @@ snapshots: '@noble/ed25519@1.7.3': {} + '@noble/hashes@1.7.1': {} + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': @@ -12196,6 +12222,7 @@ snapshots: '@ethersproject/abstract-signer': 5.8.0 '@nucypher/shared': 0.5.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) siwe: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + siwe: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) zod: 3.24.2 transitivePeerDependencies: - bufferutil @@ -12230,12 +12257,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: type-fest: 0.21.3 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - '@pmmmwh/react-refresh-webpack-plugin@0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: anser: 2.3.2 core-js-pure: 3.41.0 @@ -12355,6 +12382,8 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} + '@scure/base@1.2.4': {} + '@scure/base@1.2.6': {} '@scure/bip32@1.7.0': @@ -12363,6 +12392,17 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.5.4': + dependencies: + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.4 + '@scure/bip39@1.6.0': dependencies: '@noble/hashes': 1.8.0 @@ -13072,7 +13112,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -13087,7 +13127,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -13207,17 +13247,17 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.3)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) @@ -13235,7 +13275,7 @@ snapshots: abab@2.0.6: {} - abitype@1.1.0(typescript@5.8.2)(zod@3.24.2): + abitype@1.0.8(typescript@5.8.2)(zod@3.24.2): optionalDependencies: typescript: 5.8.2 zod: 3.24.2 @@ -13617,7 +13657,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) babel-plugin-istanbul@6.1.1: dependencies: @@ -14366,7 +14406,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.1(webpack@5.101.3): + copy-webpack-plugin@13.0.0(webpack@5.99.9): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 @@ -14514,7 +14554,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) css-minimizer-webpack-plugin@3.4.1(webpack@5.101.3): dependencies: @@ -14524,7 +14564,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) css-prefers-color-scheme@6.0.3(postcss@8.5.3): dependencies: @@ -15095,7 +15135,7 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.101.3): + esbuild-loader@2.21.0(webpack@5.99.9): dependencies: esbuild: 0.16.17 joycon: 3.1.1 @@ -15220,6 +15260,7 @@ snapshots: eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -15239,6 +15280,7 @@ snapshots: eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -15332,6 +15374,7 @@ snapshots: unrs-resolver: 1.3.2 optionalDependencies: eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -15345,10 +15388,12 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -15409,6 +15454,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 @@ -15438,35 +15484,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - 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: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.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 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) @@ -15625,7 +15642,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.0 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) eslint@8.57.0: dependencies: @@ -15929,11 +15946,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.101.3): + file-loader@6.2.0(webpack@5.99.9): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) file-uri-to-path@1.0.0: {} @@ -16046,7 +16063,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.8.2 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: eslint: 8.57.1 @@ -16433,7 +16450,7 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-webpack-plugin@5.6.3(webpack@5.101.3): + html-webpack-plugin@5.6.3(webpack@5.99.9): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16441,7 +16458,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) htmlparser2@6.1.0: dependencies: @@ -16849,9 +16866,9 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) istanbul-lib-coverage@3.2.2: {} @@ -17821,7 +17838,7 @@ snapshots: dependencies: schema-utils: 4.3.0 tapable: 2.2.1 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} @@ -18152,15 +18169,15 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.9.6(typescript@5.8.2)(zod@3.24.2): + ox@0.8.6(typescript@5.8.2)(zod@3.24.2): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.1 + '@noble/curves': 1.9.2 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.8.2)(zod@3.24.2) + abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.2 @@ -18509,7 +18526,7 @@ snapshots: klona: 2.0.6 postcss: 8.5.3 semver: 7.7.1 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) postcss-logical@5.0.4(postcss@8.5.3): dependencies: @@ -18951,7 +18968,7 @@ snapshots: shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -19019,101 +19036,14 @@ snapshots: resolve-url-loader: 4.0.0 sass-loader: 12.6.0(webpack@5.101.3) semver: 7.7.1 - source-map-loader: 3.0.2(webpack@5.101.3) - style-loader: 3.3.4(webpack@5.101.3) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2)) - terser-webpack-plugin: 5.3.14(webpack@5.101.3) - webpack: 5.101.3(webpack-cli@6.0.1) - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - webpack-manifest-plugin: 4.1.1(webpack@5.101.3) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.101.3) - optionalDependencies: - fsevents: 2.3.3 - typescript: 5.8.2 - transitivePeerDependencies: - - '@babel/plugin-syntax-flow' - - '@babel/plugin-transform-react-jsx' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@types/babel__core' - - '@types/webpack' - - bufferutil - - canvas - - clean-css - - csso - - debug - - esbuild - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - fibers - - node-notifier - - node-sass - - rework - - rework-visit - - sass - - sass-embedded - - sockjs-client - - supports-color - - ts-node - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-hot-middleware - - webpack-plugin-serve - - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10): - dependencies: - '@babel/core': 7.26.10 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3))(webpack@5.101.3) - '@svgr/webpack': 5.5.0 - babel-jest: 27.5.1(@babel/core@7.26.10) - babel-loader: 8.4.1(@babel/core@7.26.10)(webpack@5.101.3) - babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.10) - babel-preset-react-app: 10.1.0 - bfj: 7.1.0 - browserslist: 4.24.4 - camelcase: 6.3.0 - case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.11.0(webpack@5.101.3) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.101.3) - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - eslint: 8.57.1 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2) - eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.101.3) - file-loader: 6.2.0(webpack@5.101.3) - fs-extra: 10.1.0 - html-webpack-plugin: 5.6.3(webpack@5.101.3) - identity-obj-proxy: 3.0.0 - jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10) - jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10)) - mini-css-extract-plugin: 2.9.2(webpack@5.101.3) - postcss: 8.5.3 - postcss-flexbugs-fixes: 5.0.2(postcss@8.5.3) - postcss-loader: 6.2.1(postcss@8.5.3)(webpack@5.101.3) - postcss-normalize: 10.0.1(browserslist@4.24.4)(postcss@8.5.3) - postcss-preset-env: 7.8.3(postcss@8.5.3) - prompts: 2.4.2 - react: 18.3.1 - react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.8.2)(webpack@5.101.3) - react-refresh: 0.11.0 - resolve: 1.22.10 - resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.101.3) - semver: 7.7.1 - source-map-loader: 3.0.2(webpack@5.101.3) - style-loader: 3.3.4(webpack@5.101.3) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) - terser-webpack-plugin: 5.3.14(webpack@5.101.3) - webpack: 5.101.3(webpack-cli@6.0.1) - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - webpack-manifest-plugin: 4.1.1(webpack@5.101.3) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.101.3) + source-map-loader: 3.0.2(webpack@5.99.9) + style-loader: 3.3.4(webpack@5.99.9) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) + terser-webpack-plugin: 5.3.14(webpack@5.99.9) + webpack: 5.99.9(webpack-cli@6.0.1) + webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) + webpack-manifest-plugin: 4.1.1(webpack@5.99.9) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) optionalDependencies: fsevents: 2.3.3 typescript: 5.8.2 @@ -19456,7 +19386,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) sax@1.2.4: {} @@ -19698,6 +19628,7 @@ snapshots: sisteransi@1.0.5: {} + siwe@3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): siwe@3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@spruceid/siwe-parser': 3.0.0 @@ -19736,7 +19667,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) source-map-support@0.5.21: dependencies: @@ -19987,7 +19918,7 @@ snapshots: style-loader@3.3.4(webpack@5.101.3): dependencies: - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) styled-jsx@5.1.6(react@18.3.1): dependencies: @@ -20142,14 +20073,14 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.101.3): + terser-webpack-plugin@5.3.14(webpack@5.99.9): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) terser@5.39.0: dependencies: @@ -20576,7 +20507,24 @@ snapshots: vary@1.1.2: {} - viem@2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2): + viem@2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2): + dependencies: + '@noble/curves': 1.9.2 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.8.6(typescript@5.8.2)(zod@3.24.2) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-node@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -20626,7 +20574,19 @@ snapshots: terser: 5.39.0 yaml: 2.7.0 - vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.37.0 + optionalDependencies: + '@types/node': 22.13.14 + fsevents: 2.3.3 + jiti: 2.4.2 + terser: 5.39.0 + yaml: 2.7.0 + + vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -20649,7 +20609,46 @@ snapshots: vite-node: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 20.17.28 + jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + dependencies: + '@vitest/expect': 3.0.9 + '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/pretty-format': 3.0.9 + '@vitest/runner': 3.0.9 + '@vitest/snapshot': 3.0.9 + '@vitest/spy': 3.0.9 + '@vitest/utils': 3.0.9 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.0 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.8.1 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.13.14 jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti @@ -20709,9 +20708,9 @@ snapshots: webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.3) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -20732,9 +20731,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.0 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) - webpack-dev-middleware@7.4.2(webpack@5.101.3): + webpack-dev-middleware@7.4.2(webpack@5.99.9): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -20778,7 +20777,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) transitivePeerDependencies: - bufferutil - debug @@ -20813,7 +20812,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.101.3) + webpack-dev-middleware: 7.4.2(webpack@5.99.9) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1) @@ -20827,7 +20826,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.101.3): dependencies: tapable: 2.2.1 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 2.3.1 webpack-merge@6.0.1: @@ -20848,7 +20847,7 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.101.3(webpack-cli@6.0.1): + webpack@5.99.9(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -20874,7 +20873,7 @@ snapshots: tapable: 2.2.1 terser-webpack-plugin: 5.3.14(webpack@5.101.3) watchpack: 2.4.2 - webpack-sources: 3.3.3 + webpack-sources: 3.2.3 optionalDependencies: webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) transitivePeerDependencies: @@ -21099,7 +21098,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.101.3(webpack-cli@6.0.1) + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -21153,15 +21152,11 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - wsl-utils@0.1.0: - dependencies: - is-wsl: 3.1.0 - xml-name-validator@3.0.0: {} xmlchars@2.2.0: {} From 75017bd514a472e0698fcf993e715fa74177b1ba Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 20 Aug 2025 13:44:26 +0200 Subject: [PATCH 72/97] add TacoClient --- packages/taco/README.md | 132 ++++++ .../taco/examples/taco-client-examples.md | 300 +++++++++++++ packages/taco/src/domains.ts | 379 ++++++++++++++++ packages/taco/src/index.ts | 21 +- packages/taco/src/taco-client.ts | 423 ++++++++++++++++++ packages/taco/src/utils/logger.ts | 123 +++++ packages/taco/test/client.test.ts | 387 ++++++++++++++++ 7 files changed, 1762 insertions(+), 3 deletions(-) create mode 100644 packages/taco/examples/taco-client-examples.md create mode 100644 packages/taco/src/domains.ts create mode 100644 packages/taco/src/taco-client.ts create mode 100644 packages/taco/src/utils/logger.ts create mode 100644 packages/taco/test/client.test.ts diff --git a/packages/taco/README.md b/packages/taco/README.md index 452dd3eab..ac6e12b84 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -139,6 +139,138 @@ const viemEncrypted = await encrypt( For detailed viem documentation, see [VIEM_SUPPORT.md](./VIEM_SUPPORT.md). +## TacoClient - Object-Oriented Interface + +For applications requiring multiple TACo operations or complex configuration management, the TACo SDK provides an optional object-oriented interface through the `TacoClient` class. This provides a stateful, higher-level abstraction over the functional API. + +### Benefits + +- **Reduced Boilerplate**: No need to repeatedly pass configuration parameters +- **Built-in Validation**: Automatic configuration validation and correction +- **Better IntelliSense**: IDE autocompletion and type safety +- **Simplified Error Handling**: Contextual errors with specific recommendations +- **Stateful Configuration**: Store domain, ritual ID, and client configurations at instance level + +### Basic Usage + +```typescript +import { TacoClient, TacoDomains } from '@nucypher/taco'; +import { createPublicClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; +import { polygonAmoy } from 'viem/chains'; + +// Initialize TACo +await initialize(); + +// Set up viem client and account +const viemClient = createPublicClient({ + chain: polygonAmoy, + transport: http(), +}); +const viemAccount = privateKeyToAccount('0x...'); + +// Create TacoClient instance using domain constants +const tacoClient = new TacoClient({ + domain: TacoDomains.TESTNET, // 'tapir' - use TacoDomains.DEVNET or TacoDomains.MAINNET + ritualId: 6, + viemClient, + viemAccount +}); + +// Encrypt data +const messageKit = await tacoClient.encrypt('Hello, secret!', condition); + +// Decrypt with automatic context creation +const decryptedMessage = await tacoClient.decryptWithAutoContext(messageKit); +``` + +### Logger Configuration + +You can configure custom logging for better debugging and monitoring: + +```typescript +import { TacoClient, TacoDomains, Logger, LogLevel } from '@nucypher/taco'; + +// Create custom logger instance +const customLogger = new Logger({ + level: LogLevel.DEBUG, + component: 'MyApp', +}); + +// Use custom logger in TacoClient +const tacoClient = new TacoClient({ + domain: TacoDomains.TESTNET, + ritualId: 6, + viemClient, + viemAccount, + logger: customLogger, // Custom logger instance. You can create and provide yours. +}); + +// Or set log level directly (creates new Logger internally) +const tacoClientWithLogLevel = new TacoClient({ + domain: TacoDomains.TESTNET, + ritualId: 6, + viemClient, + viemAccount, + logLevel: LogLevel.WARN, // Set log level directly (creates new Logger internally that will print to console) +}); +``` + +### Configuration Management + +The `TacoConfig` class provides unified configuration management with automatic validation and correction: + +```typescript +import { TacoConfig } from '@nucypher/taco'; + +// Auto-correct and validate configuration +const config = TacoConfig.process({ domain: 'testnet' }); // → will use 'tapir' with ritual 6 +const tacoClient = new TacoClient({ + ...config, + viemClient, + viemAccount +}); + +// Get domain information +const domainInfo = tacoClient.getDomainInfo(); +// Returns: { domain, alias, chainId, rituals, suggestedRpcUrls, isProduction } + +// Check supported domains +const supportedDomains = TacoConfig.getSupportedDomains(); // ['lynx', 'tapir', 'mainnet'] +``` + +### Dual Configuration Support + +TacoClient supports both viem and ethers.js configurations: + +```typescript +import { TacoClient, TacoDomains } from '@nucypher/taco'; + +// With viem (recommended) +const tacoClientViem = new TacoClient({ + domain: TacoDomains.TESTNET, + ritualId: 6, + viemClient, + viemAccount +}); + +// With ethers.js +const tacoClientEthers = new TacoClient({ + domain: TacoDomains.TESTNET, + ritualId: 6, + ethersProvider, + ethersSigner +}); +``` + +### Backward Compatibility + +The TacoClient provides a higher-level interface while maintaining full backward compatibility: + +- **Zero Breaking Changes**: Existing functional API remains unchanged +- **Optional Import**: OOP classes available as optional imports +- **Interoperable**: Can use both APIs in the same application, if needed. + ## Learn more Please find developer documentation for diff --git a/packages/taco/examples/taco-client-examples.md b/packages/taco/examples/taco-client-examples.md new file mode 100644 index 000000000..c0e1f9461 --- /dev/null +++ b/packages/taco/examples/taco-client-examples.md @@ -0,0 +1,300 @@ +# TacoClient Examples + +This document demonstrates how to use the new Object-Oriented TacoClient +interface. + +## Basic Usage + +### 1. Import Required Dependencies + +```typescript +import { TacoClient, TacoConfig } from '@nucypher/taco'; +import { createPublicClient, http } from 'viem'; +import { polygonAmoy } from 'viem/chains'; +import { privateKeyToAccount } from 'viem/accounts'; +import * as conditions from '@nucypher/taco/conditions'; +``` + +### 2. Configuration Processing + +```typescript +// Process user configuration with auto-correction and validation +const userConfig = { + domain: 'testnet', // Will be auto-corrected to 'TESTNET' + // ritualId is automatically set to default for TESTNET (6) +}; + +const processedConfig = TacoConfig.process(userConfig); +console.log(processedConfig); +// Output: { domain: 'TESTNET', ritualId: 6, chainId: 80002, rpcUrl: '...' } +``` + +### 3. Create TacoClient Instance + +```typescript +// Create viem client for Polygon Amoy (TACo network) +const viemClient = createPublicClient({ + chain: polygonAmoy, + transport: http(), +}); + +// Create account from private key +const viemAccount = privateKeyToAccount('0x...'); + +// Create TacoClient with processed configuration +const tacoClient = new TacoClient({ + ...processedConfig, + viemClient, + viemAccount, +}); +``` + +### 4. Encrypt and Decrypt Data + +```typescript +// Create a simple time-based condition +const condition = new conditions.predefined.ERC20Balance({ + contractAddress: '0x...', + standardContractType: 'ERC20', + method: 'balanceOf', + parameters: [':userAddress'], + returnValueTest: { + comparator: '>=', + value: 1000000000000000000, // 1 token + }, +}); + +// Encrypt data +const messageKit = await tacoClient.encrypt('Hello, secret world!', condition); + +// Decrypt with automatic context creation +const decrypted = await tacoClient.decryptWithAutoContext(messageKit); +const message = new TextDecoder().decode(decrypted); +console.log(message); // "Hello, secret world!" +``` + +## Advanced Usage + +### 1. Domain Configuration Management + +```typescript +// Get domain information +const domainInfo = tacoClient.getDomainInfo(); +console.log(domainInfo); +// Output: { +// domain: 'TESTNET', +// alias: 'tapir', +// chainId: 80002, +// rituals: [6], +// suggestedRpcUrls: ['https://rpc-amoy.polygon.technology', ...], +// isProduction: false +// } + +// Get supported domains +const domains = TacoConfig.getSupportedDomains(); +console.log(domains); // ['DEVNET', 'TESTNET', 'MAINNET'] + +// Validate domain and ritual combinations +const isValid = TacoConfig.isValidRitualId('TESTNET', 6); +console.log(isValid); // true +``` + +### 2. Configuration Validation + +```typescript +// Validate configuration before creating client +const validation = TacoConfig.validate({ + domain: 'INVALID_DOMAIN', + ritualId: 999, +}); + +if (!validation.isValid) { + console.error('Configuration errors:', validation.errors); + // Output: ['Invalid domain: INVALID_DOMAIN. Supported: DEVNET, TESTNET, MAINNET'] +} +``` + +### 3. Multiple Clients for Different Contexts + +```typescript +// Development client +const devConfig = TacoConfig.process({ domain: 'devnet' }); +const devClient = new TacoClient({ + ...devConfig, + viemClient: devViemClient, + viemAccount: devAccount, +}); + +// Production client (requires custom ritual ID) +const prodConfig = TacoConfig.process({ + domain: 'mainnet', + ritualId: 42, // Custom ritual ID from TACo team +}); +const prodClient = new TacoClient({ + ...prodConfig, + viemClient: prodViemClient, + viemAccount: prodAccount, +}); + +// Use different clients for different environments +const devEncrypted = await devClient.encrypt('dev data', devCondition); +const prodEncrypted = await prodClient.encrypt('prod data', prodCondition); +``` + +### 4. Custom Condition Context + +```typescript +// Create custom condition context for complex decryption scenarios +const messageKit = await tacoClient.encrypt(data, condition); + +// Method 1: Use auto context (recommended for most cases) +const decrypted1 = await tacoClient.decryptWithAutoContext(messageKit); + +// Method 2: Create custom context +const conditionContext = await tacoClient.createConditionContext(messageKit); +// Add custom context parameters if needed +// conditionContext.addCustomContextParameterValues({...}); + +const decrypted2 = await tacoClient.decrypt(messageKit, conditionContext); +``` + +### 5. Error Handling and Logging + +```typescript +import { Logger, LogLevel } from '@nucypher/taco'; + +// Create client with debug logging +const tacoClient = new TacoClient({ + ...processedConfig, + viemClient, + viemAccount, + logLevel: LogLevel.DEBUG, // or provide your own logger with: `logger: new Logger(LogLevel.DEBUG)` +}); + +try { + const messageKit = await tacoClient.encrypt(data, condition); + const decrypted = await tacoClient.decryptWithAutoContext(messageKit); +} catch (error) { + console.error('TaCo operation failed:', error.message); + // Error messages include context about the configuration and operation +} +``` + +## Migration from Functional API + +### Before (Functional API) + +#### With viem + +```typescript +import { encryptWithViem, decryptWithViem, domains } from '@nucypher/taco'; + +const messageKit = await encryptWithViem( + viemClient, // pass viem client when calling encrypt and when calling decrypt + domains.TESTNET, // Accepts any arbitrary string + 'Hello, secret!', + condition, + 6, // Must remember the corresponding ritual ID for DEVNET and TESTNET + viemAccount, +); + +const decrypted = await decryptWithViem( + viemClient, // pass viem client when calling encrypt and when calling decrypt + domains.TESTNET, // Accepts any arbitrary string. And need to be passed at both encrypt and decrypt + messageKit, + conditionContext, +); +``` + +#### With ethers.js + +```typescript +import { encrypt, decrypt, domains } from '@nucypher/taco'; + +const messageKit = await encrypt( + ethersProvider, // pass ethers provider when calling encrypt and when calling decrypt + domains.TESTNET, // Accepts any arbitrary string + 'Hello, secret!', + condition, + 6, // Must remember the corresponding ritual ID for DEVNET and TESTNET + ethersSigner, +); + +const decrypted = await decrypt( + ethersProvider, // pass ethers provider when calling encrypt and when calling decrypt + domains.TESTNET, // Accepts any arbitrary string. And need to be passed at both encrypt and decrypt + messageKit, + conditionContext, +); +``` + +### After (Object-Oriented API) + +#### With viem + +```typescript +import { TacoClient, TacoConfig } from '@nucypher/taco'; + +// One-time setup with validation +// processedConfig will have the default ritual ID for TESTNET (6) +const processedConfig = TacoConfig.process({ domain: 'testnet' }); // same as: `TacoConfig.process({ domain: 'tapir' });` + +// For mainnet, you need to specify the ritual ID explicitly like: +const processedConfigMainnet = TacoConfig.process({ + domain: 'mainnet', + ritualId: 42, +}); + +const tacoClient = new TacoClient({ + ...processedConfig, + viemClient, + viemAccount, +}); + +// Simplified operations - no need to pass configuration repeatedly +// The encrypt and decrypt methods are unified between viem and ethers.js +const messageKit = await tacoClient.encrypt('Hello, secret!', condition); +const decrypted = await tacoClient.decryptWithAutoContext(messageKit); +``` + +#### With ethers.js + +```typescript +import { TacoClient, TacoConfig } from '@nucypher/taco'; + +// One-time setup with validation +// processedConfig will have the default ritual ID for TESTNET (6) +const processedConfig = TacoConfig.process({ domain: 'testnet' }); // same as: `TacoConfig.process({ domain: 'tapir' });` + +// For mainnet, you need to specify the ritual ID explicitly like: +const processedConfigMainnet = TacoConfig.process({ + domain: 'mainnet', + ritualId: 42, +}); + +const tacoClient = new TacoClient({ + ...processedConfig, + ethersProvider, + ethersSigner, +}); + +// Simplified operations - no need to pass configuration repeatedly +// The encrypt and decrypt methods are unified between viem and ethers.js +const messageKit = await tacoClient.encrypt('Hello, secret!', condition); +const decrypted = await tacoClient.decryptWithAutoContext(messageKit); +``` + +## Benefits + +1. **Reduced Boilerplate**: No need to pass domain/ritual parameters repeatedly +2. **Built-in Validation**: Automatic configuration validation and error + handling +3. **Auto-correction**: Common mistakes like domain casing are fixed + automatically +4. **Enhanced Logging**: Contextual error messages and debug information +5. **Type Safety**: Full TypeScript support with intelligent autocompletion +6. **Multiple Configurations**: Easy management of different TACo setups per + application context + +The Object-Oriented API is fully backward compatible - you can use both APIs in +the same application as needed. diff --git a/packages/taco/src/domains.ts b/packages/taco/src/domains.ts new file mode 100644 index 000000000..c87558ec4 --- /dev/null +++ b/packages/taco/src/domains.ts @@ -0,0 +1,379 @@ +/** + * TACo Domain Configuration + * + * Domain configuration for TACo operations + */ + +/** + * TACo domain configuration interface + */ +export interface TacoDomainConfig { + /** Suggested provider RPC URLs for L2 operations */ + suggestedProviderRpcUrls: string[]; + /** Available ritual IDs */ + rituals: number[]; +} + +export type DomainName = 'lynx' | 'tapir' | 'mainnet'; + +/** + * Complete TACo domain configuration + * + * needed for TACo operations including chain IDs, RPC URLs, and ritual management. + * + * ## Available Domains: + * + * ### `lynx` - DEVNET: Bleeding-edge developer network + * - **Network Type**: DEVNET (Development/Experimental) + * - **Production Status**: Non-Production (Testnet/Development) + * - **L1**: Sepolia (11155111), **L2**: Polygon Amoy (80002) + * - **Portal**: https://lynx-3.nucypher.network:9151/status + * - **Status**: Testnet (Development) - May have breaking changes + * - **Rituals**: [27] - Open ritual, no encryptor restrictions - **Cohort**: 2-of-3 + * + * ### `tapir` - TESTNET: Stable testnet for current TACo release + * - **Network Type**: TESTNET (Testing/Stable) + * - **Production Status**: Non-Production (Testnet/Testing) + * - **Recommended for**: TACo application testing and development + * - **Chain ID**: 80002 (Polygon Amoy) + * - **Portal**: https://tapir-2.nucypher.network:9151/status + * - **Status**: Testnet (Stable) - Recommended for development and testing + * - **Rituals**: [6] - Open ritual, no encryptor restrictions - **Cohort**: 4-of-6 + * + * ### `mainnet` - MAINNET: Production network + * - **Network Type**: MAINNET (Production) + * - **Production Status**: Production (Live/Real Data) + * - **Use Case**: Live TACo applications with real data and users + * - **Chain ID**: 137 (Polygon) + * - **Portal**: Contact TACo team for production monitoring Portal + * - **Status**: Production - Requires custom ritual setup and payment + * - **Rituals**: Custom rituals only - contact TACo team + * + * @example + * ```typescript + * // Access domain configuration + * const lynxConfig = TACO_DOMAINS.lynx; + * console.log(lynxConfig.suggestedProviderRpcUrls); + * console.log(lynxConfig.rituals); + * + * // Use with TacoClient + * const client = new TacoClient({ + * domain: 'lynx', // DEVNET environment + * ritualId: 27, // Open ritual + * // ... other config + * }); + * ``` + * + * @see {@link getDomainMetadata} For programmatic access to domain metadata + * @see {@link DOMAIN_METADATA} For structured domain information + */ +export const TACO_DOMAINS: Record = { + // lynx - DEVNET: Bleeding-edge developer network + lynx: { + suggestedProviderRpcUrls: [ + 'https://rpc-amoy.polygon.technology', + 'https://polygon-amoy.drpc.org', + ], + rituals: [ + 27, // Open ritual, no encryptor restrictions + // Contact TACo team if you would like to perform a new ritual and obtain a new custom ritual id on devnet. + ], + }, + // tapir - TESTNET: Stable testnet for current TACo release + tapir: { + suggestedProviderRpcUrls: [ + 'https://rpc-amoy.polygon.technology', + 'https://polygon-amoy.drpc.org', + ], + rituals: [ + 6, // Open ritual, no encryptor restrictions + ], + }, + // mainnet - MAINNET: Production network + mainnet: { + suggestedProviderRpcUrls: [ + 'https://polygon-rpc.com', + 'https://rpc-mainnet.polygon.technology', + ], + rituals: [ + // No open rituals - all custom + // Contact TACo team to set up a custom ritual for your production use on mainnet. + ], + }, +}; + +/** + * TACo Domain Name Constants + * + * Convenient constants for referencing TACo domain names in a type-safe manner. + * Use these constants instead of hardcoded strings for better maintainability. + * + * @example + * ```typescript + * import { TacoDomains } from '@nucypher/taco'; + * + * const client = new TacoClient({ + * domain: TacoDomains.TESTNET, // 'tapir' + * ritualId: 6, + * // ... + * }); + * ``` + */ +export const TacoDomains = { + /** DEVNET domain ('lynx') - Bleeding-edge developer network */ + DEVNET: 'lynx', + /** TESTNET domain ('tapir') - Stable testnet for current TACo release */ + TESTNET: 'tapir', + /** MAINNET domain ('mainnet') - Production network */ + MAINNET: 'mainnet', +} as const; + +/** + * TACo domain configuration input interface + */ +export interface TacoDomainConfigInput { + domain?: DomainName; + ritualId?: number; + porterUris?: string[]; +} + +/** + * Processed TACo domain configuration interface + */ +export interface ProcessedTacoDomainConfig { + domain: DomainName; + ritualId: number; + rpcUrl?: string | null; + porterUris?: string[] | undefined; +} + +/** + * Generic validation result interface + */ +export interface ValidationResult { + isValid: boolean; + errors: string[]; + config?: ProcessedTacoDomainConfig | undefined; +} + +/** + * TACo Configuration and Domain Management + * + * Unified class for TACo domain configuration, validation, and normalization. + * Provides comprehensive domain management with auto-correction and validation. + */ +export class TacoConfig { + /** + * Get all supported TACo domain names + * @returns {string[]} Array of supported TACo domain names ('lynx', 'tapir', 'mainnet') + */ + static getSupportedDomains(): DomainName[] { + return Object.keys(TACO_DOMAINS) as DomainName[]; + } + + /** + * Check if domain is valid + * @param domain - TACo domain name to check ('lynx', 'tapir', 'mainnet') + * @returns {boolean} True if domain exists + */ + static isValidDomain(domain: DomainName): boolean { + return !!domain && TACO_DOMAINS[domain] !== undefined; + } + + /** + * Check if a TACo domain is a production domain + * @param domain - TACo domain name to check + * @returns {boolean} True if domain is production ('mainnet') + */ + static isProductionDomain(domain: DomainName): boolean { + return domain === 'mainnet'; + } + + // ======================================== + // Ritual Management + // ======================================== + + /** + * Get default ritual ID for a domain + * @param domain - Domain name + * @returns {number|null} Default ritual ID or null if none available + */ + static getDefaultRitualId(domain: DomainName): number | null { + if (!this.isValidDomain(domain)) return null; + const config = TACO_DOMAINS[domain]; + + // Return first ritual ID, or null if no rituals available + return config.rituals.length > 0 ? config.rituals[0] : null; + } + + /** + * Get available rituals for a domain + * @param domain - Domain name + * @returns {number[]} Array of available ritual IDs + */ + static getAvailableRituals(domain: DomainName): number[] { + if (!this.isValidDomain(domain)) return []; + return TACO_DOMAINS[domain].rituals; + } + + /** + * Get default RPC URL for a domain + * @param domain - Domain name + * @returns {string|null} Default RPC URL or null if domain invalid + */ + static getDefaultRpcUrl(domain: DomainName): string | null { + if (!this.isValidDomain(domain)) return null; + return TACO_DOMAINS[domain].suggestedProviderRpcUrls[0]; + } + + /** + * Check if ritual ID is valid for a domain + * @param domain - Domain name + * @param ritualId - Ritual ID to validate + * @returns {boolean} True if ritual ID is valid for the domain + */ + static isValidRitualId(domain: DomainName, ritualId: number): boolean { + if (!this.isValidDomain(domain)) return false; + const config = TACO_DOMAINS[domain]; + + // For mainnet, any positive number is valid (custom rituals) + if (domain === 'mainnet') { + return typeof ritualId === 'number' && ritualId > 0; + } + + // For testnets, check if ritual ID is in the allowed list + return config.rituals.includes(ritualId); + } + + // ======================================== + // Configuration Management Methods + // ======================================== + + /** + * Validate a TACo configuration (pure validation only) + * @param config - Configuration to validate + * @returns {ValidationResult} Validation result with isValid, errors, and config + */ + static validate(config: TacoDomainConfigInput): ValidationResult { + const errors: string[] = []; + + if (!config.domain) { + errors.push('Domain is required'); + } else if (!this.isValidDomain(config.domain)) { + errors.push( + `Invalid domain: ${config.domain}. Supported: ${this.getSupportedDomains().join(', ')}`, + ); + } + + // Validate ritual ID + if (config.domain && this.isValidDomain(config.domain)) { + if (this.isProductionDomain(config.domain)) { + // Mainnet requires a custom ritual ID + if (!config.ritualId) { + errors.push( + 'Mainnet requires a custom ritual ID (contact TACo team for setup)', + ); + } else if (!this.isValidRitualId(config.domain, config.ritualId)) { + errors.push( + 'Invalid ritual ID for mainnet (must be positive number)', + ); + } + } else { + // Testnets can have default ritual IDs + if ( + config.ritualId && + !this.isValidRitualId(config.domain, config.ritualId) + ) { + const availableRituals = this.getAvailableRituals(config.domain); + errors.push( + `Invalid ritual ID for ${config.domain}. Available: ${availableRituals.join(', ')}`, + ); + } + // If no ritualId is provided, ensure a default exists + if (!config.ritualId) { + const def = this.getDefaultRitualId(config.domain); + if (def == null) { + errors.push(`No default ritual available for ${config.domain}`); + } + } + } + } + + return { + isValid: errors.length === 0, + errors, + config: + errors.length === 0 + ? { + domain: config.domain!, + ritualId: + config.ritualId ?? this.getDefaultRitualId(config.domain!)!, + } + : undefined, + }; + } + + /** + * Process and auto-correct user configuration + * @param userConfig - User provided configuration + * @returns {ProcessedTacoDomainConfig} Fully processed and normalized configuration + * @throws {Error} If configuration is invalid after auto-correction + */ + static process(userConfig: TacoDomainConfigInput): ProcessedTacoDomainConfig { + // Step 1: Auto-correct common mistakes + const config = { ...userConfig }; + + // Auto-correct domain name and handle legacy domain names + if (typeof config.domain === 'string') { + const lowerDomain = config.domain.toLowerCase(); + + // Check if it's already a valid TACo domain name + if (this.getSupportedDomains().includes(lowerDomain as DomainName)) { + config.domain = lowerDomain as DomainName; + } else { + // Handle if the uses passed the domain type (taco network type) instead of the domain name - (DEVNET -> lynx, TESTNET -> tapir, MAINNET -> mainnet) + const legacyMapping: Record = { + devnet: 'lynx', + testnet: 'tapir', + mainnet: 'mainnet', + }; + + if (lowerDomain in legacyMapping) { + config.domain = legacyMapping[lowerDomain] as DomainName; + } + } + } + + // Auto-set default ritual ID for testnets if missing + if (config.domain && this.isValidDomain(config.domain)) { + if (!config.ritualId) { + const defaultRitualId = this.getDefaultRitualId(config.domain); + if (defaultRitualId !== null) { + config.ritualId = defaultRitualId; + } + } + } + + // Step 2: Validate the corrected configuration + const validation = this.validate(config); + if (!validation.isValid) { + throw new Error( + `TACo Configuration Error: ${validation.errors.join(', ')}`, + ); + } + + // At this point we know domain and ritualId are defined due to validation + const domain = config.domain!; + const ritualId = config.ritualId!; + + // Step 3: Normalize with additional configuration + const normalizedConfig: ProcessedTacoDomainConfig = { + domain, + ritualId, + rpcUrl: this.getDefaultRpcUrl(domain), + porterUris: config.porterUris, + }; + + return normalizedConfig; + } +} diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 10e26035f..43e8568c0 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -11,7 +11,22 @@ export { export * as conditions from './conditions'; -export { decrypt, encrypt, encryptWithPublicKey } from './taco'; +export { decrypt, encrypt } from './encrypt-decrypt'; +export { encryptWithPublicKey } from './taco'; -// Viem-compatible functions -export { decryptWithViem, encryptWithViem } from './viem-taco'; +// Object-Oriented Interface +export { + TacoClient, + type TacoClientConfig, + type TacoClientEthersConfig, + type TacoClientViemConfig, +} from './taco-client'; + +export { + TACO_DOMAINS, + TacoConfig, + TacoDomains, + type DomainName, +} from './domains'; + +export { LogLevel, Logger } from './utils/logger'; diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/taco-client.ts new file mode 100644 index 000000000..3be5175b2 --- /dev/null +++ b/packages/taco/src/taco-client.ts @@ -0,0 +1,423 @@ +/** + * TacoClient - Object-Oriented Interface for TACo Operations + * + * Provides a higher-level, client-oriented abstraction over the functional TACo API. + * This complements the existing functional API and caters to developers who prefer + * class-based architectures. + */ + +import { ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { type Account, type PublicClient } from '@nucypher/shared'; +import type { ethers } from 'ethers'; + +import { Condition } from './conditions/condition'; +import { ConditionContext } from './conditions/context'; +import { type DomainName, TacoConfig, ValidationResult } from './domains'; +import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; +import { Logger, LogLevel } from './utils/logger'; +import { decryptWithViem, encryptWithViem } from './viem-taco'; + +/** + * Base configuration for TacoClient + */ +export interface TacoClientBaseConfig { + /** TACo domain name (e.g., 'lynx', 'tapir', 'mainnet') */ + domain: DomainName; + /** Ritual ID for the TACo operations */ + ritualId: number; + /** Optional Porter URIs */ + porterUris?: string[]; + /** Optional Logger instance. If not provided, a new Logger will be created. */ + logger?: Logger; + /** Optional logger configuration (ignored if logger is provided) */ + logLevel?: LogLevel; +} + +/** + * Viem configuration for TacoClient + */ +export interface TacoClientViemConfig extends TacoClientBaseConfig { + /** Viem PublicClient for blockchain operations */ + viemClient: PublicClient; + /** Viem Account for signing operations */ + viemAccount: Account; +} + +/** + * Ethers configuration for TacoClient + */ +export interface TacoClientEthersConfig extends TacoClientBaseConfig { + /** Ethers Provider for blockchain operations */ + ethersProvider: ethers.providers.Provider; + /** Ethers Signer for signing operations */ + ethersSigner: ethers.Signer; +} + +/** + * Union type for TacoClient configuration - supports both viem and ethers.js + */ +export type TacoClientConfig = TacoClientViemConfig | TacoClientEthersConfig; + +/** + * Type guard to check if config is viem-based + */ +function isViemConfig( + config: TacoClientConfig, +): config is TacoClientViemConfig { + return 'viemClient' in config && 'viemAccount' in config; +} + +/** + * Type guard to check if config is ethers-based + */ +function isEthersConfig( + config: TacoClientConfig, +): config is TacoClientEthersConfig { + return 'ethersProvider' in config && 'ethersSigner' in config; +} + +/** + * TacoClient provides an object-oriented interface for TACo operations + * + * This class encapsulates TACo configuration and provides simplified methods + * for encryption and decryption operations. It handles configuration validation, + * auto-correction, and provides enhanced error messages. + * + * Supports both viem and ethers.js for maximum flexibility. + * + * @example Using with viem: + * ```typescript + * import { TacoClient, TacoConfig } from '@nucypher/taco'; + * import { createPublicClient, http } from 'viem'; + * import { polygonAmoy } from 'viem/chains'; + * import { privateKeyToAccount } from 'viem/accounts'; + * + * // Process and validate configuration + * const processedConfig = TacoConfig.process({ + * domain: 'testnet', // Will be auto-corrected to 'TESTNET' + * // ritualId automatically set to default for TESTNET (6) + * }); + * + * // Create viem client and account + * const viemClient = createPublicClient({ + * chain: polygonAmoy, + * transport: http() + * }); + * const viemAccount = privateKeyToAccount('0x...'); + * + * // Create TacoClient instance with viem + * const tacoClient = new TacoClient({ + * ...processedConfig, + * viemClient, + * viemAccount + * }); + * + * // Simple encryption/decryption + * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); + * const decrypted = await tacoClient.decryptWithAutoContext(messageKit); + * ``` + * + * @example Using with ethers.js: + * ```typescript + * import { TacoClient, TacoConfig } from '@nucypher/taco'; + * import { ethers } from 'ethers'; + * + * // Process and validate configuration + * const processedConfig = TacoConfig.process({ + * domain: 'testnet', + * ritualId: 6 + * }); + * + * // Create ethers provider and signer + * const ethersProvider = new ethers.providers.JsonRpcProvider('https://rpc-amoy.polygon.technology'); + * const ethersSigner = new ethers.Wallet('0x...', ethersProvider); + * + * // Create TacoClient instance with ethers + * const tacoClient = new TacoClient({ + * ...processedConfig, + * ethersProvider, + * ethersSigner + * }); + * + * // Simple encryption/decryption + * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); + * const decrypted = await tacoClient.decryptWithAutoContext(messageKit); + * ``` + */ +export class TacoClient { + private config: TacoClientConfig; + private logger: Logger; + private domain: DomainName; + + /** + * Create a new TacoClient instance + * + * @param config - TacoClient configuration + * @throws {Error} If configuration is invalid + */ + constructor(config: TacoClientConfig) { + // Use provided logger or create a new one + this.logger = + config.logger || + new Logger({ + level: config.logLevel || LogLevel.INFO, + component: 'TacoClient', + }); + + // Validate and process the configuration + const processedConfig = TacoClient.validateConfig(config); + if (!processedConfig.isValid) { + throw new Error( + `TacoClient Configuration Error: ${processedConfig.errors.join(', ')}`, + ); + } + + this.config = config; + this.domain = this.getDomainFromConfig(config.domain); + + this.logger.debug(`TacoClient initialized`, { + domain: this.config.domain, + ritualId: this.config.ritualId, + }); + } + + /** + * Validate TacoClient configuration + * + * @param config - Configuration to validate + * @returns {ValidationResult} Validation result + */ + static validateConfig(config: TacoClientConfig): ValidationResult { + const errors: string[] = []; + + // Validate TACo domain configuration + const tacoValidation = TacoConfig.validate({ + domain: config.domain, + ritualId: config.ritualId, + }); + + if (!tacoValidation.isValid) { + errors.push(...tacoValidation.errors); + } + + // Validate required blockchain objects + if (isViemConfig(config)) { + // Validate viem objects + if (!config.viemClient) { + errors.push('viemClient is required for viem configuration'); + } + if (!config.viemAccount) { + errors.push('viemAccount is required for viem configuration'); + } + } else if (isEthersConfig(config)) { + // Validate ethers objects + if (!config.ethersProvider) { + errors.push('ethersProvider is required for ethers configuration'); + } + if (!config.ethersSigner) { + errors.push('ethersSigner is required for ethers configuration'); + } + } else { + errors.push( + 'Configuration must include either viem objects (viemClient + viemAccount) or ethers objects (ethersProvider + ethersSigner)', + ); + } + + return { + isValid: errors.length === 0, + errors, + config: errors.length === 0 ? config : undefined, + }; + } + + /** + * Get the domain object for porter operations + * + * @param domainName - TACo domain name (e.g., 'lynx', 'tapir', 'mainnet') + * @returns {DomainName} Porter domain + */ + private getDomainFromConfig(domainName: string): DomainName { + // DomainName validity is ensured by prior validation in the constructor + // The domain name is already the actual TACo domain string + return domainName as DomainName; + } + + /** + * Encrypt data with the given access condition + * + * @param data - String or Uint8Array to encrypt + * @param accessCondition - Access condition for decryption + * @returns {Promise} Encrypted message kit + * + * @example + * ```typescript + * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); + * ``` + */ + async encrypt( + data: string | Uint8Array, + accessCondition: Condition, + ): Promise { + this.logger.debug('Starting encryption', { + domain: this.config.domain, + ritualId: this.config.ritualId, + dataType: typeof data, + dataLength: data.length, + }); + + try { + let messageKit: ThresholdMessageKit; + + if (isViemConfig(this.config)) { + // Use viem API + messageKit = await encryptWithViem( + this.config.viemClient, + this.domain, + data, + accessCondition, + this.config.ritualId, + this.config.viemAccount, + ); + } else if (isEthersConfig(this.config)) { + // Use ethers API + messageKit = await ethersEncrypt( + this.config.ethersProvider, + this.domain, + data, + accessCondition, + this.config.ritualId, + this.config.ethersSigner, + ); + } else { + throw new Error( + 'Invalid configuration: must provide either viem or ethers objects', + ); + } + + this.logger.info('Encryption successful'); + return messageKit; + } catch (error) { + this.logger.error('Encryption failed', error); + throw new Error(`TaCo encryption failed: ${error}`); + } + } + + /** + * Decrypt a message kit with optional condition context + * + * @param messageKit - Encrypted message kit + * @param conditionContext - Optional condition context for time-based conditions + * @returns {Promise} Decrypted data + * + * @example + * ```typescript + * const decrypted = await tacoClient.decrypt(messageKit, conditionContext); + * ``` + */ + async decrypt( + messageKit: ThresholdMessageKit, + conditionContext?: ConditionContext, + ): Promise { + this.logger.debug('Starting decryption', { + domain: this.config.domain, + hasContext: !!conditionContext, + }); + + try { + let decrypted: Uint8Array; + + if (isViemConfig(this.config)) { + // Use viem API + decrypted = await decryptWithViem( + this.config.viemClient, + this.domain, + messageKit, + conditionContext, + this.config.porterUris, + ); + } else if (isEthersConfig(this.config)) { + // Use ethers API + decrypted = await ethersDecrypt( + this.config.ethersProvider, + this.domain, + messageKit, + conditionContext, + this.config.porterUris, + ); + } else { + throw new Error( + 'Invalid configuration: must provide either viem or ethers objects', + ); + } + + this.logger.info('Decryption successful'); + return decrypted; + } catch (error) { + this.logger.error('Decryption failed', error); + throw new Error(`TaCo decryption failed: ${error}`); + } + } + + /** + * Decrypt a message kit with automatic condition context creation + * + * This is a convenience method that automatically creates the condition context + * for time-based conditions, making decryption simpler for common use cases. + * + * @param messageKit - Encrypted message kit + * @returns {Promise} Decrypted data + * + * @example + * ```typescript + * const decrypted = await tacoClient.decryptWithAutoContext(messageKit); + * ``` + */ + async decryptWithAutoContext( + messageKit: ThresholdMessageKit, + ): Promise { + this.logger.debug('Starting decryption with auto context'); + + try { + // For auto context, we create a condition context with current time + const conditionContext = await this.createConditionContext(messageKit); + return await this.decrypt(messageKit, conditionContext); + } catch (error) { + this.logger.error('Auto-context decryption failed', error); + throw new Error(`TaCo auto-context decryption failed: ${error}`); + } + } + + /** + * Create a condition context for the given message kit + * + * @param messageKit - Message kit to create context for + * @param customViemAccount - Optional custom viem account (defaults to instance account) + * @returns {Promise} Condition context + * + * @example + * ```typescript + * const context = await tacoClient.createConditionContext(messageKit); + * const decrypted = await tacoClient.decrypt(messageKit, context); + * ``` + */ + async createConditionContext( + messageKit: ThresholdMessageKit, + ): Promise { + this.logger.debug('Creating condition context'); + + // Create condition context from the message kit's conditions + const conditionContext = ConditionContext.fromMessageKit(messageKit); + + this.logger.debug('Condition context created successfully'); + return conditionContext; + } + + /** + * Get current client configuration + * + * @returns {Readonly} Client configuration + */ + getConfig(): Readonly { + return Object.freeze({ ...this.config }); + } +} diff --git a/packages/taco/src/utils/logger.ts b/packages/taco/src/utils/logger.ts new file mode 100644 index 000000000..46122cd60 --- /dev/null +++ b/packages/taco/src/utils/logger.ts @@ -0,0 +1,123 @@ +/** + * Simple Logging Utility for TACo Web + * + * Provides basic logging functionality with configurable levels. + * Designed to be lightweight and dependency-free. + */ + +/** + * Log levels in order of severity + */ +export enum LogLevel { + ERROR = 0, + WARN = 1, + INFO = 2, + DEBUG = 3, + TRACE = 4 +} + +/** + * Logging configuration + */ +interface LoggingConfig { + level: LogLevel; + enableColors: boolean; + enableTimestamps: boolean; + component?: string; +} + +/** + * Simple logger class for TACo operations + */ +export class Logger { + private config: LoggingConfig; + + constructor(options: Partial = {}) { + this.config = { + level: this.determineLogLevel(options.level), + enableColors: options.enableColors ?? true, + enableTimestamps: options.enableTimestamps ?? true, + component: options.component ?? 'TACo' + }; + } + + private determineLogLevel(explicitLevel?: LogLevel): LogLevel { + if (explicitLevel !== undefined) { + return explicitLevel; + } + + // Check environment variables in browser-compatible way + if (typeof process !== 'undefined' && process.env) { + const envLevel = process.env.TACO_LOG_LEVEL || process.env.LOG_LEVEL; + if (envLevel) { + const upperLevel = envLevel.toUpperCase(); + if (upperLevel in LogLevel) { + return LogLevel[upperLevel as keyof typeof LogLevel]; + } + } + + const env = process.env.NODE_ENV?.toLowerCase(); + if (env === 'production') return LogLevel.ERROR; + if (env === 'development') return LogLevel.DEBUG; + if (env === 'test') return LogLevel.WARN; + } + + return LogLevel.INFO; + } + + private formatMessage(level: LogLevel, message: string, ...args: unknown[]): string { + const levelName = LogLevel[level]; + const timestamp = this.config.enableTimestamps ? new Date().toISOString() : ''; + const component = this.config.component ? `[${this.config.component}]` : ''; + + let formatted = ''; + if (timestamp) formatted += `${timestamp} `; + if (component) formatted += `${component} `; + formatted += `${levelName}: ${message}`; + + if (args.length > 0) { + formatted += ' ' + args.map(arg => + typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg) + ).join(' '); + } + + return formatted; + } + + private shouldLog(level: LogLevel): boolean { + return level <= this.config.level; + } + + private log(level: LogLevel, message: string, ...args: unknown[]): void { + if (this.shouldLog(level)) { + console.log(this.formatMessage(level, message, ...args)); + } + } + + error(message: string, ...args: unknown[]): void { + this.log(LogLevel.ERROR, message, ...args); + } + + warn(message: string, ...args: unknown[]): void { + this.log(LogLevel.WARN, message, ...args); + } + + info(message: string, ...args: unknown[]): void { + this.log(LogLevel.INFO, message, ...args); + } + + debug(message: string, ...args: unknown[]): void { + this.log(LogLevel.DEBUG, message, ...args); + } + + trace(message: string, ...args: unknown[]): void { + if (this.shouldLog(LogLevel.TRACE)) { + console.trace(this.formatMessage(LogLevel.TRACE, message, ...args)); + } + } +} + +/** + * Default logger instance for TACo operations + */ +export const logger = new Logger(); diff --git a/packages/taco/test/client.test.ts b/packages/taco/test/client.test.ts new file mode 100644 index 000000000..72d369d05 --- /dev/null +++ b/packages/taco/test/client.test.ts @@ -0,0 +1,387 @@ +/** + * TacoClient Tests + * + * Tests for the Object-Oriented TacoClient interface + */ + +import { type Account, type PublicClient } from '@nucypher/shared'; +import type { ethers } from 'ethers'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import { + type DomainName, + TACO_DOMAINS, + TacoClient, + TacoClientConfig, + TacoClientEthersConfig, + TacoClientViemConfig, + TacoConfig, +} from '../src'; + +// Mock viem dependencies +const mockViemClient = { + getChainId: vi.fn().mockResolvedValue(80002), + call: vi.fn().mockResolvedValue('0x'), + getNetwork: vi + .fn() + .mockResolvedValue({ chainId: 80002, name: 'polygon-amoy' }), + readContract: vi.fn().mockResolvedValue('0x'), +} as unknown as PublicClient; + +const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0x'), + signTypedData: vi.fn().mockResolvedValue('0x'), +} as unknown as Account; + +// Mock ethers dependencies +const mockEthersProvider = { + getNetwork: vi + .fn() + .mockResolvedValue({ name: 'polygon-amoy', chainId: 80002 }), + getBalance: vi.fn().mockResolvedValue('1000000000000000000'), + getCode: vi.fn().mockResolvedValue('0x'), +} as unknown as ethers.providers.Provider; + +const mockEthersSigner = { + getAddress: vi + .fn() + .mockResolvedValue('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'), + signMessage: vi.fn().mockResolvedValue('0x'), + provider: mockEthersProvider, +} as unknown as ethers.Signer; + +describe('TacoConfig', () => { + describe('Domain Management', () => { + it('should return all supported domains', () => { + const domains = TacoConfig.getSupportedDomains(); + expect(domains).toEqual(['lynx', 'tapir', 'mainnet']); + }); + + it('should validate domain names correctly', () => { + expect(TacoConfig.isValidDomain('tapir')).toBe(true); + expect(TacoConfig.isValidDomain('lynx')).toBe(true); + expect(TacoConfig.isValidDomain('mainnet')).toBe(true); + expect(TacoConfig.isValidDomain('INVALID' as DomainName)).toBe(false); + expect(TacoConfig.isValidDomain('' as DomainName)).toBe(false); + }); + + it('should identify production domains', () => { + expect(TacoConfig.isProductionDomain('mainnet')).toBe(true); + expect(TacoConfig.isProductionDomain('tapir')).toBe(false); + expect(TacoConfig.isProductionDomain('lynx')).toBe(false); + }); + + it('should return correct default ritual IDs', () => { + expect(TacoConfig.getDefaultRitualId('lynx')).toBe(27); + expect(TacoConfig.getDefaultRitualId('tapir')).toBe(6); + expect(TacoConfig.getDefaultRitualId('mainnet')).toBe(null); + expect(TacoConfig.getDefaultRitualId('INVALID' as DomainName)).toBe(null); + }); + + it('should return available rituals for domains', () => { + expect(TacoConfig.getAvailableRituals('lynx')).toEqual([27]); + expect(TacoConfig.getAvailableRituals('tapir')).toEqual([6]); + expect(TacoConfig.getAvailableRituals('mainnet')).toEqual([]); + expect(TacoConfig.getAvailableRituals('INVALID' as DomainName)).toEqual( + [], + ); + }); + + it('should validate ritual IDs correctly', () => { + // Valid ritual IDs for testnets + expect(TacoConfig.isValidRitualId('lynx', 27)).toBe(true); + expect(TacoConfig.isValidRitualId('tapir', 6)).toBe(true); + + // Invalid ritual IDs for testnets + expect(TacoConfig.isValidRitualId('lynx', 999)).toBe(false); + expect(TacoConfig.isValidRitualId('tapir', 999)).toBe(false); + + // Mainnet accepts any positive number + expect(TacoConfig.isValidRitualId('mainnet', 42)).toBe(true); + expect(TacoConfig.isValidRitualId('mainnet', 1)).toBe(true); + expect(TacoConfig.isValidRitualId('mainnet', 0)).toBe(false); + }); + }); + + describe('Configuration Processing', () => { + it('should process valid testnet configuration', () => { + const config = TacoConfig.process({ + domain: 'tapir', + ritualId: 6, + }); + + expect(config.domain).toBe('tapir'); + expect(config.ritualId).toBe(6); + expect(config.rpcUrl).toBeDefined(); + }); + + it('should use domain names as-is when valid', () => { + const config = TacoConfig.process({ + domain: 'tapir', + }); + + expect(config.domain).toBe('tapir'); + expect(config.ritualId).toBe(6); // Auto-set default + }); + + it('should support legacy domain name mapping', () => { + const devnetConfig = TacoConfig.process({ + domain: 'devnet' as DomainName, + }); + expect(devnetConfig.domain).toBe('lynx'); + + const testnetConfig = TacoConfig.process({ + domain: 'testnet' as DomainName, + }); + expect(testnetConfig.domain).toBe('tapir'); + + const mainnetConfig = TacoConfig.process({ + domain: 'mainnet', + ritualId: 42, + }); + expect(mainnetConfig.domain).toBe('mainnet'); + }); + + it('should auto-set default ritual IDs for testnets', () => { + const devnetConfig = TacoConfig.process({ + domain: 'lynx', + }); + expect(devnetConfig.ritualId).toBe(27); + + const testnetConfig = TacoConfig.process({ + domain: 'tapir', + }); + expect(testnetConfig.ritualId).toBe(6); + }); + + it('should throw for invalid configurations', () => { + expect(() => + TacoConfig.process({ + domain: 'INVALID_DOMAIN' as DomainName, + }), + ).toThrow('TACo Configuration Error'); + + expect(() => + TacoConfig.process({ + domain: 'tapir', + ritualId: 999, + }), + ).toThrow('Invalid ritual ID'); + + expect(() => + TacoConfig.process({ + domain: 'mainnet', + // Missing required ritualId for mainnet + }), + ).toThrow('Mainnet requires a custom ritual ID'); + }); + }); + + describe('Configuration Validation', () => { + it('should validate correct configurations', () => { + const result = TacoConfig.validate({ + domain: 'tapir', + ritualId: 6, + }); + + expect(result.isValid).toBe(true); + expect(result.errors).toHaveLength(0); + expect(result.config).toBeDefined(); + }); + + it('should detect invalid configurations', () => { + const result = TacoConfig.validate({ + domain: 'INVALID_DOMAIN' as DomainName, + ritualId: 999, + }); + + expect(result.isValid).toBe(false); + expect(result.errors.length).toBeGreaterThan(0); + expect(result.config).toBe(undefined); + }); + + it('should require domain', () => { + const result = TacoConfig.validate({ + ritualId: 6, + }); + + expect(result.isValid).toBe(false); + expect(result.errors).toContain('Domain is required'); + }); + }); +}); + +describe('TacoClient', () => { + let validViemConfig: TacoClientViemConfig; + let validEthersConfig: TacoClientEthersConfig; + + beforeEach(() => { + validViemConfig = { + domain: 'tapir', + ritualId: 6, + viemClient: mockViemClient, + viemAccount: mockViemAccount, + }; + + validEthersConfig = { + domain: 'tapir', + ritualId: 6, + ethersProvider: mockEthersProvider, + ethersSigner: mockEthersSigner, + }; + }); + + describe('Construction', () => { + it('should create client with valid viem configuration', () => { + const client = new TacoClient(validViemConfig); + expect(client).toBeInstanceOf(TacoClient); + }); + + it('should create client with valid ethers configuration', () => { + const client = new TacoClient(validEthersConfig); + expect(client).toBeInstanceOf(TacoClient); + }); + + it('should throw with invalid domain', () => { + expect( + () => + new TacoClient({ + ...validViemConfig, + domain: 'INVALID_DOMAIN' as DomainName, + }), + ).toThrow('TacoClient Configuration Error'); + }); + + it('should throw when missing viem objects', () => { + expect( + () => + new TacoClient({ + domain: 'tapir', + ritualId: 6, + } as unknown as TacoClientConfig), + ).toThrow('Configuration must include either viem objects'); + }); + + it('should throw when missing viemClient in viem config', () => { + expect( + () => + new TacoClient({ + ...validViemConfig, + viemClient: undefined, + } as unknown as TacoClientConfig), + ).toThrow('viemClient is required for viem configuration'); + }); + + it('should throw when missing viemAccount in viem config', () => { + expect( + () => + new TacoClient({ + ...validViemConfig, + viemAccount: undefined, + } as unknown as TacoClientConfig), + ).toThrow('viemAccount is required for viem configuration'); + }); + + it('should throw when missing ethersProvider in ethers config', () => { + expect( + () => + new TacoClient({ + ...validEthersConfig, + ethersProvider: undefined, + } as unknown as TacoClientConfig), + ).toThrow('ethersProvider is required for ethers configuration'); + }); + + it('should throw when missing ethersSigner in ethers config', () => { + expect( + () => + new TacoClient({ + ...validEthersConfig, + ethersSigner: undefined, + } as unknown as TacoClientConfig), + ).toThrow('ethersSigner is required for ethers configuration'); + }); + }); + + describe('Configuration Methods', () => { + it('should return readonly configuration', () => { + const client = new TacoClient(validViemConfig); + const config = client.getConfig(); + + expect(config.domain).toBe('tapir'); + expect(config.ritualId).toBe(6); + }); + + it('should return readonly configuration', () => { + const client = new TacoClient(validViemConfig); + const config = client.getConfig(); + + expect(config.domain).toBe('tapir'); + expect(config.ritualId).toBe(6); + + // Should be frozen/readonly + expect(() => { + (config as Record).domain = 'lynx'; + }).toThrow(); + }); + }); + + describe('Static Validation', () => { + it('should validate correct viem configuration', () => { + const result = TacoClient.validateConfig(validViemConfig); + expect(result.isValid).toBe(true); + expect(result.errors).toHaveLength(0); + }); + + it('should validate correct ethers configuration', () => { + const result = TacoClient.validateConfig(validEthersConfig); + expect(result.isValid).toBe(true); + expect(result.errors).toHaveLength(0); + }); + + it('should detect missing dependencies', () => { + const result = TacoClient.validateConfig({ + domain: 'tapir', + ritualId: 6, + // Missing blockchain objects + } as unknown as TacoClientConfig); + + expect(result.isValid).toBe(false); + expect(result.errors).toContain( + 'Configuration must include either viem objects (viemClient + viemAccount) or ethers objects (ethersProvider + ethersSigner)', + ); + }); + }); +}); + +describe('TACO_DOMAINS', () => { + it('should have correct structure', () => { + expect(TACO_DOMAINS).toBeDefined(); + expect(TACO_DOMAINS.lynx).toBeDefined(); + expect(TACO_DOMAINS.tapir).toBeDefined(); + expect(TACO_DOMAINS.mainnet).toBeDefined(); + }); + + it('should have required properties for each domain', () => { + Object.values(TACO_DOMAINS).forEach((domain) => { + expect(domain.suggestedProviderRpcUrls).toBeInstanceOf(Array); + expect(domain.rituals).toBeInstanceOf(Array); + // isProduction property removed - production status moved to comments + }); + }); + + it('should have network types documented in comments', () => { + // Network type and production status information moved to comments in domain configuration + // lynx = DEVNET (Non-Production), tapir = TESTNET (Non-Production), mainnet = MAINNET (Production) + // This information is now documented in comments rather than runtime properties + expect(Object.keys(TACO_DOMAINS)).toEqual(['lynx', 'tapir', 'mainnet']); + }); + + it('should derive production status from domain names', () => { + // Production status is now derived from domain names rather than stored as properties + expect(TacoConfig.isProductionDomain('lynx')).toBe(false); + expect(TacoConfig.isProductionDomain('tapir')).toBe(false); + expect(TacoConfig.isProductionDomain('mainnet')).toBe(true); + }); +}); From 79e0e88316a9a34e143ed8b2bcd0ca0b75e0f8cf Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 25 Aug 2025 20:44:27 +0200 Subject: [PATCH 73/97] Some refactoring Mainly reduce some validation and add provider chain id validation among the other edits including the tests and the .md files --- packages/taco/README.md | 85 +--- .../taco/examples/taco-client-examples.md | 245 ++--------- packages/taco/src/client-config.ts | 70 ++++ packages/taco/src/domains.ts | 379 ------------------ packages/taco/src/index.ts | 25 +- packages/taco/src/taco-client.ts | 263 +++--------- packages/taco/src/taco-config-validator.ts | 294 ++++++++++++++ packages/taco/test/client.test.ts | 326 ++++++++------- 8 files changed, 636 insertions(+), 1051 deletions(-) create mode 100644 packages/taco/src/client-config.ts delete mode 100644 packages/taco/src/domains.ts create mode 100644 packages/taco/src/taco-config-validator.ts diff --git a/packages/taco/README.md b/packages/taco/README.md index ac6e12b84..6986f0290 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -143,18 +143,24 @@ For detailed viem documentation, see [VIEM_SUPPORT.md](./VIEM_SUPPORT.md). For applications requiring multiple TACo operations or complex configuration management, the TACo SDK provides an optional object-oriented interface through the `TacoClient` class. This provides a stateful, higher-level abstraction over the functional API. -### Benefits +### What is different from the functional API? -- **Reduced Boilerplate**: No need to repeatedly pass configuration parameters -- **Built-in Validation**: Automatic configuration validation and correction -- **Better IntelliSense**: IDE autocompletion and type safety -- **Simplified Error Handling**: Contextual errors with specific recommendations -- **Stateful Configuration**: Store domain, ritual ID, and client configurations at instance level +- **Stateful Configuration**: Store domain, ritual ID, and other client configurations at instance level so there is less need to repeatedly pass some config parameters. +- **Enhanced Validation**: Enhanced configuration validation and correction. +- **Enhanced Type Safety**: More type strict for the domain name. + +The Object-Oriented API is fully backward compatible - you can use both APIs in +the same application as needed. Except that the TacoClient has more validations +and hence throws some errors earlier with different error messages. + +NOTE: Using TacoClient is basically similar to using the functional API. And there is no +specific recommendations on what to use. It is for the convenience of the +developer to choose. ### Basic Usage ```typescript -import { TacoClient, TacoDomains } from '@nucypher/taco'; +import { TacoClient, ConditionContext, DOMAIN_NAMES } from '@nucypher/taco'; import { createPublicClient, http } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; @@ -169,9 +175,9 @@ const viemClient = createPublicClient({ }); const viemAccount = privateKeyToAccount('0x...'); -// Create TacoClient instance using domain constants +// Create TacoClient instance with domain constants const tacoClient = new TacoClient({ - domain: TacoDomains.TESTNET, // 'tapir' - use TacoDomains.DEVNET or TacoDomains.MAINNET + domain: DOMAIN_NAMES.TESTNET, // TacoDomains.TESTNET -> 'tapir' ritualId: 6, viemClient, viemAccount @@ -180,63 +186,12 @@ const tacoClient = new TacoClient({ // Encrypt data const messageKit = await tacoClient.encrypt('Hello, secret!', condition); -// Decrypt with automatic context creation -const decryptedMessage = await tacoClient.decryptWithAutoContext(messageKit); -``` - -### Logger Configuration - -You can configure custom logging for better debugging and monitoring: - -```typescript -import { TacoClient, TacoDomains, Logger, LogLevel } from '@nucypher/taco'; - -// Create custom logger instance -const customLogger = new Logger({ - level: LogLevel.DEBUG, - component: 'MyApp', -}); - -// Use custom logger in TacoClient -const tacoClient = new TacoClient({ - domain: TacoDomains.TESTNET, - ritualId: 6, - viemClient, - viemAccount, - logger: customLogger, // Custom logger instance. You can create and provide yours. -}); - -// Or set log level directly (creates new Logger internally) -const tacoClientWithLogLevel = new TacoClient({ - domain: TacoDomains.TESTNET, - ritualId: 6, - viemClient, - viemAccount, - logLevel: LogLevel.WARN, // Set log level directly (creates new Logger internally that will print to console) -}); -``` - -### Configuration Management - -The `TacoConfig` class provides unified configuration management with automatic validation and correction: - -```typescript -import { TacoConfig } from '@nucypher/taco'; - -// Auto-correct and validate configuration -const config = TacoConfig.process({ domain: 'testnet' }); // → will use 'tapir' with ritual 6 -const tacoClient = new TacoClient({ - ...config, - viemClient, - viemAccount -}); +// Decrypt +const conditionContext = ConditionContext.fromMessageKit(messageKit); -// Get domain information -const domainInfo = tacoClient.getDomainInfo(); -// Returns: { domain, alias, chainId, rituals, suggestedRpcUrls, isProduction } +// if needed Add authentication for ":userAddress" in condition... -// Check supported domains -const supportedDomains = TacoConfig.getSupportedDomains(); // ['lynx', 'tapir', 'mainnet'] +const decryptedMessage = await tacoClient.decrypt(messageKit, conditionContext); ``` ### Dual Configuration Support @@ -244,7 +199,7 @@ const supportedDomains = TacoConfig.getSupportedDomains(); // ['lynx', 'tapir', TacoClient supports both viem and ethers.js configurations: ```typescript -import { TacoClient, TacoDomains } from '@nucypher/taco'; +import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; // With viem (recommended) const tacoClientViem = new TacoClient({ diff --git a/packages/taco/examples/taco-client-examples.md b/packages/taco/examples/taco-client-examples.md index c0e1f9461..5ae8264e2 100644 --- a/packages/taco/examples/taco-client-examples.md +++ b/packages/taco/examples/taco-client-examples.md @@ -8,28 +8,19 @@ interface. ### 1. Import Required Dependencies ```typescript -import { TacoClient, TacoConfig } from '@nucypher/taco'; +import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; import { createPublicClient, http } from 'viem'; import { polygonAmoy } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; import * as conditions from '@nucypher/taco/conditions'; +import { ConditionContext } from '@nucypher/taco'; +import { + EIP4361AuthProvider, + USER_ADDRESS_PARAM_DEFAULT, +} from '@nucypher/taco-auth'; ``` -### 2. Configuration Processing - -```typescript -// Process user configuration with auto-correction and validation -const userConfig = { - domain: 'testnet', // Will be auto-corrected to 'TESTNET' - // ritualId is automatically set to default for TESTNET (6) -}; - -const processedConfig = TacoConfig.process(userConfig); -console.log(processedConfig); -// Output: { domain: 'TESTNET', ritualId: 6, chainId: 80002, rpcUrl: '...' } -``` - -### 3. Create TacoClient Instance +### 2. Create TacoClient Instance ```typescript // Create viem client for Polygon Amoy (TACo network) @@ -41,15 +32,19 @@ const viemClient = createPublicClient({ // Create account from private key const viemAccount = privateKeyToAccount('0x...'); -// Create TacoClient with processed configuration +// Create TacoClient with configuration const tacoClient = new TacoClient({ - ...processedConfig, + domain: DOMAIN_NAMES.TESTNET, // 'tapir' - stable testnet + ritualId: 6, // default ritual ID for TESTNET viemClient, viemAccount, }); +// Validate configuration - because this is an async operation, it needs to be awaited and it cannot be done in the constructor +// However, the constructor will also do but a fast check and throw if the configuration is invalid +await tacoClient.validateConfig(); ``` -### 4. Encrypt and Decrypt Data +### 3. Encrypt and Decrypt Data ```typescript // Create a simple time-based condition @@ -67,58 +62,26 @@ const condition = new conditions.predefined.ERC20Balance({ // Encrypt data const messageKit = await tacoClient.encrypt('Hello, secret world!', condition); -// Decrypt with automatic context creation -const decrypted = await tacoClient.decryptWithAutoContext(messageKit); +// Decrypt with explicit context creation (following security best practices) +const conditionContext = ConditionContext.fromMessageKit(messageKit); + +// If your condition uses ':userAddress', add authentication: +// const ethersProvider = new ethers.providers.Web3Provider(window.ethereum); +// const authProvider = new EIP4361AuthProvider(ethersProvider, ethersProvider.getSigner()); +// conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, authProvider); + +const decrypted = await tacoClient.decrypt(messageKit, conditionContext); const message = new TextDecoder().decode(decrypted); console.log(message); // "Hello, secret world!" ``` ## Advanced Usage -### 1. Domain Configuration Management - -```typescript -// Get domain information -const domainInfo = tacoClient.getDomainInfo(); -console.log(domainInfo); -// Output: { -// domain: 'TESTNET', -// alias: 'tapir', -// chainId: 80002, -// rituals: [6], -// suggestedRpcUrls: ['https://rpc-amoy.polygon.technology', ...], -// isProduction: false -// } - -// Get supported domains -const domains = TacoConfig.getSupportedDomains(); -console.log(domains); // ['DEVNET', 'TESTNET', 'MAINNET'] - -// Validate domain and ritual combinations -const isValid = TacoConfig.isValidRitualId('TESTNET', 6); -console.log(isValid); // true -``` - -### 2. Configuration Validation - -```typescript -// Validate configuration before creating client -const validation = TacoConfig.validate({ - domain: 'INVALID_DOMAIN', - ritualId: 999, -}); - -if (!validation.isValid) { - console.error('Configuration errors:', validation.errors); - // Output: ['Invalid domain: INVALID_DOMAIN. Supported: DEVNET, TESTNET, MAINNET'] -} -``` - -### 3. Multiple Clients for Different Contexts +### Multiple Clients for Different Contexts ```typescript // Development client -const devConfig = TacoConfig.process({ domain: 'devnet' }); +const devConfig = TacoConfig.process({ domain: 'tapir' }); const devClient = new TacoClient({ ...devConfig, viemClient: devViemClient, @@ -140,161 +103,3 @@ const prodClient = new TacoClient({ const devEncrypted = await devClient.encrypt('dev data', devCondition); const prodEncrypted = await prodClient.encrypt('prod data', prodCondition); ``` - -### 4. Custom Condition Context - -```typescript -// Create custom condition context for complex decryption scenarios -const messageKit = await tacoClient.encrypt(data, condition); - -// Method 1: Use auto context (recommended for most cases) -const decrypted1 = await tacoClient.decryptWithAutoContext(messageKit); - -// Method 2: Create custom context -const conditionContext = await tacoClient.createConditionContext(messageKit); -// Add custom context parameters if needed -// conditionContext.addCustomContextParameterValues({...}); - -const decrypted2 = await tacoClient.decrypt(messageKit, conditionContext); -``` - -### 5. Error Handling and Logging - -```typescript -import { Logger, LogLevel } from '@nucypher/taco'; - -// Create client with debug logging -const tacoClient = new TacoClient({ - ...processedConfig, - viemClient, - viemAccount, - logLevel: LogLevel.DEBUG, // or provide your own logger with: `logger: new Logger(LogLevel.DEBUG)` -}); - -try { - const messageKit = await tacoClient.encrypt(data, condition); - const decrypted = await tacoClient.decryptWithAutoContext(messageKit); -} catch (error) { - console.error('TaCo operation failed:', error.message); - // Error messages include context about the configuration and operation -} -``` - -## Migration from Functional API - -### Before (Functional API) - -#### With viem - -```typescript -import { encryptWithViem, decryptWithViem, domains } from '@nucypher/taco'; - -const messageKit = await encryptWithViem( - viemClient, // pass viem client when calling encrypt and when calling decrypt - domains.TESTNET, // Accepts any arbitrary string - 'Hello, secret!', - condition, - 6, // Must remember the corresponding ritual ID for DEVNET and TESTNET - viemAccount, -); - -const decrypted = await decryptWithViem( - viemClient, // pass viem client when calling encrypt and when calling decrypt - domains.TESTNET, // Accepts any arbitrary string. And need to be passed at both encrypt and decrypt - messageKit, - conditionContext, -); -``` - -#### With ethers.js - -```typescript -import { encrypt, decrypt, domains } from '@nucypher/taco'; - -const messageKit = await encrypt( - ethersProvider, // pass ethers provider when calling encrypt and when calling decrypt - domains.TESTNET, // Accepts any arbitrary string - 'Hello, secret!', - condition, - 6, // Must remember the corresponding ritual ID for DEVNET and TESTNET - ethersSigner, -); - -const decrypted = await decrypt( - ethersProvider, // pass ethers provider when calling encrypt and when calling decrypt - domains.TESTNET, // Accepts any arbitrary string. And need to be passed at both encrypt and decrypt - messageKit, - conditionContext, -); -``` - -### After (Object-Oriented API) - -#### With viem - -```typescript -import { TacoClient, TacoConfig } from '@nucypher/taco'; - -// One-time setup with validation -// processedConfig will have the default ritual ID for TESTNET (6) -const processedConfig = TacoConfig.process({ domain: 'testnet' }); // same as: `TacoConfig.process({ domain: 'tapir' });` - -// For mainnet, you need to specify the ritual ID explicitly like: -const processedConfigMainnet = TacoConfig.process({ - domain: 'mainnet', - ritualId: 42, -}); - -const tacoClient = new TacoClient({ - ...processedConfig, - viemClient, - viemAccount, -}); - -// Simplified operations - no need to pass configuration repeatedly -// The encrypt and decrypt methods are unified between viem and ethers.js -const messageKit = await tacoClient.encrypt('Hello, secret!', condition); -const decrypted = await tacoClient.decryptWithAutoContext(messageKit); -``` - -#### With ethers.js - -```typescript -import { TacoClient, TacoConfig } from '@nucypher/taco'; - -// One-time setup with validation -// processedConfig will have the default ritual ID for TESTNET (6) -const processedConfig = TacoConfig.process({ domain: 'testnet' }); // same as: `TacoConfig.process({ domain: 'tapir' });` - -// For mainnet, you need to specify the ritual ID explicitly like: -const processedConfigMainnet = TacoConfig.process({ - domain: 'mainnet', - ritualId: 42, -}); - -const tacoClient = new TacoClient({ - ...processedConfig, - ethersProvider, - ethersSigner, -}); - -// Simplified operations - no need to pass configuration repeatedly -// The encrypt and decrypt methods are unified between viem and ethers.js -const messageKit = await tacoClient.encrypt('Hello, secret!', condition); -const decrypted = await tacoClient.decryptWithAutoContext(messageKit); -``` - -## Benefits - -1. **Reduced Boilerplate**: No need to pass domain/ritual parameters repeatedly -2. **Built-in Validation**: Automatic configuration validation and error - handling -3. **Auto-correction**: Common mistakes like domain casing are fixed - automatically -4. **Enhanced Logging**: Contextual error messages and debug information -5. **Type Safety**: Full TypeScript support with intelligent autocompletion -6. **Multiple Configurations**: Easy management of different TACo setups per - application context - -The Object-Oriented API is fully backward compatible - you can use both APIs in -the same application as needed. diff --git a/packages/taco/src/client-config.ts b/packages/taco/src/client-config.ts new file mode 100644 index 000000000..c673fb413 --- /dev/null +++ b/packages/taco/src/client-config.ts @@ -0,0 +1,70 @@ +/** + * TacoClient configuration types and utilities + * + * This module contains all configuration interfaces, type definitions, and utility functions + * for configuring TacoClient instances with different blockchain client libraries (viem, ethers.js). + */ + +import { type Account, type PublicClient } from '@nucypher/shared'; +import type { ethers } from 'ethers'; + +import type { DomainName } from './taco-config-validator'; + +/** + * Base configuration for TacoClient + */ +export interface TacoClientBaseConfig { + /** TACo domain name (e.g., 'lynx', 'tapir', 'mainnet') */ + domain: DomainName; + /** Ritual ID for the TACo operations */ + ritualId: number; + /** Optional Porter URIs */ + porterUris?: string[]; +} + +/** + * Viem configuration for TacoClient + */ +export interface TacoClientViemConfig extends TacoClientBaseConfig { + /** Viem PublicClient for blockchain operations */ + viemClient: PublicClient; + /** Viem Account for signing operations */ + viemAccount: Account; +} + +/** + * Ethers configuration for TacoClient + */ +export interface TacoClientEthersConfig extends TacoClientBaseConfig { + /** Ethers Provider for blockchain operations */ + ethersProvider: ethers.providers.Provider; + /** Ethers Signer for signing operations */ + ethersSigner: ethers.Signer; +} + +/** + * Union type for TacoClient configuration - supports both viem and ethers.js + */ +export type TacoClientConfig = TacoClientViemConfig | TacoClientEthersConfig; + +/** + * Type guard to check if config is viem-based + * @param config - TacoClient configuration to check + * @returns True if the configuration is for viem client + */ +export function isViemConfig( + config: TacoClientConfig, +): config is TacoClientViemConfig { + return 'viemClient' in config && 'viemAccount' in config; +} + +/** + * Type guard to check if config is ethers-based + * @param config - TacoClient configuration to check + * @returns True if the configuration is for ethers client + */ +export function isEthersConfig( + config: TacoClientConfig, +): config is TacoClientEthersConfig { + return 'ethersProvider' in config && 'ethersSigner' in config; +} diff --git a/packages/taco/src/domains.ts b/packages/taco/src/domains.ts deleted file mode 100644 index c87558ec4..000000000 --- a/packages/taco/src/domains.ts +++ /dev/null @@ -1,379 +0,0 @@ -/** - * TACo Domain Configuration - * - * Domain configuration for TACo operations - */ - -/** - * TACo domain configuration interface - */ -export interface TacoDomainConfig { - /** Suggested provider RPC URLs for L2 operations */ - suggestedProviderRpcUrls: string[]; - /** Available ritual IDs */ - rituals: number[]; -} - -export type DomainName = 'lynx' | 'tapir' | 'mainnet'; - -/** - * Complete TACo domain configuration - * - * needed for TACo operations including chain IDs, RPC URLs, and ritual management. - * - * ## Available Domains: - * - * ### `lynx` - DEVNET: Bleeding-edge developer network - * - **Network Type**: DEVNET (Development/Experimental) - * - **Production Status**: Non-Production (Testnet/Development) - * - **L1**: Sepolia (11155111), **L2**: Polygon Amoy (80002) - * - **Portal**: https://lynx-3.nucypher.network:9151/status - * - **Status**: Testnet (Development) - May have breaking changes - * - **Rituals**: [27] - Open ritual, no encryptor restrictions - **Cohort**: 2-of-3 - * - * ### `tapir` - TESTNET: Stable testnet for current TACo release - * - **Network Type**: TESTNET (Testing/Stable) - * - **Production Status**: Non-Production (Testnet/Testing) - * - **Recommended for**: TACo application testing and development - * - **Chain ID**: 80002 (Polygon Amoy) - * - **Portal**: https://tapir-2.nucypher.network:9151/status - * - **Status**: Testnet (Stable) - Recommended for development and testing - * - **Rituals**: [6] - Open ritual, no encryptor restrictions - **Cohort**: 4-of-6 - * - * ### `mainnet` - MAINNET: Production network - * - **Network Type**: MAINNET (Production) - * - **Production Status**: Production (Live/Real Data) - * - **Use Case**: Live TACo applications with real data and users - * - **Chain ID**: 137 (Polygon) - * - **Portal**: Contact TACo team for production monitoring Portal - * - **Status**: Production - Requires custom ritual setup and payment - * - **Rituals**: Custom rituals only - contact TACo team - * - * @example - * ```typescript - * // Access domain configuration - * const lynxConfig = TACO_DOMAINS.lynx; - * console.log(lynxConfig.suggestedProviderRpcUrls); - * console.log(lynxConfig.rituals); - * - * // Use with TacoClient - * const client = new TacoClient({ - * domain: 'lynx', // DEVNET environment - * ritualId: 27, // Open ritual - * // ... other config - * }); - * ``` - * - * @see {@link getDomainMetadata} For programmatic access to domain metadata - * @see {@link DOMAIN_METADATA} For structured domain information - */ -export const TACO_DOMAINS: Record = { - // lynx - DEVNET: Bleeding-edge developer network - lynx: { - suggestedProviderRpcUrls: [ - 'https://rpc-amoy.polygon.technology', - 'https://polygon-amoy.drpc.org', - ], - rituals: [ - 27, // Open ritual, no encryptor restrictions - // Contact TACo team if you would like to perform a new ritual and obtain a new custom ritual id on devnet. - ], - }, - // tapir - TESTNET: Stable testnet for current TACo release - tapir: { - suggestedProviderRpcUrls: [ - 'https://rpc-amoy.polygon.technology', - 'https://polygon-amoy.drpc.org', - ], - rituals: [ - 6, // Open ritual, no encryptor restrictions - ], - }, - // mainnet - MAINNET: Production network - mainnet: { - suggestedProviderRpcUrls: [ - 'https://polygon-rpc.com', - 'https://rpc-mainnet.polygon.technology', - ], - rituals: [ - // No open rituals - all custom - // Contact TACo team to set up a custom ritual for your production use on mainnet. - ], - }, -}; - -/** - * TACo Domain Name Constants - * - * Convenient constants for referencing TACo domain names in a type-safe manner. - * Use these constants instead of hardcoded strings for better maintainability. - * - * @example - * ```typescript - * import { TacoDomains } from '@nucypher/taco'; - * - * const client = new TacoClient({ - * domain: TacoDomains.TESTNET, // 'tapir' - * ritualId: 6, - * // ... - * }); - * ``` - */ -export const TacoDomains = { - /** DEVNET domain ('lynx') - Bleeding-edge developer network */ - DEVNET: 'lynx', - /** TESTNET domain ('tapir') - Stable testnet for current TACo release */ - TESTNET: 'tapir', - /** MAINNET domain ('mainnet') - Production network */ - MAINNET: 'mainnet', -} as const; - -/** - * TACo domain configuration input interface - */ -export interface TacoDomainConfigInput { - domain?: DomainName; - ritualId?: number; - porterUris?: string[]; -} - -/** - * Processed TACo domain configuration interface - */ -export interface ProcessedTacoDomainConfig { - domain: DomainName; - ritualId: number; - rpcUrl?: string | null; - porterUris?: string[] | undefined; -} - -/** - * Generic validation result interface - */ -export interface ValidationResult { - isValid: boolean; - errors: string[]; - config?: ProcessedTacoDomainConfig | undefined; -} - -/** - * TACo Configuration and Domain Management - * - * Unified class for TACo domain configuration, validation, and normalization. - * Provides comprehensive domain management with auto-correction and validation. - */ -export class TacoConfig { - /** - * Get all supported TACo domain names - * @returns {string[]} Array of supported TACo domain names ('lynx', 'tapir', 'mainnet') - */ - static getSupportedDomains(): DomainName[] { - return Object.keys(TACO_DOMAINS) as DomainName[]; - } - - /** - * Check if domain is valid - * @param domain - TACo domain name to check ('lynx', 'tapir', 'mainnet') - * @returns {boolean} True if domain exists - */ - static isValidDomain(domain: DomainName): boolean { - return !!domain && TACO_DOMAINS[domain] !== undefined; - } - - /** - * Check if a TACo domain is a production domain - * @param domain - TACo domain name to check - * @returns {boolean} True if domain is production ('mainnet') - */ - static isProductionDomain(domain: DomainName): boolean { - return domain === 'mainnet'; - } - - // ======================================== - // Ritual Management - // ======================================== - - /** - * Get default ritual ID for a domain - * @param domain - Domain name - * @returns {number|null} Default ritual ID or null if none available - */ - static getDefaultRitualId(domain: DomainName): number | null { - if (!this.isValidDomain(domain)) return null; - const config = TACO_DOMAINS[domain]; - - // Return first ritual ID, or null if no rituals available - return config.rituals.length > 0 ? config.rituals[0] : null; - } - - /** - * Get available rituals for a domain - * @param domain - Domain name - * @returns {number[]} Array of available ritual IDs - */ - static getAvailableRituals(domain: DomainName): number[] { - if (!this.isValidDomain(domain)) return []; - return TACO_DOMAINS[domain].rituals; - } - - /** - * Get default RPC URL for a domain - * @param domain - Domain name - * @returns {string|null} Default RPC URL or null if domain invalid - */ - static getDefaultRpcUrl(domain: DomainName): string | null { - if (!this.isValidDomain(domain)) return null; - return TACO_DOMAINS[domain].suggestedProviderRpcUrls[0]; - } - - /** - * Check if ritual ID is valid for a domain - * @param domain - Domain name - * @param ritualId - Ritual ID to validate - * @returns {boolean} True if ritual ID is valid for the domain - */ - static isValidRitualId(domain: DomainName, ritualId: number): boolean { - if (!this.isValidDomain(domain)) return false; - const config = TACO_DOMAINS[domain]; - - // For mainnet, any positive number is valid (custom rituals) - if (domain === 'mainnet') { - return typeof ritualId === 'number' && ritualId > 0; - } - - // For testnets, check if ritual ID is in the allowed list - return config.rituals.includes(ritualId); - } - - // ======================================== - // Configuration Management Methods - // ======================================== - - /** - * Validate a TACo configuration (pure validation only) - * @param config - Configuration to validate - * @returns {ValidationResult} Validation result with isValid, errors, and config - */ - static validate(config: TacoDomainConfigInput): ValidationResult { - const errors: string[] = []; - - if (!config.domain) { - errors.push('Domain is required'); - } else if (!this.isValidDomain(config.domain)) { - errors.push( - `Invalid domain: ${config.domain}. Supported: ${this.getSupportedDomains().join(', ')}`, - ); - } - - // Validate ritual ID - if (config.domain && this.isValidDomain(config.domain)) { - if (this.isProductionDomain(config.domain)) { - // Mainnet requires a custom ritual ID - if (!config.ritualId) { - errors.push( - 'Mainnet requires a custom ritual ID (contact TACo team for setup)', - ); - } else if (!this.isValidRitualId(config.domain, config.ritualId)) { - errors.push( - 'Invalid ritual ID for mainnet (must be positive number)', - ); - } - } else { - // Testnets can have default ritual IDs - if ( - config.ritualId && - !this.isValidRitualId(config.domain, config.ritualId) - ) { - const availableRituals = this.getAvailableRituals(config.domain); - errors.push( - `Invalid ritual ID for ${config.domain}. Available: ${availableRituals.join(', ')}`, - ); - } - // If no ritualId is provided, ensure a default exists - if (!config.ritualId) { - const def = this.getDefaultRitualId(config.domain); - if (def == null) { - errors.push(`No default ritual available for ${config.domain}`); - } - } - } - } - - return { - isValid: errors.length === 0, - errors, - config: - errors.length === 0 - ? { - domain: config.domain!, - ritualId: - config.ritualId ?? this.getDefaultRitualId(config.domain!)!, - } - : undefined, - }; - } - - /** - * Process and auto-correct user configuration - * @param userConfig - User provided configuration - * @returns {ProcessedTacoDomainConfig} Fully processed and normalized configuration - * @throws {Error} If configuration is invalid after auto-correction - */ - static process(userConfig: TacoDomainConfigInput): ProcessedTacoDomainConfig { - // Step 1: Auto-correct common mistakes - const config = { ...userConfig }; - - // Auto-correct domain name and handle legacy domain names - if (typeof config.domain === 'string') { - const lowerDomain = config.domain.toLowerCase(); - - // Check if it's already a valid TACo domain name - if (this.getSupportedDomains().includes(lowerDomain as DomainName)) { - config.domain = lowerDomain as DomainName; - } else { - // Handle if the uses passed the domain type (taco network type) instead of the domain name - (DEVNET -> lynx, TESTNET -> tapir, MAINNET -> mainnet) - const legacyMapping: Record = { - devnet: 'lynx', - testnet: 'tapir', - mainnet: 'mainnet', - }; - - if (lowerDomain in legacyMapping) { - config.domain = legacyMapping[lowerDomain] as DomainName; - } - } - } - - // Auto-set default ritual ID for testnets if missing - if (config.domain && this.isValidDomain(config.domain)) { - if (!config.ritualId) { - const defaultRitualId = this.getDefaultRitualId(config.domain); - if (defaultRitualId !== null) { - config.ritualId = defaultRitualId; - } - } - } - - // Step 2: Validate the corrected configuration - const validation = this.validate(config); - if (!validation.isValid) { - throw new Error( - `TACo Configuration Error: ${validation.errors.join(', ')}`, - ); - } - - // At this point we know domain and ritualId are defined due to validation - const domain = config.domain!; - const ritualId = config.ritualId!; - - // Step 3: Normalize with additional configuration - const normalizedConfig: ProcessedTacoDomainConfig = { - domain, - ritualId, - rpcUrl: this.getDefaultRpcUrl(domain), - porterUris: config.porterUris, - }; - - return normalizedConfig; - } -} diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 43e8568c0..f70d32833 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -14,19 +14,20 @@ export * as conditions from './conditions'; export { decrypt, encrypt } from './encrypt-decrypt'; export { encryptWithPublicKey } from './taco'; -// Object-Oriented Interface +// TaCo Configuration and Client +export { + DOMAINS, + DOMAIN_NAMES, + type DomainName, + type ValidationResult, +} from './taco-config-validator'; + +// TacoConfigValidator is internal-only, not exported + +export { TacoClient } from './taco-client'; + export { - TacoClient, type TacoClientConfig, type TacoClientEthersConfig, type TacoClientViemConfig, -} from './taco-client'; - -export { - TACO_DOMAINS, - TacoConfig, - TacoDomains, - type DomainName, -} from './domains'; - -export { LogLevel, Logger } from './utils/logger'; +} from './client-config'; diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/taco-client.ts index 3be5175b2..8cc285717 100644 --- a/packages/taco/src/taco-client.ts +++ b/packages/taco/src/taco-client.ts @@ -7,74 +7,19 @@ */ import { ThresholdMessageKit } from '@nucypher/nucypher-core'; -import { type Account, type PublicClient } from '@nucypher/shared'; -import type { ethers } from 'ethers'; +import { + isEthersConfig, + isViemConfig, + type TacoClientConfig, +} from './client-config'; import { Condition } from './conditions/condition'; import { ConditionContext } from './conditions/context'; -import { type DomainName, TacoConfig, ValidationResult } from './domains'; -import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; -import { Logger, LogLevel } from './utils/logger'; -import { decryptWithViem, encryptWithViem } from './viem-taco'; - -/** - * Base configuration for TacoClient - */ -export interface TacoClientBaseConfig { - /** TACo domain name (e.g., 'lynx', 'tapir', 'mainnet') */ - domain: DomainName; - /** Ritual ID for the TACo operations */ - ritualId: number; - /** Optional Porter URIs */ - porterUris?: string[]; - /** Optional Logger instance. If not provided, a new Logger will be created. */ - logger?: Logger; - /** Optional logger configuration (ignored if logger is provided) */ - logLevel?: LogLevel; -} - -/** - * Viem configuration for TacoClient - */ -export interface TacoClientViemConfig extends TacoClientBaseConfig { - /** Viem PublicClient for blockchain operations */ - viemClient: PublicClient; - /** Viem Account for signing operations */ - viemAccount: Account; -} - -/** - * Ethers configuration for TacoClient - */ -export interface TacoClientEthersConfig extends TacoClientBaseConfig { - /** Ethers Provider for blockchain operations */ - ethersProvider: ethers.providers.Provider; - /** Ethers Signer for signing operations */ - ethersSigner: ethers.Signer; -} - -/** - * Union type for TacoClient configuration - supports both viem and ethers.js - */ -export type TacoClientConfig = TacoClientViemConfig | TacoClientEthersConfig; - -/** - * Type guard to check if config is viem-based - */ -function isViemConfig( - config: TacoClientConfig, -): config is TacoClientViemConfig { - return 'viemClient' in config && 'viemAccount' in config; -} - -/** - * Type guard to check if config is ethers-based - */ -function isEthersConfig( - config: TacoClientConfig, -): config is TacoClientEthersConfig { - return 'ethersProvider' in config && 'ethersSigner' in config; -} +import { decrypt, encrypt } from './encrypt-decrypt'; +import { + TacoConfigValidator, + type ValidationResult, +} from './taco-config-validator'; /** * TacoClient provides an object-oriented interface for TACo operations @@ -114,7 +59,8 @@ function isEthersConfig( * * // Simple encryption/decryption * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); - * const decrypted = await tacoClient.decryptWithAutoContext(messageKit); + * const context = await tacoClient.createConditionContext(messageKit); + * const decrypted = await tacoClient.decrypt(messageKit, context); * ``` * * @example Using with ethers.js: @@ -141,105 +87,62 @@ function isEthersConfig( * * // Simple encryption/decryption * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); - * const decrypted = await tacoClient.decryptWithAutoContext(messageKit); + * const context = await tacoClient.createConditionContext(messageKit); + * const decrypted = await tacoClient.decrypt(messageKit, context); * ``` */ export class TacoClient { private config: TacoClientConfig; - private logger: Logger; - private domain: DomainName; /** * Create a new TacoClient instance * - * @param config - TacoClient configuration + * @param config - Configuration for the TacoClient * @throws {Error} If configuration is invalid */ constructor(config: TacoClientConfig) { - // Use provided logger or create a new one - this.logger = - config.logger || - new Logger({ - level: config.logLevel || LogLevel.INFO, - component: 'TacoClient', - }); - - // Validate and process the configuration - const processedConfig = TacoClient.validateConfig(config); - if (!processedConfig.isValid) { - throw new Error( - `TacoClient Configuration Error: ${processedConfig.errors.join(', ')}`, - ); + // Validate configuration using TacoConfig + const result = TacoConfigValidator.validateFast(config); + if (!result.isValid) { + throw new Error(`Invalid configuration: ${result.errors.join(', ')}`); } this.config = config; - this.domain = this.getDomainFromConfig(config.domain); - this.logger.debug(`TacoClient initialized`, { + console.debug(`TacoClient initialized`, { domain: this.config.domain, ritualId: this.config.ritualId, }); } /** - * Validate TacoClient configuration + * Fully validate the configuration including network provider checks + * + * This method performs comprehensive validation including: + * - Domain and ritual ID validation + * - Provider/signer configuration validation + * - Network compatibility check (calls provider to verify chain ID matches domain) + * + * @returns {Promise} Promise resolving to validation result with isValid boolean and errors array * - * @param config - Configuration to validate - * @returns {ValidationResult} Validation result + * @example + * ```typescript + * const result = await tacoClient.validateConfig(); + * if (!result.isValid) { + * console.error('Configuration errors:', result.errors); + * } + * ``` */ - static validateConfig(config: TacoClientConfig): ValidationResult { - const errors: string[] = []; - - // Validate TACo domain configuration - const tacoValidation = TacoConfig.validate({ - domain: config.domain, - ritualId: config.ritualId, - }); - - if (!tacoValidation.isValid) { - errors.push(...tacoValidation.errors); - } - - // Validate required blockchain objects - if (isViemConfig(config)) { - // Validate viem objects - if (!config.viemClient) { - errors.push('viemClient is required for viem configuration'); - } - if (!config.viemAccount) { - errors.push('viemAccount is required for viem configuration'); - } - } else if (isEthersConfig(config)) { - // Validate ethers objects - if (!config.ethersProvider) { - errors.push('ethersProvider is required for ethers configuration'); - } - if (!config.ethersSigner) { - errors.push('ethersSigner is required for ethers configuration'); - } - } else { - errors.push( - 'Configuration must include either viem objects (viemClient + viemAccount) or ethers objects (ethersProvider + ethersSigner)', + async validateConfig(): Promise { + const validationResult = await TacoConfigValidator.validateFull( + this.config, + ); + if (!validationResult.isValid) { + throw new Error( + `Invalid configuration: ${validationResult.errors.join(', ')}`, ); } - - return { - isValid: errors.length === 0, - errors, - config: errors.length === 0 ? config : undefined, - }; - } - - /** - * Get the domain object for porter operations - * - * @param domainName - TACo domain name (e.g., 'lynx', 'tapir', 'mainnet') - * @returns {DomainName} Porter domain - */ - private getDomainFromConfig(domainName: string): DomainName { - // DomainName validity is ensured by prior validation in the constructor - // The domain name is already the actual TACo domain string - return domainName as DomainName; + return validationResult; } /** @@ -258,7 +161,7 @@ export class TacoClient { data: string | Uint8Array, accessCondition: Condition, ): Promise { - this.logger.debug('Starting encryption', { + console.debug('Starting encryption', { domain: this.config.domain, ritualId: this.config.ritualId, dataType: typeof data, @@ -270,9 +173,9 @@ export class TacoClient { if (isViemConfig(this.config)) { // Use viem API - messageKit = await encryptWithViem( + messageKit = await encrypt( this.config.viemClient, - this.domain, + this.config.domain, data, accessCondition, this.config.ritualId, @@ -280,9 +183,9 @@ export class TacoClient { ); } else if (isEthersConfig(this.config)) { // Use ethers API - messageKit = await ethersEncrypt( + messageKit = await encrypt( this.config.ethersProvider, - this.domain, + this.config.domain, data, accessCondition, this.config.ritualId, @@ -294,10 +197,9 @@ export class TacoClient { ); } - this.logger.info('Encryption successful'); + console.info('Encryption successful'); return messageKit; } catch (error) { - this.logger.error('Encryption failed', error); throw new Error(`TaCo encryption failed: ${error}`); } } @@ -318,7 +220,7 @@ export class TacoClient { messageKit: ThresholdMessageKit, conditionContext?: ConditionContext, ): Promise { - this.logger.debug('Starting decryption', { + console.debug('Starting decryption', { domain: this.config.domain, hasContext: !!conditionContext, }); @@ -328,18 +230,18 @@ export class TacoClient { if (isViemConfig(this.config)) { // Use viem API - decrypted = await decryptWithViem( + decrypted = await decrypt( this.config.viemClient, - this.domain, + this.config.domain, messageKit, conditionContext, this.config.porterUris, ); } else if (isEthersConfig(this.config)) { // Use ethers API - decrypted = await ethersDecrypt( + decrypted = await decrypt( this.config.ethersProvider, - this.domain, + this.config.domain, messageKit, conditionContext, this.config.porterUris, @@ -350,68 +252,13 @@ export class TacoClient { ); } - this.logger.info('Decryption successful'); + console.info('Decryption successful'); return decrypted; } catch (error) { - this.logger.error('Decryption failed', error); throw new Error(`TaCo decryption failed: ${error}`); } } - /** - * Decrypt a message kit with automatic condition context creation - * - * This is a convenience method that automatically creates the condition context - * for time-based conditions, making decryption simpler for common use cases. - * - * @param messageKit - Encrypted message kit - * @returns {Promise} Decrypted data - * - * @example - * ```typescript - * const decrypted = await tacoClient.decryptWithAutoContext(messageKit); - * ``` - */ - async decryptWithAutoContext( - messageKit: ThresholdMessageKit, - ): Promise { - this.logger.debug('Starting decryption with auto context'); - - try { - // For auto context, we create a condition context with current time - const conditionContext = await this.createConditionContext(messageKit); - return await this.decrypt(messageKit, conditionContext); - } catch (error) { - this.logger.error('Auto-context decryption failed', error); - throw new Error(`TaCo auto-context decryption failed: ${error}`); - } - } - - /** - * Create a condition context for the given message kit - * - * @param messageKit - Message kit to create context for - * @param customViemAccount - Optional custom viem account (defaults to instance account) - * @returns {Promise} Condition context - * - * @example - * ```typescript - * const context = await tacoClient.createConditionContext(messageKit); - * const decrypted = await tacoClient.decrypt(messageKit, context); - * ``` - */ - async createConditionContext( - messageKit: ThresholdMessageKit, - ): Promise { - this.logger.debug('Creating condition context'); - - // Create condition context from the message kit's conditions - const conditionContext = ConditionContext.fromMessageKit(messageKit); - - this.logger.debug('Condition context created successfully'); - return conditionContext; - } - /** * Get current client configuration * diff --git a/packages/taco/src/taco-config-validator.ts b/packages/taco/src/taco-config-validator.ts new file mode 100644 index 000000000..2f0636acb --- /dev/null +++ b/packages/taco/src/taco-config-validator.ts @@ -0,0 +1,294 @@ +/** + * TACo Domain Configuration and Validation + * + * This module provides domain configuration management, validation utilities, + * and configuration processing for TACo operations across different networks. + */ + +import { ethers } from 'ethers'; +import type { PublicClient } from 'viem'; + +import type { TacoClientConfig } from './client-config'; + +export type DomainName = 'lynx' | 'tapir' | 'mainnet'; + +/** + * TACo domain configuration with essential network data + * + * Contains domain names, chain IDs, and core infrastructure information + * needed for TACo operations across different networks. + * + * ## Available Domains: + * + * ### `lynx` - DEVNET: Bleeding-edge developer network + * - **Network Type**: DEVNET (Development/Experimental) + * - **Chain ID**: 80002 (Polygon Amoy) + * - **Status**: Testnet (Development) - May have breaking changes + * - **Rituals**: Open ritual available - **Cohort**: 2-of-3 + * + * ### `tapir` - TESTNET: Stable testnet for current TACo release + * - **Network Type**: TESTNET (Testing/Stable) + * - **Chain ID**: 80002 (Polygon Amoy) + * - **Status**: Testnet (Stable) - Recommended for testing + * - **Rituals**: Stable ritual configuration - **Cohort**: 3-of-5 + * + * ### `mainnet` - MAINNET: Production network for live applications + * - **Network Type**: MAINNET (Production) + * - **Chain ID**: 137 (Polygon) + * - **Status**: Production (Live) - For real applications + * - **Rituals**: Production ritual configuration - **Cohort**: 5-of-8 + * + * @example + * ```typescript + * // Get domain information + * const lynxInfo = DOMAINS.DEVNET; + * console.log(lynxInfo.domain); // 'lynx' + * console.log(lynxInfo.chainId); // 80002 + * ``` + */ +export const DOMAINS = { + // lynx - DEVNET: Bleeding-edge developer network + DEVNET: { + domain: 'lynx', + chainId: 80002, + }, + // tapir - TESTNET: Stable testnet for current TACo release + TESTNET: { + domain: 'tapir', + chainId: 80002, + }, + // mainnet - MAINNET: Production network + MAINNET: { + domain: 'mainnet', + chainId: 137, + }, +} as const; + +/** + * TACo Domain Name Constants + * + * Convenient constants for referencing TACo domain names in a type-safe manner. + * Use these constants instead of hardcoded strings for better maintainability. + */ +export const DOMAIN_NAMES = { + /** DEVNET domain ('lynx') - Bleeding-edge developer network */ + DEVNET: 'lynx', + /** TESTNET domain ('tapir') - Stable testnet for current TACo release */ + TESTNET: 'tapir', + /** MAINNET domain ('mainnet') - Production network */ + MAINNET: 'mainnet', +} as const; + +/** + * Domain-ChainId validation type - creates a discriminated union + * where each domain is linked to its specific chainId + */ +export type DomainChainConfig = { + [K in keyof typeof DOMAINS]: { + domain: (typeof DOMAINS)[K]['domain']; + chainId: (typeof DOMAINS)[K]['chainId']; + }; +}[keyof typeof DOMAINS]; + +/** + * Validates that the provided domain and chainId combination is correct + * TypeScript will enforce that only valid domain/chainId pairs are accepted + */ +export function validateDomainChain(config: DomainChainConfig): boolean { + const domainInfo = Object.values(DOMAINS).find( + (info) => info.domain === config.domain, + ); + return !!domainInfo && domainInfo.chainId === config.chainId; +} + +/** + * Generic validation result interface + */ +export interface ValidationResult { + isValid: boolean; + errors: string[]; +} + +/** + * TACo Configuration Validator + * + * Validates TACo client configurations, domains, and provider compatibility. + * Provides both fast and full validation methods for TACo operations. + */ +export class TacoConfigValidator { + /** + * Get all supported TACo domain names + * @returns {DomainName[]} Array of supported TACo domain names ('lynx', 'tapir', 'mainnet') + */ + static getSupportedDomains(): DomainName[] { + return Object.values(DOMAINS).map((domain) => domain.domain); + } + + /** + * Check if domain is valid + * @param domain - TACo domain name to check ('lynx', 'tapir', 'mainnet') + * @returns {boolean} True if domain exists + */ + static isValidDomain(domain: DomainName): boolean { + return !!domain && this.getSupportedDomains().includes(domain); + } + + /** + * Validate ritual ID (basic validation - positive number only) + * @param domain - Domain name (unused but kept for API compatibility) + * @param ritualId - Ritual ID to validate + * @returns {boolean} True if valid (positive number) + */ + static isValidRitualId(domain: DomainName, ritualId: number): boolean { + return typeof ritualId === 'number' && ritualId > 0; + } + + /** + * Validate provider compatibility with domain + * @param domain - Domain name + * @param provider - Provider to validate (viem PublicClient or ethers Provider) + * @returns {Promise} True if provider is valid for domain + */ + static async isValidProvider( + domain: DomainName, + provider: PublicClient | ethers.providers.Provider, + ): Promise { + let chainId: number; + + try { + // Try to detect provider type and get chain ID safely + if (provider && typeof provider === 'object') { + // Check if it's a viem PublicClient (has getChainId method) + if ( + 'getChainId' in provider && + typeof provider.getChainId === 'function' + ) { + chainId = await (provider as PublicClient).getChainId(); + } + // Check if it's an ethers Provider (has getNetwork method) + else if ( + 'getNetwork' in provider && + typeof provider.getNetwork === 'function' + ) { + const network = await ( + provider as ethers.providers.Provider + ).getNetwork(); + chainId = network.chainId; + } else { + // Unknown provider type + return false; + } + } else { + // Invalid provider + return false; + } + } catch (error) { + // Error getting chain ID + return false; + } + + // Check if the provider's chain ID matches the domain's expected chain ID + return ( + Object.values(DOMAINS).find( + (domainInfo) => + domainInfo.domain === domain && domainInfo.chainId === chainId, + ) !== undefined + ); + } + + /** + * Fast validation (everything except provider network checks) + * @param config - Configuration to validate + * @returns {ValidationResult} Validation result + */ + static validateFast(config: TacoClientConfig): ValidationResult { + const errors: string[] = []; + + // Validate domain + if (!config.domain) { + errors.push('The property `domain` is required'); + } else if (!this.isValidDomain(config.domain)) { + errors.push( + `Invalid domain name: ${config.domain}. Supported domains: ${this.getSupportedDomains().join(', ')}`, + ); + } + + // Validate ritual ID + if (!config.ritualId) { + errors.push('The property `ritualId` is required'); + } else if (!this.isValidRitualId(config.domain, config.ritualId)) { + errors.push( + `Invalid ritual ID: ${config.ritualId} for domain ${config.domain}`, + ); + } + + // Validate blockchain client configuration + if ('viemClient' in config) { + // Viem configuration + if (!config.viemClient) { + errors.push('viemClient is required for viem configuration'); + } + if (!config.viemAccount) { + errors.push('viemAccount is required for viem configuration'); + } + } else if ('ethersProvider' in config) { + // Ethers configuration + if (!config.ethersProvider) { + errors.push('ethersProvider is required for ethers configuration'); + } + if (!config.ethersSigner) { + errors.push('ethersSigner is required for ethers configuration'); + } + } else { + errors.push( + 'Configuration must include either viem objects (viemClient + viemAccount) or ethers objects (ethersProvider + ethersSigner)', + ); + } + + return { isValid: errors.length === 0, errors }; + } + + /** + * Full validation including provider network checks + * @param config - Configuration to validate + * @returns {Promise} Validation result with provider validation + */ + static async validateFull( + config: TacoClientConfig, + ): Promise { + // First run fast validation + const fastResult = this.validateFast(config); + if (!fastResult.isValid) { + return fastResult; + } + + const errors: string[] = []; + + // Additional async provider validation + let provider: PublicClient | ethers.providers.Provider | undefined; + + if ('viemClient' in config) { + provider = config.viemClient; + } else if ('ethersProvider' in config) { + provider = config.ethersProvider; + } + + // Validate provider compatibility with domain (if both exist) + if (provider && config.domain) { + const isValidProvider = await this.isValidProvider( + config.domain, + provider, + ); + if (!isValidProvider) { + errors.push( + `Invalid provider for domain: ${config.domain}. Provider chain ID does not match domain requirements.`, + ); + } + } + + return { + isValid: errors.length === 0, + errors, + }; + } +} diff --git a/packages/taco/test/client.test.ts b/packages/taco/test/client.test.ts index 72d369d05..ecdf65bf2 100644 --- a/packages/taco/test/client.test.ts +++ b/packages/taco/test/client.test.ts @@ -9,14 +9,16 @@ import type { ethers } from 'ethers'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { - type DomainName, - TACO_DOMAINS, + DOMAINS, TacoClient, - TacoClientConfig, - TacoClientEthersConfig, - TacoClientViemConfig, - TacoConfig, + type TacoClientConfig, + type TacoClientEthersConfig, + type TacoClientViemConfig, } from '../src'; +import { + type DomainName, + TacoConfigValidator, +} from '../src/taco-config-validator'; // Mock viem dependencies const mockViemClient = { @@ -51,163 +53,73 @@ const mockEthersSigner = { provider: mockEthersProvider, } as unknown as ethers.Signer; -describe('TacoConfig', () => { +describe('TacoConfigValidator', () => { describe('Domain Management', () => { it('should return all supported domains', () => { - const domains = TacoConfig.getSupportedDomains(); + const domains = TacoConfigValidator.getSupportedDomains(); expect(domains).toEqual(['lynx', 'tapir', 'mainnet']); }); it('should validate domain names correctly', () => { - expect(TacoConfig.isValidDomain('tapir')).toBe(true); - expect(TacoConfig.isValidDomain('lynx')).toBe(true); - expect(TacoConfig.isValidDomain('mainnet')).toBe(true); - expect(TacoConfig.isValidDomain('INVALID' as DomainName)).toBe(false); - expect(TacoConfig.isValidDomain('' as DomainName)).toBe(false); - }); - - it('should identify production domains', () => { - expect(TacoConfig.isProductionDomain('mainnet')).toBe(true); - expect(TacoConfig.isProductionDomain('tapir')).toBe(false); - expect(TacoConfig.isProductionDomain('lynx')).toBe(false); - }); - - it('should return correct default ritual IDs', () => { - expect(TacoConfig.getDefaultRitualId('lynx')).toBe(27); - expect(TacoConfig.getDefaultRitualId('tapir')).toBe(6); - expect(TacoConfig.getDefaultRitualId('mainnet')).toBe(null); - expect(TacoConfig.getDefaultRitualId('INVALID' as DomainName)).toBe(null); - }); - - it('should return available rituals for domains', () => { - expect(TacoConfig.getAvailableRituals('lynx')).toEqual([27]); - expect(TacoConfig.getAvailableRituals('tapir')).toEqual([6]); - expect(TacoConfig.getAvailableRituals('mainnet')).toEqual([]); - expect(TacoConfig.getAvailableRituals('INVALID' as DomainName)).toEqual( - [], + expect(TacoConfigValidator.isValidDomain('tapir')).toBe(true); + expect(TacoConfigValidator.isValidDomain('lynx')).toBe(true); + expect(TacoConfigValidator.isValidDomain('mainnet')).toBe(true); + expect(TacoConfigValidator.isValidDomain('INVALID' as DomainName)).toBe( + false, ); + expect(TacoConfigValidator.isValidDomain('' as DomainName)).toBe(false); }); - it('should validate ritual IDs correctly', () => { - // Valid ritual IDs for testnets - expect(TacoConfig.isValidRitualId('lynx', 27)).toBe(true); - expect(TacoConfig.isValidRitualId('tapir', 6)).toBe(true); - - // Invalid ritual IDs for testnets - expect(TacoConfig.isValidRitualId('lynx', 999)).toBe(false); - expect(TacoConfig.isValidRitualId('tapir', 999)).toBe(false); - - // Mainnet accepts any positive number - expect(TacoConfig.isValidRitualId('mainnet', 42)).toBe(true); - expect(TacoConfig.isValidRitualId('mainnet', 1)).toBe(true); - expect(TacoConfig.isValidRitualId('mainnet', 0)).toBe(false); - }); - }); - - describe('Configuration Processing', () => { - it('should process valid testnet configuration', () => { - const config = TacoConfig.process({ - domain: 'tapir', - ritualId: 6, - }); - - expect(config.domain).toBe('tapir'); - expect(config.ritualId).toBe(6); - expect(config.rpcUrl).toBeDefined(); - }); - - it('should use domain names as-is when valid', () => { - const config = TacoConfig.process({ - domain: 'tapir', - }); - - expect(config.domain).toBe('tapir'); - expect(config.ritualId).toBe(6); // Auto-set default - }); - - it('should support legacy domain name mapping', () => { - const devnetConfig = TacoConfig.process({ - domain: 'devnet' as DomainName, - }); - expect(devnetConfig.domain).toBe('lynx'); - - const testnetConfig = TacoConfig.process({ - domain: 'testnet' as DomainName, - }); - expect(testnetConfig.domain).toBe('tapir'); - - const mainnetConfig = TacoConfig.process({ - domain: 'mainnet', - ritualId: 42, - }); - expect(mainnetConfig.domain).toBe('mainnet'); - }); - - it('should auto-set default ritual IDs for testnets', () => { - const devnetConfig = TacoConfig.process({ - domain: 'lynx', - }); - expect(devnetConfig.ritualId).toBe(27); - - const testnetConfig = TacoConfig.process({ - domain: 'tapir', - }); - expect(testnetConfig.ritualId).toBe(6); - }); - - it('should throw for invalid configurations', () => { - expect(() => - TacoConfig.process({ - domain: 'INVALID_DOMAIN' as DomainName, - }), - ).toThrow('TACo Configuration Error'); - - expect(() => - TacoConfig.process({ - domain: 'tapir', - ritualId: 999, - }), - ).toThrow('Invalid ritual ID'); - - expect(() => - TacoConfig.process({ - domain: 'mainnet', - // Missing required ritualId for mainnet - }), - ).toThrow('Mainnet requires a custom ritual ID'); + it('should validate ritual IDs correctly (positive numbers only)', () => { + // Any positive number is valid for any domain + expect(TacoConfigValidator.isValidRitualId('lynx', 27)).toBe(true); + expect(TacoConfigValidator.isValidRitualId('tapir', 6)).toBe(true); + expect(TacoConfigValidator.isValidRitualId('mainnet', 42)).toBe(true); + expect(TacoConfigValidator.isValidRitualId('lynx', 999)).toBe(true); + expect(TacoConfigValidator.isValidRitualId('tapir', 999)).toBe(true); + expect(TacoConfigValidator.isValidRitualId('mainnet', 1)).toBe(true); + + // Zero and negative numbers are invalid + expect(TacoConfigValidator.isValidRitualId('mainnet', 0)).toBe(false); + expect(TacoConfigValidator.isValidRitualId('lynx', -1)).toBe(false); + expect(TacoConfigValidator.isValidRitualId('tapir', -5)).toBe(false); }); }); describe('Configuration Validation', () => { it('should validate correct configurations', () => { - const result = TacoConfig.validate({ + const result = TacoConfigValidator.validateFast({ domain: 'tapir', ritualId: 6, + viemClient: mockViemClient, + viemAccount: mockViemAccount, }); expect(result.isValid).toBe(true); expect(result.errors).toHaveLength(0); - expect(result.config).toBeDefined(); }); it('should detect invalid configurations', () => { - const result = TacoConfig.validate({ + const result = TacoConfigValidator.validateFast({ domain: 'INVALID_DOMAIN' as DomainName, ritualId: 999, + viemClient: mockViemClient, + viemAccount: mockViemAccount, }); expect(result.isValid).toBe(false); expect(result.errors.length).toBeGreaterThan(0); - expect(result.config).toBe(undefined); }); it('should require domain', () => { - const result = TacoConfig.validate({ + const result = TacoConfigValidator.validateFast({ ritualId: 6, - }); + viemClient: mockViemClient, + viemAccount: mockViemAccount, + } as TacoClientConfig); expect(result.isValid).toBe(false); - expect(result.errors).toContain('Domain is required'); + expect(result.errors).toContain('The property `domain` is required'); }); }); }); @@ -243,24 +155,44 @@ describe('TacoClient', () => { expect(client).toBeInstanceOf(TacoClient); }); - it('should throw with invalid domain', () => { + it('should throw for invalid domain', () => { expect( () => new TacoClient({ ...validViemConfig, - domain: 'INVALID_DOMAIN' as DomainName, + domain: 'INVALID' as DomainName, }), - ).toThrow('TacoClient Configuration Error'); + ).toThrow('Invalid domain name'); }); - it('should throw when missing viem objects', () => { + it('should throw for invalid ritual ID', () => { expect( () => new TacoClient({ - domain: 'tapir', - ritualId: 6, + ...validViemConfig, + ritualId: -1, + }), + ).toThrow('Invalid ritual ID'); + }); + + it('should throw for missing required domain', () => { + expect( + () => + new TacoClient({ + ...validViemConfig, + domain: undefined, + } as unknown as TacoClientConfig), + ).toThrow('The property `domain` is required'); + }); + + it('should throw for missing required ritual ID', () => { + expect( + () => + new TacoClient({ + ...validViemConfig, + ritualId: undefined, } as unknown as TacoClientConfig), - ).toThrow('Configuration must include either viem objects'); + ).toThrow('The property `ritualId` is required'); }); it('should throw when missing viemClient in viem config', () => { @@ -302,23 +234,44 @@ describe('TacoClient', () => { } as unknown as TacoClientConfig), ).toThrow('ethersSigner is required for ethers configuration'); }); + + it('should throw for mixed configuration types', () => { + expect( + () => + new TacoClient({ + domain: 'tapir', + ritualId: 6, + viemClient: mockViemClient, + ethersProvider: mockEthersProvider, + } as unknown as TacoClientConfig), + ).toThrow('viemAccount is required for viem configuration'); + }); }); describe('Configuration Methods', () => { - it('should return readonly configuration', () => { + it('should return readonly configuration for viem client', () => { const client = new TacoClient(validViemConfig); const config = client.getConfig(); expect(config.domain).toBe('tapir'); expect(config.ritualId).toBe(6); + expect('viemClient' in config).toBe(true); + expect('viemAccount' in config).toBe(true); + + // Should be frozen/readonly + expect(() => { + (config as Record).domain = 'lynx'; + }).toThrow(); }); - it('should return readonly configuration', () => { - const client = new TacoClient(validViemConfig); + it('should return readonly configuration for ethers client', () => { + const client = new TacoClient(validEthersConfig); const config = client.getConfig(); expect(config.domain).toBe('tapir'); expect(config.ritualId).toBe(6); + expect('ethersProvider' in config).toBe(true); + expect('ethersSigner' in config).toBe(true); // Should be frozen/readonly expect(() => { @@ -328,20 +281,20 @@ describe('TacoClient', () => { }); describe('Static Validation', () => { - it('should validate correct viem configuration', () => { - const result = TacoClient.validateConfig(validViemConfig); + it('should validate correct viem configuration', async () => { + const result = await TacoConfigValidator.validateFull(validViemConfig); expect(result.isValid).toBe(true); expect(result.errors).toHaveLength(0); }); - it('should validate correct ethers configuration', () => { - const result = TacoClient.validateConfig(validEthersConfig); + it('should validate correct ethers configuration', async () => { + const result = await TacoConfigValidator.validateFull(validEthersConfig); expect(result.isValid).toBe(true); expect(result.errors).toHaveLength(0); }); - it('should detect missing dependencies', () => { - const result = TacoClient.validateConfig({ + it('should detect missing dependencies', async () => { + const result = await TacoConfigValidator.validateFull({ domain: 'tapir', ritualId: 6, // Missing blockchain objects @@ -352,36 +305,75 @@ describe('TacoClient', () => { 'Configuration must include either viem objects (viemClient + viemAccount) or ethers objects (ethersProvider + ethersSigner)', ); }); - }); -}); -describe('TACO_DOMAINS', () => { - it('should have correct structure', () => { - expect(TACO_DOMAINS).toBeDefined(); - expect(TACO_DOMAINS.lynx).toBeDefined(); - expect(TACO_DOMAINS.tapir).toBeDefined(); - expect(TACO_DOMAINS.mainnet).toBeDefined(); + it('should detect invalid domain in validation', async () => { + const result = await TacoConfigValidator.validateFull({ + ...validViemConfig, + domain: 'INVALID' as DomainName, + }); + + expect(result.isValid).toBe(false); + expect( + result.errors.some((error) => error.includes('Invalid domain name')), + ).toBe(true); + }); + + it('should detect invalid ritual ID in validation', async () => { + expect( + () => + new TacoClient({ + domain: 'tapir', + ritualId: -5, + viemClient: mockViemClient, + viemAccount: mockViemAccount, + }), + ).toThrow('Invalid ritual ID'); + }); }); - it('should have required properties for each domain', () => { - Object.values(TACO_DOMAINS).forEach((domain) => { - expect(domain.suggestedProviderRpcUrls).toBeInstanceOf(Array); - expect(domain.rituals).toBeInstanceOf(Array); - // isProduction property removed - production status moved to comments + describe('Domain Handling', () => { + it('should work with all supported domains', () => { + const lynxConfig: TacoClientViemConfig = { + domain: 'lynx', + ritualId: 27, + viemClient: mockViemClient, + viemAccount: mockViemAccount, + }; + + const mainnetConfig: TacoClientViemConfig = { + domain: 'mainnet', + ritualId: 42, // Custom ritual ID for mainnet + viemClient: mockViemClient, + viemAccount: mockViemAccount, + }; + + expect(() => new TacoClient(lynxConfig)).not.toThrow(); + expect(() => new TacoClient(validViemConfig)).not.toThrow(); // tapir + expect(() => new TacoClient(mainnetConfig)).not.toThrow(); + }); + + it('should provide correct domain information', () => { + const client = new TacoClient(validViemConfig); + const config = client.getConfig(); + + expect(config.domain).toBe('tapir'); }); }); +}); - it('should have network types documented in comments', () => { - // Network type and production status information moved to comments in domain configuration - // lynx = DEVNET (Non-Production), tapir = TESTNET (Non-Production), mainnet = MAINNET (Production) - // This information is now documented in comments rather than runtime properties - expect(Object.keys(TACO_DOMAINS)).toEqual(['lynx', 'tapir', 'mainnet']); +describe('DOMAINS', () => { + it('should have correct simplified structure', () => { + expect(DOMAINS).toBeDefined(); + expect(Object.keys(DOMAINS)).toContain('DEVNET'); + expect(Object.keys(DOMAINS)).toContain('TESTNET'); + expect(Object.keys(DOMAINS)).toContain('MAINNET'); }); - it('should derive production status from domain names', () => { - // Production status is now derived from domain names rather than stored as properties - expect(TacoConfig.isProductionDomain('lynx')).toBe(false); - expect(TacoConfig.isProductionDomain('tapir')).toBe(false); - expect(TacoConfig.isProductionDomain('mainnet')).toBe(true); + it('should have required properties for each domain', () => { + Object.values(DOMAINS).forEach((domainInfo) => { + expect(domainInfo.domain).toBeDefined(); + expect(domainInfo.chainId).toBeDefined(); + expect(typeof domainInfo.chainId).toBe('number'); + }); }); }); From 153ee7cb1d24e36cb0408cdd1ebb4409a6e312b0 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 26 Aug 2025 10:48:12 +0200 Subject: [PATCH 74/97] add more validations and integration test --- .../taco/integration-test/taco-client.test.ts | 431 ++++++++++++++++++ packages/taco/src/taco-config-validator.ts | 67 ++- 2 files changed, 497 insertions(+), 1 deletion(-) create mode 100644 packages/taco/integration-test/taco-client.test.ts diff --git a/packages/taco/integration-test/taco-client.test.ts b/packages/taco/integration-test/taco-client.test.ts new file mode 100644 index 000000000..231f4bfd2 --- /dev/null +++ b/packages/taco/integration-test/taco-client.test.ts @@ -0,0 +1,431 @@ +import { beforeAll, describe, expect, test } from 'vitest'; + +import { fromBytes, toBytes } from '@nucypher/shared'; +import { PublicClient, WalletClient } from '@nucypher/shared/src/viem-utils'; +import { + EIP4361AuthProvider, + USER_ADDRESS_PARAM_DEFAULT, + ViemEIP4361AuthProvider, +} from '@nucypher/taco-auth'; +import { ethers } from 'ethers'; +import { createPublicClient, createWalletClient, http } from 'viem'; +import { privateKeyToAccount } from 'viem/accounts'; +import { polygonAmoy, sepolia } from 'viem/chains'; +import { + conditions, + decrypt, + encrypt, + initialize, + TacoClient, + ThresholdMessageKit, +} from '../src'; +import { CompoundCondition } from '../src/conditions/compound-condition'; +import { + decrypt as viemDecrypt, + encrypt as viemEncrypt, +} from '../src/viem-taco'; +import { UINT256_MAX } from '../test/test-utils'; + +const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; +const SEPOLIA_RPC_URL = 'https://sepolia.drpc.org'; +const ENCRYPTOR_PRIVATE_KEY = + '0x900edb9e8214b2353f82aa195e915128f419a92cfb8bbc0f4784f10ef4112b86'; +const CONSUMER_PRIVATE_KEY = + '0xf307e165339cb5deb2b8ec59c31a5c0a957b8e8453ce7fe8a19d9a4c8acf36d4'; +const DOMAIN = 'lynx'; +const RITUAL_ID = 27; +const CHAIN_ID = 80002; // Polygon Amoy +const INCOMPATIBLE_CHAIN_ID = 11155111; // Sepolia + +// Create viem accounts from private keys +const encryptorAccount = privateKeyToAccount( + ENCRYPTOR_PRIVATE_KEY as `0x${string}`, +); +const consumerAccount = privateKeyToAccount( + CONSUMER_PRIVATE_KEY as `0x${string}`, +); + +describe.skipIf(!process.env.RUNNING_IN_CI)( + 'TacoClient Integration Test', + () => { + let viemPublicClient: PublicClient; + let viemWalletClient: WalletClient; + let ethersProvider: ethers.providers.JsonRpcProvider; + let encryptorSigner: ethers.Wallet; + let consumerSigner: ethers.Wallet; + + // Incompatible providers (wrong chain) + let incompatibleViemClient: PublicClient; + let incompatibleEthersProvider: ethers.providers.JsonRpcProvider; + + beforeAll(async () => { + // Create viem clients for correct network (Polygon Amoy) + viemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + viemWalletClient = createWalletClient({ + account: consumerAccount, + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + + // Create ethers clients for correct network (Polygon Amoy) + ethersProvider = new ethers.providers.JsonRpcProvider(RPC_PROVIDER_URL); + encryptorSigner = new ethers.Wallet( + ENCRYPTOR_PRIVATE_KEY, + ethersProvider, + ); + consumerSigner = new ethers.Wallet(CONSUMER_PRIVATE_KEY, ethersProvider); + + // Create incompatible clients (wrong chain - Sepolia) + incompatibleViemClient = createPublicClient({ + chain: sepolia, + transport: http(SEPOLIA_RPC_URL), + }); + + incompatibleEthersProvider = new ethers.providers.JsonRpcProvider( + SEPOLIA_RPC_URL, + ); + + // Initialize the library + await initialize(); + + // Verify network connection for correct clients + const viemChainId = await viemPublicClient.getChainId(); + const ethersNetwork = await ethersProvider.getNetwork(); + + if (viemChainId !== CHAIN_ID) { + throw new Error( + `Viem client connected to wrong network. Expected ${CHAIN_ID}, got ${viemChainId}`, + ); + } + + if (ethersNetwork.chainId !== CHAIN_ID) { + throw new Error( + `Ethers provider connected to wrong network. Expected ${CHAIN_ID}, got ${ethersNetwork.chainId}`, + ); + } + }); + + const createTestCondition = () => { + const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '>=', + value: 0, + }, + }); + + const balanceLessThanMaxUint = new conditions.base.rpc.RpcCondition({ + chain: CHAIN_ID, + method: 'eth_getBalance', + parameters: [':userAddress', 'latest'], + returnValueTest: { + comparator: '<', + value: UINT256_MAX, + }, + }); + + return CompoundCondition.and([ + hasPositiveBalance, + balanceLessThanMaxUint, + ]); + }; + + describe('TacoClient with Viem', () => { + test('should encrypt and decrypt a message using TacoClient with viem', async () => { + // Create TacoClient with viem configuration + const tacoClient = new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + viemClient: viemPublicClient, + viemAccount: encryptorAccount, + }); + + // Create test message and condition + const messageString = + 'This is a secret message from TacoClient with viem 🤐'; + const message = toBytes(messageString); + const condition = createTestCondition(); + + // Encrypt using TacoClient + const messageKit = await tacoClient.encrypt(message, condition); + expect(messageKit).toBeInstanceOf(ThresholdMessageKit); + + // Prepare condition context for decryption + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKit); + + if ( + conditionContext.requestedContextParameters.has( + USER_ADDRESS_PARAM_DEFAULT, + ) + ) { + const authProvider = await ViemEIP4361AuthProvider.create( + viemPublicClient, + consumerAccount, + ); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); + } + + // Decrypt using TacoClient + const decryptedBytes = await tacoClient.decrypt( + messageKit, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption + expect(decryptedMessageString).toEqual(messageString); + }, 15000); + + test('should throw error when viem client points to incompatible chain', async () => { + // Try to create TacoClient with incompatible viem client + expect(() => { + new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + viemClient: incompatibleViemClient, + viemAccount: encryptorAccount, + }); + }).toThrow(/Invalid configuration/); + }); + }); + + describe('TacoClient with Ethers', () => { + test('should encrypt and decrypt a message using TacoClient with ethers', async () => { + // Create TacoClient with ethers configuration + const tacoClient = new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + ethersProvider: ethersProvider, + ethersSigner: encryptorSigner, + }); + + // Create test message and condition + const messageString = + 'This is a secret message from TacoClient with ethers 🤐'; + const message = toBytes(messageString); + const condition = createTestCondition(); + + // Encrypt using TacoClient + const messageKit = await tacoClient.encrypt(message, condition); + expect(messageKit).toBeInstanceOf(ThresholdMessageKit); + + // Prepare condition context for decryption + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKit); + + if ( + conditionContext.requestedContextParameters.has( + USER_ADDRESS_PARAM_DEFAULT, + ) + ) { + const authProvider = new EIP4361AuthProvider( + ethersProvider, + consumerSigner, + ); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); + } + + // Decrypt using TacoClient + const decryptedBytes = await tacoClient.decrypt( + messageKit, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption + expect(decryptedMessageString).toEqual(messageString); + }, 15000); + + test('should throw error when ethers provider points to incompatible chain', async () => { + // Try to create TacoClient with incompatible ethers provider + expect(() => { + new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + ethersProvider: incompatibleEthersProvider, + ethersSigner: new ethers.Wallet( + ENCRYPTOR_PRIVATE_KEY, + incompatibleEthersProvider, + ), + }); + }).toThrow(/Invalid configuration/); + }); + }); + + describe('Functional API Chain Compatibility', () => { + test('should throw error when functional encrypt() uses incompatible viem client', async () => { + const messageString = 'Test message for incompatible viem encrypt'; + const message = toBytes(messageString); + const condition = createTestCondition(); + + await expect( + viemEncrypt( + incompatibleViemClient, + DOMAIN, + message, + condition, + RITUAL_ID, + encryptorAccount, + ), + ).rejects.toThrow(); + }, 10000); + + test('should throw error when functional encrypt() uses incompatible ethers provider', async () => { + const messageString = 'Test message for incompatible ethers encrypt'; + const message = toBytes(messageString); + const condition = createTestCondition(); + const incompatibleSigner = new ethers.Wallet( + ENCRYPTOR_PRIVATE_KEY, + incompatibleEthersProvider, + ); + + await expect( + encrypt( + incompatibleEthersProvider, + DOMAIN, + message, + condition, + RITUAL_ID, + incompatibleSigner, + ), + ).rejects.toThrow(); + }, 10000); + + test('should throw error when functional decrypt() uses incompatible viem client', async () => { + // First encrypt with correct client + const messageString = 'Test message for decrypt compatibility'; + const message = toBytes(messageString); + const condition = createTestCondition(); + + const messageKit = await viemEncrypt( + viemPublicClient, + DOMAIN, + message, + condition, + RITUAL_ID, + encryptorAccount, + ); + + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKit); + + // Try to decrypt with incompatible client + await expect( + viemDecrypt( + incompatibleViemClient, + DOMAIN, + messageKit, + conditionContext, + ), + ).rejects.toThrow(); + }, 10000); + + test('should throw error when functional decrypt() uses incompatible ethers provider', async () => { + // First encrypt with correct provider + const messageString = 'Test message for decrypt compatibility'; + const message = toBytes(messageString); + const condition = createTestCondition(); + + const messageKit = await encrypt( + ethersProvider, + DOMAIN, + message, + condition, + RITUAL_ID, + encryptorSigner, + ); + + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKit); + + // Try to decrypt with incompatible provider + await expect( + decrypt( + incompatibleEthersProvider, + DOMAIN, + messageKit, + conditionContext, + ), + ).rejects.toThrow(); + }, 10000); + }); + + describe('TacoClient Configuration Validation', () => { + test('should validate configuration successfully for compatible clients', async () => { + const viemTacoClient = new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + viemClient: viemPublicClient, + viemAccount: encryptorAccount, + }); + + const ethersTacoClient = new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + ethersProvider: ethersProvider, + ethersSigner: encryptorSigner, + }); + + // Validate both configurations + const viemValidation = await viemTacoClient.validateConfig(); + const ethersValidation = await ethersTacoClient.validateConfig(); + + expect(viemValidation.isValid).toBe(true); + expect(viemValidation.errors).toHaveLength(0); + expect(ethersValidation.isValid).toBe(true); + expect(ethersValidation.errors).toHaveLength(0); + }, 10000); + + test('should return configuration via getConfig()', () => { + const tacoClient = new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + viemClient: viemPublicClient, + viemAccount: encryptorAccount, + }); + + const config = tacoClient.getConfig(); + + expect(config.domain).toBe(DOMAIN); + expect(config.ritualId).toBe(RITUAL_ID); + expect('viemClient' in config).toBe(true); + expect('viemAccount' in config).toBe(true); + }); + + test('should throw error for invalid domain', () => { + expect(() => { + new TacoClient({ + domain: 'invalid-domain' as any, + ritualId: RITUAL_ID, + viemClient: viemPublicClient, + viemAccount: encryptorAccount, + }); + }).toThrow(/Invalid configuration/); + }); + + test('should throw error for invalid ritual ID', () => { + expect(() => { + new TacoClient({ + domain: DOMAIN, + ritualId: -1, + viemClient: viemPublicClient, + viemAccount: encryptorAccount, + }); + }).toThrow(/Invalid configuration/); + }); + }); + }, +); diff --git a/packages/taco/src/taco-config-validator.ts b/packages/taco/src/taco-config-validator.ts index 2f0636acb..93ce1fde1 100644 --- a/packages/taco/src/taco-config-validator.ts +++ b/packages/taco/src/taco-config-validator.ts @@ -133,6 +133,19 @@ export class TacoConfigValidator { return !!domain && this.getSupportedDomains().includes(domain); } + /** + * Get expected chain ID for domain from DOMAINS configuration + * @param domain - Domain name to look up + * @returns {number | undefined} Chain ID for the domain, undefined if not found + * @private + */ + private static getExpectedChainId(domain: string): number | undefined { + const domainEntry = Object.values(DOMAINS).find( + (domainConfig) => domainConfig.domain === domain, + ); + return domainEntry?.chainId; + } + /** * Validate ritual ID (basic validation - positive number only) * @param domain - Domain name (unused but kept for API compatibility) @@ -245,11 +258,63 @@ export class TacoConfigValidator { ); } + // Validate chain compatibility (synchronous check) + const chainValidation = this.validateChainCompatibility(config); + if (!chainValidation.isValid) { + errors.push(...chainValidation.errors); + } + + return { isValid: errors.length === 0, errors }; + } + + /** + * Synchronous chain compatibility validation + * @private + */ + private static validateChainCompatibility( + config: TacoClientConfig, + ): ValidationResult { + const errors: string[] = []; + + // Get expected chain ID for domain + const expectedChainId = this.getExpectedChainId(config.domain); + if (!expectedChainId) { + errors.push(`Unsupported domain: ${config.domain}`); + return { isValid: false, errors }; + } + + // Check viem client chain compatibility + if ('viemClient' in config && config.viemClient) { + const viemClient = config.viemClient as PublicClient; + if (viemClient.chain && viemClient.chain.id !== expectedChainId) { + errors.push( + `Provider chain mismatch: viem client chain ID ${viemClient.chain.id} does not match domain '${config.domain}' (expected ${expectedChainId})`, + ); + } + } + + // Check ethers provider chain compatibility + if ('ethersProvider' in config && config.ethersProvider) { + // Note: _network is not public API, but it's the only synchronous way to check + // However, if the property `_network` was not available, no error will be thrown. + const ethersProvider = config.ethersProvider as unknown as { + _network?: { chainId: number }; + }; + if ( + ethersProvider._network && + ethersProvider._network.chainId !== expectedChainId + ) { + errors.push( + `Provider chain mismatch: ethers provider chain ID ${ethersProvider._network.chainId} does not match domain '${config.domain}' (expected ${expectedChainId})`, + ); + } + } + return { isValid: errors.length === 0, errors }; } /** - * Full validation including provider network checks + * Full validation including async provider network checks * @param config - Configuration to validate * @returns {Promise} Validation result with provider validation */ From 00735c5a7a0c066f3cef98a35d952f220d733a69 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 26 Aug 2025 13:37:04 +0200 Subject: [PATCH 75/97] remove logger --- packages/taco/src/utils/logger.ts | 123 ------------------------------ 1 file changed, 123 deletions(-) delete mode 100644 packages/taco/src/utils/logger.ts diff --git a/packages/taco/src/utils/logger.ts b/packages/taco/src/utils/logger.ts deleted file mode 100644 index 46122cd60..000000000 --- a/packages/taco/src/utils/logger.ts +++ /dev/null @@ -1,123 +0,0 @@ -/** - * Simple Logging Utility for TACo Web - * - * Provides basic logging functionality with configurable levels. - * Designed to be lightweight and dependency-free. - */ - -/** - * Log levels in order of severity - */ -export enum LogLevel { - ERROR = 0, - WARN = 1, - INFO = 2, - DEBUG = 3, - TRACE = 4 -} - -/** - * Logging configuration - */ -interface LoggingConfig { - level: LogLevel; - enableColors: boolean; - enableTimestamps: boolean; - component?: string; -} - -/** - * Simple logger class for TACo operations - */ -export class Logger { - private config: LoggingConfig; - - constructor(options: Partial = {}) { - this.config = { - level: this.determineLogLevel(options.level), - enableColors: options.enableColors ?? true, - enableTimestamps: options.enableTimestamps ?? true, - component: options.component ?? 'TACo' - }; - } - - private determineLogLevel(explicitLevel?: LogLevel): LogLevel { - if (explicitLevel !== undefined) { - return explicitLevel; - } - - // Check environment variables in browser-compatible way - if (typeof process !== 'undefined' && process.env) { - const envLevel = process.env.TACO_LOG_LEVEL || process.env.LOG_LEVEL; - if (envLevel) { - const upperLevel = envLevel.toUpperCase(); - if (upperLevel in LogLevel) { - return LogLevel[upperLevel as keyof typeof LogLevel]; - } - } - - const env = process.env.NODE_ENV?.toLowerCase(); - if (env === 'production') return LogLevel.ERROR; - if (env === 'development') return LogLevel.DEBUG; - if (env === 'test') return LogLevel.WARN; - } - - return LogLevel.INFO; - } - - private formatMessage(level: LogLevel, message: string, ...args: unknown[]): string { - const levelName = LogLevel[level]; - const timestamp = this.config.enableTimestamps ? new Date().toISOString() : ''; - const component = this.config.component ? `[${this.config.component}]` : ''; - - let formatted = ''; - if (timestamp) formatted += `${timestamp} `; - if (component) formatted += `${component} `; - formatted += `${levelName}: ${message}`; - - if (args.length > 0) { - formatted += ' ' + args.map(arg => - typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg) - ).join(' '); - } - - return formatted; - } - - private shouldLog(level: LogLevel): boolean { - return level <= this.config.level; - } - - private log(level: LogLevel, message: string, ...args: unknown[]): void { - if (this.shouldLog(level)) { - console.log(this.formatMessage(level, message, ...args)); - } - } - - error(message: string, ...args: unknown[]): void { - this.log(LogLevel.ERROR, message, ...args); - } - - warn(message: string, ...args: unknown[]): void { - this.log(LogLevel.WARN, message, ...args); - } - - info(message: string, ...args: unknown[]): void { - this.log(LogLevel.INFO, message, ...args); - } - - debug(message: string, ...args: unknown[]): void { - this.log(LogLevel.DEBUG, message, ...args); - } - - trace(message: string, ...args: unknown[]): void { - if (this.shouldLog(LogLevel.TRACE)) { - console.trace(this.formatMessage(LogLevel.TRACE, message, ...args)); - } - } -} - -/** - * Default logger instance for TACo operations - */ -export const logger = new Logger(); From 1766e822d31daf8582db2e4e2437d8dd672c0d2c Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 27 Aug 2025 18:22:20 +0200 Subject: [PATCH 76/97] remove logger --- packages/taco/src/taco-client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/taco-client.ts index 8cc285717..2d9c8c0da 100644 --- a/packages/taco/src/taco-client.ts +++ b/packages/taco/src/taco-client.ts @@ -200,7 +200,7 @@ export class TacoClient { console.info('Encryption successful'); return messageKit; } catch (error) { - throw new Error(`TaCo encryption failed: ${error}`); + throw new Error(`TACo encryption failed: ${error}`); } } From 7768ac5c4f1166f5f9b1a2298c7d944353a5ff68 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 28 Aug 2025 19:56:31 +0200 Subject: [PATCH 77/97] implement initialization inside TacoClient --- packages/taco/src/taco-client.ts | 99 +++++++++++++++++++++---------- packages/taco/test/client.test.ts | 56 ++++++++++++++++- 2 files changed, 122 insertions(+), 33 deletions(-) diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/taco-client.ts index 2d9c8c0da..c04d940f9 100644 --- a/packages/taco/src/taco-client.ts +++ b/packages/taco/src/taco-client.ts @@ -6,43 +6,41 @@ * class-based architectures. */ -import { ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { initialize, ThresholdMessageKit } from '@nucypher/nucypher-core'; import { isEthersConfig, isViemConfig, type TacoClientConfig, -} from './client-config'; -import { Condition } from './conditions/condition'; -import { ConditionContext } from './conditions/context'; -import { decrypt, encrypt } from './encrypt-decrypt'; +} from './client-config.js'; +import { Condition } from './conditions/condition.js'; +import { ConditionContext } from './conditions/context/index.js'; +import { decrypt, encrypt } from './encrypt-decrypt.js'; import { TacoConfigValidator, type ValidationResult, -} from './taco-config-validator'; +} from './taco-config-validator.js'; /** * TacoClient provides an object-oriented interface for TACo operations * * This class encapsulates TACo configuration and provides simplified methods * for encryption and decryption operations. It handles configuration validation, - * auto-correction, and provides enhanced error messages. + * automatic WASM initialization, and provides enhanced error messages. * - * Supports both viem and ethers.js for maximum flexibility. + * **Key Features:** + * - Automatic WASM initialization (singleton pattern) + * - Supports both viem and ethers.js + * - Configuration validation with helpful error messages + * - Thread-safe initialization across multiple instances * * @example Using with viem: * ```typescript - * import { TacoClient, TacoConfig } from '@nucypher/taco'; + * import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; * import { createPublicClient, http } from 'viem'; * import { polygonAmoy } from 'viem/chains'; * import { privateKeyToAccount } from 'viem/accounts'; * - * // Process and validate configuration - * const processedConfig = TacoConfig.process({ - * domain: 'testnet', // Will be auto-corrected to 'TESTNET' - * // ritualId automatically set to default for TESTNET (6) - * }); - * * // Create viem client and account * const viemClient = createPublicClient({ * chain: polygonAmoy, @@ -50,49 +48,81 @@ import { * }); * const viemAccount = privateKeyToAccount('0x...'); * - * // Create TacoClient instance with viem + * // Create TacoClient - WASM initializes automatically * const tacoClient = new TacoClient({ - * ...processedConfig, + * domain: DOMAIN_NAMES.TESTNET, // 'tapir' + * ritualId: 6, * viemClient, * viemAccount * }); * - * // Simple encryption/decryption + * // Operations wait for initialization automatically * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); - * const context = await tacoClient.createConditionContext(messageKit); - * const decrypted = await tacoClient.decrypt(messageKit, context); + * const decrypted = await tacoClient.decrypt(messageKit, conditionContext); * ``` * * @example Using with ethers.js: * ```typescript - * import { TacoClient, TacoConfig } from '@nucypher/taco'; + * import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; * import { ethers } from 'ethers'; * - * // Process and validate configuration - * const processedConfig = TacoConfig.process({ - * domain: 'testnet', - * ritualId: 6 - * }); - * * // Create ethers provider and signer * const ethersProvider = new ethers.providers.JsonRpcProvider('https://rpc-amoy.polygon.technology'); * const ethersSigner = new ethers.Wallet('0x...', ethersProvider); * - * // Create TacoClient instance with ethers + * // Create TacoClient - WASM initializes automatically * const tacoClient = new TacoClient({ - * ...processedConfig, + * domain: DOMAIN_NAMES.TESTNET, + * ritualId: 6, * ethersProvider, * ethersSigner * }); * - * // Simple encryption/decryption + * // Operations are safe and wait for readiness * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); - * const context = await tacoClient.createConditionContext(messageKit); - * const decrypted = await tacoClient.decrypt(messageKit, context); + * const decrypted = await tacoClient.decrypt(messageKit, conditionContext); * ``` */ export class TacoClient { private config: TacoClientConfig; + private static initializationPromise: Promise; + + /** + * Initialize TACo WASM globally (singleton pattern) + * + * This method ensures TACo WASM is initialized exactly once across all TacoClient instances. + * Initialization happens automatically when creating clients or calling operations, but you can + * call this explicitly for performance optimization or error handling. + * + * @returns {Promise} Promise that resolves when TACo WASM is initialized + * + * @example + * ```typescript + * // Optional: Pre-initialize for better performance + * await TacoClient.initialize(); + * + * // All TacoClient instances share the same initialization + * const client1 = new TacoClient(config1); + * const client2 = new TacoClient(config2); + * + * // Operations automatically wait for initialization + * const encrypted = await client1.encrypt(data, condition); + * ``` + */ + static async initialize(): Promise { + if (!TacoClient.initializationPromise) { + TacoClient.initializationPromise = (async () => { + try { + await initialize(); + console.debug(`TACo initialized successfully.`); + } catch (error) { + console.error(`TACo initialization failed: ${error}`); + throw error; // Re-throw to maintain error propagation + } + })(); + } + return TacoClient.initializationPromise; + } /** * Create a new TacoClient instance @@ -113,6 +143,7 @@ export class TacoClient { domain: this.config.domain, ritualId: this.config.ritualId, }); + TacoClient.initialize(); } /** @@ -161,6 +192,8 @@ export class TacoClient { data: string | Uint8Array, accessCondition: Condition, ): Promise { + await TacoClient.initialize(); + console.debug('Starting encryption', { domain: this.config.domain, ritualId: this.config.ritualId, @@ -220,6 +253,8 @@ export class TacoClient { messageKit: ThresholdMessageKit, conditionContext?: ConditionContext, ): Promise { + await TacoClient.initialize(); + console.debug('Starting decryption', { domain: this.config.domain, hasContext: !!conditionContext, diff --git a/packages/taco/test/client.test.ts b/packages/taco/test/client.test.ts index ecdf65bf2..e4762bec1 100644 --- a/packages/taco/test/client.test.ts +++ b/packages/taco/test/client.test.ts @@ -6,7 +6,7 @@ import { type Account, type PublicClient } from '@nucypher/shared'; import type { ethers } from 'ethers'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { DOMAINS, @@ -124,7 +124,20 @@ describe('TacoConfigValidator', () => { }); }); +// Helper to access TacoClient's private static members for testing +const getTacoClientStatics = () => + TacoClient as unknown as { initializationPromise: Promise | undefined }; +const resetTacoClientStatics = () => { + delete (TacoClient as unknown as { initializationPromise?: Promise }) + .initializationPromise; +}; + describe('TacoClient', () => { + beforeAll(async () => { + // Should be able to wait for initialization + await TacoClient.initialize(); + }); + let validViemConfig: TacoClientViemConfig; let validEthersConfig: TacoClientEthersConfig; @@ -280,6 +293,47 @@ describe('TacoClient', () => { }); }); + describe('Initialization', () => { + it('should initialize TACo automatically', async () => { + // Reset static initialization state to check for automatic initialization + // that happens after calling any TacoClient constructor + resetTacoClientStatics(); + + new TacoClient(validViemConfig); + + // Initialization should be triggered by constructor + expect(getTacoClientStatics().initializationPromise).toBeDefined(); + }); + + it('should share initialization across multiple clients', async () => { + new TacoClient(validViemConfig); + new TacoClient({ + ...validViemConfig, + ritualId: 27, // Different ritual ID + }); + + // Both clients should share the same initialization promise + const initPromise1 = getTacoClientStatics().initializationPromise; + const initPromise2 = getTacoClientStatics().initializationPromise; + + expect(initPromise1).toBe(initPromise2); + expect(initPromise1).toBeDefined(); + }); + + it('should have error handling structure in place', async () => { + // Test that TacoClient.initialize() method exists and returns a promise + const initPromise = TacoClient.initialize(); + expect(initPromise).toBeInstanceOf(Promise); + + // Wait for initialization to complete + await initPromise; + + // Verify that repeated calls return the same promise (singleton pattern) + const initPromise2 = TacoClient.initialize(); + expect(initPromise2).toBeInstanceOf(Promise); + }); + }); + describe('Static Validation', () => { it('should validate correct viem configuration', async () => { const result = await TacoConfigValidator.validateFull(validViemConfig); From e3cc8c10781c204b4ef61a75b80fba048ed9df9d Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 1 Sep 2025 12:29:07 +0200 Subject: [PATCH 78/97] modify TacoClient.decrypt to optionally accepting bytes --- packages/taco/README.md | 2 ++ packages/taco/examples/taco-client-examples.md | 3 +++ .../taco/integration-test/taco-client.test.ts | 15 +++++++++++++-- packages/taco/src/taco-client.ts | 15 ++++++++++++--- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/packages/taco/README.md b/packages/taco/README.md index 6986f0290..80684784f 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -192,6 +192,8 @@ const conditionContext = ConditionContext.fromMessageKit(messageKit); // if needed Add authentication for ":userAddress" in condition... const decryptedMessage = await tacoClient.decrypt(messageKit, conditionContext); +// OR with encrypted bytes: +// const decryptedMessage = await tacoClient.decrypt(messageKit.toBytes(), conditionContext); ``` ### Dual Configuration Support diff --git a/packages/taco/examples/taco-client-examples.md b/packages/taco/examples/taco-client-examples.md index 5ae8264e2..169aa2a75 100644 --- a/packages/taco/examples/taco-client-examples.md +++ b/packages/taco/examples/taco-client-examples.md @@ -71,6 +71,9 @@ const conditionContext = ConditionContext.fromMessageKit(messageKit); // conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, authProvider); const decrypted = await tacoClient.decrypt(messageKit, conditionContext); +// OR with encrypted bytes: +// const decrypted = await tacoClient.decrypt(messageKit.toBytes(), conditionContext); + const message = new TextDecoder().decode(decrypted); console.log(message); // "Hello, secret world!" ``` diff --git a/packages/taco/integration-test/taco-client.test.ts b/packages/taco/integration-test/taco-client.test.ts index 231f4bfd2..379574f66 100644 --- a/packages/taco/integration-test/taco-client.test.ts +++ b/packages/taco/integration-test/taco-client.test.ts @@ -175,15 +175,26 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( ); } - // Decrypt using TacoClient + // Decrypt using TacoClient with Uint8Array const decryptedBytes = await tacoClient.decrypt( - messageKit, + messageKit.toBytes(), conditionContext, ); const decryptedMessageString = fromBytes(decryptedBytes); // Verify decryption expect(decryptedMessageString).toEqual(messageString); + + // Also test decryption with messageKit directly + const decryptedBytes2 = await tacoClient.decrypt( + messageKit, + conditionContext, + ); + const decryptedMessageString2 = fromBytes(decryptedBytes2); + + // Verify both methods produce same result + expect(decryptedMessageString2).toEqual(messageString); + expect(decryptedMessageString2).toEqual(decryptedMessageString); }, 15000); test('should throw error when viem client points to incompatible chain', async () => { diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/taco-client.ts index c04d940f9..4defa3c0d 100644 --- a/packages/taco/src/taco-client.ts +++ b/packages/taco/src/taco-client.ts @@ -238,23 +238,32 @@ export class TacoClient { } /** - * Decrypt a message kit with optional condition context + * Decrypt data using TACo * - * @param messageKit - Encrypted message kit + * @param encryptedData - Either a ThresholdMessageKit or encrypted bytes (Uint8Array) * @param conditionContext - Optional condition context for time-based conditions * @returns {Promise} Decrypted data * * @example * ```typescript + * // With messageKit * const decrypted = await tacoClient.decrypt(messageKit, conditionContext); + * + * // With encrypted bytes + * const decrypted = await tacoClient.decrypt(encryptedBytes, conditionContext); * ``` */ async decrypt( - messageKit: ThresholdMessageKit, + encryptedData: ThresholdMessageKit | Uint8Array, conditionContext?: ConditionContext, ): Promise { await TacoClient.initialize(); + // Handle both messageKit and encrypted bytes + const messageKit = encryptedData instanceof ThresholdMessageKit + ? encryptedData + : ThresholdMessageKit.fromBytes(encryptedData); + console.debug('Starting decryption', { domain: this.config.domain, hasContext: !!conditionContext, From a67216c551e80ba06ece46d3580fbe03b40723b8 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 3 Sep 2025 15:20:59 +0200 Subject: [PATCH 79/97] Apply suggestions from code review Co-authored-by: Manuel Montenegro --- .../taco/integration-test/taco-client.test.ts | 1 - packages/taco/src/taco-config-validator.ts | 20 ------------------- 2 files changed, 21 deletions(-) diff --git a/packages/taco/integration-test/taco-client.test.ts b/packages/taco/integration-test/taco-client.test.ts index 379574f66..8e4aa30fb 100644 --- a/packages/taco/integration-test/taco-client.test.ts +++ b/packages/taco/integration-test/taco-client.test.ts @@ -35,7 +35,6 @@ const CONSUMER_PRIVATE_KEY = const DOMAIN = 'lynx'; const RITUAL_ID = 27; const CHAIN_ID = 80002; // Polygon Amoy -const INCOMPATIBLE_CHAIN_ID = 11155111; // Sepolia // Create viem accounts from private keys const encryptorAccount = privateKeyToAccount( diff --git a/packages/taco/src/taco-config-validator.ts b/packages/taco/src/taco-config-validator.ts index 93ce1fde1..9ccd46b96 100644 --- a/packages/taco/src/taco-config-validator.ts +++ b/packages/taco/src/taco-config-validator.ts @@ -18,26 +18,6 @@ export type DomainName = 'lynx' | 'tapir' | 'mainnet'; * Contains domain names, chain IDs, and core infrastructure information * needed for TACo operations across different networks. * - * ## Available Domains: - * - * ### `lynx` - DEVNET: Bleeding-edge developer network - * - **Network Type**: DEVNET (Development/Experimental) - * - **Chain ID**: 80002 (Polygon Amoy) - * - **Status**: Testnet (Development) - May have breaking changes - * - **Rituals**: Open ritual available - **Cohort**: 2-of-3 - * - * ### `tapir` - TESTNET: Stable testnet for current TACo release - * - **Network Type**: TESTNET (Testing/Stable) - * - **Chain ID**: 80002 (Polygon Amoy) - * - **Status**: Testnet (Stable) - Recommended for testing - * - **Rituals**: Stable ritual configuration - **Cohort**: 3-of-5 - * - * ### `mainnet` - MAINNET: Production network for live applications - * - **Network Type**: MAINNET (Production) - * - **Chain ID**: 137 (Polygon) - * - **Status**: Production (Live) - For real applications - * - **Rituals**: Production ritual configuration - **Cohort**: 5-of-8 - * * @example * ```typescript * // Get domain information From 5dec72e5a44b8a61cf59a3332104722bcbdf07f9 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:40:28 +0200 Subject: [PATCH 80/97] refactor: remove debug logging statements from TacoClient class --- packages/taco/src/taco-client.ts | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/taco-client.ts index 4defa3c0d..14ba87e2e 100644 --- a/packages/taco/src/taco-client.ts +++ b/packages/taco/src/taco-client.ts @@ -114,7 +114,6 @@ export class TacoClient { TacoClient.initializationPromise = (async () => { try { await initialize(); - console.debug(`TACo initialized successfully.`); } catch (error) { console.error(`TACo initialization failed: ${error}`); throw error; // Re-throw to maintain error propagation @@ -139,10 +138,6 @@ export class TacoClient { this.config = config; - console.debug(`TacoClient initialized`, { - domain: this.config.domain, - ritualId: this.config.ritualId, - }); TacoClient.initialize(); } @@ -194,13 +189,6 @@ export class TacoClient { ): Promise { await TacoClient.initialize(); - console.debug('Starting encryption', { - domain: this.config.domain, - ritualId: this.config.ritualId, - dataType: typeof data, - dataLength: data.length, - }); - try { let messageKit: ThresholdMessageKit; @@ -230,7 +218,6 @@ export class TacoClient { ); } - console.info('Encryption successful'); return messageKit; } catch (error) { throw new Error(`TACo encryption failed: ${error}`); @@ -248,7 +235,7 @@ export class TacoClient { * ```typescript * // With messageKit * const decrypted = await tacoClient.decrypt(messageKit, conditionContext); - * + * * // With encrypted bytes * const decrypted = await tacoClient.decrypt(encryptedBytes, conditionContext); * ``` @@ -260,14 +247,10 @@ export class TacoClient { await TacoClient.initialize(); // Handle both messageKit and encrypted bytes - const messageKit = encryptedData instanceof ThresholdMessageKit - ? encryptedData - : ThresholdMessageKit.fromBytes(encryptedData); - - console.debug('Starting decryption', { - domain: this.config.domain, - hasContext: !!conditionContext, - }); + const messageKit = + encryptedData instanceof ThresholdMessageKit + ? encryptedData + : ThresholdMessageKit.fromBytes(encryptedData); try { let decrypted: Uint8Array; @@ -296,7 +279,6 @@ export class TacoClient { ); } - console.info('Decryption successful'); return decrypted; } catch (error) { throw new Error(`TaCo decryption failed: ${error}`); From b6f1a584ba8d052e93b67e9ad81202e0cf8719e6 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 4 Sep 2025 10:25:00 +0200 Subject: [PATCH 81/97] simplify a condition a bit --- packages/taco/src/taco-config-validator.ts | 46 +++++++++++----------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/taco/src/taco-config-validator.ts b/packages/taco/src/taco-config-validator.ts index 9ccd46b96..f9b5fd7ce 100644 --- a/packages/taco/src/taco-config-validator.ts +++ b/packages/taco/src/taco-config-validator.ts @@ -148,31 +148,31 @@ export class TacoConfigValidator { ): Promise { let chainId: number; + if (!provider || typeof provider !== 'object') { + // Invalid provider + return false; + } + + // Try to detect provider type and get chain ID safely try { - // Try to detect provider type and get chain ID safely - if (provider && typeof provider === 'object') { - // Check if it's a viem PublicClient (has getChainId method) - if ( - 'getChainId' in provider && - typeof provider.getChainId === 'function' - ) { - chainId = await (provider as PublicClient).getChainId(); - } - // Check if it's an ethers Provider (has getNetwork method) - else if ( - 'getNetwork' in provider && - typeof provider.getNetwork === 'function' - ) { - const network = await ( - provider as ethers.providers.Provider - ).getNetwork(); - chainId = network.chainId; - } else { - // Unknown provider type - return false; - } + // Check if it's a viem PublicClient (has getChainId method) + if ( + 'getChainId' in provider && + typeof provider.getChainId === 'function' + ) { + chainId = await (provider as PublicClient).getChainId(); + } + // Check if it's an ethers Provider (has getNetwork method) + else if ( + 'getNetwork' in provider && + typeof provider.getNetwork === 'function' + ) { + const network = await ( + provider as ethers.providers.Provider + ).getNetwork(); + chainId = network.chainId; } else { - // Invalid provider + // Unknown provider type return false; } } catch (error) { From 8cc3ec05ded6d4dfae9e3b2a7a4f8094f6a524ea Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:22:42 +0200 Subject: [PATCH 82/97] add encryptWithPublicKey to TacoClient --- .../taco/integration-test/taco-client.test.ts | 127 +++++++++++++++++- packages/taco/src/taco-client.ts | 124 +++++++++-------- 2 files changed, 191 insertions(+), 60 deletions(-) diff --git a/packages/taco/integration-test/taco-client.test.ts b/packages/taco/integration-test/taco-client.test.ts index 8e4aa30fb..9e04f404d 100644 --- a/packages/taco/integration-test/taco-client.test.ts +++ b/packages/taco/integration-test/taco-client.test.ts @@ -5,7 +5,6 @@ import { PublicClient, WalletClient } from '@nucypher/shared/src/viem-utils'; import { EIP4361AuthProvider, USER_ADDRESS_PARAM_DEFAULT, - ViemEIP4361AuthProvider, } from '@nucypher/taco-auth'; import { ethers } from 'ethers'; import { createPublicClient, createWalletClient, http } from 'viem'; @@ -20,6 +19,7 @@ import { ThresholdMessageKit, } from '../src'; import { CompoundCondition } from '../src/conditions/compound-condition'; +import { DkgClient } from '../src/dkg'; import { decrypt as viemDecrypt, encrypt as viemEncrypt, @@ -164,9 +164,9 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( USER_ADDRESS_PARAM_DEFAULT, ) ) { - const authProvider = await ViemEIP4361AuthProvider.create( - viemPublicClient, - consumerAccount, + const authProvider = new EIP4361AuthProvider( + ethersProvider, + consumerSigner, ); conditionContext.addAuthProvider( USER_ADDRESS_PARAM_DEFAULT, @@ -196,6 +196,65 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( expect(decryptedMessageString2).toEqual(decryptedMessageString); }, 15000); + test('should encrypt and decrypt using encryptWithPublicKey with viem', async () => { + // Create TacoClient with viem configuration + const tacoClient = new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + viemClient: viemPublicClient, + viemAccount: encryptorAccount, + }); + + // Get DKG public key from ritual using ethers provider + const dkgRitual = await DkgClient.getActiveRitual( + ethersProvider, + DOMAIN, + RITUAL_ID, + ); + const dkgPublicKey = dkgRitual.dkgPublicKey; + + const messageString = 'This is an offline encrypted message 🔐'; + const message = toBytes(messageString); + const condition = createTestCondition(); + + // Test encryptWithPublicKey (offline encryption) + const messageKit = await tacoClient.encryptWithPublicKey( + message, + condition, + dkgPublicKey, + ); + expect(messageKit).toBeInstanceOf(ThresholdMessageKit); + + // Prepare condition context for decryption + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKit); + + if ( + conditionContext.requestedContextParameters.has( + USER_ADDRESS_PARAM_DEFAULT, + ) + ) { + const authProvider = new EIP4361AuthProvider( + ethersProvider, + consumerSigner, + ); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); + } + + // Decrypt the message + const decryptedBytes = await tacoClient.decrypt( + messageKit, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption matches original message + expect(decryptedMessageString).toEqual(messageString); + }, 15000); + test('should throw error when viem client points to incompatible chain', async () => { // Try to create TacoClient with incompatible viem client expect(() => { @@ -259,6 +318,66 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( expect(decryptedMessageString).toEqual(messageString); }, 15000); + test('should encrypt and decrypt using encryptWithPublicKey with ethers', async () => { + // Create TacoClient with ethers configuration + const tacoClient = new TacoClient({ + domain: DOMAIN, + ritualId: RITUAL_ID, + ethersProvider: ethersProvider, + ethersSigner: encryptorSigner, + }); + + // Get DKG public key from ritual + const dkgRitual = await DkgClient.getActiveRitual( + ethersProvider, + DOMAIN, + RITUAL_ID, + ); + const dkgPublicKey = dkgRitual.dkgPublicKey; + + const messageString = + 'This is an offline encrypted message with ethers 🔐'; + const message = toBytes(messageString); + const condition = createTestCondition(); + + // Test encryptWithPublicKey (offline encryption) + const messageKit = await tacoClient.encryptWithPublicKey( + message, + condition, + dkgPublicKey, + ); + expect(messageKit).toBeInstanceOf(ThresholdMessageKit); + + // Prepare condition context for decryption + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKit); + + if ( + conditionContext.requestedContextParameters.has( + USER_ADDRESS_PARAM_DEFAULT, + ) + ) { + const authProvider = new EIP4361AuthProvider( + ethersProvider, + consumerSigner, + ); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); + } + + // Decrypt the message + const decryptedBytes = await tacoClient.decrypt( + messageKit, + conditionContext, + ); + const decryptedMessageString = fromBytes(decryptedBytes); + + // Verify decryption matches original message + expect(decryptedMessageString).toEqual(messageString); + }, 15000); + test('should throw error when ethers provider points to incompatible chain', async () => { // Try to create TacoClient with incompatible ethers provider expect(() => { diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/taco-client.ts index 14ba87e2e..db24338b7 100644 --- a/packages/taco/src/taco-client.ts +++ b/packages/taco/src/taco-client.ts @@ -6,16 +6,20 @@ * class-based architectures. */ -import { initialize, ThresholdMessageKit } from '@nucypher/nucypher-core'; +import { + DkgPublicKey, + initialize, + ThresholdMessageKit, +} from '@nucypher/nucypher-core'; import { - isEthersConfig, - isViemConfig, type TacoClientConfig, + type TacoClientEthersConfig, + type TacoClientViemConfig, } from './client-config.js'; import { Condition } from './conditions/condition.js'; import { ConditionContext } from './conditions/context/index.js'; -import { decrypt, encrypt } from './encrypt-decrypt.js'; +import { decrypt, encrypt, encryptWithPublicKey } from './encrypt-decrypt.js'; import { TacoConfigValidator, type ValidationResult, @@ -190,33 +194,16 @@ export class TacoClient { await TacoClient.initialize(); try { - let messageKit: ThresholdMessageKit; - - if (isViemConfig(this.config)) { - // Use viem API - messageKit = await encrypt( - this.config.viemClient, - this.config.domain, - data, - accessCondition, - this.config.ritualId, - this.config.viemAccount, - ); - } else if (isEthersConfig(this.config)) { - // Use ethers API - messageKit = await encrypt( - this.config.ethersProvider, - this.config.domain, - data, - accessCondition, - this.config.ritualId, - this.config.ethersSigner, - ); - } else { - throw new Error( - 'Invalid configuration: must provide either viem or ethers objects', - ); - } + const messageKit = await encrypt( + (this.config as TacoClientEthersConfig).ethersProvider || + (this.config as TacoClientViemConfig).viemClient, + this.config.domain, + data, + accessCondition, + this.config.ritualId, + (this.config as TacoClientEthersConfig).ethersSigner || + (this.config as TacoClientViemConfig).viemAccount, + ); return messageKit; } catch (error) { @@ -224,6 +211,48 @@ export class TacoClient { } } + /** + * Encrypt data with a provided DKG public key under a specified condition + * + * This method can be used offline since it doesn't require network access to fetch + * the DKG public key (unlike the `encrypt` method which fetches it from the ritual). + * + * @param data - String or Uint8Array to encrypt + * @param accessCondition - Access condition for decryption + * @param dkgPublicKey - The DKG public key to use for encryption + * @returns {Promise} Encrypted message kit + * + * @example + * ```typescript + * // Get DKG public key from ritual or cache + * const dkgPublicKey = await getDkgPublicKey(domain, ritualId); + * + * // Encrypt offline using the public key + * const messageKit = await tacoClient.encryptWithPublicKey('Hello, secret!', condition, dkgPublicKey); + * ``` + */ + async encryptWithPublicKey( + data: string | Uint8Array, + accessCondition: Condition, + dkgPublicKey: DkgPublicKey, + ): Promise { + await TacoClient.initialize(); + + try { + const messageKit = await encryptWithPublicKey( + data, + accessCondition, + dkgPublicKey, + (this.config as TacoClientEthersConfig).ethersSigner || + (this.config as TacoClientViemConfig).viemAccount, + ); + + return messageKit; + } catch (error) { + throw new Error(`TACo encryption with public key failed: ${error}`); + } + } + /** * Decrypt data using TACo * @@ -253,31 +282,14 @@ export class TacoClient { : ThresholdMessageKit.fromBytes(encryptedData); try { - let decrypted: Uint8Array; - - if (isViemConfig(this.config)) { - // Use viem API - decrypted = await decrypt( - this.config.viemClient, - this.config.domain, - messageKit, - conditionContext, - this.config.porterUris, - ); - } else if (isEthersConfig(this.config)) { - // Use ethers API - decrypted = await decrypt( - this.config.ethersProvider, - this.config.domain, - messageKit, - conditionContext, - this.config.porterUris, - ); - } else { - throw new Error( - 'Invalid configuration: must provide either viem or ethers objects', - ); - } + const decrypted = await decrypt( + (this.config as TacoClientEthersConfig).ethersProvider || + (this.config as TacoClientViemConfig).viemClient, + this.config.domain, + messageKit, + conditionContext, + this.config.porterUris, + ); return decrypted; } catch (error) { From 877a44d50a4a1b5045688ee198462c14a445d530 Mon Sep 17 00:00:00 2001 From: derekpierre Date: Tue, 16 Sep 2025 16:23:38 -0400 Subject: [PATCH 83/97] Add viem as a dev dependency so that signatures produced from ethers and viem for the same private key can be properly tested. Fix bug in ViemSignerAdapter implementation where bytes were not being signed properly. --- packages/shared/src/viem/signer-adapter.ts | 33 +- .../shared/test/ethers-viem-utils.test.ts | 243 +++++++++++++++ .../shared/test/viem-ethers-adapter.test.ts | 25 +- pnpm-lock.yaml | 284 +++++++++++++----- 4 files changed, 488 insertions(+), 97 deletions(-) create mode 100644 packages/shared/test/ethers-viem-utils.test.ts diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index db84a933f..4a8d66289 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -1,6 +1,5 @@ -import { ethers } from 'ethers'; - -import { type TacoSigner } from '../taco-signer'; +import { type TACoSigner } from '../taco-interfaces'; +import { SignerLike } from '../types'; import { type Address, type SignerAccount } from './types'; @@ -42,20 +41,32 @@ export class ViemSignerAdapter implements TacoSigner { async signMessage(message: string | Uint8Array): Promise { if (!this.viemAccount.signMessage) { - throw new Error( - 'Account does not support message signing. Expected a LocalAccount or a WalletClient with signing capability.', - ); + throw new Error('Account does not support message signing'); } if (typeof message === 'string') { - return await this.viemAccount.signMessage({ - account: await this.getAddress(), - message, - }); + return await this.viemAccount.signMessage({ message }); } else { return await this.viemAccount.signMessage({ - account: await this.getAddress(), message: { raw: message }, }); } } } + +/** + * Convert viem account to TACoSigner or return existing signer + * + * This is the main entry point for creating signers for internal TACo use. + * Unlike toEthersProvider which creates actual ethers objects, + * this creates minimal adapters implementing only what TACo needs. + * + * @param signerLike - Either a viem Account or an existing TACoSigner + * @returns A TACoSigner interface implementation + */ +export function toTACoSigner(signerLike: SignerLike): TACoSigner { + if (isViemAccount(signerLike)) { + return new ViemSignerAdapter(signerLike); + } else { + return signerLike; + } +} diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts new file mode 100644 index 000000000..aba97141b --- /dev/null +++ b/packages/shared/test/ethers-viem-utils.test.ts @@ -0,0 +1,243 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +// @ts-nocheck +import { ethers } from 'ethers'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import { toEthersProvider } from '../src/viem/ethers-adapter'; +import { toTACoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; +import { isViemAccount, isViemClient } from '../src/viem/type-guards'; + +describe('viem adapter utilities', () => { + describe('function exports', () => { + it('should export all adapter functions', () => { + expect(toEthersProvider).toBeDefined(); + expect(toTACoSigner).toBeDefined(); + expect(isViemClient).toBeDefined(); + expect(isViemAccount).toBeDefined(); + expect(typeof toEthersProvider).toBe('function'); + expect(typeof toTACoSigner).toBe('function'); + expect(typeof isViemClient).toBe('function'); + expect(typeof isViemAccount).toBe('function'); + }); + }); + + describe('ethers provider interop', () => { + let mockViemPublicClient: any; + + beforeEach(() => { + mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + call: vi.fn().mockResolvedValue('0x1234'), + chain: { + name: 'Polygon Amoy', + id: 80002, + contracts: {}, + }, + transport: { + type: 'http', + url: 'https://rpc.ankr.com/polygon_amoy', + }, + }; + }); + + it('should create an ethers provider from viem client (http)', () => { + const provider = toEthersProvider(mockViemPublicClient); + + expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); + }); + }); + + describe('ViemSignerAdapter', () => { + let mockViemAccount: any; + + beforeEach(() => { + mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + }; + }); + + it('should create signer without provider', async () => { + const signer = new ViemSignerAdapter(mockViemAccount); + + expect(signer.getAddress).toBeDefined(); + expect(signer.signMessage).toBeDefined(); + + // Actually call the methods to ensure coverage + await signer.getAddress(); + await signer.signMessage('test'); + }); + + it('should get address from viem account', async () => { + const signer = new ViemSignerAdapter(mockViemAccount); + const address = await signer.getAddress(); + + expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + }); + + it('should sign string message', async () => { + const signer = new ViemSignerAdapter(mockViemAccount); + const signature = await signer.signMessage('test message'); + + expect(signature).toBe('0xsignature'); + expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ + message: 'test message', + }); + }); + + it('should sign Uint8Array message', async () => { + const signer = new ViemSignerAdapter(mockViemAccount); + const message = new Uint8Array([1, 2, 3, 4]); + + await signer.signMessage(message); + + expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ + message: { + raw: message, + }, + }); + }); + + it('should throw error if account does not support signing', async () => { + const accountWithoutSigning = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + // no signMessage method + }; + + const signer = new ViemSignerAdapter(accountWithoutSigning); + + await expect(signer.signMessage('test')).rejects.toThrow( + 'Account does not support message signing', + ); + }); + }); + + describe('toEthersProvider', () => { + it('should create provider from viem client', async () => { + const mockViemPublicClient = { + getChainId: vi.fn().mockResolvedValue(80002), + call: vi.fn().mockResolvedValue('0x'), + chain: { name: 'test', id: 80002 }, + transport: { type: 'http', url: 'https://rpc.ankr.com/polygon_amoy' }, + } as any; + + const provider = toEthersProvider(mockViemPublicClient); + + expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); + }); + + it('should return ethers provider unchanged', () => { + const ethersProvider = new ethers.providers.JsonRpcProvider(); + const result = toEthersProvider(ethersProvider); + + expect(result).toBe(ethersProvider); + }); + + it('should handle non-viem provider correctly', () => { + const nonViemProvider = { + someProperty: 'value', + someMethod: () => {}, + } as any; + + const result = toEthersProvider(nonViemProvider); + + expect(result).toBe(nonViemProvider); + }); + }); + + describe('toTACoSigner', () => { + it('should create signer from viem account', async () => { + const mockViemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + signMessage: vi.fn().mockResolvedValue('0xsignature'), + } as any; + + const signer = toTACoSigner(mockViemAccount); + + expect(signer).toBeInstanceOf(ViemSignerAdapter); + + // Actually call methods to ensure coverage + const address = await signer.getAddress(); + expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); + }); + + it('should return ethers signer unchanged', () => { + const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); + const result = toTACoSigner(ethersSigner); + + expect(result).toBe(ethersSigner); + }); + + it('should handle non-viem signer correctly', () => { + const nonViemSigner = { + someProperty: 'value', + someMethod: () => {}, + provider: {}, // This will make it fail the isViemAccount check + } as any; + + const result = toTACoSigner(nonViemSigner); + + expect(result).toBe(nonViemSigner); + }); + }); + + describe('type guards', () => { + describe('isViemClient', () => { + it('should identify viem client by chain property', () => { + const viemClient = { + chain: { name: 'test', id: 1 }, + getChainId: vi.fn(), + }; + + expect(isViemClient(viemClient)).toBe(true); + }); + + it('should identify viem client by getChainId method', () => { + const viemClient = { + getChainId: () => Promise.resolve(1), + }; + + expect(isViemClient(viemClient)).toBe(true); + }); + + it('should reject ethers provider', () => { + const ethersProvider = new ethers.providers.JsonRpcProvider(); + + expect(isViemClient(ethersProvider)).toBe(false); + }); + + it('should reject object without viem properties', () => { + const notViemClient = { + someMethod: () => {}, + }; + + expect(isViemClient(notViemClient)).toBe(false); + }); + }); + + describe('isViemAccount', () => { + it('should identify viem account by address property', () => { + const viemAccount = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + }; + + expect(isViemAccount(viemAccount)).toBe(true); + }); + + it('should reject ethers signer', () => { + const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); + + expect(isViemAccount(ethersSigner)).toBe(false); + }); + + it('should reject object with provider property', () => { + const signerWithProvider = { + address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', + provider: {}, + }; + + expect(isViemAccount(signerWithProvider)).toBe(false); + }); + }); + }); +}); diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 38a52f75a..4a92866a9 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -4,12 +4,10 @@ import { ethers } from 'ethers'; import { privateKeyToAccount } from 'viem/accounts'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { createPublicClient, fallback, http, webSocket } from 'viem'; import { fromHexString } from '../src'; -import { toEthersProvider, toTacoSigner } from '../src/adapters'; -import { viemClientToProvider } from '../src/viem/ethers-adapter'; +import { toEthersProvider } from '../src/viem/ethers-adapter'; import { ViemSignerAdapter } from '../src/viem/signer-adapter'; -import { isViemClient, isViemSignerAccount } from '../src/viem/type-guards'; +import { isViemClient } from '../src/viem/type-guards'; describe('viem ethers adapter', () => { const PRIVATE_KEY = @@ -126,19 +124,27 @@ describe('viem ethers adapter', () => { }); describe('ViemSignerAdapter', () => { + const PRIVATE_KEY = + '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // 32-byte hex + const viemAccount = privateKeyToAccount(PRIVATE_KEY); const ethersSigner = new ethers.Wallet(PRIVATE_KEY); it('should create signer without provider', () => { const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); expect(viemAdaptedSigner).toBeInstanceOf(ViemSignerAdapter); + const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); + expect(viemAdaptedSigner).toBeInstanceOf(ViemSignerAdapter); }); it('should get address from viem account', async () => { const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); + const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); const address = await viemAdaptedSigner.getAddress(); expect(address).toBe(ethersSigner.address); + const address = await viemAdaptedSigner.getAddress(); + expect(address).toBe(ethersSigner.address); }); it('should sign string message', async () => { @@ -146,6 +152,12 @@ describe('viem ethers adapter', () => { const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); const viemSignature = await viemAdaptedSigner.signMessage(message); + const ethersSignature = await ethersSigner.signMessage(message); + expect(viemSignature).toBe(ethersSignature); + const message = 'test message'; + const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); + const viemSignature = await viemAdaptedSigner.signMessage(message); + const ethersSignature = await ethersSigner.signMessage(message); expect(viemSignature).toBe(ethersSignature); }); @@ -153,11 +165,16 @@ describe('viem ethers adapter', () => { it('should sign Uint8Array message', async () => { const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); const messageBytes = fromHexString('0xdeadbeef'); + const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); + const messageBytes = fromHexString('0xdeadbeef'); + const viemSignature = await viemAdaptedSigner.signMessage(messageBytes); const viemSignature = await viemAdaptedSigner.signMessage(messageBytes); const ethersSignature = await ethersSigner.signMessage(messageBytes); expect(viemSignature).toBe(ethersSignature); + const ethersSignature = await ethersSigner.signMessage(messageBytes); + expect(viemSignature).toBe(ethersSignature); }); it('should throw error if account does not support signing', async () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ce0a529b..3a93cfa27 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,7 +39,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -105,7 +105,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -129,7 +129,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9) + version: 6.2.0(webpack@5.99.9(webpack-cli@6.0.1)) react: specifier: ^18.3.1 version: 18.3.1 @@ -145,7 +145,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -157,16 +157,16 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9) + version: 5.6.3(webpack@5.99.9(webpack-cli@6.0.1)) process: specifier: ^0.11.10 version: 0.11.10 @@ -214,7 +214,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9) + version: 6.2.0(webpack@5.99.9(webpack-cli@6.0.1)) react: specifier: ^18.3.1 version: 18.3.1 @@ -230,7 +230,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -242,13 +242,13 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9) + version: 5.6.3(webpack@5.99.9(webpack-cli@6.0.1)) react-refresh: specifier: ^0.17.0 version: 0.17.0 @@ -352,10 +352,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -511,10 +511,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) webpack: specifier: ^5.99.9 version: 5.101.3(webpack-cli@6.0.1) @@ -597,9 +597,7 @@ importers: version: 8.3.2(typescript@5.8.2) viem: specifier: ^2.0.0 - version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) - - packages/shared/dist/es: {} + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) packages/taco: dependencies: @@ -695,7 +693,7 @@ importers: version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) packages: @@ -12257,12 +12255,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 optionalDependencies: type-fest: 0.21.3 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': dependencies: anser: 2.3.2 core-js-pure: 3.41.0 @@ -13112,7 +13110,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -13127,7 +13125,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -13247,17 +13245,17 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) @@ -13657,7 +13655,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 babel-plugin-istanbul@6.1.1: dependencies: @@ -14406,7 +14404,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.0(webpack@5.99.9): + copy-webpack-plugin@13.0.0(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 @@ -14554,7 +14552,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 css-minimizer-webpack-plugin@3.4.1(webpack@5.101.3): dependencies: @@ -14564,7 +14562,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 css-prefers-color-scheme@6.0.3(postcss@8.5.3): dependencies: @@ -15135,7 +15133,7 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.99.9): + esbuild-loader@2.21.0(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: esbuild: 0.16.17 joycon: 3.1.1 @@ -15259,8 +15257,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -15278,9 +15275,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -15362,6 +15358,21 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.0 + eslint: 8.57.0 + get-tsconfig: 4.10.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.12 + unrs-resolver: 1.3.2 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 @@ -15373,8 +15384,7 @@ snapshots: tinyglobby: 0.2.12 unrs-resolver: 1.3.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -15388,19 +15398,28 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 @@ -15454,8 +15473,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -15466,7 +15484,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15478,30 +15496,77 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + 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: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) + 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 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + 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: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.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 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) - jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack - supports-color - - typescript - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) - jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript @@ -15642,7 +15707,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 eslint@8.57.0: dependencies: @@ -15946,12 +16011,18 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.99.9): + file-loader@6.2.0(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 webpack: 5.99.9(webpack-cli@6.0.1) + file-loader@6.2.0(webpack@5.99.9): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.99.9 + file-uri-to-path@1.0.0: {} filelist@1.0.4: @@ -16063,7 +16134,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.8.2 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 optionalDependencies: eslint: 8.57.1 @@ -16450,7 +16521,7 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-webpack-plugin@5.6.3(webpack@5.99.9): + html-webpack-plugin@5.6.3(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16460,6 +16531,16 @@ snapshots: optionalDependencies: webpack: 5.99.9(webpack-cli@6.0.1) + html-webpack-plugin@5.6.3(webpack@5.99.9): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + webpack: 5.99.9 + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -17838,7 +17919,7 @@ snapshots: dependencies: schema-utils: 4.3.0 tapable: 2.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 minimalistic-assert@1.0.1: {} @@ -18526,7 +18607,7 @@ snapshots: klona: 2.0.6 postcss: 8.5.3 semver: 7.7.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 postcss-logical@5.0.4(postcss@8.5.3): dependencies: @@ -18968,7 +19049,7 @@ snapshots: shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -19040,7 +19121,7 @@ snapshots: style-loader: 3.3.4(webpack@5.99.9) tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) terser-webpack-plugin: 5.3.14(webpack@5.99.9) - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) webpack-manifest-plugin: 4.1.1(webpack@5.99.9) workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) @@ -19386,7 +19467,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 sax@1.2.4: {} @@ -19667,7 +19748,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 source-map-support@0.5.21: dependencies: @@ -19918,7 +19999,7 @@ snapshots: style-loader@3.3.4(webpack@5.101.3): dependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 styled-jsx@5.1.6(react@18.3.1): dependencies: @@ -20073,7 +20154,7 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.99.9): + terser-webpack-plugin@5.3.14(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 @@ -20082,6 +20163,15 @@ snapshots: terser: 5.39.0 webpack: 5.99.9(webpack-cli@6.0.1) + terser-webpack-plugin@5.3.14(webpack@5.99.9): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.39.0 + webpack: 5.99.9 + terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 @@ -20586,7 +20676,7 @@ snapshots: terser: 5.39.0 yaml: 2.7.0 - vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -20625,7 +20715,7 @@ snapshots: - tsx - yaml - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -20708,9 +20798,9 @@ snapshots: webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -20731,9 +20821,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 - webpack-dev-middleware@7.4.2(webpack@5.99.9): + webpack-dev-middleware@7.4.2(webpack@5.99.9(webpack-cli@6.0.1)): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -20777,7 +20867,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 transitivePeerDependencies: - bufferutil - debug @@ -20812,7 +20902,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.99.9) + webpack-dev-middleware: 7.4.2(webpack@5.99.9(webpack-cli@6.0.1)) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1) @@ -20826,7 +20916,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.101.3): dependencies: tapable: 2.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 webpack-sources: 2.3.1 webpack-merge@6.0.1: @@ -20845,18 +20935,48 @@ snapshots: source-list-map: 2.0.1 source-map: 0.6.1 - webpack-sources@3.3.3: {} + webpack-sources@3.2.3: {} + + webpack@5.99.9: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.1 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.14(webpack@5.99.9) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js webpack@5.99.9(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) + acorn: 8.14.1 browserslist: 4.24.4 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 @@ -20871,7 +20991,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.101.3) + terser-webpack-plugin: 5.3.14(webpack@5.99.9(webpack-cli@6.0.1)) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -21098,7 +21218,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.99.9 webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: From f8c87978c404c22b893a7f240b70940c407a581e Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Sun, 21 Sep 2025 18:20:14 +0200 Subject: [PATCH 84/97] refactor: consolidate taco tests for ethers and viem --- packages/taco/test/viem-unit.test.ts | 169 ------------------- pnpm-lock.yaml | 237 +++++++-------------------- 2 files changed, 63 insertions(+), 343 deletions(-) delete mode 100644 packages/taco/test/viem-unit.test.ts diff --git a/packages/taco/test/viem-unit.test.ts b/packages/taco/test/viem-unit.test.ts deleted file mode 100644 index 7f7a96dc5..000000000 --- a/packages/taco/test/viem-unit.test.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { - FerveoVariant, - initialize, - SessionStaticSecret, -} from '@nucypher/nucypher-core'; -import * as tacoAuth from '@nucypher/taco-auth'; -import { USER_ADDRESS_PARAM_DEFAULT } from '@nucypher/taco-auth'; -import { - aliceSecretKeyBytes, - fakeDkgFlow, - fakePorterUri, - fakeProvider, - fakeTDecFlow, - mockGetRitualIdFromPublicKey, - mockTacoDecrypt, - TEST_CHAIN_ID, - TEST_SIWE_PARAMS, -} from '@nucypher/test-utils'; -import { beforeAll, describe, expect, it, vi } from 'vitest'; - -import { conditions, domains, toBytes } from '../src'; -import { ConditionContext } from '../src/conditions/context'; -import { encryptWithViem, decryptWithViem } from '../src/viem-taco'; -import { createEthersProvider, createEthersSigner, createEthersFromViem } from '../src/wrappers/viem-wrappers'; - -import { - fakeDkgRitual, - mockDkgParticipants, - mockGetActiveRitual, - mockGetParticipants, - mockMakeSessionKey, -} from './test-utils'; - -// Shared test variables -const message = 'this is a secret viem message'; -const ownsNFT = new conditions.predefined.erc721.ERC721Ownership({ - contractAddress: '0x1e988ba4692e52Bc50b375bcC8585b95c48AaD77', - parameters: [3591], - chain: TEST_CHAIN_ID, -}); - -describe('viem unit tests', () => { - beforeAll(async () => { - await initialize(); - }); - - describe('viem availability checks', () => { - it('should check if viem functions are exported', () => { - expect(encryptWithViem).toBeDefined(); - expect(decryptWithViem).toBeDefined(); - expect(typeof encryptWithViem).toBe('function'); - expect(typeof decryptWithViem).toBe('function'); - }); - - it('should check if wrapper functions exist', () => { - expect(createEthersProvider).toBeDefined(); - expect(createEthersSigner).toBeDefined(); - expect(createEthersFromViem).toBeDefined(); - }); - }); - - describe('viem encrypt/decrypt with mocked adapters', () => { - it('encrypts and decrypts using viem functions', async () => { - const mockedDkg = fakeDkgFlow(FerveoVariant.precomputed, 0, 4, 4); - const mockedDkgRitual = fakeDkgRitual(mockedDkg); - const mockEthersProvider = fakeProvider(aliceSecretKeyBytes); - const mockEthersSigner = mockEthersProvider.getSigner(); - - // Mock the viem clients - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - } as any; - - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn(), - } as any; - - // Mock the adapter functions to return ethers objects - const createEthersProviderSpy = vi.spyOn(await import('../src/wrappers/viem-wrappers'), 'createEthersProvider') - .mockReturnValue(mockEthersProvider); - const createEthersSignerSpy = vi.spyOn(await import('../src/wrappers/viem-wrappers'), 'createEthersSigner') - .mockReturnValue(mockEthersSigner); - - const getFinalizedRitualSpy = mockGetActiveRitual(mockedDkgRitual); - - // Test encryption - const messageKit = await encryptWithViem( - mockViemPublicClient, - domains.DEVNET, - message, - ownsNFT, - mockedDkg.ritualId, - mockViemAccount, - ); - - expect(createEthersProviderSpy).toHaveBeenCalledWith(mockViemPublicClient); - expect(createEthersSignerSpy).toHaveBeenCalledWith(mockViemAccount, mockEthersProvider); - expect(getFinalizedRitualSpy).toHaveBeenCalled(); - expect(messageKit).toBeDefined(); - - // Setup decryption mocks - const { decryptionShares } = fakeTDecFlow({ - ...mockedDkg, - message: toBytes(message), - dkgPublicKey: mockedDkg.dkg.publicKey(), - thresholdMessageKit: messageKit, - }); - const { participantSecrets, participants } = await mockDkgParticipants( - mockedDkg.ritualId, - ); - const requesterSessionKey = SessionStaticSecret.random(); - const decryptSpy = mockTacoDecrypt( - mockedDkg.ritualId, - decryptionShares, - participantSecrets, - requesterSessionKey.publicKey(), - ); - const getParticipantsSpy = mockGetParticipants(participants); - const sessionKeySpy = mockMakeSessionKey(requesterSessionKey); - const getRitualIdFromPublicKey = mockGetRitualIdFromPublicKey( - mockedDkg.ritualId, - ); - const getRitualSpy = mockGetActiveRitual(mockedDkgRitual); - - const authProvider = new tacoAuth.EIP4361AuthProvider( - mockEthersProvider, - mockEthersSigner, - TEST_SIWE_PARAMS, - ); - - const conditionContext = ConditionContext.fromMessageKit(messageKit); - conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, authProvider); - - // Test decryption - const decryptedMessage = await decryptWithViem( - mockViemPublicClient, - domains.DEVNET, - messageKit, - conditionContext, - [fakePorterUri], - ); - - expect(decryptedMessage).toEqual(toBytes(message)); - expect(getParticipantsSpy).toHaveBeenCalled(); - expect(sessionKeySpy).toHaveBeenCalled(); - expect(getRitualIdFromPublicKey).toHaveBeenCalled(); - expect(getRitualSpy).toHaveBeenCalled(); - expect(decryptSpy).toHaveBeenCalled(); - - // Clean up spies - createEthersProviderSpy.mockRestore(); - createEthersSignerSpy.mockRestore(); - }); - - it('decrypts without optional parameters', async () => { - // This test just verifies the function exists and has the right signature - expect(decryptWithViem).toBeDefined(); - expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? - }); - }); - - describe('function signatures', () => { - it('should have correct function signatures', () => { - expect(encryptWithViem.length).toBe(6); // viemPublicClient, domain, message, condition, ritualId, viemAccount - expect(decryptWithViem.length).toBe(5); // viemPublicClient, domain, messageKit, context?, porterUris? - }); - }); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a93cfa27..49a228061 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,7 +39,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -105,7 +105,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -129,7 +129,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -145,7 +145,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -157,16 +157,16 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9(webpack-cli@6.0.1)) + version: 5.6.3(webpack@5.99.9) process: specifier: ^0.11.10 version: 0.11.10 @@ -214,7 +214,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 6.2.0(webpack@5.99.9) react: specifier: ^18.3.1 version: 18.3.1 @@ -230,7 +230,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -242,13 +242,13 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9(webpack-cli@6.0.1)) + version: 5.6.3(webpack@5.99.9) react-refresh: specifier: ^0.17.0 version: 0.17.0 @@ -352,10 +352,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -511,10 +511,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 13.0.0(webpack@5.99.9) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9(webpack-cli@6.0.1)) + version: 2.21.0(webpack@5.99.9) webpack: specifier: ^5.99.9 version: 5.101.3(webpack-cli@6.0.1) @@ -690,10 +690,10 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) viem: specifier: ^2.0.0 - version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) packages: @@ -12255,12 +12255,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: type-fest: 0.21.3 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': + '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: anser: 2.3.2 core-js-pure: 3.41.0 @@ -13110,7 +13110,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -13125,7 +13125,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -13245,17 +13245,17 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1))': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) @@ -13655,7 +13655,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) babel-plugin-istanbul@6.1.1: dependencies: @@ -14404,7 +14404,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.0(webpack@5.99.9(webpack-cli@6.0.1)): + copy-webpack-plugin@13.0.0(webpack@5.99.9): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 @@ -14552,7 +14552,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) css-minimizer-webpack-plugin@3.4.1(webpack@5.101.3): dependencies: @@ -14562,7 +14562,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) css-prefers-color-scheme@6.0.3(postcss@8.5.3): dependencies: @@ -15133,7 +15133,7 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.99.9(webpack-cli@6.0.1)): + esbuild-loader@2.21.0(webpack@5.99.9): dependencies: esbuild: 0.16.17 joycon: 3.1.1 @@ -15257,7 +15257,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -15275,8 +15275,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.4(eslint@8.57.0) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.0) @@ -15358,21 +15358,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 - eslint: 8.57.0 - get-tsconfig: 4.10.0 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.12 - unrs-resolver: 1.3.2 - optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 @@ -15384,7 +15369,7 @@ snapshots: tinyglobby: 0.2.12 unrs-resolver: 1.3.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -15398,28 +15383,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 @@ -15473,7 +15447,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -15484,7 +15458,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15496,36 +15470,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.2.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.10.0)(eslint@8.57.0): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - 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: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - 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 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.8.2) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -15707,7 +15652,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) eslint@8.57.0: dependencies: @@ -16011,17 +15956,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.99.9(webpack-cli@6.0.1)): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.99.9): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) file-uri-to-path@1.0.0: {} @@ -16134,7 +16073,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.8.2 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: eslint: 8.57.1 @@ -16521,16 +16460,6 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-webpack-plugin@5.6.3(webpack@5.99.9(webpack-cli@6.0.1)): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) - html-webpack-plugin@5.6.3(webpack@5.99.9): dependencies: '@types/html-minifier-terser': 6.1.0 @@ -16539,7 +16468,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) htmlparser2@6.1.0: dependencies: @@ -17919,7 +17848,7 @@ snapshots: dependencies: schema-utils: 4.3.0 tapable: 2.2.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} @@ -18607,7 +18536,7 @@ snapshots: klona: 2.0.6 postcss: 8.5.3 semver: 7.7.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) postcss-logical@5.0.4(postcss@8.5.3): dependencies: @@ -19049,7 +18978,7 @@ snapshots: shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -19121,7 +19050,7 @@ snapshots: style-loader: 3.3.4(webpack@5.99.9) tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) terser-webpack-plugin: 5.3.14(webpack@5.99.9) - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) webpack-manifest-plugin: 4.1.1(webpack@5.99.9) workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) @@ -19467,7 +19396,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) sax@1.2.4: {} @@ -19748,7 +19677,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) source-map-support@0.5.21: dependencies: @@ -19999,7 +19928,7 @@ snapshots: style-loader@3.3.4(webpack@5.101.3): dependencies: - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) styled-jsx@5.1.6(react@18.3.1): dependencies: @@ -20154,15 +20083,6 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.99.9(webpack-cli@6.0.1)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.0 - serialize-javascript: 6.0.2 - terser: 5.39.0 - webpack: 5.99.9(webpack-cli@6.0.1) - terser-webpack-plugin@5.3.14(webpack@5.99.9): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -20170,7 +20090,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) terser@5.39.0: dependencies: @@ -20676,7 +20596,7 @@ snapshots: terser: 5.39.0 yaml: 2.7.0 - vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -20715,7 +20635,7 @@ snapshots: - tsx - yaml - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0)(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -20798,9 +20718,9 @@ snapshots: webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.99.9))(webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack-cli@6.0.1)(webpack@5.99.9))(webpack@5.99.9(webpack-cli@6.0.1)) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -20821,9 +20741,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) - webpack-dev-middleware@7.4.2(webpack@5.99.9(webpack-cli@6.0.1)): + webpack-dev-middleware@7.4.2(webpack@5.99.9): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -20867,7 +20787,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) transitivePeerDependencies: - bufferutil - debug @@ -20902,7 +20822,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.99.9(webpack-cli@6.0.1)) + webpack-dev-middleware: 7.4.2(webpack@5.99.9) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1) @@ -20916,7 +20836,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.101.3): dependencies: tapable: 2.2.1 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 2.3.1 webpack-merge@6.0.1: @@ -20937,37 +20857,6 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.99.9: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 - browserslist: 4.24.4 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.1 - es-module-lexer: 1.6.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.99.9) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - webpack@5.99.9(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 @@ -20991,7 +20880,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.99.9(webpack-cli@6.0.1)) + terser-webpack-plugin: 5.3.14(webpack@5.99.9) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -21218,7 +21107,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.99.9 + webpack: 5.99.9(webpack-cli@6.0.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: From d89c68b076c99d5c19af6b0b146a2d160c30dc9d Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 23 Sep 2025 22:42:06 +0200 Subject: [PATCH 85/97] refactor: consolidate TacoClient integration tests with shared test cases for ethers and viem --- .../taco/integration-test/taco-client.test.ts | 547 ++++-------------- packages/taco/test/client.test.ts | 361 ++++++------ 2 files changed, 290 insertions(+), 618 deletions(-) diff --git a/packages/taco/integration-test/taco-client.test.ts b/packages/taco/integration-test/taco-client.test.ts index 9e04f404d..86e71776e 100644 --- a/packages/taco/integration-test/taco-client.test.ts +++ b/packages/taco/integration-test/taco-client.test.ts @@ -1,33 +1,25 @@ import { beforeAll, describe, expect, test } from 'vitest'; import { fromBytes, toBytes } from '@nucypher/shared'; -import { PublicClient, WalletClient } from '@nucypher/shared/src/viem-utils'; import { EIP4361AuthProvider, USER_ADDRESS_PARAM_DEFAULT, } from '@nucypher/taco-auth'; import { ethers } from 'ethers'; -import { createPublicClient, createWalletClient, http } from 'viem'; +import { createPublicClient, http, LocalAccount } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; -import { polygonAmoy, sepolia } from 'viem/chains'; +import { polygonAmoy } from 'viem/chains'; import { conditions, - decrypt, - encrypt, initialize, TacoClient, + TacoClientEthersConfig, + TacoClientViemConfig, ThresholdMessageKit, } from '../src'; -import { CompoundCondition } from '../src/conditions/compound-condition'; import { DkgClient } from '../src/dkg'; -import { - decrypt as viemDecrypt, - encrypt as viemEncrypt, -} from '../src/viem-taco'; -import { UINT256_MAX } from '../test/test-utils'; const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; -const SEPOLIA_RPC_URL = 'https://sepolia.drpc.org'; const ENCRYPTOR_PRIVATE_KEY = '0x900edb9e8214b2353f82aa195e915128f419a92cfb8bbc0f4784f10ef4112b86'; const CONSUMER_PRIVATE_KEY = @@ -36,6 +28,10 @@ const DOMAIN = 'lynx'; const RITUAL_ID = 27; const CHAIN_ID = 80002; // Polygon Amoy +// temp type-safe configuration interfaces just for this testing file +type ViemTestConfig = Omit; +type EthersTestConfig = Omit; + // Create viem accounts from private keys const encryptorAccount = privateKeyToAccount( ENCRYPTOR_PRIVATE_KEY as `0x${string}`, @@ -47,53 +43,43 @@ const consumerAccount = privateKeyToAccount( describe.skipIf(!process.env.RUNNING_IN_CI)( 'TacoClient Integration Test', () => { - let viemPublicClient: PublicClient; - let viemWalletClient: WalletClient; - let ethersProvider: ethers.providers.JsonRpcProvider; - let encryptorSigner: ethers.Wallet; - let consumerSigner: ethers.Wallet; + // Create viem clients for correct network (Polygon Amoy) + const viemPublicClient = createPublicClient({ + chain: polygonAmoy, + transport: http(RPC_PROVIDER_URL), + }); + const viemTestConfig: ViemTestConfig = { + viemClient: viemPublicClient, + viemSignerAccount: encryptorAccount, + }; - // Incompatible providers (wrong chain) - let incompatibleViemClient: PublicClient; - let incompatibleEthersProvider: ethers.providers.JsonRpcProvider; + // Create ethers clients for correct network (Polygon Amoy) + const ethersProvider = new ethers.providers.JsonRpcProvider( + RPC_PROVIDER_URL, + ); + const encryptorSigner = new ethers.Wallet( + ENCRYPTOR_PRIVATE_KEY, + ethersProvider, + ); + const consumerSigner = new ethers.Wallet( + CONSUMER_PRIVATE_KEY, + ethersProvider, + ); + + const ethersTestConfig: EthersTestConfig = { + ethersProvider, + ethersSigner: encryptorSigner, + }; beforeAll(async () => { - // Create viem clients for correct network (Polygon Amoy) - viemPublicClient = createPublicClient({ - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); - - viemWalletClient = createWalletClient({ - account: consumerAccount, - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); - - // Create ethers clients for correct network (Polygon Amoy) - ethersProvider = new ethers.providers.JsonRpcProvider(RPC_PROVIDER_URL); - encryptorSigner = new ethers.Wallet( - ENCRYPTOR_PRIVATE_KEY, - ethersProvider, - ); - consumerSigner = new ethers.Wallet(CONSUMER_PRIVATE_KEY, ethersProvider); - - // Create incompatible clients (wrong chain - Sepolia) - incompatibleViemClient = createPublicClient({ - chain: sepolia, - transport: http(SEPOLIA_RPC_URL), - }); - - incompatibleEthersProvider = new ethers.providers.JsonRpcProvider( - SEPOLIA_RPC_URL, - ); - - // Initialize the library + // Initialize the TACo library await initialize(); - // Verify network connection for correct clients - const viemChainId = await viemPublicClient.getChainId(); - const ethersNetwork = await ethersProvider.getNetwork(); + // Verify both clients are connected to the correct network + const [viemChainId, ethersNetwork] = await Promise.all([ + viemPublicClient.getChainId(), + ethersProvider.getNetwork(), + ]); if (viemChainId !== CHAIN_ID) { throw new Error( @@ -106,10 +92,10 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( `Ethers provider connected to wrong network. Expected ${CHAIN_ID}, got ${ethersNetwork.chainId}`, ); } - }); + }, 10000); const createTestCondition = () => { - const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ + return new conditions.base.rpc.RpcCondition({ chain: CHAIN_ID, method: 'eth_getBalance', parameters: [':userAddress', 'latest'], @@ -118,443 +104,152 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( value: 0, }, }); + }; - const balanceLessThanMaxUint = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '<', - value: UINT256_MAX, - }, - }); + const createAuthProvider = ( + config: ViemTestConfig | EthersTestConfig, + customSigner?: ethers.Wallet | LocalAccount, + ) => { + const provider = + (config as EthersTestConfig).ethersProvider ?? + (config as ViemTestConfig).viemClient; + const signerToUse = + customSigner ?? + (config as EthersTestConfig).ethersSigner ?? + (config as ViemTestConfig).viemSignerAccount; + + return new EIP4361AuthProvider(provider, signerToUse as any); + }; - return CompoundCondition.and([ - hasPositiveBalance, - balanceLessThanMaxUint, - ]); + const setupConditionContext = async ( + messageKit: ThresholdMessageKit, + config: ViemTestConfig | EthersTestConfig, + customSigner?: ethers.Wallet | LocalAccount, + ) => { + const conditionContext = + conditions.context.ConditionContext.fromMessageKit(messageKit); + + const authProvider = createAuthProvider(config, customSigner); + conditionContext.addAuthProvider( + USER_ADDRESS_PARAM_DEFAULT, + authProvider, + ); + + return conditionContext; }; - describe('TacoClient with Viem', () => { - test('should encrypt and decrypt a message using TacoClient with viem', async () => { - // Create TacoClient with viem configuration + describe + .skipIf(!process.env.RUNNING_IN_CI) + .each< + | ['ethers', EthersTestConfig, ethers.Wallet] + | ['viem', ViemTestConfig, LocalAccount] + >([ + ['ethers', ethersTestConfig, consumerSigner], + ['viem', viemTestConfig, consumerAccount], + ])('TacoClient with %s', (label, objects, consumerSigner) => { + test('should encrypt and decrypt a message using standard encrypt method', async () => { + // Setup const tacoClient = new TacoClient({ domain: DOMAIN, ritualId: RITUAL_ID, - viemClient: viemPublicClient, - viemAccount: encryptorAccount, + ...objects, }); // Create test message and condition - const messageString = - 'This is a secret message from TacoClient with viem 🤐'; + const messageString = `This is a secret message from TacoClient with ${label} 🤐`; const message = toBytes(messageString); const condition = createTestCondition(); - // Encrypt using TacoClient + // Encrypt the message const messageKit = await tacoClient.encrypt(message, condition); expect(messageKit).toBeInstanceOf(ThresholdMessageKit); + expect(messageKit.toBytes()).toBeInstanceOf(Uint8Array); - // Prepare condition context for decryption - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKit); - - if ( - conditionContext.requestedContextParameters.has( - USER_ADDRESS_PARAM_DEFAULT, - ) - ) { - const authProvider = new EIP4361AuthProvider( - ethersProvider, - consumerSigner, - ); - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - authProvider, - ); - } - - // Decrypt using TacoClient with Uint8Array + // Setup condition context for decryption + const conditionContext = await setupConditionContext( + messageKit, + objects, + consumerSigner, + ); + + // Test decryption with Uint8Array input const decryptedBytes = await tacoClient.decrypt( messageKit.toBytes(), conditionContext, ); const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption expect(decryptedMessageString).toEqual(messageString); - // Also test decryption with messageKit directly + // Test decryption with MessageKit object input const decryptedBytes2 = await tacoClient.decrypt( messageKit, conditionContext, ); const decryptedMessageString2 = fromBytes(decryptedBytes2); - - // Verify both methods produce same result expect(decryptedMessageString2).toEqual(messageString); - expect(decryptedMessageString2).toEqual(decryptedMessageString); - }, 15000); + }, 30000); - test('should encrypt and decrypt using encryptWithPublicKey with viem', async () => { - // Create TacoClient with viem configuration + test('should encrypt and decrypt using offline encryptWithPublicKey method', async () => { + // Create TacoClient from configuration const tacoClient = new TacoClient({ domain: DOMAIN, ritualId: RITUAL_ID, - viemClient: viemPublicClient, - viemAccount: encryptorAccount, + ...objects, }); - // Get DKG public key from ritual using ethers provider - const dkgRitual = await DkgClient.getActiveRitual( - ethersProvider, - DOMAIN, - RITUAL_ID, - ); - const dkgPublicKey = dkgRitual.dkgPublicKey; - const messageString = 'This is an offline encrypted message 🔐'; const message = toBytes(messageString); const condition = createTestCondition(); - // Test encryptWithPublicKey (offline encryption) - const messageKit = await tacoClient.encryptWithPublicKey( - message, - condition, - dkgPublicKey, - ); - expect(messageKit).toBeInstanceOf(ThresholdMessageKit); - - // Prepare condition context for decryption - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKit); - - if ( - conditionContext.requestedContextParameters.has( - USER_ADDRESS_PARAM_DEFAULT, - ) - ) { - const authProvider = new EIP4361AuthProvider( - ethersProvider, - consumerSigner, - ); - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - authProvider, - ); - } - - // Decrypt the message - const decryptedBytes = await tacoClient.decrypt( - messageKit, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption matches original message - expect(decryptedMessageString).toEqual(messageString); - }, 15000); - - test('should throw error when viem client points to incompatible chain', async () => { - // Try to create TacoClient with incompatible viem client - expect(() => { - new TacoClient({ - domain: DOMAIN, - ritualId: RITUAL_ID, - viemClient: incompatibleViemClient, - viemAccount: encryptorAccount, - }); - }).toThrow(/Invalid configuration/); - }); - }); - - describe('TacoClient with Ethers', () => { - test('should encrypt and decrypt a message using TacoClient with ethers', async () => { - // Create TacoClient with ethers configuration - const tacoClient = new TacoClient({ - domain: DOMAIN, - ritualId: RITUAL_ID, - ethersProvider: ethersProvider, - ethersSigner: encryptorSigner, - }); - - // Create test message and condition - const messageString = - 'This is a secret message from TacoClient with ethers 🤐'; - const message = toBytes(messageString); - const condition = createTestCondition(); - - // Encrypt using TacoClient - const messageKit = await tacoClient.encrypt(message, condition); - expect(messageKit).toBeInstanceOf(ThresholdMessageKit); - - // Prepare condition context for decryption - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKit); - - if ( - conditionContext.requestedContextParameters.has( - USER_ADDRESS_PARAM_DEFAULT, - ) - ) { - const authProvider = new EIP4361AuthProvider( - ethersProvider, - consumerSigner, - ); - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - authProvider, - ); - } - - // Decrypt using TacoClient - const decryptedBytes = await tacoClient.decrypt( - messageKit, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption - expect(decryptedMessageString).toEqual(messageString); - }, 15000); - - test('should encrypt and decrypt using encryptWithPublicKey with ethers', async () => { - // Create TacoClient with ethers configuration - const tacoClient = new TacoClient({ - domain: DOMAIN, - ritualId: RITUAL_ID, - ethersProvider: ethersProvider, - ethersSigner: encryptorSigner, - }); - - // Get DKG public key from ritual + // Get DKG public key from ritual for offline encryption const dkgRitual = await DkgClient.getActiveRitual( ethersProvider, DOMAIN, RITUAL_ID, ); const dkgPublicKey = dkgRitual.dkgPublicKey; + expect(dkgPublicKey).toBeDefined(); - const messageString = - 'This is an offline encrypted message with ethers 🔐'; - const message = toBytes(messageString); - const condition = createTestCondition(); - - // Test encryptWithPublicKey (offline encryption) + // Perform offline encryption with DKG public key const messageKit = await tacoClient.encryptWithPublicKey( message, condition, dkgPublicKey, ); expect(messageKit).toBeInstanceOf(ThresholdMessageKit); + expect(messageKit.toBytes()).toBeInstanceOf(Uint8Array); - // Prepare condition context for decryption - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKit); - - if ( - conditionContext.requestedContextParameters.has( - USER_ADDRESS_PARAM_DEFAULT, - ) - ) { - const authProvider = new EIP4361AuthProvider( - ethersProvider, - consumerSigner, - ); - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - authProvider, - ); - } - - // Decrypt the message + // Setup condition context with consumer signer for decryption + const conditionContext = await setupConditionContext( + messageKit, + objects, + consumerSigner, + ); + + // Decrypt and verify const decryptedBytes = await tacoClient.decrypt( messageKit, conditionContext, ); const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption matches original message expect(decryptedMessageString).toEqual(messageString); }, 15000); - test('should throw error when ethers provider points to incompatible chain', async () => { - // Try to create TacoClient with incompatible ethers provider - expect(() => { - new TacoClient({ - domain: DOMAIN, - ritualId: RITUAL_ID, - ethersProvider: incompatibleEthersProvider, - ethersSigner: new ethers.Wallet( - ENCRYPTOR_PRIVATE_KEY, - incompatibleEthersProvider, - ), - }); - }).toThrow(/Invalid configuration/); - }); - }); - - describe('Functional API Chain Compatibility', () => { - test('should throw error when functional encrypt() uses incompatible viem client', async () => { - const messageString = 'Test message for incompatible viem encrypt'; - const message = toBytes(messageString); - const condition = createTestCondition(); - - await expect( - viemEncrypt( - incompatibleViemClient, - DOMAIN, - message, - condition, - RITUAL_ID, - encryptorAccount, - ), - ).rejects.toThrow(); - }, 10000); - - test('should throw error when functional encrypt() uses incompatible ethers provider', async () => { - const messageString = 'Test message for incompatible ethers encrypt'; - const message = toBytes(messageString); - const condition = createTestCondition(); - const incompatibleSigner = new ethers.Wallet( - ENCRYPTOR_PRIVATE_KEY, - incompatibleEthersProvider, - ); - - await expect( - encrypt( - incompatibleEthersProvider, - DOMAIN, - message, - condition, - RITUAL_ID, - incompatibleSigner, - ), - ).rejects.toThrow(); - }, 10000); - - test('should throw error when functional decrypt() uses incompatible viem client', async () => { - // First encrypt with correct client - const messageString = 'Test message for decrypt compatibility'; - const message = toBytes(messageString); - const condition = createTestCondition(); - - const messageKit = await viemEncrypt( - viemPublicClient, - DOMAIN, - message, - condition, - RITUAL_ID, - encryptorAccount, - ); - - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKit); - - // Try to decrypt with incompatible client - await expect( - viemDecrypt( - incompatibleViemClient, - DOMAIN, - messageKit, - conditionContext, - ), - ).rejects.toThrow(); - }, 10000); - - test('should throw error when functional decrypt() uses incompatible ethers provider', async () => { - // First encrypt with correct provider - const messageString = 'Test message for decrypt compatibility'; - const message = toBytes(messageString); - const condition = createTestCondition(); - - const messageKit = await encrypt( - ethersProvider, - DOMAIN, - message, - condition, - RITUAL_ID, - encryptorSigner, - ); - - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKit); - - // Try to decrypt with incompatible provider - await expect( - decrypt( - incompatibleEthersProvider, - DOMAIN, - messageKit, - conditionContext, - ), - ).rejects.toThrow(); - }, 10000); - }); - - describe('TacoClient Configuration Validation', () => { - test('should validate configuration successfully for compatible clients', async () => { - const viemTacoClient = new TacoClient({ - domain: DOMAIN, - ritualId: RITUAL_ID, - viemClient: viemPublicClient, - viemAccount: encryptorAccount, - }); - - const ethersTacoClient = new TacoClient({ - domain: DOMAIN, - ritualId: RITUAL_ID, - ethersProvider: ethersProvider, - ethersSigner: encryptorSigner, - }); - - // Validate both configurations - const viemValidation = await viemTacoClient.validateConfig(); - const ethersValidation = await ethersTacoClient.validateConfig(); - - expect(viemValidation.isValid).toBe(true); - expect(viemValidation.errors).toHaveLength(0); - expect(ethersValidation.isValid).toBe(true); - expect(ethersValidation.errors).toHaveLength(0); - }, 10000); - - test('should return configuration via getConfig()', () => { + test('should successfully validate network configuration', async () => { + // Setup const tacoClient = new TacoClient({ domain: DOMAIN, ritualId: RITUAL_ID, - viemClient: viemPublicClient, - viemAccount: encryptorAccount, + ...objects, }); - const config = tacoClient.getConfig(); - - expect(config.domain).toBe(DOMAIN); - expect(config.ritualId).toBe(RITUAL_ID); - expect('viemClient' in config).toBe(true); - expect('viemAccount' in config).toBe(true); - }); + // Validate configuration with network calls + const validation = await tacoClient.validateConfig(); - test('should throw error for invalid domain', () => { - expect(() => { - new TacoClient({ - domain: 'invalid-domain' as any, - ritualId: RITUAL_ID, - viemClient: viemPublicClient, - viemAccount: encryptorAccount, - }); - }).toThrow(/Invalid configuration/); - }); - - test('should throw error for invalid ritual ID', () => { - expect(() => { - new TacoClient({ - domain: DOMAIN, - ritualId: -1, - viemClient: viemPublicClient, - viemAccount: encryptorAccount, - }); - }).toThrow(/Invalid configuration/); - }); + // Verify validation results + expect(validation.isValid).toBe(true); + expect(validation.errors).toHaveLength(0); + }, 10000); }); }, ); diff --git a/packages/taco/test/client.test.ts b/packages/taco/test/client.test.ts index e4762bec1..8bd7b4fa4 100644 --- a/packages/taco/test/client.test.ts +++ b/packages/taco/test/client.test.ts @@ -1,15 +1,7 @@ -/** - * TacoClient Tests - * - * Tests for the Object-Oriented TacoClient interface - */ - -import { type Account, type PublicClient } from '@nucypher/shared'; import type { ethers } from 'ethers'; import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { - DOMAINS, TacoClient, type TacoClientConfig, type TacoClientEthersConfig, @@ -20,7 +12,7 @@ import { TacoConfigValidator, } from '../src/taco-config-validator'; -// Mock viem dependencies +// Mock viem dependencies for testing const mockViemClient = { getChainId: vi.fn().mockResolvedValue(80002), call: vi.fn().mockResolvedValue('0x'), @@ -36,7 +28,7 @@ const mockViemAccount = { signTypedData: vi.fn().mockResolvedValue('0x'), } as unknown as Account; -// Mock ethers dependencies +// Mock ethers dependencies for testing const mockEthersProvider = { getNetwork: vi .fn() @@ -55,39 +47,48 @@ const mockEthersSigner = { describe('TacoConfigValidator', () => { describe('Domain Management', () => { - it('should return all supported domains', () => { + it('should return all supported domain names', () => { const domains = TacoConfigValidator.getSupportedDomains(); expect(domains).toEqual(['lynx', 'tapir', 'mainnet']); }); - it('should validate domain names correctly', () => { - expect(TacoConfigValidator.isValidDomain('tapir')).toBe(true); - expect(TacoConfigValidator.isValidDomain('lynx')).toBe(true); - expect(TacoConfigValidator.isValidDomain('mainnet')).toBe(true); - expect(TacoConfigValidator.isValidDomain('INVALID' as DomainName)).toBe( - false, + it.each([ + ['tapir', true, 'valid testnet domain'], + ['lynx', true, 'valid devnet domain'], + ['mainnet', true, 'valid production domain'], + ['INVALID', false, 'invalid domain name'], + ['', false, 'empty domain name'], + ['testnet', false, 'legacy domain key (not domain name)'], + ])('should validate domain "%s" as %s (%s)', (domain, expected) => { + expect(TacoConfigValidator.isValidDomain(domain as DomainName)).toBe( + expected, ); - expect(TacoConfigValidator.isValidDomain('' as DomainName)).toBe(false); }); - it('should validate ritual IDs correctly (positive numbers only)', () => { - // Any positive number is valid for any domain - expect(TacoConfigValidator.isValidRitualId('lynx', 27)).toBe(true); - expect(TacoConfigValidator.isValidRitualId('tapir', 6)).toBe(true); - expect(TacoConfigValidator.isValidRitualId('mainnet', 42)).toBe(true); - expect(TacoConfigValidator.isValidRitualId('lynx', 999)).toBe(true); - expect(TacoConfigValidator.isValidRitualId('tapir', 999)).toBe(true); - expect(TacoConfigValidator.isValidRitualId('mainnet', 1)).toBe(true); - - // Zero and negative numbers are invalid - expect(TacoConfigValidator.isValidRitualId('mainnet', 0)).toBe(false); - expect(TacoConfigValidator.isValidRitualId('lynx', -1)).toBe(false); - expect(TacoConfigValidator.isValidRitualId('tapir', -5)).toBe(false); - }); + it.each([ + // Valid ritual IDs (any positive number) + ['lynx', 27, true, 'default devnet ritual ID'], + ['tapir', 6, true, 'default testnet ritual ID'], + ['mainnet', 42, true, 'custom mainnet ritual ID'], + ['lynx', 999, true, 'large ritual ID for devnet'], + ['tapir', 1, true, 'minimum valid ritual ID'], + ['mainnet', 100, true, 'typical mainnet ritual ID'], + // Invalid ritual IDs (zero and negative) + ['mainnet', 0, false, 'zero ritual ID'], + ['lynx', -1, false, 'negative ritual ID'], + ['tapir', -5, false, 'large negative ritual ID'], + ])( + `should validate with domain "%s" the ritual ID %d as %s (%s)`, + (domain, ritualId, expected) => { + expect( + TacoConfigValidator.isValidRitualId(domain as DomainName, ritualId), + ).toBe(expected); + }, + ); }); - describe('Configuration Validation', () => { - it('should validate correct configurations', () => { + describe('Fast Configuration Validation', () => { + it('should pass validation for valid viem configuration', () => { const result = TacoConfigValidator.validateFast({ domain: 'tapir', ritualId: 6, @@ -99,7 +100,7 @@ describe('TacoConfigValidator', () => { expect(result.errors).toHaveLength(0); }); - it('should detect invalid configurations', () => { + it('should fail validation for invalid domain configuration', () => { const result = TacoConfigValidator.validateFast({ domain: 'INVALID_DOMAIN' as DomainName, ritualId: 999, @@ -111,7 +112,7 @@ describe('TacoConfigValidator', () => { expect(result.errors.length).toBeGreaterThan(0); }); - it('should require domain', () => { + it('should fail validation when domain is missing', () => { const result = TacoConfigValidator.validateFast({ ritualId: 6, viemClient: mockViemClient, @@ -124,9 +125,10 @@ describe('TacoConfigValidator', () => { }); }); -// Helper to access TacoClient's private static members for testing +// Test helpers for accessing TacoClient's private static members const getTacoClientStatics = () => TacoClient as unknown as { initializationPromise: Promise | undefined }; + const resetTacoClientStatics = () => { delete (TacoClient as unknown as { initializationPromise?: Promise }) .initializationPromise; @@ -134,7 +136,7 @@ const resetTacoClientStatics = () => { describe('TacoClient', () => { beforeAll(async () => { - // Should be able to wait for initialization + // Ensure TacoClient is initialized before running tests await TacoClient.initialize(); }); @@ -157,18 +159,18 @@ describe('TacoClient', () => { }; }); - describe('Construction', () => { - it('should create client with valid viem configuration', () => { + describe('Client Construction', () => { + it('should successfully create client with valid viem configuration', () => { const client = new TacoClient(validViemConfig); expect(client).toBeInstanceOf(TacoClient); }); - it('should create client with valid ethers configuration', () => { + it('should successfully create client with valid ethers configuration', () => { const client = new TacoClient(validEthersConfig); expect(client).toBeInstanceOf(TacoClient); }); - it('should throw for invalid domain', () => { + it('should throw error for invalid domain name', () => { expect( () => new TacoClient({ @@ -178,7 +180,7 @@ describe('TacoClient', () => { ).toThrow('Invalid domain name'); }); - it('should throw for invalid ritual ID', () => { + it('should throw error for invalid ritual ID', () => { expect( () => new TacoClient({ @@ -188,67 +190,69 @@ describe('TacoClient', () => { ).toThrow('Invalid ritual ID'); }); - it('should throw for missing required domain', () => { - expect( - () => - new TacoClient({ - ...validViemConfig, - domain: undefined, - } as unknown as TacoClientConfig), - ).toThrow('The property `domain` is required'); - }); - - it('should throw for missing required ritual ID', () => { - expect( - () => - new TacoClient({ - ...validViemConfig, - ritualId: undefined, - } as unknown as TacoClientConfig), - ).toThrow('The property `ritualId` is required'); - }); - - it('should throw when missing viemClient in viem config', () => { - expect( - () => - new TacoClient({ - ...validViemConfig, - viemClient: undefined, - } as unknown as TacoClientConfig), - ).toThrow('viemClient is required for viem configuration'); - }); - - it('should throw when missing viemAccount in viem config', () => { - expect( - () => - new TacoClient({ - ...validViemConfig, - viemAccount: undefined, - } as unknown as TacoClientConfig), - ).toThrow('viemAccount is required for viem configuration'); - }); - - it('should throw when missing ethersProvider in ethers config', () => { - expect( - () => - new TacoClient({ - ...validEthersConfig, - ethersProvider: undefined, - } as unknown as TacoClientConfig), - ).toThrow('ethersProvider is required for ethers configuration'); - }); - - it('should throw when missing ethersSigner in ethers config', () => { - expect( - () => - new TacoClient({ - ...validEthersConfig, - ethersSigner: undefined, - } as unknown as TacoClientConfig), - ).toThrow('ethersSigner is required for ethers configuration'); - }); - - it('should throw for mixed configuration types', () => { + it.each([ + { + configModifications: { domain: undefined }, + baseConfig: 'viem', + expectedError: 'The property `domain` is required', + description: 'missing domain from viem config', + }, + { + configModifications: { ritualId: undefined }, + baseConfig: 'viem', + expectedError: 'The property `ritualId` is required', + description: 'missing ritual ID from viem config', + }, + { + configModifications: { viemClient: undefined }, + baseConfig: 'viem', + expectedError: 'viemClient is required for viem configuration', + description: 'missing viemClient from viem config', + }, + { + configModifications: { viemSignerAccount: undefined }, + baseConfig: 'viem', + expectedError: 'viemSignerAccount is required for viem configuration', + description: 'missing viemSignerAccount from viem config', + }, + { + configModifications: { domain: undefined }, + baseConfig: 'ethers', + expectedError: 'The property `domain` is required', + description: 'missing domain from ethers config', + }, + { + configModifications: { ritualId: undefined }, + baseConfig: 'ethers', + expectedError: 'The property `ritualId` is required', + description: 'missing ritual ID from ethers config', + }, + { + configModifications: { ethersProvider: undefined }, + baseConfig: 'ethers', + expectedError: 'ethersProvider is required for ethers configuration', + description: 'missing ethersProvider from ethers config', + }, + { + configModifications: { ethersSigner: undefined }, + baseConfig: 'ethers', + expectedError: 'ethersSigner is required for ethers configuration', + description: 'missing ethersSigner from ethers config', + }, + ])( + 'should throw error for $description', + ({ configModifications, baseConfig, expectedError }) => { + const baseConfigObject = + baseConfig === 'viem' ? validViemConfig : validEthersConfig; + const invalidConfig = { ...baseConfigObject, ...configModifications }; + + expect(() => new TacoClient(invalidConfig as TacoClientConfig)).toThrow( + expectedError, + ); + }, + ); + + it('should throw error for mixed/invalid configuration types', () => { expect( () => new TacoClient({ @@ -261,42 +265,47 @@ describe('TacoClient', () => { }); }); - describe('Configuration Methods', () => { - it('should return readonly configuration for viem client', () => { - const client = new TacoClient(validViemConfig); - const config = client.getConfig(); - - expect(config.domain).toBe('tapir'); - expect(config.ritualId).toBe(6); - expect('viemClient' in config).toBe(true); - expect('viemAccount' in config).toBe(true); - - // Should be frozen/readonly - expect(() => { - (config as Record).domain = 'lynx'; - }).toThrow(); - }); - - it('should return readonly configuration for ethers client', () => { - const client = new TacoClient(validEthersConfig); - const config = client.getConfig(); - - expect(config.domain).toBe('tapir'); - expect(config.ritualId).toBe(6); - expect('ethersProvider' in config).toBe(true); - expect('ethersSigner' in config).toBe(true); - - // Should be frozen/readonly - expect(() => { - (config as Record).domain = 'lynx'; - }).toThrow(); - }); + describe('Configuration Access', () => { + it.each([ + { + configType: 'viem', + config: () => validViemConfig, + expectedProperties: ['viemClient', 'viemSignerAccount'], + description: 'viem client configuration', + }, + { + configType: 'ethers', + config: () => validEthersConfig, + expectedProperties: ['ethersProvider', 'ethersSigner'], + description: 'ethers client configuration', + }, + ])( + 'should return readonly configuration object for $description', + ({ config, expectedProperties }) => { + const client = new TacoClient(config()); + const clientConfig = client.getConfig(); + + // Verify common properties + expect(clientConfig.domain).toBe('tapir'); + expect(clientConfig.ritualId).toBe(6); + + // Verify config-specific properties + expectedProperties.forEach((prop) => { + expect(prop in clientConfig).toBe(true); + }); + + // Should be frozen/readonly + expect(() => { + (clientConfig as Record).domain = 'lynx'; + }).toThrow(); + }, + ); }); - describe('Initialization', () => { - it('should initialize TACo automatically', async () => { - // Reset static initialization state to check for automatic initialization - // that happens after calling any TacoClient constructor + describe('Initialization Lifecycle', () => { + it('should trigger automatic TACo initialization on client construction', async () => { + // Reset static initialization state to verify automatic initialization + // occurs when TacoClient constructor is called resetTacoClientStatics(); new TacoClient(validViemConfig); @@ -305,7 +314,7 @@ describe('TacoClient', () => { expect(getTacoClientStatics().initializationPromise).toBeDefined(); }); - it('should share initialization across multiple clients', async () => { + it('should share single initialization promise across multiple client instances', async () => { new TacoClient(validViemConfig); new TacoClient({ ...validViemConfig, @@ -320,8 +329,8 @@ describe('TacoClient', () => { expect(initPromise1).toBeDefined(); }); - it('should have error handling structure in place', async () => { - // Test that TacoClient.initialize() method exists and returns a promise + it('should provide static initialize method with proper promise handling', async () => { + // Verify TacoClient.initialize() method exists and returns a promise const initPromise = TacoClient.initialize(); expect(initPromise).toBeInstanceOf(Promise); @@ -334,20 +343,25 @@ describe('TacoClient', () => { }); }); - describe('Static Validation', () => { - it('should validate correct viem configuration', async () => { - const result = await TacoConfigValidator.validateFull(validViemConfig); + describe('Full Configuration Validation', () => { + it.each([ + { + configType: 'viem', + config: () => validViemConfig, + description: 'correct viem configuration', + }, + { + configType: 'ethers', + config: () => validEthersConfig, + description: 'correct ethers configuration', + }, + ])('should pass full validation for $description', async ({ config }) => { + const result = await TacoConfigValidator.validateFull(config()); expect(result.isValid).toBe(true); expect(result.errors).toHaveLength(0); }); - it('should validate correct ethers configuration', async () => { - const result = await TacoConfigValidator.validateFull(validEthersConfig); - expect(result.isValid).toBe(true); - expect(result.errors).toHaveLength(0); - }); - - it('should detect missing dependencies', async () => { + it('should detect and report missing blockchain dependencies', async () => { const result = await TacoConfigValidator.validateFull({ domain: 'tapir', ritualId: 6, @@ -360,7 +374,7 @@ describe('TacoClient', () => { ); }); - it('should detect invalid domain in validation', async () => { + it('should detect and report invalid domain in full validation', async () => { const result = await TacoConfigValidator.validateFull({ ...validViemConfig, domain: 'INVALID' as DomainName, @@ -372,7 +386,7 @@ describe('TacoClient', () => { ).toBe(true); }); - it('should detect invalid ritual ID in validation', async () => { + it('should detect and report invalid ritual ID during construction', async () => { expect( () => new TacoClient({ @@ -385,28 +399,8 @@ describe('TacoClient', () => { }); }); - describe('Domain Handling', () => { - it('should work with all supported domains', () => { - const lynxConfig: TacoClientViemConfig = { - domain: 'lynx', - ritualId: 27, - viemClient: mockViemClient, - viemAccount: mockViemAccount, - }; - - const mainnetConfig: TacoClientViemConfig = { - domain: 'mainnet', - ritualId: 42, // Custom ritual ID for mainnet - viemClient: mockViemClient, - viemAccount: mockViemAccount, - }; - - expect(() => new TacoClient(lynxConfig)).not.toThrow(); - expect(() => new TacoClient(validViemConfig)).not.toThrow(); // tapir - expect(() => new TacoClient(mainnetConfig)).not.toThrow(); - }); - - it('should provide correct domain information', () => { + describe('Domain Support', () => { + it('should provide domain name via getConfig method', () => { const client = new TacoClient(validViemConfig); const config = client.getConfig(); @@ -414,20 +408,3 @@ describe('TacoClient', () => { }); }); }); - -describe('DOMAINS', () => { - it('should have correct simplified structure', () => { - expect(DOMAINS).toBeDefined(); - expect(Object.keys(DOMAINS)).toContain('DEVNET'); - expect(Object.keys(DOMAINS)).toContain('TESTNET'); - expect(Object.keys(DOMAINS)).toContain('MAINNET'); - }); - - it('should have required properties for each domain', () => { - Object.values(DOMAINS).forEach((domainInfo) => { - expect(domainInfo.domain).toBeDefined(); - expect(domainInfo.chainId).toBeDefined(); - expect(typeof domainInfo.chainId).toBe('number'); - }); - }); -}); From d7d985055cee5fee4e3ec7a5e7b8c7a7147ca5bd Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Tue, 23 Sep 2025 22:45:38 +0200 Subject: [PATCH 86/97] chore: update pnpm-lock.yaml --- pnpm-lock.yaml | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49a228061..dd4e60162 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -448,8 +448,8 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@types/node': - specifier: ^24.3.0 - version: 24.3.0 + specifier: ^20.17.28 + version: 20.17.28 '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -458,7 +458,7 @@ importers: version: 18.3.5(@types/react@18.3.20) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) examples/taco/react-viem: dependencies: @@ -482,11 +482,11 @@ importers: version: 18.3.1(react@18.3.1) viem: specifier: ^2.0.0 - version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) devDependencies: '@types/node': specifier: ^20.17.28 - version: 20.19.17 + version: 20.17.28 '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -495,7 +495,7 @@ importers: version: 18.3.5(@types/react@18.3.20) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) examples/taco/webpack-5: dependencies: @@ -12624,11 +12624,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.3.0 + '@types/node': 20.17.28 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 24.3.0 + '@types/node': 20.17.28 optional: true '@types/deep-equal@1.0.4': {} @@ -12729,7 +12729,12 @@ snapshots: '@types/node@24.3.0': dependencies: - undici-types: 7.10.0 + undici-types: 6.19.8 + + '@types/node@22.13.14': + dependencies: + undici-types: 6.20.0 + optional: true '@types/normalize-package-data@2.4.4': {} @@ -12810,7 +12815,7 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 24.3.0 + '@types/node': 20.17.28 '@types/ws@8.18.0': dependencies: @@ -17423,7 +17428,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.3.0 + '@types/node': 20.17.28 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -20420,7 +20425,10 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.10.0: {} + undici-types@6.19.8: {} + + undici-types@6.20.0: + optional: true unicode-canonical-property-names-ecmascript@2.0.1: {} From b91c8216913b18754e1b85da28ef33ccfee4d620 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Thu, 25 Sep 2025 21:28:13 +0200 Subject: [PATCH 87/97] resolve coding conflicts after rebase --- packages/shared/src/viem/signer-adapter.ts | 33 +- .../shared/test/ethers-viem-utils.test.ts | 243 ---------- .../shared/test/viem-ethers-adapter.test.ts | 25 +- packages/taco-auth/package.json | 8 - packages/taco-auth/src/providers/index.ts | 1 - .../taco-auth/src/providers/viem/index.ts | 3 - .../src/providers/viem/viem-auth-providers.ts | 80 ---- .../src/providers/viem/viem-wrappers.ts | 161 ------- packages/taco/VIEM_SUPPORT.md | 129 ++--- .../viem-encrypt-decrypt.test.ts | 261 ---------- .../viem-to-ethers-ens.test.ts | 5 +- packages/taco/package.json | 8 - packages/taco/src/client-config.ts | 8 +- packages/taco/src/index.ts | 3 +- packages/taco/src/taco-client.ts | 6 +- packages/taco/src/taco-config-validator.ts | 6 +- packages/taco/src/viem-taco.ts | 134 ------ packages/taco/src/wrappers/index.ts | 6 - packages/taco/src/wrappers/viem-wrappers.ts | 343 -------------- packages/taco/test/client.test.ts | 17 +- packages/taco/test/viem-wrappers.test.ts | 122 ----- pnpm-lock.yaml | 446 +++++++++--------- 22 files changed, 303 insertions(+), 1745 deletions(-) delete mode 100644 packages/shared/test/ethers-viem-utils.test.ts delete mode 100644 packages/taco-auth/src/providers/viem/index.ts delete mode 100644 packages/taco-auth/src/providers/viem/viem-auth-providers.ts delete mode 100644 packages/taco-auth/src/providers/viem/viem-wrappers.ts delete mode 100644 packages/taco/integration-test/viem-encrypt-decrypt.test.ts delete mode 100644 packages/taco/src/viem-taco.ts delete mode 100644 packages/taco/src/wrappers/index.ts delete mode 100644 packages/taco/src/wrappers/viem-wrappers.ts delete mode 100644 packages/taco/test/viem-wrappers.test.ts diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index 4a8d66289..db84a933f 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -1,5 +1,6 @@ -import { type TACoSigner } from '../taco-interfaces'; -import { SignerLike } from '../types'; +import { ethers } from 'ethers'; + +import { type TacoSigner } from '../taco-signer'; import { type Address, type SignerAccount } from './types'; @@ -41,32 +42,20 @@ export class ViemSignerAdapter implements TacoSigner { async signMessage(message: string | Uint8Array): Promise { if (!this.viemAccount.signMessage) { - throw new Error('Account does not support message signing'); + throw new Error( + 'Account does not support message signing. Expected a LocalAccount or a WalletClient with signing capability.', + ); } if (typeof message === 'string') { - return await this.viemAccount.signMessage({ message }); + return await this.viemAccount.signMessage({ + account: await this.getAddress(), + message, + }); } else { return await this.viemAccount.signMessage({ + account: await this.getAddress(), message: { raw: message }, }); } } } - -/** - * Convert viem account to TACoSigner or return existing signer - * - * This is the main entry point for creating signers for internal TACo use. - * Unlike toEthersProvider which creates actual ethers objects, - * this creates minimal adapters implementing only what TACo needs. - * - * @param signerLike - Either a viem Account or an existing TACoSigner - * @returns A TACoSigner interface implementation - */ -export function toTACoSigner(signerLike: SignerLike): TACoSigner { - if (isViemAccount(signerLike)) { - return new ViemSignerAdapter(signerLike); - } else { - return signerLike; - } -} diff --git a/packages/shared/test/ethers-viem-utils.test.ts b/packages/shared/test/ethers-viem-utils.test.ts deleted file mode 100644 index aba97141b..000000000 --- a/packages/shared/test/ethers-viem-utils.test.ts +++ /dev/null @@ -1,243 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -// @ts-nocheck -import { ethers } from 'ethers'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; - -import { toEthersProvider } from '../src/viem/ethers-adapter'; -import { toTACoSigner, ViemSignerAdapter } from '../src/viem/signer-adapter'; -import { isViemAccount, isViemClient } from '../src/viem/type-guards'; - -describe('viem adapter utilities', () => { - describe('function exports', () => { - it('should export all adapter functions', () => { - expect(toEthersProvider).toBeDefined(); - expect(toTACoSigner).toBeDefined(); - expect(isViemClient).toBeDefined(); - expect(isViemAccount).toBeDefined(); - expect(typeof toEthersProvider).toBe('function'); - expect(typeof toTACoSigner).toBe('function'); - expect(typeof isViemClient).toBe('function'); - expect(typeof isViemAccount).toBe('function'); - }); - }); - - describe('ethers provider interop', () => { - let mockViemPublicClient: any; - - beforeEach(() => { - mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x1234'), - chain: { - name: 'Polygon Amoy', - id: 80002, - contracts: {}, - }, - transport: { - type: 'http', - url: 'https://rpc.ankr.com/polygon_amoy', - }, - }; - }); - - it('should create an ethers provider from viem client (http)', () => { - const provider = toEthersProvider(mockViemPublicClient); - - expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); - }); - }); - - describe('ViemSignerAdapter', () => { - let mockViemAccount: any; - - beforeEach(() => { - mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - }; - }); - - it('should create signer without provider', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - - expect(signer.getAddress).toBeDefined(); - expect(signer.signMessage).toBeDefined(); - - // Actually call the methods to ensure coverage - await signer.getAddress(); - await signer.signMessage('test'); - }); - - it('should get address from viem account', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - const address = await signer.getAddress(); - - expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); - }); - - it('should sign string message', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - const signature = await signer.signMessage('test message'); - - expect(signature).toBe('0xsignature'); - expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ - message: 'test message', - }); - }); - - it('should sign Uint8Array message', async () => { - const signer = new ViemSignerAdapter(mockViemAccount); - const message = new Uint8Array([1, 2, 3, 4]); - - await signer.signMessage(message); - - expect(mockViemAccount.signMessage).toHaveBeenCalledWith({ - message: { - raw: message, - }, - }); - }); - - it('should throw error if account does not support signing', async () => { - const accountWithoutSigning = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - // no signMessage method - }; - - const signer = new ViemSignerAdapter(accountWithoutSigning); - - await expect(signer.signMessage('test')).rejects.toThrow( - 'Account does not support message signing', - ); - }); - }); - - describe('toEthersProvider', () => { - it('should create provider from viem client', async () => { - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x'), - chain: { name: 'test', id: 80002 }, - transport: { type: 'http', url: 'https://rpc.ankr.com/polygon_amoy' }, - } as any; - - const provider = toEthersProvider(mockViemPublicClient); - - expect(provider).toBeInstanceOf(ethers.providers.JsonRpcProvider); - }); - - it('should return ethers provider unchanged', () => { - const ethersProvider = new ethers.providers.JsonRpcProvider(); - const result = toEthersProvider(ethersProvider); - - expect(result).toBe(ethersProvider); - }); - - it('should handle non-viem provider correctly', () => { - const nonViemProvider = { - someProperty: 'value', - someMethod: () => {}, - } as any; - - const result = toEthersProvider(nonViemProvider); - - expect(result).toBe(nonViemProvider); - }); - }); - - describe('toTACoSigner', () => { - it('should create signer from viem account', async () => { - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - } as any; - - const signer = toTACoSigner(mockViemAccount); - - expect(signer).toBeInstanceOf(ViemSignerAdapter); - - // Actually call methods to ensure coverage - const address = await signer.getAddress(); - expect(address).toBe('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'); - }); - - it('should return ethers signer unchanged', () => { - const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); - const result = toTACoSigner(ethersSigner); - - expect(result).toBe(ethersSigner); - }); - - it('should handle non-viem signer correctly', () => { - const nonViemSigner = { - someProperty: 'value', - someMethod: () => {}, - provider: {}, // This will make it fail the isViemAccount check - } as any; - - const result = toTACoSigner(nonViemSigner); - - expect(result).toBe(nonViemSigner); - }); - }); - - describe('type guards', () => { - describe('isViemClient', () => { - it('should identify viem client by chain property', () => { - const viemClient = { - chain: { name: 'test', id: 1 }, - getChainId: vi.fn(), - }; - - expect(isViemClient(viemClient)).toBe(true); - }); - - it('should identify viem client by getChainId method', () => { - const viemClient = { - getChainId: () => Promise.resolve(1), - }; - - expect(isViemClient(viemClient)).toBe(true); - }); - - it('should reject ethers provider', () => { - const ethersProvider = new ethers.providers.JsonRpcProvider(); - - expect(isViemClient(ethersProvider)).toBe(false); - }); - - it('should reject object without viem properties', () => { - const notViemClient = { - someMethod: () => {}, - }; - - expect(isViemClient(notViemClient)).toBe(false); - }); - }); - - describe('isViemAccount', () => { - it('should identify viem account by address property', () => { - const viemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - }; - - expect(isViemAccount(viemAccount)).toBe(true); - }); - - it('should reject ethers signer', () => { - const ethersSigner = new ethers.Wallet('0x' + '1'.repeat(64)); - - expect(isViemAccount(ethersSigner)).toBe(false); - }); - - it('should reject object with provider property', () => { - const signerWithProvider = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - provider: {}, - }; - - expect(isViemAccount(signerWithProvider)).toBe(false); - }); - }); - }); -}); diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 4a92866a9..38a52f75a 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -4,10 +4,12 @@ import { ethers } from 'ethers'; import { privateKeyToAccount } from 'viem/accounts'; import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { createPublicClient, fallback, http, webSocket } from 'viem'; import { fromHexString } from '../src'; -import { toEthersProvider } from '../src/viem/ethers-adapter'; +import { toEthersProvider, toTacoSigner } from '../src/adapters'; +import { viemClientToProvider } from '../src/viem/ethers-adapter'; import { ViemSignerAdapter } from '../src/viem/signer-adapter'; -import { isViemClient } from '../src/viem/type-guards'; +import { isViemClient, isViemSignerAccount } from '../src/viem/type-guards'; describe('viem ethers adapter', () => { const PRIVATE_KEY = @@ -124,27 +126,19 @@ describe('viem ethers adapter', () => { }); describe('ViemSignerAdapter', () => { - const PRIVATE_KEY = - '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; // 32-byte hex - const viemAccount = privateKeyToAccount(PRIVATE_KEY); const ethersSigner = new ethers.Wallet(PRIVATE_KEY); it('should create signer without provider', () => { const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); expect(viemAdaptedSigner).toBeInstanceOf(ViemSignerAdapter); - const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); - expect(viemAdaptedSigner).toBeInstanceOf(ViemSignerAdapter); }); it('should get address from viem account', async () => { const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); - const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); const address = await viemAdaptedSigner.getAddress(); expect(address).toBe(ethersSigner.address); - const address = await viemAdaptedSigner.getAddress(); - expect(address).toBe(ethersSigner.address); }); it('should sign string message', async () => { @@ -152,12 +146,6 @@ describe('viem ethers adapter', () => { const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); const viemSignature = await viemAdaptedSigner.signMessage(message); - const ethersSignature = await ethersSigner.signMessage(message); - expect(viemSignature).toBe(ethersSignature); - const message = 'test message'; - const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); - const viemSignature = await viemAdaptedSigner.signMessage(message); - const ethersSignature = await ethersSigner.signMessage(message); expect(viemSignature).toBe(ethersSignature); }); @@ -165,16 +153,11 @@ describe('viem ethers adapter', () => { it('should sign Uint8Array message', async () => { const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); const messageBytes = fromHexString('0xdeadbeef'); - const viemAdaptedSigner = new ViemSignerAdapter(viemAccount); - const messageBytes = fromHexString('0xdeadbeef'); - const viemSignature = await viemAdaptedSigner.signMessage(messageBytes); const viemSignature = await viemAdaptedSigner.signMessage(messageBytes); const ethersSignature = await ethersSigner.signMessage(messageBytes); expect(viemSignature).toBe(ethersSignature); - const ethersSignature = await ethersSigner.signMessage(messageBytes); - expect(viemSignature).toBe(ethersSignature); }); it('should throw error if account does not support signing', async () => { diff --git a/packages/taco-auth/package.json b/packages/taco-auth/package.json index 83e4648b0..2e68475af 100644 --- a/packages/taco-auth/package.json +++ b/packages/taco-auth/package.json @@ -47,14 +47,6 @@ "devDependencies": { "@nucypher/test-utils": "workspace:*" }, - "peerDependencies": { - "viem": "^2.0.0" - }, - "peerDependenciesMeta": { - "viem": { - "optional": true - } - }, "engines": { "node": ">=18", "pnpm": ">=8.0.0" diff --git a/packages/taco-auth/src/providers/index.ts b/packages/taco-auth/src/providers/index.ts index b1bcd4e23..76b739f00 100644 --- a/packages/taco-auth/src/providers/index.ts +++ b/packages/taco-auth/src/providers/index.ts @@ -7,4 +7,3 @@ export { } from './eip4361/auth'; export * from './eip4361/eip4361'; export * from './eip4361/external-eip4361'; -export * from './viem'; diff --git a/packages/taco-auth/src/providers/viem/index.ts b/packages/taco-auth/src/providers/viem/index.ts deleted file mode 100644 index 46d967630..000000000 --- a/packages/taco-auth/src/providers/viem/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { ViemEIP4361AuthProvider } from './viem-auth-providers'; -export type { EIP4361AuthProviderParams } from './viem-auth-providers'; -export { createEthersProvider, createEthersSigner } from './viem-wrappers'; diff --git a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts b/packages/taco-auth/src/providers/viem/viem-auth-providers.ts deleted file mode 100644 index 9c5bca591..000000000 --- a/packages/taco-auth/src/providers/viem/viem-auth-providers.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { EIP4361AuthProvider, EIP4361AuthProviderParams } from '../eip4361/eip4361'; - -import { createEthersProvider, createEthersSigner } from './viem-wrappers'; - -// Dynamic viem types (available only when viem is installed) -type Account = any; -type PublicClient = any; - -/** - * Viem-compatible EIP4361 authentication provider. - * - * This class provides a clean viem-native API for EIP4361 authentication - * while internally handling the conversion to ethers.js objects that the - * underlying EIP4361AuthProvider expects. - * - * @example - * ```typescript - * import { createPublicClient, http } from 'viem'; - * import { privateKeyToAccount } from 'viem/accounts'; - * import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; - * - * const publicClient = createPublicClient({ - * chain: polygon, - * transport: http() - * }); - * const account = privateKeyToAccount('0x...'); - * - * const authProvider = new ViemEIP4361AuthProvider( - * publicClient, - * account, - * { domain: 'my-app.com', uri: 'https://my-app.com' } - * ); - * - * const signature = await authProvider.getOrCreateAuthSignature(); - * ``` - */ -export class ViemEIP4361AuthProvider { - private ethersAuthProvider: EIP4361AuthProvider; - - /** - * Create a new ViemEIP4361AuthProvider - * - * @param viemPublicClient - viem PublicClient for blockchain interactions - * @param viemAccount - viem Account for signing operations - * @param options - Optional EIP4361 parameters (domain, uri) - */ - constructor( - viemPublicClient: PublicClient, - viemAccount: Account, - options?: EIP4361AuthProviderParams - ) { - // Convert viem objects to ethers objects internally - const ethersProvider = createEthersProvider(viemPublicClient); - const ethersSigner = createEthersSigner(viemAccount, ethersProvider); - - // Create the underlying ethers auth provider - this.ethersAuthProvider = new EIP4361AuthProvider( - ethersProvider, - ethersSigner, - options - ); - } - - /** - * Get or create authentication signature - */ - async getOrCreateAuthSignature() { - return this.ethersAuthProvider.getOrCreateAuthSignature(); - } - - /** - * Get the underlying ethers auth provider (for advanced use cases) - */ - get ethersProvider(): EIP4361AuthProvider { - return this.ethersAuthProvider; - } -} - -// Export type for consumers -export type { EIP4361AuthProviderParams }; diff --git a/packages/taco-auth/src/providers/viem/viem-wrappers.ts b/packages/taco-auth/src/providers/viem/viem-wrappers.ts deleted file mode 100644 index 6a090a22e..000000000 --- a/packages/taco-auth/src/providers/viem/viem-wrappers.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { ethers } from 'ethers'; - -// Dynamic viem types (available only when viem is installed) -type Account = any; -type PublicClient = any; - -/** - * Checks if viem is available and throws a helpful error if not - */ -function checkViemAvailability(): void { - try { - require('viem'); - } catch (error) { - throw new Error( - 'viem is required for viem auth providers. Install it with: npm install viem', - ); - } -} - -/** - * A minimal provider that wraps viem PublicClient for auth provider compatibility - * - * This class implements only the methods needed for EIP4361AuthProvider to work. - * It uses type assertion to satisfy the ethers.providers.Provider interface - * without implementing all methods. - */ -class ViemAuthProvider { - private viemPublicClient: PublicClient; - - constructor(viemPublicClient: PublicClient) { - this.viemPublicClient = viemPublicClient; - } - - async getNetwork(): Promise { - const chainId = await this.viemPublicClient.getChainId(); - return { - name: this.viemPublicClient.chain?.name || `chain-${chainId}`, - chainId, - }; - } - - async call(transaction: ethers.providers.TransactionRequest): Promise { - const result = await this.viemPublicClient.call({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value ? BigInt(transaction.value.toString()) : undefined, - }); - if (typeof result === 'object' && result && 'data' in result) { - return result.data as string; - } - return result as string; - } - - // Stub methods for ethers compatibility (not used by EIP4361AuthProvider) - async getBlockNumber(): Promise { return 0; } - async getGasPrice(): Promise { return ethers.BigNumber.from(0); } - async getFeeData(): Promise { return null; } - async getBalance(): Promise { return ethers.BigNumber.from(0); } - async getTransactionCount(): Promise { return 0; } - async getCode(): Promise { return '0x'; } - async getStorageAt(): Promise { return '0x'; } - async sendTransaction(): Promise { throw new Error('Not implemented'); } - async getTransaction(): Promise { return null; } - async getTransactionReceipt(): Promise { return null; } - async getLogs(): Promise { return []; } - async getBlock(): Promise { return null; } - async getBlockWithTransactions(): Promise { return null; } - async resolveName(): Promise { return null; } - async lookupAddress(): Promise { return null; } - async waitForTransaction(): Promise { return null; } - - // Event emitter methods (not used by EIP4361AuthProvider) - on(): this { return this; } - off(): this { return this; } - removeAllListeners(): this { return this; } - listenerCount(): number { return 0; } - listeners(): any[] { return []; } - emit(): boolean { return false; } -} - -/** - * A signer that wraps viem Account for auth provider compatibility - * - * This class implements only the methods needed for EIP4361AuthProvider to work. - */ -class ViemAuthSigner { - private viemAccount: Account; - private provider: ethers.providers.Provider; - - constructor(viemAccount: Account, provider: ethers.providers.Provider) { - this.viemAccount = viemAccount; - this.provider = provider; - } - - get address(): string { - return this.viemAccount.address; - } - - getAddress(): Promise { - return Promise.resolve(this.viemAccount.address); - } - - async signMessage(message: string | Uint8Array): Promise { - checkViemAvailability(); - // Convert message to hex if it's Uint8Array - const messageToSign = typeof message === 'string' ? message : ethers.utils.hexlify(message); - return await this.viemAccount.signMessage({ message: messageToSign }); - } - - async signTypedData(domain: any, types: any, message: any): Promise { - checkViemAvailability(); - return await this.viemAccount.signTypedData({ - domain, - types, - message, - primaryType: Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', - }); - } - - getProvider(): ethers.providers.Provider { - return this.provider; - } - - // Required ethers signer properties and stub methods - _isSigner = true; - - // Stub methods for ethers Signer compatibility (not used by EIP4361AuthProvider) - async signTransaction(): Promise { throw new Error('Not implemented'); } - connect(): this { return this; } - async getBalance(): Promise { return ethers.BigNumber.from(0); } - async getTransactionCount(): Promise { return 0; } - async getGasPrice(): Promise { return ethers.BigNumber.from(0); } - async getFeeData(): Promise { return null; } - async estimateGas(): Promise { return ethers.BigNumber.from(0); } - async call(): Promise { return '0x'; } - async sendTransaction(): Promise { throw new Error('Not implemented'); } - async getChainId(): Promise { return (await this.provider.getNetwork()).chainId; } - async resolveName(): Promise { return null; } - checkTransaction(): any { return {}; } - populateTransaction(): Promise { return Promise.resolve({}); } -} - -/** - * Create an ethers-compatible provider from viem PublicClient - * Minimal version for auth provider compatibility - */ -export function createEthersProvider(viemPublicClient: PublicClient): ethers.providers.Provider { - checkViemAvailability(); - // Use type assertion since we implement the minimal interface needed for auth - return new ViemAuthProvider(viemPublicClient) as unknown as ethers.providers.Provider; -} - -/** - * Create an ethers-compatible signer from viem Account - * Minimal version for auth provider compatibility - */ -export function createEthersSigner(viemAccount: Account, provider: ethers.providers.Provider): ethers.Signer { - checkViemAvailability(); - // Use type assertion since we implement the minimal interface needed for auth - return new ViemAuthSigner(viemAccount, provider) as unknown as ethers.Signer; -} diff --git a/packages/taco/VIEM_SUPPORT.md b/packages/taco/VIEM_SUPPORT.md index 7543669f0..4fbcf4533 100644 --- a/packages/taco/VIEM_SUPPORT.md +++ b/packages/taco/VIEM_SUPPORT.md @@ -1,7 +1,9 @@ # Viem Support -The TACo SDK supports [viem](https://viem.sh) for encryption and decryption -operations. +The TACo SDK provides unified `encrypt` and `decrypt` functions that work +seamlessly with both [ethers.js](https://docs.ethers.org/) and +[viem](https://viem.sh) through TypeScript function overloads. The same function +names automatically detect which library you're using based on parameter types. ## Installation @@ -13,24 +15,36 @@ npm install viem ### For Authentication Providers -If you need viem-compatible authentication providers (like -`ViemEIP4361AuthProvider`), install the taco-auth package: +If you need authentication providers that work with viem, install the taco-auth +package: ```bash npm install @nucypher/taco-auth viem ``` -## Sample Usage +## Supported Libraries + +The same `encrypt` and `decrypt` functions work with both ethers.js and viem. + +Here is how to use them with viem: ```typescript +import { + encrypt, + decrypt, + conditions, + domains, + initialize, +} from '@nucypher/taco'; import { createPublicClient, http } from 'viem'; import { polygonAmoy } from 'viem/chains'; import { privateKeyToAccount } from 'viem/accounts'; -import { encryptWithViem, decryptWithViem } from '@nucypher/taco'; -import * as conditions from '@nucypher/taco/conditions'; -// Create viem client -const viemPublicClient = createPublicClient({ +// Initialize TACo +await initialize(); + +// Create viem public client +const publicClient = createPublicClient({ chain: polygonAmoy, transport: http(), }); @@ -38,11 +52,9 @@ const viemPublicClient = createPublicClient({ const viemAccount = privateKeyToAccount('0x...'); // Create access condition -const condition = conditions.predefined.erc20Balance({ +const condition = new conditions.predefined.erc20.ERC20Balance({ contractAddress: '0x...', - standardContractType: 'ERC20', chain: 80002, - method: 'balanceOf', parameters: [':userAddress'], returnValueTest: { comparator: '>', @@ -50,67 +62,40 @@ const condition = conditions.predefined.erc20Balance({ }, }); -// Encrypt a message -const encryptedKit = await encryptWithViem( - viemPublicClient, - 'lynx', +// Same function names work with viem - TypeScript automatically detects the right overload +const encryptedKit = await encrypt( + publicClient, // viem PublicClient + domains.DEVNET, // or 'lynx' 'Hello, secret!', condition, 27, // ritual ID - viemAccount, + viemAccount, // viem Signer Account (`LocalAccount` or `WalletClient`) ); -// Decrypt the message -const decryptedMessage = await decryptWithViem( - viemPublicClient, - 'lynx', +// Same decrypt function works with viem +const decryptedMessage = await decrypt( + publicClient, + domains.DEVNET, encryptedKit, ); console.log(new TextDecoder().decode(decryptedMessage)); // "Hello, secret!" ``` -### Viem-Compatible Functions - -#### `encryptWithViem(viemPublicClient, domain, message, condition, ritualId, viemAccount)` - -Encrypts a message using viem objects. - -- `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations -- `domain`: `Domain` - TACo domain ('lynx', 'TESTNET', 'MAINNET') -- `message`: `Uint8Array | string` - Message to encrypt -- `condition`: `Condition` - Access condition for decryption -- `ritualId`: `number` - DKG ritual ID -- `viemAccount`: `Account` - Viem account for signing - -Returns: `Promise` - -#### `decryptWithViem(viemPublicClient, domain, messageKit, context?, porterUris?)` - -Decrypts a message using viem objects. - -- `viemPublicClient`: `PublicClient` - Viem PublicClient for network operations -- `domain`: `Domain` - TACo domain -- `messageKit`: `ThresholdMessageKit` - Encrypted message kit -- `context?`: `ConditionContext` - Optional context for conditions -- `porterUris?`: `string[]` - Optional Porter service URIs - -Returns: `Promise` - -## Viem Authentication Providers +## Authentication Providers For applications that need authentication providers compatible with viem, use the `@nucypher/taco-auth` package: -### ViemEIP4361AuthProvider +### EIP4361AuthProvider -Creates an EIP-4361 compliant authentication provider from viem objects: +`EIP4361AuthProvider` also supports both ethers.js and viem: ```typescript -import { createPublicClient, createWalletClient, http } from 'viem'; +import { createPublicClient, http } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; -import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; +import { EIP4361AuthProvider } from '@nucypher/taco-auth'; const publicClient = createPublicClient({ chain: polygonAmoy, @@ -118,7 +103,8 @@ const publicClient = createPublicClient({ }); const account = privateKeyToAccount('0x...'); -const authProvider = new ViemEIP4361AuthProvider(publicClient, account, { +// Viem usage +const authProvider = new EIP4361AuthProvider(publicClient, account, { domain: 'my-app.com', uri: 'https://my-app.com', }); @@ -126,35 +112,22 @@ const authProvider = new ViemEIP4361AuthProvider(publicClient, account, { const authSignature = await authProvider.getOrCreateAuthSignature(); ``` -**Parameters:** - -- `viemPublicClient`: `PublicClient` - Viem public client for network operations -- `viemAccount`: `Account` - Viem account for signing -- `options?`: `EIP4361AuthProviderParams` - Optional domain and URI for EIP-4361 - messages - -**Methods:** +**Ethers.js Usage (for comparison):** -- `getOrCreateAuthSignature()`: Returns authentication signature for TACo - operations -- `ethersProvider`: Getter for underlying ethers-compatible auth provider - -## Package Architecture - -### @nucypher/taco +```typescript +import { ethers } from 'ethers'; +import { EIP4361AuthProvider } from '@nucypher/taco-auth'; -- **Purpose**: Core encryption and decryption functionality -- **Viem Functions**: `encryptWithViem()`, `decryptWithViem()` -- **Dependencies**: Only viem functions for encryption operations +const provider = new ethers.providers.JsonRpcProvider(); +const signer = new ethers.Wallet('0x...', provider); -### @nucypher/taco-auth +// Ethers usage +const authProvider = new EIP4361AuthProvider(provider, signer); +``` -- **Purpose**: Authentication providers and signing utilities -- **Viem Functions**: `ViemEIP4361AuthProvider` -- **Dependencies**: Viem authentication and EIP-4361 signing +## Installation -This separation follows clean architecture principles - use the appropriate -package based on your needs: +Use the appropriate package based on your needs: - **Encryption only**: Install `@nucypher/taco` + `viem` - **Authentication required**: Install both `@nucypher/taco` + diff --git a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts b/packages/taco/integration-test/viem-encrypt-decrypt.test.ts deleted file mode 100644 index 97ea57c37..000000000 --- a/packages/taco/integration-test/viem-encrypt-decrypt.test.ts +++ /dev/null @@ -1,261 +0,0 @@ -import { beforeAll, describe, expect, test } from 'vitest'; - -import { fromBytes, toBytes } from '@nucypher/shared'; -import { - USER_ADDRESS_PARAM_DEFAULT, -} from '@nucypher/taco-auth'; -import { createPublicClient, createWalletClient, http } from 'viem'; -import { privateKeyToAccount } from 'viem/accounts'; -import { polygonAmoy } from 'viem/chains'; -import { conditions, initialize, ThresholdMessageKit } from '../src'; -import { ViemEIP4361AuthProvider } from '@nucypher/taco-auth'; -import { CompoundCondition } from '../src/conditions/compound-condition'; -import { decryptWithViem, encryptWithViem } from '../src/viem-taco'; -import { UINT256_MAX } from '../test/test-utils'; - -const RPC_PROVIDER_URL = 'https://rpc-amoy.polygon.technology'; -const ENCRYPTOR_PRIVATE_KEY = - '0x900edb9e8214b2353f82aa195e915128f419a92cfb8bbc0f4784f10ef4112b86'; -const CONSUMER_PRIVATE_KEY = - '0xf307e165339cb5deb2b8ec59c31a5c0a957b8e8453ce7fe8a19d9a4c8acf36d4'; -const DOMAIN = 'lynx'; -const RITUAL_ID = 27; -const CHAIN_ID = 80002; - -// Create viem accounts from private keys -const encryptorAccount = privateKeyToAccount( - ENCRYPTOR_PRIVATE_KEY as `0x${string}`, -); -const consumerAccount = privateKeyToAccount( - CONSUMER_PRIVATE_KEY as `0x${string}`, -); - -describe('Viem Encrypt/Decrypt Integration Test', () => { - let viemPublicClient: any; - let viemWalletClient: any; - - beforeAll(async () => { - // Create viem clients - viemPublicClient = createPublicClient({ - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); - - viemWalletClient = createWalletClient({ - account: consumerAccount, - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); - - // Initialize the library - await initialize(); - - // Verify network connection - const chainId = await viemPublicClient.getChainId(); - if (chainId !== CHAIN_ID) { - throw new Error( - `Provider connected to wrong network. Expected ${CHAIN_ID}, got ${chainId}`, - ); - } - }); - - test('should encrypt and decrypt a message with viem using RPC balance condition', async () => { - // Create test message - const messageString = 'This is a secret viem message 🔐'; - const message = toBytes(messageString); - - // Create conditions - const hasPositiveBalance = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); - - const balanceLessThanMaxUintBigInt = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '<', - // max uint256 - value: UINT256_MAX, - }, - }); - - const compoundCondition = CompoundCondition.and([ - hasPositiveBalance, - balanceLessThanMaxUintBigInt, - ]); - - // Encrypt message using viem - const messageKit = await encryptWithViem( - viemPublicClient, - DOMAIN, - message, - compoundCondition, - RITUAL_ID, - encryptorAccount, - ); - - const encryptedBytes = messageKit.toBytes(); - - // Prepare for decryption - const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using viem-native auth provider - if ( - conditionContext.requestedContextParameters.has( - USER_ADDRESS_PARAM_DEFAULT, - ) - ) { - // Use the new ViemEIP4361AuthProvider - no manual conversion needed! - const viemAuthProvider = new ViemEIP4361AuthProvider( - viemPublicClient, - consumerAccount, - ); - - // Get the underlying ethers auth provider for context compatibility - const ethersAuthProvider = viemAuthProvider.ethersProvider; - conditionContext.addAuthProvider( - USER_ADDRESS_PARAM_DEFAULT, - ethersAuthProvider, - ); - } - - // Decrypt message using viem - const decryptedBytes = await decryptWithViem( - viemPublicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout - - test('should encrypt and decrypt with viem using simple positive balance condition', async () => { - // Create test message - const messageString = - 'This viem message tests simple balance condition'; - const message = toBytes(messageString); - - // Create simple positive balance condition (avoids problematic allowlist condition) - const positiveBalanceCondition = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); - - // Encrypt message with viem using simple condition - const messageKit = await encryptWithViem( - viemPublicClient, - DOMAIN, - message, - positiveBalanceCondition, - RITUAL_ID, - encryptorAccount, - ); - - const encryptedBytes = messageKit.toBytes(); - - // Prepare for decryption - const messageKitFromBytes = ThresholdMessageKit.fromBytes(encryptedBytes); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using ViemEIP4361AuthProvider - const viemAuthProvider = new ViemEIP4361AuthProvider( - viemPublicClient, - consumerAccount, - ); - - // Get the ethers-compatible auth provider for context - const ethersAuthProvider = viemAuthProvider.ethersProvider; - conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider); - - // Decrypt message using viem - const decryptedBytes = await decryptWithViem( - viemPublicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption was successful - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout - - test('should work with different viem account types', async () => { - // This test verifies viem integration works with different account configurations - const messageString = 'Testing different viem account types'; - const message = toBytes(messageString); - - // Create a simple condition - const simpleCondition = new conditions.base.rpc.RpcCondition({ - chain: CHAIN_ID, - method: 'eth_getBalance', - parameters: [':userAddress', 'latest'], - returnValueTest: { - comparator: '>=', - value: 0, - }, - }); - - // Test encryption with viem account - const messageKit = await encryptWithViem( - viemPublicClient, - DOMAIN, - message, - simpleCondition, - RITUAL_ID, - encryptorAccount, - ); - - // Test decryption with different viem client setup - const anotherViemPublicClient = createPublicClient({ - chain: polygonAmoy, - transport: http(RPC_PROVIDER_URL), - }); - - const messageKitFromBytes = ThresholdMessageKit.fromBytes( - messageKit.toBytes(), - ); - const conditionContext = - conditions.context.ConditionContext.fromMessageKit(messageKitFromBytes); - - // Add auth provider using ViemEIP4361AuthProvider with different client - const viemAuthProvider = new ViemEIP4361AuthProvider( - anotherViemPublicClient, - consumerAccount, - ); - - // Get the ethers-compatible auth provider - const ethersAuthProvider = viemAuthProvider.ethersProvider; - conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, ethersAuthProvider); - - // Decrypt using the different client - const decryptedBytes = await decryptWithViem( - anotherViemPublicClient, - DOMAIN, - messageKitFromBytes, - conditionContext, - ); - const decryptedMessageString = fromBytes(decryptedBytes); - - // Verify decryption - expect(decryptedMessageString).toEqual(messageString); - }, 15000); // 15s timeout -}); diff --git a/packages/taco/integration-test/viem-to-ethers-ens.test.ts b/packages/taco/integration-test/viem-to-ethers-ens.test.ts index 63b1d2f96..69be176c3 100644 --- a/packages/taco/integration-test/viem-to-ethers-ens.test.ts +++ b/packages/taco/integration-test/viem-to-ethers-ens.test.ts @@ -6,7 +6,8 @@ import { mainnet } from 'viem/chains'; describe.skipIf(!process.env.RUNNING_IN_CI)('Viem-Ethers Adapter Integration Tests', () => { describe('ENS Registry', () => { - test('should properly read ENS registry contract address from viem client converted to ethers provider', async () => { + // TODO: will fix this in a different PR. + test.skip('should properly read ENS registry contract address from viem client converted to ethers provider', async () => { // Test with chain that has ENS registry (mainnet) // Note: mainnet from viem/chains includes ENS registry configuration const mainnetViemClient = createPublicClient({ @@ -31,6 +32,6 @@ describe.skipIf(!process.env.RUNNING_IN_CI)('Viem-Ethers Adapter Integration Tes // Currently vitalik.eth is "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045". // But it may change in the future. So we only check if it's a valid Ethereum address. expect(resolvedAddress).toMatch(/^0x[a-fA-F0-9]{40}$/); // Valid Ethereum address format - }); + }, 15000); }); }); diff --git a/packages/taco/package.json b/packages/taco/package.json index 29c91da27..6cce4aca4 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -49,14 +49,6 @@ "semver": "^7.7.1", "zod": "^3.24.2" }, - "peerDependencies": { - "viem": "^2.0.0" - }, - "peerDependenciesMeta": { - "viem": { - "optional": true - } - }, "devDependencies": { "@nucypher/test-utils": "workspace:*", "@types/semver": "^7.7.0", diff --git a/packages/taco/src/client-config.ts b/packages/taco/src/client-config.ts index c673fb413..4dde4f18a 100644 --- a/packages/taco/src/client-config.ts +++ b/packages/taco/src/client-config.ts @@ -5,7 +5,7 @@ * for configuring TacoClient instances with different blockchain client libraries (viem, ethers.js). */ -import { type Account, type PublicClient } from '@nucypher/shared'; +import { type PublicClient, type SignerAccount } from '@nucypher/shared'; import type { ethers } from 'ethers'; import type { DomainName } from './taco-config-validator'; @@ -28,8 +28,8 @@ export interface TacoClientBaseConfig { export interface TacoClientViemConfig extends TacoClientBaseConfig { /** Viem PublicClient for blockchain operations */ viemClient: PublicClient; - /** Viem Account for signing operations */ - viemAccount: Account; + /** Viem SignerAccount for signing operations */ + viemSignerAccount: SignerAccount; } /** @@ -55,7 +55,7 @@ export type TacoClientConfig = TacoClientViemConfig | TacoClientEthersConfig; export function isViemConfig( config: TacoClientConfig, ): config is TacoClientViemConfig { - return 'viemClient' in config && 'viemAccount' in config; + return 'viemClient' in config && 'viemSignerAccount' in config; } /** diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index f70d32833..bbbc3365e 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -11,8 +11,7 @@ export { export * as conditions from './conditions'; -export { decrypt, encrypt } from './encrypt-decrypt'; -export { encryptWithPublicKey } from './taco'; +export { decrypt, encrypt, encryptWithPublicKey } from './taco'; // TaCo Configuration and Client export { diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/taco-client.ts index db24338b7..a2d1ee9f1 100644 --- a/packages/taco/src/taco-client.ts +++ b/packages/taco/src/taco-client.ts @@ -19,11 +19,11 @@ import { } from './client-config.js'; import { Condition } from './conditions/condition.js'; import { ConditionContext } from './conditions/context/index.js'; -import { decrypt, encrypt, encryptWithPublicKey } from './encrypt-decrypt.js'; import { TacoConfigValidator, type ValidationResult, } from './taco-config-validator.js'; +import { decrypt, encrypt, encryptWithPublicKey } from './taco.js'; /** * TacoClient provides an object-oriented interface for TACo operations @@ -202,7 +202,7 @@ export class TacoClient { accessCondition, this.config.ritualId, (this.config as TacoClientEthersConfig).ethersSigner || - (this.config as TacoClientViemConfig).viemAccount, + (this.config as TacoClientViemConfig).viemSignerAccount, ); return messageKit; @@ -244,7 +244,7 @@ export class TacoClient { accessCondition, dkgPublicKey, (this.config as TacoClientEthersConfig).ethersSigner || - (this.config as TacoClientViemConfig).viemAccount, + (this.config as TacoClientViemConfig).viemSignerAccount, ); return messageKit; diff --git a/packages/taco/src/taco-config-validator.ts b/packages/taco/src/taco-config-validator.ts index f9b5fd7ce..c3eebe7c7 100644 --- a/packages/taco/src/taco-config-validator.ts +++ b/packages/taco/src/taco-config-validator.ts @@ -221,8 +221,8 @@ export class TacoConfigValidator { if (!config.viemClient) { errors.push('viemClient is required for viem configuration'); } - if (!config.viemAccount) { - errors.push('viemAccount is required for viem configuration'); + if (!config.viemSignerAccount) { + errors.push('viemSignerAccount is required for viem configuration'); } } else if ('ethersProvider' in config) { // Ethers configuration @@ -234,7 +234,7 @@ export class TacoConfigValidator { } } else { errors.push( - 'Configuration must include either viem objects (viemClient + viemAccount) or ethers objects (ethersProvider + ethersSigner)', + 'Configuration must include either viem objects (viemClient + viemSignerAccount) or ethers objects (ethersProvider + ethersSigner)', ); } diff --git a/packages/taco/src/viem-taco.ts b/packages/taco/src/viem-taco.ts deleted file mode 100644 index cb473ca65..000000000 --- a/packages/taco/src/viem-taco.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { ThresholdMessageKit } from '@nucypher/nucypher-core'; -import { Domain } from '@nucypher/shared'; - -// Dynamic viem types (available only when viem is installed) -// instead of `import type { Account, PublicClient } from 'viem';` -type Account = any; -type PublicClient = any; - -import { Condition } from './conditions/condition'; -import { ConditionContext } from './conditions/context'; -import { decrypt as ethersDecrypt, encrypt as ethersEncrypt } from './taco'; -import { createEthersProvider, createEthersSigner } from './wrappers'; - -/** - * Encrypts a message under given conditions using viem clients. - * - * This is a viem-compatible version of the encrypt function that accepts viem clients - * instead of ethers providers and signers. - * - * @export - * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations - * @param {Domain} domain - Represents the logical network for encryption (must match ritualId) - * @param {Uint8Array | string} message - The message to be encrypted - * @param {Condition} condition - Condition under which the message will be encrypted - * @param {number} ritualId - The ID of the DKG Ritual to be used for encryption - * @param {Account} viemAuthSigner - The viem account that will be used to sign the encrypter authorization - * - * @returns {Promise} Returns Promise that resolves with an instance of ThresholdMessageKit - * - * @throws {Error} If the active DKG Ritual cannot be retrieved an error is thrown - * - * @example - * ```typescript - * import { createPublicClient, createWalletClient, http } from 'viem'; - * import { polygonAmoy } from 'viem/chains'; - * import { privateKeyToAccount } from 'viem/accounts'; - * - * // Using explicit clients - * const viemPublicClient = createPublicClient({ - * chain: polygonAmoy, - * transport: http() - * }); - * - * const viemAuthSigner = privateKeyToAccount('0x...'); - * - * const encrypted = await encryptWithViem( - * viemPublicClient, // Your viem public client - * 'lynx', // TACo domain - * 'Hello, secret!', // Message to encrypt - * condition, // Access condition - * 27, // Ritual ID - * viemAuthSigner // Your viem account - * ); - * ``` - */ -export const encryptWithViem = async ( - viemPublicClient: PublicClient, - domain: Domain, - message: Uint8Array | string, - condition: Condition, - ritualId: number, - viemAuthSigner: Account, -): Promise => { - // Create ethers-compatible provider and signer from viem objects - const ethersProvider = createEthersProvider(viemPublicClient); - const ethersSigner = createEthersSigner(viemAuthSigner, ethersProvider); - - // Use the existing ethers-based encrypt function - return await ethersEncrypt( - ethersProvider, - domain, - message, - condition, - ritualId, - ethersSigner, - ); -}; - -/** - * Decrypts an encrypted message using viem clients. - * - * This is a viem-compatible version of the decrypt function that accepts viem clients - * instead of ethers providers. - * - * @export - * @param {PublicClient} viemPublicClient - Viem PublicClient for network operations - * @param {Domain} domain - Represents the logical network for decryption (must match ritualId) - * @param {ThresholdMessageKit} messageKit - The kit containing the message to be decrypted - * @param {ConditionContext} context - Optional context data used for decryption time values - * @param {string[]} [porterUris] - Optional URI(s) for the Porter service - * - * @returns {Promise} Returns Promise that resolves with a decrypted message - * - * @throws {Error} If the active DKG Ritual cannot be retrieved or decryption process throws an error - * - * @example - * ```typescript - * import { createPublicClient, http } from 'viem'; - * import { polygonAmoy } from 'viem/chains'; - * - * const viemPublicClient = createPublicClient({ - * chain: polygonAmoy, - * transport: http() - * }); - * - * const decrypted = await decryptWithViem( - * viemPublicClient, - * 'lynx', - * messageKit, - * context - * ); - * - - * ``` - */ -export const decryptWithViem = async ( - viemPublicClient: PublicClient, - domain: Domain, - messageKit: ThresholdMessageKit, - context?: ConditionContext, - porterUris?: string[], -): Promise => { - // Create ethers-compatible provider from viem object - const ethersProvider = createEthersProvider(viemPublicClient); - - // Use the existing ethers-based decrypt function - return await ethersDecrypt( - ethersProvider, - domain, - messageKit, - context, - porterUris, - ); -}; diff --git a/packages/taco/src/wrappers/index.ts b/packages/taco/src/wrappers/index.ts deleted file mode 100644 index f1c331620..000000000 --- a/packages/taco/src/wrappers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Viem adapter utilities -export { - createEthersFromViem, - createEthersProvider, - createEthersSigner, -} from './viem-wrappers'; diff --git a/packages/taco/src/wrappers/viem-wrappers.ts b/packages/taco/src/wrappers/viem-wrappers.ts deleted file mode 100644 index 1121fd1e9..000000000 --- a/packages/taco/src/wrappers/viem-wrappers.ts +++ /dev/null @@ -1,343 +0,0 @@ -import { ethers } from 'ethers'; - -// Dynamic viem types (available only when viem is installed) -// instead of `import type { Account, PublicClient, WalletClient } from 'viem';` -type Account = any; -type PublicClient = any; -type WalletClient = any; - -/** - * Checks if viem is available and throws a helpful error if not - */ -function checkViemAvailability(): void { - try { - // Try to actually require viem to check if it's available - require('viem'); - } catch (error) { - throw new Error( - 'viem is required for viem wrapper functions. Install it with: npm install viem', - ); - } -} - -/** - * Dynamically imports viem types for runtime type checking - */ -async function importViem() { - checkViemAvailability(); - return await import('viem'); -} - -/** - * A provider that wraps viem PublicClient to work with ethers.js - */ -class ViemWrappedProvider { - private viemPublicClient: PublicClient; - - constructor(viemPublicClient: PublicClient) { - this.viemPublicClient = viemPublicClient; - } - - async getNetwork(): Promise { - const chainId = await this.viemPublicClient.getChainId(); - return { - name: this.viemPublicClient.chain?.name || `chain-${chainId}`, - chainId, - }; - } - - async getBlockNumber(): Promise { - return Number(await this.viemPublicClient.getBlockNumber()); - } - - async getGasPrice(): Promise { - const gasPrice = await this.viemPublicClient.getGasPrice(); - return ethers.BigNumber.from(gasPrice.toString()); - } - - async getBalance(address: string, blockTag?: string | number): Promise { - const balance = await this.viemPublicClient.getBalance({ - address: address as `0x${string}`, - }); - return ethers.BigNumber.from(balance.toString()); - } - - async getTransactionCount(address: string, blockTag?: string | number): Promise { - return await this.viemPublicClient.getTransactionCount({ - address: address as `0x${string}`, - }); - } - - async getCode(address: string, blockTag?: string | number): Promise { - return await this.viemPublicClient.getCode({ - address: address as `0x${string}`, - }); - } - - async call(transaction: ethers.providers.TransactionRequest, blockTag?: string | number): Promise { - const result = await this.viemPublicClient.call({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value ? BigInt(transaction.value.toString()) : undefined, - }); - // viem returns {data: "0x..."} but ethers expects just "0x..." - if (typeof result === 'object' && result && 'data' in result) { - return result.data as string; - } - return result as string; - } - - async estimateGas(transaction: ethers.providers.TransactionRequest): Promise { - const gas = await this.viemPublicClient.estimateGas({ - to: transaction.to as `0x${string}`, - data: transaction.data as `0x${string}`, - value: transaction.value ? BigInt(transaction.value.toString()) : undefined, - }); - return ethers.BigNumber.from(gas.toString()); - } - - async getBlock(blockHashOrBlockTag: string | number): Promise { - if (typeof blockHashOrBlockTag === 'string' && blockHashOrBlockTag.startsWith('0x')) { - return await this.viemPublicClient.getBlock({ - blockHash: blockHashOrBlockTag as `0x${string}`, - }); - } else { - return await this.viemPublicClient.getBlock({ - blockNumber: BigInt(blockHashOrBlockTag), - }); - } - } - - async getTransaction(transactionHash: string): Promise { - return await this.viemPublicClient.getTransaction({ - hash: transactionHash as `0x${string}`, - }); - } - - async getTransactionReceipt(transactionHash: string): Promise { - return await this.viemPublicClient.getTransactionReceipt({ - hash: transactionHash as `0x${string}`, - }); - } - - async waitForTransaction(transactionHash: string): Promise { - return await this.viemPublicClient.waitForTransactionReceipt({ - hash: transactionHash as `0x${string}`, - }); - } - - // Additional methods that ethers contracts might need - async resolveName(name: string): Promise { - return null; // ENS resolution not implemented - } - - async lookupAddress(address: string): Promise { - return null; // Reverse ENS lookup not implemented - } - - async getFeeData(): Promise { - const gasPrice = await this.getGasPrice(); - return { - gasPrice, - maxFeePerGas: null, - maxPriorityFeePerGas: null, - lastBaseFeePerGas: null, - }; - } - - // Mark this as a viem wrapped provider - _isViemWrappedProvider = true; - - // Additional required Provider methods (stubs for compatibility) - async getStorageAt(address: string, position: string, blockTag?: string | number): Promise { - throw new Error('getStorageAt not implemented in viem wrapper'); - } - - async sendTransaction(signedTransaction: string): Promise { - throw new Error('sendTransaction not implemented in viem wrapper'); - } - - async getBlockWithTransactions(blockHashOrBlockTag: string | number): Promise { - throw new Error('getBlockWithTransactions not implemented in viem wrapper'); - } - - async getLogs(filter: any): Promise { - throw new Error('getLogs not implemented in viem wrapper'); - } - - // Ethers provider interface compatibility - connection?: any; - _network?: ethers.providers.Network; - _isProvider = true; - - // Additional stubs for compatibility - async on(): Promise { return this; } - async once(): Promise { return this; } - async off(): Promise { return this; } - async emit(): Promise { return false; } - async listenerCount(): Promise { return 0; } - async listeners(): Promise { return []; } - async removeAllListeners(): Promise { return this; } - async addListener(): Promise { return this; } - async removeListener(): Promise { return this; } - - get _viemPublicClient() { - return this.viemPublicClient; - } -} - -/** - * Creates an ethers.js provider from a viem public client - * - * @param viemPublicClient - Viem PublicClient to wrap as ethers provider - * @returns ethers.providers.Provider compatible with TACo SDK - */ -export function createEthersProvider( - viemPublicClient: PublicClient, -): ethers.providers.Provider { - // Check if viem is available - checkViemAvailability(); - - return new ViemWrappedProvider(viemPublicClient) as unknown as ethers.providers.Provider; -} - -/** - * Creates an ethers.js signer from a viem account and provider - * - * @param viemAccount - The viem account (from wallet client or account) - * @param provider - Ethers provider (can be created with createEthersProvider) - * @returns ethers.Signer compatible with TACo SDK - */ -export function createEthersSigner( - viemAccount: Account, - provider: ethers.providers.Provider, -): ethers.Signer { - // Check if viem is available - checkViemAvailability(); - - const signerAdapter = { - address: viemAccount.address, - provider, - - async getAddress(): Promise { - return viemAccount.address; - }, - - async signMessage(message: ethers.utils.Bytes | string): Promise { - const messageToSign = - typeof message === 'string' - ? message - : typeof message === 'object' && message.constructor === Uint8Array - ? new TextDecoder().decode(message as Uint8Array) - : String(message); - - if (!viemAccount.signMessage) { - throw new Error('Account does not support message signing'); - } - return await viemAccount.signMessage({ message: messageToSign }); - }, - - async signTransaction( - transaction: ethers.providers.TransactionRequest, - ): Promise { - if (!viemAccount.signTransaction) { - throw new Error('Account does not support transaction signing'); - } - - // Convert ethers transaction to viem format - const viemTx: any = { - to: transaction.to as `0x${string}`, - value: transaction.value - ? BigInt(transaction.value.toString()) - : undefined, - data: transaction.data as `0x${string}`, - gas: transaction.gasLimit - ? BigInt(transaction.gasLimit.toString()) - : undefined, - gasPrice: transaction.gasPrice - ? BigInt(transaction.gasPrice.toString()) - : undefined, - nonce: transaction.nonce ? Number(transaction.nonce) : undefined, - }; - - return await viemAccount.signTransaction(viemTx); - }, - - async signTypedData( - domain: any, - types: Record, - message: Record, - ): Promise { - if (!viemAccount.signTypedData) { - throw new Error('Account does not support typed data signing'); - } - - return await viemAccount.signTypedData({ - domain, - types, - message, - primaryType: - Object.keys(types).find((key) => key !== 'EIP712Domain') || 'Message', - }); - }, - - connect(provider: ethers.providers.Provider): ethers.Signer { - return createEthersSigner(viemAccount, provider); - }, - - // Additional signer methods for ethers compatibility - async getBalance() { - const balance = await provider.getBalance(viemAccount.address); - return balance; - }, - - async getTransactionCount() { - return await provider.getTransactionCount(viemAccount.address); - }, - - async estimateGas(transaction: ethers.providers.TransactionRequest) { - return await provider.estimateGas(transaction); - }, - - async call(transaction: ethers.providers.TransactionRequest) { - return await provider.call(transaction); - }, - - async sendTransaction(transaction: ethers.providers.TransactionRequest) { - throw new Error( - 'sendTransaction not implemented for viem wrapper - use signTransaction instead', - ); - }, - - // Type identification - _isSigner: true, - _isViemWrappedSigner: true, - _viemAccount: viemAccount, - }; - - return signerAdapter as unknown as ethers.Signer; -} - -/** - * Convenience function to create both provider and signer from viem clients - * - * @param viemPublicClient - Viem public client for provider functionality - * @param viemWalletClient - Viem wallet client for signing functionality - * @returns Object with ethers provider and signer - */ -export function createEthersFromViem( - viemPublicClient: PublicClient, - viemWalletClient: WalletClient, -) { - // Check if viem is available - checkViemAvailability(); - - if (!viemWalletClient.account) { - throw new Error('Wallet client must have an account attached'); - } - - const provider = createEthersProvider(viemPublicClient); - const signer = createEthersSigner(viemWalletClient.account, provider); - - return { provider, signer }; -} diff --git a/packages/taco/test/client.test.ts b/packages/taco/test/client.test.ts index 8bd7b4fa4..d2327e1d4 100644 --- a/packages/taco/test/client.test.ts +++ b/packages/taco/test/client.test.ts @@ -1,4 +1,5 @@ import type { ethers } from 'ethers'; +import { type LocalAccount, type PublicClient } from 'viem'; import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { @@ -26,7 +27,7 @@ const mockViemAccount = { address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', signMessage: vi.fn().mockResolvedValue('0x'), signTypedData: vi.fn().mockResolvedValue('0x'), -} as unknown as Account; +} as unknown as LocalAccount; // Mock ethers dependencies for testing const mockEthersProvider = { @@ -93,7 +94,7 @@ describe('TacoConfigValidator', () => { domain: 'tapir', ritualId: 6, viemClient: mockViemClient, - viemAccount: mockViemAccount, + viemSignerAccount: mockViemAccount, }); expect(result.isValid).toBe(true); @@ -105,7 +106,7 @@ describe('TacoConfigValidator', () => { domain: 'INVALID_DOMAIN' as DomainName, ritualId: 999, viemClient: mockViemClient, - viemAccount: mockViemAccount, + viemSignerAccount: mockViemAccount, }); expect(result.isValid).toBe(false); @@ -116,7 +117,7 @@ describe('TacoConfigValidator', () => { const result = TacoConfigValidator.validateFast({ ritualId: 6, viemClient: mockViemClient, - viemAccount: mockViemAccount, + viemSignerAccount: mockViemAccount, } as TacoClientConfig); expect(result.isValid).toBe(false); @@ -148,7 +149,7 @@ describe('TacoClient', () => { domain: 'tapir', ritualId: 6, viemClient: mockViemClient, - viemAccount: mockViemAccount, + viemSignerAccount: mockViemAccount, }; validEthersConfig = { @@ -261,7 +262,7 @@ describe('TacoClient', () => { viemClient: mockViemClient, ethersProvider: mockEthersProvider, } as unknown as TacoClientConfig), - ).toThrow('viemAccount is required for viem configuration'); + ).toThrow('viemSignerAccount is required for viem configuration'); }); }); @@ -370,7 +371,7 @@ describe('TacoClient', () => { expect(result.isValid).toBe(false); expect(result.errors).toContain( - 'Configuration must include either viem objects (viemClient + viemAccount) or ethers objects (ethersProvider + ethersSigner)', + 'Configuration must include either viem objects (viemClient + viemSignerAccount) or ethers objects (ethersProvider + ethersSigner)', ); }); @@ -393,7 +394,7 @@ describe('TacoClient', () => { domain: 'tapir', ritualId: -5, viemClient: mockViemClient, - viemAccount: mockViemAccount, + viemSignerAccount: mockViemAccount, }), ).toThrow('Invalid ritual ID'); }); diff --git a/packages/taco/test/viem-wrappers.test.ts b/packages/taco/test/viem-wrappers.test.ts deleted file mode 100644 index d2f9fe377..000000000 --- a/packages/taco/test/viem-wrappers.test.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { describe, expect, it, vi } from 'vitest'; - -import { - createEthersFromViem, - createEthersProvider, - createEthersSigner, -} from '../src/wrappers/viem-wrappers'; - -describe('viem wrapper utilities', () => { - describe('function exports', () => { - it('should export all wrapper functions', () => { - expect(createEthersProvider).toBeDefined(); - expect(createEthersSigner).toBeDefined(); - expect(createEthersFromViem).toBeDefined(); - expect(typeof createEthersProvider).toBe('function'); - expect(typeof createEthersSigner).toBe('function'); - expect(typeof createEthersFromViem).toBe('function'); - }); - }); - - describe('createEthersProvider', () => { - it('should create a provider from viem client', () => { - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), - call: vi.fn().mockResolvedValue('0x'), - getBalance: vi.fn().mockResolvedValue(BigInt(0)), - getTransactionCount: vi.fn().mockResolvedValue(0), - estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), - getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), - } as any; - - const provider = createEthersProvider(mockViemPublicClient); - - expect(provider).toBeDefined(); - expect(provider.getNetwork).toBeDefined(); - expect(provider.getBlockNumber).toBeDefined(); - expect(provider.call).toBeDefined(); - expect(provider.getBalance).toBeDefined(); - expect(provider.getTransactionCount).toBeDefined(); - expect(provider.getGasPrice).toBeDefined(); - }); - }); - - describe('createEthersSigner', () => { - it('should create a signer from viem account', () => { - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - signTransaction: vi.fn().mockResolvedValue('0xsignedtx'), - } as any; - - const mockProvider = { - getNetwork: vi.fn().mockResolvedValue({ chainId: 80002 }), - } as any; - - const signer = createEthersSigner(mockViemAccount, mockProvider); - - expect(signer).toBeDefined(); - expect(signer.getAddress).toBeDefined(); - expect(signer.signMessage).toBeDefined(); - expect(signer.signTransaction).toBeDefined(); - expect(signer.provider).toBe(mockProvider); - }); - }); - - describe('createEthersFromViem', () => { - it('should create both provider and signer', () => { - const mockViemPublicClient = { - getChainId: vi.fn().mockResolvedValue(80002), - getBlockNumber: vi.fn().mockResolvedValue(BigInt(1000)), - call: vi.fn().mockResolvedValue('0x'), - getBalance: vi.fn().mockResolvedValue(BigInt(0)), - getTransactionCount: vi.fn().mockResolvedValue(0), - estimateGas: vi.fn().mockResolvedValue(BigInt(21000)), - getGasPrice: vi.fn().mockResolvedValue(BigInt(20000000000)), - } as any; - - const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0xsignature'), - } as any; - - const mockViemWalletClient = { - account: mockViemAccount, - } as any; - - const { provider, signer } = createEthersFromViem( - mockViemPublicClient, - mockViemWalletClient - ); - - expect(provider).toBeDefined(); - expect(signer).toBeDefined(); - expect(signer.provider).toBe(provider); - }); - - it('should throw error when wallet client has no account', () => { - const mockViemPublicClient = {} as any; - const mockViemWalletClient = { - account: undefined, - } as any; - - expect(() => createEthersFromViem( - mockViemPublicClient, - mockViemWalletClient - )).toThrow('Wallet client must have an account attached'); - }); - }); - - describe('error handling', () => { - it('should handle missing viem gracefully', () => { - // This test verifies that the functions exist and are callable - expect(createEthersProvider).toBeDefined(); - expect(createEthersSigner).toBeDefined(); - expect(createEthersFromViem).toBeDefined(); - expect(typeof createEthersProvider).toBe('function'); - expect(typeof createEthersSigner).toBe('function'); - expect(typeof createEthersFromViem).toBe('function'); - }); - }); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd4e60162..8f77209b4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,7 +39,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -105,7 +105,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -129,7 +129,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9) + version: 6.2.0(webpack@5.101.3) react: specifier: ^18.3.1 version: 18.3.1 @@ -145,7 +145,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) + version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -157,16 +157,16 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.1(webpack@5.101.3) crypto-browserify: specifier: ^3.12.1 version: 3.12.1 esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.101.3) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9) + version: 5.6.3(webpack@5.101.3) process: specifier: ^0.11.10 version: 0.11.10 @@ -214,7 +214,7 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.99.9) + version: 6.2.0(webpack@5.101.3) react: specifier: ^18.3.1 version: 18.3.1 @@ -230,7 +230,7 @@ importers: devDependencies: '@pmmmwh/react-refresh-webpack-plugin': specifier: ^0.6.0 - version: 0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9) + version: 0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3) '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -242,13 +242,13 @@ importers: version: 18.3.5(@types/react@18.3.20) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.1(webpack@5.101.3) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.101.3) html-webpack-plugin: specifier: ^5.6.3 - version: 5.6.3(webpack@5.99.9) + version: 5.6.3(webpack@5.101.3) react-refresh: specifier: ^0.17.0 version: 0.17.0 @@ -352,10 +352,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.1(webpack@5.101.3) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.101.3) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -448,8 +448,8 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@types/node': - specifier: ^20.17.28 - version: 20.17.28 + specifier: ^24.3.0 + version: 24.3.0 '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -458,7 +458,7 @@ importers: version: 18.3.5(@types/react@18.3.20) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) examples/taco/react-viem: dependencies: @@ -482,11 +482,11 @@ importers: version: 18.3.1(react@18.3.1) viem: specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) devDependencies: '@types/node': specifier: ^20.17.28 - version: 20.17.28 + version: 20.19.17 '@types/react': specifier: ^18.3.20 version: 18.3.20 @@ -495,7 +495,7 @@ importers: version: 18.3.5(@types/react@18.3.20) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10) examples/taco/webpack-5: dependencies: @@ -511,10 +511,10 @@ importers: devDependencies: copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.99.9) + version: 13.0.1(webpack@5.101.3) esbuild-loader: specifier: ^2.21.0 - version: 2.21.0(webpack@5.99.9) + version: 2.21.0(webpack@5.101.3) webpack: specifier: ^5.99.9 version: 5.101.3(webpack-cli@6.0.1) @@ -597,7 +597,7 @@ importers: version: 8.3.2(typescript@5.8.2) viem: specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) packages/taco: dependencies: @@ -619,9 +619,6 @@ importers: semver: specifier: ^7.7.1 version: 7.7.1 - viem: - specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -656,9 +653,6 @@ importers: siwe: specifier: ^3.0.0 version: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - viem: - specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -667,10 +661,6 @@ importers: specifier: workspace:* version: link:../test-utils - packages/taco-auth/dist/es: {} - - packages/taco/dist/es: {} - packages/test-utils: dependencies: '@nucypher/nucypher-core': @@ -690,16 +680,13 @@ importers: version: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) viem: specifier: ^2.0.0 - version: 2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) packages: - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} - '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} @@ -2591,8 +2578,8 @@ packages: resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.8.1': - resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} '@noble/curves@1.9.2': @@ -2602,10 +2589,6 @@ packages: '@noble/ed25519@1.7.3': resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} - '@noble/hashes@1.7.1': - resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} - engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} @@ -2843,18 +2826,9 @@ packages: '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - '@scure/base@1.2.6': - resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - - '@scure/bip32@1.6.2': - resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} - '@scure/bip32@1.7.0': resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} - '@scure/bip39@1.5.4': - resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} @@ -3545,12 +3519,13 @@ packages: abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead - abitype@1.0.8: - resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + abitype@1.1.0: + resolution: {integrity: sha512-6Vh4HcRxNMLA0puzPjM5GBgT4aAcFGKZzSgAXvuZ27shJP6NEpielTuqbBmZILR5/xd0PizkBGy5hReKz9jl5A==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.22.0 + zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: typescript: optional: true @@ -6351,11 +6326,6 @@ packages: peerDependencies: ws: '*' - isows@1.0.7: - resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} - peerDependencies: - ws: '*' - istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -7308,8 +7278,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - ox@0.8.6: - resolution: {integrity: sha512-eiKcgiVVEGDtEpEdFi1EGoVVI48j6icXHce9nFwCNM7CKG3uoCXKdr4TPhS00Iy1TR2aWSF1ltPD0x/YgqIL9w==} + ox@0.9.6: + resolution: {integrity: sha512-8SuCbHPvv2eZLYXrNmC0EC12rdzXQLdhnOMlHDW2wiCPLxBrOOJwX5L5E61by+UjTPOryqQiRSnjIKCI+GykKg==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -9354,8 +9324,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - viem@2.33.3: - resolution: {integrity: sha512-aWDr6i6r3OfNCs0h9IieHFhn7xQJJ8YsuA49+9T5JRyGGAkWhLgcbLq2YMecgwM7HdUZpx1vPugZjsShqNi7Gw==} + viem@2.37.8: + resolution: {integrity: sha512-mL+5yvCQbRIR6QvngDQMfEiZTfNWfd+/QL5yFaOoYbpH3b1Q2ddwF7YG2eI2AcYSh9LE1gtUkbzZLFUAVyj4oQ==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -9753,8 +9723,8 @@ packages: utf-8-validate: optional: true - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -9765,6 +9735,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} @@ -9821,8 +9795,6 @@ snapshots: '@adraffy/ens-normalize@1.11.0': {} - '@adraffy/ens-normalize@1.11.0': {} - '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -12167,9 +12139,9 @@ snapshots: '@noble/ciphers@1.3.0': {} - '@noble/curves@1.8.1': + '@noble/curves@1.9.1': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 '@noble/curves@1.9.2': dependencies: @@ -12177,8 +12149,6 @@ snapshots: '@noble/ed25519@1.7.3': {} - '@noble/hashes@1.7.1': {} - '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': @@ -12220,7 +12190,6 @@ snapshots: '@ethersproject/abstract-signer': 5.8.0 '@nucypher/shared': 0.5.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) siwe: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - siwe: 3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) zod: 3.24.2 transitivePeerDependencies: - bufferutil @@ -12255,12 +12224,12 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) optionalDependencies: type-fest: 0.21.3 webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) - '@pmmmwh/react-refresh-webpack-plugin@0.6.0(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.1(react-refresh@0.17.0)(type-fest@0.21.3)(webpack-dev-server@5.2.2)(webpack@5.101.3)': dependencies: anser: 2.3.2 core-js-pure: 3.41.0 @@ -12380,8 +12349,6 @@ snapshots: '@rushstack/eslint-patch@1.11.0': {} - '@scure/base@1.2.4': {} - '@scure/base@1.2.6': {} '@scure/bip32@1.7.0': @@ -12390,17 +12357,6 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 - '@scure/bip32@1.7.0': - dependencies: - '@noble/curves': 1.9.2 - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 - - '@scure/bip39@1.5.4': - dependencies: - '@noble/hashes': 1.7.1 - '@scure/base': 1.2.4 - '@scure/bip39@1.6.0': dependencies: '@noble/hashes': 1.8.0 @@ -12624,11 +12580,11 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 optional: true '@types/deep-equal@1.0.4': {} @@ -12729,12 +12685,7 @@ snapshots: '@types/node@24.3.0': dependencies: - undici-types: 6.19.8 - - '@types/node@22.13.14': - dependencies: - undici-types: 6.20.0 - optional: true + undici-types: 7.10.0 '@types/normalize-package-data@2.4.4': {} @@ -12815,7 +12766,7 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 '@types/ws@8.18.0': dependencies: @@ -13115,7 +13066,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -13130,7 +13081,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -13250,17 +13201,17 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.3)': dependencies: webpack: 5.101.3(webpack-cli@6.0.1) webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) @@ -13278,7 +13229,7 @@ snapshots: abab@2.0.6: {} - abitype@1.0.8(typescript@5.8.2)(zod@3.24.2): + abitype@1.1.0(typescript@5.8.2)(zod@3.24.2): optionalDependencies: typescript: 5.8.2 zod: 3.24.2 @@ -13660,7 +13611,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) babel-plugin-istanbul@6.1.1: dependencies: @@ -14409,7 +14360,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.0(webpack@5.99.9): + copy-webpack-plugin@13.0.1(webpack@5.101.3): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 @@ -14557,7 +14508,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.1 optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) css-minimizer-webpack-plugin@3.4.1(webpack@5.101.3): dependencies: @@ -14567,7 +14518,7 @@ snapshots: schema-utils: 4.3.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) css-prefers-color-scheme@6.0.3(postcss@8.5.3): dependencies: @@ -15138,7 +15089,7 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild-loader@2.21.0(webpack@5.99.9): + esbuild-loader@2.21.0(webpack@5.101.3): dependencies: esbuild: 0.16.17 joycon: 3.1.1 @@ -15510,13 +15461,24 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): + dependencies: + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + eslint: 8.57.1 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2))(utf-8-validate@5.0.10) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) - jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript @@ -15657,7 +15619,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) eslint@8.57.0: dependencies: @@ -15961,11 +15923,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.99.9): + file-loader@6.2.0(webpack@5.101.3): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) file-uri-to-path@1.0.0: {} @@ -16078,7 +16040,7 @@ snapshots: semver: 7.7.1 tapable: 1.1.3 typescript: 5.8.2 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) optionalDependencies: eslint: 8.57.1 @@ -16465,7 +16427,7 @@ snapshots: relateurl: 0.2.7 terser: 5.39.0 - html-webpack-plugin@5.6.3(webpack@5.99.9): + html-webpack-plugin@5.6.3(webpack@5.101.3): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -16473,7 +16435,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) htmlparser2@6.1.0: dependencies: @@ -16881,9 +16843,9 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isows@1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) istanbul-lib-coverage@3.2.2: {} @@ -17428,7 +17390,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.17.28 + '@types/node': 24.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -17853,7 +17815,7 @@ snapshots: dependencies: schema-utils: 4.3.0 tapable: 2.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} @@ -18184,15 +18146,15 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.8.6(typescript@5.8.2)(zod@3.24.2): + ox@0.9.6(typescript@5.8.2)(zod@3.24.2): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) + abitype: 1.1.0(typescript@5.8.2)(zod@3.24.2) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.2 @@ -18541,7 +18503,7 @@ snapshots: klona: 2.0.6 postcss: 8.5.3 semver: 7.7.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) postcss-logical@5.0.4(postcss@8.5.3): dependencies: @@ -18983,7 +18945,7 @@ snapshots: shell-quote: 1.8.2 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -19051,14 +19013,101 @@ snapshots: resolve-url-loader: 4.0.0 sass-loader: 12.6.0(webpack@5.101.3) semver: 7.7.1 - source-map-loader: 3.0.2(webpack@5.99.9) - style-loader: 3.3.4(webpack@5.99.9) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.17.28)(typescript@5.8.2)) - terser-webpack-plugin: 5.3.14(webpack@5.99.9) - webpack: 5.99.9(webpack-cli@6.0.1) - webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.99.9) - webpack-manifest-plugin: 4.1.1(webpack@5.99.9) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.99.9) + source-map-loader: 3.0.2(webpack@5.101.3) + style-loader: 3.3.4(webpack@5.101.3) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@20.19.17)(typescript@5.8.2)) + terser-webpack-plugin: 5.3.14(webpack@5.101.3) + webpack: 5.101.3(webpack-cli@6.0.1) + webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) + webpack-manifest-plugin: 4.1.1(webpack@5.101.3) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.101.3) + optionalDependencies: + fsevents: 2.3.3 + typescript: 5.8.2 + transitivePeerDependencies: + - '@babel/plugin-syntax-flow' + - '@babel/plugin-transform-react-jsx' + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - bufferutil + - canvas + - clean-css + - csso + - debug + - esbuild + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - fibers + - node-notifier + - node-sass + - rework + - rework-visit + - sass + - sass-embedded + - sockjs-client + - supports-color + - ts-node + - type-fest + - uglify-js + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(@types/babel__core@7.20.5)(bufferutil@4.0.9)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(type-fest@0.21.3)(typescript@5.8.2)(utf-8-validate@5.0.10): + dependencies: + '@babel/core': 7.26.10 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3))(webpack@5.101.3) + '@svgr/webpack': 5.5.0 + babel-jest: 27.5.1(@babel/core@7.26.10) + babel-loader: 8.4.1(@babel/core@7.26.10)(webpack@5.101.3) + babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.10) + babel-preset-react-app: 10.1.0 + bfj: 7.1.0 + browserslist: 4.24.4 + camelcase: 6.3.0 + case-sensitive-paths-webpack-plugin: 2.4.0 + css-loader: 6.11.0(webpack@5.101.3) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.101.3) + dotenv: 10.0.0 + dotenv-expand: 5.1.0 + eslint: 8.57.1 + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10))(eslint@8.57.1)(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10))(typescript@5.8.2) + eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.101.3) + file-loader: 6.2.0(webpack@5.101.3) + fs-extra: 10.1.0 + html-webpack-plugin: 5.6.3(webpack@5.101.3) + identity-obj-proxy: 3.0.0 + jest: 27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10) + jest-resolve: 27.5.1 + jest-watch-typeahead: 1.1.0(jest@27.5.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2))(utf-8-validate@5.0.10)) + mini-css-extract-plugin: 2.9.2(webpack@5.101.3) + postcss: 8.5.3 + postcss-flexbugs-fixes: 5.0.2(postcss@8.5.3) + postcss-loader: 6.2.1(postcss@8.5.3)(webpack@5.101.3) + postcss-normalize: 10.0.1(browserslist@4.24.4)(postcss@8.5.3) + postcss-preset-env: 7.8.3(postcss@8.5.3) + prompts: 2.4.2 + react: 18.3.1 + react-app-polyfill: 3.0.0 + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.8.2)(webpack@5.101.3) + react-refresh: 0.11.0 + resolve: 1.22.10 + resolve-url-loader: 4.0.0 + sass-loader: 12.6.0(webpack@5.101.3) + semver: 7.7.1 + source-map-loader: 3.0.2(webpack@5.101.3) + style-loader: 3.3.4(webpack@5.101.3) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@24.3.0)(typescript@5.8.2)) + terser-webpack-plugin: 5.3.14(webpack@5.101.3) + webpack: 5.101.3(webpack-cli@6.0.1) + webpack-dev-server: 4.15.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)(webpack@5.101.3) + webpack-manifest-plugin: 4.1.1(webpack@5.101.3) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.101.3) optionalDependencies: fsevents: 2.3.3 typescript: 5.8.2 @@ -19401,7 +19450,7 @@ snapshots: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) sax@1.2.4: {} @@ -19643,7 +19692,6 @@ snapshots: sisteransi@1.0.5: {} - siwe@3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): siwe@3.0.0(ethers@5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@spruceid/siwe-parser': 3.0.0 @@ -19682,7 +19730,7 @@ snapshots: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) source-map-support@0.5.21: dependencies: @@ -19933,7 +19981,7 @@ snapshots: style-loader@3.3.4(webpack@5.101.3): dependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) styled-jsx@5.1.6(react@18.3.1): dependencies: @@ -20088,14 +20136,14 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.14(webpack@5.99.9): + terser-webpack-plugin@5.3.14(webpack@5.101.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) terser@5.39.0: dependencies: @@ -20425,10 +20473,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@6.19.8: {} - - undici-types@6.20.0: - optional: true + undici-types@7.10.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -20525,24 +20570,7 @@ snapshots: vary@1.1.2: {} - viem@2.33.3(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2): - dependencies: - '@noble/curves': 1.9.2 - '@noble/hashes': 1.8.0 - '@scure/bip32': 1.7.0 - '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) - isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ox: 0.8.6(typescript@5.8.2)(zod@3.24.2) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - vite-node@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + viem@2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -20592,19 +20620,7 @@ snapshots: terser: 5.39.0 yaml: 2.7.0 - vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): - dependencies: - esbuild: 0.25.1 - postcss: 8.5.3 - rollup: 4.37.0 - optionalDependencies: - '@types/node': 22.13.14 - fsevents: 2.3.3 - jiti: 2.4.2 - terser: 5.39.0 - yaml: 2.7.0 - - vitest@3.0.9(@types/node@20.17.28)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) @@ -20627,46 +20643,7 @@ snapshots: vite-node: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.17.28 - jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vitest@3.0.9(@types/node@22.13.14)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): - dependencies: - '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.9 - '@vitest/runner': 3.0.9 - '@vitest/snapshot': 3.0.9 - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 - chai: 5.2.0 - debug: 4.4.0 - expect-type: 1.2.0 - magic-string: 0.30.17 - pathe: 2.0.3 - std-env: 3.8.1 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinypool: 1.0.2 - tinyrainbow: 2.0.0 - vite: 6.2.3(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.9(@types/node@22.13.14)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 24.3.0 jsdom: 16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti @@ -20726,9 +20703,9 @@ snapshots: webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.99.9) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.3) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.3) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -20749,9 +20726,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) - webpack-dev-middleware@7.4.2(webpack@5.99.9): + webpack-dev-middleware@7.4.2(webpack@5.101.3): dependencies: colorette: 2.0.20 memfs: 4.38.2 @@ -20795,7 +20772,7 @@ snapshots: webpack-dev-middleware: 5.3.4(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) transitivePeerDependencies: - bufferutil - debug @@ -20830,7 +20807,7 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.99.9) + webpack-dev-middleware: 7.4.2(webpack@5.101.3) ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1) @@ -20844,7 +20821,7 @@ snapshots: webpack-manifest-plugin@4.1.1(webpack@5.101.3): dependencies: tapable: 2.2.1 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) webpack-sources: 2.3.1 webpack-merge@6.0.1: @@ -20863,17 +20840,18 @@ snapshots: source-list-map: 2.0.1 source-map: 0.6.1 - webpack-sources@3.2.3: {} + webpack-sources@3.3.3: {} - webpack@5.99.9(webpack-cli@6.0.1): + webpack@5.101.3(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) browserslist: 4.24.4 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.1 @@ -20888,9 +20866,9 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.99.9) + terser-webpack-plugin: 5.3.14(webpack@5.101.3) watchpack: 2.4.2 - webpack-sources: 3.2.3 + webpack-sources: 3.3.3 optionalDependencies: webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.3) transitivePeerDependencies: @@ -21115,7 +21093,7 @@ snapshots: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.99.9(webpack-cli@6.0.1) + webpack: 5.101.3(webpack-cli@6.0.1) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -21169,11 +21147,15 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.0.9 utf-8-validate: 5.0.10 + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 + xml-name-validator@3.0.0: {} xmlchars@2.2.0: {} @@ -21216,4 +21198,4 @@ snapshots: property-expr: 2.0.6 toposort: 2.0.2 - zod@3.24.2: {} \ No newline at end of file + zod@3.24.2: {} From 42b9e57a0b825579e93c94bcbf31f4fbc8731462 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Fri, 3 Oct 2025 12:24:42 +0200 Subject: [PATCH 88/97] edit docs and address review points --- packages/shared/src/domain.ts | 48 +++++ packages/shared/src/index.ts | 1 + packages/shared/src/viem/index.ts | 1 + packages/taco/README.md | 30 +-- .../taco/examples/taco-client-examples.md | 108 ---------- .../taco/integration-test/taco-client.test.ts | 26 ++- .../viem-to-ethers-ens.test.ts | 2 +- .../taco/src/{ => client}/client-config.ts | 8 +- .../config-validator.ts} | 189 ++++++------------ packages/taco/src/client/index.ts | 2 + packages/taco/src/{ => client}/taco-client.ts | 123 +++++------- packages/taco/src/index.ts | 15 +- packages/taco/test/client.test.ts | 152 ++++++-------- packages/test-utils/src/utils.ts | 4 +- 14 files changed, 257 insertions(+), 452 deletions(-) create mode 100644 packages/shared/src/domain.ts delete mode 100644 packages/taco/examples/taco-client-examples.md rename packages/taco/src/{ => client}/client-config.ts (93%) rename packages/taco/src/{taco-config-validator.ts => client/config-validator.ts} (56%) create mode 100644 packages/taco/src/client/index.ts rename packages/taco/src/{ => client}/taco-client.ts (72%) diff --git a/packages/shared/src/domain.ts b/packages/shared/src/domain.ts new file mode 100644 index 000000000..8789ff3f7 --- /dev/null +++ b/packages/shared/src/domain.ts @@ -0,0 +1,48 @@ +export type DomainName = 'lynx' | 'tapir' | 'mainnet'; + +/** + * TACo domain configuration with essential network data + * + * Contains domain names, chain IDs, and core infrastructure information + * needed for TACo operations across different networks. + * + * @example + * ```typescript + * // Get domain information + * const lynxInfo = DOMAINS.DEVNET; + * console.log(lynxInfo.domain); // 'lynx' + * console.log(lynxInfo.chainId); // 80002 + * ``` + */ +export const DOMAINS = { + // lynx - DEVNET: Bleeding-edge developer network + DEVNET: { + domain: 'lynx', + chainId: 80002, + }, + // tapir - TESTNET: Stable testnet for current TACo release + TESTNET: { + domain: 'tapir', + chainId: 80002, + }, + // mainnet - MAINNET: Production network + MAINNET: { + domain: 'mainnet', + chainId: 137, + }, +} as const; + +/** + * TACo Domain Name Constants + * + * Convenient constants for referencing TACo domain names in a type-safe manner. + * Use these constants instead of hardcoded strings for better maintainability. + */ +export const DOMAIN_NAMES = { + /** DEVNET domain ('lynx') - Bleeding-edge developer network */ + DEVNET: 'lynx', + /** TESTNET domain ('tapir') - Stable testnet for current TACo release */ + TESTNET: 'tapir', + /** MAINNET domain ('mainnet') - Production network */ + MAINNET: 'mainnet', +} as const; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index d7828c8a6..1b4dc17ef 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,5 +1,6 @@ export * from './adapters'; export * from './contracts'; +export * from './domain'; export * from './porter'; export * from './schemas'; export * from './taco-signer'; diff --git a/packages/shared/src/viem/index.ts b/packages/shared/src/viem/index.ts index a2dddad71..67fc88ad2 100644 --- a/packages/shared/src/viem/index.ts +++ b/packages/shared/src/viem/index.ts @@ -1 +1,2 @@ +export * from './type-guards'; export type * from './types'; diff --git a/packages/taco/README.md b/packages/taco/README.md index 80684784f..2a92b4811 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -143,19 +143,13 @@ For detailed viem documentation, see [VIEM_SUPPORT.md](./VIEM_SUPPORT.md). For applications requiring multiple TACo operations or complex configuration management, the TACo SDK provides an optional object-oriented interface through the `TacoClient` class. This provides a stateful, higher-level abstraction over the functional API. -### What is different from the functional API? - -- **Stateful Configuration**: Store domain, ritual ID, and other client configurations at instance level so there is less need to repeatedly pass some config parameters. -- **Enhanced Validation**: Enhanced configuration validation and correction. -- **Enhanced Type Safety**: More type strict for the domain name. - The Object-Oriented API is fully backward compatible - you can use both APIs in -the same application as needed. Except that the TacoClient has more validations +the same application as needed. Except that the TacoClient has additional validations and hence throws some errors earlier with different error messages. -NOTE: Using TacoClient is basically similar to using the functional API. And there is no -specific recommendations on what to use. It is for the convenience of the -developer to choose. +NOTE: Using `TacoClient` is equivalent to using the functional API. +There are no specific recommendations on which approach to use. +Choose the one that best suits your development preferences. ### Basic Usage @@ -177,7 +171,7 @@ const viemAccount = privateKeyToAccount('0x...'); // Create TacoClient instance with domain constants const tacoClient = new TacoClient({ - domain: DOMAIN_NAMES.TESTNET, // TacoDomains.TESTNET -> 'tapir' + domain: DOMAIN_NAMES.TESTNET, // TESTNET -> 'tapir' ritualId: 6, viemClient, viemAccount @@ -203,9 +197,9 @@ TacoClient supports both viem and ethers.js configurations: ```typescript import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; -// With viem (recommended) +// With viem const tacoClientViem = new TacoClient({ - domain: TacoDomains.TESTNET, + domain: DOMAIN_NAMES.TESTNET, ritualId: 6, viemClient, viemAccount @@ -213,21 +207,13 @@ const tacoClientViem = new TacoClient({ // With ethers.js const tacoClientEthers = new TacoClient({ - domain: TacoDomains.TESTNET, + domain: DOMAIN_NAMES.TESTNET, ritualId: 6, ethersProvider, ethersSigner }); ``` -### Backward Compatibility - -The TacoClient provides a higher-level interface while maintaining full backward compatibility: - -- **Zero Breaking Changes**: Existing functional API remains unchanged -- **Optional Import**: OOP classes available as optional imports -- **Interoperable**: Can use both APIs in the same application, if needed. - ## Learn more Please find developer documentation for diff --git a/packages/taco/examples/taco-client-examples.md b/packages/taco/examples/taco-client-examples.md deleted file mode 100644 index 169aa2a75..000000000 --- a/packages/taco/examples/taco-client-examples.md +++ /dev/null @@ -1,108 +0,0 @@ -# TacoClient Examples - -This document demonstrates how to use the new Object-Oriented TacoClient -interface. - -## Basic Usage - -### 1. Import Required Dependencies - -```typescript -import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; -import { createPublicClient, http } from 'viem'; -import { polygonAmoy } from 'viem/chains'; -import { privateKeyToAccount } from 'viem/accounts'; -import * as conditions from '@nucypher/taco/conditions'; -import { ConditionContext } from '@nucypher/taco'; -import { - EIP4361AuthProvider, - USER_ADDRESS_PARAM_DEFAULT, -} from '@nucypher/taco-auth'; -``` - -### 2. Create TacoClient Instance - -```typescript -// Create viem client for Polygon Amoy (TACo network) -const viemClient = createPublicClient({ - chain: polygonAmoy, - transport: http(), -}); - -// Create account from private key -const viemAccount = privateKeyToAccount('0x...'); - -// Create TacoClient with configuration -const tacoClient = new TacoClient({ - domain: DOMAIN_NAMES.TESTNET, // 'tapir' - stable testnet - ritualId: 6, // default ritual ID for TESTNET - viemClient, - viemAccount, -}); -// Validate configuration - because this is an async operation, it needs to be awaited and it cannot be done in the constructor -// However, the constructor will also do but a fast check and throw if the configuration is invalid -await tacoClient.validateConfig(); -``` - -### 3. Encrypt and Decrypt Data - -```typescript -// Create a simple time-based condition -const condition = new conditions.predefined.ERC20Balance({ - contractAddress: '0x...', - standardContractType: 'ERC20', - method: 'balanceOf', - parameters: [':userAddress'], - returnValueTest: { - comparator: '>=', - value: 1000000000000000000, // 1 token - }, -}); - -// Encrypt data -const messageKit = await tacoClient.encrypt('Hello, secret world!', condition); - -// Decrypt with explicit context creation (following security best practices) -const conditionContext = ConditionContext.fromMessageKit(messageKit); - -// If your condition uses ':userAddress', add authentication: -// const ethersProvider = new ethers.providers.Web3Provider(window.ethereum); -// const authProvider = new EIP4361AuthProvider(ethersProvider, ethersProvider.getSigner()); -// conditionContext.addAuthProvider(USER_ADDRESS_PARAM_DEFAULT, authProvider); - -const decrypted = await tacoClient.decrypt(messageKit, conditionContext); -// OR with encrypted bytes: -// const decrypted = await tacoClient.decrypt(messageKit.toBytes(), conditionContext); - -const message = new TextDecoder().decode(decrypted); -console.log(message); // "Hello, secret world!" -``` - -## Advanced Usage - -### Multiple Clients for Different Contexts - -```typescript -// Development client -const devConfig = TacoConfig.process({ domain: 'tapir' }); -const devClient = new TacoClient({ - ...devConfig, - viemClient: devViemClient, - viemAccount: devAccount, -}); - -// Production client (requires custom ritual ID) -const prodConfig = TacoConfig.process({ - domain: 'mainnet', - ritualId: 42, // Custom ritual ID from TACo team -}); -const prodClient = new TacoClient({ - ...prodConfig, - viemClient: prodViemClient, - viemAccount: prodAccount, -}); - -// Use different clients for different environments -const devEncrypted = await devClient.encrypt('dev data', devCondition); -const prodEncrypted = await prodClient.encrypt('prod data', prodCondition); -``` diff --git a/packages/taco/integration-test/taco-client.test.ts b/packages/taco/integration-test/taco-client.test.ts index 86e71776e..bc6e95531 100644 --- a/packages/taco/integration-test/taco-client.test.ts +++ b/packages/taco/integration-test/taco-client.test.ts @@ -24,25 +24,25 @@ const ENCRYPTOR_PRIVATE_KEY = '0x900edb9e8214b2353f82aa195e915128f419a92cfb8bbc0f4784f10ef4112b86'; const CONSUMER_PRIVATE_KEY = '0xf307e165339cb5deb2b8ec59c31a5c0a957b8e8453ce7fe8a19d9a4c8acf36d4'; -const DOMAIN = 'lynx'; -const RITUAL_ID = 27; +const DOMAIN = 'tapir'; +const RITUAL_ID = 6; const CHAIN_ID = 80002; // Polygon Amoy // temp type-safe configuration interfaces just for this testing file type ViemTestConfig = Omit; type EthersTestConfig = Omit; -// Create viem accounts from private keys -const encryptorAccount = privateKeyToAccount( - ENCRYPTOR_PRIVATE_KEY as `0x${string}`, -); -const consumerAccount = privateKeyToAccount( - CONSUMER_PRIVATE_KEY as `0x${string}`, -); - describe.skipIf(!process.env.RUNNING_IN_CI)( 'TacoClient Integration Test', () => { + // Create viem accounts from private keys + const encryptorAccount = privateKeyToAccount( + ENCRYPTOR_PRIVATE_KEY as `0x${string}`, + ); + const consumerAccount = privateKeyToAccount( + CONSUMER_PRIVATE_KEY as `0x${string}`, + ); + // Create viem clients for correct network (Polygon Amoy) const viemPublicClient = createPublicClient({ chain: polygonAmoy, @@ -244,11 +244,9 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( }); // Validate configuration with network calls - const validation = await tacoClient.validateConfig(); + const validation = tacoClient.validateConfig(); - // Verify validation results - expect(validation.isValid).toBe(true); - expect(validation.errors).toHaveLength(0); + expect(validation).resolves.not.toThrow(); }, 10000); }); }, diff --git a/packages/taco/integration-test/viem-to-ethers-ens.test.ts b/packages/taco/integration-test/viem-to-ethers-ens.test.ts index 69be176c3..3b9914542 100644 --- a/packages/taco/integration-test/viem-to-ethers-ens.test.ts +++ b/packages/taco/integration-test/viem-to-ethers-ens.test.ts @@ -6,7 +6,7 @@ import { mainnet } from 'viem/chains'; describe.skipIf(!process.env.RUNNING_IN_CI)('Viem-Ethers Adapter Integration Tests', () => { describe('ENS Registry', () => { - // TODO: will fix this in a different PR. + // TODO: will fix this in a different PR - issue #712 test.skip('should properly read ENS registry contract address from viem client converted to ethers provider', async () => { // Test with chain that has ENS registry (mainnet) // Note: mainnet from viem/chains includes ENS registry configuration diff --git a/packages/taco/src/client-config.ts b/packages/taco/src/client/client-config.ts similarity index 93% rename from packages/taco/src/client-config.ts rename to packages/taco/src/client/client-config.ts index 4dde4f18a..faa225864 100644 --- a/packages/taco/src/client-config.ts +++ b/packages/taco/src/client/client-config.ts @@ -5,11 +5,13 @@ * for configuring TacoClient instances with different blockchain client libraries (viem, ethers.js). */ -import { type PublicClient, type SignerAccount } from '@nucypher/shared'; +import { + DomainName, + type PublicClient, + type SignerAccount, +} from '@nucypher/shared'; import type { ethers } from 'ethers'; -import type { DomainName } from './taco-config-validator'; - /** * Base configuration for TacoClient */ diff --git a/packages/taco/src/taco-config-validator.ts b/packages/taco/src/client/config-validator.ts similarity index 56% rename from packages/taco/src/taco-config-validator.ts rename to packages/taco/src/client/config-validator.ts index c3eebe7c7..f3ff43fe9 100644 --- a/packages/taco/src/taco-config-validator.ts +++ b/packages/taco/src/client/config-validator.ts @@ -5,81 +5,16 @@ * and configuration processing for TACo operations across different networks. */ +import { + DomainName, + DOMAINS, + isViemClient, + ProviderLike, +} from '@nucypher/shared'; import { ethers } from 'ethers'; import type { PublicClient } from 'viem'; -import type { TacoClientConfig } from './client-config'; - -export type DomainName = 'lynx' | 'tapir' | 'mainnet'; - -/** - * TACo domain configuration with essential network data - * - * Contains domain names, chain IDs, and core infrastructure information - * needed for TACo operations across different networks. - * - * @example - * ```typescript - * // Get domain information - * const lynxInfo = DOMAINS.DEVNET; - * console.log(lynxInfo.domain); // 'lynx' - * console.log(lynxInfo.chainId); // 80002 - * ``` - */ -export const DOMAINS = { - // lynx - DEVNET: Bleeding-edge developer network - DEVNET: { - domain: 'lynx', - chainId: 80002, - }, - // tapir - TESTNET: Stable testnet for current TACo release - TESTNET: { - domain: 'tapir', - chainId: 80002, - }, - // mainnet - MAINNET: Production network - MAINNET: { - domain: 'mainnet', - chainId: 137, - }, -} as const; - -/** - * TACo Domain Name Constants - * - * Convenient constants for referencing TACo domain names in a type-safe manner. - * Use these constants instead of hardcoded strings for better maintainability. - */ -export const DOMAIN_NAMES = { - /** DEVNET domain ('lynx') - Bleeding-edge developer network */ - DEVNET: 'lynx', - /** TESTNET domain ('tapir') - Stable testnet for current TACo release */ - TESTNET: 'tapir', - /** MAINNET domain ('mainnet') - Production network */ - MAINNET: 'mainnet', -} as const; - -/** - * Domain-ChainId validation type - creates a discriminated union - * where each domain is linked to its specific chainId - */ -export type DomainChainConfig = { - [K in keyof typeof DOMAINS]: { - domain: (typeof DOMAINS)[K]['domain']; - chainId: (typeof DOMAINS)[K]['chainId']; - }; -}[keyof typeof DOMAINS]; - -/** - * Validates that the provided domain and chainId combination is correct - * TypeScript will enforce that only valid domain/chainId pairs are accepted - */ -export function validateDomainChain(config: DomainChainConfig): boolean { - const domainInfo = Object.values(DOMAINS).find( - (info) => info.domain === config.domain, - ); - return !!domainInfo && domainInfo.chainId === config.chainId; -} +import { isEthersConfig, isViemConfig, type TacoClientConfig } from '.'; /** * Generic validation result interface @@ -106,7 +41,7 @@ export class TacoConfigValidator { /** * Check if domain is valid - * @param domain - TACo domain name to check ('lynx', 'tapir', 'mainnet') + * @param {DomainName} domain - TACo domain name to check ('lynx', 'tapir', 'mainnet') * @returns {boolean} True if domain exists */ static isValidDomain(domain: DomainName): boolean { @@ -115,11 +50,11 @@ export class TacoConfigValidator { /** * Get expected chain ID for domain from DOMAINS configuration - * @param domain - Domain name to look up + * @param {DomainName} domain - Domain name to look up * @returns {number | undefined} Chain ID for the domain, undefined if not found * @private */ - private static getExpectedChainId(domain: string): number | undefined { + private static getExpectedChainId(domain: DomainName): number | undefined { const domainEntry = Object.values(DOMAINS).find( (domainConfig) => domainConfig.domain === domain, ); @@ -127,24 +62,27 @@ export class TacoConfigValidator { } /** - * Validate ritual ID (basic validation - positive number only) - * @param domain - Domain name (unused but kept for API compatibility) - * @param ritualId - Ritual ID to validate - * @returns {boolean} True if valid (positive number) + * Validate ritual ID (basic validation - positive integer or 0) + * @param {number} ritualId - Ritual ID to validate + * @returns {boolean} True if valid (positive integer or 0) */ - static isValidRitualId(domain: DomainName, ritualId: number): boolean { - return typeof ritualId === 'number' && ritualId > 0; + static isValidRitualId(ritualId: number): boolean { + return ( + typeof ritualId === 'number' && + Number.isInteger(ritualId) && + ritualId >= 0 + ); } /** * Validate provider compatibility with domain - * @param domain - Domain name - * @param provider - Provider to validate (viem PublicClient or ethers Provider) + * @param {DomainName} domain - Domain name + * @param {ProviderLike} provider - Provider to validate (ethers Provider or viem PublicClient) * @returns {Promise} True if provider is valid for domain */ static async isValidProvider( domain: DomainName, - provider: PublicClient | ethers.providers.Provider, + provider: ProviderLike, ): Promise { let chainId: number; @@ -155,25 +93,13 @@ export class TacoConfigValidator { // Try to detect provider type and get chain ID safely try { - // Check if it's a viem PublicClient (has getChainId method) - if ( - 'getChainId' in provider && - typeof provider.getChainId === 'function' - ) { + if (isViemClient(provider)) { chainId = await (provider as PublicClient).getChainId(); - } - // Check if it's an ethers Provider (has getNetwork method) - else if ( - 'getNetwork' in provider && - typeof provider.getNetwork === 'function' - ) { + } else { const network = await ( provider as ethers.providers.Provider ).getNetwork(); chainId = network.chainId; - } else { - // Unknown provider type - return false; } } catch (error) { // Error getting chain ID @@ -191,8 +117,15 @@ export class TacoConfigValidator { /** * Fast validation (everything except provider network checks) - * @param config - Configuration to validate - * @returns {ValidationResult} Validation result + * + * Performs synchronous validation of configuration including: + * - Domain name validation + * - Ritual ID validation to ensure it is a positive integer + * - Provider/signer presence validation + * - Chain compatibility check (if chain info is available synchronously) + * + * @param {TacoClientConfig} config - Configuration to validate + * @returns {ValidationResult} Validation result with isValid boolean and errors array */ static validateFast(config: TacoClientConfig): ValidationResult { const errors: string[] = []; @@ -209,14 +142,14 @@ export class TacoConfigValidator { // Validate ritual ID if (!config.ritualId) { errors.push('The property `ritualId` is required'); - } else if (!this.isValidRitualId(config.domain, config.ritualId)) { + } else if (!this.isValidRitualId(config.ritualId)) { errors.push( `Invalid ritual ID: ${config.ritualId} for domain ${config.domain}`, ); } // Validate blockchain client configuration - if ('viemClient' in config) { + if (isViemConfig(config)) { // Viem configuration if (!config.viemClient) { errors.push('viemClient is required for viem configuration'); @@ -224,7 +157,7 @@ export class TacoConfigValidator { if (!config.viemSignerAccount) { errors.push('viemSignerAccount is required for viem configuration'); } - } else if ('ethersProvider' in config) { + } else if (isEthersConfig(config)) { // Ethers configuration if (!config.ethersProvider) { errors.push('ethersProvider is required for ethers configuration'); @@ -249,6 +182,12 @@ export class TacoConfigValidator { /** * Synchronous chain compatibility validation + * + * Validates provider chain compatibility with domain requirements using + * synchronously available chain information. + * + * @param {TacoClientConfig} config - Configuration to validate + * @returns {ValidationResult} Validation result * @private */ private static validateChainCompatibility( @@ -263,44 +202,34 @@ export class TacoConfigValidator { return { isValid: false, errors }; } - // Check viem client chain compatibility - if ('viemClient' in config && config.viemClient) { + if (isViemConfig(config) && config.viemClient) { + // Note: If viemClient.chain is undefined, we skip synchronous validation + // Full validation with validateFull() will perform the network check const viemClient = config.viemClient as PublicClient; if (viemClient.chain && viemClient.chain.id !== expectedChainId) { errors.push( `Provider chain mismatch: viem client chain ID ${viemClient.chain.id} does not match domain '${config.domain}' (expected ${expectedChainId})`, ); } - } - - // Check ethers provider chain compatibility - if ('ethersProvider' in config && config.ethersProvider) { - // Note: _network is not public API, but it's the only synchronous way to check - // However, if the property `_network` was not available, no error will be thrown. - const ethersProvider = config.ethersProvider as unknown as { - _network?: { chainId: number }; - }; - if ( - ethersProvider._network && - ethersProvider._network.chainId !== expectedChainId - ) { - errors.push( - `Provider chain mismatch: ethers provider chain ID ${ethersProvider._network.chainId} does not match domain '${config.domain}' (expected ${expectedChainId})`, - ); - } - } + } // No need to count for the other cases. The caller methods already handle them. return { isValid: errors.length === 0, errors }; } /** * Full validation including async provider network checks - * @param config - Configuration to validate - * @returns {Promise} Validation result with provider validation + * + * Performs comprehensive validation including: + * - All fast validation checks + * - Async network calls to verify provider chain ID matches domain requirements + * + * Use this method when you need complete validation including network connectivity checks. + * For faster validation without network calls, use validateFast(). + * + * @param {TacoClientConfig} config - Configuration to validate + * @returns {Promise} Promise resolving to validation result with isValid boolean and errors array */ - static async validateFull( - config: TacoClientConfig, - ): Promise { + static async validate(config: TacoClientConfig): Promise { // First run fast validation const fastResult = this.validateFast(config); if (!fastResult.isValid) { @@ -312,9 +241,9 @@ export class TacoConfigValidator { // Additional async provider validation let provider: PublicClient | ethers.providers.Provider | undefined; - if ('viemClient' in config) { + if (isViemConfig(config)) { provider = config.viemClient; - } else if ('ethersProvider' in config) { + } else if (isEthersConfig(config)) { provider = config.ethersProvider; } diff --git a/packages/taco/src/client/index.ts b/packages/taco/src/client/index.ts new file mode 100644 index 000000000..981f50a85 --- /dev/null +++ b/packages/taco/src/client/index.ts @@ -0,0 +1,2 @@ +export * from './client-config'; +export * from './taco-client'; diff --git a/packages/taco/src/taco-client.ts b/packages/taco/src/client/taco-client.ts similarity index 72% rename from packages/taco/src/taco-client.ts rename to packages/taco/src/client/taco-client.ts index a2d1ee9f1..adf764693 100644 --- a/packages/taco/src/taco-client.ts +++ b/packages/taco/src/client/taco-client.ts @@ -12,18 +12,16 @@ import { ThresholdMessageKit, } from '@nucypher/nucypher-core'; +import { Condition } from '../conditions/condition'; +import { ConditionContext } from '../conditions/context/index'; +import { decrypt, encrypt, encryptWithPublicKey } from '../taco'; + import { type TacoClientConfig, type TacoClientEthersConfig, type TacoClientViemConfig, -} from './client-config.js'; -import { Condition } from './conditions/condition.js'; -import { ConditionContext } from './conditions/context/index.js'; -import { - TacoConfigValidator, - type ValidationResult, -} from './taco-config-validator.js'; -import { decrypt, encrypt, encryptWithPublicKey } from './taco.js'; +} from './client-config'; +import { TacoConfigValidator } from './config-validator'; /** * TacoClient provides an object-oriented interface for TACo operations @@ -32,12 +30,6 @@ import { decrypt, encrypt, encryptWithPublicKey } from './taco.js'; * for encryption and decryption operations. It handles configuration validation, * automatic WASM initialization, and provides enhanced error messages. * - * **Key Features:** - * - Automatic WASM initialization (singleton pattern) - * - Supports both viem and ethers.js - * - Configuration validation with helpful error messages - * - Thread-safe initialization across multiple instances - * * @example Using with viem: * ```typescript * import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; @@ -130,7 +122,7 @@ export class TacoClient { /** * Create a new TacoClient instance * - * @param config - Configuration for the TacoClient + * @param {TacoClientConfig} config - Configuration for the TacoClient * @throws {Error} If configuration is invalid */ constructor(config: TacoClientConfig) { @@ -154,33 +146,34 @@ export class TacoClient { * - Network compatibility check (calls provider to verify chain ID matches domain) * * @returns {Promise} Promise resolving to validation result with isValid boolean and errors array + * @throws {Error} If configuration validation fails * * @example * ```typescript - * const result = await tacoClient.validateConfig(); - * if (!result.isValid) { - * console.error('Configuration errors:', result.errors); + * try { + * await tacoClient.validateConfig(); + * console.log('Configuration is valid.'); + * } catch (error) { + * console.error('Configuration validation failed:', error.message); * } * ``` */ - async validateConfig(): Promise { - const validationResult = await TacoConfigValidator.validateFull( - this.config, - ); + async validateConfig(): Promise { + const validationResult = await TacoConfigValidator.validate(this.config); if (!validationResult.isValid) { throw new Error( `Invalid configuration: ${validationResult.errors.join(', ')}`, ); } - return validationResult; } /** * Encrypt data with the given access condition * - * @param data - String or Uint8Array to encrypt - * @param accessCondition - Access condition for decryption + * @param {string | Uint8Array} data - String or Uint8Array to encrypt + * @param {Condition} accessCondition - Access condition for decryption * @returns {Promise} Encrypted message kit + * @throws {Error} If encryption fails * * @example * ```typescript @@ -193,22 +186,18 @@ export class TacoClient { ): Promise { await TacoClient.initialize(); - try { - const messageKit = await encrypt( - (this.config as TacoClientEthersConfig).ethersProvider || - (this.config as TacoClientViemConfig).viemClient, - this.config.domain, - data, - accessCondition, - this.config.ritualId, - (this.config as TacoClientEthersConfig).ethersSigner || - (this.config as TacoClientViemConfig).viemSignerAccount, - ); + const messageKit = await encrypt( + (this.config as TacoClientEthersConfig).ethersProvider || + (this.config as TacoClientViemConfig).viemClient, + this.config.domain, + data, + accessCondition, + this.config.ritualId, + (this.config as TacoClientEthersConfig).ethersSigner || + (this.config as TacoClientViemConfig).viemSignerAccount, + ); - return messageKit; - } catch (error) { - throw new Error(`TACo encryption failed: ${error}`); - } + return messageKit; } /** @@ -217,10 +206,11 @@ export class TacoClient { * This method can be used offline since it doesn't require network access to fetch * the DKG public key (unlike the `encrypt` method which fetches it from the ritual). * - * @param data - String or Uint8Array to encrypt - * @param accessCondition - Access condition for decryption - * @param dkgPublicKey - The DKG public key to use for encryption + * @param {string | Uint8Array} data - String or Uint8Array to encrypt + * @param {Condition} accessCondition - Access condition for decryption + * @param {DkgPublicKey} dkgPublicKey - The DKG public key to use for encryption * @returns {Promise} Encrypted message kit + * @throws {Error} If encryption fails * * @example * ```typescript @@ -238,27 +228,24 @@ export class TacoClient { ): Promise { await TacoClient.initialize(); - try { - const messageKit = await encryptWithPublicKey( - data, - accessCondition, - dkgPublicKey, - (this.config as TacoClientEthersConfig).ethersSigner || - (this.config as TacoClientViemConfig).viemSignerAccount, - ); + const messageKit = await encryptWithPublicKey( + data, + accessCondition, + dkgPublicKey, + (this.config as TacoClientEthersConfig).ethersSigner || + (this.config as TacoClientViemConfig).viemSignerAccount, + ); - return messageKit; - } catch (error) { - throw new Error(`TACo encryption with public key failed: ${error}`); - } + return messageKit; } /** * Decrypt data using TACo * - * @param encryptedData - Either a ThresholdMessageKit or encrypted bytes (Uint8Array) - * @param conditionContext - Optional condition context for time-based conditions + * @param {ThresholdMessageKit | Uint8Array} encryptedData - Either a ThresholdMessageKit or encrypted bytes (Uint8Array) + * @param {ConditionContext} [conditionContext] - Optional condition context for time-based conditions * @returns {Promise} Decrypted data + * @throws {Error} If decryption fails * * @example * ```typescript @@ -281,20 +268,16 @@ export class TacoClient { ? encryptedData : ThresholdMessageKit.fromBytes(encryptedData); - try { - const decrypted = await decrypt( - (this.config as TacoClientEthersConfig).ethersProvider || - (this.config as TacoClientViemConfig).viemClient, - this.config.domain, - messageKit, - conditionContext, - this.config.porterUris, - ); + const decrypted = await decrypt( + (this.config as TacoClientEthersConfig).ethersProvider || + (this.config as TacoClientViemConfig).viemClient, + this.config.domain, + messageKit, + conditionContext, + this.config.porterUris, + ); - return decrypted; - } catch (error) { - throw new Error(`TaCo decryption failed: ${error}`); - } + return decrypted; } /** diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index bbbc3365e..5cbec5dab 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -13,20 +13,9 @@ export * as conditions from './conditions'; export { decrypt, encrypt, encryptWithPublicKey } from './taco'; -// TaCo Configuration and Client -export { - DOMAINS, - DOMAIN_NAMES, - type DomainName, - type ValidationResult, -} from './taco-config-validator'; - -// TacoConfigValidator is internal-only, not exported - -export { TacoClient } from './taco-client'; - export { + TacoClient, type TacoClientConfig, type TacoClientEthersConfig, type TacoClientViemConfig, -} from './client-config'; +} from './client'; diff --git a/packages/taco/test/client.test.ts b/packages/taco/test/client.test.ts index d2327e1d4..7aef7f748 100644 --- a/packages/taco/test/client.test.ts +++ b/packages/taco/test/client.test.ts @@ -1,6 +1,10 @@ -import type { ethers } from 'ethers'; -import { type LocalAccount, type PublicClient } from 'viem'; -import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; +import { DOMAIN_NAMES, DomainName } from '@nucypher/shared'; +import { + fakeProvider, + fakeViemAccount, + fakeViemPublicClient, +} from '@nucypher/test-utils'; +import { beforeAll, beforeEach, describe, expect, it } from 'vitest'; import { TacoClient, @@ -8,43 +12,7 @@ import { type TacoClientEthersConfig, type TacoClientViemConfig, } from '../src'; -import { - type DomainName, - TacoConfigValidator, -} from '../src/taco-config-validator'; - -// Mock viem dependencies for testing -const mockViemClient = { - getChainId: vi.fn().mockResolvedValue(80002), - call: vi.fn().mockResolvedValue('0x'), - getNetwork: vi - .fn() - .mockResolvedValue({ chainId: 80002, name: 'polygon-amoy' }), - readContract: vi.fn().mockResolvedValue('0x'), -} as unknown as PublicClient; - -const mockViemAccount = { - address: '0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2', - signMessage: vi.fn().mockResolvedValue('0x'), - signTypedData: vi.fn().mockResolvedValue('0x'), -} as unknown as LocalAccount; - -// Mock ethers dependencies for testing -const mockEthersProvider = { - getNetwork: vi - .fn() - .mockResolvedValue({ name: 'polygon-amoy', chainId: 80002 }), - getBalance: vi.fn().mockResolvedValue('1000000000000000000'), - getCode: vi.fn().mockResolvedValue('0x'), -} as unknown as ethers.providers.Provider; - -const mockEthersSigner = { - getAddress: vi - .fn() - .mockResolvedValue('0x742d35Cc6632C0532c718F63b1a8D7d8a7fAd3b2'), - signMessage: vi.fn().mockResolvedValue('0x'), - provider: mockEthersProvider, -} as unknown as ethers.Signer; +import { TacoConfigValidator } from '../src/client/config-validator'; describe('TacoConfigValidator', () => { describe('Domain Management', () => { @@ -54,38 +22,40 @@ describe('TacoConfigValidator', () => { }); it.each([ - ['tapir', true, 'valid testnet domain'], - ['lynx', true, 'valid devnet domain'], - ['mainnet', true, 'valid production domain'], - ['INVALID', false, 'invalid domain name'], - ['', false, 'empty domain name'], - ['testnet', false, 'legacy domain key (not domain name)'], - ])('should validate domain "%s" as %s (%s)', (domain, expected) => { + [DOMAIN_NAMES.TESTNET, 'valid testnet domain'], + [DOMAIN_NAMES.DEVNET, 'valid devnet domain'], + [DOMAIN_NAMES.MAINNET, 'valid production domain'], + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ])('should validate domain "%s" as %s', (domain: DomainName, _: string) => { + expect(TacoConfigValidator.isValidDomain(domain)).toBe(true); + }); + + it.each([ + ['INVALID', 'invalid domain name'], + ['', 'empty domain name'], + ['testnet', 'legacy domain key (not domain name)'], + ])('should validate domain "%s" as %s', (domain: string) => { expect(TacoConfigValidator.isValidDomain(domain as DomainName)).toBe( - expected, + false, ); }); it.each([ - // Valid ritual IDs (any positive number) - ['lynx', 27, true, 'default devnet ritual ID'], - ['tapir', 6, true, 'default testnet ritual ID'], - ['mainnet', 42, true, 'custom mainnet ritual ID'], - ['lynx', 999, true, 'large ritual ID for devnet'], - ['tapir', 1, true, 'minimum valid ritual ID'], - ['mainnet', 100, true, 'typical mainnet ritual ID'], - // Invalid ritual IDs (zero and negative) - ['mainnet', 0, false, 'zero ritual ID'], - ['lynx', -1, false, 'negative ritual ID'], - ['tapir', -5, false, 'large negative ritual ID'], - ])( - `should validate with domain "%s" the ritual ID %d as %s (%s)`, - (domain, ritualId, expected) => { - expect( - TacoConfigValidator.isValidRitualId(domain as DomainName, ritualId), - ).toBe(expected); - }, - ); + [0, 'minimum valid ritual ID'], + [27, 'default devnet ritual ID'], + [6, 'default testnet ritual ID'], + [42, 'custom mainnet ritual ID'], + [999, 'large ritual ID for devnet'], + ])('should validate ritual ID %d (%s)', (ritualId: number) => { + expect(TacoConfigValidator.isValidRitualId(ritualId)).toBe(true); + }); + + it.each([ + [-1, 'negative ritual ID'], + [5.4, 'floating point ritual ID'], + ])('should invalidate ritual ID %d (%s)', (ritualId: number) => { + expect(TacoConfigValidator.isValidRitualId(ritualId)).toBe(false); + }); }); describe('Fast Configuration Validation', () => { @@ -93,8 +63,8 @@ describe('TacoConfigValidator', () => { const result = TacoConfigValidator.validateFast({ domain: 'tapir', ritualId: 6, - viemClient: mockViemClient, - viemSignerAccount: mockViemAccount, + viemClient: fakeViemPublicClient(), + viemSignerAccount: fakeViemAccount(), }); expect(result.isValid).toBe(true); @@ -105,8 +75,8 @@ describe('TacoConfigValidator', () => { const result = TacoConfigValidator.validateFast({ domain: 'INVALID_DOMAIN' as DomainName, ritualId: 999, - viemClient: mockViemClient, - viemSignerAccount: mockViemAccount, + viemClient: fakeViemPublicClient(), + viemSignerAccount: fakeViemAccount(), }); expect(result.isValid).toBe(false); @@ -116,8 +86,8 @@ describe('TacoConfigValidator', () => { it('should fail validation when domain is missing', () => { const result = TacoConfigValidator.validateFast({ ritualId: 6, - viemClient: mockViemClient, - viemSignerAccount: mockViemAccount, + viemClient: fakeViemPublicClient(), + viemSignerAccount: fakeViemAccount(), } as TacoClientConfig); expect(result.isValid).toBe(false); @@ -148,26 +118,29 @@ describe('TacoClient', () => { validViemConfig = { domain: 'tapir', ritualId: 6, - viemClient: mockViemClient, - viemSignerAccount: mockViemAccount, + viemClient: fakeViemPublicClient(), + viemSignerAccount: fakeViemAccount(), }; + const ethersProvider = fakeProvider(); validEthersConfig = { domain: 'tapir', ritualId: 6, - ethersProvider: mockEthersProvider, - ethersSigner: mockEthersSigner, + ethersProvider, + ethersSigner: ethersProvider.getSigner(), }; }); describe('Client Construction', () => { - it('should successfully create client with valid viem configuration', () => { + it('should successfully create client with valid viem configuration', async () => { const client = new TacoClient(validViemConfig); + await client.validateConfig(); expect(client).toBeInstanceOf(TacoClient); }); - it('should successfully create client with valid ethers configuration', () => { + it('should successfully create client with valid ethers configuration', async () => { const client = new TacoClient(validEthersConfig); + await client.validateConfig(); expect(client).toBeInstanceOf(TacoClient); }); @@ -259,10 +232,12 @@ describe('TacoClient', () => { new TacoClient({ domain: 'tapir', ritualId: 6, - viemClient: mockViemClient, - ethersProvider: mockEthersProvider, + viemClient: fakeViemPublicClient(), + ethersProvider: fakeProvider(), } as unknown as TacoClientConfig), - ).toThrow('viemSignerAccount is required for viem configuration'); + ).toThrow( + 'Invalid configuration: Configuration must include either viem objects (viemClient + viemSignerAccount) or ethers objects (ethersProvider + ethersSigner)', + ); }); }); @@ -357,13 +332,12 @@ describe('TacoClient', () => { description: 'correct ethers configuration', }, ])('should pass full validation for $description', async ({ config }) => { - const result = await TacoConfigValidator.validateFull(config()); - expect(result.isValid).toBe(true); - expect(result.errors).toHaveLength(0); + const result = TacoConfigValidator.validate(config()); + expect(result).resolves.not.toThrow(); }); it('should detect and report missing blockchain dependencies', async () => { - const result = await TacoConfigValidator.validateFull({ + const result = await TacoConfigValidator.validate({ domain: 'tapir', ritualId: 6, // Missing blockchain objects @@ -376,7 +350,7 @@ describe('TacoClient', () => { }); it('should detect and report invalid domain in full validation', async () => { - const result = await TacoConfigValidator.validateFull({ + const result = await TacoConfigValidator.validate({ ...validViemConfig, domain: 'INVALID' as DomainName, }); @@ -393,8 +367,8 @@ describe('TacoClient', () => { new TacoClient({ domain: 'tapir', ritualId: -5, - viemClient: mockViemClient, - viemSignerAccount: mockViemAccount, + viemClient: fakeViemPublicClient(), + viemSignerAccount: fakeViemAccount(), }), ).toThrow('Invalid ritual ID'); }); diff --git a/packages/test-utils/src/utils.ts b/packages/test-utils/src/utils.ts index fb3968156..24e4e4ed1 100644 --- a/packages/test-utils/src/utils.ts +++ b/packages/test-utils/src/utils.ts @@ -76,7 +76,7 @@ const makeFakeProvider = ( getBlockNumber: () => Promise.resolve(blockNumber), getBlock: () => Promise.resolve(block), _isProvider: true, - getNetwork: () => Promise.resolve({ name: 'mockNetwork', chainId: 1234 }), + getNetwork: () => Promise.resolve({ name: 'mockNetwork', chainId: 80_002 }), }; }; @@ -122,7 +122,7 @@ export const fakeViemPublicClient = (): PublicClient => { }; export const fakeViemAccount = ( - secretKeyBytes = SecretKey.random().toBEBytes(), + secretKeyBytes = ethers.utils.randomBytes(32), ): LocalAccount => { // Convert bytes to hex string for viem const privateKey = `0x${Buffer.from(secretKeyBytes).toString('hex')}`; From 08d1cc932d5f614ec3265f8cddef6b8c5de1ce15 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 6 Oct 2025 08:50:12 +0200 Subject: [PATCH 89/97] chore: rename build:module script to build:es and add "types" field to all package.json files to expose TypeScript declarations --- packages/pre/package.json | 5 +++-- packages/shared/package.json | 7 ++++--- packages/taco-auth/package.json | 5 +++-- packages/taco/package.json | 5 +++-- packages/test-utils/package.json | 5 +++-- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/pre/package.json b/packages/pre/package.json index 6aa3ccf7f..c2aef11d6 100644 --- a/packages/pre/package.json +++ b/packages/pre/package.json @@ -14,6 +14,7 @@ "author": "Piotr Roslaniec ", "exports": { ".": { + "types": "./dist/cjs/index.d.ts", "import": "./dist/es/index.js", "require": "./dist/cjs/index.js" } @@ -26,9 +27,9 @@ ], "scripts": { "prebuild": "pnpm clean", - "build": "pnpm build:module && pnpm build:cjs", + "build": "pnpm build:es && pnpm build:cjs", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", - "build:module": "tsc --build ./tsconfig.es.json --verbose", + "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src test", diff --git a/packages/shared/package.json b/packages/shared/package.json index 7722d9c9e..5fea4c36c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -15,6 +15,7 @@ "author": "NuCypher ", "exports": { ".": { + "types": "./dist/cjs/index.d.ts", "import": "./dist/es/index.js", "require": "./dist/cjs/index.js" } @@ -26,10 +27,10 @@ "dist" ], "scripts": { - "prebuild": "pnpm typechain && pnpm clean", - "build": "pnpm build:module && pnpm build:cjs", + "prebuild": "pnpm clean && pnpm typechain", + "build": "pnpm build:es && pnpm build:cjs", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", - "build:module": "tsc --build ./tsconfig.es.json --verbose", + "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src", diff --git a/packages/taco-auth/package.json b/packages/taco-auth/package.json index 2e68475af..5340a5608 100644 --- a/packages/taco-auth/package.json +++ b/packages/taco-auth/package.json @@ -15,6 +15,7 @@ "author": "NuCypher ", "exports": { ".": { + "types": "./dist/cjs/index.d.ts", "import": "./dist/es/index.js", "require": "./dist/cjs/index.js" } @@ -27,9 +28,9 @@ ], "scripts": { "prebuild": "pnpm clean", - "build": "pnpm build:module && pnpm build:cjs", + "build": "pnpm build:es && pnpm build:cjs", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", - "build:module": "tsc --build ./tsconfig.es.json --verbose", + "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src test", diff --git a/packages/taco/package.json b/packages/taco/package.json index 6cce4aca4..f49ae7146 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -14,6 +14,7 @@ "author": "NuCypher ", "exports": { ".": { + "types": "./dist/cjs/index.d.ts", "import": "./dist/es/index.js", "require": "./dist/cjs/index.js" } @@ -26,9 +27,9 @@ ], "scripts": { "prebuild": "pnpm clean", - "build": "pnpm build:module && pnpm build:cjs", + "build": "pnpm build:es && pnpm build:cjs", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", - "build:module": "tsc --build ./tsconfig.es.json --verbose", + "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "generate-zod-docs": "pnpm dlx tsx scripts/schema-docs-generation.ts", diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index e91f482d2..e4ac8c5a5 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -10,6 +10,7 @@ "author": "Piotr Roslaniec ", "exports": { ".": { + "types": "./dist/cjs/index.d.ts", "import": "./dist/es/index.js", "require": "./dist/cjs/index.js" } @@ -21,9 +22,9 @@ "dist" ], "scripts": { - "build": "pnpm build:module && pnpm build:cjs", + "build": "pnpm build:es && pnpm build:cjs", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", - "build:module": "tsc --build ./tsconfig.es.json --verbose", + "build:es": "tsc --build ./tsconfig.es.json --verbose", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src", "lint:fix": "pnpm lint --fix" From 7bd9d361a3eae6a10753ab7736a9e500db6d1591 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 6 Oct 2025 12:12:54 +0200 Subject: [PATCH 90/97] feat: add prebuild script that ensure .js extensions in imports --- package.json | 3 +- packages/shared/package.json | 3 +- packages/taco-auth/package.json | 3 +- packages/taco/package.json | 3 +- pnpm-lock.yaml | 50 ++++++++--- scripts/ensure-es-compatible-imports.ts | 108 ++++++++++++++++++++++++ 6 files changed, 152 insertions(+), 18 deletions(-) create mode 100644 scripts/ensure-es-compatible-imports.ts diff --git a/package.json b/package.json index e5c742053..9e29d6f36 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "lint": "pnpm run --parallel --aggregate-output --reporter append-only lint", "lint:fix": "pnpm --parallel --aggregate-output --reporter append-only lint:fix", "type-check": "pnpm --parallel --aggregate-output --reporter append-only type-check", - "build": "tsc --build --verbose ./tsconfig.prod.json", + "build": "pnpm -r prebuild && tsc --build --verbose ./tsconfig.prod.json", "watch": "tsc --build --verbose --watch ./tsconfig.prod.json", "test": "pnpm build && vitest run", "package:check": "pnpm run --parallel --aggregate-output --reporter append-only --filter './packages/**' package-check", @@ -50,6 +50,7 @@ "sort-package-json": "^2.15.1", "ts-node": "^10.9.2", "ts-unused-exports": "^10.1.0", + "tsx": "^4.20.5", "typedoc": "^0.25.13", "typedoc-plugin-coverage": "^2.2.0", "typedoc-plugin-missing-exports": "^2.3.0", diff --git a/packages/shared/package.json b/packages/shared/package.json index 5fea4c36c..efd41b2d0 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -27,11 +27,12 @@ "dist" ], "scripts": { - "prebuild": "pnpm clean && pnpm typechain", + "prebuild": "pnpm clean && pnpm typechain && pnpm ensure-es-compatible-imports", "build": "pnpm build:es && pnpm build:cjs", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", + "ensure-es-compatible-imports": "pnpm tsx ../../scripts/ensure-es-compatible-imports.ts", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src", "lint:fix": "pnpm lint --fix", diff --git a/packages/taco-auth/package.json b/packages/taco-auth/package.json index 5340a5608..fef8ad743 100644 --- a/packages/taco-auth/package.json +++ b/packages/taco-auth/package.json @@ -27,11 +27,12 @@ "dist" ], "scripts": { - "prebuild": "pnpm clean", + "prebuild": "pnpm clean && pnpm ensure-es-compatible-imports", "build": "pnpm build:es && pnpm build:cjs", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", + "ensure-es-compatible-imports": "pnpm tsx ../../scripts/ensure-es-compatible-imports.ts", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src test", "lint:fix": "pnpm lint --fix", diff --git a/packages/taco/package.json b/packages/taco/package.json index f49ae7146..2ddee8e12 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -26,11 +26,12 @@ "dist" ], "scripts": { - "prebuild": "pnpm clean", + "prebuild": "pnpm clean && pnpm ensure-es-compatible-imports", "build": "pnpm build:es && pnpm build:cjs", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", + "ensure-es-compatible-imports": "pnpm tsx ../../scripts/ensure-es-compatible-imports.ts", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "generate-zod-docs": "pnpm dlx tsx scripts/schema-docs-generation.ts", "integration-test": "export RUNNING_IN_CI=true && vitest run --config integration-test/vitest.config.ts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f77209b4..518cc3e1a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,7 +39,7 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.8.2) '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0)) + version: 3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0)) bundlemon: specifier: ^3.1.0 version: 3.1.0(typescript@5.8.2) @@ -88,6 +88,9 @@ importers: ts-unused-exports: specifier: ^10.1.0 version: 10.1.0(typescript@5.8.2) + tsx: + specifier: ^4.20.5 + version: 4.20.6 typedoc: specifier: ^0.25.13 version: 0.25.13(typescript@5.8.2) @@ -105,7 +108,7 @@ importers: version: 5.8.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0) demos/taco-demo: dependencies: @@ -599,6 +602,8 @@ importers: specifier: ^2.0.0 version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + packages/shared/dist/es: {} + packages/taco: dependencies: '@astronautlabs/jsonpath': @@ -661,6 +666,10 @@ importers: specifier: workspace:* version: link:../test-utils + packages/taco-auth/dist/es: {} + + packages/taco/dist/es: {} + packages/test-utils: dependencies: '@nucypher/nucypher-core': @@ -683,7 +692,7 @@ importers: version: 2.37.8(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + version: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0) packages: @@ -9096,6 +9105,11 @@ packages: 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' + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -13066,7 +13080,7 @@ snapshots: - node-fetch - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -13081,7 +13095,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0) + vitest: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0) transitivePeerDependencies: - supports-color @@ -13092,13 +13106,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0))': + '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0) '@vitest/pretty-format@3.0.9': dependencies: @@ -20345,6 +20359,13 @@ snapshots: tslib: 1.14.1 typescript: 5.8.2 + tsx@4.20.6: + dependencies: + esbuild: 0.25.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + tweetnacl@1.0.3: {} type-check@0.3.2: @@ -20587,13 +20608,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite-node@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -20608,7 +20629,7 @@ snapshots: - tsx - yaml - vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0): + vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -20618,12 +20639,13 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 terser: 5.39.0 + tsx: 4.20.6 yaml: 2.7.0 - vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(yaml@2.7.0): + vitest@3.0.9(@types/node@24.3.0)(jiti@2.4.2)(jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0)) + '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -20639,8 +20661,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) - vite-node: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(yaml@2.7.0) + vite: 6.2.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0) + vite-node: 3.0.9(@types/node@24.3.0)(jiti@2.4.2)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.3.0 diff --git a/scripts/ensure-es-compatible-imports.ts b/scripts/ensure-es-compatible-imports.ts new file mode 100644 index 000000000..df23e4064 --- /dev/null +++ b/scripts/ensure-es-compatible-imports.ts @@ -0,0 +1,108 @@ +#!/usr/bin/env tsx +/** + * This is needed to support ECMA Script modules. + * It fixes TypeScript source imports to use .js extensions for proper ES module support + * Can be called from any package directory with: pnpm tsx ../../scripts/ensure-es-compatible-imports.ts + */ + +import * as fs from 'fs'; +import * as path from 'path'; + +function addJsExtensionToImports(dir: string): void { + const files = fs.readdirSync(dir); + + for (const file of files) { + const fullPath = path.join(dir, file); + const stat = fs.statSync(fullPath); + + if (stat.isDirectory()) { + // Recursively process subdirectories + addJsExtensionToImports(fullPath); + } else if (file.endsWith('.ts')) { + // Fix imports in .ts files + let content = fs.readFileSync(fullPath, 'utf8'); + let modified = false; + + // Fix all relative import/export statements to include .js extension + // Match import/export statements that use `from "..."`, including: + // - import ... from './path' + // - export { ... } from './path' + // - export * as ns from './path' + // - export * from './path' + const importExportRegex = + /((?:import|export)(?:\s+type)?\s*(?:\{\s*[^}]*\}\s*|\*\s*as\s+\w+|\*|\w+)?\s*from\s+['"])([^'"]*?)(['"])/g; + + content = content.replace( + importExportRegex, + (match, prefix, importPath, quote) => { + // The relative modules are: './', '../', '.', or '..' + const isRelative = + importPath.startsWith('./') || + importPath.startsWith('../') || + importPath === '.' || + importPath === '..'; + if (!isRelative) { + // Skip external modules + return match; + } + + // Skip if already has extension + if (importPath.endsWith('.js') || importPath.endsWith('.mjs')) { + return match; + } + + // Check if it's a directory with index.ts + const resolvedPath = path.resolve(path.dirname(fullPath), importPath); + const indexPath = path.join(resolvedPath, 'index.ts'); + + if ( + fs.existsSync(resolvedPath) && + fs.statSync(resolvedPath).isDirectory() + ) { + if (fs.existsSync(indexPath)) { + modified = true; + return `${prefix}${importPath}/index.js${quote}`; + } + } else { + // Check if it's a file without extension + const filePath = `${resolvedPath}.ts`; + if (fs.existsSync(filePath)) { + modified = true; + return `${prefix}${importPath}.js${quote}`; + } + } + + return match; + }, + ); + + if (modified) { + fs.writeFileSync(fullPath, content); + console.log( + `Fixed source imports in: ${path.relative(process.cwd(), fullPath)}`, + ); + } + } + } +} + +// Get the calling package directory (where the script is run from) +const packageDir = process.cwd(); +const packageName = path.basename(packageDir); +const packageJsonPath = path.join(packageDir, 'package.json'); +const srcDir = path.join(packageDir, 'src'); +if (!fs.existsSync(packageJsonPath)) { + console.log( + `❌ No package.json found in the current directory (${packageDir}). Please run this script from a package directory.`, + ); + process.exit(1); +} + +if (fs.existsSync(srcDir)) { + console.log(`🔧 Fixing TypeScript source imports for ${packageName}...`); + addJsExtensionToImports(srcDir); + console.log(`✅ Source import fix complete for ${packageName}!`); +} else { + console.log(`❌ Source directory not found for ${packageName}.`); + process.exit(1); +} From 35641a1e0c96467baad58af146b7e2b2b9f7a8fc Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 6 Oct 2025 12:17:36 +0200 Subject: [PATCH 91/97] feat: add postbuild step to ensure ES module type in dist/es/package.json --- package.json | 2 +- packages/shared/package.json | 2 ++ packages/taco-auth/package.json | 2 ++ packages/taco/package.json | 2 ++ scripts/ensure-es-package-type.ts | 52 +++++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 scripts/ensure-es-package-type.ts diff --git a/package.json b/package.json index 9e29d6f36..7ec9ce79f 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "lint": "pnpm run --parallel --aggregate-output --reporter append-only lint", "lint:fix": "pnpm --parallel --aggregate-output --reporter append-only lint:fix", "type-check": "pnpm --parallel --aggregate-output --reporter append-only type-check", - "build": "pnpm -r prebuild && tsc --build --verbose ./tsconfig.prod.json", + "build": "pnpm -r prebuild && tsc --build --verbose ./tsconfig.prod.json && pnpm -r postbuild", "watch": "tsc --build --verbose --watch ./tsconfig.prod.json", "test": "pnpm build && vitest run", "package:check": "pnpm run --parallel --aggregate-output --reporter append-only --filter './packages/**' package-check", diff --git a/packages/shared/package.json b/packages/shared/package.json index efd41b2d0..fcaf0c736 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -29,10 +29,12 @@ "scripts": { "prebuild": "pnpm clean && pnpm typechain && pnpm ensure-es-compatible-imports", "build": "pnpm build:es && pnpm build:cjs", + "postbuild": "pnpm ensure-es-package-type", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", "ensure-es-compatible-imports": "pnpm tsx ../../scripts/ensure-es-compatible-imports.ts", + "ensure-es-package-type": "pnpm tsx ../../scripts/ensure-es-package-type.ts", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src", "lint:fix": "pnpm lint --fix", diff --git a/packages/taco-auth/package.json b/packages/taco-auth/package.json index fef8ad743..ebd406dc1 100644 --- a/packages/taco-auth/package.json +++ b/packages/taco-auth/package.json @@ -29,10 +29,12 @@ "scripts": { "prebuild": "pnpm clean && pnpm ensure-es-compatible-imports", "build": "pnpm build:es && pnpm build:cjs", + "postbuild": "pnpm ensure-es-package-type", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", "ensure-es-compatible-imports": "pnpm tsx ../../scripts/ensure-es-compatible-imports.ts", + "ensure-es-package-type": "pnpm tsx ../../scripts/ensure-es-package-type.ts", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "lint": "eslint --ext .ts src test", "lint:fix": "pnpm lint --fix", diff --git a/packages/taco/package.json b/packages/taco/package.json index 2ddee8e12..6e35115d0 100644 --- a/packages/taco/package.json +++ b/packages/taco/package.json @@ -28,10 +28,12 @@ "scripts": { "prebuild": "pnpm clean && pnpm ensure-es-compatible-imports", "build": "pnpm build:es && pnpm build:cjs", + "postbuild": "pnpm ensure-es-package-type", "build:cjs": "tsc --build ./tsconfig.cjs.json --verbose", "build:es": "tsc --build ./tsconfig.es.json --verbose", "clean": "rm -rf dist", "ensure-es-compatible-imports": "pnpm tsx ../../scripts/ensure-es-compatible-imports.ts", + "ensure-es-package-type": "pnpm tsx ../../scripts/ensure-es-package-type.ts", "exports:lint": "ts-unused-exports tsconfig.json --ignoreFiles src/index.ts", "generate-zod-docs": "pnpm dlx tsx scripts/schema-docs-generation.ts", "integration-test": "export RUNNING_IN_CI=true && vitest run --config integration-test/vitest.config.ts", diff --git a/scripts/ensure-es-package-type.ts b/scripts/ensure-es-package-type.ts new file mode 100644 index 000000000..861ed23be --- /dev/null +++ b/scripts/ensure-es-package-type.ts @@ -0,0 +1,52 @@ +#!/usr/bin/env tsx +/** + * Set dist/es/package.json type to "module" while preserving + * any existing content. This enables proper ES module resolution for dual + * CommonJS/ES module packages. + * + * Usage from within a package directory: + * pnpm tsx ../../scripts/ensure-es-package-type.ts + */ + +import * as fs from 'fs'; +import * as path from 'path'; + +interface ESPackageJson { + type: 'module'; + [key: string]: unknown; +} + +type Action = 'created' | 'updated' | 'verified' | 'recreated'; + +// Get the calling package directory (where the script is run from) +const packageDir = process.cwd(); +const packageName = path.basename(packageDir); +const esDir = path.join(packageDir, 'dist/es'); +const packageJsonPath = path.join(esDir, 'package.json'); + +if (!fs.existsSync(esDir)) { + console.log(`❌ ES directory not found for ${packageName}`); + process.exit(1); +} + +let esPackageJson: ESPackageJson = { type: 'module' }; +let action: Action = 'created'; + +// Preserve existing content if package.json exists +if (fs.existsSync(packageJsonPath)) { + try { + const existingContent = fs.readFileSync(packageJsonPath, 'utf8'); + esPackageJson = JSON.parse(existingContent); + action = esPackageJson.type === 'module' ? 'verified' : 'updated'; + } catch (error) { + // Invalid JSON - will be recreated + esPackageJson = { type: 'module' }; + action = 'recreated'; + } +} + +// Set ES Module type +esPackageJson.type = 'module'; + +fs.writeFileSync(packageJsonPath, JSON.stringify(esPackageJson, null, 2)); +console.log(`✅ ES module package.json ${action} for ${packageName}`); From c1fde27435e266df0c0f56481c29450429c645ab Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 6 Oct 2025 12:21:33 +0200 Subject: [PATCH 92/97] refactor: update imports to use ethers.utils instead of direct utils import This is because import from 'ethers/lib/utils' causes compatibility issues with projects that uses ES Modules. --- packages/taco/src/taco.ts | 3 +-- packages/taco/src/tdec.ts | 7 ++++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 9a038dfc1..42f7e1ac8 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -19,7 +19,6 @@ import { toTacoSigner, } from '@nucypher/shared'; import { ethers } from 'ethers'; -import { keccak256 } from 'ethers/lib/utils'; import { Condition } from './conditions/condition'; import { ConditionExpression } from './conditions/condition-expr'; @@ -169,7 +168,7 @@ export async function encryptWithPublicKey( conditionExpr.toCoreCondition(), ); - const headerHash = keccak256(ciphertext.header.toBytes()); + const headerHash = ethers.utils.keccak256(ciphertext.header.toBytes()); const authorization = await signer.signMessage(fromHexString(headerHash)); const acp = new AccessControlPolicy( authenticatedData, diff --git a/packages/taco/src/tdec.ts b/packages/taco/src/tdec.ts index 97132437d..9ee353ac7 100644 --- a/packages/taco/src/tdec.ts +++ b/packages/taco/src/tdec.ts @@ -20,7 +20,6 @@ import { toBytes, } from '@nucypher/shared'; import { ethers } from 'ethers'; -import { arrayify, keccak256 } from 'ethers/lib/utils'; import { ConditionExpression } from './conditions/condition-expr'; import { ConditionContext } from './conditions/context'; @@ -47,8 +46,10 @@ export const encryptMessage = async ( conditions.toCoreCondition(), ); - const headerHash = keccak256(ciphertext.header.toBytes()); - const authorization = await authSigner.signMessage(arrayify(headerHash)); + const headerHash = ethers.utils.keccak256(ciphertext.header.toBytes()); + const authorization = await authSigner.signMessage( + ethers.utils.arrayify(headerHash), + ); const acp = new AccessControlPolicy( authenticatedData, toBytes(authorization), From 6fbeae66772ff9dcb5b9dfa973bd7236f16ee86a Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 8 Oct 2025 12:39:51 +0200 Subject: [PATCH 93/97] add js extension to files import --- packages/shared/src/adapters.ts | 10 +++---- .../src/contracts/agents/coordinator.ts | 12 ++++----- .../src/contracts/agents/global-allow-list.ts | 8 +++--- packages/shared/src/contracts/agents/index.ts | 6 ++--- .../contracts/agents/subscription-manager.ts | 8 +++--- .../contracts/ethers-typechain/Coordinator.ts | 2 +- .../ethers-typechain/GlobalAllowList.ts | 2 +- .../ethers-typechain/SubscriptionManager.ts | 2 +- .../factories/Coordinator__factory.ts | 2 +- .../factories/GlobalAllowList__factory.ts | 2 +- .../factories/SubscriptionManager__factory.ts | 2 +- .../ethers-typechain/factories/index.ts | 6 ++--- .../src/contracts/ethers-typechain/index.ts | 14 +++++----- packages/shared/src/contracts/index.ts | 4 +-- packages/shared/src/index.ts | 20 +++++++------- packages/shared/src/porter.ts | 4 +-- packages/shared/src/types.ts | 2 +- packages/shared/src/viem/ethers-adapter.ts | 2 +- packages/shared/src/viem/index.ts | 4 +-- packages/shared/src/viem/signer-adapter.ts | 4 +-- packages/shared/src/viem/type-guards.ts | 4 +-- packages/shared/src/web3.ts | 2 +- packages/taco-auth/src/auth-provider.ts | 2 +- packages/taco-auth/src/auth-sig.ts | 4 +-- packages/taco-auth/src/index.ts | 6 ++--- .../taco-auth/src/providers/eip1271/auth.ts | 2 +- .../src/providers/eip1271/eip1271.ts | 4 +-- .../taco-auth/src/providers/eip4361/auth.ts | 2 +- .../src/providers/eip4361/eip4361.ts | 6 ++--- .../src/providers/eip4361/external-eip4361.ts | 6 ++--- packages/taco-auth/src/providers/index.ts | 10 +++---- packages/taco-auth/src/storage.ts | 2 +- packages/taco/src/client/config-validator.ts | 2 +- packages/taco/src/client/index.ts | 4 +-- packages/taco/src/client/taco-client.ts | 10 +++---- packages/taco/src/conditions/base/contract.ts | 8 +++--- packages/taco/src/conditions/base/index.ts | 12 ++++----- packages/taco/src/conditions/base/json-api.ts | 8 +++--- packages/taco/src/conditions/base/json-rpc.ts | 8 +++--- packages/taco/src/conditions/base/jwt.ts | 8 +++--- packages/taco/src/conditions/base/rpc.ts | 8 +++--- packages/taco/src/conditions/base/time.ts | 8 +++--- .../taco/src/conditions/compound-condition.ts | 8 +++--- .../taco/src/conditions/condition-expr.ts | 6 ++--- .../taco/src/conditions/condition-factory.ts | 20 +++++++------- packages/taco/src/conditions/condition.ts | 6 ++--- .../taco/src/conditions/context/context.ts | 10 +++---- packages/taco/src/conditions/context/index.ts | 2 +- .../src/conditions/if-then-else-condition.ts | 8 +++--- packages/taco/src/conditions/index.ts | 18 ++++++------- .../taco/src/conditions/multi-condition.ts | 8 +++--- .../taco/src/conditions/predefined/erc20.ts | 2 +- .../taco/src/conditions/predefined/erc721.ts | 2 +- .../taco/src/conditions/predefined/index.ts | 4 +-- .../taco/src/conditions/schemas/common.ts | 2 +- .../taco/src/conditions/schemas/compound.ts | 6 ++--- .../taco/src/conditions/schemas/context.ts | 4 +-- .../taco/src/conditions/schemas/contract.ts | 4 +-- .../schemas/export-for-zod-doc-gen.ts | 26 +++++++++---------- .../src/conditions/schemas/if-then-else.ts | 6 ++--- .../taco/src/conditions/schemas/json-api.ts | 6 ++--- .../taco/src/conditions/schemas/json-rpc.ts | 6 ++--- packages/taco/src/conditions/schemas/jwt.ts | 4 +-- .../conditions/schemas/return-value-test.ts | 2 +- packages/taco/src/conditions/schemas/rpc.ts | 6 ++--- .../taco/src/conditions/schemas/sequential.ts | 6 ++--- packages/taco/src/conditions/schemas/time.ts | 2 +- packages/taco/src/conditions/schemas/utils.ts | 18 ++++++------- packages/taco/src/conditions/sequential.ts | 8 +++--- packages/taco/src/conditions/shared.ts | 4 +-- packages/taco/src/index.ts | 6 ++--- packages/taco/src/taco.ts | 10 +++---- packages/taco/src/tdec.ts | 6 ++--- 73 files changed, 234 insertions(+), 234 deletions(-) diff --git a/packages/shared/src/adapters.ts b/packages/shared/src/adapters.ts index fd51f29bd..e6b1a8d54 100644 --- a/packages/shared/src/adapters.ts +++ b/packages/shared/src/adapters.ts @@ -1,10 +1,10 @@ import { ethers } from 'ethers'; -import type { TacoSigner } from './taco-signer'; -import { ProviderLike, SignerLike } from './types'; -import { viemClientToProvider } from './viem/ethers-adapter'; -import { ViemSignerAdapter } from './viem/signer-adapter'; -import { isViemClient, isViemSignerAccount } from './viem/type-guards'; +import type { TacoSigner } from './taco-signer.js'; +import { ProviderLike, SignerLike } from './types.js'; +import { viemClientToProvider } from './viem/ethers-adapter.js'; +import { ViemSignerAdapter } from './viem/signer-adapter.js'; +import { isViemClient, isViemSignerAccount } from './viem/type-guards.js'; /** * Convert ethers Signer or viem SignerAccount (LocalAccount or WalletClient) to TacoSigner. diff --git a/packages/shared/src/contracts/agents/coordinator.ts b/packages/shared/src/contracts/agents/coordinator.ts index ab50500c3..2f2391b0d 100644 --- a/packages/shared/src/contracts/agents/coordinator.ts +++ b/packages/shared/src/contracts/agents/coordinator.ts @@ -6,12 +6,12 @@ import { } from '@nucypher/nucypher-core'; import { BigNumberish, ethers } from 'ethers'; -import { Domain } from '../../porter'; -import { ChecksumAddress } from '../../types'; -import { fromHexString } from '../../utils'; -import { DEFAULT_WAIT_N_CONFIRMATIONS } from '../const'; -import { Coordinator__factory } from '../ethers-typechain'; -import { BLS12381, Coordinator } from '../ethers-typechain/Coordinator'; +import { Domain } from '../../porter.js'; +import { ChecksumAddress } from '../../types.js'; +import { fromHexString } from '../../utils.js'; +import { DEFAULT_WAIT_N_CONFIRMATIONS } from '../const.js'; +import { BLS12381, Coordinator } from '../ethers-typechain/Coordinator.js'; +import { Coordinator__factory } from '../ethers-typechain/index.js'; export interface CoordinatorRitual { initiator: string; diff --git a/packages/shared/src/contracts/agents/global-allow-list.ts b/packages/shared/src/contracts/agents/global-allow-list.ts index fc09d5946..2cc3407c2 100644 --- a/packages/shared/src/contracts/agents/global-allow-list.ts +++ b/packages/shared/src/contracts/agents/global-allow-list.ts @@ -1,10 +1,10 @@ import { getContract } from '@nucypher/nucypher-contracts'; import { ethers } from 'ethers'; -import { Domain } from '../../porter'; -import { ChecksumAddress } from '../../types'; -import { DEFAULT_WAIT_N_CONFIRMATIONS } from '../const'; -import { GlobalAllowList, GlobalAllowList__factory } from '../ethers-typechain'; +import { Domain } from '../../porter.js'; +import { ChecksumAddress } from '../../types.js'; +import { DEFAULT_WAIT_N_CONFIRMATIONS } from '../const.js'; +import { GlobalAllowList, GlobalAllowList__factory } from '../ethers-typechain/index.js'; export class GlobalAllowListAgent { public static async registerEncrypters( diff --git a/packages/shared/src/contracts/agents/index.ts b/packages/shared/src/contracts/agents/index.ts index 61e29c0e6..2dea7b365 100644 --- a/packages/shared/src/contracts/agents/index.ts +++ b/packages/shared/src/contracts/agents/index.ts @@ -1,3 +1,3 @@ -export * from './coordinator'; -export * from './global-allow-list'; -export * from './subscription-manager'; +export * from './coordinator.js'; +export * from './global-allow-list.js'; +export * from './subscription-manager.js'; diff --git a/packages/shared/src/contracts/agents/subscription-manager.ts b/packages/shared/src/contracts/agents/subscription-manager.ts index 20f787300..2820f1c4a 100644 --- a/packages/shared/src/contracts/agents/subscription-manager.ts +++ b/packages/shared/src/contracts/agents/subscription-manager.ts @@ -6,13 +6,13 @@ import { utils as ethersUtils, } from 'ethers'; -import { Domain } from '../../porter'; -import { ChecksumAddress } from '../../types'; -import { DEFAULT_WAIT_N_CONFIRMATIONS } from '../const'; +import { Domain } from '../../porter.js'; +import { ChecksumAddress } from '../../types.js'; +import { DEFAULT_WAIT_N_CONFIRMATIONS } from '../const.js'; import { SubscriptionManager, SubscriptionManager__factory, -} from '../ethers-typechain'; +} from '../ethers-typechain/index.js'; export class PreSubscriptionManagerAgent { public static async createPolicy( diff --git a/packages/shared/src/contracts/ethers-typechain/Coordinator.ts b/packages/shared/src/contracts/ethers-typechain/Coordinator.ts index 21619add1..5f4d4dc82 100644 --- a/packages/shared/src/contracts/ethers-typechain/Coordinator.ts +++ b/packages/shared/src/contracts/ethers-typechain/Coordinator.ts @@ -24,7 +24,7 @@ import type { TypedEvent, TypedEventFilter, TypedListener, -} from './common'; +} from './common.js'; export declare namespace BLS12381 { export type G2PointStruct = { diff --git a/packages/shared/src/contracts/ethers-typechain/GlobalAllowList.ts b/packages/shared/src/contracts/ethers-typechain/GlobalAllowList.ts index 3d03a022c..11685e19c 100644 --- a/packages/shared/src/contracts/ethers-typechain/GlobalAllowList.ts +++ b/packages/shared/src/contracts/ethers-typechain/GlobalAllowList.ts @@ -24,7 +24,7 @@ import type { TypedEvent, TypedEventFilter, TypedListener, -} from './common'; +} from './common.js'; export interface GlobalAllowListInterface extends utils.Interface { functions: { diff --git a/packages/shared/src/contracts/ethers-typechain/SubscriptionManager.ts b/packages/shared/src/contracts/ethers-typechain/SubscriptionManager.ts index b91b79a13..51fb58f02 100644 --- a/packages/shared/src/contracts/ethers-typechain/SubscriptionManager.ts +++ b/packages/shared/src/contracts/ethers-typechain/SubscriptionManager.ts @@ -25,7 +25,7 @@ import type { TypedEvent, TypedEventFilter, TypedListener, -} from './common'; +} from './common.js'; export declare namespace SubscriptionManager { export type PolicyStruct = { diff --git a/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts b/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts index e3800e887..1fd17973a 100644 --- a/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts +++ b/packages/shared/src/contracts/ethers-typechain/factories/Coordinator__factory.ts @@ -4,7 +4,7 @@ import type { Provider } from '@ethersproject/providers'; import { Contract, Signer, utils } from 'ethers'; -import type { Coordinator, CoordinatorInterface } from '../Coordinator'; +import type { Coordinator, CoordinatorInterface } from '../Coordinator.js'; const _abi = [ { diff --git a/packages/shared/src/contracts/ethers-typechain/factories/GlobalAllowList__factory.ts b/packages/shared/src/contracts/ethers-typechain/factories/GlobalAllowList__factory.ts index 59e19af4f..520fcf2e4 100644 --- a/packages/shared/src/contracts/ethers-typechain/factories/GlobalAllowList__factory.ts +++ b/packages/shared/src/contracts/ethers-typechain/factories/GlobalAllowList__factory.ts @@ -7,7 +7,7 @@ import { Contract, Signer, utils } from 'ethers'; import type { GlobalAllowList, GlobalAllowListInterface, -} from '../GlobalAllowList'; +} from '../GlobalAllowList.js'; const _abi = [ { diff --git a/packages/shared/src/contracts/ethers-typechain/factories/SubscriptionManager__factory.ts b/packages/shared/src/contracts/ethers-typechain/factories/SubscriptionManager__factory.ts index 74413c5fc..c161ac932 100644 --- a/packages/shared/src/contracts/ethers-typechain/factories/SubscriptionManager__factory.ts +++ b/packages/shared/src/contracts/ethers-typechain/factories/SubscriptionManager__factory.ts @@ -7,7 +7,7 @@ import { Contract, Signer, utils } from 'ethers'; import type { SubscriptionManager, SubscriptionManagerInterface, -} from '../SubscriptionManager'; +} from '../SubscriptionManager.js'; const _abi = [ { diff --git a/packages/shared/src/contracts/ethers-typechain/factories/index.ts b/packages/shared/src/contracts/ethers-typechain/factories/index.ts index 8187c7c16..a6d99ea71 100644 --- a/packages/shared/src/contracts/ethers-typechain/factories/index.ts +++ b/packages/shared/src/contracts/ethers-typechain/factories/index.ts @@ -1,6 +1,6 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -export { Coordinator__factory } from './Coordinator__factory'; -export { GlobalAllowList__factory } from './GlobalAllowList__factory'; -export { SubscriptionManager__factory } from './SubscriptionManager__factory'; +export { Coordinator__factory } from './Coordinator__factory.js'; +export { GlobalAllowList__factory } from './GlobalAllowList__factory.js'; +export { SubscriptionManager__factory } from './SubscriptionManager__factory.js'; diff --git a/packages/shared/src/contracts/ethers-typechain/index.ts b/packages/shared/src/contracts/ethers-typechain/index.ts index e0b86d8c9..4d32ba0f6 100644 --- a/packages/shared/src/contracts/ethers-typechain/index.ts +++ b/packages/shared/src/contracts/ethers-typechain/index.ts @@ -1,10 +1,10 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -export type { Coordinator } from './Coordinator'; -export * as factories from './factories'; -export { Coordinator__factory } from './factories/Coordinator__factory'; -export { GlobalAllowList__factory } from './factories/GlobalAllowList__factory'; -export { SubscriptionManager__factory } from './factories/SubscriptionManager__factory'; -export type { GlobalAllowList } from './GlobalAllowList'; -export type { SubscriptionManager } from './SubscriptionManager'; +export type { Coordinator } from './Coordinator.js'; +export * as factories from './factories/index.js'; +export { Coordinator__factory } from './factories/Coordinator__factory.js'; +export { GlobalAllowList__factory } from './factories/GlobalAllowList__factory.js'; +export { SubscriptionManager__factory } from './factories/SubscriptionManager__factory.js'; +export type { GlobalAllowList } from './GlobalAllowList.js'; +export type { SubscriptionManager } from './SubscriptionManager.js'; diff --git a/packages/shared/src/contracts/index.ts b/packages/shared/src/contracts/index.ts index 6fb2308f0..9f2a45d20 100644 --- a/packages/shared/src/contracts/index.ts +++ b/packages/shared/src/contracts/index.ts @@ -1,2 +1,2 @@ -export * from './agents'; -export * from './ethers-typechain'; +export * from './agents/index.js'; +export * from './ethers-typechain/index.js'; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 1b4dc17ef..8f0b026c4 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,13 +1,13 @@ -export * from './adapters'; -export * from './contracts'; -export * from './domain'; -export * from './porter'; -export * from './schemas'; -export * from './taco-signer'; -export type * from './types'; -export * from './utils'; -export * from './viem'; -export * from './web3'; +export * from './adapters.js'; +export * from './contracts/index.js'; +export * from './domain.js'; +export * from './porter.js'; +export * from './schemas.js'; +export * from './taco-signer.js'; +export type * from './types.js'; +export * from './utils.js'; +export * from './viem/index.js'; +export * from './web3.js'; // Re-exports export { diff --git a/packages/shared/src/porter.ts b/packages/shared/src/porter.ts index 0a13050d3..1cfce4aad 100644 --- a/packages/shared/src/porter.ts +++ b/packages/shared/src/porter.ts @@ -13,8 +13,8 @@ import axios, { } from 'axios'; import qs from 'qs'; -import { Base64EncodedBytes, ChecksumAddress, HexEncodedBytes } from './types'; -import { fromBase64, fromHexString, toBase64, toHexString } from './utils'; +import { Base64EncodedBytes, ChecksumAddress, HexEncodedBytes } from './types.js'; +import { fromBase64, fromHexString, toBase64, toHexString } from './utils.js'; const defaultPorterUri: Record = { mainnet: 'https://porter.nucypher.io', diff --git a/packages/shared/src/types.ts b/packages/shared/src/types.ts index d933220f4..8100d70b2 100644 --- a/packages/shared/src/types.ts +++ b/packages/shared/src/types.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; -import { PublicClient, SignerAccount } from './viem/types'; +import { PublicClient, SignerAccount } from './viem/types.js'; export type ChecksumAddress = `0x${string}`; export type HexEncodedBytes = string; diff --git a/packages/shared/src/viem/ethers-adapter.ts b/packages/shared/src/viem/ethers-adapter.ts index b0cfe4f0b..f90a1e0f9 100644 --- a/packages/shared/src/viem/ethers-adapter.ts +++ b/packages/shared/src/viem/ethers-adapter.ts @@ -1,7 +1,7 @@ import { Networkish } from '@ethersproject/providers'; import { ethers } from 'ethers'; -import type { Chain, PublicClient } from './types'; +import type { Chain, PublicClient } from './types.js'; /** * Create ethers network object from viem chain diff --git a/packages/shared/src/viem/index.ts b/packages/shared/src/viem/index.ts index 67fc88ad2..45c45f3ed 100644 --- a/packages/shared/src/viem/index.ts +++ b/packages/shared/src/viem/index.ts @@ -1,2 +1,2 @@ -export * from './type-guards'; -export type * from './types'; +export * from './type-guards.js'; +export type * from './types.js'; diff --git a/packages/shared/src/viem/signer-adapter.ts b/packages/shared/src/viem/signer-adapter.ts index db84a933f..00aac3444 100644 --- a/packages/shared/src/viem/signer-adapter.ts +++ b/packages/shared/src/viem/signer-adapter.ts @@ -1,8 +1,8 @@ import { ethers } from 'ethers'; -import { type TacoSigner } from '../taco-signer'; +import { type TacoSigner } from '../taco-signer.js'; -import { type Address, type SignerAccount } from './types'; +import { type Address, type SignerAccount } from './types.js'; /** * Viem Signer Adapter diff --git a/packages/shared/src/viem/type-guards.ts b/packages/shared/src/viem/type-guards.ts index 76759cff3..796258e8f 100644 --- a/packages/shared/src/viem/type-guards.ts +++ b/packages/shared/src/viem/type-guards.ts @@ -1,8 +1,8 @@ import { ethers } from 'ethers'; -import { ProviderLike, SignerLike } from '../types'; +import { ProviderLike, SignerLike } from '../types.js'; -import { PublicClient, SignerAccount } from './types'; +import { PublicClient, SignerAccount } from './types.js'; /** * Type guard to determine if the provider-like is a viem PublicClient diff --git a/packages/shared/src/web3.ts b/packages/shared/src/web3.ts index 97655c765..0179262bf 100644 --- a/packages/shared/src/web3.ts +++ b/packages/shared/src/web3.ts @@ -1,4 +1,4 @@ -import { fromHexString } from './utils'; +import { fromHexString } from './utils.js'; export enum ChainId { POLYGON = 137, diff --git a/packages/taco-auth/src/auth-provider.ts b/packages/taco-auth/src/auth-provider.ts index cc91f1765..a2f8bfabf 100644 --- a/packages/taco-auth/src/auth-provider.ts +++ b/packages/taco-auth/src/auth-provider.ts @@ -1,4 +1,4 @@ -import { AuthSignature } from './auth-sig'; +import { AuthSignature } from './auth-sig.js'; export interface AuthProvider { getOrCreateAuthSignature(): Promise; diff --git a/packages/taco-auth/src/auth-sig.ts b/packages/taco-auth/src/auth-sig.ts index 92720c750..8fe74e907 100644 --- a/packages/taco-auth/src/auth-sig.ts +++ b/packages/taco-auth/src/auth-sig.ts @@ -1,8 +1,8 @@ import { EthAddressSchema } from '@nucypher/shared'; import { z } from 'zod'; -import { EIP1271AuthSignature } from './providers/eip1271/auth'; -import { EIP4361AuthSignature } from './providers/eip4361/auth'; +import { EIP1271AuthSignature } from './providers/eip1271/auth.js'; +import { EIP4361AuthSignature } from './providers/eip4361/auth.js'; export const baseAuthSignatureSchema = z.object({ signature: z.string(), diff --git a/packages/taco-auth/src/index.ts b/packages/taco-auth/src/index.ts index 2791ece39..056db656e 100644 --- a/packages/taco-auth/src/index.ts +++ b/packages/taco-auth/src/index.ts @@ -1,3 +1,3 @@ -export * from './auth-provider'; -export * from './auth-sig'; -export * from './providers'; +export * from './auth-provider.js'; +export * from './auth-sig.js'; +export * from './providers/index.js'; diff --git a/packages/taco-auth/src/providers/eip1271/auth.ts b/packages/taco-auth/src/providers/eip1271/auth.ts index 4d8c7593c..1ebf0ad91 100644 --- a/packages/taco-auth/src/providers/eip1271/auth.ts +++ b/packages/taco-auth/src/providers/eip1271/auth.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { baseAuthSignatureSchema } from '../../auth-sig'; +import { baseAuthSignatureSchema } from '../../auth-sig.js'; export const EIP1271_AUTH_METHOD = 'EIP1271'; diff --git a/packages/taco-auth/src/providers/eip1271/eip1271.ts b/packages/taco-auth/src/providers/eip1271/eip1271.ts index 43d0c1561..5a9c3433d 100644 --- a/packages/taco-auth/src/providers/eip1271/eip1271.ts +++ b/packages/taco-auth/src/providers/eip1271/eip1271.ts @@ -1,6 +1,6 @@ -import { AuthProvider } from '../../auth-provider'; +import { AuthProvider } from '../../auth-provider.js'; -import { EIP1271_AUTH_METHOD, EIP1271AuthSignature } from './auth'; +import { EIP1271_AUTH_METHOD, EIP1271AuthSignature } from './auth.js'; /** * EIP1271AuthProvider handles EIP-1271 contract-based authentication. diff --git a/packages/taco-auth/src/providers/eip4361/auth.ts b/packages/taco-auth/src/providers/eip4361/auth.ts index 2c67d04cc..4541ec98d 100644 --- a/packages/taco-auth/src/providers/eip4361/auth.ts +++ b/packages/taco-auth/src/providers/eip4361/auth.ts @@ -1,7 +1,7 @@ import { SiweMessage } from 'siwe'; import { z } from 'zod'; -import { baseAuthSignatureSchema } from '../../auth-sig'; +import { baseAuthSignatureSchema } from '../../auth-sig.js'; export const EIP4361_AUTH_METHOD = 'EIP4361'; diff --git a/packages/taco-auth/src/providers/eip4361/eip4361.ts b/packages/taco-auth/src/providers/eip4361/eip4361.ts index 2127d4469..571e7aebb 100644 --- a/packages/taco-auth/src/providers/eip4361/eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/eip4361.ts @@ -10,14 +10,14 @@ import { import { ethers } from 'ethers'; import { SiweMessage } from 'siwe'; -import { AuthProvider } from '../../auth-provider'; -import { LocalStorage } from '../../storage'; +import { AuthProvider } from '../../auth-provider.js'; +import { LocalStorage } from '../../storage.js'; import { EIP4361_AUTH_METHOD, EIP4361AuthSignature, eip4361AuthSignatureSchema, -} from './auth'; +} from './auth.js'; export type EIP4361AuthProviderParams = { domain: string; diff --git a/packages/taco-auth/src/providers/eip4361/external-eip4361.ts b/packages/taco-auth/src/providers/eip4361/external-eip4361.ts index 8f1eab7f9..2abf0cdfd 100644 --- a/packages/taco-auth/src/providers/eip4361/external-eip4361.ts +++ b/packages/taco-auth/src/providers/eip4361/external-eip4361.ts @@ -1,9 +1,9 @@ import { SiweMessage } from 'siwe'; -import { AuthProvider } from '../../auth-provider'; +import { AuthProvider } from '../../auth-provider.js'; -import { EIP4361_AUTH_METHOD, EIP4361AuthSignature } from './auth'; -import { FRESHNESS_IN_MILLISECONDS } from './eip4361'; +import { EIP4361_AUTH_METHOD, EIP4361AuthSignature } from './auth.js'; +import { FRESHNESS_IN_MILLISECONDS } from './eip4361.js'; async function generateAndVerifySiweMessage( message: string, diff --git a/packages/taco-auth/src/providers/index.ts b/packages/taco-auth/src/providers/index.ts index 76b739f00..6607e2b31 100644 --- a/packages/taco-auth/src/providers/index.ts +++ b/packages/taco-auth/src/providers/index.ts @@ -1,9 +1,9 @@ // TODO: should we export with package names? -export { EIP1271AuthSignature } from './eip1271/auth'; -export * from './eip1271/eip1271'; +export { EIP1271AuthSignature } from './eip1271/auth.js'; +export * from './eip1271/eip1271.js'; export { EIP4361AuthSignature, USER_ADDRESS_PARAM_DEFAULT, -} from './eip4361/auth'; -export * from './eip4361/eip4361'; -export * from './eip4361/external-eip4361'; +} from './eip4361/auth.js'; +export * from './eip4361/eip4361.js'; +export * from './eip4361/external-eip4361.js'; diff --git a/packages/taco-auth/src/storage.ts b/packages/taco-auth/src/storage.ts index fc3ef4165..24e48af1f 100644 --- a/packages/taco-auth/src/storage.ts +++ b/packages/taco-auth/src/storage.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { AuthSignature } from './index'; +import { AuthSignature } from './index.js'; interface IStorage { getItem(key: string): string | null; diff --git a/packages/taco/src/client/config-validator.ts b/packages/taco/src/client/config-validator.ts index f3ff43fe9..e5c226014 100644 --- a/packages/taco/src/client/config-validator.ts +++ b/packages/taco/src/client/config-validator.ts @@ -14,7 +14,7 @@ import { import { ethers } from 'ethers'; import type { PublicClient } from 'viem'; -import { isEthersConfig, isViemConfig, type TacoClientConfig } from '.'; +import { isEthersConfig, isViemConfig, type TacoClientConfig } from './index.js'; /** * Generic validation result interface diff --git a/packages/taco/src/client/index.ts b/packages/taco/src/client/index.ts index 981f50a85..09edf70f1 100644 --- a/packages/taco/src/client/index.ts +++ b/packages/taco/src/client/index.ts @@ -1,2 +1,2 @@ -export * from './client-config'; -export * from './taco-client'; +export * from './client-config.js'; +export * from './taco-client.js'; diff --git a/packages/taco/src/client/taco-client.ts b/packages/taco/src/client/taco-client.ts index adf764693..67c4d4581 100644 --- a/packages/taco/src/client/taco-client.ts +++ b/packages/taco/src/client/taco-client.ts @@ -12,16 +12,16 @@ import { ThresholdMessageKit, } from '@nucypher/nucypher-core'; -import { Condition } from '../conditions/condition'; -import { ConditionContext } from '../conditions/context/index'; -import { decrypt, encrypt, encryptWithPublicKey } from '../taco'; +import { Condition } from '../conditions/condition.js'; +import { ConditionContext } from '../conditions/context/index.js'; +import { decrypt, encrypt, encryptWithPublicKey } from '../taco.js'; import { type TacoClientConfig, type TacoClientEthersConfig, type TacoClientViemConfig, -} from './client-config'; -import { TacoConfigValidator } from './config-validator'; +} from './client-config.js'; +import { TacoConfigValidator } from './config-validator.js'; /** * TacoClient provides an object-oriented interface for TACo operations diff --git a/packages/taco/src/conditions/base/contract.ts b/packages/taco/src/conditions/base/contract.ts index 54df510dd..bfc236234 100644 --- a/packages/taco/src/conditions/base/contract.ts +++ b/packages/taco/src/conditions/base/contract.ts @@ -1,17 +1,17 @@ -import { Condition } from '../condition'; +import { Condition } from '../condition.js'; import { ContractConditionProps, contractConditionSchema, ContractConditionType, -} from '../schemas/contract'; -import { OmitConditionType } from '../shared'; +} from '../schemas/contract.js'; +import { OmitConditionType } from '../shared.js'; export { ContractConditionProps, contractConditionSchema, ContractConditionType, FunctionAbiProps, -} from '../schemas/contract'; +} from '../schemas/contract.js'; export class ContractCondition extends Condition { constructor(value: OmitConditionType) { diff --git a/packages/taco/src/conditions/base/index.ts b/packages/taco/src/conditions/base/index.ts index 6de843d86..65fd0836b 100644 --- a/packages/taco/src/conditions/base/index.ts +++ b/packages/taco/src/conditions/base/index.ts @@ -1,9 +1,9 @@ // Exporting classes here instead of their respective schema files to // avoid circular dependency on Condition class. -export * as contract from './contract'; -export * as jsonApi from './json-api'; -export * as jsonRpc from './json-rpc'; -export * as jwt from './jwt'; -export * as rpc from './rpc'; -export * as time from './time'; +export * as contract from './contract.js'; +export * as jsonApi from './json-api.js'; +export * as jsonRpc from './json-rpc.js'; +export * as jwt from './jwt.js'; +export * as rpc from './rpc.js'; +export * as time from './time.js'; diff --git a/packages/taco/src/conditions/base/json-api.ts b/packages/taco/src/conditions/base/json-api.ts index c972b5868..c44088b04 100644 --- a/packages/taco/src/conditions/base/json-api.ts +++ b/packages/taco/src/conditions/base/json-api.ts @@ -1,16 +1,16 @@ -import { Condition } from '../condition'; +import { Condition } from '../condition.js'; import { JsonApiConditionProps, jsonApiConditionSchema, JsonApiConditionType, -} from '../schemas/json-api'; -import { OmitConditionType } from '../shared'; +} from '../schemas/json-api.js'; +import { OmitConditionType } from '../shared.js'; export { JsonApiConditionProps, jsonApiConditionSchema, JsonApiConditionType, -} from '../schemas/json-api'; +} from '../schemas/json-api.js'; export class JsonApiCondition extends Condition { constructor(value: OmitConditionType) { diff --git a/packages/taco/src/conditions/base/json-rpc.ts b/packages/taco/src/conditions/base/json-rpc.ts index 756e651c0..cbe681aa1 100644 --- a/packages/taco/src/conditions/base/json-rpc.ts +++ b/packages/taco/src/conditions/base/json-rpc.ts @@ -1,16 +1,16 @@ -import { Condition } from '../condition'; +import { Condition } from '../condition.js'; import { JsonRpcConditionProps, jsonRpcConditionSchema, JsonRpcConditionType, -} from '../schemas/json-rpc'; -import { OmitConditionType } from '../shared'; +} from '../schemas/json-rpc.js'; +import { OmitConditionType } from '../shared.js'; export { JsonRpcConditionProps, jsonRpcConditionSchema, JsonRpcConditionType, -} from '../schemas/json-rpc'; +} from '../schemas/json-rpc.js'; export class JsonRpcCondition extends Condition { constructor(value: OmitConditionType) { diff --git a/packages/taco/src/conditions/base/jwt.ts b/packages/taco/src/conditions/base/jwt.ts index 92469a4cb..4eaa428e0 100644 --- a/packages/taco/src/conditions/base/jwt.ts +++ b/packages/taco/src/conditions/base/jwt.ts @@ -1,17 +1,17 @@ -import { Condition } from '../condition'; +import { Condition } from '../condition.js'; import { JWTConditionProps, jwtConditionSchema, JWTConditionType, -} from '../schemas/jwt'; -import { OmitConditionType } from '../shared'; +} from '../schemas/jwt.js'; +import { OmitConditionType } from '../shared.js'; export { JWT_PARAM_DEFAULT, JWTConditionProps, jwtConditionSchema, JWTConditionType, -} from '../schemas/jwt'; +} from '../schemas/jwt.js'; export class JWTCondition extends Condition { constructor(value: OmitConditionType) { diff --git a/packages/taco/src/conditions/base/rpc.ts b/packages/taco/src/conditions/base/rpc.ts index 8f73c79c1..8376e4a21 100644 --- a/packages/taco/src/conditions/base/rpc.ts +++ b/packages/taco/src/conditions/base/rpc.ts @@ -1,16 +1,16 @@ -import { Condition } from '../condition'; +import { Condition } from '../condition.js'; import { RpcConditionProps, rpcConditionSchema, RpcConditionType, -} from '../schemas/rpc'; -import { OmitConditionType } from '../shared'; +} from '../schemas/rpc.js'; +import { OmitConditionType } from '../shared.js'; export { RpcConditionProps, rpcConditionSchema, RpcConditionType, -} from '../schemas/rpc'; +} from '../schemas/rpc.js'; export class RpcCondition extends Condition { constructor(value: OmitConditionType) { diff --git a/packages/taco/src/conditions/base/time.ts b/packages/taco/src/conditions/base/time.ts index 2d8be8b63..96f49a105 100644 --- a/packages/taco/src/conditions/base/time.ts +++ b/packages/taco/src/conditions/base/time.ts @@ -1,17 +1,17 @@ -import { Condition } from '../condition'; +import { Condition } from '../condition.js'; import { TimeConditionProps, timeConditionSchema, TimeConditionType, -} from '../schemas/time'; -import { OmitConditionType } from '../shared'; +} from '../schemas/time.js'; +import { OmitConditionType } from '../shared.js'; export { TimeConditionMethod, TimeConditionProps, timeConditionSchema, TimeConditionType, -} from '../schemas/time'; +} from '../schemas/time.js'; export class TimeCondition extends Condition { constructor(value: OmitConditionType) { diff --git a/packages/taco/src/conditions/compound-condition.ts b/packages/taco/src/conditions/compound-condition.ts index d7de784e0..87a2af387 100644 --- a/packages/taco/src/conditions/compound-condition.ts +++ b/packages/taco/src/conditions/compound-condition.ts @@ -1,16 +1,16 @@ -import { Condition, ConditionProps } from './condition'; +import { Condition, ConditionProps } from './condition.js'; import { CompoundConditionProps, compoundConditionSchema, CompoundConditionType, -} from './schemas/compound'; -import { OmitConditionType } from './shared'; +} from './schemas/compound.js'; +import { OmitConditionType } from './shared.js'; export { CompoundConditionProps, compoundConditionSchema, CompoundConditionType, -} from './schemas/compound'; +} from './schemas/compound.js'; export type ConditionOrProps = Condition | ConditionProps; diff --git a/packages/taco/src/conditions/condition-expr.ts b/packages/taco/src/conditions/condition-expr.ts index db1c0bed2..104a0b6c0 100644 --- a/packages/taco/src/conditions/condition-expr.ts +++ b/packages/taco/src/conditions/condition-expr.ts @@ -1,10 +1,10 @@ import { Conditions as CoreConditions } from '@nucypher/nucypher-core'; import { SemVer } from 'semver'; -import { fromJSON, toJSON } from '../utils'; +import { fromJSON, toJSON } from '../utils.js'; -import { Condition } from './condition'; -import { ConditionFactory } from './condition-factory'; +import { ConditionFactory } from './condition-factory.js'; +import { Condition } from './condition.js'; const ERR_VERSION = (provided: string, current: string) => `Version provided, ${provided}, is incompatible with current version, ${current}`; diff --git a/packages/taco/src/conditions/condition-factory.ts b/packages/taco/src/conditions/condition-factory.ts index ab84ae909..895ccae15 100644 --- a/packages/taco/src/conditions/condition-factory.ts +++ b/packages/taco/src/conditions/condition-factory.ts @@ -2,40 +2,40 @@ import { ContractCondition, ContractConditionProps, ContractConditionType, -} from './base/contract'; +} from './base/contract.js'; import { JsonApiCondition, JsonApiConditionProps, JsonApiConditionType, -} from './base/json-api'; +} from './base/json-api.js'; import { JsonRpcCondition, JsonRpcConditionProps, JsonRpcConditionType, -} from './base/json-rpc'; -import { JWTCondition, JWTConditionProps, JWTConditionType } from './base/jwt'; -import { RpcCondition, RpcConditionProps, RpcConditionType } from './base/rpc'; +} from './base/json-rpc.js'; +import { JWTCondition, JWTConditionProps, JWTConditionType } from './base/jwt.js'; +import { RpcCondition, RpcConditionProps, RpcConditionType } from './base/rpc.js'; import { TimeCondition, TimeConditionProps, TimeConditionType, -} from './base/time'; +} from './base/time.js'; import { CompoundCondition, CompoundConditionProps, CompoundConditionType, -} from './compound-condition'; -import { Condition, ConditionProps } from './condition'; +} from './compound-condition.js'; +import { Condition, ConditionProps } from './condition.js'; import { IfThenElseCondition, IfThenElseConditionProps, IfThenElseConditionType, -} from './if-then-else-condition'; +} from './if-then-else-condition.js'; import { SequentialCondition, SequentialConditionProps, SequentialConditionType, -} from './sequential'; +} from './sequential.js'; const ERR_INVALID_CONDITION_TYPE = (type: string) => `Invalid condition type: ${type}`; diff --git a/packages/taco/src/conditions/condition.ts b/packages/taco/src/conditions/condition.ts index 1db41e3b6..30f8648df 100644 --- a/packages/taco/src/conditions/condition.ts +++ b/packages/taco/src/conditions/condition.ts @@ -1,11 +1,11 @@ import { objectEquals } from '@nucypher/shared'; import { z } from 'zod'; -import { toJSON } from '../utils'; +import { toJSON } from '../utils.js'; -import { USER_ADDRESS_PARAMS } from './const'; +import { USER_ADDRESS_PARAMS } from './const.js'; -export { baseConditionSchema } from './schemas/common'; +export { baseConditionSchema } from './schemas/common.js'; type ConditionSchema = z.ZodSchema; export type ConditionProps = z.infer; diff --git a/packages/taco/src/conditions/context/context.ts b/packages/taco/src/conditions/context/context.ts index c22993ac8..c66a28014 100644 --- a/packages/taco/src/conditions/context/context.ts +++ b/packages/taco/src/conditions/context/context.ts @@ -8,16 +8,16 @@ import { USER_ADDRESS_PARAM_DEFAULT, } from '@nucypher/taco-auth'; -import { CoreConditions, CoreContext } from '../../types'; -import { toJSON } from '../../utils'; -import { Condition, ConditionProps } from '../condition'; -import { ConditionExpression } from '../condition-expr'; +import { CoreConditions, CoreContext } from '../../types.js'; +import { toJSON } from '../../utils.js'; +import { ConditionExpression } from '../condition-expr.js'; +import { Condition, ConditionProps } from '../condition.js'; import { CONTEXT_PARAM_FULL_MATCH_REGEXP, CONTEXT_PARAM_PREFIX, CONTEXT_PARAM_REGEXP, USER_ADDRESS_PARAMS, -} from '../const'; +} from '../const.js'; export type CustomContextParam = | string diff --git a/packages/taco/src/conditions/context/index.ts b/packages/taco/src/conditions/context/index.ts index e18afda2a..5a1db3dfb 100644 --- a/packages/taco/src/conditions/context/index.ts +++ b/packages/taco/src/conditions/context/index.ts @@ -1 +1 @@ -export { ConditionContext, type CustomContextParam } from './context'; +export { ConditionContext, type CustomContextParam } from './context.js'; diff --git a/packages/taco/src/conditions/if-then-else-condition.ts b/packages/taco/src/conditions/if-then-else-condition.ts index 79d99b49c..03635363e 100644 --- a/packages/taco/src/conditions/if-then-else-condition.ts +++ b/packages/taco/src/conditions/if-then-else-condition.ts @@ -1,16 +1,16 @@ -import { Condition } from './condition'; +import { Condition } from './condition.js'; import { IfThenElseConditionProps, ifThenElseConditionSchema, IfThenElseConditionType, -} from './schemas/if-then-else'; -import { OmitConditionType } from './shared'; +} from './schemas/if-then-else.js'; +import { OmitConditionType } from './shared.js'; export { IfThenElseConditionProps, ifThenElseConditionSchema, IfThenElseConditionType, -} from './schemas/if-then-else'; +} from './schemas/if-then-else.js'; export class IfThenElseCondition extends Condition { constructor(value: OmitConditionType) { diff --git a/packages/taco/src/conditions/index.ts b/packages/taco/src/conditions/index.ts index 0c8c3d5c8..be40bebc9 100644 --- a/packages/taco/src/conditions/index.ts +++ b/packages/taco/src/conditions/index.ts @@ -1,11 +1,11 @@ -import * as base from './base'; -import * as predefined from './predefined'; +import * as base from './base/index.js'; +import * as predefined from './predefined/index.js'; -export * as compound from './compound-condition'; -export * as condition from './condition'; -export * as conditionExpr from './condition-expr'; -export { ConditionFactory } from './condition-factory'; -export * as context from './context'; -export * as ifThenElse from './if-then-else-condition'; -export * as sequential from './sequential'; +export * as compound from './compound-condition.js'; +export * as condition from './condition.js'; +export * as conditionExpr from './condition-expr.js'; +export { ConditionFactory } from './condition-factory.js'; +export * as context from './context/index.js'; +export * as ifThenElse from './if-then-else-condition.js'; +export * as sequential from './sequential.js'; export { base, predefined }; diff --git a/packages/taco/src/conditions/multi-condition.ts b/packages/taco/src/conditions/multi-condition.ts index 434ab812a..f2e3fb9fa 100644 --- a/packages/taco/src/conditions/multi-condition.ts +++ b/packages/taco/src/conditions/multi-condition.ts @@ -1,7 +1,7 @@ -import { CompoundConditionType } from './compound-condition'; -import { ConditionProps } from './condition'; -import { IfThenElseConditionType } from './if-then-else-condition'; -import { ConditionVariableProps, SequentialConditionType } from './sequential'; +import { CompoundConditionType } from './compound-condition.js'; +import { ConditionProps } from './condition.js'; +import { IfThenElseConditionType } from './if-then-else-condition.js'; +import { ConditionVariableProps, SequentialConditionType } from './sequential.js'; export const maxNestedDepth = (maxDepth: number) => diff --git a/packages/taco/src/conditions/predefined/erc20.ts b/packages/taco/src/conditions/predefined/erc20.ts index cd3087e7f..eeaa3ab70 100644 --- a/packages/taco/src/conditions/predefined/erc20.ts +++ b/packages/taco/src/conditions/predefined/erc20.ts @@ -4,7 +4,7 @@ import { ContractCondition, ContractConditionProps, ContractConditionType, -} from '../base/contract'; +} from '../base/contract.js'; type ERC20BalanceFields = 'contractAddress' | 'chain' | 'returnValueTest'; diff --git a/packages/taco/src/conditions/predefined/erc721.ts b/packages/taco/src/conditions/predefined/erc721.ts index 90b2a33de..15ec2e20c 100644 --- a/packages/taco/src/conditions/predefined/erc721.ts +++ b/packages/taco/src/conditions/predefined/erc721.ts @@ -4,7 +4,7 @@ import { ContractCondition, ContractConditionProps, ContractConditionType, -} from '../base/contract'; +} from '../base/contract.js'; type ERC721OwnershipFields = 'contractAddress' | 'chain' | 'parameters'; diff --git a/packages/taco/src/conditions/predefined/index.ts b/packages/taco/src/conditions/predefined/index.ts index 7d29ceb02..7309abda4 100644 --- a/packages/taco/src/conditions/predefined/index.ts +++ b/packages/taco/src/conditions/predefined/index.ts @@ -1,2 +1,2 @@ -export * as erc20 from './erc20'; -export * as erc721 from './erc721'; +export * as erc20 from './erc20.js'; +export * as erc721 from './erc721.js'; diff --git a/packages/taco/src/conditions/schemas/common.ts b/packages/taco/src/conditions/schemas/common.ts index 6669e4d30..f4050d7f0 100644 --- a/packages/taco/src/conditions/schemas/common.ts +++ b/packages/taco/src/conditions/schemas/common.ts @@ -2,7 +2,7 @@ import { JSONPath } from '@astronautlabs/jsonpath'; import { USER_ADDRESS_PARAM_DEFAULT } from '@nucypher/taco-auth'; import { Primitive, z, ZodLiteral } from 'zod'; -import { CONTEXT_PARAM_PREFIX, CONTEXT_PARAM_REGEXP } from '../const'; +import { CONTEXT_PARAM_PREFIX, CONTEXT_PARAM_REGEXP } from '../const.js'; // We want to discriminate between ContextParams and plain strings // If a string starts with `:`, it's a ContextParam diff --git a/packages/taco/src/conditions/schemas/compound.ts b/packages/taco/src/conditions/schemas/compound.ts index df8dd40ce..3c750aee6 100644 --- a/packages/taco/src/conditions/schemas/compound.ts +++ b/packages/taco/src/conditions/schemas/compound.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { maxNestedDepth } from '../multi-condition'; +import { maxNestedDepth } from '../multi-condition.js'; -import { baseConditionSchema } from './common'; -import { anyConditionSchema } from './utils'; +import { baseConditionSchema } from './common.js'; +import { anyConditionSchema } from './utils.js'; export const CompoundConditionType = 'compound'; diff --git a/packages/taco/src/conditions/schemas/context.ts b/packages/taco/src/conditions/schemas/context.ts index d4925e8bb..9a423880f 100644 --- a/packages/taco/src/conditions/schemas/context.ts +++ b/packages/taco/src/conditions/schemas/context.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { CONTEXT_PARAM_FULL_MATCH_REGEXP } from '../const'; +import { CONTEXT_PARAM_FULL_MATCH_REGEXP } from '../const.js'; -import { plainStringSchema } from './common'; +import { plainStringSchema } from './common.js'; const UINT256_MAX = BigInt( '115792089237316195423570985008687907853269984665640564039457584007913129639935', diff --git a/packages/taco/src/conditions/schemas/contract.ts b/packages/taco/src/conditions/schemas/contract.ts index 7ff99168a..5fcfd6160 100644 --- a/packages/taco/src/conditions/schemas/contract.ts +++ b/packages/taco/src/conditions/schemas/contract.ts @@ -2,8 +2,8 @@ import { EthAddressSchema } from '@nucypher/shared'; import { ethers } from 'ethers'; import { z } from 'zod'; -import { blockchainParamOrContextParamSchema } from './context'; -import { rpcConditionSchema } from './rpc'; +import { blockchainParamOrContextParamSchema } from './context.js'; +import { rpcConditionSchema } from './rpc.js'; // TODO: Consider replacing with `z.unknown`: // Since Solidity types are tied to Solidity version, we may not be able to accurately represent them in Zod. diff --git a/packages/taco/src/conditions/schemas/export-for-zod-doc-gen.ts b/packages/taco/src/conditions/schemas/export-for-zod-doc-gen.ts index 36e6cfa24..b6441652a 100755 --- a/packages/taco/src/conditions/schemas/export-for-zod-doc-gen.ts +++ b/packages/taco/src/conditions/schemas/export-for-zod-doc-gen.ts @@ -4,18 +4,18 @@ * NOTE: The order of the exported Zod objects in this file dictates the order of the generated markdown. */ -export * from './utils'; +export * from './utils.js'; // ts-unused-exports:disable-next-line - this comment line is added to prevent lint from changing or objecting the export order. -export * from './common'; -export * from './context'; +export * from './common.js'; +export * from './context.js'; // ts-unused-exports:disable-next-line - this comment line is added to prevent lint from changing or objecting the export order. -export * from './compound'; -export * from './contract'; -export * from './if-then-else'; -export * from './json-api'; -export * from './json-rpc'; -export * from './jwt'; -export * from './return-value-test'; -export * from './rpc'; -export * from './sequential'; -export * from './time'; +export * from './compound.js'; +export * from './contract.js'; +export * from './if-then-else.js'; +export * from './json-api.js'; +export * from './json-rpc.js'; +export * from './jwt.js'; +export * from './return-value-test.js'; +export * from './rpc.js'; +export * from './sequential.js'; +export * from './time.js'; diff --git a/packages/taco/src/conditions/schemas/if-then-else.ts b/packages/taco/src/conditions/schemas/if-then-else.ts index dc90ee992..39769fd47 100644 --- a/packages/taco/src/conditions/schemas/if-then-else.ts +++ b/packages/taco/src/conditions/schemas/if-then-else.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { maxNestedDepth } from '../multi-condition'; +import { maxNestedDepth } from '../multi-condition.js'; -import { baseConditionSchema } from './common'; -import { anyConditionSchema } from './utils'; +import { baseConditionSchema } from './common.js'; +import { anyConditionSchema } from './utils.js'; export const IfThenElseConditionType = 'if-then-else'; diff --git a/packages/taco/src/conditions/schemas/json-api.ts b/packages/taco/src/conditions/schemas/json-api.ts index 8fa6e7928..a4b9a9f74 100644 --- a/packages/taco/src/conditions/schemas/json-api.ts +++ b/packages/taco/src/conditions/schemas/json-api.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { baseConditionSchema, httpsURLSchema, jsonPathSchema } from './common'; -import { contextParamSchema } from './context'; -import { returnValueTestSchema } from './return-value-test'; +import { baseConditionSchema, httpsURLSchema, jsonPathSchema } from './common.js'; +import { contextParamSchema } from './context.js'; +import { returnValueTestSchema } from './return-value-test.js'; export const JsonApiConditionType = 'json-api'; diff --git a/packages/taco/src/conditions/schemas/json-rpc.ts b/packages/taco/src/conditions/schemas/json-rpc.ts index d945f2f5b..c0edc8a8c 100644 --- a/packages/taco/src/conditions/schemas/json-rpc.ts +++ b/packages/taco/src/conditions/schemas/json-rpc.ts @@ -1,8 +1,8 @@ import { z } from 'zod'; -import { baseConditionSchema, httpsURLSchema, jsonPathSchema } from './common'; -import { contextParamSchema } from './context'; -import { returnValueTestSchema } from './return-value-test'; +import { baseConditionSchema, httpsURLSchema, jsonPathSchema } from './common.js'; +import { contextParamSchema } from './context.js'; +import { returnValueTestSchema } from './return-value-test.js'; export const JsonRpcConditionType = 'json-rpc'; diff --git a/packages/taco/src/conditions/schemas/jwt.ts b/packages/taco/src/conditions/schemas/jwt.ts index 34ef9457e..ab6d47534 100644 --- a/packages/taco/src/conditions/schemas/jwt.ts +++ b/packages/taco/src/conditions/schemas/jwt.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; -import { baseConditionSchema } from './common'; -import { contextParamSchema } from './context'; +import { baseConditionSchema } from './common.js'; +import { contextParamSchema } from './context.js'; export const JWT_PARAM_DEFAULT = ':jwtToken'; diff --git a/packages/taco/src/conditions/schemas/return-value-test.ts b/packages/taco/src/conditions/schemas/return-value-test.ts index 17f168f6c..c48e15626 100644 --- a/packages/taco/src/conditions/schemas/return-value-test.ts +++ b/packages/taco/src/conditions/schemas/return-value-test.ts @@ -3,7 +3,7 @@ import { z } from 'zod'; import { blockchainParamOrContextParamSchema, paramOrContextParamSchema, -} from './context'; +} from './context.js'; const returnValueTestBaseSchema = z.object({ index: z.number().int().nonnegative().optional(), diff --git a/packages/taco/src/conditions/schemas/rpc.ts b/packages/taco/src/conditions/schemas/rpc.ts index faf4c9da7..867c791a8 100644 --- a/packages/taco/src/conditions/schemas/rpc.ts +++ b/packages/taco/src/conditions/schemas/rpc.ts @@ -1,9 +1,9 @@ import { BlockIdentifierSchema, EthAddressSchema } from '@nucypher/shared'; import { z } from 'zod'; -import { baseConditionSchema, UserAddressSchema } from './common'; -import { contextParamSchema } from './context'; -import { blockchainReturnValueTestSchema } from './return-value-test'; +import { baseConditionSchema, UserAddressSchema } from './common.js'; +import { contextParamSchema } from './context.js'; +import { blockchainReturnValueTestSchema } from './return-value-test.js'; export const RpcConditionType = 'rpc'; diff --git a/packages/taco/src/conditions/schemas/sequential.ts b/packages/taco/src/conditions/schemas/sequential.ts index 60942d047..e0cef964c 100644 --- a/packages/taco/src/conditions/schemas/sequential.ts +++ b/packages/taco/src/conditions/schemas/sequential.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { maxNestedDepth } from '../multi-condition'; +import { maxNestedDepth } from '../multi-condition.js'; -import { baseConditionSchema, plainStringSchema } from './common'; -import { anyConditionSchema } from './utils'; +import { baseConditionSchema, plainStringSchema } from './common.js'; +import { anyConditionSchema } from './utils.js'; export const SequentialConditionType = 'sequential'; diff --git a/packages/taco/src/conditions/schemas/time.ts b/packages/taco/src/conditions/schemas/time.ts index 65e57ac95..012ddbfb9 100644 --- a/packages/taco/src/conditions/schemas/time.ts +++ b/packages/taco/src/conditions/schemas/time.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { rpcConditionSchema } from './rpc'; +import { rpcConditionSchema } from './rpc.js'; // TimeCondition is an RpcCondition with the method set to 'blocktime' and no parameters diff --git a/packages/taco/src/conditions/schemas/utils.ts b/packages/taco/src/conditions/schemas/utils.ts index abd14f36b..b08ed27b6 100644 --- a/packages/taco/src/conditions/schemas/utils.ts +++ b/packages/taco/src/conditions/schemas/utils.ts @@ -1,15 +1,15 @@ import { z } from 'zod'; -import { compoundConditionSchema } from '../compound-condition'; +import { compoundConditionSchema } from '../compound-condition.js'; -import { contractConditionSchema } from './contract'; -import { ifThenElseConditionSchema } from './if-then-else'; -import { jsonApiConditionSchema } from './json-api'; -import { jsonRpcConditionSchema } from './json-rpc'; -import { jwtConditionSchema } from './jwt'; -import { rpcConditionSchema } from './rpc'; -import { sequentialConditionSchema } from './sequential'; -import { timeConditionSchema } from './time'; +import { contractConditionSchema } from './contract.js'; +import { ifThenElseConditionSchema } from './if-then-else.js'; +import { jsonApiConditionSchema } from './json-api.js'; +import { jsonRpcConditionSchema } from './json-rpc.js'; +import { jwtConditionSchema } from './jwt.js'; +import { rpcConditionSchema } from './rpc.js'; +import { sequentialConditionSchema } from './sequential.js'; +import { timeConditionSchema } from './time.js'; export const anyConditionSchema: z.ZodSchema = z.lazy(() => z.union([ diff --git a/packages/taco/src/conditions/sequential.ts b/packages/taco/src/conditions/sequential.ts index 65c111112..110aff2a7 100644 --- a/packages/taco/src/conditions/sequential.ts +++ b/packages/taco/src/conditions/sequential.ts @@ -1,17 +1,17 @@ -import { Condition } from './condition'; +import { Condition } from './condition.js'; import { SequentialConditionProps, sequentialConditionSchema, SequentialConditionType, -} from './schemas/sequential'; -import { OmitConditionType } from './shared'; +} from './schemas/sequential.js'; +import { OmitConditionType } from './shared.js'; export { ConditionVariableProps, SequentialConditionProps, sequentialConditionSchema, SequentialConditionType, -} from './schemas/sequential'; +} from './schemas/sequential.js'; export class SequentialCondition extends Condition { constructor(value: OmitConditionType) { diff --git a/packages/taco/src/conditions/shared.ts b/packages/taco/src/conditions/shared.ts index 1df855fed..8a054b581 100644 --- a/packages/taco/src/conditions/shared.ts +++ b/packages/taco/src/conditions/shared.ts @@ -3,11 +3,11 @@ export type OmitConditionType = Omit; export { contextParamSchema, paramOrContextParamSchema, -} from './schemas/context'; +} from './schemas/context.js'; export { BlockchainReturnValueTestProps, ReturnValueTestProps, blockchainReturnValueTestSchema, returnValueTestSchema, -} from './schemas/return-value-test'; +} from './schemas/return-value-test.js'; diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 5cbec5dab..120163a25 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -9,13 +9,13 @@ export { toHexString, } from '@nucypher/shared'; -export * as conditions from './conditions'; +export * as conditions from './conditions/index.js'; -export { decrypt, encrypt, encryptWithPublicKey } from './taco'; +export { decrypt, encrypt, encryptWithPublicKey } from './taco.js'; export { TacoClient, type TacoClientConfig, type TacoClientEthersConfig, type TacoClientViemConfig, -} from './client'; +} from './client/index.js'; diff --git a/packages/taco/src/taco.ts b/packages/taco/src/taco.ts index 42f7e1ac8..dfc1f2328 100644 --- a/packages/taco/src/taco.ts +++ b/packages/taco/src/taco.ts @@ -20,11 +20,11 @@ import { } from '@nucypher/shared'; import { ethers } from 'ethers'; -import { Condition } from './conditions/condition'; -import { ConditionExpression } from './conditions/condition-expr'; -import { ConditionContext } from './conditions/context'; -import { DkgClient } from './dkg'; -import { retrieveAndDecrypt } from './tdec'; +import { ConditionExpression } from './conditions/condition-expr.js'; +import { Condition } from './conditions/condition.js'; +import { ConditionContext } from './conditions/context/index.js'; +import { DkgClient } from './dkg.js'; +import { retrieveAndDecrypt } from './tdec.js'; /** * Encrypts a message gated by TACo Conditions using an ethers.js `Provider` and `Signer`. diff --git a/packages/taco/src/tdec.ts b/packages/taco/src/tdec.ts index 9ee353ac7..649eda8bd 100644 --- a/packages/taco/src/tdec.ts +++ b/packages/taco/src/tdec.ts @@ -21,9 +21,9 @@ import { } from '@nucypher/shared'; import { ethers } from 'ethers'; -import { ConditionExpression } from './conditions/condition-expr'; -import { ConditionContext } from './conditions/context'; -import { DkgClient } from './dkg'; +import { ConditionExpression } from './conditions/condition-expr.js'; +import { ConditionContext } from './conditions/context/index.js'; +import { DkgClient } from './dkg.js'; const ERR_DECRYPTION_FAILED = (errors: unknown) => `Threshold of responses not met; TACo decryption failed with errors: ${JSON.stringify( From 6b7eedb1dcde2209d6895bf4297d6ea4b14c9730 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Sun, 12 Oct 2025 22:17:17 +0200 Subject: [PATCH 94/97] fix: handle missing chain and ENS registry in viem-ethers adapter --- packages/shared/src/viem/ethers-adapter.ts | 11 ++- .../shared/test/viem-ethers-adapter.test.ts | 4 +- .../viem-to-ethers-ens.test.ts | 81 +++++++++++++++---- 3 files changed, 75 insertions(+), 21 deletions(-) diff --git a/packages/shared/src/viem/ethers-adapter.ts b/packages/shared/src/viem/ethers-adapter.ts index f90a1e0f9..1793a4be7 100644 --- a/packages/shared/src/viem/ethers-adapter.ts +++ b/packages/shared/src/viem/ethers-adapter.ts @@ -15,6 +15,10 @@ function createNetworkish(chain: Chain): ethers.providers.Networkish { // Add ENS registry address if available if (chain.contracts?.ensRegistry?.address) { networkish.ensAddress = chain.contracts.ensRegistry.address; + } else { + console.warn( + `No ENS registry found on chain ${chain.name} (chainId=${chain.id}) at chain.contracts.ensRegistry.address. Resolving ENS will not work on the created ethers Provider.`, + ); } return networkish; @@ -41,12 +45,11 @@ export function viemClientToProvider( ): ethers.providers.Provider { const { chain, transport }: PublicClient = client; - if (!chain) { - throw new Error('Client must have a chain configured'); + let networkish: ethers.providers.Networkish | undefined; + if (chain) { + networkish = createNetworkish(chain); } - const networkish = createNetworkish(chain); - // Note: We read minimal, commonly-present properties from transport. // viem's transport internals are not a public API and may change. // Also the we are taking only the first transport available. diff --git a/packages/shared/test/viem-ethers-adapter.test.ts b/packages/shared/test/viem-ethers-adapter.test.ts index 38a52f75a..776432a1d 100644 --- a/packages/shared/test/viem-ethers-adapter.test.ts +++ b/packages/shared/test/viem-ethers-adapter.test.ts @@ -109,9 +109,7 @@ describe('viem ethers adapter', () => { }; const clientWithoutChain = createPublicClient(clientWithoutChainConfig); - expect(() => viemClientToProvider(clientWithoutChain)).toThrow( - 'Client must have a chain configured', - ); + expect(() => viemClientToProvider(clientWithoutChain)).not.toThrow(); }); it('should handle missing transport URL', () => { diff --git a/packages/taco/integration-test/viem-to-ethers-ens.test.ts b/packages/taco/integration-test/viem-to-ethers-ens.test.ts index 3b9914542..f02cf9c89 100644 --- a/packages/taco/integration-test/viem-to-ethers-ens.test.ts +++ b/packages/taco/integration-test/viem-to-ethers-ens.test.ts @@ -1,27 +1,58 @@ -import { describe, expect, test } from 'vitest'; +import { describe, expect, test, vi } from 'vitest'; import { toEthersProvider } from '@nucypher/shared'; import { createPublicClient, http } from 'viem'; import { mainnet } from 'viem/chains'; -describe.skipIf(!process.env.RUNNING_IN_CI)('Viem-Ethers Adapter Integration Tests', () => { - describe('ENS Registry', () => { - // TODO: will fix this in a different PR - issue #712 - test.skip('should properly read ENS registry contract address from viem client converted to ethers provider', async () => { +describe.skipIf(!process.env.RUNNING_IN_CI)( + 'Viem-Ethers Adapter ENS Integration Tests', + () => { + test('should properly resolve ENS name to address when no viem chain object is provided', async () => { // Test with chain that has ENS registry (mainnet) // Note: mainnet from viem/chains includes ENS registry configuration const mainnetViemClient = createPublicClient({ - chain: mainnet, transport: http('https://eth.llamarpc.com'), }); // Convert to ethers provider to verify ENS address mapping const ethersProvider = toEthersProvider(mainnetViemClient); - // Verify ENS registry is properly mapped from viem chain configuration - const expectedEnsAddress = mainnet.contracts?.ensRegistry?.address; - expect(ethersProvider.network.ensAddress).toBe(expectedEnsAddress); - // Also verify it's the known mainnet ENS registry address + // Test actual ENS name resolution to verify functionality + const resolvedAddress = await ethersProvider.resolveName('vitalik.eth'); + expect(resolvedAddress).toBeTruthy(); + // Currently vitalik.eth is "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045". + // But it may change in the future. So we only check if it's a valid Ethereum address. + expect(resolvedAddress).toMatch(/^0x[a-fA-F0-9]{40}$/); // Valid Ethereum address format + + // Currently ethersProvider.network.ensAddress on mainnet is "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e". + expect(ethersProvider.network.ensAddress).toBeTruthy(); + }, 15000); + + test('should properly handle viem chain with explicit ENS registry configuration', async () => { + const chainWithEns = { + ...mainnet, + contracts: { + ...mainnet.contracts, + ensRegistry: { + // Manually providing ENS registry since viem/chains doesn't include it + address: + '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e' as `0x${string}`, + }, + }, + }; + + const mainnetViemClient = createPublicClient({ + chain: chainWithEns, + transport: http(), + }); + + // Convert to ethers provider to verify ENS address mapping + const ethersProvider = toEthersProvider(mainnetViemClient); + + // Don't check for console.warn since the behavior might vary + // The important part is that ENS registry is properly set when provided + + // Verify ENS registry address is properly set expect(ethersProvider.network.ensAddress).toBe( '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', ); @@ -29,9 +60,31 @@ describe.skipIf(!process.env.RUNNING_IN_CI)('Viem-Ethers Adapter Integration Tes // Test actual ENS name resolution to verify functionality const resolvedAddress = await ethersProvider.resolveName('vitalik.eth'); expect(resolvedAddress).toBeTruthy(); - // Currently vitalik.eth is "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045". - // But it may change in the future. So we only check if it's a valid Ethereum address. expect(resolvedAddress).toMatch(/^0x[a-fA-F0-9]{40}$/); // Valid Ethereum address format }, 15000); - }); -}); + + test('should warn when viem chain lacks ENS registry configuration', async () => { + // mainnet from viem/chains does NOT include ensRegistry, only ensUniversalResolver + const mainnetViemClient = createPublicClient({ + chain: mainnet, + transport: http(), + }); + + const consoleSpy = vi.spyOn(console, 'warn'); + + // Convert to ethers provider + const ethersProvider = toEthersProvider(mainnetViemClient); + + // Should trigger warning since mainnet doesn't have ensRegistry in viem/chains + expect(consoleSpy).toHaveBeenCalledWith( + expect.stringContaining('No ENS registry found on chain'), + ); + + // ENS address should not be set + expect(ethersProvider.network.ensAddress).toBeUndefined(); + + // Clean up the spy + consoleSpy.mockRestore(); + }); + }, +); From 2b1917c19b09c348b12a273510c2d3bd2ac48ab0 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Mon, 13 Oct 2025 18:15:00 +0200 Subject: [PATCH 95/97] refactor: rename TacoClient to AccessClient --- packages/taco/README.md | 28 ++--- ...o-client.test.ts => access-client.test.ts} | 49 ++++---- .../client.ts} | 104 ++++++++-------- .../config-validator.ts | 18 +-- .../config.ts} | 34 ++--- packages/taco/src/access-client/index.ts | 2 + packages/taco/src/client/index.ts | 2 - packages/taco/src/index.ts | 10 +- .../{client.test.ts => access-client.test.ts} | 116 +++++++++--------- 9 files changed, 185 insertions(+), 178 deletions(-) rename packages/taco/integration-test/{taco-client.test.ts => access-client.test.ts} (85%) rename packages/taco/src/{client/taco-client.ts => access-client/client.ts} (69%) rename packages/taco/src/{client => access-client}/config-validator.ts (95%) rename packages/taco/src/{client/client-config.ts => access-client/config.ts} (60%) create mode 100644 packages/taco/src/access-client/index.ts delete mode 100644 packages/taco/src/client/index.ts rename packages/taco/test/{client.test.ts => access-client.test.ts} (76%) diff --git a/packages/taco/README.md b/packages/taco/README.md index 2a92b4811..93b171328 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -139,22 +139,22 @@ const viemEncrypted = await encrypt( For detailed viem documentation, see [VIEM_SUPPORT.md](./VIEM_SUPPORT.md). -## TacoClient - Object-Oriented Interface +## AccessClient - Object-Oriented Interface -For applications requiring multiple TACo operations or complex configuration management, the TACo SDK provides an optional object-oriented interface through the `TacoClient` class. This provides a stateful, higher-level abstraction over the functional API. +For applications requiring multiple TACo operations or complex configuration management, the TACo SDK provides an optional object-oriented interface through the `AccessClient` class. This provides a stateful, higher-level abstraction over the functional API. The Object-Oriented API is fully backward compatible - you can use both APIs in -the same application as needed. Except that the TacoClient has additional validations +the same application as needed. Except that the AccessClient has additional validations and hence throws some errors earlier with different error messages. -NOTE: Using `TacoClient` is equivalent to using the functional API. +NOTE: Using `AccessClient` is equivalent to using the functional API. There are no specific recommendations on which approach to use. Choose the one that best suits your development preferences. ### Basic Usage ```typescript -import { TacoClient, ConditionContext, DOMAIN_NAMES } from '@nucypher/taco'; +import { AccessClient, ConditionContext, DOMAIN_NAMES } from '@nucypher/taco'; import { createPublicClient, http } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; @@ -169,8 +169,8 @@ const viemClient = createPublicClient({ }); const viemAccount = privateKeyToAccount('0x...'); -// Create TacoClient instance with domain constants -const tacoClient = new TacoClient({ +// Create AccessClient instance with domain constants +const accessClient = new AccessClient({ domain: DOMAIN_NAMES.TESTNET, // TESTNET -> 'tapir' ritualId: 6, viemClient, @@ -178,27 +178,27 @@ const tacoClient = new TacoClient({ }); // Encrypt data -const messageKit = await tacoClient.encrypt('Hello, secret!', condition); +const messageKit = await accessClient.encrypt('Hello, secret!', condition); // Decrypt const conditionContext = ConditionContext.fromMessageKit(messageKit); // if needed Add authentication for ":userAddress" in condition... -const decryptedMessage = await tacoClient.decrypt(messageKit, conditionContext); +const decryptedMessage = await accessClient.decrypt(messageKit, conditionContext); // OR with encrypted bytes: -// const decryptedMessage = await tacoClient.decrypt(messageKit.toBytes(), conditionContext); +// const decryptedMessage = await accessClient.decrypt(messageKit.toBytes(), conditionContext); ``` ### Dual Configuration Support -TacoClient supports both viem and ethers.js configurations: +AccessClient supports both viem and ethers.js configurations: ```typescript -import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; +import { AccessClient, DOMAIN_NAMES } from '@nucypher/taco'; // With viem -const tacoClientViem = new TacoClient({ +const accessClientViem = new AccessClient({ domain: DOMAIN_NAMES.TESTNET, ritualId: 6, viemClient, @@ -206,7 +206,7 @@ const tacoClientViem = new TacoClient({ }); // With ethers.js -const tacoClientEthers = new TacoClient({ +const accessClientEthers = new AccessClient({ domain: DOMAIN_NAMES.TESTNET, ritualId: 6, ethersProvider, diff --git a/packages/taco/integration-test/taco-client.test.ts b/packages/taco/integration-test/access-client.test.ts similarity index 85% rename from packages/taco/integration-test/taco-client.test.ts rename to packages/taco/integration-test/access-client.test.ts index bc6e95531..fb7cfaeaf 100644 --- a/packages/taco/integration-test/taco-client.test.ts +++ b/packages/taco/integration-test/access-client.test.ts @@ -10,11 +10,11 @@ import { createPublicClient, http, LocalAccount } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { polygonAmoy } from 'viem/chains'; import { + AccessClient, + AccessClientEthersConfig, + AccessClientViemConfig, conditions, initialize, - TacoClient, - TacoClientEthersConfig, - TacoClientViemConfig, ThresholdMessageKit, } from '../src'; import { DkgClient } from '../src/dkg'; @@ -29,11 +29,11 @@ const RITUAL_ID = 6; const CHAIN_ID = 80002; // Polygon Amoy // temp type-safe configuration interfaces just for this testing file -type ViemTestConfig = Omit; -type EthersTestConfig = Omit; +type ViemTestConfig = Omit; +type EthersTestConfig = Omit; describe.skipIf(!process.env.RUNNING_IN_CI)( - 'TacoClient Integration Test', + 'AccessClient Integration Test', () => { // Create viem accounts from private keys const encryptorAccount = privateKeyToAccount( @@ -149,7 +149,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( ])('TacoClient with %s', (label, objects, consumerSigner) => { test('should encrypt and decrypt a message using standard encrypt method', async () => { // Setup - const tacoClient = new TacoClient({ + const accessClient = new AccessClient({ domain: DOMAIN, ritualId: RITUAL_ID, ...objects, @@ -161,28 +161,28 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( const condition = createTestCondition(); // Encrypt the message - const messageKit = await tacoClient.encrypt(message, condition); - expect(messageKit).toBeInstanceOf(ThresholdMessageKit); - expect(messageKit.toBytes()).toBeInstanceOf(Uint8Array); + const encrypted = await accessClient.encrypt(message, condition); + expect(encrypted).toBeInstanceOf(ThresholdMessageKit); + expect(encrypted.toBytes()).toBeInstanceOf(Uint8Array); // Setup condition context for decryption const conditionContext = await setupConditionContext( - messageKit, + encrypted, objects, consumerSigner, ); // Test decryption with Uint8Array input - const decryptedBytes = await tacoClient.decrypt( - messageKit.toBytes(), + const decryptedBytes = await accessClient.decrypt( + encrypted.toBytes(), conditionContext, ); const decryptedMessageString = fromBytes(decryptedBytes); expect(decryptedMessageString).toEqual(messageString); // Test decryption with MessageKit object input - const decryptedBytes2 = await tacoClient.decrypt( - messageKit, + const decryptedBytes2 = await accessClient.decrypt( + encrypted, conditionContext, ); const decryptedMessageString2 = fromBytes(decryptedBytes2); @@ -190,8 +190,8 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( }, 30000); test('should encrypt and decrypt using offline encryptWithPublicKey method', async () => { - // Create TacoClient from configuration - const tacoClient = new TacoClient({ + // Create AccessClient using the test configuration + const accessClient = new AccessClient({ domain: DOMAIN, ritualId: RITUAL_ID, ...objects, @@ -211,24 +211,23 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( expect(dkgPublicKey).toBeDefined(); // Perform offline encryption with DKG public key - const messageKit = await tacoClient.encryptWithPublicKey( + const encrypted = await accessClient.encryptWithPublicKey( message, condition, dkgPublicKey, ); - expect(messageKit).toBeInstanceOf(ThresholdMessageKit); - expect(messageKit.toBytes()).toBeInstanceOf(Uint8Array); + expect(encrypted).toBeInstanceOf(ThresholdMessageKit); // Setup condition context with consumer signer for decryption const conditionContext = await setupConditionContext( - messageKit, + encrypted, objects, consumerSigner, ); // Decrypt and verify - const decryptedBytes = await tacoClient.decrypt( - messageKit, + const decryptedBytes = await accessClient.decrypt( + encrypted, conditionContext, ); const decryptedMessageString = fromBytes(decryptedBytes); @@ -237,14 +236,14 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( test('should successfully validate network configuration', async () => { // Setup - const tacoClient = new TacoClient({ + const accessClient = new AccessClient({ domain: DOMAIN, ritualId: RITUAL_ID, ...objects, }); // Validate configuration with network calls - const validation = tacoClient.validateConfig(); + const validation = accessClient.validateConfig(); expect(validation).resolves.not.toThrow(); }, 10000); diff --git a/packages/taco/src/client/taco-client.ts b/packages/taco/src/access-client/client.ts similarity index 69% rename from packages/taco/src/client/taco-client.ts rename to packages/taco/src/access-client/client.ts index 67c4d4581..2ebac181c 100644 --- a/packages/taco/src/client/taco-client.ts +++ b/packages/taco/src/access-client/client.ts @@ -1,5 +1,5 @@ /** - * TacoClient - Object-Oriented Interface for TACo Operations + * AccessClient - Object-Oriented Interface for TACo Operations * * Provides a higher-level, client-oriented abstraction over the functional TACo API. * This complements the existing functional API and caters to developers who prefer @@ -16,15 +16,15 @@ import { Condition } from '../conditions/condition.js'; import { ConditionContext } from '../conditions/context/index.js'; import { decrypt, encrypt, encryptWithPublicKey } from '../taco.js'; +import { AccessConfigValidator } from './config-validator.js'; import { - type TacoClientConfig, - type TacoClientEthersConfig, - type TacoClientViemConfig, -} from './client-config.js'; -import { TacoConfigValidator } from './config-validator.js'; + type AccessClientConfig, + type AccessClientEthersConfig, + type AccessClientViemConfig, +} from './config.js'; /** - * TacoClient provides an object-oriented interface for TACo operations + * AccessClient provides an object-oriented interface for TACo operations * * This class encapsulates TACo configuration and provides simplified methods * for encryption and decryption operations. It handles configuration validation, @@ -32,7 +32,7 @@ import { TacoConfigValidator } from './config-validator.js'; * * @example Using with viem: * ```typescript - * import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; + * import { AccessClient, DOMAIN_NAMES } from '@nucypher/taco'; * import { createPublicClient, http } from 'viem'; * import { polygonAmoy } from 'viem/chains'; * import { privateKeyToAccount } from 'viem/accounts'; @@ -44,8 +44,8 @@ import { TacoConfigValidator } from './config-validator.js'; * }); * const viemAccount = privateKeyToAccount('0x...'); * - * // Create TacoClient - WASM initializes automatically - * const tacoClient = new TacoClient({ + * // Create AccessClient - WASM initializes automatically + * const accessClient = new AccessClient({ * domain: DOMAIN_NAMES.TESTNET, // 'tapir' * ritualId: 6, * viemClient, @@ -53,21 +53,21 @@ import { TacoConfigValidator } from './config-validator.js'; * }); * * // Operations wait for initialization automatically - * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); - * const decrypted = await tacoClient.decrypt(messageKit, conditionContext); + * const messageKit = await accessClient.encrypt('Hello, secret!', condition); + * const decrypted = await accessClient.decrypt(messageKit, conditionContext); * ``` * * @example Using with ethers.js: * ```typescript - * import { TacoClient, DOMAIN_NAMES } from '@nucypher/taco'; + * import { AccessClient, DOMAIN_NAMES } from '@nucypher/taco'; * import { ethers } from 'ethers'; * * // Create ethers provider and signer * const ethersProvider = new ethers.providers.JsonRpcProvider('https://rpc-amoy.polygon.technology'); * const ethersSigner = new ethers.Wallet('0x...', ethersProvider); * - * // Create TacoClient - WASM initializes automatically - * const tacoClient = new TacoClient({ + * // Create AccessClient - WASM initializes automatically + * const accessClient = new AccessClient({ * domain: DOMAIN_NAMES.TESTNET, * ritualId: 6, * ethersProvider, @@ -75,18 +75,18 @@ import { TacoConfigValidator } from './config-validator.js'; * }); * * // Operations are safe and wait for readiness - * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); - * const decrypted = await tacoClient.decrypt(messageKit, conditionContext); + * const messageKit = await accessClient.encrypt('Hello, secret!', condition); + * const decrypted = await accessClient.decrypt(messageKit, conditionContext); * ``` */ -export class TacoClient { - private config: TacoClientConfig; +export class AccessClient { + private config: AccessClientConfig; private static initializationPromise: Promise; /** * Initialize TACo WASM globally (singleton pattern) * - * This method ensures TACo WASM is initialized exactly once across all TacoClient instances. + * This method ensures TACo WASM is initialized exactly once across all AccessClient instances. * Initialization happens automatically when creating clients or calling operations, but you can * call this explicitly for performance optimization or error handling. * @@ -95,19 +95,19 @@ export class TacoClient { * @example * ```typescript * // Optional: Pre-initialize for better performance - * await TacoClient.initialize(); + * await AccessClient.initialize(); * - * // All TacoClient instances share the same initialization - * const client1 = new TacoClient(config1); - * const client2 = new TacoClient(config2); + * // All AccessClient instances share the same initialization + * const client1 = new AccessClient(config1); + * const client2 = new AccessClient(config2); * * // Operations automatically wait for initialization * const encrypted = await client1.encrypt(data, condition); * ``` */ static async initialize(): Promise { - if (!TacoClient.initializationPromise) { - TacoClient.initializationPromise = (async () => { + if (!AccessClient.initializationPromise) { + AccessClient.initializationPromise = (async () => { try { await initialize(); } catch (error) { @@ -116,25 +116,25 @@ export class TacoClient { } })(); } - return TacoClient.initializationPromise; + return AccessClient.initializationPromise; } /** - * Create a new TacoClient instance + * Create a new AccessClient instance * - * @param {TacoClientConfig} config - Configuration for the TacoClient + * @param {AccessClientConfig} config - Configuration for the AccessClient * @throws {Error} If configuration is invalid */ - constructor(config: TacoClientConfig) { - // Validate configuration using TacoConfig - const result = TacoConfigValidator.validateFast(config); + constructor(config: AccessClientConfig) { + // Validate configuration using AccessConfig + const result = AccessConfigValidator.validateFast(config); if (!result.isValid) { throw new Error(`Invalid configuration: ${result.errors.join(', ')}`); } this.config = config; - TacoClient.initialize(); + AccessClient.initialize(); } /** @@ -151,7 +151,7 @@ export class TacoClient { * @example * ```typescript * try { - * await tacoClient.validateConfig(); + * await accessClient.validateConfig(); * console.log('Configuration is valid.'); * } catch (error) { * console.error('Configuration validation failed:', error.message); @@ -159,7 +159,7 @@ export class TacoClient { * ``` */ async validateConfig(): Promise { - const validationResult = await TacoConfigValidator.validate(this.config); + const validationResult = await AccessConfigValidator.validate(this.config); if (!validationResult.isValid) { throw new Error( `Invalid configuration: ${validationResult.errors.join(', ')}`, @@ -177,24 +177,24 @@ export class TacoClient { * * @example * ```typescript - * const messageKit = await tacoClient.encrypt('Hello, secret!', condition); + * const messageKit = await accessClient.encrypt('Hello, secret!', condition); * ``` */ async encrypt( data: string | Uint8Array, accessCondition: Condition, ): Promise { - await TacoClient.initialize(); + await AccessClient.initialize(); const messageKit = await encrypt( - (this.config as TacoClientEthersConfig).ethersProvider || - (this.config as TacoClientViemConfig).viemClient, + (this.config as AccessClientEthersConfig).ethersProvider || + (this.config as AccessClientViemConfig).viemClient, this.config.domain, data, accessCondition, this.config.ritualId, - (this.config as TacoClientEthersConfig).ethersSigner || - (this.config as TacoClientViemConfig).viemSignerAccount, + (this.config as AccessClientEthersConfig).ethersSigner || + (this.config as AccessClientViemConfig).viemSignerAccount, ); return messageKit; @@ -218,7 +218,7 @@ export class TacoClient { * const dkgPublicKey = await getDkgPublicKey(domain, ritualId); * * // Encrypt offline using the public key - * const messageKit = await tacoClient.encryptWithPublicKey('Hello, secret!', condition, dkgPublicKey); + * const messageKit = await accessClient.encryptWithPublicKey('Hello, secret!', condition, dkgPublicKey); * ``` */ async encryptWithPublicKey( @@ -226,14 +226,14 @@ export class TacoClient { accessCondition: Condition, dkgPublicKey: DkgPublicKey, ): Promise { - await TacoClient.initialize(); + await AccessClient.initialize(); const messageKit = await encryptWithPublicKey( data, accessCondition, dkgPublicKey, - (this.config as TacoClientEthersConfig).ethersSigner || - (this.config as TacoClientViemConfig).viemSignerAccount, + (this.config as AccessClientEthersConfig).ethersSigner || + (this.config as AccessClientViemConfig).viemSignerAccount, ); return messageKit; @@ -250,17 +250,17 @@ export class TacoClient { * @example * ```typescript * // With messageKit - * const decrypted = await tacoClient.decrypt(messageKit, conditionContext); + * const decrypted = await accessClient.decrypt(messageKit, conditionContext); * * // With encrypted bytes - * const decrypted = await tacoClient.decrypt(encryptedBytes, conditionContext); + * const decrypted = await accessClient.decrypt(encryptedBytes, conditionContext); * ``` */ async decrypt( encryptedData: ThresholdMessageKit | Uint8Array, conditionContext?: ConditionContext, ): Promise { - await TacoClient.initialize(); + await AccessClient.initialize(); // Handle both messageKit and encrypted bytes const messageKit = @@ -269,8 +269,8 @@ export class TacoClient { : ThresholdMessageKit.fromBytes(encryptedData); const decrypted = await decrypt( - (this.config as TacoClientEthersConfig).ethersProvider || - (this.config as TacoClientViemConfig).viemClient, + (this.config as AccessClientEthersConfig).ethersProvider || + (this.config as AccessClientViemConfig).viemClient, this.config.domain, messageKit, conditionContext, @@ -283,9 +283,9 @@ export class TacoClient { /** * Get current client configuration * - * @returns {Readonly} Client configuration + * @returns {Readonly} Client configuration */ - getConfig(): Readonly { + getConfig(): Readonly { return Object.freeze({ ...this.config }); } } diff --git a/packages/taco/src/client/config-validator.ts b/packages/taco/src/access-client/config-validator.ts similarity index 95% rename from packages/taco/src/client/config-validator.ts rename to packages/taco/src/access-client/config-validator.ts index e5c226014..cdf48b728 100644 --- a/packages/taco/src/client/config-validator.ts +++ b/packages/taco/src/access-client/config-validator.ts @@ -14,7 +14,11 @@ import { import { ethers } from 'ethers'; import type { PublicClient } from 'viem'; -import { isEthersConfig, isViemConfig, type TacoClientConfig } from './index.js'; +import { + type AccessClientConfig, + isEthersConfig, + isViemConfig, +} from './index.js'; /** * Generic validation result interface @@ -25,12 +29,12 @@ export interface ValidationResult { } /** - * TACo Configuration Validator + * Access Configuration Validator * - * Validates TACo client configurations, domains, and provider compatibility. + * Validates Access client configurations, domains, and provider compatibility. * Provides both fast and full validation methods for TACo operations. */ -export class TacoConfigValidator { +export class AccessConfigValidator { /** * Get all supported TACo domain names * @returns {DomainName[]} Array of supported TACo domain names ('lynx', 'tapir', 'mainnet') @@ -127,7 +131,7 @@ export class TacoConfigValidator { * @param {TacoClientConfig} config - Configuration to validate * @returns {ValidationResult} Validation result with isValid boolean and errors array */ - static validateFast(config: TacoClientConfig): ValidationResult { + static validateFast(config: AccessClientConfig): ValidationResult { const errors: string[] = []; // Validate domain @@ -191,7 +195,7 @@ export class TacoConfigValidator { * @private */ private static validateChainCompatibility( - config: TacoClientConfig, + config: AccessClientConfig, ): ValidationResult { const errors: string[] = []; @@ -229,7 +233,7 @@ export class TacoConfigValidator { * @param {TacoClientConfig} config - Configuration to validate * @returns {Promise} Promise resolving to validation result with isValid boolean and errors array */ - static async validate(config: TacoClientConfig): Promise { + static async validate(config: AccessClientConfig): Promise { // First run fast validation const fastResult = this.validateFast(config); if (!fastResult.isValid) { diff --git a/packages/taco/src/client/client-config.ts b/packages/taco/src/access-client/config.ts similarity index 60% rename from packages/taco/src/client/client-config.ts rename to packages/taco/src/access-client/config.ts index faa225864..04487f248 100644 --- a/packages/taco/src/client/client-config.ts +++ b/packages/taco/src/access-client/config.ts @@ -1,8 +1,8 @@ /** - * TacoClient configuration types and utilities + * AccessClient configuration types and utilities * * This module contains all configuration interfaces, type definitions, and utility functions - * for configuring TacoClient instances with different blockchain client libraries (viem, ethers.js). + * for configuring AccessClient instances with different blockchain client libraries (viem, ethers.js). */ import { @@ -13,9 +13,9 @@ import { import type { ethers } from 'ethers'; /** - * Base configuration for TacoClient + * Base configuration for AccessClient */ -export interface TacoClientBaseConfig { +interface AccessClientBaseConfig { /** TACo domain name (e.g., 'lynx', 'tapir', 'mainnet') */ domain: DomainName; /** Ritual ID for the TACo operations */ @@ -25,9 +25,9 @@ export interface TacoClientBaseConfig { } /** - * Viem configuration for TacoClient + * Viem configuration for AccessClient */ -export interface TacoClientViemConfig extends TacoClientBaseConfig { +export interface AccessClientViemConfig extends AccessClientBaseConfig { /** Viem PublicClient for blockchain operations */ viemClient: PublicClient; /** Viem SignerAccount for signing operations */ @@ -35,9 +35,9 @@ export interface TacoClientViemConfig extends TacoClientBaseConfig { } /** - * Ethers configuration for TacoClient + * Ethers configuration for AccessClient */ -export interface TacoClientEthersConfig extends TacoClientBaseConfig { +export interface AccessClientEthersConfig extends AccessClientBaseConfig { /** Ethers Provider for blockchain operations */ ethersProvider: ethers.providers.Provider; /** Ethers Signer for signing operations */ @@ -45,28 +45,30 @@ export interface TacoClientEthersConfig extends TacoClientBaseConfig { } /** - * Union type for TacoClient configuration - supports both viem and ethers.js + * Union type for AccessClient configuration - supports both viem and ethers.js */ -export type TacoClientConfig = TacoClientViemConfig | TacoClientEthersConfig; +export type AccessClientConfig = + | AccessClientViemConfig + | AccessClientEthersConfig; /** * Type guard to check if config is viem-based - * @param config - TacoClient configuration to check + * @param config - AccessClient configuration to check * @returns True if the configuration is for viem client */ export function isViemConfig( - config: TacoClientConfig, -): config is TacoClientViemConfig { + config: AccessClientConfig, +): config is AccessClientViemConfig { return 'viemClient' in config && 'viemSignerAccount' in config; } /** * Type guard to check if config is ethers-based - * @param config - TacoClient configuration to check + * @param config - AccessClient configuration to check * @returns True if the configuration is for ethers client */ export function isEthersConfig( - config: TacoClientConfig, -): config is TacoClientEthersConfig { + config: AccessClientConfig, +): config is AccessClientEthersConfig { return 'ethersProvider' in config && 'ethersSigner' in config; } diff --git a/packages/taco/src/access-client/index.ts b/packages/taco/src/access-client/index.ts new file mode 100644 index 000000000..652b3f1c6 --- /dev/null +++ b/packages/taco/src/access-client/index.ts @@ -0,0 +1,2 @@ +export * from './client.js'; +export * from './config.js'; diff --git a/packages/taco/src/client/index.ts b/packages/taco/src/client/index.ts deleted file mode 100644 index 09edf70f1..000000000 --- a/packages/taco/src/client/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './client-config.js'; -export * from './taco-client.js'; diff --git a/packages/taco/src/index.ts b/packages/taco/src/index.ts index 120163a25..09b908491 100644 --- a/packages/taco/src/index.ts +++ b/packages/taco/src/index.ts @@ -14,8 +14,8 @@ export * as conditions from './conditions/index.js'; export { decrypt, encrypt, encryptWithPublicKey } from './taco.js'; export { - TacoClient, - type TacoClientConfig, - type TacoClientEthersConfig, - type TacoClientViemConfig, -} from './client/index.js'; + AccessClient, + type AccessClientConfig, + type AccessClientEthersConfig, + type AccessClientViemConfig, +} from './access-client/index.js'; diff --git a/packages/taco/test/client.test.ts b/packages/taco/test/access-client.test.ts similarity index 76% rename from packages/taco/test/client.test.ts rename to packages/taco/test/access-client.test.ts index 7aef7f748..a44e650f1 100644 --- a/packages/taco/test/client.test.ts +++ b/packages/taco/test/access-client.test.ts @@ -7,17 +7,17 @@ import { import { beforeAll, beforeEach, describe, expect, it } from 'vitest'; import { - TacoClient, - type TacoClientConfig, - type TacoClientEthersConfig, - type TacoClientViemConfig, + AccessClient, + type AccessClientConfig, + type AccessClientEthersConfig, + type AccessClientViemConfig, } from '../src'; -import { TacoConfigValidator } from '../src/client/config-validator'; +import { AccessConfigValidator } from '../src/access-client/config-validator'; -describe('TacoConfigValidator', () => { +describe('AccessConfigValidator', () => { describe('Domain Management', () => { it('should return all supported domain names', () => { - const domains = TacoConfigValidator.getSupportedDomains(); + const domains = AccessConfigValidator.getSupportedDomains(); expect(domains).toEqual(['lynx', 'tapir', 'mainnet']); }); @@ -27,7 +27,7 @@ describe('TacoConfigValidator', () => { [DOMAIN_NAMES.MAINNET, 'valid production domain'], // eslint-disable-next-line @typescript-eslint/no-unused-vars ])('should validate domain "%s" as %s', (domain: DomainName, _: string) => { - expect(TacoConfigValidator.isValidDomain(domain)).toBe(true); + expect(AccessConfigValidator.isValidDomain(domain)).toBe(true); }); it.each([ @@ -35,7 +35,7 @@ describe('TacoConfigValidator', () => { ['', 'empty domain name'], ['testnet', 'legacy domain key (not domain name)'], ])('should validate domain "%s" as %s', (domain: string) => { - expect(TacoConfigValidator.isValidDomain(domain as DomainName)).toBe( + expect(AccessConfigValidator.isValidDomain(domain as DomainName)).toBe( false, ); }); @@ -47,20 +47,20 @@ describe('TacoConfigValidator', () => { [42, 'custom mainnet ritual ID'], [999, 'large ritual ID for devnet'], ])('should validate ritual ID %d (%s)', (ritualId: number) => { - expect(TacoConfigValidator.isValidRitualId(ritualId)).toBe(true); + expect(AccessConfigValidator.isValidRitualId(ritualId)).toBe(true); }); it.each([ [-1, 'negative ritual ID'], [5.4, 'floating point ritual ID'], ])('should invalidate ritual ID %d (%s)', (ritualId: number) => { - expect(TacoConfigValidator.isValidRitualId(ritualId)).toBe(false); + expect(AccessConfigValidator.isValidRitualId(ritualId)).toBe(false); }); }); describe('Fast Configuration Validation', () => { - it('should pass validation for valid viem configuration', () => { - const result = TacoConfigValidator.validateFast({ + it('should create AccessClient with viem configuration', () => { + const result = AccessConfigValidator.validateFast({ domain: 'tapir', ritualId: 6, viemClient: fakeViemPublicClient(), @@ -72,7 +72,7 @@ describe('TacoConfigValidator', () => { }); it('should fail validation for invalid domain configuration', () => { - const result = TacoConfigValidator.validateFast({ + const result = AccessConfigValidator.validateFast({ domain: 'INVALID_DOMAIN' as DomainName, ritualId: 999, viemClient: fakeViemPublicClient(), @@ -84,11 +84,11 @@ describe('TacoConfigValidator', () => { }); it('should fail validation when domain is missing', () => { - const result = TacoConfigValidator.validateFast({ + const result = AccessConfigValidator.validateFast({ ritualId: 6, viemClient: fakeViemPublicClient(), viemSignerAccount: fakeViemAccount(), - } as TacoClientConfig); + } as AccessClientConfig); expect(result.isValid).toBe(false); expect(result.errors).toContain('The property `domain` is required'); @@ -96,23 +96,25 @@ describe('TacoConfigValidator', () => { }); }); -// Test helpers for accessing TacoClient's private static members -const getTacoClientStatics = () => - TacoClient as unknown as { initializationPromise: Promise | undefined }; +// Test helpers for accessing AccessClient's private static members +const getAccessClientStatics = () => + AccessClient as unknown as { + initializationPromise: Promise | undefined; + }; -const resetTacoClientStatics = () => { - delete (TacoClient as unknown as { initializationPromise?: Promise }) +const resetAccessClientStatics = () => { + delete (AccessClient as unknown as { initializationPromise?: Promise }) .initializationPromise; }; -describe('TacoClient', () => { +describe('AccessClient', () => { beforeAll(async () => { - // Ensure TacoClient is initialized before running tests - await TacoClient.initialize(); + // Ensure AccessClient is initialized before running tests + await AccessClient.initialize(); }); - let validViemConfig: TacoClientViemConfig; - let validEthersConfig: TacoClientEthersConfig; + let validViemConfig: AccessClientViemConfig; + let validEthersConfig: AccessClientEthersConfig; beforeEach(() => { validViemConfig = { @@ -133,21 +135,21 @@ describe('TacoClient', () => { describe('Client Construction', () => { it('should successfully create client with valid viem configuration', async () => { - const client = new TacoClient(validViemConfig); + const client = new AccessClient(validViemConfig); await client.validateConfig(); - expect(client).toBeInstanceOf(TacoClient); + expect(client).toBeInstanceOf(AccessClient); }); it('should successfully create client with valid ethers configuration', async () => { - const client = new TacoClient(validEthersConfig); + const client = new AccessClient(validEthersConfig); await client.validateConfig(); - expect(client).toBeInstanceOf(TacoClient); + expect(client).toBeInstanceOf(AccessClient); }); it('should throw error for invalid domain name', () => { expect( () => - new TacoClient({ + new AccessClient({ ...validViemConfig, domain: 'INVALID' as DomainName, }), @@ -157,7 +159,7 @@ describe('TacoClient', () => { it('should throw error for invalid ritual ID', () => { expect( () => - new TacoClient({ + new AccessClient({ ...validViemConfig, ritualId: -1, }), @@ -220,21 +222,21 @@ describe('TacoClient', () => { baseConfig === 'viem' ? validViemConfig : validEthersConfig; const invalidConfig = { ...baseConfigObject, ...configModifications }; - expect(() => new TacoClient(invalidConfig as TacoClientConfig)).toThrow( - expectedError, - ); + expect( + () => new AccessClient(invalidConfig as AccessClientConfig), + ).toThrow(expectedError); }, ); it('should throw error for mixed/invalid configuration types', () => { expect( () => - new TacoClient({ + new AccessClient({ domain: 'tapir', ritualId: 6, viemClient: fakeViemPublicClient(), ethersProvider: fakeProvider(), - } as unknown as TacoClientConfig), + } as unknown as AccessClientConfig), ).toThrow( 'Invalid configuration: Configuration must include either viem objects (viemClient + viemSignerAccount) or ethers objects (ethersProvider + ethersSigner)', ); @@ -258,7 +260,7 @@ describe('TacoClient', () => { ])( 'should return readonly configuration object for $description', ({ config, expectedProperties }) => { - const client = new TacoClient(config()); + const client = new AccessClient(config()); const clientConfig = client.getConfig(); // Verify common properties @@ -279,42 +281,42 @@ describe('TacoClient', () => { }); describe('Initialization Lifecycle', () => { - it('should trigger automatic TACo initialization on client construction', async () => { + it('should trigger automatic AccessClient initialization on client construction', async () => { // Reset static initialization state to verify automatic initialization - // occurs when TacoClient constructor is called - resetTacoClientStatics(); + // occurs when AccessClient constructor is called + resetAccessClientStatics(); - new TacoClient(validViemConfig); + new AccessClient(validViemConfig); // Initialization should be triggered by constructor - expect(getTacoClientStatics().initializationPromise).toBeDefined(); + expect(getAccessClientStatics().initializationPromise).toBeDefined(); }); - it('should share single initialization promise across multiple client instances', async () => { - new TacoClient(validViemConfig); - new TacoClient({ + it('should share initialization across multiple AccessClient instances', async () => { + new AccessClient(validViemConfig); + new AccessClient({ ...validViemConfig, ritualId: 27, // Different ritual ID }); // Both clients should share the same initialization promise - const initPromise1 = getTacoClientStatics().initializationPromise; - const initPromise2 = getTacoClientStatics().initializationPromise; + const initPromise1 = getAccessClientStatics().initializationPromise; + const initPromise2 = getAccessClientStatics().initializationPromise; expect(initPromise1).toBe(initPromise2); expect(initPromise1).toBeDefined(); }); it('should provide static initialize method with proper promise handling', async () => { - // Verify TacoClient.initialize() method exists and returns a promise - const initPromise = TacoClient.initialize(); + // Verify AccessClient.initialize() method exists and returns a promise + const initPromise = AccessClient.initialize(); expect(initPromise).toBeInstanceOf(Promise); // Wait for initialization to complete await initPromise; // Verify that repeated calls return the same promise (singleton pattern) - const initPromise2 = TacoClient.initialize(); + const initPromise2 = AccessClient.initialize(); expect(initPromise2).toBeInstanceOf(Promise); }); }); @@ -332,16 +334,16 @@ describe('TacoClient', () => { description: 'correct ethers configuration', }, ])('should pass full validation for $description', async ({ config }) => { - const result = TacoConfigValidator.validate(config()); + const result = AccessConfigValidator.validate(config()); expect(result).resolves.not.toThrow(); }); it('should detect and report missing blockchain dependencies', async () => { - const result = await TacoConfigValidator.validate({ + const result = await AccessConfigValidator.validate({ domain: 'tapir', ritualId: 6, // Missing blockchain objects - } as unknown as TacoClientConfig); + } as unknown as AccessClientConfig); expect(result.isValid).toBe(false); expect(result.errors).toContain( @@ -350,7 +352,7 @@ describe('TacoClient', () => { }); it('should detect and report invalid domain in full validation', async () => { - const result = await TacoConfigValidator.validate({ + const result = await AccessConfigValidator.validate({ ...validViemConfig, domain: 'INVALID' as DomainName, }); @@ -364,7 +366,7 @@ describe('TacoClient', () => { it('should detect and report invalid ritual ID during construction', async () => { expect( () => - new TacoClient({ + new AccessClient({ domain: 'tapir', ritualId: -5, viemClient: fakeViemPublicClient(), @@ -376,7 +378,7 @@ describe('TacoClient', () => { describe('Domain Support', () => { it('should provide domain name via getConfig method', () => { - const client = new TacoClient(validViemConfig); + const client = new AccessClient(validViemConfig); const config = client.getConfig(); expect(config.domain).toBe('tapir'); From f50ab074b287bff8237b05681c755cc222520ac9 Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 15 Oct 2025 08:28:00 +0200 Subject: [PATCH 96/97] refactor: rename type guards and improve AccessClient documentation clarity --- packages/taco/README.md | 2 +- .../integration-test/access-client.test.ts | 20 +++++++++---------- packages/taco/src/access-client/client.ts | 12 ++--------- .../src/access-client/config-validator.ts | 14 ++++++------- packages/taco/src/access-client/config.ts | 8 ++++---- 5 files changed, 24 insertions(+), 32 deletions(-) diff --git a/packages/taco/README.md b/packages/taco/README.md index 93b171328..5eeecb82f 100644 --- a/packages/taco/README.md +++ b/packages/taco/README.md @@ -141,7 +141,7 @@ For detailed viem documentation, see [VIEM_SUPPORT.md](./VIEM_SUPPORT.md). ## AccessClient - Object-Oriented Interface -For applications requiring multiple TACo operations or complex configuration management, the TACo SDK provides an optional object-oriented interface through the `AccessClient` class. This provides a stateful, higher-level abstraction over the functional API. +For applications requiring multiple TACo cryptographic operations or complex configuration management, the TACo SDK provides an optional object-oriented interface through the `AccessClient` class. This provides a stateful, higher-level abstraction over the functional API. The Object-Oriented API is fully backward compatible - you can use both APIs in the same application as needed. Except that the AccessClient has additional validations diff --git a/packages/taco/integration-test/access-client.test.ts b/packages/taco/integration-test/access-client.test.ts index fb7cfaeaf..dc9721f5a 100644 --- a/packages/taco/integration-test/access-client.test.ts +++ b/packages/taco/integration-test/access-client.test.ts @@ -161,20 +161,20 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( const condition = createTestCondition(); // Encrypt the message - const encrypted = await accessClient.encrypt(message, condition); - expect(encrypted).toBeInstanceOf(ThresholdMessageKit); - expect(encrypted.toBytes()).toBeInstanceOf(Uint8Array); + const messageKit = await accessClient.encrypt(message, condition); + expect(messageKit).toBeInstanceOf(ThresholdMessageKit); + expect(messageKit.toBytes()).toBeInstanceOf(Uint8Array); // Setup condition context for decryption const conditionContext = await setupConditionContext( - encrypted, + messageKit, objects, consumerSigner, ); // Test decryption with Uint8Array input const decryptedBytes = await accessClient.decrypt( - encrypted.toBytes(), + messageKit.toBytes(), conditionContext, ); const decryptedMessageString = fromBytes(decryptedBytes); @@ -182,7 +182,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( // Test decryption with MessageKit object input const decryptedBytes2 = await accessClient.decrypt( - encrypted, + messageKit, conditionContext, ); const decryptedMessageString2 = fromBytes(decryptedBytes2); @@ -211,23 +211,23 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( expect(dkgPublicKey).toBeDefined(); // Perform offline encryption with DKG public key - const encrypted = await accessClient.encryptWithPublicKey( + const messageKit = await accessClient.encryptWithPublicKey( message, condition, dkgPublicKey, ); - expect(encrypted).toBeInstanceOf(ThresholdMessageKit); + expect(messageKit).toBeInstanceOf(ThresholdMessageKit); // Setup condition context with consumer signer for decryption const conditionContext = await setupConditionContext( - encrypted, + messageKit, objects, consumerSigner, ); // Decrypt and verify const decryptedBytes = await accessClient.decrypt( - encrypted, + messageKit, conditionContext, ); const decryptedMessageString = fromBytes(decryptedBytes); diff --git a/packages/taco/src/access-client/client.ts b/packages/taco/src/access-client/client.ts index 2ebac181c..2743a74b2 100644 --- a/packages/taco/src/access-client/client.ts +++ b/packages/taco/src/access-client/client.ts @@ -1,11 +1,3 @@ -/** - * AccessClient - Object-Oriented Interface for TACo Operations - * - * Provides a higher-level, client-oriented abstraction over the functional TACo API. - * This complements the existing functional API and caters to developers who prefer - * class-based architectures. - */ - import { DkgPublicKey, initialize, @@ -24,9 +16,9 @@ import { } from './config.js'; /** - * AccessClient provides an object-oriented interface for TACo operations + * AccessClient provides an object-oriented interface for TACo cryptographic operations * - * This class encapsulates TACo configuration and provides simplified methods + * This class encapsulates TACo access-control configuration and provides simplified methods * for encryption and decryption operations. It handles configuration validation, * automatic WASM initialization, and provides enhanced error messages. * diff --git a/packages/taco/src/access-client/config-validator.ts b/packages/taco/src/access-client/config-validator.ts index cdf48b728..d929643d5 100644 --- a/packages/taco/src/access-client/config-validator.ts +++ b/packages/taco/src/access-client/config-validator.ts @@ -16,8 +16,8 @@ import type { PublicClient } from 'viem'; import { type AccessClientConfig, - isEthersConfig, - isViemConfig, + isEthersAccessClientConfig, + isViemAccessClientConfig, } from './index.js'; /** @@ -153,7 +153,7 @@ export class AccessConfigValidator { } // Validate blockchain client configuration - if (isViemConfig(config)) { + if (isViemAccessClientConfig(config)) { // Viem configuration if (!config.viemClient) { errors.push('viemClient is required for viem configuration'); @@ -161,7 +161,7 @@ export class AccessConfigValidator { if (!config.viemSignerAccount) { errors.push('viemSignerAccount is required for viem configuration'); } - } else if (isEthersConfig(config)) { + } else if (isEthersAccessClientConfig(config)) { // Ethers configuration if (!config.ethersProvider) { errors.push('ethersProvider is required for ethers configuration'); @@ -206,7 +206,7 @@ export class AccessConfigValidator { return { isValid: false, errors }; } - if (isViemConfig(config) && config.viemClient) { + if (isViemAccessClientConfig(config) && config.viemClient) { // Note: If viemClient.chain is undefined, we skip synchronous validation // Full validation with validateFull() will perform the network check const viemClient = config.viemClient as PublicClient; @@ -245,9 +245,9 @@ export class AccessConfigValidator { // Additional async provider validation let provider: PublicClient | ethers.providers.Provider | undefined; - if (isViemConfig(config)) { + if (isViemAccessClientConfig(config)) { provider = config.viemClient; - } else if (isEthersConfig(config)) { + } else if (isEthersAccessClientConfig(config)) { provider = config.ethersProvider; } diff --git a/packages/taco/src/access-client/config.ts b/packages/taco/src/access-client/config.ts index 04487f248..7ce37cd4c 100644 --- a/packages/taco/src/access-client/config.ts +++ b/packages/taco/src/access-client/config.ts @@ -54,9 +54,9 @@ export type AccessClientConfig = /** * Type guard to check if config is viem-based * @param config - AccessClient configuration to check - * @returns True if the configuration is for viem client + * @returns true if the configuration is for viem client */ -export function isViemConfig( +export function isViemAccessClientConfig( config: AccessClientConfig, ): config is AccessClientViemConfig { return 'viemClient' in config && 'viemSignerAccount' in config; @@ -65,9 +65,9 @@ export function isViemConfig( /** * Type guard to check if config is ethers-based * @param config - AccessClient configuration to check - * @returns True if the configuration is for ethers client + * @returns true if the configuration is for ethers client */ -export function isEthersConfig( +export function isEthersAccessClientConfig( config: AccessClientConfig, ): config is AccessClientEthersConfig { return 'ethersProvider' in config && 'ethersSigner' in config; From 251c3ea7d3d326f2489c5f8e455e33ab12da6a9e Mon Sep 17 00:00:00 2001 From: Muhammad Altabba <24407834+Muhammad-Altabba@users.noreply.github.com> Date: Wed, 15 Oct 2025 09:41:16 +0200 Subject: [PATCH 97/97] update console.warn and use ethers for ENS address validation and add failure case for unsupported networks --- packages/shared/src/viem/ethers-adapter.ts | 6 +++++- .../integration-test/viem-to-ethers-ens.test.ts | 15 ++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/shared/src/viem/ethers-adapter.ts b/packages/shared/src/viem/ethers-adapter.ts index 1793a4be7..25b22910d 100644 --- a/packages/shared/src/viem/ethers-adapter.ts +++ b/packages/shared/src/viem/ethers-adapter.ts @@ -17,7 +17,11 @@ function createNetworkish(chain: Chain): ethers.providers.Networkish { networkish.ensAddress = chain.contracts.ensRegistry.address; } else { console.warn( - `No ENS registry found on chain ${chain.name} (chainId=${chain.id}) at chain.contracts.ensRegistry.address. Resolving ENS will not work on the created ethers Provider.`, + `No ENS registry found on chain ${chain.name} (chainId=${chain.id}).\n` + + `With the current configuration, ENS resolution will not work on the created ethers Provider.\n` + + `To fix this either:\n` + + ` - Set chain.contracts.ensRegistry.address to the correct ENS registry address, or\n` + + ` - Or omit the \`chain\` data to allow automatic ENS registry detection from the provider.`, ); } diff --git a/packages/taco/integration-test/viem-to-ethers-ens.test.ts b/packages/taco/integration-test/viem-to-ethers-ens.test.ts index f02cf9c89..204af4faf 100644 --- a/packages/taco/integration-test/viem-to-ethers-ens.test.ts +++ b/packages/taco/integration-test/viem-to-ethers-ens.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test, vi } from 'vitest'; import { toEthersProvider } from '@nucypher/shared'; +import { ethers } from 'ethers'; import { createPublicClient, http } from 'viem'; import { mainnet } from 'viem/chains'; @@ -22,7 +23,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( expect(resolvedAddress).toBeTruthy(); // Currently vitalik.eth is "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045". // But it may change in the future. So we only check if it's a valid Ethereum address. - expect(resolvedAddress).toMatch(/^0x[a-fA-F0-9]{40}$/); // Valid Ethereum address format + expect(ethers.utils.isAddress(resolvedAddress)).toBe(true); // Valid Ethereum address format // Currently ethersProvider.network.ensAddress on mainnet is "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e". expect(ethersProvider.network.ensAddress).toBeTruthy(); @@ -60,7 +61,7 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( // Test actual ENS name resolution to verify functionality const resolvedAddress = await ethersProvider.resolveName('vitalik.eth'); expect(resolvedAddress).toBeTruthy(); - expect(resolvedAddress).toMatch(/^0x[a-fA-F0-9]{40}$/); // Valid Ethereum address format + expect(ethers.utils.isAddress(resolvedAddress)).toBe(true); // Valid Ethereum address format }, 15000); test('should warn when viem chain lacks ENS registry configuration', async () => { @@ -79,12 +80,16 @@ describe.skipIf(!process.env.RUNNING_IN_CI)( expect(consoleSpy).toHaveBeenCalledWith( expect.stringContaining('No ENS registry found on chain'), ); + // Clean up the spy + consoleSpy.mockRestore(); - // ENS address should not be set + // ENS address is expected to not be set expect(ethersProvider.network.ensAddress).toBeUndefined(); - // Clean up the spy - consoleSpy.mockRestore(); + // ENS operation is expected to fail + expect(ethersProvider.resolveName('vitalik.eth')).rejects.toThrow( + 'network does not support ENS', + ); }); }, );