diff --git a/cosmjs/v0.38.x/api-reference/amino.mdx b/cosmjs/v0.38.x/api-reference/amino.mdx new file mode 100644 index 000000000..71f9e5ce9 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/amino.mdx @@ -0,0 +1,260 @@ +--- +title: "@cosmjs/amino" +description: "Amino encoding, signing, and wallet management" +--- + +Provides Amino JSON encoding and signing capabilities for Cosmos SDK transactions. Essential for legacy signing, Ledger hardware wallets, and backwards compatibility. + +```bash +npm install @cosmjs/amino +``` + +## Secp256k1HdWallet + +HD wallet using BIP-39 mnemonic with Amino JSON signing. Implements `OfflineAminoSigner`. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `generate` | `length?: 12 \| 15 \| 18 \| 21 \| 24`, `options?: Partial` | `Promise` | +| `fromMnemonic` | `mnemonic: string`, `options?: Partial` | `Promise` | +| `deserialize` | `serialization: string`, `password: string` | `Promise` | +| `deserializeWithEncryptionKey` | `serialization: string`, `encryptionKey: Uint8Array` | `Promise` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getAccounts` | — | `Promise` | +| `signAmino` | `signerAddress: string`, `signDoc: StdSignDoc` | `Promise` | +| `serialize` | `password: string` | `Promise` | +| `serializeWithEncryptionKey` | `encryptionKey: Uint8Array`, `kdfConfiguration: KdfConfiguration` | `Promise` | + +### Instance Properties + +| Property | Type | +|----------|------| +| `mnemonic` | `string` | + +### Options + +```typescript +interface Secp256k1HdWalletOptions { + readonly bip39Password: string; // default: "" + readonly hdPaths: readonly HdPath[]; // default: [makeCosmoshubPath(0)] + readonly prefix: string; // default: "cosmos" +} +``` + + +### Usage + +```typescript +import { Secp256k1HdWallet, makeCosmoshubPath } from "@cosmjs/amino"; + +const wallet = await Secp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", + hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1)], +}); + +const [account1, account2] = await wallet.getAccounts(); +``` + +## Secp256k1Wallet + +Single-key wallet for Amino JSON signing. Implements `OfflineAminoSigner`. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `fromKey` (static) | `privkey: Uint8Array`, `prefix?: string` | `Promise` | +| `getAccounts` | — | `Promise` | +| `signAmino` | `signerAddress: string`, `signDoc: StdSignDoc` | `Promise` | + +## Address Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `pubkeyToAddress` | `pubkey: Pubkey`, `prefix: string` | `string` | +| `pubkeyToRawAddress` | `pubkey: Pubkey` | `Uint8Array` | +| `rawSecp256k1PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | +| `rawEd25519PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | +| `rawEthSecp256k1PubkeyToRawAddress` | `pubkeyRaw: Uint8Array` | `Uint8Array` | + +## Coin Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `coin` | `amount: number \| string`, `denom: string` | `Coin` | +| `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | +| `parseCoins` | `input: string` | `Coin[]` | +| `addCoins` | `lhs: Coin`, `rhs: Coin` | `Coin` | + +```typescript +import { coin, coins, parseCoins, addCoins } from "@cosmjs/amino"; + +const amount = coin(1000000, "uatom"); +const amounts = coins(500, "uatom"); +const parsed = parseCoins("1000uatom,500ustake"); +const total = addCoins(coin(100, "uatom"), coin(50, "uatom")); +``` + +## Pubkey Encoding + +| Function | Parameters | Returns | +|----------|------------|---------| +| `encodeSecp256k1Pubkey` | `pubkey: Uint8Array` | `Secp256k1Pubkey` | +| `encodeEd25519Pubkey` | `pubkey: Uint8Array` | `Ed25519Pubkey` | +| `encodeEthSecp256k1Pubkey` | `pubkey: Uint8Array` | `EthSecp256k1Pubkey` | +| `encodeAminoPubkey` | `pubkey: Pubkey` | `Uint8Array` | +| `decodeAminoPubkey` | `amino: Uint8Array` | `Pubkey` | +| `encodeBech32Pubkey` | `pubkey: Pubkey`, `prefix: string` | `string` | +| `decodeBech32Pubkey` | `bechEncoded: string` | `Pubkey` | + +## Signature Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `encodeSecp256k1Signature` | `pubkey: Uint8Array`, `signature: Uint8Array` | `StdSignature` | +| `encodeEthSecp256k1Signature` | `pubkey: Uint8Array`, `signature: Uint8Array` | `StdSignature` | +| `decodeSignature` | `signature: StdSignature` | `{ pubkey: Uint8Array; signature: Uint8Array }` | + +## Sign Document Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `makeSignDoc` | `msgs: readonly AminoMsg[]`, `fee: StdFee`, `chainId: string`, `memo: string \| undefined`, `accountNumber: number \| string`, `sequence: number \| string`, `timeout_height?: bigint` | `StdSignDoc` | +| `serializeSignDoc` | `signDoc: StdSignDoc` | `Uint8Array` | + +## Multisig + +| Function | Parameters | Returns | +|----------|------------|---------| +| `createMultisigThresholdPubkey` | `pubkeys: readonly SinglePubkey[]`, `threshold: number`, `nosort?: boolean` | `MultisigThresholdPubkey` | + +When `nosort` is `false` (default), pubkeys are sorted by their raw address to match the Cosmos SDK client behavior. Pass `true` to preserve the input order. + +## Key Types + +### Coin + +```typescript +interface Coin { + readonly denom: string; + readonly amount: string; +} +``` + +### StdFee + +```typescript +interface StdFee { + readonly amount: readonly Coin[]; + readonly gas: string; + readonly granter?: string; + readonly payer?: string; +} +``` + +### AminoMsg + +```typescript +interface AminoMsg { + readonly type: string; + readonly value: Record; +} +``` + + +### StdSignDoc + +```typescript +interface StdSignDoc { + readonly chain_id: string; + readonly account_number: string; + readonly sequence: string; + readonly fee: StdFee; + readonly msgs: readonly AminoMsg[]; + readonly memo: string; + readonly timeout_height?: string; +} +``` + + +### AccountData + +```typescript +interface AccountData { + readonly address: string; + readonly algo: Algo; + readonly pubkey: Uint8Array; +} +``` + +### OfflineAminoSigner + +```typescript +interface OfflineAminoSigner { + readonly getAccounts: () => Promise; + readonly signAmino: (signerAddress: string, signDoc: StdSignDoc) => Promise; +} +``` + +### AminoSignResponse + +```typescript +interface AminoSignResponse { + readonly signed: StdSignDoc; + readonly signature: StdSignature; +} +``` + +### StdSignature + +```typescript +interface StdSignature { + readonly pub_key: Pubkey; + readonly signature: string; +} +``` + +### Pubkey Types + +```typescript +interface Secp256k1Pubkey { + readonly type: "tendermint/PubKeySecp256k1"; + readonly value: string; +} + +interface Ed25519Pubkey { + readonly type: "tendermint/PubKeyEd25519"; + readonly value: string; +} + +interface EthSecp256k1Pubkey { + readonly type: "os/PubKeyEthSecp256k1"; + readonly value: string; +} + +interface MultisigThresholdPubkey { + readonly type: "tendermint/PubKeyMultisigThreshold"; + readonly value: { + readonly threshold: string; + readonly pubkeys: readonly SinglePubkey[]; + }; +} +``` + +## Other Exports + +| Function/Type | Purpose | +|---------------|---------| +| `makeCosmoshubPath(account)` | Creates HD path `m/44'/118'/0'/0/{account}` | +| `omitDefault(value)` | Omit protobuf default values | +| `isStdTx(value)` | Type guard for StdTx | +| `makeStdTx(signDoc, signature)` | Create StdTx from sign doc and signature | +| `extractKdfConfiguration(serialization)` | Extract KDF config from serialized wallet | +| `executeKdf(password, config)` | Execute key derivation function | +| `isEthereumSecp256k1Account(account)` | Check if account uses Ethereum secp256k1 | +| `getAminoPubkey(account)` | Get amino pubkey from account data | + diff --git a/cosmjs/v0.38.x/api-reference/cosmwasm.mdx b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx new file mode 100644 index 000000000..b35560cfa --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/cosmwasm.mdx @@ -0,0 +1,325 @@ +--- +title: "@cosmjs/cosmwasm" +description: "Client for CosmWasm smart contract chains" +--- + +Extends `@cosmjs/stargate` with CosmWasm-specific functionality for interacting with smart contracts on CosmWasm-enabled chains. + +```bash +npm install @cosmjs/cosmwasm +``` + + + The previous package name `@cosmjs/cosmwasm-stargate` is deprecated. Update your imports to use `@cosmjs/cosmwasm`. + + +## CosmWasmClient + +Read-only client for querying blockchain state and smart contracts. Provides common query methods plus contract-specific operations. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` | `endpoint: string \| HttpEndpoint`, `options?: CosmWasmClientOptions` | `Promise` | +| `create` | `cometClient: CometClient`, `options?: CosmWasmClientOptions` | `CosmWasmClient` | + +### Instance Methods — Chain Queries + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getChainId` | — | `Promise` | +| `getHeight` | — | `Promise` | +| `getAccount` | `searchAddress: string` | `Promise` | +| `getSequence` | `address: string` | `Promise` | +| `getBlock` | `height?: number` | `Promise` | +| `getBalance` | `address: string`, `searchDenom: string` | `Promise` | +| `getTx` | `id: string` | `Promise` | +| `searchTx` | `query: SearchTxQuery` | `Promise` | +| `broadcastTx` | `tx: Uint8Array`, `timeoutMs?: number`, `pollIntervalMs?: number` | `Promise` | +| `broadcastTxSync` | `tx: Uint8Array` | `Promise` | +| `disconnect` | — | `void` | + +### Instance Methods — Contract Queries + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getCodes` | — | `Promise` | +| `getCodeDetails` | `codeId: number` | `Promise` | +| `getContracts` | `codeId: number` | `Promise` | +| `getContractsByCreator` | `creator: string` | `Promise` | +| `getContract` | `address: string` | `Promise` | +| `getContractCodeHistory` | `address: string` | `Promise` | +| `queryContractRaw` | `address: string`, `key: Uint8Array` | `Promise` | +| `queryContractSmart` | `address: string`, `queryMsg: JsonObject` | `Promise` | + +### Usage + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); + +const info = await client.getContract("osmo1contractaddr..."); +const state = await client.queryContractSmart("osmo1contractaddr...", { + get_count: {}, +}); +const codes = await client.getCodes(); +const contracts = await client.getContracts(1); + +client.disconnect(); +``` + +## SigningCosmWasmClient + +Extends `CosmWasmClient` with transaction signing and smart contract management. Inherits all read-only methods above. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connectWithSigner` | `endpoint: string \| HttpEndpoint`, `signer: OfflineSigner`, `options?: SigningCosmWasmClientOptions` | `Promise` | +| `createWithSigner` | `cometClient: CometClient`, `signer: OfflineSigner`, `options?: SigningCosmWasmClientOptions` | `SigningCosmWasmClient` | +| `offline` | `signer: OfflineSigner`, `options?: SigningCosmWasmClientOptions` | `Promise` | + +### Instance Methods — Contract Operations + +| Method | Parameters | Returns | +|--------|------------|---------| +| `upload` | `senderAddress: string`, `wasmCode: Uint8Array`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `instantiatePermission?: AccessConfig` | `Promise` | +| `instantiate` | `senderAddress: string`, `codeId: number`, `msg: JsonObject`, `label: string`, `fee: StdFee \| "auto" \| number`, `options?: InstantiateOptions` | `Promise` | +| `instantiate2` | `senderAddress: string`, `codeId: number`, `salt: Uint8Array`, `msg: JsonObject`, `label: string`, `fee: StdFee \| "auto" \| number`, `options?: InstantiateOptions` | `Promise` | +| `execute` | `senderAddress: string`, `contractAddress: string`, `msg: JsonObject`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `funds?: readonly Coin[]` | `Promise` | +| `executeMultiple` | `senderAddress: string`, `instructions: readonly ExecuteInstruction[]`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `migrate` | `senderAddress: string`, `contractAddress: string`, `codeId: number`, `migrateMsg: JsonObject`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `updateAdmin` | `senderAddress: string`, `contractAddress: string`, `newAdmin: string`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `clearAdmin` | `senderAddress: string`, `contractAddress: string`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | + +### Instance Methods — Token Operations + +| Method | Parameters | Returns | +|--------|------------|---------| +| `sendTokens` | `senderAddress: string`, `recipientAddress: string`, `amount: readonly Coin[]`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `delegateTokens` | `delegatorAddress: string`, `validatorAddress: string`, `amount: Coin`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `undelegateTokens` | `delegatorAddress: string`, `validatorAddress: string`, `amount: Coin`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `withdrawRewards` | `delegatorAddress: string`, `validatorAddress: string`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | + +### Instance Methods — Signing + +| Method | Parameters | Returns | +|--------|------------|---------| +| `simulate` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `memo: string \| undefined` | `Promise` | +| `signAndBroadcast` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `timeoutHeight?: bigint` | `Promise` | +| `signAndBroadcastSync` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `timeoutHeight?: bigint` | `Promise` | +| `sign` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee`, `memo: string`, `explicitSignerData?: SignerData`, `timeoutHeight?: bigint` | `Promise` | + +### Usage + +```typescript +import fs from "node:fs"; +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { GasPrice } from "@cosmjs/stargate"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "osmo", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); + +// Upload +const wasmCode = fs.readFileSync("contract.wasm"); +const { codeId } = await client.upload(address, wasmCode, "auto"); + +// Instantiate +const { contractAddress } = await client.instantiate( + address, codeId, { count: 0 }, "My Contract", "auto", +); + +// Execute +const result = await client.execute( + address, contractAddress, { increment: {} }, "auto", +); + +// Query +const state = await client.queryContractSmart(contractAddress, { get_count: {} }); +``` + +## Key Types + +### Code + +```typescript +interface Code { + readonly id: number; + readonly creator: string; + readonly checksum: string; +} +``` + +### CodeDetails + +```typescript +interface CodeDetails extends Code { + readonly data: Uint8Array; +} +``` + +### Contract + +```typescript +interface Contract { + readonly address: string; + readonly codeId: number; + readonly creator: string; + readonly admin: string | undefined; + readonly label: string; + readonly ibcPortId: string | undefined; +} +``` + +### ContractCodeHistoryEntry + +```typescript +interface ContractCodeHistoryEntry { + readonly operation: "Genesis" | "Init" | "Migrate"; + readonly codeId: number; + readonly msg: JsonObject; +} +``` + +In the interfaces below, `logs` refers to the namespace re-exported from `@cosmjs/stargate` (`import { logs } from "@cosmjs/stargate"`), so `logs.Log[]` is the type `logs.Log` array, not a reference to the field of the same name. + +### UploadResult + +```typescript +interface UploadResult { + readonly checksum: string; + readonly originalSize: number; + readonly compressedSize: number; + readonly codeId: number; + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### InstantiateResult + +```typescript +interface InstantiateResult { + readonly contractAddress: string; + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### InstantiateOptions + +```typescript +interface InstantiateOptions { + readonly memo?: string; + readonly funds?: readonly Coin[]; + readonly admin?: string; +} +``` + +### ExecuteResult + +```typescript +interface ExecuteResult { + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### ExecuteInstruction + +```typescript +interface ExecuteInstruction { + contractAddress: string; + msg: JsonObject; + funds?: readonly Coin[]; +} +``` + +### MigrateResult + +```typescript +interface MigrateResult { + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### ChangeAdminResult + +```typescript +interface ChangeAdminResult { + readonly height: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK >= 0.50. Use `events` instead. */ + readonly logs: readonly logs.Log[]; + readonly gasWanted: bigint; + readonly gasUsed: bigint; +} +``` + +### SigningCosmWasmClientOptions + +```typescript +interface SigningCosmWasmClientOptions extends CosmWasmClientOptions { + readonly registry?: Registry; + readonly aminoTypes?: AminoTypes; + readonly broadcastTimeoutMs?: number; + readonly broadcastPollIntervalMs?: number; + readonly gasPrice?: GasPrice | DynamicGasPriceConfig; +} +``` + +## Helper Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `setupWasmExtension` | `base: QueryClient` | `WasmExtension` | +| `createWasmAminoConverters` | — | `AminoConverters` | +| `instantiate2Address` | `checksum: Uint8Array`, `creator: string`, `salt: Uint8Array`, `prefix: string` | `string` | +| `toBinary` | `obj: any` | `string` | +| `fromBinary` | `binary: string` | `any` | + +## Encode Objects + +| Type | `typeUrl` | +|------|-----------| +| `MsgStoreCodeEncodeObject` | `/cosmwasm.wasm.v1.MsgStoreCode` | +| `MsgInstantiateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract` | +| `MsgInstantiateContract2EncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract2` | +| `MsgExecuteContractEncodeObject` | `/cosmwasm.wasm.v1.MsgExecuteContract` | +| `MsgMigrateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgMigrateContract` | +| `MsgUpdateAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgUpdateAdmin` | +| `MsgClearAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgClearAdmin` | diff --git a/cosmjs/v0.38.x/api-reference/crypto.mdx b/cosmjs/v0.38.x/api-reference/crypto.mdx new file mode 100644 index 000000000..cdd915eae --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/crypto.mdx @@ -0,0 +1,248 @@ +--- +title: "@cosmjs/crypto" +description: "Cryptographic primitives for blockchain applications" +--- + +Low-level cryptographic library providing hashing, signing, HD key derivation, and encryption. Wraps `@noble/*` libraries with type safety and a consistent API. + +```bash +npm install @cosmjs/crypto +``` + +## Hashing + +### Convenience Functions + +| Function | Parameters | Returns | Output Size | +|----------|------------|---------|-------------| +| `sha256` | `data: Uint8Array` | `Uint8Array` | 32 bytes | +| `sha512` | `data: Uint8Array` | `Uint8Array` | 64 bytes | +| `keccak256` | `data: Uint8Array` | `Uint8Array` | 32 bytes | +| `ripemd160` | `data: Uint8Array` | `Uint8Array` | 20 bytes | + +### Incremental Hashing Classes + +For large data, use the class API with `update()` for incremental hashing: + +| Class | Methods | +|-------|---------| +| `Sha256` | `constructor(data?: Uint8Array)`, `update(data: Uint8Array): Sha256`, `digest(): Uint8Array` | +| `Sha512` | `constructor(data?: Uint8Array)`, `update(data: Uint8Array): Sha512`, `digest(): Uint8Array` | +| `Keccak256` | `constructor(data?: Uint8Array)`, `update(data: Uint8Array): Keccak256`, `digest(): Uint8Array` | +| `Ripemd160` | `constructor(data?: Uint8Array)`, `update(data: Uint8Array): Ripemd160`, `digest(): Uint8Array` | + +```typescript +import { sha256, Sha256, keccak256 } from "@cosmjs/crypto"; + +const hash = sha256(new Uint8Array([1, 2, 3])); + +const hasher = new Sha256(); +hasher.update(chunk1); +hasher.update(chunk2); +const incrementalHash = hasher.digest(); +``` + +### Hmac + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `hashFunctionConstructor: new () => HashFunction`, `originalKey: Uint8Array` | `Hmac` | +| `update` | `data: Uint8Array` | `Hmac` | +| `digest` | — | `Uint8Array` | + +```typescript +import { Hmac, Sha256 } from "@cosmjs/crypto"; + +const hmac = new Hmac(Sha256, key); +hmac.update(message); +const mac = hmac.digest(); +``` + +## Secp256k1 + +Elliptic curve operations for Cosmos, Bitcoin, and Ethereum signing. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `makeKeypair` (static) | `privkey: Uint8Array` | `Secp256k1Keypair` | +| `createSignature` (static) | `messageHash: Uint8Array`, `privkey: Uint8Array` | `ExtendedSecp256k1Signature` | +| `verifySignature` (static) | `signature: Secp256k1Signature`, `messageHash: Uint8Array`, `pubkey: Uint8Array` | `boolean` | +| `recoverPubkey` (static) | `signature: ExtendedSecp256k1Signature`, `messageHash: Uint8Array` | `Uint8Array` | +| `compressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | +| `uncompressPubkey` (static) | `pubkey: Uint8Array` | `Uint8Array` | +| `trimRecoveryByte` (static) | `signature: Uint8Array` | `Uint8Array` | + + +### Types + +```typescript +interface Secp256k1Keypair { + readonly pubkey: Uint8Array; + readonly privkey: Uint8Array; +} +``` + +The interface itself does not constrain the byte length of `pubkey`. When produced by `makeKeypair`, the key is always 65 bytes (uncompressed). Use `compressPubkey()` before passing it to Cosmos nodes, which expect 33-byte compressed keys. + +```typescript +import { Secp256k1, sha256 } from "@cosmjs/crypto"; + +const keypair = Secp256k1.makeKeypair(privkey); +const hash = sha256(message); +const signature = Secp256k1.createSignature(hash, keypair.privkey); +const valid = Secp256k1.verifySignature(signature, hash, keypair.pubkey); +``` + +## Secp256k1Signature / ExtendedSecp256k1Signature + +| Property | Type | Description | +|----------|------|-------------| +| `recovery` | `number` | 0–3 (extended only) | + +| Method | Parameters | Returns | Description | +|--------|------------|---------|-------------| +| `r(length?)` | `length?: number` | `Uint8Array` | r component, optionally zero-padded to `length` bytes | +| `s(length?)` | `length?: number` | `Uint8Array` | s component, optionally zero-padded to `length` bytes | +| `toFixedLength()` | — | `Uint8Array` | 64 bytes for `Secp256k1Signature`, 65 bytes for `ExtendedSecp256k1Signature` | +| `toDer()` | — | `Uint8Array` | DER-encoded signature | +| `fromFixedLength(data)` (static) | `data: Uint8Array` | `Secp256k1Signature` / `ExtendedSecp256k1Signature` | 64-byte input for base class, 65-byte for extended | +| `fromDer(data)` (static) | `data: Uint8Array` | `Secp256k1Signature` | Parse DER-encoded signature | + + +## Ed25519 + +Edwards-curve digital signature algorithm for fast, deterministic signing. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `makeKeypair` (static) | `privKey: Uint8Array` (32-byte seed) | `Promise` | +| `createSignature` (static) | `message: Uint8Array`, `keyPair: Ed25519Keypair` | `Promise` | +| `verifySignature` (static) | `signature: Uint8Array`, `message: Uint8Array`, `pubkey: Uint8Array` | `Promise` | + + + Ed25519 hashes the message internally. Do not pre-hash the message before signing. + + + +```typescript +import { Ed25519 } from "@cosmjs/crypto"; + +const keypair = await Ed25519.makeKeypair(seed32bytes); +const signature = await Ed25519.createSignature(message, keypair); +const valid = await Ed25519.verifySignature(signature, message, keypair.pubkey); +``` + +## BIP-39 Mnemonics + +### Bip39 + +| Method | Parameters | Returns | +|--------|------------|---------| +| `encode` (static) | `entropy: Uint8Array` | `EnglishMnemonic` | +| `decode` (static) | `mnemonic: EnglishMnemonic` | `Uint8Array` | +| `mnemonicToSeed` (static) | `mnemonic: EnglishMnemonic`, `password?: string` | `Promise` | + +### EnglishMnemonic + +Validates and wraps a BIP-39 English mnemonic string. Throws on invalid input. + +```typescript +import { Bip39, EnglishMnemonic, Random } from "@cosmjs/crypto"; + +const mnemonic = Bip39.encode(Random.getBytes(32)); // 24 words +const mnemonic12 = Bip39.encode(Random.getBytes(16)); // 12 words + +const validated = new EnglishMnemonic("your mnemonic words ..."); +const seed = await Bip39.mnemonicToSeed(validated); +``` + +## SLIP-10 HD Key Derivation + +### Slip10 + +| Method | Parameters | Returns | +|--------|------------|---------| +| `derivePath` (static) | `curve: Slip10Curve`, `seed: Uint8Array`, `path: HdPath` | `Slip10Result` | + +### Path Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `stringToPath` | `input: string` | `HdPath` | +| `pathToString` | `path: HdPath` | `string` | +| `slip10CurveFromString` | `curveString: string` | `Slip10Curve` | + +### Types + +```typescript +type HdPath = readonly Slip10RawIndex[]; + +interface Slip10Result { + readonly chainCode: Uint8Array; + readonly privkey: Uint8Array; +} + +enum Slip10Curve { + Secp256k1 = "Bitcoin seed", + Ed25519 = "ed25519 seed", +} +``` + + +```typescript +import { Slip10, Slip10Curve, stringToPath, Bip39, EnglishMnemonic } from "@cosmjs/crypto"; + +const mnemonic = new EnglishMnemonic("your mnemonic ..."); +const seed = await Bip39.mnemonicToSeed(mnemonic); +const hdPath = stringToPath("m/44'/118'/0'/0/0"); +const { privkey } = Slip10.derivePath(Slip10Curve.Secp256k1, seed, hdPath); +``` + +## Encryption + +### Xchacha20poly1305Ietf + +Authenticated encryption using XChaCha20-Poly1305. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `encrypt` (static) | `message: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Promise` | +| `decrypt` (static) | `ciphertext: Uint8Array`, `key: Uint8Array`, `nonce: Uint8Array` | `Promise` | + + +The constant `xchacha20NonceLength` is `24`. + +### Argon2id + + +`Argon2id` is deprecated and will be removed in a future release. Use `argon2id` from `@noble/hashes` directly instead. See [cosmos/cosmjs#1796](https://github.com/cosmos/cosmjs/issues/1796). + + +Password-based key derivation. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `execute` (static) | `password: string`, `salt: Uint8Array` (must be 16 bytes), `options: Argon2idOptions` | `Promise` | + +```typescript +interface Argon2idOptions { + readonly outputLength: number; + readonly opsLimit: number; + readonly memLimitKib: number; +} +``` + +## Random + +Cryptographically secure random number generation. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getBytes` (static) | `count: number` | `Uint8Array` | + +```typescript +import { Random } from "@cosmjs/crypto"; + +const nonce = Random.getBytes(24); +const privkey = Random.getBytes(32); +``` diff --git a/cosmjs/v0.38.x/api-reference/encoding.mdx b/cosmjs/v0.38.x/api-reference/encoding.mdx new file mode 100644 index 000000000..5ceaff828 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/encoding.mdx @@ -0,0 +1,100 @@ +--- +title: "@cosmjs/encoding" +description: "Encoding utilities for hex, base64, bech32, UTF-8, and more" +--- + +Cross-platform encoding and decoding utilities that work in both browsers and Node.js without relying on the Node.js `Buffer` class. + +```bash +npm install @cosmjs/encoding +``` + +## Hex + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toHex` | `data: Uint8Array` | `string` | +| `fromHex` | `hexstring: string` | `Uint8Array` | + +```typescript +import { toHex, fromHex } from "@cosmjs/encoding"; + +const hex = toHex(new Uint8Array([255, 0, 128])); // "ff0080" +const bytes = fromHex("ff0080"); // Uint8Array [255, 0, 128] +``` + +## Base64 + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toBase64` | `data: Uint8Array` | `string` | +| `fromBase64` | `base64String: string` | `Uint8Array` | + +```typescript +import { toBase64, fromBase64 } from "@cosmjs/encoding"; + +const b64 = toBase64(new Uint8Array([1, 2, 3])); // "AQID" +const bytes = fromBase64("AQID"); // Uint8Array [1, 2, 3] +``` + +## Bech32 + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toBech32` | `prefix: string`, `data: Uint8Array`, `limit?: number` | `string` | +| `fromBech32` | `address: string`, `limit?: number` (default `Infinity`) | `{ readonly prefix: string; readonly data: Uint8Array }` | +| `normalizeBech32` | `address: string` | `string` | + +```typescript +import { toBech32, fromBech32 } from "@cosmjs/encoding"; + +const address = toBech32("cosmos", addressBytes); +const { prefix, data } = fromBech32("cosmos1abc..."); +``` + +## UTF-8 + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toUtf8` | `str: string` | `Uint8Array` | +| `fromUtf8` | `data: Uint8Array`, `lossy?: boolean` (default `false`) | `string` | + +`fromUtf8` throws on invalid UTF-8 sequences by default. Pass `lossy: true` to replace invalid bytes with the Unicode replacement character (`U+FFFD`). + +```typescript +import { toUtf8, fromUtf8 } from "@cosmjs/encoding"; + +const bytes = toUtf8("hello world"); +const str = fromUtf8(bytes); // "hello world" +``` + +## ASCII + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toAscii` | `input: string` | `Uint8Array` | +| `fromAscii` | `data: Uint8Array` | `string` | + +Throws if the input contains characters outside the printable ASCII range (code points below 0x20 or above 0x7E). + +## RFC 3339 Timestamps + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toRfc3339` | `date: Date \| ReadonlyDate` | `string` | +| `fromRfc3339` | `str: string` | `Date` | + +```typescript +import { toRfc3339, fromRfc3339 } from "@cosmjs/encoding"; + +const timestamp = toRfc3339(new Date()); // "2024-01-15T10:30:00.000Z" +const date = fromRfc3339("2024-01-15T10:30:00.000Z"); +``` + +## Uint8Array Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `fixUint8Array` | `source: Uint8Array` | `Uint8Array` | + +Ensures a value is a proper `Uint8Array` instance with a direct `ArrayBuffer` backing, which is necessary in some cross-environment scenarios (e.g. when `Uint8Array` subclass instances from protobuf libraries need normalization). diff --git a/cosmjs/v0.38.x/api-reference/faucet-client.mdx b/cosmjs/v0.38.x/api-reference/faucet-client.mdx new file mode 100644 index 000000000..d6921ea7a --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/faucet-client.mdx @@ -0,0 +1,29 @@ +--- +title: "@cosmjs/faucet-client" +description: "HTTP client for the CosmJS token faucet" +--- + +Simple HTTP client for requesting tokens from a `@cosmjs/faucet` server. Useful for testnet development. + +```bash +npm install @cosmjs/faucet-client +``` + +## FaucetClient + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `baseUrl: string` | `FaucetClient` | +| `credit` | `address: string`, `denom: string` | `Promise` | + +### Usage + +```typescript +import { FaucetClient } from "@cosmjs/faucet-client"; + +const faucet = new FaucetClient("http://localhost:8000"); + +await faucet.credit("cosmos1youraddress...", "uatom"); +``` + +The `credit` method sends a POST to `{baseUrl}/credit`. It will throw on network errors (e.g. unreachable host) but does not inspect the HTTP response status code for faucet-level errors such as cooldowns or insufficient funds. diff --git a/cosmjs/v0.38.x/api-reference/json-rpc.mdx b/cosmjs/v0.38.x/api-reference/json-rpc.mdx new file mode 100644 index 000000000..03efef3a3 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/json-rpc.mdx @@ -0,0 +1,134 @@ +--- +title: "@cosmjs/json-rpc" +description: "JSON-RPC 2.0 protocol implementation" +--- + +JSON-RPC 2.0 protocol implementation used by `@cosmjs/tendermint-rpc` for HTTP and WebSocket RPC communication. + +```bash +npm install @cosmjs/json-rpc +``` + +## JsonRpcClient + +Sends JSON-RPC requests over a generic messaging connection. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `connection: SimpleMessagingConnection` | `JsonRpcClient` | +| `run` | `request: JsonRpcRequest` | `Promise` | + +```typescript +interface SimpleMessagingConnection { + readonly responseStream: Stream; + readonly sendRequest: (request: Request) => void; +} +``` + +`JsonRpcClient` uses the instantiation `SimpleMessagingConnection`: the stream emits already-parsed responses, and `sendRequest` receives structured request objects (not strings). + +## Parsing Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `parseJsonRpcResponse` | `data: unknown` | `JsonRpcResponse` | +| `parseJsonRpcSuccessResponse` | `data: unknown` | `JsonRpcSuccessResponse` | +| `parseJsonRpcErrorResponse` | `data: unknown` | `JsonRpcErrorResponse` | +| `parseJsonRpcRequest` | `data: unknown` | `JsonRpcRequest` | +| `parseJsonRpcId` | `data: unknown` | `JsonRpcId \| null` (returns `null` if no valid id is present) | + +## Type Guards + +| Function | Parameters | Returns | +|----------|------------|---------| +| `isJsonRpcSuccessResponse` | `response: JsonRpcResponse` | `response is JsonRpcSuccessResponse` | +| `isJsonRpcErrorResponse` | `response: JsonRpcResponse` | `response is JsonRpcErrorResponse` | + +```typescript +import { parseJsonRpcResponse, isJsonRpcErrorResponse } from "@cosmjs/json-rpc"; + +const response = parseJsonRpcResponse(data); + +if (isJsonRpcErrorResponse(response)) { + console.error("RPC error:", response.error.message); +} else { + console.info("Result:", response.result); +} +``` + +## ID Generation + +| Function | Parameters | Returns | +|----------|------------|---------| +| `makeJsonRpcId` | — | `number` (assignable to `JsonRpcId`) | + +## Key Types + +### JsonRpcRequest + +```typescript +interface JsonRpcRequest { + readonly jsonrpc: "2.0"; + readonly id: JsonRpcId; + readonly method: string; + readonly params: JsonCompatibleArray | JsonCompatibleDictionary; +} +``` + + +### JsonRpcSuccessResponse + +```typescript +interface JsonRpcSuccessResponse { + readonly jsonrpc: "2.0"; + readonly id: JsonRpcId; + readonly result: any; +} +``` + +### JsonRpcErrorResponse + +```typescript +interface JsonRpcErrorResponse { + readonly jsonrpc: "2.0"; + readonly id: JsonRpcId | null; + readonly error: JsonRpcError; +} +``` + + +### JsonRpcError + +```typescript +interface JsonRpcError { + readonly code: number; + readonly message: string; + readonly data?: JsonCompatibleValue; +} +``` + + +### JsonRpcId + +```typescript +type JsonRpcId = number | string; +``` + +### JsonRpcResponse + +```typescript +type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse; +``` + +## Error Codes + +The `jsonRpcCode` object provides standard JSON-RPC 2.0 error codes: + +| Code | Constant | Description | +|------|----------|-------------| +| -32700 | `parseError` | Invalid JSON | +| -32600 | `invalidRequest` | JSON is not a valid request | +| -32601 | `methodNotFound` | Method does not exist | +| -32602 | `invalidParams` | Invalid method parameters | +| -32603 | `internalError` | Internal JSON-RPC error | +| -32000 | `jsonRpcCode.serverError.default` | Server error (default slot of the `-32000` to `-32099` implementation-defined range) | diff --git a/cosmjs/v0.38.x/api-reference/ledger-amino.mdx b/cosmjs/v0.38.x/api-reference/ledger-amino.mdx new file mode 100644 index 000000000..f7bccc5a4 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/ledger-amino.mdx @@ -0,0 +1,92 @@ +--- +title: "@cosmjs/ledger-amino" +description: "Ledger hardware wallet integration for Amino signing" +--- + +Provides Ledger hardware wallet support for Amino transaction signing. Implements the `OfflineAminoSigner` interface, making it compatible with `SigningStargateClient` and `SigningCosmWasmClient`. + +```bash +npm install @cosmjs/ledger-amino +``` + + + Requires the Cosmos app installed on your Ledger device and a transport library like `@ledgerhq/hw-transport-webusb` (browser) or `@ledgerhq/hw-transport-node-hid` (Node.js). + + +## LedgerSigner + +Implements `OfflineAminoSigner` using a Ledger hardware wallet. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `transport: Transport`, `options?: LedgerConnectorOptions` | `LedgerSigner` | +| `getAccounts` | — | `Promise` | +| `signAmino` | `signerAddress: string`, `signDoc: StdSignDoc` | `Promise` | +| `showAddress` | `path?: HdPath` | `Promise` (asks the device to display an address for user confirmation) | + +### Options + +```typescript +interface LedgerConnectorOptions { + readonly hdPaths?: readonly HdPath[]; + readonly prefix?: string; + readonly testModeAllowed?: boolean; + readonly ledgerAppName?: string; + readonly minLedgerAppVersion?: string; +} +``` + +### Usage + +```typescript +import TransportWebUSB from "@ledgerhq/hw-transport-webusb"; +import { LedgerSigner } from "@cosmjs/ledger-amino"; +import { makeCosmoshubPath } from "@cosmjs/amino"; +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const transport = await TransportWebUSB.create(); +const signer = new LedgerSigner(transport, { + hdPaths: [makeCosmoshubPath(0)], + prefix: "cosmos", +}); + +const [{ address }] = await signer.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + signer, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); +``` + +## LedgerConnector + +Low-level interface for direct communication with the Cosmos Ledger app. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `transport: Transport`, `options?: LedgerConnectorOptions` | `LedgerConnector` | +| `getCosmosAppVersion` | — | `Promise` | +| `getPubkey` | `hdPath?: HdPath` | `Promise` | +| `getPubkeys` | — | `Promise` (one per configured HD path) | +| `getCosmosAddress` | `pubkey?: Uint8Array` | `Promise` | +| `sign` | `message: Uint8Array`, `hdPath?: HdPath` | `Promise` | +| `showAddress` | `hdPath?: HdPath` | `Promise` | + +### Types + +```typescript +interface AddressAndPubkey { + readonly address: string; + readonly pubkey: Secp256k1Pubkey; +} +``` + +When constructing `LedgerConnector` without options, these defaults apply: `ledgerAppName` is `"Cosmos"`, `minLedgerAppVersion` is `"1.5.3"`, `testModeAllowed` is `false`, `prefix` is `"cosmos"`, and `hdPaths` defaults to `[makeCosmoshubPath(0)]`. diff --git a/cosmjs/v0.38.x/api-reference/math.mdx b/cosmjs/v0.38.x/api-reference/math.mdx new file mode 100644 index 000000000..c435028ed --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/math.mdx @@ -0,0 +1,132 @@ +--- +title: "@cosmjs/math" +description: "Safe integer and decimal arithmetic" +--- + +Provides safe integer types and arbitrary-precision decimal arithmetic to prevent JavaScript number precision issues when handling token amounts. + +```bash +npm install @cosmjs/math +``` + +## Uint32 + +32-bit unsigned integer. Range: 0 to 4,294,967,295. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `input: number` | `Uint32` | +| `fromString` (static) | `str: string` | `Uint32` | +| `fromBytes` (static) | `bytes: ArrayLike`, `endianness?: "be" \| "le"` (default `"be"`) | `Uint32` | +| `toBytesBigEndian` | — | `Uint8Array` | +| `toBytesLittleEndian` | — | `Uint8Array` | +| `toNumber` | — | `number` | +| `toString` | — | `string` | +| `toBigInt` | — | `bigint` | + +## Uint53 + +53-bit unsigned integer (JavaScript safe integer range). Range: 0 to 9,007,199,254,740,991. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `input: number` | `Uint53` | +| `fromString` (static) | `str: string` | `Uint53` | +| `toNumber` | — | `number` | +| `toString` | — | `string` | +| `toBigInt` | — | `bigint` | + +## Int53 + +53-bit signed integer. Range: -9,007,199,254,740,991 to 9,007,199,254,740,991. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `input: number` | `Int53` | +| `fromString` (static) | `str: string` | `Int53` | +| `toNumber` | — | `number` | +| `toString` | — | `string` | +| `toBigInt` | — | `bigint` | + +## Uint64 + +64-bit unsigned integer. Uses `bigint` internal representation for values beyond JavaScript's safe integer range. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `fromString` (static) | `str: string` | `Uint64` | +| `fromNumber` (static) | `input: number` (must be a safe integer) | `Uint64` | +| `fromBytes` (static) | `bytes: ArrayLike`, `endianness?: "be" \| "le"` (default `"be"`) | `Uint64` | +| `toBytesBigEndian` | — | `Uint8Array` | +| `toBytesLittleEndian` | — | `Uint8Array` | +| `toNumber` | — | `number` | +| `toString` | — | `string` | +| `toBigInt` | — | `bigint` | + +```typescript +import { Uint64 } from "@cosmjs/math"; + +const large = Uint64.fromString("9007199254740993"); +large.toString(); // "9007199254740993" +``` + +## Decimal + +Arbitrary-precision decimal type for safe financial calculations. Internally stores values as integer atomics with a fixed fractional digit count. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `fromAtomics` | `atomics: string \| bigint`, `fractionalDigits: number` | `Decimal` | +| `fromUserInput` | `input: string`, `fractionalDigits: number` | `Decimal` | +| `zero` | `fractionalDigits: number` | `Decimal` | +| `one` | `fractionalDigits: number` | `Decimal` | +| `compare` | `a: Decimal`, `b: Decimal` | `number` (< 0 if a < b, > 0 if a > b, 0 if equal) | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `plus` | `other: Decimal` | `Decimal` | +| `minus` | `other: Decimal` | `Decimal` | +| `multiply` | `b: Uint32 \| Uint53 \| Uint64` | `Decimal` | +| `floor` | — | `Decimal` | +| `ceil` | — | `Decimal` | +| `neg` | — | `Decimal` | +| `abs` | — | `Decimal` | +| `isNegative` | — | `boolean` | +| `adjustFractionalDigits` | `newFractionalDigits: number` | `Decimal` | +| `equals` | `other: Decimal` | `boolean` | +| `isLessThan` | `other: Decimal` | `boolean` | +| `isLessThanOrEqual` | `other: Decimal` | `boolean` | +| `isGreaterThan` | `other: Decimal` | `boolean` | +| `isGreaterThanOrEqual` | `other: Decimal` | `boolean` | +| `toString` | — | `string` | +| `toFloatApproximation` | — | `number` | + +### Instance Properties + +| Property | Type | Description | +|----------|------|-------------| +| `atomics` | `string` | Value in smallest unit | +| `fractionalDigits` | `number` | Number of decimal places | + +### Usage + +```typescript +import { Decimal, Uint32 } from "@cosmjs/math"; + +const amount = Decimal.fromAtomics("1000000", 6); +amount.toString(); // "1" +amount.atomics; // "1000000" + +const fee = Decimal.fromAtomics("5000", 6); +const total = amount.plus(fee); +total.toString(); // "1.005" +total.atomics; // "1005000" + +const quantity = new Uint32(3); +const cost = amount.multiply(quantity); +cost.toString(); // "3" +``` diff --git a/cosmjs/v0.38.x/api-reference/proto-signing.mdx b/cosmjs/v0.38.x/api-reference/proto-signing.mdx new file mode 100644 index 000000000..c8de1d612 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/proto-signing.mdx @@ -0,0 +1,198 @@ +--- +title: "@cosmjs/proto-signing" +description: "Protobuf-based transaction signing for Cosmos SDK 0.40+" +--- + +Provides Protobuf Direct signing mode for modern Cosmos SDK chains. This is the preferred signing method for new applications. + +```bash +npm install @cosmjs/proto-signing +``` + +## DirectSecp256k1HdWallet + +HD wallet using BIP-39 mnemonic with Protobuf Direct signing. Implements `OfflineDirectSigner`. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `generate` | `length?: 12 \| 15 \| 18 \| 21 \| 24`, `options?: Partial` | `Promise` | +| `fromMnemonic` | `mnemonic: string`, `options?: Partial` | `Promise` | +| `deserialize` | `serialization: string`, `password: string` | `Promise` | +| `deserializeWithEncryptionKey` | `serialization: string`, `encryptionKey: Uint8Array` | `Promise` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getAccounts` | — | `Promise` | +| `signDirect` | `signerAddress: string`, `signDoc: SignDoc` | `Promise` | +| `serialize` | `password: string` | `Promise` | +| `serializeWithEncryptionKey` | `encryptionKey: Uint8Array`, `kdfConfiguration: KdfConfiguration` | `Promise` | + +### Instance Properties + +| Property | Type | +|----------|------| +| `mnemonic` | `string` | + +### Options + +```typescript +interface DirectSecp256k1HdWalletOptions { + readonly bip39Password: string; // default: "" + readonly hdPaths: readonly HdPath[]; // default: [makeCosmoshubPath(0)] + readonly prefix: string; // default: "cosmos" +} +``` + + +### Usage + +```typescript +import { DirectSecp256k1HdWallet, makeCosmoshubPath } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.generate(24, { prefix: "cosmos" }); +const [{ address, pubkey }] = await wallet.getAccounts(); + +const restored = await DirectSecp256k1HdWallet.fromMnemonic(wallet.mnemonic, { + prefix: "osmo", + hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1)], +}); +``` + +## DirectSecp256k1Wallet + +Single-key wallet for Protobuf Direct signing. Implements `OfflineDirectSigner`. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `fromKey` (static) | `privkey: Uint8Array`, `prefix?: string` | `Promise` | +| `getAccounts` | — | `Promise` | +| `signDirect` | `address: string`, `signDoc: SignDoc` | `Promise` | + +## DirectEthSecp256k1HdWallet + +HD wallet using Ethereum's secp256k1 curve for chains with EVM compatibility. Supports `generate`, `fromMnemonic`, `getAccounts`, and `signDirect` like `DirectSecp256k1HdWallet`, but uses the Ethereum HD path `m/44'/60'/0'/0/0` by default and Keccak-256 for address derivation. Does not support wallet serialization (`serialize`/`deserialize`). + +## DirectEthSecp256k1Wallet + +Single-key wallet using Ethereum's secp256k1 curve. Supports `fromKey`, `getAccounts`, and `signDirect` like `DirectSecp256k1Wallet`, but reports `algo: "eth_secp256k1"` and uses Keccak-256 for signing. + +## Registry + +Maps type URLs to protobuf codec implementations for encoding and decoding messages. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `customTypes?: Iterable<[string, GeneratedType]>` | `Registry` | +| `register` | `typeUrl: string`, `type: GeneratedType` | `void` | +| `lookupType` | `typeUrl: string` | `GeneratedType \| undefined` | +| `encode` | `encodeObject: EncodeObject` | `Uint8Array` | +| `encodeAsAny` | `encodeObject: EncodeObject` | `Any` | +| `encodeTxBody` | `txBodyFields: TxBodyValue` | `Uint8Array` | +| `decode` | `decodeObject: DecodeObject` | `any` | +| `decodeTxBody` | `txBody: Uint8Array` | `TxBody` | + +### Usage + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; +import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/my.custom.MsgCustom", MsgCustom); + +const encoded = registry.encode({ + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ + fromAddress: "cosmos1sender...", + toAddress: "cosmos1recipient...", + amount: [{ denom: "uatom", amount: "1000" }], + }), +}); +``` + +## Key Types + +### EncodeObject + +```typescript +interface EncodeObject { + readonly typeUrl: string; + readonly value: any; +} +``` + +### DecodeObject + +```typescript +interface DecodeObject { + readonly typeUrl: string; + readonly value: Uint8Array; +} +``` + +### TxBodyEncodeObject + +```typescript +interface TxBodyEncodeObject extends EncodeObject { + readonly typeUrl: "/cosmos.tx.v1beta1.TxBody"; + readonly value: TxBodyValue; +} +``` + +### AccountData + +```typescript +interface AccountData { + readonly address: string; + readonly algo: Algo; + readonly pubkey: Uint8Array; +} +``` + +### OfflineDirectSigner + +```typescript +interface OfflineDirectSigner { + readonly getAccounts: () => Promise; + readonly signDirect: (signerAddress: string, signDoc: SignDoc) => Promise; +} +``` + +### OfflineSigner + +```typescript +type OfflineSigner = OfflineAminoSigner | OfflineDirectSigner; +``` + +### DecodedTxRaw + +```typescript +interface DecodedTxRaw { + readonly authInfo: AuthInfo; + readonly body: TxBody; + readonly signatures: readonly Uint8Array[]; +} +``` + +## Helper Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `makeAuthInfoBytes` | `signers: ReadonlyArray<{ pubkey: Any; sequence: bigint \| number }>`, `feeAmount: readonly Coin[]`, `gasLimit: number`, `feeGranter: string \| undefined`, `feePayer: string \| undefined`, `signMode?: SignMode` | `Uint8Array` | +| `makeSignDoc` | `bodyBytes: Uint8Array`, `authInfoBytes: Uint8Array`, `chainId: string`, `accountNumber: number` | `SignDoc` | +| `makeSignBytes` | `signDoc: SignDoc` | `Uint8Array` | +| `decodeTxRaw` | `tx: Uint8Array` | `DecodedTxRaw` | +| `encodePubkey` | `pubkey: Pubkey` | `Any` | +| `decodePubkey` | `pubkey: Any` | `Pubkey` | +| `decodeOptionalPubkey` | `pubkey: Any \| null \| undefined` | `Pubkey \| null` | +| `makeCosmoshubPath` | `account: number` | `HdPath` | +| `coin` | `amount: number \| string`, `denom: string` | `Coin` | +| `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | +| `parseCoins` | `input: string` | `Coin[]` | +| `extractKdfConfiguration` | `serialization: string` | `KdfConfiguration` | +| `executeKdf` | `password: string`, `configuration: KdfConfiguration` | `Promise` | diff --git a/cosmjs/v0.38.x/api-reference/socket.mdx b/cosmjs/v0.38.x/api-reference/socket.mdx new file mode 100644 index 000000000..c736c99de --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/socket.mdx @@ -0,0 +1,106 @@ +--- +title: "@cosmjs/socket" +description: "Cross-platform WebSocket client utilities" +--- + +Low-level WebSocket client for browser and Node.js environments. Used internally by `@cosmjs/tendermint-rpc` for WebSocket connections and streaming subscriptions. + +```bash +npm install @cosmjs/socket +``` + +## SocketWrapper + +Thin abstraction over the native WebSocket API that works in both browsers and Node.js. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `url: string`, `messageHandler: (event: SocketWrapperMessageEvent) => void`, `errorHandler: (event: SocketWrapperErrorEvent) => void`, `openHandler?: () => void`, `closeHandler?: (event: SocketWrapperCloseEvent) => void`, `timeout?: number` | `SocketWrapper` | +| `connect` | — | `void` | +| `disconnect` | — | `void` | +| `send` | `data: string` | `Promise` | + +| Property | Type | +|----------|------| +| `connected` | `Promise` (resolves once the socket is open) | + +## StreamingSocket + +WebSocket client that exposes received messages as an xstream `Stream`. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `url: string`, `timeout?: number` | `StreamingSocket` | +| `connect` | — | `void` | +| `disconnect` | — | `void` | +| `send` | `data: string` | `Promise` | + +| Property | Type | +|----------|------| +| `events` | `Stream` | +| `connected` | `Promise` | + +## ReconnectingSocket + +WebSocket client with automatic reconnection logic. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `url: string`, `timeout?: number`, `reconnectedHandler?: () => void` | `ReconnectingSocket` | +| `connect` | — | `void` | +| `disconnect` | — | `void` | +| `queueRequest` | `request: string` | `void` | + +| Property | Type | +|----------|------| +| `events` | `Stream` | +| `connectionStatus` | `ValueAndUpdates` | + +## QueueingStreamingSocket + +WebSocket that queues outgoing messages until the connection is established. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `url: string`, `timeout?: number`, `reconnectedHandler?: () => void` | `QueueingStreamingSocket` | +| `connect` | — | `void` | +| `disconnect` | — | `void` | +| `queueRequest` | `request: string` | `void` | +| `getQueueLength` | — | `number` | + +| Property | Type | +|----------|------| +| `events` | `Stream` | +| `connectionStatus` | `ValueAndUpdates` | + +## Event Types + +```typescript +interface SocketWrapperMessageEvent { + readonly data: string; + readonly type: string; +} + +interface SocketWrapperErrorEvent { + readonly isTrusted?: boolean; + readonly type?: string; + readonly message?: string; +} + +interface SocketWrapperCloseEvent { + readonly wasClean: boolean; + readonly code: number; +} +``` + +## ConnectionStatus + +```typescript +enum ConnectionStatus { + Unconnected, // 0 + Connecting, // 1 + Connected, // 2 + Disconnected, // 3 +} +``` + diff --git a/cosmjs/v0.38.x/api-reference/stargate.mdx b/cosmjs/v0.38.x/api-reference/stargate.mdx new file mode 100644 index 000000000..cd88d0695 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/stargate.mdx @@ -0,0 +1,332 @@ +--- +title: "@cosmjs/stargate" +description: "High-level client for Cosmos SDK 0.40+ (Stargate) chains" +--- + +The primary client library for interacting with Cosmos SDK chains. Provides read-only querying via `StargateClient` and transaction signing/broadcasting via `SigningStargateClient`. + +```bash +npm install @cosmjs/stargate +``` + +## StargateClient + +Read-only client for querying blockchain state. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` | `endpoint: string \| HttpEndpoint`, `options?: StargateClientOptions` | `Promise` | +| `create` | `cometClient: CometClient`, `options?: StargateClientOptions` | `StargateClient` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `getChainId` | — | `Promise` | +| `getHeight` | — | `Promise` | +| `getAccount` | `searchAddress: string` | `Promise` | +| `getSequence` | `address: string` | `Promise` | +| `getBlock` | `height?: number` | `Promise` | +| `getBalance` | `address: string`, `searchDenom: string` | `Promise` | +| `getAllBalances` | `address: string` | `Promise` | +| `getBalanceStaked` | `address: string` | `Promise` | +| `getDelegation` | `delegatorAddress: string`, `validatorAddress: string` | `Promise` | +| `getTx` | `id: string` | `Promise` | +| `searchTx` | `query: SearchTxQuery` | `Promise` | +| `broadcastTx` | `tx: Uint8Array`, `timeoutMs?: number`, `pollIntervalMs?: number` | `Promise` | +| `broadcastTxSync` | `tx: Uint8Array` | `Promise` | +| `disconnect` | — | `void` | + +### Usage + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const balance = await client.getBalance("cosmos1...", "uatom"); +const account = await client.getAccount("cosmos1..."); +const block = await client.getBlock(); +const tx = await client.getTx("ABC123..."); + +client.disconnect(); +``` + +## SigningStargateClient + +Extends `StargateClient` with transaction signing and broadcasting. Inherits all read-only methods above. + +### Static Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connectWithSigner` | `endpoint: string \| HttpEndpoint`, `signer: OfflineSigner`, `options?: SigningStargateClientOptions` | `Promise` | +| `createWithSigner` | `cometClient: CometClient`, `signer: OfflineSigner`, `options?: SigningStargateClientOptions` | `SigningStargateClient` | +| `offline` | `signer: OfflineSigner`, `options?: SigningStargateClientOptions` | `Promise` | + +### Instance Methods + +| Method | Parameters | Returns | +|--------|------------|---------| +| `simulate` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `memo: string \| undefined` | `Promise` | +| `sendTokens` | `senderAddress: string`, `recipientAddress: string`, `amount: readonly Coin[]`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `delegateTokens` | `delegatorAddress: string`, `validatorAddress: string`, `amount: Coin`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `undelegateTokens` | `delegatorAddress: string`, `validatorAddress: string`, `amount: Coin`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `withdrawRewards` | `delegatorAddress: string`, `validatorAddress: string`, `fee: StdFee \| "auto" \| number`, `memo?: string` | `Promise` | +| `signAndBroadcast` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `timeoutHeight?: bigint` | `Promise` | +| `signAndBroadcastSync` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee \| "auto" \| number`, `memo?: string`, `timeoutHeight?: bigint` | `Promise` | +| `sign` | `signerAddress: string`, `messages: readonly EncodeObject[]`, `fee: StdFee`, `memo: string`, `explicitSignerData?: SignerData`, `timeoutHeight?: bigint` | `Promise` | + +### Instance Properties + +| Property | Type | +|----------|------| +| `registry` | `Registry` | +| `broadcastTimeoutMs` | `number \| undefined` | +| `broadcastPollIntervalMs` | `number \| undefined` | + +### Usage + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ..."); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); + +const sendMsg = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ + fromAddress: address, + toAddress: "cosmos1recipient...", + amount: [{ denom: "uatom", amount: "1000000" }], + }), +}; + +await client.signAndBroadcast(address, [sendMsg], "auto", "memo"); +``` + +## GasPrice + +Represents a gas price as an amount and denomination. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `amount: Decimal`, `denom: string` | `GasPrice` | +| `fromString` (static) | `gasPrice: string` | `GasPrice` | +| `toString` | — | `string` | + +| Property | Type | +|----------|------| +| `amount` | `Decimal` | +| `denom` | `string` | + +## calculateFee + +Calculates transaction fees from a gas limit and gas price. + +```typescript +function calculateFee(gasLimit: number, gasPrice: GasPrice | string): StdFee +``` + + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, GasPrice.fromString("0.025uatom")); +// { amount: [{ denom: "uatom", amount: "5000" }], gas: "200000" } +``` + +## QueryClient + +Base query client that supports modular extensions. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `withExtensions` (static) | `cometClient: CometClient`, `...extensionSetups: QueryExtensionSetup[]` | `QueryClient & Extensions` | +| `queryAbci` | `path: string`, `request: Uint8Array`, `desiredHeight?: number` | `Promise` | + +### Query Extensions + +Setup functions to add module-specific query methods: + +| Function | Namespace | Key Methods | +|----------|-----------|-------------| +| `setupBankExtension` | `bank` | `balance`, `allBalances`, `totalSupply`, `supplyOf` | +| `setupStakingExtension` | `staking` | `validators`, `delegation`, `delegatorDelegations`, `unbondingDelegation` | +| `setupGovExtension` | `gov` | `proposals`, `proposal`, `deposits`, `votes`, `tally` | +| `setupDistributionExtension` | `distribution` | `delegationRewards`, `delegationTotalRewards`, `communityPool` | +| `setupMintExtension` | `mint` | `inflation`, `annualProvisions`, `params` | +| `setupAuthExtension` | `auth` | `account` | +| `setupIbcExtension` | `ibc` | `channel.channel`, `channel.channels`, `transfer.denomTrace` | +| `setupTxExtension` | `tx` | `getTx`, `simulate` | +| `setupSlashingExtension` | `slashing` | `signingInfo`, `signingInfos`, `params` | +| `setupFeegrantExtension` | `feegrant` | `allowance`, `allowances` | +| `setupAuthzExtension` | `authz` | `grants` | + +```typescript +import { QueryClient, setupBankExtension, setupStakingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, +); + +const balance = await queryClient.bank.balance("cosmos1...", "uatom"); +const validators = await queryClient.staking.validators("BOND_STATUS_BONDED"); +``` + +## AminoTypes + +Manages conversion between Protobuf messages and Amino JSON format. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `types: AminoConverters` | `AminoTypes` | +| `toAmino` | `encodeObject: EncodeObject` | `AminoMsg` | +| `fromAmino` | `aminoMsg: AminoMsg` | `EncodeObject` | + +## Key Types + +### DeliverTxResponse + +```typescript +interface DeliverTxResponse { + readonly height: number; + readonly txIndex: number; + readonly code: number; + readonly transactionHash: string; + readonly events: readonly Event[]; + /** @deprecated Not filled in Cosmos SDK 0.50+. Use `events` instead. */ + readonly rawLog?: string; + /** @deprecated Use `msgResponses` instead. */ + readonly data?: readonly MsgData[]; + readonly msgResponses: Array<{ readonly typeUrl: string; readonly value: Uint8Array }>; + readonly gasUsed: bigint; + readonly gasWanted: bigint; +} +``` + + +### IndexedTx + +```typescript +interface IndexedTx { + readonly height: number; + readonly txIndex: number; + readonly hash: string; + readonly code: number; + readonly events: readonly Event[]; + readonly rawLog: string; + readonly tx: Uint8Array; + readonly msgResponses: Array<{ readonly typeUrl: string; readonly value: Uint8Array }>; + readonly gasUsed: bigint; + readonly gasWanted: bigint; +} +``` + +### Block + +```typescript +interface Block { + readonly id: string; + readonly header: BlockHeader; + readonly txs: readonly Uint8Array[]; +} +``` + +### BlockHeader + +```typescript +interface BlockHeader { + readonly version: { readonly block: string; readonly app: string }; + readonly height: number; + readonly chainId: string; + readonly time: string; +} +``` + +### SigningStargateClientOptions + +```typescript +interface SigningStargateClientOptions extends StargateClientOptions { + readonly registry?: Registry; + readonly aminoTypes?: AminoTypes; + readonly broadcastTimeoutMs?: number; + readonly broadcastPollIntervalMs?: number; + readonly gasPrice?: GasPrice | DynamicGasPriceConfig; +} +``` + + +### SignerData + +```typescript +interface SignerData { + readonly accountNumber: number; + readonly sequence: number; + readonly chainId: string; +} +``` + +### Account + +```typescript +interface Account { + readonly address: string; + readonly pubkey: Pubkey | null; + readonly accountNumber: number; + readonly sequence: number; +} +``` + +### SequenceResponse + +```typescript +interface SequenceResponse { + readonly accountNumber: number; + readonly sequence: number; +} +``` + +## Helper Functions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `assertIsDeliverTxSuccess` | `result: DeliverTxResponse` | `void` (throws on failure) | +| `assertIsDeliverTxFailure` | `result: DeliverTxResponse` | `void` (throws on success) | +| `isDeliverTxSuccess` | `result: DeliverTxResponse` | `boolean` | +| `isDeliverTxFailure` | `result: DeliverTxResponse` | `boolean` | +| `coin` | `amount: number \| string`, `denom: string` | `Coin` | +| `coins` | `amount: number \| string`, `denom: string` | `Coin[]` | +| `parseCoins` | `input: string` | `Coin[]` | +| `makeCosmoshubPath` | `account: number` | `HdPath` | +| `createPagination` | `paginationKey?: Uint8Array` | `PageRequest` | +| `createProtobufRpcClient` | `base: QueryClient` | `ProtobufRpcClient` | +| `decodeCosmosSdkDecFromProto` | `input: string \| Uint8Array` | `Decimal` | + +## Error Classes + +| Class | Description | +|-------|-------------| +| `BroadcastTxError` | Thrown when a transaction fails during broadcast | +| `TimeoutError` | Thrown when broadcast times out waiting for inclusion | diff --git a/cosmjs/v0.38.x/api-reference/stream.mdx b/cosmjs/v0.38.x/api-reference/stream.mdx new file mode 100644 index 000000000..6030fe270 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/stream.mdx @@ -0,0 +1,96 @@ +--- +title: "@cosmjs/stream" +description: "Reactive stream utilities built on xstream" +--- + +Provides reactive stream utilities for handling asynchronous data flows. Used internally by `@cosmjs/tendermint-rpc` for WebSocket subscriptions. + +```bash +npm install @cosmjs/stream +``` + +## DefaultValueProducer + +An xstream `Producer` that stores a current value and emits updates. `start` and `stop` implement the xstream `Producer` contract and are normally called by the stream, not application code. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `value: T`, `callbacks?: DefaultValueProducerCallsbacks` | `DefaultValueProducer` | +| `update` | `value: T` | `void` | +| `error` | `error: any` | `void` | +| `start` | `listener: Listener` | `void` | +| `stop` | — | `void` | + +| Property | Type | +|----------|------| +| `value` | `T` | + +```typescript +interface DefaultValueProducerCallsbacks { + readonly onStarted: () => void; + readonly onStop: () => void; +} +``` + + + The exported identifier `DefaultValueProducerCallsbacks` contains a spelling typo ("Callsbacks") that is preserved for backwards compatibility. + + +## ValueAndUpdates + +Wraps a `DefaultValueProducer` to expose both the current value and a `MemoryStream` of updates. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `producer: DefaultValueProducer` | `ValueAndUpdates` | +| `waitFor` | `search: SearchFunction \| T` | `Promise` | + +| Property | Type | +|----------|------| +| `value` | `T` | +| `updates` | `MemoryStream` | + +`waitFor` resolves with the first value matching the predicate (or strict-equal match when a value is passed). + +## Promise Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `toListPromise` | `stream: Stream`, `count: number` | `Promise` | +| `firstEvent` | `stream: Stream` | `Promise` | +| `fromListPromise` | `promise: Promise>` | `Stream` | + +```typescript +import { toListPromise, firstEvent } from "@cosmjs/stream"; + +const first = await firstEvent(stream); +const items = await toListPromise(stream, 5); +``` + +## Stream Operators + +| Function | Parameters | Returns | +|----------|------------|---------| +| `concat` | `...streams: Array>` | `Stream` | +| `dropDuplicates` | `valueToKey: (x: T) => string` | `SameTypeStreamOperator` | + +## Reducer + +Utilities for applying reducer patterns to streams. + +| Export | Kind | Purpose | +|--------|------|---------| +| `Reducer` | class | Subscribes to a stream and materializes state of type `U` from events of type `T` | +| `ReducerFunc` | type | `(acc: U, evt: T) => U` | +| `countStream` | function | Returns `Reducer` that counts events seen on the stream | +| `asArray` | function | Returns `Reducer` that accumulates all events into an array | +| `lastValue` | function | Returns `Reducer` holding the most recently emitted value | + +```typescript +import { Reducer, countStream, asArray, lastValue } from "@cosmjs/stream"; + +const counter = countStream(myStream); +// ... later +counter.value(); // number of events seen so far +await counter.finished(); // resolves when stream completes +``` diff --git a/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx new file mode 100644 index 000000000..96f24c2e2 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/tendermint-rpc.mdx @@ -0,0 +1,179 @@ +--- +title: "@cosmjs/tendermint-rpc" +description: "Tendermint/CometBFT RPC client for HTTP and WebSocket" +--- + +Low-level RPC client for communicating with Tendermint/CometBFT nodes. Supports HTTP and WebSocket transports, and auto-detects the node version. + +```bash +npm install @cosmjs/tendermint-rpc +``` + +## connectComet + +Auto-detects the CometBFT/Tendermint version and returns the appropriate client. + +```typescript +function connectComet(endpoint: string | HttpEndpoint): Promise +``` + +```typescript +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const client = await connectComet("https://rpc.my-chain.network"); +const status = await client.status(); +``` + +## CometClient + +`CometClient` is a union type of all version-specific clients: `Tendermint37Client | Comet38Client | Comet1Client`. They share these methods: + +| Method | Parameters | Returns | +|--------|------------|---------| +| `status` | — | `Promise` | +| `block` | `height?: number` | `Promise` | +| `blockResults` | `height?: number` | `Promise` | +| `blockchain` | `minHeight?: number`, `maxHeight?: number` | `Promise` | +| `tx` | `params: TxParams` | `Promise` | +| `txSearch` | `params: TxSearchParams` | `Promise` | +| `validators` | `params: ValidatorsParams` | `Promise` | +| `broadcastTxSync` | `params: BroadcastTxParams` | `Promise` | +| `broadcastTxAsync` | `params: BroadcastTxParams` | `Promise` | +| `broadcastTxCommit` | `params: BroadcastTxParams` | `Promise` | +| `abciQuery` | `params: AbciQueryParams` | `Promise` | +| `disconnect` | — | `void` | + +## Version-Specific Clients + +### Tendermint37Client + +For Tendermint 0.37 nodes. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` (static) | `endpoint: string \| HttpEndpoint` | `Promise` | +| `create` (static) | `rpcClient: RpcClient` | `Tendermint37Client` | + +### Comet38Client + +For CometBFT 0.38 nodes. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` (static) | `endpoint: string \| HttpEndpoint` | `Promise` | +| `create` (static) | `rpcClient: RpcClient` | `Comet38Client` | + +### Comet1Client + +For CometBFT 1.x nodes. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `connect` (static) | `endpoint: string \| HttpEndpoint` | `Promise` | +| `create` (static) | `rpcClient: RpcClient` | `Comet1Client` | + +## Type Guards + +| Function | Parameters | Returns | +|----------|------------|---------| +| `isTendermint37Client` | `client: CometClient` | `client is Tendermint37Client` | +| `isComet38Client` | `client: CometClient` | `client is Comet38Client` | +| `isComet1Client` | `client: CometClient` | `client is Comet1Client` | + +These are TypeScript type predicates, so the compiler narrows the client type in the branch where the guard returns `true`. + +## RPC Clients + +Low-level HTTP and WebSocket implementations. + +### HttpClient + +Standard HTTP client for request/response RPC. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `endpoint: string \| HttpEndpoint`, `timeout?: number` | `HttpClient` | +| `execute` | `request: JsonRpcRequest` | `Promise` | +| `disconnect` | — | `void` | + +### HttpBatchClient + +Batches multiple RPC requests into a single HTTP call. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `endpoint: string \| HttpEndpoint`, `options?: Partial` | `HttpBatchClient` | +| `execute` | `request: JsonRpcRequest` | `Promise` | +| `disconnect` | — | `void` | + +```typescript +interface HttpBatchClientOptions { + dispatchInterval: number; + batchSizeLimit: number; + httpTimeout?: number; +} +``` + + +### WebsocketClient + +WebSocket client for streaming subscriptions. + +| Method | Parameters | Returns | +|--------|------------|---------| +| `constructor` | `endpoint: string`, `onError?: (err: any) => void` | `WebsocketClient` | +| `execute` | `request: JsonRpcRequest` | `Promise` | +| `listen` | `request: JsonRpcRequest` | `Stream` | +| `connected` | — | `Promise` (resolves when the socket is connected) | +| `disconnect` | — | `void` | + +## Key Types + +### HttpEndpoint + +```typescript +interface HttpEndpoint { + readonly url: string; + readonly headers: Record; +} +``` + +### RpcClient + +```typescript +interface RpcClient { + readonly execute: (request: JsonRpcRequest) => Promise; + readonly disconnect: () => void; +} +``` + +### BlockIdFlag + +```typescript +enum BlockIdFlag { + Unknown = 0, + Absent = 1, + Commit = 2, + Nil = 3, + Unrecognized = -1, +} +``` + + +## Date Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `fromRfc3339WithNanoseconds` | `str: string` | `DateWithNanoseconds` | +| `toRfc3339WithNanoseconds` | `date: ReadonlyDateWithNanoseconds` | `string` | +| `fromSeconds` | `seconds: number`, `nanos?: number` | `DateWithNanoseconds` | +| `toSeconds` | `date: ReadonlyDateWithNanoseconds` | `{ seconds: number; nanos: number }` | + +## Address Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `pubkeyToAddress` | `type: "ed25519" \| "secp256k1"`, `data: Uint8Array` | `string` | +| `pubkeyToRawAddress` | `type: "ed25519" \| "secp256k1"`, `data: Uint8Array` | `Uint8Array` | +| `rawSecp256k1PubkeyToRawAddress` | `pubkeyData: Uint8Array` | `Uint8Array` | +| `rawEd25519PubkeyToRawAddress` | `pubkeyData: Uint8Array` | `Uint8Array` | diff --git a/cosmjs/v0.38.x/api-reference/utils.mdx b/cosmjs/v0.38.x/api-reference/utils.mdx new file mode 100644 index 000000000..8de351169 --- /dev/null +++ b/cosmjs/v0.38.x/api-reference/utils.mdx @@ -0,0 +1,65 @@ +--- +title: "@cosmjs/utils" +description: "Assertion and utility helpers" +--- + +Lightweight utility functions for assertions, type guards, and async helpers used throughout CosmJS. + +```bash +npm install @cosmjs/utils +``` + +## Assertions + +| Function | Parameters | Returns | +|----------|------------|---------| +| `assert` | `condition: any`, `msg?: string` | `asserts condition` (throws if falsy) | +| `assertDefined` | `value: T \| undefined`, `msg?: string` | `asserts value is T` (throws if undefined) | +| `assertDefinedAndNotNull` | `value: T \| undefined \| null`, `msg?: string` | `asserts value is T` (throws if null/undefined) | + +These helpers use TypeScript assertion signatures, so the compiler narrows the type of the argument in the enclosing scope after a successful call. + +```typescript +import { assert, assertDefined } from "@cosmjs/utils"; + +assert(amount > 0, "Amount must be positive"); +assertDefined(account, "Account not found"); +``` + +## Type Guards + +| Function | Parameters | Returns | +|----------|------------|---------| +| `isDefined` | `value: T \| undefined` | `value is T` | +| `isNonNullObject` | `data: unknown` | `data is object` (also matches arrays) | +| `isUint8Array` | `value: unknown` | `value is Uint8Array` | + +```typescript +import { isDefined, isNonNullObject } from "@cosmjs/utils"; + +if (isDefined(optional)) { + optional.property; // TypeScript knows it's defined +} +``` + +## Async Helpers + +| Function | Parameters | Returns | +|----------|------------|---------| +| `sleep` | `ms: number` | `Promise` | + +```typescript +import { sleep } from "@cosmjs/utils"; + +await sleep(1000); // wait 1 second +``` + +## Array Utilities + +| Function | Parameters | Returns | +|----------|------------|---------| +| `arrayContentEquals` | `a: ArrayLike`, `b: ArrayLike` where `T extends string \| number \| boolean` | `boolean` | +| `arrayContentStartsWith` | `a: ArrayLike`, `b: ArrayLike` where `T extends string \| number \| boolean` | `boolean` | + +Elements are compared with strict equality, so these helpers only support arrays of primitives (string/number/boolean). + diff --git a/cosmjs/v0.38.x/concepts/account/account.mdx b/cosmjs/v0.38.x/concepts/account/account.mdx new file mode 100644 index 000000000..c218165ed --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/account.mdx @@ -0,0 +1,65 @@ +--- +title: Account +description: How Cosmos accounts work and how to query them with CosmJS +--- + +Every Cosmos chain stores an **account** for each address that has interacted +with the chain. An account tracks the information needed to authenticate +transactions: + +```typescript +interface Account { + readonly address: string; + readonly pubkey: Pubkey | null; + readonly accountNumber: number; + readonly sequence: number; +} +``` + +- **address** — A bech32-encoded string like `cosmos1abc...`. The prefix + (`cosmos`, `osmo`, `juno`, etc.) identifies the chain. +- **pubkey** — The public key associated with the account. This is `null` until + the account sends its first transaction. +- **accountNumber** — A unique integer assigned when the account is first + created on-chain. It never changes. +- **sequence** — A counter that increments with each transaction. Prevents + replay attacks. + +You can query any account with a read-only client: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); +const account = await client.getAccount("cosmos1..."); +// { address: "cosmos1...", pubkey: {...}, accountNumber: 47, sequence: 12 } +``` + +## AccountData vs Account + +CosmJS distinguishes between on-chain accounts and local key data. When you call +`getAccounts()` on a wallet, you get `AccountData` — the local view of the +keys the wallet manages: + +```typescript +interface AccountData { + readonly address: string; + readonly algo: Algo; // "secp256k1" | "ed25519" | "sr25519" | "eth_secp256k1" | "ethsecp256k1" + readonly pubkey: Uint8Array; +} +``` + +This is the wallet telling you "I hold the private key for this address and can +sign with this algorithm." It does not include on-chain state like sequence or +account number — that comes from querying the chain. + +## Next Steps + + + + Create and manage HD wallets from mnemonic phrases. + + + Implement the OfflineSigner interface for custom signing. + + diff --git a/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx b/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx new file mode 100644 index 000000000..d96987868 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/bech32-addresses.mdx @@ -0,0 +1,75 @@ +--- +title: Bech32 Addresses +description: How Cosmos addresses are encoded and derived from public keys +--- + +Cosmos uses [Bech32](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki) +encoding for all addresses. A Bech32 address has two parts: a human-readable +prefix (HRP) that identifies the chain, and a data section containing the raw +address bytes with a checksum. + +```text +cosmos1qypqxpq9qcrsszg2pvxq6rs0zqg3yyc5lzv7xu + ^ ^ + | +-- data + checksum (base32 encoded) + +-- prefix (HRP) +``` + +## Common Prefixes + +| Chain | Address prefix | Validator prefix | +|-------|---------------|-----------------| +| Cosmos Hub | `cosmos` | `cosmosvaloper` | +| Osmosis | `osmo` | `osmovaloper` | +| Juno | `juno` | `junovaloper` | +| Neutron | `neutron` | `neutronvaloper` | +| CosmWasm testnet | `wasm` | `wasmvaloper` | + +## Encoding and Decoding + +`@cosmjs/encoding` provides three functions: + +```typescript +import { toBech32, fromBech32, normalizeBech32 } from "@cosmjs/encoding"; + +const address = toBech32("cosmos", rawAddressBytes); +// "cosmos1..." + +const { prefix, data } = fromBech32("cosmos1qypq..."); +// prefix: "cosmos", data: Uint8Array (20 bytes) + +const normalized = normalizeBech32("COSMOS1QYPQ..."); +// "cosmos1qypq..." (lowercased and validated) +``` + +`fromBech32` validates the checksum and throws on invalid input. +`normalizeBech32` round-trips through decode/encode, which is safer than calling +`toLowerCase()` directly. + +## How Addresses Are Derived from Public Keys + +The raw 20-byte address inside a Bech32 string is derived from the public key +through hashing. The algorithm depends on the key type: + +| Key type | Derivation | +|----------|-----------| +| **secp256k1** | `ripemd160(sha256(compressedPubkey))` | +| **ed25519** | `sha256(pubkey).slice(0, 20)` | +| **eth_secp256k1** | `keccak256(uncompressedPubkey[1:]).slice(-20)` | +| **multisig** | `sha256(aminoEncodedPubkey).slice(0, 20)` | + +The `@cosmjs/amino` package provides `pubkeyToAddress` for this: + +```typescript +import { pubkeyToAddress } from "@cosmjs/amino"; + +const address = pubkeyToAddress(pubkey, "cosmos"); +``` + +This means the same key pair produces different addresses on different chains — +only the Bech32 prefix changes, but the raw bytes are identical: + +```typescript +const cosmosAddr = toBech32("cosmos", rawAddress); // cosmos1abc... +const osmoAddr = toBech32("osmo", rawAddress); // osmo1abc... +``` diff --git a/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx new file mode 100644 index 000000000..728dc1690 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/injected-wallets.mdx @@ -0,0 +1,107 @@ +--- +title: Injected Wallets +description: Integrate browser wallet extensions like Keplr, Leap, and Cosmostation with CosmJS +--- + +In browser environments, users typically sign transactions through a wallet +extension like [Keplr](https://www.keplr.app/), +[Leap](https://www.leapwallet.io/), or [Cosmostation](https://cosmostation.io/). +These extensions inject a global object (e.g. `window.keplr`) that can produce +an `OfflineSigner` for any supported chain. + +## Basic Integration + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const chainId = "cosmoshub-4"; + +// 1. Ask the extension to enable access for this chain +await window.keplr.enable(chainId); + +// 2. Get an OfflineSigner from the extension +const signer = window.keplr.getOfflineSigner(chainId); + +// 3. Use it exactly like a local wallet +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + signer, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const [{ address }] = await signer.getAccounts(); +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); +``` + +The key insight: once you have an `OfflineSigner`, the rest of the code is +identical whether the keys come from a mnemonic, Keplr, Leap, or a Ledger +device. This is the power of the `OfflineSigner` abstraction. + +## Choosing the Signing Mode + +Keplr and similar wallets offer multiple signer variants: + +```typescript +// Amino only — broadest compatibility, required for Ledger via Keplr +const aminoSigner = window.keplr.getOfflineSignerOnlyAmino(chainId); + +// Sync — returns both Direct and Amino signers simultaneously +const autoSigner = window.keplr.getOfflineSigner(chainId); + +// Async — auto-selects Direct for mnemonic accounts, Amino for Ledger accounts +const asyncSigner = await window.keplr.getOfflineSignerAuto(chainId); +``` + +For most applications, `getOfflineSigner` is the right choice. It +synchronously returns a signer that implements both `OfflineDirectSigner` and +`OfflineAminoSigner`. Use `getOfflineSignerAuto` when you need async +auto-detection — it returns `Promise` and automatically selects +Amino for Ledger-based accounts. + +## Detecting the Extension + +Wallet extensions need a moment to inject their global object. A common pattern: + +```typescript +function getKeplr(): Keplr | undefined { + if (typeof window === "undefined") return undefined; + return window.keplr; +} + +window.addEventListener("load", () => { + const keplr = getKeplr(); + if (!keplr) { + alert("Please install the Keplr extension"); + } +}); +``` + +## Suggesting a Chain + +If the user's wallet doesn't know about your chain yet, you can suggest it: + +```typescript +await window.keplr.experimentalSuggestChain({ + chainId: "my-testnet-1", + chainName: "My Testnet", + rpc: "https://rpc.my-testnet.example", + rest: "https://lcd.my-testnet.example", + bip44: { coinType: 118 }, + bech32Config: { + bech32PrefixAccAddr: "cosmos", + bech32PrefixAccPub: "cosmospub", + bech32PrefixValAddr: "cosmosvaloper", + bech32PrefixValPub: "cosmosvaloperpub", + bech32PrefixConsAddr: "cosmosvalcons", + bech32PrefixConsPub: "cosmosvalconspub", + }, + currencies: [{ coinDenom: "ATOM", coinMinimalDenom: "uatom", coinDecimals: 6 }], + feeCurrencies: [{ coinDenom: "ATOM", coinMinimalDenom: "uatom", coinDecimals: 6 }], + stakeCurrency: { coinDenom: "ATOM", coinMinimalDenom: "uatom", coinDecimals: 6 }, +}); +``` diff --git a/cosmjs/v0.38.x/concepts/account/local-wallets.mdx b/cosmjs/v0.38.x/concepts/account/local-wallets.mdx new file mode 100644 index 000000000..3a7594502 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/local-wallets.mdx @@ -0,0 +1,100 @@ +--- +title: Local Wallets +description: Create and manage HD wallets from mnemonic phrases with CosmJS +--- + +The most common signer for scripts, backends, and testing is an HD wallet +created from a BIP-39 mnemonic phrase. + +## Direct Signing (recommended) + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your twelve or twenty-four word mnemonic phrase ...", + { prefix: "cosmos" }, +); + +const [{ address }] = await wallet.getAccounts(); +``` + +## Amino Signing + +```typescript +import { Secp256k1HdWallet } from "@cosmjs/amino"; + +const wallet = await Secp256k1HdWallet.fromMnemonic( + "your twelve or twenty-four word mnemonic phrase ...", + { prefix: "cosmos" }, +); +``` + +Both implement `OfflineSigner` and can be passed directly to +`SigningStargateClient`: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); +``` + +## Generating a New Wallet + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.generate(24, { + prefix: "cosmos", +}); + +const mnemonic = wallet.mnemonic; +``` + +Back up the mnemonic securely — it's the only way to recover the wallet. + +## Multiple Accounts and Custom HD Paths + +A single mnemonic can derive many accounts: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { makeCosmoshubPath } from "@cosmjs/amino"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "cosmos", + hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(2)], +}); + +const accounts = await wallet.getAccounts(); +// Three different addresses, all derived from the same mnemonic +``` + +## Encrypted Serialization + + + The `serialize()` and `deserialize()` methods are deprecated and will be removed in a future version of CosmJS. If you rely on this feature, comment at [cosmos/cosmjs#1796](https://github.com/cosmos/cosmjs/issues/1796). + + +Wallets can be serialized to an encrypted JSON string for storage: + +```typescript +const encrypted = await wallet.serialize("strong-password"); +// Store `encrypted` in a database or file + +const restored = await DirectSecp256k1HdWallet.deserialize( + encrypted, + "strong-password", +); +``` diff --git a/cosmjs/v0.38.x/concepts/account/offline-signers.mdx b/cosmjs/v0.38.x/concepts/account/offline-signers.mdx new file mode 100644 index 000000000..690a40d96 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/account/offline-signers.mdx @@ -0,0 +1,63 @@ +--- +title: Offline Signers +description: The OfflineSigner interface and the two Cosmos signing modes +--- + +An `OfflineSigner` is the interface CosmJS uses to abstract over _any_ source of +signatures. It doesn't matter whether the private key lives in memory, in a +browser extension, or on a hardware device — as long as it implements +`OfflineSigner`, it works with `SigningStargateClient`. + +```typescript +type OfflineSigner = OfflineAminoSigner | OfflineDirectSigner; +``` + +There are two flavors, matching the two Cosmos signing modes: + +## OfflineDirectSigner (Protobuf / Direct) + +The modern default. Signs raw Protobuf-encoded bytes. Preferred for new +applications. + +```typescript +interface OfflineDirectSigner { + readonly getAccounts: () => Promise; + readonly signDirect: ( + signerAddress: string, + signDoc: SignDoc, + ) => Promise; +} +``` + +## OfflineAminoSigner (Amino JSON) + +The legacy format. Signs a deterministic JSON representation. Required for +Ledger hardware wallets and some older chains. + +```typescript +interface OfflineAminoSigner { + readonly getAccounts: () => Promise; + readonly signAmino: ( + signerAddress: string, + signDoc: StdSignDoc, + ) => Promise; +} +``` + +The "offline" in the name means the signer itself never needs network access. It +only receives bytes and returns a signature. The client handles everything +else — querying account state, building the transaction, and broadcasting. + +## Signer Summary + +| Signer | Use Case | Package | +|--------|----------|---------| +| `DirectSecp256k1HdWallet` | Scripts, backends, tests | `@cosmjs/proto-signing` | +| `Secp256k1HdWallet` | Amino signing, legacy chains | `@cosmjs/amino` | +| `window.keplr.getOfflineSigner()` | Browser apps with Keplr | (provided by extension) | +| `LedgerSigner` | Hardware wallet signing | `@cosmjs/ledger-amino` | + +All of these produce an `OfflineSigner`. All of them work with +`SigningStargateClient.connectWithSigner`. The signing client doesn't know or +care where the signature comes from — it just needs something that implements +the interface. diff --git a/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx new file mode 100644 index 000000000..69faa8a16 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/clients/read-only-clients.mdx @@ -0,0 +1,158 @@ +--- +title: Read-Only Clients +description: Querying Cosmos SDK and CosmWasm chains with StargateClient and CosmWasmClient +--- + +CosmJS provides two parallel client hierarchies — **Stargate** for standard +Cosmos SDK chains and **CosmWasm** for chains with smart contract support. Each +hierarchy has a read-only client for queries and a signing client for +transactions. + +```text +StargateClient (read-only) CosmWasmClient (read-only) + │ │ + ▼ ▼ +SigningStargateClient (signing) SigningCosmWasmClient (signing) +``` + +Read-only clients connect to a chain's RPC endpoint and expose query methods. +They never need a wallet or private key. + +## StargateClient + +The primary read-only client for Cosmos SDK chains. + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); +``` + +### Factory Methods + +| Method | Description | +|--------|-------------| +| `StargateClient.connect(endpoint, options?)` | Connect to an RPC endpoint (async, auto-detects CometBFT version) | +| `StargateClient.create(cometClient, options?)` | Create from an existing CometBFT client (synchronous) | + +### Query Methods + +| Method | Returns | Description | +|--------|---------|-------------| +| `getChainId()` | `string` | Chain identifier | +| `getHeight()` | `number` | Latest block height | +| `getBlock(height?)` | `Block` | Block at height (latest if omitted) | +| `getAccount(address)` | `Account \| null` | Account info (number, sequence, pubkey) | +| `getSequence(address)` | `SequenceResponse` | Account number and sequence | +| `getBalance(address, denom)` | `Coin` | Balance for a single denomination | +| `getAllBalances(address)` | `readonly Coin[]` | All balances for an address | +| `getBalanceStaked(address)` | `Coin \| null` | Total staked balance | +| `getDelegation(delegator, validator)` | `Coin \| null` | Delegation to a specific validator | +| `getTx(hash)` | `IndexedTx \| null` | Transaction by hash | +| `searchTx(query)` | `IndexedTx[]` | Search transactions by events | + +```typescript +const balance = await client.getBalance("cosmos1...", "uatom"); +const block = await client.getBlock(); +const account = await client.getAccount("cosmos1..."); +``` + +### Options + +```typescript +interface StargateClientOptions { + readonly accountParser?: AccountParser; +} +``` + +## CosmWasmClient + +The read-only client for CosmWasm-enabled chains. Provides common query methods +(`getBalance`, `getAccount`, `getBlock`, `getTx`, `searchTx`) plus smart contract queries. + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); +``` + +### CosmWasm-Specific Query Methods + +| Method | Returns | Description | +|--------|---------|-------------| +| `getCodes()` | `readonly Code[]` | All uploaded code entries | +| `getCodeDetails(codeId)` | `CodeDetails` | Code metadata and wasm bytecode | +| `getContracts(codeId)` | `readonly string[]` | Contract addresses instantiated from a code ID | +| `getContractsByCreator(creator)` | `readonly string[]` | Contracts created by an address | +| `getContract(address)` | `Contract` | Contract metadata (code ID, label, creator, admin) | +| `getContractCodeHistory(address)` | `readonly ContractCodeHistoryEntry[]` | Migration history | +| `queryContractRaw(address, key)` | `Uint8Array \| null` | Raw key-value store lookup | +| `queryContractSmart(address, queryMsg)` | `JsonObject` | Execute a read-only smart query | + +```typescript +const contract = await client.getContract("osmo1contractaddress..."); + +const tokenInfo = await client.queryContractSmart("osmo1contractaddress...", { + token_info: {}, +}); +``` + +## Query Extensions + +Both clients use a `QueryClient` internally that can be extended with module +query support. `StargateClient` wires up Auth, Bank, Staking, and Tx extensions +by default. `CosmWasmClient` wires up Auth, Bank, Wasm, and Tx. + +For advanced use, you can create a `QueryClient` directly with any combination +of extensions: + +```typescript +import { connectComet } from "@cosmjs/tendermint-rpc"; +import { + QueryClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, +} from "@cosmjs/stargate"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, +); + +const validators = await queryClient.staking.validators("BOND_STATUS_BONDED"); +const rewards = await queryClient.distribution.delegationTotalRewards("cosmos1..."); +``` + +### Available Extensions + +| Extension | Namespace | Provides | +|-----------|-----------|----------| +| `setupAuthExtension` | `auth` | Account lookup | +| `setupBankExtension` | `bank` | Balances, supply, denom metadata | +| `setupStakingExtension` | `staking` | Delegations, validators, pool, params | +| `setupDistributionExtension` | `distribution` | Rewards, commission, community pool | +| `setupGovExtension` | `gov` | Proposals, votes, deposits, tally | +| `setupIbcExtension` | `ibc` | Channels, clients, connections, transfers | +| `setupMintExtension` | `mint` | Inflation, annual provisions, params | +| `setupSlashingExtension` | `slashing` | Signing info, params | +| `setupAuthzExtension` | `authz` | Grants | +| `setupFeegrantExtension` | `feegrant` | Fee allowances | +| `setupTxExtension` | `tx` | Transaction lookup, simulation | +| `setupWasmExtension` | `wasm` | Smart contract queries (from `@cosmjs/cosmwasm`) | + +## Next Steps + + + + Build and broadcast transactions with a signing client. + + + Explore query methods and extensions in depth. + + diff --git a/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx new file mode 100644 index 000000000..5a276ce24 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/clients/signing-clients.mdx @@ -0,0 +1,163 @@ +--- +title: Signing Clients +description: Building, signing, and broadcasting transactions with SigningStargateClient and SigningCosmWasmClient +--- + +Signing clients extend their read-only counterparts with the ability to build, +sign, and broadcast transactions. They require a **signer** (wallet) and are +created via static factory methods. + +## Signers + +A signer is any object that holds keys and can produce signatures. CosmJS +supports two signing modes: + +| Interface | Signing Mode | Wallet Implementation | +|-----------|-------------|----------------------| +| `OfflineDirectSigner` | Protobuf (Direct) — recommended | `DirectSecp256k1HdWallet`, `DirectSecp256k1Wallet` | +| `OfflineAminoSigner` | Amino JSON — required for Ledger | `Secp256k1HdWallet`, Ledger signers | + +Both implement `getAccounts()` to list available accounts. The signing client +auto-detects which mode to use based on whether the signer has a `signDirect` +method. + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); +``` + +## SigningStargateClient + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); +``` + +### Factory Methods + +| Method | Description | +|--------|-------------| +| `connectWithSigner(endpoint, signer, options?)` | Connect to RPC and create signing client | +| `createWithSigner(cometClient, signer, options?)` | Create from existing CometBFT client | +| `offline(signer, options?)` | Offline client (sign without RPC) | + +### Transaction Methods + +| Method | Description | +|--------|-------------| +| `signAndBroadcast(address, messages, fee, memo?, timeoutHeight?)` | Sign, broadcast, and wait for inclusion | +| `signAndBroadcastSync(address, messages, fee, memo?, timeoutHeight?)` | Sign and broadcast, return tx hash immediately | +| `sign(address, messages, fee, memo, signerData?, timeoutHeight?)` | Sign without broadcasting (returns `TxRaw`). `memo` is required — pass `""` to omit. | +| `simulate(address, messages, memo)` | Estimate gas for a transaction (`memo` is `string \| undefined`, not optional — pass `undefined` explicitly) | + +### Convenience Methods + +| Method | Message Type | +|--------|-------------| +| `sendTokens(sender, recipient, amount, fee, memo?)` | `MsgSend` | +| `delegateTokens(delegator, validator, amount, fee, memo?)` | `MsgDelegate` | +| `undelegateTokens(delegator, validator, amount, fee, memo?)` | `MsgUndelegate` | +| `withdrawRewards(delegator, validator, fee, memo?)` | `MsgWithdrawDelegatorReward` | + +### Fees + +The `fee` parameter accepts three forms: + +```typescript +// Explicit fee +const fee: StdFee = { amount: [{ denom: "uatom", amount: "5000" }], gas: "200000" }; +await client.signAndBroadcast(address, messages, fee); + +// Auto-calculate from simulation (requires gasPrice in options) +await client.signAndBroadcast(address, messages, "auto"); + +// Auto with gas multiplier (1.4 = 40% buffer over simulated gas) +await client.signAndBroadcast(address, messages, 1.4); +``` + +### Options + +```typescript +interface SigningStargateClientOptions extends StargateClientOptions { + readonly registry?: Registry; + readonly aminoTypes?: AminoTypes; + readonly broadcastTimeoutMs?: number; + readonly broadcastPollIntervalMs?: number; + readonly gasPrice?: GasPrice | DynamicGasPriceConfig; +} +``` + +- **registry** — protobuf type registry for encoding messages (defaults cover + all standard Cosmos SDK message types) +- **aminoTypes** — converters between protobuf and Amino for Amino signers +- **gasPrice** — required when using `"auto"` fees; supports static pricing or + dynamic fee market pricing via `DynamicGasPriceConfig` + +## SigningCosmWasmClient + +Extends `CosmWasmClient` with signing and smart contract transaction methods. + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); +``` + +### CosmWasm-Specific Transaction Methods + +| Method | Description | +|--------|-------------| +| `upload(sender, wasmCode, fee, memo?, instantiatePermission?)` | Upload wasm bytecode | +| `instantiate(sender, codeId, msg, label, fee, options?)` | Instantiate a contract | +| `instantiate2(sender, codeId, salt, msg, label, fee, options?)` | Instantiate with predictable address | +| `execute(sender, contract, msg, fee, memo?, funds?)` | Execute a contract message | +| `executeMultiple(sender, instructions, fee, memo?)` | Execute multiple contract messages in one tx | +| `migrate(sender, contract, codeId, msg, fee, memo?)` | Migrate a contract to new code | +| `updateAdmin(sender, contract, newAdmin, fee, memo?)` | Change contract admin | +| `clearAdmin(sender, contract, fee, memo?)` | Remove contract admin | + +`SigningCosmWasmClient` also includes all the convenience methods from +`SigningStargateClient` (`sendTokens`, `delegateTokens`, etc.) as well as +`signAndBroadcast`, `sign`, and `simulate`. + +```typescript +const uploadResult = await client.upload(address, wasmBytecode, "auto"); + +const { contractAddress } = await client.instantiate( + address, + uploadResult.codeId, + { count: 0 }, + "my-counter", + "auto", +); + +const execResult = await client.execute( + address, + contractAddress, + { increment: {} }, + "auto", +); +``` + +## Next Steps + + + + Step-by-step guide to sending transactions. + + + Understand gas limits and fee calculation. + + diff --git a/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx b/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx new file mode 100644 index 000000000..f28e9bc92 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm.mdx @@ -0,0 +1,62 @@ +--- +title: Stargate vs CosmWasm +description: Comparing the two CosmJS client families and when to use each +--- + +The two client families are **parallel implementations**, not a parent-child +relationship. They share the same patterns and reuse types from `@cosmjs/stargate`, +but `CosmWasmClient` does not extend `StargateClient`. + +| | Stargate | CosmWasm | +|---|----------|----------| +| **Read-only client** | `StargateClient` | `CosmWasmClient` | +| **Signing client** | `SigningStargateClient` | `SigningCosmWasmClient` | +| **Package** | `@cosmjs/stargate` | `@cosmjs/cosmwasm` | +| **Query extensions** | Auth, Bank, Staking, Tx | Auth, Bank, Wasm, Tx | +| **Staking queries** | Yes (`getBalanceStaked`, `getDelegation`) | No | +| **Smart contract queries** | No | Yes (`queryContractSmart`, `getContract`, etc.) | +| **Smart contract transactions** | No | Yes (`upload`, `instantiate`, `execute`, `migrate`) | +| **Default registry** | Standard Cosmos SDK types | Cosmos SDK + CosmWasm types | +| **Default amino types** | Standard converters | Standard + CosmWasm converters | + +## Which Should I Use? + +- **Standard Cosmos SDK chain** (Cosmos Hub, etc.) — use `@cosmjs/stargate` +- **CosmWasm-enabled chain** (Osmosis, Neutron, etc.) — use `@cosmjs/cosmwasm` + +`SigningCosmWasmClient` is a superset in terms of transaction types: it can +send tokens, delegate, and do everything `SigningStargateClient` can, plus +interact with smart contracts. If your chain supports CosmWasm and you need +contract interaction, use the CosmWasm client for everything. + +## Custom Messages + +Both signing clients support custom message types through the `Registry`: + +```typescript +import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, GasPrice, SigningStargateClient } from "@cosmjs/stargate"; +// Generated message type from your own chain's protos: +import { MsgDoSomething } from "./generated/my/custom/v1/tx"; + +const endpoint = "https://rpc.my-chain.network"; +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); + +const registry = new Registry(defaultRegistryTypes); +registry.register("/my.custom.v1.MsgDoSomething", MsgDoSomething); + +const client = await SigningStargateClient.connectWithSigner(endpoint, wallet, { + registry, + gasPrice: GasPrice.fromString("0.025uatom"), +}); + +await client.signAndBroadcast(address, [ + { + typeUrl: "/my.custom.v1.MsgDoSomething", + value: MsgDoSomething.fromPartial({ sender: address, data: "hello" }), + }, +], "auto"); +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx new file mode 100644 index 000000000..7bedf7520 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation.mdx @@ -0,0 +1,33 @@ +--- +title: Address Derivation +description: How EVM address derivation differs from standard Cosmos in CosmJS. +--- + +Standard Cosmos and EVM chains both start from a compressed secp256k1 public key +but diverge in how they compute the 20-byte raw address. + +**Standard Cosmos** (`rawSecp256k1PubkeyToRawAddress`): + +```text +compressed_pubkey (33 bytes) + → sha256(compressed_pubkey) + → ripemd160(hash) + → 20-byte raw address + → bech32 encode with prefix +``` + +**EVM** (`rawEthSecp256k1PubkeyToRawAddress`): + +```text +compressed_pubkey (33 bytes) + → decompress to uncompressed (65 bytes) + → strip the 0x04 prefix byte (64 bytes) + → keccak256(64 bytes) + → take last 20 bytes + → bech32 encode with prefix +``` + +The raw address derivation matches Ethereum's `address = keccak256(pubkey)[12:]` +convention. Despite producing Ethereum-compatible addresses, CosmJS wraps them in +Bech32 encoding (e.g. `cosmos1...`) — not the `0x`-prefixed hex format used by +Ethereum wallets. diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx new file mode 100644 index 000000000..ea531f6d2 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/full-example.mdx @@ -0,0 +1,37 @@ +--- +title: Full Example +description: End-to-end example of using CosmJS with an EVM-compatible Cosmos chain. +--- + +This end-to-end example creates an EVM-compatible wallet, connects to a Cosmos EVM chain, and sends a token transfer using CosmJS. + +```typescript +import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; + +const mnemonic = + "copper push brief egg scan entry inform record adjust fossil boss egg " + + "comic alien upon aspect dry avoid interest fury window hint race symptom"; + +const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "http://localhost:26661", + wallet, + { gasPrice: GasPrice.fromString("0.025atest") }, +); + +const recipient = "cosmos1recipient..."; +const amount = [{ denom: "atest", amount: "1000000000000000000" }]; + +// EVM wallets need explicit fees — gas simulation uses the wrong pubkey type. +const fee = calculateFee(200_000, GasPrice.fromString("0.025atest")); + +const result = await client.sendTokens(address, recipient, amount, fee); +console.info("Transaction hash:", result.transactionHash); + +client.disconnect(); +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx new file mode 100644 index 000000000..909028b6d --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/key-differences.mdx @@ -0,0 +1,53 @@ +--- +title: Key Differences +description: How EVM-compatible Cosmos chains differ from standard Cosmos chains in CosmJS. +--- + +CosmJS supports EVM-compatible Cosmos chains such as those built with +[Cosmos EVM](https://github.com/cosmos/evm) (formerly Ethermint/Evmos). This +section covers how EVM chains differ from standard Cosmos chains and how to use +CosmJS with them. + +## Background + +Standard Cosmos chains use `secp256k1` keys, derive addresses as +`RIPEMD-160(SHA-256(compressedPubkey))`, and hash the sign doc with SHA-256 +before producing an ECDSA signature. EVM-compatible Cosmos chains use the same +elliptic curve (secp256k1) but follow Ethereum conventions: addresses come from +the last 20 bytes of `Keccak-256(uncompressedPubkey[1:])`, and the sign doc is +hashed with **Keccak-256** instead of SHA-256. + +This means: + +- The same mnemonic produces **different addresses** on Cosmos vs EVM chains +- Transactions must be hashed with **Keccak-256** before signing +- Public keys use a different **type URL** in protobuf encoding +- The default **HD derivation path** uses coin type 60 (Ethereum) instead of 118 + (Cosmos) + +## Comparison + +| Aspect | Standard Cosmos | Cosmos EVM | +| ------------------- | ---------------------------------- | ------------------------------------------------ | +| HD path | `m/44'/118'/0'/0/0` | `m/44'/60'/0'/0/0` | +| Address derivation | `ripemd160(sha256(compressed))` | `keccak256(uncompressed[1:]).slice(-20)` | +| Sign doc hash | SHA-256 | Keccak-256 | +| Algo identifier | `"secp256k1"` | `"eth_secp256k1"` or `"ethsecp256k1"` | +| Amino pubkey type | `tendermint/PubKeySecp256k1` | `os/PubKeyEthSecp256k1` | +| Protobuf type URL | `/cosmos.crypto.secp256k1.PubKey` | `/cosmos.evm.crypto.v1.ethsecp256k1.PubKey` | +| Wallet class | `DirectSecp256k1HdWallet` | `DirectEthSecp256k1HdWallet` | +| Single-key wallet | `DirectSecp256k1Wallet` | `DirectEthSecp256k1Wallet` | +| Gas (send) | ~100,000 | ~120,000 | +| Denom decimals | Typically 6 | Typically 18 | +| Amino signing | Supported | Not supported (Direct signing only) | + +## Next Steps + + + + Use DirectEthSecp256k1HdWallet for EVM chains. + + + See a complete EVM-compatible chain integration. + + diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx new file mode 100644 index 000000000..e83e27cc6 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/packages.mdx @@ -0,0 +1,47 @@ +--- +title: Packages & Limitations +description: Relevant CosmJS exports for EVM support and known limitations. +--- + +CosmJS EVM support is spread across three packages. Below are the relevant exports and the known limitations when working with EVM-compatible Cosmos chains. + +## @cosmjs/amino + +| Export | Purpose | +| ------------------------------------ | ---------------------------------------------------- | +| `EthSecp256k1Pubkey` | Interface for EVM public keys in Amino format | +| `isEthSecp256k1Pubkey()` | Type guard for EVM public keys | +| `rawEthSecp256k1PubkeyToRawAddress()`| Derive raw address from compressed pubkey (Keccak) | +| `encodeEthSecp256k1Pubkey()` | Encode raw pubkey bytes to Amino format | +| `encodeEthSecp256k1Signature()` | Encode pubkey + signature to `StdSignature` | +| `isEthereumSecp256k1Account()` | Check if an account uses EVM keys | +| `getAminoPubkey()` | Auto-select correct pubkey encoding for an account | + +## @cosmjs/proto-signing + +| Export | Purpose | +| -------------------------------- | ---------------------------------------------- | +| `DirectEthSecp256k1HdWallet` | HD wallet with Keccak signing and EVM HD path | +| `DirectEthSecp256k1Wallet` | Single-key wallet with Keccak signing | + +## @cosmjs/crypto + +| Export | Purpose | +| ------------ | ---------------------------------------- | +| `keccak256` | Keccak-256 hash function | +| `Keccak256` | Streaming Keccak-256 hash class | + +## Limitations + +- **No Amino signing for EVM chains.** There is no `Secp256k1HdWallet` + equivalent for EVM keys. Use Direct signing (`DirectEthSecp256k1HdWallet`) + exclusively. +- **No `0x`-prefixed addresses.** CosmJS produces Bech32 addresses for all + chains, including EVM ones. If you need the hex Ethereum address, extract the + raw 20-byte address and hex-encode it yourself. +- **No EVM JSON-RPC.** CosmJS communicates over Tendermint/CometBFT RPC, not + Ethereum's JSON-RPC. For `eth_sendTransaction` or similar calls, use an + Ethereum library like ethers.js or viem alongside CosmJS. +- **No serialization/deserialization for EVM wallets.** Unlike + `DirectSecp256k1HdWallet`, the EVM wallet classes do not support `serialize()` + and `deserialize()` methods for encrypted storage. diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/querying.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/querying.mdx new file mode 100644 index 000000000..87e6b22e5 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/querying.mdx @@ -0,0 +1,18 @@ +--- +title: Querying +description: Read-only queries on EVM-compatible Cosmos chains with CosmJS. +--- + +Read-only queries work identically to standard chains. The account parser in +`StargateClient` automatically handles EVM public key types: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("http://localhost:26661"); + +const account = await client.getAccount("cosmos1..."); +// account.pubkey will have type "os/PubKeyEthSecp256k1" for EVM accounts + +const balance = await client.getBalance("cosmos1...", "atest"); +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx new file mode 100644 index 000000000..5b260ac10 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/signing-client.mdx @@ -0,0 +1,42 @@ +--- +title: Signing Client +description: Connecting SigningStargateClient with EVM wallets in CosmJS. +--- + +`SigningStargateClient` works with EVM wallets without any special configuration. +When signing transactions, the client inspects the `algo` field from the wallet's +`AccountData` and automatically selects the correct pubkey encoding. + + +Gas simulation (`simulate()`) always uses standard secp256k1 pubkey encoding +regardless of the wallet's `algo` field. This means `"auto"` fees may produce +incorrect simulations with EVM wallets. Use explicit `StdFee` values instead of +`"auto"` when working with `DirectEthSecp256k1HdWallet`. + + +```typescript +import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; +import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "cosmos", +}); + +const client = await SigningStargateClient.connectWithSigner( + "http://localhost:26661", + wallet, + { gasPrice: GasPrice.fromString("0.025atest") }, +); + +const [{ address }] = await wallet.getAccounts(); + +// Use an explicit StdFee with EVM wallets — see the warning above. +const fee = calculateFee(200_000, GasPrice.fromString("0.025atest")); + +const result = await client.sendTokens( + address, + "cosmos1recipient...", + [{ denom: "atest", amount: "1000000000000000000" }], + fee, +); +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx new file mode 100644 index 000000000..cac5911b5 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/signing.mdx @@ -0,0 +1,83 @@ +--- +title: Signing & Key Types +description: How EVM signing, public key types, and algo identifiers work in CosmJS. +--- + +## How Signing Works + +EVM wallets hash the serialized sign document with Keccak-256 before signing, +whereas standard wallets use SHA-256: + +```text +signBytes = SignDoc.encode(signDoc) + +# Standard +hashedMessage = sha256(signBytes) + +# EVM +hashedMessage = keccak256(signBytes) + +signature = secp256k1_sign(hashedMessage, privateKey) +``` + +The actual elliptic curve operation and signature format (64 bytes: `r || s`) are +identical — only the pre-signing hash function differs. + +## Public Key Types + +CosmJS represents public keys in two forms: Amino JSON and Protobuf. EVM chains +use distinct types in each format to signal that the key requires Keccak-based +address derivation. + +**Amino JSON:** + +```typescript +// Standard +{ type: "tendermint/PubKeySecp256k1", value: "" } + +// EVM +{ type: "os/PubKeyEthSecp256k1", value: "" } +``` + +**Protobuf (`Any`):** + +```typescript +// Standard +{ typeUrl: "/cosmos.crypto.secp256k1.PubKey", value: } + +// EVM +{ typeUrl: "/cosmos.evm.crypto.v1.ethsecp256k1.PubKey", value: } +``` + +The underlying key bytes are identical (33-byte compressed secp256k1). The +different type identifiers tell the chain how to derive the address from the key. + +## The Algo Identifier + +The `AccountData.algo` field distinguishes EVM accounts from standard ones. +Two naming conventions exist in the ecosystem: + +- `"eth_secp256k1"` — used by Keplr wallet, CosmJS wallets, and some chains +- `"ethsecp256k1"` — used by Evmos, Cronos, and other EVM-compatible chains + +CosmJS handles both through the `isEthereumSecp256k1Account()` utility: + +```typescript +import { isEthereumSecp256k1Account } from "@cosmjs/amino"; + +const [account] = await wallet.getAccounts(); +if (isEthereumSecp256k1Account(account)) { + // EVM-compatible account +} +``` + +The `getAminoPubkey()` function uses this check to select the correct encoding +automatically. This is what `SigningStargateClient` calls internally when +building transactions: + +```typescript +import { getAminoPubkey } from "@cosmjs/amino"; + +const pubkey = getAminoPubkey(account); +// Returns EthSecp256k1Pubkey or Secp256k1Pubkey based on account.algo +``` diff --git a/cosmjs/v0.38.x/concepts/cosmos-evm/wallets.mdx b/cosmjs/v0.38.x/concepts/cosmos-evm/wallets.mdx new file mode 100644 index 000000000..bf2692adb --- /dev/null +++ b/cosmjs/v0.38.x/concepts/cosmos-evm/wallets.mdx @@ -0,0 +1,58 @@ +--- +title: Wallets +description: Creating and generating EVM-compatible wallets with CosmJS. +--- + +## Creating a Wallet + +Use `DirectEthSecp256k1HdWallet` for EVM chains. It defaults to the Ethereum HD +path `m/44'/60'/0'/0/0` and uses Keccak-256 for address derivation and signing. + +```typescript +import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic( + "your mnemonic here ...", + { prefix: "cosmos" }, +); +const [{ address }] = await wallet.getAccounts(); +``` + +For a single private key (no mnemonic), use `DirectEthSecp256k1Wallet`: + +```typescript +import { DirectEthSecp256k1Wallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectEthSecp256k1Wallet.fromKey(privkeyBytes, "cosmos"); +``` + +Both wallets report `algo: "eth_secp256k1"` in their `AccountData`, which tells +the signing client to use EVM-compatible pubkey encoding. + +## Generating a New Wallet + +To generate a fresh mnemonic for an EVM chain: + +```typescript +import { DirectEthSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectEthSecp256k1HdWallet.generate(24, { + prefix: "cosmos", +}); +console.info("Mnemonic:", wallet.mnemonic); + +const [{ address }] = await wallet.getAccounts(); +console.info("Address:", address); +``` + +The default options derive from `m/44'/60'/0'/0/0`. You can customize the HD +path and prefix: + +```typescript +import { stringToPath } from "@cosmjs/crypto"; + +const wallet = await DirectEthSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "evmos", + hdPaths: [stringToPath("m/44'/60'/0'/0/0")], +}); +``` diff --git a/cosmjs/v0.38.x/concepts/errors/encoding.mdx b/cosmjs/v0.38.x/concepts/errors/encoding.mdx new file mode 100644 index 000000000..f9d340635 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/encoding.mdx @@ -0,0 +1,66 @@ +--- +title: Encoding Errors +description: Protobuf registry, Bech32, hex, Base64, and public key encoding errors. +--- + +These errors occur when encoding or decoding data — Protobuf messages, Bech32 addresses, hex strings, Base64, and public keys. Most are caused by missing type registrations or malformed input. + +## Registry (Protobuf) + +Thrown when encoding or decoding a message whose type URL is not registered: + +``` +"Unregistered type url: /my.custom.MsgCustom" +``` + +Fix: register the type before use: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/my.custom.MsgCustom", MsgCustom); +``` + +Also thrown for malformed `Any` values: + +``` +"Missing type_url in Any" +"Missing value in Any" +``` + +## Bech32 + +Thrown by `fromBech32` for invalid addresses: + +``` +"No bech32 separator found" // String has no '1' separator +"invalid checksum" // Corrupted or wrong address +"must be lowercase or uppercase" // Mixed case +"length X exceeds limit Y" // Address too long +``` + +## Hex + +``` +"hex string length must be a multiple of 2" +"hex string contains invalid characters" +``` + +## Base64 + +``` +"Invalid base64 string format" +``` + +## Pubkey Type + +Thrown when an unrecognized public key type is encountered during +encoding/decoding: + +``` +"Unsupported pubkey type" +"Pubkey type_url '...' not recognized as single public key type" +"Pubkey type URL '...' not recognized" +``` diff --git a/cosmjs/v0.38.x/concepts/errors/error-classes.mdx b/cosmjs/v0.38.x/concepts/errors/error-classes.mdx new file mode 100644 index 000000000..43ed018a4 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/error-classes.mdx @@ -0,0 +1,95 @@ +--- +title: Error Classes +description: Dedicated error classes for the broadcast and execution lifecycle in CosmJS. +--- + +CosmJS surfaces errors at every stage of a transaction's lifecycle — from +building and signing through broadcasting and on-chain execution. + +```mermaid +flowchart LR + A["Encoding / Building"] --> B["Signing"] --> C["Broadcast (Submit)"] --> D["CheckTx (Mempool)"] --> E["DeliverTx (Execute)"] +``` + +| Stage | Error source | +| --- | --- | +| Encoding / Building | Registry & encoding errors | +| Signing | Key & wallet errors | +| Broadcast (Submit) | Transport errors | +| CheckTx (Mempool) | `BroadcastTxError` | +| DeliverTx (Execute) | Execution errors | + +CosmJS defines two dedicated error classes for the broadcast/execution lifecycle. +All other errors are thrown as plain `Error` instances with descriptive messages. + +## `TimeoutError` + +Thrown when a transaction is successfully submitted to the node but is not +included in a block before the timeout expires (default: 60 seconds). The +transaction may still succeed later. + +```typescript +import { TimeoutError } from "@cosmjs/stargate"; + +class TimeoutError extends Error { + public readonly txId: string; +} +``` + +The `txId` property lets you query the transaction later: + +```typescript +try { + const result = await client.broadcastTx(txBytes); +} catch (error) { + if (error instanceof TimeoutError) { + // Transaction was submitted — check later + const tx = await client.getTx(error.txId); + } +} +``` + +You can increase the timeout when broadcasting: + +```typescript +const result = await client.broadcastTx(txBytes, 120_000); // 120 seconds +``` + +Or set it globally via client options: + +```typescript +const client = await SigningStargateClient.connectWithSigner(endpoint, signer, { + broadcastTimeoutMs: 120_000, + broadcastPollIntervalMs: 5_000, +}); +``` + +## `BroadcastTxError` + +Thrown when the node rejects a transaction during **CheckTx** — before the +transaction enters the mempool. This is a definitive rejection; the transaction +will not be included in a block. + +```typescript +import { BroadcastTxError } from "@cosmjs/stargate"; + +class BroadcastTxError extends Error { + public readonly code: number; + public readonly codespace: string; + public readonly log: string | undefined; +} +``` + +Common causes include invalid addresses, insufficient fees, badly formed +messages, and sequence mismatches: + +```typescript +try { + const result = await client.signAndBroadcast(address, messages, fee); +} catch (error) { + if (error instanceof BroadcastTxError) { + console.error(`Rejected (code ${error.code}, codespace: ${error.codespace})`); + console.error("Log:", error.log); + } +} +``` diff --git a/cosmjs/v0.38.x/concepts/errors/error-handling.mdx b/cosmjs/v0.38.x/concepts/errors/error-handling.mdx new file mode 100644 index 000000000..caf3acd37 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/error-handling.mdx @@ -0,0 +1,76 @@ +--- +title: Error Handling Pattern +description: Recommended pattern for handling all transaction failure modes in CosmJS. +--- + +A robust transaction flow should handle all three failure modes — CheckTx +rejection, timeout, and execution failure: + +```typescript +import { + SigningStargateClient, + GasPrice, + TimeoutError, + BroadcastTxError, + isDeliverTxSuccess, + Coin, +} from "@cosmjs/stargate"; + +async function sendTokens( + client: SigningStargateClient, + sender: string, + recipient: string, + amount: readonly Coin[], +): Promise { + try { + const result = await client.sendTokens(sender, recipient, amount, "auto"); + + if (isDeliverTxSuccess(result)) { + return result.transactionHash; + } + + // Execution failed (out of gas, insufficient funds, etc.) + throw new Error( + `Transaction ${result.transactionHash} failed with code ${result.code}: ${result.rawLog}`, + ); + } catch (error) { + if (error instanceof BroadcastTxError) { + // CheckTx rejection — do not retry without fixing the issue + throw error; + } + + if (error instanceof TimeoutError) { + // Transaction may still succeed — query later + console.warn("Transaction submitted but not yet confirmed:", error.txId); + throw error; + } + + throw error; + } +} +``` + +## Error Summary + +| Stage | Error type | Retryable? | Key fields | +| --- | --- | --- | --- | +| Encoding | `Error` | No | Fix input data | +| Signing | `Error` | No | Fix wallet/key setup | +| Transport (HTTP) | `Error` | Often | `cause.status`, `cause.body` | +| Transport (WebSocket) | `Error` | Reconnects automatically | — | +| CheckTx | `BroadcastTxError` | Rarely | `code`, `codespace`, `log` | +| Block inclusion | `TimeoutError` | Query later | `txId` | +| DeliverTx | `DeliverTxResponse` | Depends | `code`, `rawLog`, `events` | +| Query | `Error` | Depends | Error message | +| Simulation | `Error` | Fix input | Error message | + +## Next Steps + + + + Explore CosmJS error types and their properties. + + + Handle CheckTx failures and execution errors. + + diff --git a/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx b/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx new file mode 100644 index 000000000..77f97364f --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/gas-estimation.mdx @@ -0,0 +1,34 @@ +--- +title: Gas Estimation Errors +description: Errors from gas price configuration and transaction simulation. +--- + +These errors occur when gas pricing is misconfigured or when transaction simulation fails. They are most commonly encountered when using `"auto"` fee estimation. + +## Missing Gas Price + +Thrown when using `"auto"` fee without setting a gas price: + +``` +"Gas price must be set in the client options when auto gas is used." +``` + + +Fix: pass `gasPrice` when creating the signing client: + +```typescript +const client = await SigningStargateClient.connectWithSigner(endpoint, signer, { + gasPrice: GasPrice.fromString("0.025uatom"), +}); +``` + +## Simulation Failure + +`simulate` throws if the signer address is not found in the wallet: + +``` +"Failed to retrieve account from signer" +``` + +If the simulation itself fails (e.g. message validation errors), the underlying +gRPC error propagates. diff --git a/cosmjs/v0.38.x/concepts/errors/ledger.mdx b/cosmjs/v0.38.x/concepts/errors/ledger.mdx new file mode 100644 index 000000000..59ff64d80 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/ledger.mdx @@ -0,0 +1,14 @@ +--- +title: Ledger Errors +description: Errors from Ledger hardware wallet interactions via @cosmjs/ledger-amino. +--- + +The `@cosmjs/ledger-amino` package throws specific errors for device +interactions: + +| Error | Cause | +| --- | --- | +| `"Please open the Cosmos Ledger app on your Ledger device."` | Dashboard is open instead of Cosmos app | +| `"Please close ... and open the Cosmos Ledger app..."` | Wrong app is open | +| `"Outdated version: Please update ... Ledger App..."` | Ledger app needs a firmware update | +| `"DANGER: The ... Ledger app is in test mode..."` | Test mode enabled on mainnet | diff --git a/cosmjs/v0.38.x/concepts/errors/queries.mdx b/cosmjs/v0.38.x/concepts/errors/queries.mdx new file mode 100644 index 000000000..dc5a51efa --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/queries.mdx @@ -0,0 +1,42 @@ +--- +title: Query Errors +description: Errors from account lookups, ABCI queries, and CosmWasm smart queries. +--- + +These errors occur when querying accounts, contracts, or other on-chain resources. CosmJS handles many "not found" cases gracefully by returning `null`, but some queries throw when a value is required. + +## Account / Resource Not Found + +Methods like `getAccount` and `getDelegation` catch "not found" +gRPC errors internally and return `null` instead of throwing: + +```typescript +const account = await client.getAccount("cosmos1nonexistent..."); +// Returns null, does not throw +``` + +`getContract` does not return `null` — it throws if no contract is found at the +given address. + +`getSequence` also throws if the account does not exist because a sequence +number is always required for signing: + +``` +"Account 'cosmos1...' does not exist on chain. Send some tokens there before trying to query sequence." +``` + +## ABCI Query Failure + +Low-level query failures throw with the code and log from the node: + +``` +"Query failed with (6): unknown request" +``` + +## CosmWasm Query Errors + +``` +"No contract found at address \"cosmos1...\"" +"Could not UTF-8 decode smart query response from contract: ..." +"Could not JSON parse smart query response from contract: ..." +``` diff --git a/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx b/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx new file mode 100644 index 000000000..59502c99d --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/signing-wallet.mdx @@ -0,0 +1,89 @@ +--- +title: Signing & Wallet Errors +description: Errors from key management, mnemonic handling, HD derivation, and signing operations. +--- + +These errors occur during key management, mnemonic handling, HD derivation, wallet encryption, and signing operations. They help diagnose issues with wallet setup and transaction signing. + +## Address Not Found in Wallet + +Every wallet implementation throws this error when asked to sign for an address +it does not hold: + +``` +"Address cosmos1abc... not found in wallet" +``` + +This applies to `Secp256k1HdWallet`, `DirectSecp256k1HdWallet`, +`Secp256k1Wallet`, `DirectSecp256k1Wallet`, and the Ledger signer. + +Fix: only sign for addresses returned by `wallet.getAccounts()`. + +## Invalid Mnemonic + +Thrown by `EnglishMnemonic` (and by extension all `fromMnemonic` factory methods) +when the BIP-39 mnemonic is invalid — wrong word count, unknown words, or bad +checksum: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +try { + const wallet = await DirectSecp256k1HdWallet.fromMnemonic("invalid words here"); +} catch (error) { + // BIP-39 validation error from EnglishMnemonic (@cosmjs/crypto) / @scure/bip39 +} +``` + +## HD Derivation Path Errors + +Thrown by `Slip10` when the derivation path is malformed: + +| Error | Cause | +| --- | --- | +| `"Path string must start with 'm'"` | Missing `m` prefix | +| `"Syntax error while reading path component"` | Malformed path segment | +| `"Component value too high. Must not exceed 2**31-1."` | Index out of BIP-32 range | +| `"Normal keys are not allowed with ed25519"` | Ed25519 requires hardened indices | + +## Invalid Key Errors + +``` +"input data is not a valid secp256k1 private key" // Wrong length or invalid key bytes +"Invalid pubkey length" // Expected 33 (compressed) or 65 (uncompressed) +"Signature must be 64 bytes long." // r + s must be exactly 64 bytes +``` + +## Account Sequence Mismatch + +Not a CosmJS-specific error, but a common chain-level rejection. When the +sequence number in the signed transaction does not match the account's current +sequence on-chain, the node rejects it during CheckTx: + +``` +BroadcastTxError: Broadcasting transaction failed with code 32 (codespace: sdk). +Log: account sequence mismatch, expected 42, got 41 +``` + +Fix: re-query the account sequence before signing, or avoid concurrent +transactions from the same account. + +## Encryption / Decryption Errors + +Wallet serialization uses XChaCha20-Poly1305 encryption. Deserialization throws +when the password is wrong or the data is corrupted: + +```typescript +try { + const wallet = await DirectSecp256k1HdWallet.deserialize(serialized, "wrong-password"); +} catch (error) { + // Decryption failure from @noble/ciphers +} +``` + +The only supported algorithm is `xchacha20poly1305-ietf`. Using anything else +throws: + +``` +"Unsupported encryption algorithm: '...'" +``` diff --git a/cosmjs/v0.38.x/concepts/errors/transaction-execution.mdx b/cosmjs/v0.38.x/concepts/errors/transaction-execution.mdx new file mode 100644 index 000000000..e1036546c --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/transaction-execution.mdx @@ -0,0 +1,59 @@ +--- +title: Transaction Execution Errors +description: Handling transaction execution failures from DeliverTx responses. +--- + +When a transaction is included in a block but execution fails (e.g. out of gas, +insufficient funds, contract panic), `broadcastTx` does **not** throw. Instead +it returns a `DeliverTxResponse` with a non-zero `code`. + +## Checking Success or Failure + +```typescript +import { + isDeliverTxSuccess, + isDeliverTxFailure, + assertIsDeliverTxSuccess, +} from "@cosmjs/stargate"; + +const result = await client.signAndBroadcast(address, messages, fee); + +if (isDeliverTxSuccess(result)) { + console.info("Success:", result.transactionHash); +} else { + console.error(`Failed with code ${result.code}: ${result.rawLog}`); +} + +// Or throw on failure: +assertIsDeliverTxSuccess(result); +// Throws: "Error when broadcasting tx at height . Code: ; Raw log: " +``` + +## Common Execution Failures + +| Failure | Where it appears | Typical cause | +| --- | --- | --- | +| Out of gas | `result.rawLog` contains "out of gas" | Gas limit too low; increase fee or use `"auto"` | +| Insufficient funds | `result.rawLog` contains "insufficient funds" | Sender balance too low for amount + fee | +| Invalid message | `result.rawLog` describes the validation error | Wrong field values or missing required fields | +| Contract error | `result.rawLog` contains the contract error | CosmWasm contract returned an error | + +CosmJS does not define constants for Cosmos SDK error codes. The `code` and +`codespace` fields are passed through from the node. Inspect `rawLog` (SDK < +0.50) or `events` (SDK 0.50+) for human-readable details. + +## CosmWasm Convenience Methods + +Methods like `upload`, `instantiate`, `execute`, and `migrate` on +`SigningCosmWasmClient` throw a plain `Error` when `isDeliverTxFailure` is true, +instead of returning the `DeliverTxResponse`: + +```typescript +try { + const { contractAddress } = await client.instantiate( + sender, codeId, msg, label, "auto", + ); +} catch (error) { + // "Error when broadcasting tx at height . Code: ; Raw log: " +} +``` diff --git a/cosmjs/v0.38.x/concepts/errors/transport.mdx b/cosmjs/v0.38.x/concepts/errors/transport.mdx new file mode 100644 index 000000000..56b73d8ed --- /dev/null +++ b/cosmjs/v0.38.x/concepts/errors/transport.mdx @@ -0,0 +1,97 @@ +--- +title: Transport Errors +description: HTTP, WebSocket, and JSON-RPC errors between CosmJS and RPC nodes. +--- + +Transport errors occur between CosmJS and the RPC node. They depend on which +transport you use (HTTP or WebSocket). + +## HTTP Errors + +**Bad status (HTTP >= 400)** + +Thrown by the low-level HTTP layer when the node responds with a non-2xx status. +The `cause` property carries the status code and response body: + +```typescript +try { + const client = await StargateClient.connect("https://rpc.my-chain.network"); +} catch (error) { + // "Bad status on response: 429" + const { status, body } = (error as Error).cause as { status: number; body: string }; +} +``` + +Common status codes: + +| Status | Meaning | Action | +| --- | --- | --- | +| 401 / 403 | Authentication required | Add auth headers via `HttpEndpoint` | +| 404 | Wrong URL or path | Verify the RPC endpoint URL | +| 429 | Rate limited | Back off and retry; use multiple endpoints | +| 502 / 503 / 504 | Server error / gateway timeout | Retry with exponential backoff | + +**Request timeout (AbortError)** + +When an HTTP client is configured with a timeout, requests that exceed it throw a +`DOMException` with `name === "AbortError"`: + +```typescript +import { HttpClient } from "@cosmjs/tendermint-rpc"; + +const httpClient = new HttpClient("https://rpc.my-chain.network", 10_000); // 10s timeout +``` + +**Invalid URL** + +Thrown immediately if the endpoint URL is missing a protocol: + +``` +"Endpoint URL is missing a protocol. Expected 'https://' or 'http://'." +``` + +## WebSocket Errors + +**Connection timeout** + +Thrown when the WebSocket handshake does not complete within the timeout +(default: 10 seconds): + +``` +"Connection attempt timed out after 10000 ms" +``` + +**Socket closed** + +Thrown when sending on a closed or not-yet-open socket: + +``` +"Socket was closed, so no data can be sent anymore." +"Websocket is not open" +``` + +**Invalid URL** + +``` +"Base URL is missing a protocol. Expected 'ws://' or 'wss://'." +``` + +## JSON-RPC Errors + +When the node returns a JSON-RPC error response, CosmJS throws an `Error` whose +message is the serialized error object. Standard JSON-RPC error codes: + +| Code | Meaning | +| --- | --- | +| -32700 | Parse error | +| -32600 | Invalid request | +| -32601 | Method not found | +| -32602 | Invalid params | +| -32603 | Internal error | +| -32000 | Server error (custom) | + +## Reconnection + +`WebsocketClient` uses `ReconnectingSocket` internally with exponential backoff +(100ms to 5s). HTTP clients do **not** retry automatically — implement retries +in your application if needed. diff --git a/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx new file mode 100644 index 000000000..fdb277f85 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing.mdx @@ -0,0 +1,122 @@ +--- +title: Dynamic Gas Pricing +description: Querying on-chain fee markets and the chain registry for gas prices +--- + +Some chains implement dynamic gas pricing through fee market modules. Instead of +hardcoding a gas price, CosmJS can query the current base fee from the chain and +adjust automatically. + +This is supported for: + +- **Osmosis** — EIP-1559 style fee market (`/osmosis.txfees.v1beta1.Query/GetEipBaseFee`) +- **Skip feemarket** — used by Cosmos Hub and other chains (`/feemarket.feemarket.v1.Query/GasPrices`) + +## Configuration + +Pass a `DynamicGasPriceConfig` instead of a static `GasPrice`: + +```typescript +import { + SigningStargateClient, + GasPrice, + DynamicGasPriceConfig, +} from "@cosmjs/stargate"; + +const dynamicConfig: DynamicGasPriceConfig = { + denom: "uatom", + minGasPrice: GasPrice.fromString("0.005uatom"), + maxGasPrice: GasPrice.fromString("0.1uatom"), + multiplier: 1.3, +}; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: dynamicConfig }, +); + +const result = await client.signAndBroadcast(address, messages, "auto"); +``` + +## How It Works + +When `"auto"` fee is used with a `DynamicGasPriceConfig`: + +1. The chain's fee module is queried for the current base gas price (Osmosis uses `/osmosis.txfees.v1beta1.Query/GetEipBaseFee`; other chains use Skip's `/feemarket.feemarket.v1.Query/GasPrices`) +2. The `multiplier` is applied (default 1.3x) to stay above the minimum +3. The result is clamped between `minGasPrice` and `maxGasPrice` +4. If the query fails, `minGasPrice` is used as a fallback + +## DynamicGasPriceConfig Fields + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `denom` | `string` | Yes | Token denomination to query the gas price for | +| `minGasPrice` | `GasPrice` | Yes | Floor price (also used as fallback if the query fails) | +| `maxGasPrice` | `GasPrice` | No | Ceiling price. If not set, no maximum is enforced | +| `multiplier` | `number` | No | Multiplier on the queried price. Defaults to 1.3 | + + +## Checking Support + +You can verify whether a chain supports dynamic gas pricing before configuring +it: + +```typescript +import { checkDynamicGasPriceSupport } from "@cosmjs/stargate"; + +const supported = await checkDynamicGasPriceSupport( + queryClient, + "uatom", + "cosmoshub-4", +); +``` + +## Getting Gas Prices from the Chain Registry + +CosmJS does not integrate with the +[Cosmos Chain Registry](https://github.com/cosmos/chain-registry) directly, but +you can use it as a source for gas prices. The registry publishes recommended gas +prices for each chain in its `chain.json` files. + +### Fetching from the Chain Registry + +```typescript +import { GasPrice } from "@cosmjs/stargate"; + +const registryUrl = + "https://raw.githubusercontent.com/cosmos/chain-registry/master/cosmoshub/chain.json"; +const response = await fetch(registryUrl); +const chainInfo = await response.json(); + +const feeToken = chainInfo.fees.fee_tokens.find( + (t: any) => t.denom === "uatom", +); + +const gasPrice = GasPrice.fromString( + `${feeToken.average_gas_price}${feeToken.denom}`, +); +``` + +The chain registry typically provides three gas price tiers per token: + +| Field | Description | +|-------|-------------| +| `low_gas_price` | Minimum price — may be rejected during congestion | +| `average_gas_price` | Recommended default | +| `high_gas_price` | For priority during high traffic | + +Using `average_gas_price` is a reasonable default. Use `high_gas_price` for +time-sensitive transactions. + +### Libraries That Wrap the Registry + +Several community libraries provide typed access to the chain registry: + +- [`chain-registry`](https://www.npmjs.com/package/chain-registry) — typed + chain registry data as an npm package +- [`@chain-registry/client`](https://www.npmjs.com/package/@chain-registry/client) — + client with fetching and caching + +These are external packages, not part of CosmJS. diff --git a/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx b/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx new file mode 100644 index 000000000..9cece0ae5 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/fees-gas/fee-grants.mdx @@ -0,0 +1,54 @@ +--- +title: Fee Grants +description: Using the fee grant module to let one account pay fees for another +--- + +Cosmos SDK's fee grant module allows one account (the **granter**) to pay +transaction fees on behalf of another account (the **grantee**). This is useful +for onboarding users who don't yet hold tokens. + +## Sending a Transaction with a Fee Grant + +Set the `granter` field on the `StdFee` object: + +```typescript +import { coins } from "@cosmjs/proto-signing"; + +const fee = { + amount: coins(5000, "uatom"), + gas: "200000", + granter: "cosmos1granter...", +}; + +const result = await client.signAndBroadcast(granteeAddress, messages, fee); +``` + +The granter must have previously granted a fee allowance to the grantee on-chain +(using `MsgGrantAllowance`). + +## Querying Fee Allowances + +Use the feegrant query extension to check existing grants: + +```typescript +import { + QueryClient, + setupFeegrantExtension, +} from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupFeegrantExtension, +); + +const allowance = await queryClient.feegrant.allowance( + "cosmos1granter...", + "cosmos1grantee...", +); + +const allAllowances = await queryClient.feegrant.allowances( + "cosmos1grantee...", +); +``` diff --git a/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx new file mode 100644 index 000000000..d3a41f66f --- /dev/null +++ b/cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees.mdx @@ -0,0 +1,183 @@ +--- +title: Gas & Fees +description: How gas and fees work in Cosmos SDK transactions and how CosmJS represents them +--- + +Every Cosmos SDK transaction requires a **fee** to compensate validators for +executing it. This guide explains how gas and fees work, how CosmJS calculates +them, and how to configure gas pricing. + +## Gas vs Fees + +These two terms are related but distinct: + +- **Gas** is a unit of computational work. Every operation in a transaction + (reading state, writing state, signature verification, etc.) costs a certain + amount of gas. The total gas consumed by a transaction is its **gas used**. +- **Gas limit** is the maximum gas a transaction is allowed to consume. If + execution exceeds this limit, the transaction fails (and the fee is still + charged). +- **Gas price** is the price per unit of gas, denominated in a token (e.g. + `0.025uatom`). It determines how much you pay per unit of work. +- **Fee** is the total cost: `gas limit × gas price`. It is what the signer + actually pays. + +In CosmJS, a fee is represented as `StdFee`: + +```typescript +interface StdFee { + readonly amount: readonly Coin[]; + readonly gas: string; + readonly granter?: string; + readonly payer?: string; +} +``` + +The `gas` field is the gas limit (as a string), and `amount` is the total fee in +coins. A fee of 200,000 gas at 0.025 uatom/gas costs 5,000 uatom: + +```typescript +{ + amount: [{ denom: "uatom", amount: "5000" }], + gas: "200000", +} +``` + +## Setting Gas Price + +`GasPrice` represents the cost per unit of gas. Set it once when creating the +signing client and use `"auto"` fees everywhere: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); +``` + +You can also construct a `GasPrice` from its parts: + +```typescript +import { Decimal } from "@cosmjs/math"; +import { GasPrice } from "@cosmjs/stargate"; + +const gasPrice = new GasPrice(Decimal.fromUserInput("0.025", 18), "uatom"); +``` + +`GasPrice.fromString` parses a `` string. The input regex requires the denom to start with a letter followed by alphanumeric characters or `/`, `:`, `.`, `_`, `-`. It also validates that the denom is 3–128 characters in length. + +## Three Ways to Specify Fees + +Every transaction method (`signAndBroadcast`, `sendTokens`, `delegateTokens`, +etc.) accepts a `fee` parameter in one of three forms: + +### 1. `"auto"` — Simulate and Calculate + +The simplest option. CosmJS simulates the transaction to estimate gas, applies a +safety multiplier (default 1.4x), and calculates the fee from the configured gas +price: + +```typescript +const result = await client.signAndBroadcast(address, messages, "auto"); +``` + +This requires `gasPrice` to be set in the client options. If it is not set, an +error is thrown. + +### 2. A Number — Custom Gas Multiplier + +Pass a number to override the default 1.4x safety buffer. The simulation still +runs, but your multiplier is used instead: + +```typescript +const result = await client.signAndBroadcast(address, messages, 1.2); + +const result = await client.signAndBroadcast(address, messages, 2.0); +``` + +### 3. `StdFee` — Explicit Fee + +For full control, pass a `StdFee` object directly. No simulation runs: + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, GasPrice.fromString("0.025uatom")); + +const result = await client.signAndBroadcast(address, messages, fee); +``` + +## Calculating Fees Manually + +`calculateFee` multiplies a gas limit by a gas price and returns a `StdFee`: + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, GasPrice.fromString("0.025uatom")); +// { amount: [{ denom: "uatom", amount: "5000" }], gas: "200000" } +``` + +`calculateFee` also accepts a gas price string directly: + +```typescript +const fee = calculateFee(200_000, "0.025uatom"); +``` + +The multiplication uses `Decimal` arithmetic internally, so it handles gas +prices that would overflow JavaScript's safe integer range (e.g. chains with +18-decimal tokens): + +```typescript +const fee = calculateFee(500_000, GasPrice.fromString("5000000000000tiny")); +// { amount: [{ denom: "tiny", amount: "2500000000000000000" }], gas: "500000" } +``` + +## Common Gas Limits + +These are rough estimates for common transactions. Actual gas varies by chain +version, state, and message complexity: + +| Transaction | Typical Gas | +|-------------|-------------| +| `MsgSend` (token transfer) | 80,000 – 120,000 | +| `MsgDelegate` | 200,000 – 300,000 | +| `MsgUndelegate` | 200,000 – 300,000 | +| `MsgWithdrawDelegatorReward` | 150,000 – 250,000 | +| `MsgVote` | 80,000 – 120,000 | +| IBC `MsgTransfer` | 150,000 – 250,000 | +| CosmWasm `MsgExecuteContract` | 200,000 – 1,000,000+ | +| CosmWasm `MsgStoreCode` | 1,000,000 – 5,000,000+ | + +Use `"auto"` unless you have a specific reason to set gas manually. The +simulation-based approach adapts to the actual cost of your transaction. + +## Choosing the Right Approach + +| Situation | Recommendation | +|-----------|---------------| +| Standard app with known chain | Set `gasPrice` in client options, use `"auto"` everywhere | +| Multi-chain app | Fetch gas prices from the chain registry at startup | +| Chain with fee market (Osmosis, Cosmos Hub) | Use `DynamicGasPriceConfig` | +| Fee-sensitive application | Simulate first, apply a conservative multiplier (1.5–2.0x) | +| Offline or air-gapped signing | Calculate fees manually with `calculateFee` | +| Sponsored transactions | Use fee grants with the `granter` field | + +## Next Steps + + + + Simulate transactions to estimate gas. + + + Use fee market pricing for chains like Osmosis. + + diff --git a/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx b/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx new file mode 100644 index 000000000..164414395 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/fees-gas/simulation.mdx @@ -0,0 +1,49 @@ +--- +title: Transaction Simulation +description: Estimating gas consumption before broadcasting transactions +--- + +Simulation executes the transaction against the current chain state without +broadcasting it. The chain returns how much gas the transaction would consume. + +## Using `simulate` Directly + +```typescript +const gasEstimate = await client.simulate(address, messages, "optional memo"); +``` + +`simulate` returns the gas used as a `number`. You can then add a buffer and +compute the fee: + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const gasEstimate = await client.simulate(address, messages, memo); +const gasLimit = Math.ceil(gasEstimate * 1.5); +const fee = calculateFee(gasLimit, GasPrice.fromString("0.025uatom")); + +const result = await client.signAndBroadcast(address, messages, fee, memo); +``` + +## How `"auto"` Uses Simulation + +When you pass `"auto"` or a number, the client calls `simulate` internally: + +1. The transaction is built with an empty signature and sent to the chain's + `Simulate` endpoint +2. The chain executes it in a read-only context and returns `gasUsed` +3. The client multiplies by the gas multiplier (default 1.4x, or the value you + passed) +4. `calculateFee` converts the gas limit to a `StdFee` using the configured gas + price + +The 1.4x default was chosen because Cosmos SDK 0.47+ sometimes uses +significantly more gas than simulation predicts. Earlier versions used 1.3x. + +## Caveats + +- Simulation is an **estimate**. Actual gas can differ if chain state changes + between simulation and execution. +- The multiplier buffer protects against this, but extremely volatile state + (e.g. many concurrent transactions) may still cause out-of-gas errors. +- Simulation requires an RPC connection. Offline clients cannot simulate. diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding.mdx new file mode 100644 index 000000000..142c84d0c --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding.mdx @@ -0,0 +1,101 @@ +--- +title: Amino (JSON) Encoding +description: Legacy JSON-based signing format used by Ledger wallets and older chains +--- + +Amino is the legacy signing format where the sign document is deterministic +JSON rather than Protobuf binary. It is still required for Ledger hardware +wallets and some older chains. + +## AminoMsg vs EncodeObject + +| | AminoMsg | EncodeObject | +|-|----------|--------------| +| **Package** | `@cosmjs/amino` | `@cosmjs/proto-signing` | +| **Identifier** | `type` (e.g. `"cosmos-sdk/MsgSend"`) | `typeUrl` (e.g. `"/cosmos.bank.v1beta1.MsgSend"`) | +| **Value format** | JSON with snake_case fields | Protobuf message with camelCase fields | +| **Serialization** | Sorted JSON → UTF-8 | Protobuf binary | + +An Amino message looks like: + +```typescript +interface AminoMsg { + readonly type: string; + readonly value: Record; +} + +const aminoMsg: AminoMsg = { + type: "cosmos-sdk/MsgSend", + value: { + from_address: "cosmos1sender...", + to_address: "cosmos1recipient...", + amount: [{ denom: "uatom", amount: "1000000" }], + }, +}; +``` + +## StdSignDoc + +The Amino sign document is a JSON object with sorted keys: + +```typescript +interface StdSignDoc { + readonly chain_id: string; + readonly account_number: string; + readonly sequence: string; + readonly fee: StdFee; + readonly msgs: readonly AminoMsg[]; + readonly memo: string; + readonly timeout_height?: string; +} +``` + +Signing flow: + +1. Build `StdSignDoc` with `makeSignDoc()` +2. Sort all keys deterministically with `sortedJsonStringify()` +3. Escape `&`, `<`, `>` characters +4. Convert to UTF-8 bytes +5. Hash with SHA-256 and sign + +## AminoTypes: Converting Between Formats + +`AminoTypes` (from `@cosmjs/stargate`) bridges the two worlds. It converts +`EncodeObject` ↔ `AminoMsg` using registered converters: + +```typescript +import { AminoTypes, createDefaultAminoConverters } from "@cosmjs/stargate"; + +const aminoTypes = new AminoTypes(createDefaultAminoConverters()); + +const aminoMsg = aminoTypes.toAmino(encodeObject); +const encodeObject = aminoTypes.fromAmino(aminoMsg); +``` + +Each converter defines the mapping between Protobuf and Amino representations: + +```typescript +{ + "/cosmos.bank.v1beta1.MsgSend": { + aminoType: "cosmos-sdk/MsgSend", + toAmino: ({ fromAddress, toAddress, amount }) => ({ + from_address: fromAddress, // camelCase → snake_case + to_address: toAddress, + amount: [...amount], + }), + fromAmino: ({ from_address, to_address, amount }) => ({ + fromAddress: from_address, // snake_case → camelCase + toAddress: to_address, + amount: [...amount], + }), + }, +} +``` + +When the signing client detects an Amino signer, it: + +1. Converts each `EncodeObject` to `AminoMsg` via `aminoTypes.toAmino()` +2. Builds a `StdSignDoc` and signs it +3. Converts the signed messages back via `aminoTypes.fromAmino()` +4. Encodes the final transaction as Protobuf (even Amino-signed transactions + are broadcast as Protobuf `TxRaw`) diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx new file mode 100644 index 000000000..033454161 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects.mdx @@ -0,0 +1,71 @@ +--- +title: EncodeObject +description: The JavaScript representation of Cosmos SDK messages in CosmJS +--- + +In CosmJS, the JavaScript representation of a type-URL-tagged message is an +`EncodeObject`: + +```typescript +interface EncodeObject { + readonly typeUrl: string; + readonly value: any; +} +``` + +You construct one by pairing a type URL with a partial Protobuf message: + +```typescript +import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; +import { coins } from "@cosmjs/proto-signing"; + +const msg: EncodeObject = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ + fromAddress: "cosmos1sender...", + toAddress: "cosmos1recipient...", + amount: coins(1_000_000, "uatom"), + }), +}; +``` + +## Typed Encode Objects + +CosmJS also provides **typed encode objects** for common messages. These narrow +the `typeUrl` to a string literal and constrain `value` to the correct Protobuf +type, giving you compile-time safety: + +```typescript +import { MsgSendEncodeObject } from "@cosmjs/stargate"; + +const msg: MsgSendEncodeObject = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ ... }), +}; +``` + +### Available in `@cosmjs/stargate` + +| Type | typeUrl | +|------|---------| +| `MsgSendEncodeObject` | `/cosmos.bank.v1beta1.MsgSend` | +| `MsgDelegateEncodeObject` | `/cosmos.staking.v1beta1.MsgDelegate` | +| `MsgUndelegateEncodeObject` | `/cosmos.staking.v1beta1.MsgUndelegate` | +| `MsgBeginRedelegateEncodeObject` | `/cosmos.staking.v1beta1.MsgBeginRedelegate` | +| `MsgWithdrawDelegatorRewardEncodeObject` | `/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward` | +| `MsgDepositEncodeObject` | `/cosmos.gov.v1beta1.MsgDeposit` | +| `MsgSubmitProposalEncodeObject` | `/cosmos.gov.v1beta1.MsgSubmitProposal` | +| `MsgVoteEncodeObject` | `/cosmos.gov.v1beta1.MsgVote` | +| `MsgTransferEncodeObject` | `/ibc.applications.transfer.v1.MsgTransfer` | + +### Available in `@cosmjs/cosmwasm` + +| Type | typeUrl | +|------|---------| +| `MsgStoreCodeEncodeObject` | `/cosmwasm.wasm.v1.MsgStoreCode` | +| `MsgInstantiateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract` | +| `MsgInstantiateContract2EncodeObject` | `/cosmwasm.wasm.v1.MsgInstantiateContract2` | +| `MsgExecuteContractEncodeObject` | `/cosmwasm.wasm.v1.MsgExecuteContract` | +| `MsgMigrateContractEncodeObject` | `/cosmwasm.wasm.v1.MsgMigrateContract` | +| `MsgUpdateAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgUpdateAdmin` | +| `MsgClearAdminEncodeObject` | `/cosmwasm.wasm.v1.MsgClearAdmin` | diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding.mdx new file mode 100644 index 000000000..6ff3363cb --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding.mdx @@ -0,0 +1,57 @@ +--- +title: Encoding & Decoding +description: Binary encoding helpers and decoding transactions in CosmJS +--- + +## Encoding Utilities + +`@cosmjs/encoding` provides conversions between common formats: + +| Function | Input | Output | Use case | +|----------|-------|--------|----------| +| `toHex` / `fromHex` | `Uint8Array` ↔ `string` | Hex strings | Transaction hashes, debug output | +| `toBase64` / `fromBase64` | `Uint8Array` ↔ `string` | Base64 strings | Public keys, signatures in JSON | +| `toUtf8` / `fromUtf8` | `string` ↔ `Uint8Array` | UTF-8 bytes | Amino sign docs, contract messages | +| `toAscii` / `fromAscii` | `string` ↔ `Uint8Array` | ASCII bytes | Printable ASCII only (0x20–0x7E) | +| `toRfc3339` / `fromRfc3339` | `Date` ↔ `string` | ISO timestamps | Block times, governance deadlines | + +```typescript +import { toHex, fromHex, toBase64, fromBase64, toUtf8, fromUtf8 } from "@cosmjs/encoding"; + +toHex(new Uint8Array([0xde, 0xad])); // "dead" +fromHex("deadbeef"); // Uint8Array [222, 173, 190, 239] + +toBase64(new Uint8Array([1, 2, 3])); // "AQID" +fromBase64("AQID"); // Uint8Array [1, 2, 3] + +toUtf8("hello"); // Uint8Array [104, 101, 108, 108, 111] +fromUtf8(new Uint8Array([104, 101])); // "he" +``` + +## Decoding Transactions + +You can decode raw transaction bytes back into structured data: + +```typescript +import { decodeTxRaw } from "@cosmjs/proto-signing"; + +const decoded = decodeTxRaw(txBytes); + +// decoded.body.messages — Array (typeUrl + raw bytes) +// decoded.authInfo — fee and signer info +// decoded.signatures — raw signature bytes +``` + +To decode individual messages, use the registry: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; + +const registry = new Registry(defaultRegistryTypes); + +for (const anyMsg of decoded.body.messages) { + const msg = registry.decode({ typeUrl: anyMsg.typeUrl, value: anyMsg.value }); + console.info(anyMsg.typeUrl, msg); +} +``` diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx new file mode 100644 index 000000000..448415751 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding.mdx @@ -0,0 +1,84 @@ +--- +title: Protobuf (Direct) Encoding +description: How Direct signing serializes transactions as Protocol Buffers binary +--- + +Direct signing serializes everything as Protocol Buffers binary. This is the +default and most compact format. + +## SignDoc + +The bytes that get signed are the Protobuf encoding of a `SignDoc`: + +```typescript +interface SignDoc { + bodyBytes: Uint8Array; // encoded TxBody + authInfoBytes: Uint8Array; // encoded AuthInfo + chainId: string; + accountNumber: bigint; +} +``` + +CosmJS provides helpers to construct these: + +```typescript +import { makeAuthInfoBytes, makeSignDoc, makeSignBytes } from "@cosmjs/proto-signing"; + +const bodyBytes = registry.encodeTxBody({ messages, memo }); + +const authInfoBytes = makeAuthInfoBytes( + [{ pubkey: encodedPubkey, sequence }], + feeAmount, + gasLimit, + feeGranter, + feePayer, +); + +const signDoc = makeSignDoc(bodyBytes, authInfoBytes, chainId, accountNumber); +const bytesToSign = makeSignBytes(signDoc); +``` + +`makeSignBytes` produces the canonical byte representation by encoding the +`SignDoc` with `SignDoc.encode().finish()`. Standard `DirectSecp256k1*` wallets +hash this output with **SHA-256** before ECDSA signing; EVM-compatible +`DirectEthSecp256k1*` wallets hash the same bytes with **Keccak-256**. + +## AuthInfo + +`AuthInfo` contains signer metadata and fee information: + +```typescript +const authInfoBytes = makeAuthInfoBytes( + signers, // [{ pubkey, sequence }] + feeAmount, // Coin[] + gasLimit, // number + feeGranter, + feePayer, + signMode, // defaults to SIGN_MODE_DIRECT +); +``` + +Each signer entry includes: +- **pubkey** — the signer's public key, encoded as `Any` +- **sequence** — the account's current transaction counter + +The `signMode` parameter is a single global setting (not per-signer) that +defaults to `SIGN_MODE_DIRECT`. + +## TxRaw + +After signing, the final transaction is a `TxRaw`: + +```typescript +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; + +const txRaw = TxRaw.fromPartial({ + bodyBytes, + authInfoBytes, + signatures: [signature], +}); + +const txBytes = TxRaw.encode(txRaw).finish(); +``` + +These `txBytes` are what gets broadcast to the chain. diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx new file mode 100644 index 000000000..2766385f0 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/registry.mdx @@ -0,0 +1,124 @@ +--- +title: The Registry +description: How CosmJS maps type URLs to Protobuf codecs for encoding and decoding messages +--- + +The `Registry` class (from `@cosmjs/proto-signing`) is the central type map that +knows how to encode and decode Protobuf messages by type URL. When you call +`signAndBroadcast`, the client uses its registry to serialize each +`EncodeObject` into binary Protobuf wrapped in `Any`. + +## How It Works + +```text + EncodeObject google.protobuf.Any + +--------------------+ +------------------------+ + | typeUrl: string | Registry | typeUrl: string | + | value: object | ----------> | value: Uint8Array | + +--------------------+ .encode() +------------------------+ + (Protobuf bytes) +``` + +Internally, the Registry keeps a `Map` where each key is +a type URL and each value is a Protobuf codec. A codec is any object with +`encode` and `decode` methods — the exact shape depends on the code generator +used: + +| Generator | Instance method | Notes | +|-----------|----------------|-------| +| **ts-proto** (v1/v2) | `fromPartial` + `encode` + `decode` | Used by `cosmjs-types` | +| **Telescope** | `fromPartial` + `encode` + `decode` | Same interface as ts-proto | +| **protobufjs** | `create` + `encode` + `decode` | Slightly different API | + +All three are supported through the `GeneratedType` union: + +```typescript +type GeneratedType = + | TsProtoGeneratedType + | TsProto2GeneratedType + | TelescopeGeneratedType + | PbjsGeneratedType; +``` + +## Default Types + +When you create a `SigningStargateClient` without a custom registry, it uses +`defaultRegistryTypes` — a list of all standard Cosmos SDK message types: + +```typescript +import { defaultRegistryTypes } from "@cosmjs/stargate"; +import { Registry } from "@cosmjs/proto-signing"; + +const registry = new Registry(defaultRegistryTypes); +``` + +This includes messages from bank, staking, distribution, governance, authz, +feegrant, group, IBC, and vesting modules. + +## Registering Custom Types + +If your chain has custom modules, register their generated types on top of the +defaults: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; +import { MsgCreatePost } from "./generated/blog/tx"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); +``` + +Then pass the registry to the client: + +```typescript +const client = await SigningStargateClient.connectWithSigner(endpoint, wallet, { + registry, +}); +``` + +## Registry API + +| Method | Description | +|--------|-------------| +| `register(typeUrl, type)` | Add or overwrite a type URL mapping | +| `lookupType(typeUrl)` | Get the codec for a type URL (or `undefined`) | +| `encode(encodeObject)` | Encode an `EncodeObject` to Protobuf bytes | +| `encodeAsAny(encodeObject)` | Encode and wrap in `google.protobuf.Any` | +| `encodeTxBody(txBodyFields)` | Encode a full `TxBody` (wraps each message in `Any`) | +| `decode(decodeObject)` | Decode Protobuf bytes using the type URL | +| `decodeTxBody(bytes)` | Decode a `TxBody` and recursively decode its messages | + +## Encoding Flow + +When you call `signAndBroadcast`, this is what happens to your messages: + +```text + EncodeObject[] + | + v registry.encodeAsAny(msg) for each + Any[] (typeUrl + Protobuf bytes) + | + v TxBody.fromPartial({ messages, memo }) + TxBody + | + v TxBody.encode(txBody).finish() + bodyBytes (Uint8Array) + | + v combined with authInfoBytes into SignDoc + SignDoc + | + v SignDoc.encode().finish() + signBytes (Uint8Array) --> SHA-256 (Keccak-256 for EVM wallets) --> signature +``` + +## Next Steps + + + + Register custom protobuf types for your chain. + + + Understand the EncodeObject format. + + diff --git a/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx b/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx new file mode 100644 index 000000000..367793654 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure.mdx @@ -0,0 +1,84 @@ +--- +title: Transaction Structure +description: How Cosmos transactions are structured and how message type URLs work +--- + +A Cosmos transaction is a Protobuf-encoded envelope containing three parts: + +```text ++--------------------------------------------------+ +| TxRaw | ++-----------------+------------------+--------------+ +| bodyBytes | authInfoBytes | signatures | +| (TxBody) | (AuthInfo) | (bytes[]) | ++--------+--------+---------+--------+--------------+ + | | + v v ++----------------+ +-------------------------------+ +| TxBody | | AuthInfo | ++----------------+ +-------------------------------+ +| messages[] | | signerInfos[] | +| memo | | - publicKey (Any) | +| timeoutHeight | | - modeInfo (SignMode) | +| | | - sequence | +| | | fee | +| | | - amount (Coin[]) | +| | | - gasLimit | +| | | - payer | +| | | - granter | ++----------------+ +-------------------------------+ +``` + +Each message inside `TxBody.messages` is wrapped in a `google.protobuf.Any` — +a two-field wrapper that pairs a **type URL** string with raw Protobuf **bytes**. +This is how the chain knows which message handler to route to. + +## Message Type URLs + +Every Cosmos SDK message has a unique identifier called a **type URL**. It +follows the Protobuf `Any` convention: a leading `/` followed by the fully +qualified Protobuf type name. + +```text +/cosmos.bank.v1beta1.MsgSend + ^ ^ + | +-- message name + +-- package path (module.version) +``` + +Type URLs serve as the bridge between your JavaScript code and the on-chain +message router. When a validator receives a transaction, it reads the type URL +from each `Any`-wrapped message to determine which module should handle it. + +### Common Type URLs + +| Module | Type URL | Description | +|--------|----------|-------------| +| **Bank** | `/cosmos.bank.v1beta1.MsgSend` | Transfer tokens | +| | `/cosmos.bank.v1beta1.MsgMultiSend` | Transfer to multiple recipients | +| **Staking** | `/cosmos.staking.v1beta1.MsgDelegate` | Delegate to a validator | +| | `/cosmos.staking.v1beta1.MsgUndelegate` | Begin unbonding | +| | `/cosmos.staking.v1beta1.MsgBeginRedelegate` | Move delegation between validators | +| | `/cosmos.staking.v1beta1.MsgCreateValidator` | Register a new validator | +| | `/cosmos.staking.v1beta1.MsgEditValidator` | Edit validator details | +| | `/cosmos.staking.v1beta1.MsgCancelUnbondingDelegation` | Cancel pending unbonding | +| **Distribution** | `/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward` | Claim staking rewards | +| | `/cosmos.distribution.v1beta1.MsgSetWithdrawAddress` | Set reward withdrawal address | +| | `/cosmos.distribution.v1beta1.MsgFundCommunityPool` | Fund the community pool | +| | `/cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission` | Withdraw validator commission | +| **Governance** | `/cosmos.gov.v1.MsgSubmitProposal` | Submit a governance proposal (v1) | +| | `/cosmos.gov.v1.MsgVote` | Vote on a proposal (v1) | +| | `/cosmos.gov.v1.MsgDeposit` | Deposit on a proposal (v1) | +| | `/cosmos.gov.v1beta1.MsgSubmitProposal` | Submit a proposal (legacy) | +| | `/cosmos.gov.v1beta1.MsgVote` | Vote on a proposal (legacy) | +| **Authz** | `/cosmos.authz.v1beta1.MsgGrant` | Grant authorization | +| | `/cosmos.authz.v1beta1.MsgExec` | Execute on behalf of granter | +| | `/cosmos.authz.v1beta1.MsgRevoke` | Revoke authorization | +| **Fee Grant** | `/cosmos.feegrant.v1beta1.MsgGrantAllowance` | Grant fee allowance | +| | `/cosmos.feegrant.v1beta1.MsgRevokeAllowance` | Revoke fee allowance | +| **Vesting** | `/cosmos.vesting.v1beta1.MsgCreateVestingAccount` | Create a vesting account | +| **IBC** | `/ibc.applications.transfer.v1.MsgTransfer` | Cross-chain token transfer | +| **CosmWasm** | `/cosmwasm.wasm.v1.MsgStoreCode` | Upload contract code | +| | `/cosmwasm.wasm.v1.MsgInstantiateContract` | Create a contract instance | +| | `/cosmwasm.wasm.v1.MsgExecuteContract` | Call a contract | +| | `/cosmwasm.wasm.v1.MsgMigrateContract` | Migrate a contract to new code | diff --git a/cosmjs/v0.38.x/concepts/transactions/advanced.mdx b/cosmjs/v0.38.x/concepts/transactions/advanced.mdx new file mode 100644 index 000000000..b1f85da40 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/advanced.mdx @@ -0,0 +1,86 @@ +--- +title: Advanced Patterns +description: Offline signing, IBC transfers, and other advanced transaction patterns +--- + +## Offline Signing + +You can sign transactions without an RPC connection. This is useful for +air-gapped signing or pre-signing transactions: + +```typescript +const client = await SigningStargateClient.offline(wallet); + +const txRaw = await client.sign( + signerAddress, + messages, + fee, + "memo", + { + accountNumber: 42, + sequence: 7, + chainId: "cosmoshub-4", + }, +); +``` + +When signing offline, you must provide `explicitSignerData` since the client +cannot query the chain for account number, sequence, and chain ID. + +## Inspecting a Signed Transaction + +You can decode a signed transaction to inspect its contents: + +```typescript +import { decodeTxRaw } from "@cosmjs/proto-signing"; +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; + +const txRaw = await client.sign(address, messages, fee, "memo"); +const txBytes = TxRaw.encode(txRaw).finish(); +const decoded = decodeTxRaw(txBytes); + +// decoded.body.messages — the encoded messages +// decoded.authInfo — fee and signer info +// decoded.signatures — the raw signatures +``` + +## IBC Transfer + +Send tokens across chains using IBC: + +```typescript +import { MsgTransfer } from "cosmjs-types/ibc/applications/transfer/v1/tx"; +import { Height } from "cosmjs-types/ibc/core/client/v1/client"; + +const msg = { + typeUrl: "/ibc.applications.transfer.v1.MsgTransfer", + value: MsgTransfer.fromPartial({ + sourcePort: "transfer", + sourceChannel: "channel-0", + token: { denom: "uatom", amount: "1000000" }, + sender: senderAddress, + receiver: "osmo1recipient...", + timeoutHeight: Height.fromPartial({ + revisionNumber: BigInt(1), + revisionHeight: BigInt(currentHeight + 100), + }), + }), +}; + +const result = await client.signAndBroadcast(senderAddress, [msg], "auto"); +``` + +## Checking Transaction Results + +```typescript +import { isDeliverTxFailure, isDeliverTxSuccess } from "@cosmjs/stargate"; + +const result = await client.signAndBroadcast(address, messages, "auto"); + +if (isDeliverTxSuccess(result)) { + console.info("Success:", result.transactionHash); +} else if (isDeliverTxFailure(result)) { + const errorLog = result.events.map((e) => `${e.type}: ${JSON.stringify(e.attributes)}`).join("\n"); + console.error("Failed with code", result.code, ":", errorLog); +} +``` diff --git a/cosmjs/v0.38.x/concepts/transactions/cosmwasm.mdx b/cosmjs/v0.38.x/concepts/transactions/cosmwasm.mdx new file mode 100644 index 000000000..f05fc5ad0 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/cosmwasm.mdx @@ -0,0 +1,103 @@ +--- +title: CosmWasm Transactions +description: Signing and broadcasting CosmWasm smart contract transactions +--- + +For chains with smart contract support, use `SigningCosmWasmClient`. It extends +the same signing patterns with CosmWasm-specific methods. + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { GasPrice } from "@cosmjs/stargate"; +import { readFileSync } from "fs"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "wasm", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-wasm-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025ucosm") }, +); +``` + +## Upload a Contract + +```typescript +const wasmCode = readFileSync("./contract.wasm"); + +const uploadResult = await client.upload(address, wasmCode, "auto"); +// uploadResult.codeId — use this to instantiate +``` + +## Instantiate a Contract + +```typescript +const instantiateResult = await client.instantiate( + address, + uploadResult.codeId, + { count: 0 }, + "My Counter Contract", + "auto", + { admin: address }, +); +// instantiateResult.contractAddress — the new contract's address +``` + +## Execute a Contract + +```typescript +const executeResult = await client.execute( + address, + contractAddress, + { increment: {} }, + "auto", + "incrementing counter", + [{ denom: "ucosm", amount: "1000" }], +); +``` + +## Execute Multiple Contracts Atomically + +```typescript +const executeResult = await client.executeMultiple( + address, + [ + { + contractAddress: counterAddress, + msg: { increment: {} }, + }, + { + contractAddress: registryAddress, + msg: { register: { name: "alice" } }, + funds: [{ denom: "ucosm", amount: "5000" }], + }, + ], + "auto", +); +``` + +## Migrate a Contract + +```typescript +const migrateResult = await client.migrate( + address, + contractAddress, + newCodeId, + { new_field: "value" }, + "auto", +); +``` + +## Quick Reference + +| Task | Method | +|------|--------| +| Upload WASM | `client.upload(sender, code, fee)` | +| Instantiate | `client.instantiate(sender, codeId, msg, label, fee)` | +| Execute contract | `client.execute(sender, contract, msg, fee)` | +| Execute multiple | `client.executeMultiple(sender, instructions, fee)` | +| Migrate contract | `client.migrate(sender, contract, codeId, msg, fee)` | diff --git a/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx b/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx new file mode 100644 index 000000000..dc7abbe6d --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/custom-messages.mdx @@ -0,0 +1,80 @@ +--- +title: Custom Message Types +description: Registering custom Protobuf and Amino message types in CosmJS +--- + +CosmJS registers all standard Cosmos SDK message types by default. If your chain +has custom modules with their own message types, you need to register them. + +## Registering Custom Types + +```typescript +import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { MsgCreatePost } from "./generated/blog/tx"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); + +const registry = new Registry(defaultRegistryTypes); +registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, gasPrice: GasPrice.fromString("0.025utoken") }, +); + +const msg = { + typeUrl: "/blog.v1.MsgCreatePost", + value: MsgCreatePost.fromPartial({ + author: address, + title: "Hello from CosmJS", + body: "This is a custom message type.", + }), +}; + +const result = await client.signAndBroadcast(address, [msg], "auto"); +``` + +## Amino Support for Custom Types + +If your custom messages also need Amino signing (e.g. for Ledger support), you +need to register Amino converters alongside the Protobuf registry: + +```typescript +import { + AminoTypes, + createDefaultAminoConverters, + SigningStargateClient, + GasPrice, +} from "@cosmjs/stargate"; +import { Registry } from "@cosmjs/proto-signing"; + +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + "/blog.v1.MsgCreatePost": { + aminoType: "blog/MsgCreatePost", + toAmino: (value) => ({ + author: value.author, + title: value.title, + body: value.body, + }), + fromAmino: (value) => ({ + author: value.author, + title: value.title, + body: value.body, + }), + }, +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, aminoTypes, gasPrice: GasPrice.fromString("0.025utoken") }, +); +``` + +Reuse the `registry` built in the previous section (or create a fresh `Registry(defaultRegistryTypes)` and register your custom protobuf type on it) when passing this to `connectWithSigner`. diff --git a/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx b/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx new file mode 100644 index 000000000..c40949400 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/direct-vs-amino.mdx @@ -0,0 +1,44 @@ +--- +title: Direct vs Amino Signing +description: The two Cosmos signing modes and how CosmJS chooses between them +--- + +Cosmos supports two signing modes. `SigningStargateClient` automatically picks +the right one based on the signer you provide. + +## Direct (Protobuf) + +The modern default. The transaction is serialized as Protobuf bytes, hashed with +SHA-256, and signed. This is the most compact encoding and supports all message +types. + +- Wallet: `DirectSecp256k1HdWallet` from `@cosmjs/proto-signing` +- Interface: `OfflineDirectSigner` (has `signDirect` method) +- Sign mode: `SIGN_MODE_DIRECT` + +EVM-compatible direct wallets (`DirectEthSecp256k1HdWallet`, `DirectEthSecp256k1Wallet`) use the same Direct sign doc and the same `SIGN_MODE_DIRECT`, but hash the serialized bytes with **Keccak-256** before signing to follow Ethereum conventions. + +## Amino (JSON) + +The legacy format. The transaction is serialized as deterministic JSON (sorted +keys, escaped special characters), hashed with SHA-256, and signed. Required for +Ledger hardware wallets and some older chains. + +- Wallet: `Secp256k1HdWallet` from `@cosmjs/amino` +- Interface: `OfflineAminoSigner` (has `signAmino` method) +- Sign mode: `SIGN_MODE_LEGACY_AMINO_JSON` + +## Automatic Detection + +You don't need to choose manually. Pass any `OfflineSigner` to +`connectWithSigner` and the client determines the mode at signing time: + +```typescript +import { isOfflineDirectSigner } from "@cosmjs/proto-signing"; + +// The client checks internally: +// isOfflineDirectSigner(signer) ? signDirect(...) : signAmino(...) +``` + +If your signer implements both `signDirect` and `signAmino`, Direct signing +takes precedence. diff --git a/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx new file mode 100644 index 000000000..39fce6b17 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transactions/sign-broadcast.mdx @@ -0,0 +1,119 @@ +--- +title: Signing & Broadcasting +description: How to sign and broadcast transactions with CosmJS +--- + +A Cosmos transaction goes through several steps before it reaches the chain: + +1. **Build messages** — describe what the transaction should do +2. **Determine fees** — calculate how much gas to pay +3. **Sign** — produce a cryptographic signature over the transaction bytes +4. **Broadcast** — send the signed transaction to a node +5. **Confirm** — wait for the transaction to be included in a block + +CosmJS handles all of this through `SigningStargateClient`. You provide the +messages and fee; the client handles serialization, signing, and broadcasting. + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "cosmos", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); +``` + +## signAndBroadcast + +The most common method. Signs the transaction, broadcasts it, and waits for +inclusion in a block: + +```typescript +const result = await client.signAndBroadcast( + signerAddress, + messages, + fee, + "optional memo", +); + +// result.transactionHash — the tx hash +// result.code — 0 means success, non-zero means failure +// result.gasUsed — actual gas consumed +// result.gasWanted — gas limit from the fee +// result.events — transaction events +``` + +## signAndBroadcastSync + +Signs and broadcasts but returns immediately with just the transaction hash, +without waiting for block inclusion. Useful when you don't need to wait: + +```typescript +const txHash = await client.signAndBroadcastSync( + signerAddress, + messages, + fee, + "optional memo", +); +``` + +## sign + +Signs without broadcasting. Returns a `TxRaw` protobuf object — call +`TxRaw.encode(txRaw).finish()` to serialize it into bytes that you can +broadcast later or inspect: + +```typescript +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; + +const txRaw = await client.sign( + signerAddress, + messages, + fee, + "optional memo", +); + +const txBytes = TxRaw.encode(txRaw).finish(); +const result = await client.broadcastTx(txBytes); +``` + +## Convenience Methods + +`SigningStargateClient` provides high-level methods for the most common +transactions. These construct the message internally and call +`signAndBroadcast`: + +| Method | Description | +|--------|-------------| +| `sendTokens(sender, recipient, amount, fee, memo?)` | Transfer tokens | +| `delegateTokens(delegator, validator, amount, fee, memo?)` | Delegate to a validator | +| `undelegateTokens(delegator, validator, amount, fee, memo?)` | Undelegate from a validator | +| `withdrawRewards(delegator, validator, fee, memo?)` | Withdraw staking rewards | + +```typescript +const result = await client.sendTokens( + senderAddress, + recipientAddress, + [{ denom: "uatom", amount: "1000000" }], + "auto", + "optional memo", +); +``` + +## Next Steps + + + + Construct messages for your transactions. + + + Handle transaction failures and retries. + + diff --git a/cosmjs/v0.38.x/concepts/transports/http.mdx b/cosmjs/v0.38.x/concepts/transports/http.mdx new file mode 100644 index 000000000..0ed1b584b --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/http.mdx @@ -0,0 +1,133 @@ +--- +title: HTTP Transport +description: Using HttpClient and HttpBatchClient for RPC communication +--- + +CosmJS provides two HTTP-based transports for communicating with CometBFT RPC nodes: `HttpClient` for single requests and `HttpBatchClient` for batching multiple queries into one round-trip. + +## HttpClient + +`HttpClient` is the default transport for `http://` and `https://` endpoints. It +sends one JSON-RPC POST request per `execute()` call using the platform's +`fetch` API. + +### Basic Usage + +```typescript +import { HttpClient } from "@cosmjs/tendermint-rpc"; + +const client = new HttpClient("https://rpc.my-chain.network"); +``` + +### Custom Headers + +Pass an `HttpEndpoint` object to attach headers (e.g. API keys) to every +request: + +```typescript +import { HttpClient, HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { + Authorization: "Bearer ", + }, +}; +const client = new HttpClient(endpoint); +``` + +### Timeout + +An optional second argument sets the request timeout in milliseconds. When set, +the underlying `fetch` call uses `AbortSignal.timeout()` to abort if the server +doesn't respond in time: + +```typescript +const client = new HttpClient("https://rpc.my-chain.network", 10_000); +``` + +If omitted, requests have no timeout (they rely on the runtime's default +behavior). + +### How It Works Internally + +1. `execute()` serializes the `JsonRpcRequest` to JSON. +2. A `POST` request is sent via `fetch` with `Content-Type: application/json` + and any custom headers. +3. HTTP status >= 400 throws an error with the status code and response body. +4. The JSON body is parsed with `parseJsonRpcResponse()` from `@cosmjs/json-rpc`. +5. JSON-RPC error responses throw with the error object. +6. `disconnect()` is a no-op — there is no persistent connection to close. + +### Limitations + +- **No subscriptions.** `HttpClient` implements `RpcClient` only, not + `RpcStreamingClient`. You cannot subscribe to events (new blocks, + transactions) over HTTP. +- **No retry logic.** Failed requests throw immediately. Implement retries in + your application if needed. + +## HttpBatchClient + +`HttpBatchClient` groups multiple `execute()` calls into a single +[JSON-RPC batch request](https://www.jsonrpc.org/specification#batch). This +reduces HTTP overhead when you need to make many queries in a short time. + +### Basic Usage + +```typescript +import { HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +const client = new HttpBatchClient("https://rpc.my-chain.network"); +``` + +### Options + +```typescript +interface HttpBatchClientOptions { + dispatchInterval: number; // ms between automatic dispatches (default: 20) + batchSizeLimit: number; // max requests per batch (default: 20) + httpTimeout?: number; // request timeout in ms (default: none) +} +``` + +```typescript +const client = new HttpBatchClient("https://rpc.my-chain.network", { + batchSizeLimit: 10, + dispatchInterval: 50, + httpTimeout: 30_000, +}); +``` + +### How Batching Works + +When you call `execute()`, the request is queued internally. The queue is +flushed (sent as a single HTTP POST) when either condition is met: + +1. The queue reaches `batchSizeLimit` — dispatched immediately. +2. The `dispatchInterval` timer fires — dispatched on the next tick. + +Each request in the batch gets its own Promise. The batch response is an array +of JSON-RPC responses; each is matched to its original request by `id` and the +corresponding Promise is resolved or rejected. + +### When to Use It + +Batching is useful when your application makes many independent queries in rapid +succession — for example, fetching balances for a list of addresses or querying +multiple contract states. Instead of N separate HTTP round-trips, you get one. + +```typescript +import { Comet38Client, HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +const batchClient = new HttpBatchClient("https://rpc.my-chain.network", { + batchSizeLimit: 10, + dispatchInterval: 50, +}); + +const cometClient = Comet38Client.create(batchClient); +``` + + +`connectComet()` and the high-level `StargateClient.connect()` don't use batching by default. To enable it, create the batch client manually and pass it to the CometBFT client's `create()` method, then pass that to `StargateClient.create()`. + diff --git a/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx b/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx new file mode 100644 index 000000000..ea750ffe0 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/json-rpc-streams.mdx @@ -0,0 +1,40 @@ +--- +title: JSON-RPC & Reactive Streams +description: Understanding the JSON-RPC protocol and stream utilities used by CosmJS transports +--- + +CosmJS uses JSON-RPC 2.0 for all transport-level communication and xstream-based reactive streams for event subscriptions. These are low-level building blocks that most applications interact with indirectly through higher-level clients. + +## JSON-RPC Protocol + +All transports use the [JSON-RPC 2.0](https://www.jsonrpc.org/specification) +protocol, implemented in `@cosmjs/json-rpc`. The package provides: + +- **Type definitions** — `JsonRpcRequest`, `JsonRpcSuccessResponse`, + `JsonRpcErrorResponse` +- **Parsing** — `parseJsonRpcResponse()` validates and type-guards responses +- **ID generation** — `makeJsonRpcId()` produces incrementing numeric IDs +- **Error codes** — standard JSON-RPC error codes (`parseError`, + `invalidRequest`, `methodNotFound`, etc.) + +You generally don't interact with this package directly — the RPC clients handle +serialization and parsing internally. + +## Reactive Streams + +The `@cosmjs/stream` package provides utilities built on +[xstream](https://github.com/staltz/xstream) for working with event streams: + +| Utility | Description | +|---------|-------------| +| `firstEvent(stream)` | Resolves with the first event from a stream | +| `toListPromise(stream, count)` | Collects `count` events into an array | +| `fromListPromise(promise)` | Creates a stream from a promise of an iterable | +| `concat(...streams)` | Concatenates streams with buffering | +| `dropDuplicates(keyFn)` | Deduplicates stream events by key | +| `ValueAndUpdates` | Synchronous current value + update stream (used for connection status) | +| `DefaultValueProducer` | Producer that holds a current value and emits updates | +| `Reducer` | Reduces a stream into accumulated state | + +These are primarily used internally by the WebSocket transport and subscription +system, but they're available if you need to compose or transform event streams. diff --git a/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx new file mode 100644 index 000000000..8048b0646 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/rpc-client.mdx @@ -0,0 +1,104 @@ +--- +title: RPC Client Interface +description: Understanding the transport layer between CosmJS clients and blockchain nodes +--- + +CosmJS communicates with Cosmos SDK chains through +[Tendermint/CometBFT RPC](https://docs.cometbft.com/v1/spec/rpc/). The +transport layer sits between the high-level clients (`StargateClient`, +`CosmWasmClient`) and the blockchain node, handling request encoding, response +parsing, connection management, and event subscriptions. + +```mermaid +flowchart TB + A["StargateClient / CosmWasmClient"] --> B["CometBFT Client\n(Comet38Client, Comet1Client)"] + B --> C["HTTP"] + B --> D["WebSocket"] +``` + +All transports implement the same `RpcClient` interface from +`@cosmjs/tendermint-rpc`, so the upper layers are transport-agnostic. + +## RpcClient & RpcStreamingClient + +Every transport implements at least `RpcClient`: + +```typescript +interface RpcClient { + readonly execute: (request: JsonRpcRequest) => Promise; + readonly disconnect: () => void; +} +``` + +Transports that support event subscriptions additionally implement +`RpcStreamingClient`: + +```typescript +interface RpcStreamingClient extends RpcClient { + readonly listen: (request: JsonRpcRequest) => Stream; +} +``` + +You can check at runtime with `instanceOfRpcStreamingClient(client)`. + +## Automatic Transport Selection + +When you call `StargateClient.connect(endpoint)` or `connectComet(endpoint)`, +the transport is selected based on the URL protocol: + +| Endpoint | Transport | +|----------|-----------| +| `http://...` or `https://...` | `HttpClient` | +| `ws://...` or `wss://...` | `WebsocketClient` | +| `HttpEndpoint` object | `HttpClient` (always) | + +```typescript +// HTTP transport (default for most use cases) +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +// WebSocket transport (needed for subscriptions) +const client = await StargateClient.connect("wss://rpc.my-chain.network"); +``` + +## Manual Transport Configuration + +The automatic `connect()` methods don't expose transport-level options like +timeouts or batching. For full control, construct the RPC client manually and +pass it through the `create()` factory: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpClient } from "@cosmjs/tendermint-rpc"; + +// HTTP with 15-second timeout +const rpcClient = new HttpClient("https://rpc.my-chain.network", 15_000); +const cometClient = Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +// Batched HTTP with custom options +const rpcClient = new HttpBatchClient("https://rpc.my-chain.network", { + batchSizeLimit: 10, + dispatchInterval: 50, + httpTimeout: 15_000, +}); +const cometClient = Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + + +When using manual transport configuration, you need to know the CometBFT version of your target chain. Use `Comet38Client` for CometBFT 0.38, `Comet1Client` for CometBFT 1.x, or `Tendermint37Client` for Tendermint 0.37. If you're not sure, use `connectComet()` for auto-detection — though this only accepts an endpoint string or `HttpEndpoint`, not a pre-built RPC client. + + +## Package Summary + +| Package | Role | +|---------|------| +| `@cosmjs/tendermint-rpc` | RPC client implementations (`HttpClient`, `HttpBatchClient`, `WebsocketClient`) and CometBFT client wrappers | +| `@cosmjs/json-rpc` | JSON-RPC 2.0 types, parsing, and ID generation | +| `@cosmjs/socket` | WebSocket wrapper with reconnection, queueing, and connection status | +| `@cosmjs/stream` | Reactive stream utilities (xstream-based) | diff --git a/cosmjs/v0.38.x/concepts/transports/timeouts.mdx b/cosmjs/v0.38.x/concepts/transports/timeouts.mdx new file mode 100644 index 000000000..95a72661f --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/timeouts.mdx @@ -0,0 +1,51 @@ +--- +title: Timeouts & Error Handling +description: Configuring timeouts, handling errors, and understanding retry behavior +--- + +## HTTP Timeouts + +| Client | Parameter | Default | Mechanism | +|--------|-----------|---------|-----------| +| `HttpClient` | `timeout` (constructor) | None | `AbortSignal.timeout()` on `fetch` | +| `HttpBatchClient` | `httpTimeout` (options) | None | `AbortSignal.timeout()` on `fetch` | + +When a timeout fires, the `fetch` call is aborted and throws an `AbortError`. + +## WebSocket Connection Timeout + +`SocketWrapper` has a 10-second connection timeout by default. If the WebSocket +handshake doesn't complete within this window, the socket is closed and the +connection promise rejects with a timeout error. + +## Broadcast Timeouts + +Separately from transport timeouts, `SigningStargateClient` and +`SigningCosmWasmClient` have broadcast-level timeouts that control how long the +client polls for transaction inclusion: + +```typescript +interface SigningStargateClientOptions { + readonly broadcastTimeoutMs?: number; // default: 60_000 (60s) + readonly broadcastPollIntervalMs?: number; // default: 3_000 (3s) +} +``` + + +These are not transport timeouts — they control how long `signAndBroadcast()` +waits for the transaction to appear in a block after it has been submitted. + +## Error Handling + +| Scenario | Error | +|----------|-------| +| HTTP status >= 400 | `Error` with status code and response body | +| JSON-RPC error response | `Error` with serialized JSON-RPC error object | +| Request timeout (HTTP) | `AbortError` from `fetch` | +| Connection timeout (WS) | `Error("Connection attempt timed out after X ms")` | +| WebSocket unclean close | Error propagated through the event stream | + +## No Built-In Retry + +Neither `HttpClient` nor `HttpBatchClient` retry failed requests. If you need +retry logic, implement it in your application or wrap the RPC client. diff --git a/cosmjs/v0.38.x/concepts/transports/websocket.mdx b/cosmjs/v0.38.x/concepts/transports/websocket.mdx new file mode 100644 index 000000000..e3b20ac16 --- /dev/null +++ b/cosmjs/v0.38.x/concepts/transports/websocket.mdx @@ -0,0 +1,131 @@ +--- +title: WebSocket Transport +description: Using WebsocketClient for persistent connections and event subscriptions +--- + +`WebsocketClient` uses a persistent WebSocket connection for both request/response +queries and event subscriptions. It is the only transport that supports +`listen()`. + +## Basic Usage + +```typescript +import { WebsocketClient } from "@cosmjs/tendermint-rpc"; + +const client = new WebsocketClient("wss://rpc.my-chain.network"); +``` + +The client automatically appends `/websocket` to the URL (the standard CometBFT +WebSocket endpoint path). + +## Request/Response + +`execute()` sends a JSON-RPC request over the WebSocket and waits for a response +with a matching `id`. This means you can use `WebsocketClient` as a drop-in +replacement for `HttpClient` when you need a persistent connection: + +```typescript +import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; + +const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); +const cometClient = Comet38Client.create(wsClient); +``` + +## Subscriptions + +The real power of WebSocket is event subscriptions. CometBFT supports +subscribing to events like new blocks and transactions via the `subscribe` +JSON-RPC method. + +`WebsocketClient.listen()` returns a reactive stream (xstream `Stream`) of +`SubscriptionEvent` objects: + +```typescript +interface SubscriptionEvent { + readonly query: string; + readonly data: { + readonly type: string; + readonly value: Record; + }; +} +``` + +### Subscribing via CometBFT Clients + +The CometBFT client classes provide typed subscription helpers: + +```typescript +import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; + +const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); +const cometClient = Comet38Client.create(wsClient); + +const newBlocks = cometClient.subscribeNewBlock(); +const subscription = newBlocks.subscribe({ + next: (event) => { + console.info("New block:", event.header.height); + }, + error: (err) => console.error(err), + complete: () => console.info("Subscription ended"), +}); + +// Later: clean up +subscription.unsubscribe(); +cometClient.disconnect(); +``` + +Available subscription methods: + +| Method | Events | +|--------|--------| +| `subscribeNewBlock()` | Full block data on each new block | +| `subscribeNewBlockHeader()` | Block header only on each new block | +| `subscribeTx(query?)` | Transactions matching an optional query string | + +### Subscription Lifecycle + +1. `listen()` creates a producer that sends a `subscribe` JSON-RPC request. +2. CometBFT responds with a confirmation, then pushes events with the same + request ID. +3. Events are filtered and emitted on the returned stream. +4. When the stream has no more listeners (all `unsubscribe()`), a + corresponding `unsubscribe` request is sent to the server to free resources. +5. Streams are deduplicated by query string — subscribing to the same query + twice returns the same stream. + +## Reconnection + +`WebsocketClient` uses `ReconnectingSocket` under the hood, which provides +automatic reconnection with exponential backoff. The full socket stack is: + +```text +WebsocketClient + └── ReconnectingSocket ← auto-reconnect with backoff + └── QueueingStreamingSocket ← request queue + connection status + └── StreamingSocket ← events as xstream Stream + └── SocketWrapper ← isomorphic-ws wrapper +``` + +**Reconnection behavior:** + +| Aspect | Behavior | +|--------|----------| +| Initial backoff | 100 ms | +| Backoff growth | Doubles each attempt (100, 200, 400, 800…) | +| Maximum backoff | 5,000 ms (5 seconds) | +| Backoff reset | Resets to 100 ms on successful connection | +| Request queue | Requests made while disconnected are queued and sent on reconnect | +| Subscription recovery | A `reconnectedHandler` callback fires after reconnection | + +## Connection Status + +You can observe connection state changes through `QueueingStreamingSocket`: + +```typescript +enum ConnectionStatus { + Unconnected, // Initial state + Connecting, // Connection attempt in progress + Connected, // WebSocket is open + Disconnected, // Connection lost (reconnection will be attempted) +} +``` diff --git a/cosmjs/v0.38.x/guides/connect/connect.mdx b/cosmjs/v0.38.x/guides/connect/connect.mdx new file mode 100644 index 000000000..37c1e43c2 --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/connect.mdx @@ -0,0 +1,88 @@ +--- +title: "Connect to a Chain" +description: "Establish a connection to any Cosmos SDK chain using CosmJS clients over HTTP or WebSocket" +--- + +CosmJS clients communicate with Cosmos SDK chains through [CometBFT RPC](https://docs.cometbft.com/v1/spec/rpc/) over HTTP or WebSocket. Pass an RPC URL to any client's `connect` factory method to get started. + +## Prerequisites + +- `@cosmjs/stargate` installed (`npm install @cosmjs/stargate`) +- An RPC endpoint for a Cosmos SDK chain (e.g. `https://rpc.cosmos.network`) + +## Quick Start + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); +``` + +CosmJS auto-detects the CometBFT version (0.37, 0.38, or 1.x) and picks the right internal client. The same pattern works for all high-level clients: + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); +``` + +## Transport Selection + +The transport is selected automatically based on the endpoint you provide: + +| Endpoint Value | Transport | Subscriptions | +|----------------|-----------|---------------| +| `"https://..."` or `"http://..."` | HTTP | No | +| `"wss://..."` or `"ws://..."` | WebSocket | Yes | +| `HttpEndpoint` object | HTTP (always) | No | + +When using `HttpBatchClient` or `WebsocketClient` instances directly, create a CometBFT client manually with `Comet38Client.create(rpcClient)` instead of passing them to `connect()`. + +## Disconnecting + +Always call `disconnect()` when you're done with a client, especially in long-running processes. What happens depends on the transport: + +| Transport | `disconnect()` behavior | +|-----------|------------------------| +| `HttpClient` | No-op — nothing to close | +| `HttpBatchClient` | Clears the dispatch interval timer | +| `WebsocketClient` | Closes the WebSocket and stops all subscription streams | + +For high-level clients (`StargateClient`, `CosmWasmClient`, and their signing variants), `disconnect()` delegates to the underlying CometBFT client: + +```typescript +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +try { + const balance = await client.getBalance("cosmos1...", "uatom"); +} finally { + client.disconnect(); +} +``` + + +Failing to disconnect a `WebsocketClient` leaves the socket open and the reconnection timer running, which can leak resources in server-side applications. + + +## Next Steps + + + + Connect over HTTP with direct and batched clients. + + + Use WebSocket for persistent connections and real-time subscriptions. + + + Configure HTTP, WebSocket, and broadcast timeouts. + + + Attach authentication headers and compose transport layers. + + + How CosmJS auto-detects CometBFT versions and how to skip it. + + + Handle transport errors, broadcast failures, and timeouts. + + diff --git a/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx b/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx new file mode 100644 index 000000000..4cbf2fcff --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/custom-endpoints.mdx @@ -0,0 +1,105 @@ +--- +title: "Custom RPC Endpoints" +description: "Attach authentication headers and compose transport layers for custom RPC providers" +--- + +Many RPC providers require authentication headers. CosmJS supports this through the `HttpEndpoint` interface, which lets you attach headers to every request. + +## Custom Headers + +Pass an `HttpEndpoint` object instead of a plain URL to attach headers to every request: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { + Authorization: "Bearer ", + "X-Api-Key": "", + }, +}; + +const client = await StargateClient.connect(endpoint); +``` + +`HttpEndpoint` works everywhere a string URL is accepted — `StargateClient.connect`, `SigningStargateClient.connectWithSigner`, `CosmWasmClient.connect`, `connectComet`, `HttpClient`, and `HttpBatchClient`. + + +When you pass an `HttpEndpoint` object, the transport is always HTTP — even if the URL uses a `ws://` scheme. + + +## Custom Headers with Batching + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpBatchClient, HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { Authorization: "Bearer " }, +}; + +const rpcClient = new HttpBatchClient(endpoint, { + batchSizeLimit: 10, + httpTimeout: 15_000, +}); + +const cometClient = Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + +## Signing Client with Custom Endpoint + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { Authorization: "Bearer " }, +}; + +const client = await SigningStargateClient.connectWithSigner(endpoint, wallet, { + gasPrice: GasPrice.fromString("0.025uatom"), +}); +``` + +## Full Manual Configuration + +For maximum control — custom headers, timeouts, batching, and a specific CometBFT version — compose the layers yourself: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { Comet38Client, HttpBatchClient, HttpEndpoint } from "@cosmjs/tendermint-rpc"; + +const endpoint: HttpEndpoint = { + url: "https://rpc.my-chain.network", + headers: { Authorization: "Bearer " }, +}; + +const rpcClient = new HttpBatchClient(endpoint, { + batchSizeLimit: 10, + dispatchInterval: 50, + httpTimeout: 15_000, +}); + +const cometClient = Comet38Client.create(rpcClient); + +const client = SigningStargateClient.createWithSigner(cometClient, wallet, { + gasPrice: GasPrice.fromString("0.025uatom"), + broadcastTimeoutMs: 120_000, +}); +``` + +## Next Steps + + + + Understand CometBFT auto-detection and when to skip it. + + + Configure timeout values at every layer. + + diff --git a/cosmjs/v0.38.x/guides/connect/errors.mdx b/cosmjs/v0.38.x/guides/connect/errors.mdx new file mode 100644 index 000000000..fadcbea3a --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/errors.mdx @@ -0,0 +1,81 @@ +--- +title: "Connection Errors" +description: "Handle transport errors, broadcast failures, and timeouts when connecting to Cosmos chains" +--- + +CosmJS surfaces errors at two levels: transport-level errors from the RPC client, and broadcast-level errors from transaction submission. + +## Transport-Level Errors + +| Scenario | Error | +|----------|-------| +| Connection refused | `Error` with `ECONNREFUSED` or `fetch failed` | +| HTTP status >= 400 | `Error` with status code and response body | +| JSON-RPC error response | `Error` with serialized JSON-RPC error object | +| HTTP request timeout | `AbortError` from `fetch` (via `AbortSignal.timeout()`) | +| WebSocket handshake timeout | `Error("Connection attempt timed out after X ms")` | +| Missing URL protocol (HTTP) | `Error("Endpoint URL is missing a protocol. Expected 'https://' or 'http://'.")` | +| Missing URL protocol (WebSocket) | `Error("Base URL is missing a protocol. Expected 'ws://' or 'wss://'.")` | + +## Broadcast Errors + +When a signed transaction is submitted but rejected during `CheckTx` (for example, insufficient fees or an invalid signature), the client throws a `BroadcastTxError`: + +```typescript +import { BroadcastTxError } from "@cosmjs/stargate"; + +try { + await client.signAndBroadcast(address, messages, fee); +} catch (error) { + if (error instanceof BroadcastTxError) { + console.error("Code:", error.code, "Codespace:", error.codespace, "Log:", error.log); + } + throw error; +} +``` + +## Timeout Errors + +When a transaction is submitted successfully but not included in a block before the timeout expires, the client throws a `TimeoutError` with the transaction hash: + +```typescript +import { TimeoutError } from "@cosmjs/stargate"; + +try { + await client.signAndBroadcast(address, messages, fee); +} catch (error) { + if (error instanceof TimeoutError) { + console.error("Tx may still land. Hash:", error.txId); + } + throw error; +} +``` + + +A `TimeoutError` does not mean the transaction failed — it may still be included in a later block. You can query for it later using `client.getTx(error.txId)`. + + +## Fire-and-Forget Broadcasting + +If you don't want to wait for block inclusion, use `signAndBroadcastSync` to get the transaction hash immediately after submission: + +```typescript +const txHash = await client.signAndBroadcastSync(address, messages, fee); +``` + +This avoids the polling loop and the `TimeoutError` entirely. Use it when your application handles confirmation tracking separately. + +## No Built-In Retry + +Neither `HttpClient` nor `HttpBatchClient` retry failed requests. If your application needs retry logic for transient network errors, wrap the RPC client or implement retries at the application level. + +## Next Steps + + + + Configure timeout values to tune error behavior. + + + Return to the connection overview. + + diff --git a/cosmjs/v0.38.x/guides/connect/http.mdx b/cosmjs/v0.38.x/guides/connect/http.mdx new file mode 100644 index 000000000..a8599a7fa --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/http.mdx @@ -0,0 +1,76 @@ +--- +title: "HTTP Transport" +description: "Connect to Cosmos SDK chains over HTTP using direct and batched RPC clients" +--- + +HTTP is the default transport for `http://` and `https://` endpoints. Each query sends a single JSON-RPC POST request using the platform's `fetch` API. There is no persistent connection — each call is independent. + +## Using High-Level Clients + +Pass an HTTP URL to `connect` and CosmJS handles the rest: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const height = await client.getHeight(); +client.disconnect(); +``` + +## Using the HTTP Client Directly + +For more control, create an `HttpClient` and pass it through the CometBFT client layer: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpClient("https://rpc.my-chain.network"); +const cometClient = Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + + +When constructing the CometBFT client manually, you need to know the node's version. Use `Tendermint37Client` for Tendermint 0.37, `Comet38Client` for CometBFT 0.38, or `Comet1Client` for CometBFT 1.x. + + +## Batching HTTP Requests + +`HttpBatchClient` groups multiple concurrent `execute()` calls into a single JSON-RPC batch request, reducing HTTP round-trips: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet38Client, HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpBatchClient("https://rpc.my-chain.network", { + batchSizeLimit: 10, + dispatchInterval: 50, +}); + +const cometClient = Comet38Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + +| Option | Type | Default | Description | +|--------|------|---------|-------------| +| `batchSizeLimit` | `number` | 20 | Max requests per batch. Queue flushes when this limit is reached. | +| `dispatchInterval` | `number` | 20 | Milliseconds between automatic queue flushes. | +| `httpTimeout` | `number` | — | Request timeout in milliseconds. | + + +Batching is useful when your application fires many independent queries in rapid succession — for example, fetching balances for a list of addresses. + +## Next Steps + + + + Use persistent connections and real-time subscriptions. + + + Attach authentication headers to HTTP and batched clients. + + + Configure HTTP request and batch timeouts. + + diff --git a/cosmjs/v0.38.x/guides/connect/timeouts.mdx b/cosmjs/v0.38.x/guides/connect/timeouts.mdx new file mode 100644 index 000000000..483d62c88 --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/timeouts.mdx @@ -0,0 +1,70 @@ +--- +title: "Timeouts" +description: "Configure HTTP request, WebSocket connection, and broadcast polling timeouts" +--- + +CosmJS exposes timeouts at three levels: HTTP requests, WebSocket connections, and transaction broadcast polling. Each is configured independently. + +## HTTP Request Timeout + +Pass a timeout in milliseconds as the second argument to `HttpClient`: + +```typescript +import { HttpClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpClient("https://rpc.my-chain.network", 15_000); +``` + +When the timeout fires, the underlying `fetch` call is aborted via `AbortSignal.timeout()`. If omitted, requests have no timeout and rely on the runtime's default behavior. + +For `HttpBatchClient`, use the `httpTimeout` option: + +```typescript +import { HttpBatchClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpBatchClient("https://rpc.my-chain.network", { + httpTimeout: 15_000, +}); +``` + +## WebSocket Connection Timeout + +The underlying socket has a 10-second connection timeout. If the WebSocket handshake doesn't complete in time, the connection promise rejects with a timeout error. + +## Broadcast Timeout + +Separately from transport timeouts, signing clients control how long `signAndBroadcast()` polls for transaction inclusion in a block: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { + gasPrice: GasPrice.fromString("0.025uatom"), + broadcastTimeoutMs: 120_000, + broadcastPollIntervalMs: 5_000, + }, +); +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `broadcastTimeoutMs` | 60,000 (60s) | Max time to wait for tx inclusion | +| `broadcastPollIntervalMs` | 3,000 (3s) | Interval between inclusion checks | + + +These are not transport-level timeouts — they only affect `signAndBroadcast()`. If you use `signAndBroadcastSync` instead, no polling occurs and these options are ignored. + + +## Next Steps + + + + Handle timeout errors and other connection failures. + + + Combine timeouts with custom headers and batching. + + diff --git a/cosmjs/v0.38.x/guides/connect/version-detection.mdx b/cosmjs/v0.38.x/guides/connect/version-detection.mdx new file mode 100644 index 000000000..cb3ee2e35 --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/version-detection.mdx @@ -0,0 +1,61 @@ +--- +title: "Version Detection" +description: "How CosmJS auto-detects CometBFT versions and how to skip the detection round-trip" +--- + +When you call `StargateClient.connect()` or `connectComet()`, CosmJS auto-detects the node's CometBFT version so it can use the correct RPC protocol. + +## How Auto-Detection Works + + + +CosmJS connects a Tendermint 0.37 client and calls `status()`. + + +It reads `nodeInfo.version` from the response. + + +If the version starts with `0.38.`, it disconnects and reconnects with `Comet38Client`. If it starts with `1.`, it reconnects with `Comet1Client`. Otherwise, it keeps the 0.37 client. + + + +This costs one extra RPC round-trip on startup. + +## Skipping Auto-Detection + +If you already know your chain's CometBFT version, skip auto-detection by constructing the client directly: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; +import { Comet1Client, HttpClient } from "@cosmjs/tendermint-rpc"; + +const rpcClient = new HttpClient("https://rpc.my-chain.network"); +const cometClient = Comet1Client.create(rpcClient); +const client = StargateClient.create(cometClient); +``` + + +Skipping auto-detection saves one RPC round-trip on every client creation. This is worth doing in production when you know the chain's CometBFT version. + + +## Using `connectComet` Directly + +You can also use `connectComet` on its own when you need a `CometClient` without a high-level wrapper: + +```typescript +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const status = await cometClient.status(); +``` + +## Next Steps + + + + Return to the connection overview and transport selection table. + + + Combine manual client construction with custom headers and batching. + + diff --git a/cosmjs/v0.38.x/guides/connect/websocket.mdx b/cosmjs/v0.38.x/guides/connect/websocket.mdx new file mode 100644 index 000000000..99b767d8c --- /dev/null +++ b/cosmjs/v0.38.x/guides/connect/websocket.mdx @@ -0,0 +1,95 @@ +--- +title: "WebSocket Transport" +description: "Connect over WebSocket for persistent connections and real-time event subscriptions" +--- + +Use a `ws://` or `wss://` URL to connect over WebSocket. This gives you a persistent connection and is the only transport that supports real-time event subscriptions. + +## Using High-Level Clients + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("wss://rpc.my-chain.network"); +``` + +The transport is selected automatically based on the URL scheme. + +## Subscriptions + +WebSocket connections can subscribe to new blocks and transactions: + +```typescript +import { Comet38Client, WebsocketClient } from "@cosmjs/tendermint-rpc"; + +const wsClient = new WebsocketClient("wss://rpc.my-chain.network"); +const cometClient = Comet38Client.create(wsClient); + +const newBlocks = cometClient.subscribeNewBlock(); +const subscription = newBlocks.subscribe({ + next: (event) => { + console.info("New block:", event.header.height); + }, + error: (err) => console.error(err), + complete: () => console.info("Subscription ended"), +}); + +// Clean up when done +subscription.unsubscribe(); +cometClient.disconnect(); +``` + +Available subscription methods on CometBFT clients: + +| Method | Events | +|--------|--------| +| `subscribeNewBlock()` | Full block data on each new block | +| `subscribeNewBlockHeader()` | Block header only | +| `subscribeTx(query?)` | Transactions matching an optional query | + +## Reconnection + +`WebsocketClient` reconnects automatically with exponential backoff (100 ms initial, doubling up to 5 seconds). Requests made while disconnected are queued and sent when the connection is restored. + +## Error Handler + +The `WebsocketClient` constructor accepts an optional error handler as its second argument: + +```typescript +const wsClient = new WebsocketClient("wss://rpc.my-chain.network", (err) => { + console.error("WebSocket error:", err); +}); +``` + +If omitted, errors are thrown by default. + +## Checking Subscription Support + +Not all transports support event subscriptions. Only `WebsocketClient` implements the streaming interface. If you have a `CometClient` and need to check at runtime, verify the underlying RPC client is a `WebsocketClient`: + +```typescript +import { WebsocketClient } from "@cosmjs/tendermint-rpc"; + +if (rpcClient instanceof WebsocketClient) { + const stream = cometClient.subscribeNewBlock(); + // ... +} else { + // Fall back to polling +} +``` + +Calling `subscribeNewBlock()`, `subscribeNewBlockHeader()`, or `subscribeTx()` on a CometBFT client backed by an HTTP transport throws `"This RPC client type cannot subscribe to events"`. + +## Next Steps + + + + Use HTTP for stateless request-response queries. + + + Configure WebSocket connection and broadcast timeouts. + + + Handle WebSocket errors and reconnection failures. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/administration.mdx b/cosmjs/v0.38.x/guides/cosmwasm/administration.mdx new file mode 100644 index 000000000..a6cb205a8 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/administration.mdx @@ -0,0 +1,85 @@ +--- +title: "Contract Administration" +description: "Migrate contracts to new code, transfer admin privileges, and manage the contract lifecycle" +--- + +Contracts with an admin address can be migrated to new code versions and have their admin transferred or cleared. These operations are central to the CosmWasm upgrade lifecycle. + +## Migrating a Contract + +Migrate moves a contract to a new code ID while preserving its address and state. The contract must have an admin, and the migration message is passed to the new code's `migrate` entry point. + + + + + +```typescript +const newWasmCode = readFileSync("./my_contract_v2.wasm"); +const { codeId: newCodeId } = await client.upload(address, newWasmCode, "auto"); +``` + + + + + +```typescript +const migrateResult = await client.migrate( + address, + contractAddress, + newCodeId, + { new_field: "default_value" }, + "auto", +); +``` + + + + + +The migrate message (fourth argument) is contract-defined. It typically handles schema changes, data migrations, or field initialization for the new version. + + +Only the contract's admin address can call `migrate`. The sender must match the admin set during instantiation (or a subsequent `updateAdmin` call). + + +## Updating the Admin + +Transfer admin privileges to a different address: + +```typescript +await client.updateAdmin(address, contractAddress, "osmo1newadmin...", "auto"); +``` + +After this call, only `osmo1newadmin...` can migrate the contract or change the admin again. The original admin loses all privileges. + +## Clearing the Admin + +Remove the admin entirely, making the contract permanently non-upgradeable: + +```typescript +await client.clearAdmin(address, contractAddress, "auto"); +``` + + +Clearing the admin is irreversible. The contract can never be migrated or have its admin updated again. Only do this when you are certain the contract should be immutable. + + +## Contract Lifecycle Summary + +| State | Can Migrate | Can Change Admin | How to Reach | +|-------|-------------|------------------|--------------| +| Admin set | Yes | Yes | `instantiate` with `admin` option | +| Admin transferred | Yes | Yes | `updateAdmin` | +| Admin cleared | No | No | `clearAdmin` | +| No admin (from init) | No | No | `instantiate` without `admin` option | + +## Next Steps + + + + Verify contract metadata and code history after migration. + + + Gas estimation, custom messages, and the wasm query extension. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/cosmwasm.mdx b/cosmjs/v0.38.x/guides/cosmwasm/cosmwasm.mdx new file mode 100644 index 000000000..89fee67eb --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/cosmwasm.mdx @@ -0,0 +1,100 @@ +--- +title: "CosmWasm Smart Contracts" +description: "Interact with CosmWasm smart contracts using the @cosmjs/cosmwasm package" +--- + +The `@cosmjs/cosmwasm` package provides a full-featured client for interacting with CosmWasm smart contracts. It covers the complete contract lifecycle: connecting to a chain, querying contract state, uploading code, instantiating contracts, executing messages, and managing contract administration. + +## Prerequisites + +Install the required packages: + + + +```bash npm +npm install @cosmjs/cosmwasm @cosmjs/proto-signing @cosmjs/stargate @cosmjs/encoding +``` + +```bash yarn +yarn add @cosmjs/cosmwasm @cosmjs/proto-signing @cosmjs/stargate @cosmjs/encoding +``` + + + +## Connecting + +`CosmWasmClient` is the read-only client for querying CosmWasm chains. It extends the core Cosmos SDK query functionality with smart contract methods. + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); + +const chainId = await client.getChainId(); +const height = await client.getHeight(); +``` + +CosmJS auto-detects the CometBFT version (0.37, 0.38, or 1.x) at the endpoint. If you need to bypass auto-detection, use the `create` factory method with a specific CometBFT client: + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; +import { Comet38Client } from "@cosmjs/tendermint-rpc"; + +const cometClient = await Comet38Client.connect("https://rpc.my-chain.network"); +const client = CosmWasmClient.create(cometClient); +``` + +Always disconnect when you're done, especially with WebSocket connections: + +```typescript +try { + const balance = await client.getBalance("osmo1abc...", "uosmo"); +} finally { + client.disconnect(); +} +``` + +For signing transactions, `SigningCosmWasmClient` extends `CosmWasmClient` with upload, instantiate, execute, migrate, and all standard Cosmos SDK transaction capabilities: + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { GasPrice } from "@cosmjs/stargate"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your mnemonic words here ...", + { prefix: "osmo" }, +); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); +``` + +Setting `gasPrice` enables `"auto"` fee estimation for all transactions. Without it, you must provide an explicit `StdFee` for every call. + +## Next Steps + + + + Smart queries, raw state access, and contract discovery. + + + Deploy Wasm binaries to chain with access restrictions. + + + Create contract instances with admin, funds, and predictable addresses. + + + Execute single or batched contract calls with funds and events. + + + Migrate contracts, update admin, and manage the contract lifecycle. + + + Gas estimation, custom messages, binary helpers, and the wasm query extension. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/executing.mdx b/cosmjs/v0.38.x/guides/cosmwasm/executing.mdx new file mode 100644 index 000000000..d1f3bcfcf --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/executing.mdx @@ -0,0 +1,102 @@ +--- +title: "Executing Contracts" +description: "Execute single or batched contract calls with funds and parse transaction events" +--- + +Executing a contract sends a JSON message that triggers state changes. You can attach native tokens, batch multiple executions atomically, and inspect the emitted events. + +## Basic Execution + +```typescript +const result = await client.execute( + address, + contractAddress, + { increment: {} }, + "auto", +); + +const { transactionHash, events, gasUsed } = result; +``` + +## Execute with Funds + +Attach native tokens to the execution message. The tokens are transferred to the contract as part of the message execution. + +```typescript +const result = await client.execute( + address, + contractAddress, + { deposit: {} }, + "auto", + "depositing tokens", + [{ denom: "uosmo", amount: "5000000" }], +); +``` + +## Execute Multiple Contracts Atomically + +Bundle multiple contract calls into a single transaction using `executeMultiple`. If any call fails, the entire transaction is reverted. + +```typescript +const result = await client.executeMultiple( + address, + [ + { + contractAddress: counterAddress, + msg: { increment: {} }, + }, + { + contractAddress: registryAddress, + msg: { register: { name: "alice" } }, + funds: [{ denom: "uosmo", amount: "5000" }], + }, + ], + "auto", +); +``` + +Each instruction in the array follows the `ExecuteInstruction` interface: + +| Field | Type | Description | +|-------|------|-------------| +| `contractAddress` | `string` | Target contract address | +| `msg` | `JsonObject` | The JSON execute message | +| `funds` | `Coin[]` | Optional native tokens to attach | + +## Parsing Events + +Contract executions emit custom events under the `"wasm"` event type. These contain contract-defined key-value attributes. + +```typescript +const result = await client.execute(address, contractAddress, { release: {} }, "auto"); + +const wasmEvents = result.events.filter((e) => e.type === "wasm"); +for (const event of wasmEvents) { + for (const attr of event.attributes) { + console.info(`${attr.key}: ${attr.value}`); + } +} +``` + +When using `executeMultiple`, each contract call produces its own set of wasm events. Filter by the `_contract_address` attribute to distinguish which contract emitted each event. + +## Execution Result + +| Field | Type | Description | +|-------|------|-------------| +| `transactionHash` | `string` | Upper-case hex transaction hash | +| `height` | `number` | Block height of inclusion | +| `events` | `Event[]` | All transaction events (including `"wasm"` events) | +| `gasWanted` | `bigint` | Gas requested | +| `gasUsed` | `bigint` | Gas consumed | + +## Next Steps + + + + Migrate contracts and manage admin privileges. + + + Gas estimation, custom messages, and binary helpers. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced.mdx b/cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced.mdx new file mode 100644 index 000000000..c8280eef2 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced.mdx @@ -0,0 +1,185 @@ +--- +title: "Gas and Advanced Usage" +description: "Gas estimation, custom messages, binary helpers, and the wasm query extension" +--- + +This page covers gas configuration for CosmWasm transactions, building custom encode objects, working with the CosmWasm `Binary` type, and using the low-level wasm query extension for fine-grained pagination. + +## Gas Estimation + +### Auto Gas + +When you pass `"auto"` as the fee, the client simulates the transaction and applies a gas multiplier: + +| Operation | Default Multiplier | Reason | +|-----------|-------------------|--------| +| `upload` | 1.1x | Upload simulation is very accurate | +| All others | 1.4x | General safety margin for state changes | + +You can pass a numeric multiplier instead of `"auto"` for finer control: + +```typescript +const result = await client.execute( + address, + contractAddress, + { complex_operation: {} }, + 1.6, +); +``` + +### Static Fees + +For full control, provide an explicit fee object: + +```typescript +import { coins } from "@cosmjs/stargate"; + +const fee = { + amount: coins(5000, "uosmo"), + gas: "300000", +}; + +const result = await client.execute(address, contractAddress, { increment: {} }, fee); +``` + +### Gas Simulation + +Simulate a transaction to estimate gas without broadcasting: + +```typescript +import { toUtf8 } from "@cosmjs/encoding"; +import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; + +const msg = { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: address, + contract: contractAddress, + msg: toUtf8(JSON.stringify({ increment: {} })), + funds: [], + }), +}; + +const gasEstimate = await client.simulate(address, [msg], "estimating gas"); +``` + +## Working with Binary Data + +The `toBinary` and `fromBinary` helpers convert JavaScript objects to and from the base64-encoded JSON format used by CosmWasm `Binary` fields: + +```typescript +import { toBinary, fromBinary } from "@cosmjs/cosmwasm"; + +const encoded = toBinary({ some: "data" }); +// "eyJzb21lIjoiZGF0YSJ9" + +const decoded = fromBinary(encoded); +// { some: "data" } +``` + +This is useful when composing nested messages, such as sending a sub-message through a contract: + +```typescript +await client.execute( + address, + multisigAddress, + { + propose: { + msg: toBinary({ transfer: { recipient: "osmo1...", amount: "1000000" } }), + }, + }, + "auto", +); +``` + +## Building Custom Messages + +For advanced use cases, construct CosmWasm encode objects directly and broadcast them via `signAndBroadcast`: + +```typescript +import { toUtf8 } from "@cosmjs/encoding"; +import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; + +const msg = { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: address, + contract: contractAddress, + msg: toUtf8(JSON.stringify({ increment: {} })), + funds: [{ denom: "uosmo", amount: "1000" }], + }), +}; + +const result = await client.signAndBroadcast(address, [msg], "auto"); +``` + +### Mixing CosmWasm and Cosmos SDK Messages + +This approach lets you combine contract calls with standard Cosmos SDK messages in a single atomic transaction: + +```typescript +import { toUtf8 } from "@cosmjs/encoding"; +import { MsgExecuteContract } from "cosmjs-types/cosmwasm/wasm/v1/tx"; + +const executeMsg = { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: address, + contract: contractAddress, + msg: toUtf8(JSON.stringify({ claim_rewards: {} })), + funds: [], + }), +}; + +const sendMsg = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: { + fromAddress: address, + toAddress: "osmo1recipient...", + amount: [{ denom: "uosmo", amount: "500000" }], + }, +}; + +const result = await client.signAndBroadcast(address, [executeMsg, sendMsg], "auto"); +``` + +## Wasm Query Extension + +For fine-grained control over pagination or when building a custom query client, use the wasm extension directly instead of the high-level `CosmWasmClient` methods: + +```typescript +import { QueryClient } from "@cosmjs/stargate"; +import { setupWasmExtension } from "@cosmjs/cosmwasm"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupWasmExtension); + +const { codeInfos, pagination } = await queryClient.wasm.listCodeInfo(); +const allState = await queryClient.wasm.getAllContractState("osmo1contractaddr..."); +``` + +### Available Extension Methods + +| Method | Description | +|--------|-------------| +| `listCodeInfo(paginationKey?)` | List all uploaded codes | +| `getCode(id)` | Download original Wasm by code ID | +| `listContractsByCodeId(id, paginationKey?)` | List contract addresses for a code ID | +| `listContractsByCreator(creator, paginationKey?)` | List contracts created by an address | +| `getContractInfo(address)` | Get contract metadata | +| `getContractCodeHistory(address, paginationKey?)` | Get migration history | +| `getAllContractState(address, paginationKey?)` | Dump all contract storage | +| `queryContractRaw(address, key)` | Read a single storage key | +| `queryContractSmart(address, query)` | Execute a smart query | + +## Next Steps + + + + Back to the CosmWasm guide overview. + + + Comparing the two client families and when to use each. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/instantiating.mdx b/cosmjs/v0.38.x/guides/cosmwasm/instantiating.mdx new file mode 100644 index 000000000..cb774ee64 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/instantiating.mdx @@ -0,0 +1,108 @@ +--- +title: "Instantiating Contracts" +description: "Create contract instances with admin, funds, and predictable addresses" +--- + +After uploading a Wasm binary, you create contract instances from its `codeId`. Each instance gets its own address, storage, and optional admin. A single code ID can be instantiated many times with different configuration. + +## Basic Instantiation + +```typescript +const instantiateResult = await client.instantiate( + address, + codeId, + { count: 0 }, + "My Counter Contract", + "auto", +); + +const { contractAddress, transactionHash, events } = instantiateResult; +``` + +The third argument is the JSON init message whose shape is defined by the contract. The fourth argument is a human-readable label stored on-chain. + +## Instantiation Options + +Pass an options object as the last argument to set an admin, attach funds, or add a memo: + +```typescript +const instantiateResult = await client.instantiate( + address, + codeId, + { owner: address, threshold: 3 }, + "My Multisig Contract", + "auto", + { + admin: address, + funds: [{ denom: "uosmo", amount: "1000000" }], + memo: "deploying multisig v1", + }, +); +``` + +| Option | Type | Description | +|--------|------|-------------| +| `admin` | `string` | Bech32 address with permission to migrate or update the contract. Omit to make the contract immutable. | +| `funds` | `Coin[]` | Native tokens transferred to the contract on creation. | +| `memo` | `string` | Transaction memo. | + + +Setting an admin is required if you ever want to migrate the contract to new code. If you omit the admin, the contract becomes permanently non-upgradeable. + + +## Predictable Addresses with Instantiate2 + +`instantiate2` creates a contract with a deterministic address derived from the code checksum, creator address, and a salt. This is useful when other contracts or off-chain systems need to know the address before it exists. + +```typescript +import { Random, sha256 } from "@cosmjs/crypto"; +import { instantiate2Address } from "@cosmjs/cosmwasm"; +import { readFileSync } from "fs"; + +const wasmCode = readFileSync("./my_contract.wasm"); +const salt = Random.getBytes(32); + +const predictedAddress = instantiate2Address( + sha256(wasmCode), + address, + salt, + "osmo", +); + +const result = await client.instantiate2( + address, + codeId, + salt, + { count: 0 }, + "Predictable Counter", + "auto", + { admin: address }, +); +// result.contractAddress === predictedAddress +``` + + +The salt must be between 1 and 64 bytes. Use a unique salt for each instantiation to avoid address collisions. + + +## Instantiation Result + +| Field | Type | Description | +|-------|------|-------------| +| `contractAddress` | `string` | Bech32 address of the new contract | +| `transactionHash` | `string` | Upper-case hex transaction hash | +| `height` | `number` | Block height of inclusion | +| `events` | `Event[]` | Transaction events | +| `gasWanted` | `bigint` | Gas requested | +| `gasUsed` | `bigint` | Gas consumed | + +## Next Steps + + + + Send execute messages to change contract state. + + + Migrate contracts and manage admin privileges. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/querying.mdx b/cosmjs/v0.38.x/guides/cosmwasm/querying.mdx new file mode 100644 index 000000000..7e75dc392 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/querying.mdx @@ -0,0 +1,105 @@ +--- +title: "Querying Contracts" +description: "Query smart contract state, metadata, and code info on CosmWasm-enabled chains" +--- + +`CosmWasmClient` provides multiple ways to read contract state: JSON smart queries that execute the contract's query entry point, raw binary reads against storage keys, and metadata lookups for contracts and uploaded code. + +## Smart Queries + +Smart queries execute the contract's query entry point and return parsed JSON. The query message shape depends on the contract. + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); + +const count = await client.queryContractSmart("osmo1contractaddr...", { + get_count: {}, +}); + +const balance = await client.queryContractSmart("osmo1tokencontract...", { + balance: { address: "osmo1useraddr..." }, +}); +``` + + +Smart queries are rejected if the contract address does not exist or the query message does not match the contract's schema. Both cases throw an error. + + +## Raw State Access + +For direct storage reads, use `queryContractRaw` with the binary storage key: + +```typescript +import { toAscii } from "@cosmjs/encoding"; + +const raw = await client.queryContractRaw("osmo1contractaddr...", toAscii("config")); +if (raw) { + const config = JSON.parse(new TextDecoder().decode(raw)); +} +``` + +## Contract Metadata + +Retrieve a contract's on-chain metadata including its code ID, creator, admin, and label: + +```typescript +const info = await client.getContract("osmo1contractaddr..."); +// { address, codeId, creator, admin, label, ibcPortId } + +const history = await client.getContractCodeHistory("osmo1contractaddr..."); +// [{ operation: "Init" | "Migrate" | "Genesis", codeId, msg }] +``` + +## Code and Contract Discovery + +List uploaded codes and find contracts by code ID or creator: + +```typescript +const codes = await client.getCodes(); +// [{ id, creator, checksum }] + +const codeDetails = await client.getCodeDetails(1); +// { id, creator, checksum, data (Uint8Array of original wasm) } + +const contracts = await client.getContracts(1); +// ["osmo1abc...", "osmo1def..."] + +const byCreator = await client.getContractsByCreator("osmo1creatoraddr..."); +// ["osmo1abc...", "osmo1def..."] +``` + + +`getCodes()`, `getContracts()`, and `getContractsByCreator()` loop through all pagination pages internally. For large result sets, consider using the wasm query extension directly with manual pagination. + + +## Using the Wasm Query Extension + +For fine-grained control over pagination or when building a custom query client, use the wasm extension directly: + +```typescript +import { QueryClient } from "@cosmjs/stargate"; +import { setupWasmExtension } from "@cosmjs/cosmwasm"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupWasmExtension); + +const { codeInfos, pagination } = await queryClient.wasm.listCodeInfo(); +const contracts = await queryClient.wasm.listContractsByCodeId(1); +const contractInfo = await queryClient.wasm.getContractInfo("osmo1contractaddr..."); +const history = await queryClient.wasm.getContractCodeHistory("osmo1contractaddr..."); +const allState = await queryClient.wasm.getAllContractState("osmo1contractaddr..."); +``` + +## Next Steps + + + + Deploy Wasm binaries to chain. + + + Execute contract messages and parse events. + + diff --git a/cosmjs/v0.38.x/guides/cosmwasm/uploading.mdx b/cosmjs/v0.38.x/guides/cosmwasm/uploading.mdx new file mode 100644 index 000000000..70c3afa70 --- /dev/null +++ b/cosmjs/v0.38.x/guides/cosmwasm/uploading.mdx @@ -0,0 +1,80 @@ +--- +title: "Uploading Code" +description: "Deploy Wasm binaries to a CosmWasm chain with optional access restrictions" +--- + +Before you can instantiate a contract, the compiled Wasm binary must be uploaded to the chain. The `upload` method on `SigningCosmWasmClient` handles gzip compression, transaction signing, and returns a `codeId` you use for instantiation. + +## Basic Upload + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { GasPrice } from "@cosmjs/stargate"; +import { readFileSync } from "fs"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic("your mnemonic ...", { + prefix: "osmo", +}); +const [{ address }] = await wallet.getAccounts(); + +const client = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); + +const wasmCode = readFileSync("./my_contract.wasm"); +const uploadResult = await client.upload(address, wasmCode, "auto"); + +const { codeId, checksum, originalSize, compressedSize, transactionHash } = uploadResult; +``` + +CosmJS automatically gzip-compresses the Wasm bytes before submitting the transaction. The `upload` method uses a tighter gas multiplier of 1.1x (instead of the default 1.4x) for `"auto"` fee estimation because code upload simulation is very accurate. + +## Upload with Access Restrictions + +You can restrict who is allowed to instantiate your uploaded code: + +```typescript +import { AccessConfig, AccessType } from "cosmjs-types/cosmwasm/wasm/v1/types"; + +const permission = AccessConfig.fromPartial({ + permission: AccessType.ACCESS_TYPE_ANY_OF_ADDRESSES, + addresses: [address], +}); + +const uploadResult = await client.upload(address, wasmCode, "auto", "optional memo", permission); +``` + +| AccessType | Description | +|-----------|-------------| +| `ACCESS_TYPE_EVERYBODY` | Anyone can instantiate | +| `ACCESS_TYPE_ANY_OF_ADDRESSES` | Only the listed addresses can instantiate | + +## Upload Result + +The `UploadResult` contains everything you need to proceed with instantiation: + +| Field | Type | Description | +|-------|------|-------------| +| `codeId` | `number` | The chain-assigned code ID for instantiation | +| `checksum` | `string` | Hex-encoded SHA-256 of the original (uncompressed) Wasm | +| `originalSize` | `number` | Size of the original Wasm in bytes | +| `compressedSize` | `number` | Size of the gzip-compressed Wasm in bytes | +| `transactionHash` | `string` | Upper-case hex transaction hash | +| `height` | `number` | Block height of inclusion | +| `events` | `Event[]` | Transaction events | +| `gasWanted` | `bigint` | Gas requested | +| `gasUsed` | `bigint` | Gas consumed | + +## Next Steps + + + + Create contract instances from uploaded code. + + + Gas estimation, simulation, and fee configuration. + + diff --git a/cosmjs/v0.38.x/guides/extending/amino-converters.mdx b/cosmjs/v0.38.x/guides/extending/amino-converters.mdx new file mode 100644 index 000000000..6c46ac4da --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/amino-converters.mdx @@ -0,0 +1,143 @@ +--- +title: "Amino Converters" +description: "Add Amino JSON signing support for custom message types used by wallets like Keplr and Leap" +--- + +Wallets like Keplr and Leap use **Amino JSON** signing (`SIGN_MODE_LEGACY_AMINO_JSON`) by default. If your custom module needs to support these wallets, you must provide Amino converters that translate between protobuf field names (camelCase) and Amino field names (snake_case). + +## Defining Converters + +An `AminoConverter` maps a protobuf type URL to its Amino type string and provides `toAmino`/`fromAmino` transform functions: + +```typescript +import { AminoConverters } from "@cosmjs/stargate"; + +export function createBlogAminoConverters(): AminoConverters { + return { + "/blog.v1.MsgCreatePost": { + aminoType: "blog/MsgCreatePost", + toAmino: ({ author, title, body }) => ({ + author, + title, + body, + }), + fromAmino: ({ author, title, body }) => ({ + author, + title, + body, + }), + }, + "/blog.v1.MsgEditPost": { + aminoType: "blog/MsgEditPost", + toAmino: ({ author, id, title, body }) => ({ + author, + id: id.toString(), + title, + body, + }), + fromAmino: ({ author, id, title, body }) => ({ + author, + id: BigInt(id), + title, + body, + }), + }, + }; +} +``` + +Each converter has three parts: + +| Field | Purpose | +|-------|---------| +| `aminoType` | The Amino type identifier string registered on the chain (e.g. `"blog/MsgCreatePost"`) | +| `toAmino` | Converts a protobuf message value to its Amino JSON representation | +| `fromAmino` | Converts an Amino JSON value back to the protobuf message format | + + +The `aminoType` string must match exactly what the chain's `x/` module registers on the server side. A mismatch causes signature verification failures. Check your module's Go source for the registered Amino type name. + + +## Handling Type Conversions + +Amino JSON uses different representations for some types. Common conversions you'll encounter: + +| Protobuf type | Amino representation | `toAmino` | `fromAmino` | +|---------------|---------------------|-----------|-------------| +| `bigint` / `int64` | String | `id.toString()` | `BigInt(id)` | +| `Uint8Array` | Base64 string | `toBase64(data)` | `fromBase64(data)` | +| `Timestamp` | ISO string | `timestamp.toISOString()` | `new Date(str)` | +| Nested message | Flattened snake_case | Manual field mapping | Manual field mapping | + +Example with multiple type conversions: + +```typescript +import { fromBase64, toBase64 } from "@cosmjs/encoding"; + +"/blog.v1.MsgCreatePostWithAttachment": { + aminoType: "blog/MsgCreatePostWithAttachment", + toAmino: ({ author, id, title, attachment }) => ({ + author, + id: id.toString(), + title, + attachment: toBase64(attachment), + }), + fromAmino: ({ author, id, title, attachment }) => ({ + author, + id: BigInt(id), + title, + attachment: fromBase64(attachment), + }), +}, +``` + +## Passing Converters to the Signing Client + +Merge your custom converters with the defaults using `AminoTypes`: + +```typescript +import { + SigningStargateClient, + GasPrice, + AminoTypes, + defaultRegistryTypes, + createDefaultAminoConverters, +} from "@cosmjs/stargate"; +import { Registry } from "@cosmjs/proto-signing"; + +const registry = new Registry([...defaultRegistryTypes, ...blogTypes]); + +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + ...createBlogAminoConverters(), +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, aminoTypes, gasPrice: GasPrice.fromString("0.025utoken") }, +); +``` + +The client automatically selects the signing mode based on the wallet: + +- **`OfflineDirectSigner`** (e.g. `DirectSecp256k1HdWallet`) uses `SIGN_MODE_DIRECT` — protobuf encoding, Amino converters not needed +- **`OfflineAminoSigner`** (e.g. `Secp256k1HdWallet`, Keplr, Leap) uses `SIGN_MODE_LEGACY_AMINO_JSON` — requires Amino converters for all message types in the transaction + + +If you only use `DirectSecp256k1HdWallet` and never need Keplr/Leap support, you can skip Amino converters entirely. But adding them makes your code compatible with all Cosmos wallets. + + +## Next Steps + + + + Register the protobuf types that your Amino converters translate. + + + See a complete module integration that ties types, queries, and Amino converters together. + + + Understand how the two signing modes work and when each is used. + + diff --git a/cosmjs/v0.38.x/guides/extending/code-generation.mdx b/cosmjs/v0.38.x/guides/extending/code-generation.mdx new file mode 100644 index 000000000..905c9f74b --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/code-generation.mdx @@ -0,0 +1,223 @@ +--- +title: "Code Generation" +description: "Generate TypeScript types from protobuf definitions using Telescope, ts-proto, or protobufjs" +--- + +Writing protobuf codec wrappers, query clients, and Amino converters by hand is error-prone and tedious. Code generation tools read your chain's `.proto` files and produce TypeScript code that's directly compatible with CosmJS's `Registry`, `createProtobufRpcClient`, and `AminoTypes`. + +## Choosing a Generator + +| | [Telescope](https://github.com/cosmology-tech/telescope) | [ts-proto](https://github.com/stephenh/ts-proto) | [protobufjs](https://github.com/protobufjs/protobuf.js) | +|---|---|---|---| +| **Approach** | Full-stack Cosmos codegen | General-purpose protobuf codegen | Runtime type definitions | +| **Output** | Message codecs, query clients, Amino converters, registry helpers, LCD clients | Message codecs, query service clients | Encode/decode at runtime (no build step) | +| **CosmJS interface** | `TelescopeGeneratedType` | `TsProtoGeneratedType` / `TsProto2GeneratedType` | `PbjsGeneratedType` | +| **`fromPartial`** | Yes | Yes | No (uses `create`) | +| **Best for** | Full dApp development, chain-specific libraries | Matching CosmJS's own code style, lightweight projects | Prototyping, runtime-defined types | +| **Used by** | OsmoJS, Stargaze, dYdX, Stride | `cosmjs-types` (CosmJS itself) | Quick prototypes, dynamic schemas | + +## Telescope + +[Telescope](https://github.com/cosmology-tech/telescope) is the most popular code generator in the Cosmos ecosystem. It produces complete TypeScript libraries that include everything needed for CosmJS integration — message codecs, query clients, Amino converters, and registry arrays. + +### Quick Start + + +Telescope v2 has been published as `@hyperweb/telescope` with InterchainJS as the default dependency. For CosmJS-based projects, `@cosmology/telescope` v1.x remains the recommended version. The CLI commands below work with both versions. + + + + +### Install Telescope + +```bash +npm install -g @cosmology/telescope +``` + +### Initialize a new package + +```bash +telescope generate +``` + +This creates a new project scaffold. Place your `.proto` files (or the chain's proto files) into the `./proto` directory. + +### Install existing protobuf definitions + +For well-known chains, Telescope can pull proto definitions automatically: + +```bash +telescope install +``` + +### Generate TypeScript code + +```bash +telescope transpile +``` + +This produces typed message codecs, query clients, Amino converters, and registry helpers — ready to import into your CosmJS project. + + + +### Using Telescope Output with CosmJS + +Telescope-generated types implement `TelescopeGeneratedType`, which the CosmJS `Registry` accepts directly. A typical Telescope output includes: + +- **Message codecs** (`MsgXxx` with `encode`, `decode`, `fromPartial`) +- **Query clients** (`QueryClientImpl` for gRPC-web queries) +- **Registry arrays** (pre-built `[typeUrl, codec]` pairs) +- **Amino converters** (ready-made `AminoConverter` objects) + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, AminoTypes, createDefaultAminoConverters } from "@cosmjs/stargate"; + +// Telescope-generated imports from OsmoJS +import { osmosis, osmosisProtoRegistry, osmosisAminoConverters } from "osmojs"; + +// Message composers give you typed helpers +const { joinPool, swapExactAmountIn } = osmosis.gamm.v1beta1.MessageComposer.withTypeUrl; + +// Use the top-level registry and amino exports +const registry = new Registry([ + ...defaultRegistryTypes, + ...osmosisProtoRegistry, +]); + +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + ...osmosisAminoConverters, +}); +``` + +### Chain-Specific Libraries + +Many popular chains already have Telescope-generated libraries published on npm: + +| Chain | Package | Install | +|-------|---------|---------| +| Osmosis | `osmojs` | `npm install osmojs` | +| Stargaze | `stargazejs` | `npm install stargazejs` | +| Juno | `juno-network` | `npm install juno-network` | +| Stride | `stridejs` | `npm install stridejs` | +| dYdX | `@dydxprotocol/v4-client-js` | `npm install @dydxprotocol/v4-client-js` | +| Injective | `@injectivelabs/sdk-ts` | `npm install @injectivelabs/sdk-ts` | + +Check if a library exists for your chain before generating types from scratch. + +## ts-proto + +CosmJS itself uses [ts-proto](https://github.com/stephenh/ts-proto) via the [`cosmjs-types`](https://github.com/confio/cosmjs-types) package. It's a lightweight, general-purpose protobuf code generator that produces clean TypeScript with no Cosmos-specific abstractions. + +### Setup + +Install `ts-proto` and `protoc` (the Protocol Buffer compiler): + + + +```bash npm +npm install --save-dev ts-proto +``` + +```bash yarn +yarn add --dev ts-proto +``` + + + +You also need [`protoc`](https://github.com/protocolbuffers/protobuf/releases) installed on your system. + +### Generating Code + +```bash +protoc \ + --plugin="./node_modules/.bin/protoc-gen-ts_proto" \ + --ts_proto_out="./src/generated" \ + --proto_path="./proto" \ + --ts_proto_opt="esModuleInterop=true,forceLong=bigint,useOptionals=messages" \ + ./proto/mymodule/v1/tx.proto \ + ./proto/mymodule/v1/query.proto +``` + +Key `ts_proto_opt` options: + +| Option | Recommended value | Purpose | +|--------|-------------------|---------| +| `esModuleInterop` | `true` | Compatibility with ES module imports | +| `forceLong` | `bigint` | Use native `bigint` instead of the `Long` library | +| `useOptionals` | `messages` | Make nested message fields optional | + +The generated `MsgXxx` and `QueryClientImpl` classes work directly with CosmJS's `Registry` and `createProtobufRpcClient`. + +### Working with Yarn 2+ + +The binary `./node_modules/.bin/protoc-gen-ts_proto` is not easily available in Yarn 2+. Create an executable wrapper script `bin/protoc-gen-ts_proto_yarn_2`: + +```bash +#!/usr/bin/env -S yarn node +require('ts-proto/build/plugin') +``` + +Then use `--ts_proto_yarn_2_opt` instead of `--ts_proto_opt` in your `protoc` command. See the [cosmjs-types repo](https://github.com/confio/cosmjs-types) for a full example. + +## protobufjs (Runtime Types) + +For prototyping or when you don't have access to `.proto` files, [protobufjs](https://github.com/protobufjs/protobuf.js) lets you define types at runtime in pure JavaScript — no build step required: + +```typescript +import * as protobuf from "protobufjs"; +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; + +const root = protobuf.Root.fromJSON({ + nested: { + blog: { + nested: { + v1: { + nested: { + MsgCreatePost: { + fields: { + author: { type: "string", id: 1 }, + title: { type: "string", id: 2 }, + body: { type: "string", id: 3 }, + }, + }, + }, + }, + }, + }, + }, +}); + +const MsgCreatePost = root.lookupType("blog.v1.MsgCreatePost"); + +const registry = new Registry(defaultRegistryTypes); +registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); +``` + + +Runtime types from protobufjs use `create` instead of `fromPartial`. The Registry handles both automatically. + + +### When to Use protobufjs + +- **Prototyping**: Quickly test a message type without setting up a codegen pipeline +- **Dynamic schemas**: When the proto definitions aren't known at build time +- **Plain JavaScript**: When you don't want a TypeScript build step + +For production applications, Telescope or ts-proto are preferred because they provide compile-time type safety. + +## Next Steps + + + + Register your generated types in the CosmJS Registry. + + + Wire generated types into a complete module integration. + + + Configure CosmJS for your chain's address prefix, gas token, and account type. + + diff --git a/cosmjs/v0.38.x/guides/extending/custom-modules.mdx b/cosmjs/v0.38.x/guides/extending/custom-modules.mdx new file mode 100644 index 000000000..6db47c45b --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/custom-modules.mdx @@ -0,0 +1,220 @@ +--- +title: "Custom Modules" +description: "Combine types, queries, and Amino converters into a complete custom module integration" +--- + +A complete custom module integration brings together [registry types](/cosmjs/v0.38.x/guides/extending/custom-types), [query extensions](/cosmjs/v0.38.x/guides/extending/query-extensions), and [Amino converters](/cosmjs/v0.38.x/guides/extending/amino-converters) into a single cohesive package. This page walks through the full structure for a hypothetical `blog` module. + +## Module File Structure + +A well-organized module integration follows the same pattern CosmJS uses internally for its built-in modules: + +``` +src/ +├── generated/ +│ └── blog/v1/ +│ ├── tx.ts # Generated message codecs (MsgCreatePost, etc.) +│ ├── query.ts # Generated QueryClientImpl +│ └── types.ts # Generated shared types (Post, etc.) +└── modules/ + └── blog.ts # Registry types, Amino converters, query extension +``` + +## End-to-End Example + + + +### Generate TypeScript types from protobuf + +Use one of the supported code generators. With `ts-proto` and `protoc`: + +```bash +protoc \ + --plugin="./node_modules/.bin/protoc-gen-ts_proto" \ + --ts_proto_out="./src/generated" \ + --proto_path="./proto" \ + --ts_proto_opt="esModuleInterop=true,forceLong=bigint,useOptionals=messages" \ + ./proto/blog/v1/tx.proto \ + ./proto/blog/v1/query.proto +``` + +This produces `src/generated/blog/v1/tx.ts` (message codecs) and `src/generated/blog/v1/query.ts` (query service). + +### Define the module integration + +Create a single file that exports registry types, Amino converters, encode objects, and the query extension: + +```typescript +// src/modules/blog.ts +import { EncodeObject, GeneratedType } from "@cosmjs/proto-signing"; +import { AminoConverters, createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; + +import { MsgCreatePost, MsgEditPost, MsgDeletePost } from "../generated/blog/v1/tx"; +import { QueryClientImpl } from "../generated/blog/v1/query"; +import type { Post } from "../generated/blog/v1/types"; + +// Registry types +export const blogTypes: ReadonlyArray<[string, GeneratedType]> = [ + ["/blog.v1.MsgCreatePost", MsgCreatePost], + ["/blog.v1.MsgEditPost", MsgEditPost], + ["/blog.v1.MsgDeletePost", MsgDeletePost], +]; + +// Typed encode objects +export interface MsgCreatePostEncodeObject extends EncodeObject { + readonly typeUrl: "/blog.v1.MsgCreatePost"; + readonly value: Partial; +} + +// Amino converters +export function createBlogAminoConverters(): AminoConverters { + return { + "/blog.v1.MsgCreatePost": { + aminoType: "blog/MsgCreatePost", + toAmino: ({ author, title, body }) => ({ author, title, body }), + fromAmino: ({ author, title, body }) => ({ author, title, body }), + }, + "/blog.v1.MsgEditPost": { + aminoType: "blog/MsgEditPost", + toAmino: ({ author, id, title, body }) => ({ + author, + id: id.toString(), + title, + body, + }), + fromAmino: ({ author, id, title, body }) => ({ + author, + id: BigInt(id), + title, + body, + }), + }, + "/blog.v1.MsgDeletePost": { + aminoType: "blog/MsgDeletePost", + toAmino: ({ author, id }) => ({ author, id: id.toString() }), + fromAmino: ({ author, id }) => ({ author, id: BigInt(id) }), + }, + }; +} + +// Query extension +export interface BlogExtension { + readonly blog: { + readonly post: (id: bigint) => Promise; + readonly posts: (author: string) => Promise; + }; +} + +export function setupBlogExtension(base: QueryClient): BlogExtension { + const rpc = createProtobufRpcClient(base); + const queryService = new QueryClientImpl(rpc); + + return { + blog: { + post: async (id: bigint) => { + const { post } = await queryService.Post({ id }); + if (!post) throw new Error(`Post ${id} not found`); + return post; + }, + posts: async (author: string) => { + const { posts } = await queryService.Posts({ author }); + return posts; + }, + }, + }; +} +``` + +### Wire everything into the client + +```typescript +import { DirectSecp256k1HdWallet, Registry } from "@cosmjs/proto-signing"; +import { + SigningStargateClient, + GasPrice, + AminoTypes, + defaultRegistryTypes, + createDefaultAminoConverters, +} from "@cosmjs/stargate"; + +import { blogTypes, createBlogAminoConverters, MsgCreatePostEncodeObject } from "./modules/blog"; +import { MsgCreatePost } from "./generated/blog/v1/tx"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your mnemonic words here ...", + { prefix: "blog" }, +); +const [{ address }] = await wallet.getAccounts(); + +const registry = new Registry([...defaultRegistryTypes, ...blogTypes]); +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + ...createBlogAminoConverters(), +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, aminoTypes, gasPrice: GasPrice.fromString("0.025ublog") }, +); + +const msg: MsgCreatePostEncodeObject = { + typeUrl: "/blog.v1.MsgCreatePost", + value: MsgCreatePost.fromPartial({ + author: address, + title: "My First Post", + body: "Published with CosmJS and custom module support.", + }), +}; + +const result = await client.signAndBroadcast(address, [msg], "auto"); +``` + + + +## Combining Multiple Modules + +Real applications often integrate types from several modules. Aggregate module registrations into a single setup: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { + defaultRegistryTypes, + AminoTypes, + createDefaultAminoConverters, +} from "@cosmjs/stargate"; + +import { blogTypes, createBlogAminoConverters } from "./modules/blog"; +import { marketplaceTypes, createMarketplaceAminoConverters } from "./modules/marketplace"; +import { identityTypes, createIdentityAminoConverters } from "./modules/identity"; + +const allTypes = [ + ...defaultRegistryTypes, + ...blogTypes, + ...marketplaceTypes, + ...identityTypes, +]; + +const allAminoConverters = { + ...createDefaultAminoConverters(), + ...createBlogAminoConverters(), + ...createMarketplaceAminoConverters(), + ...createIdentityAminoConverters(), +}; + +const registry = new Registry(allTypes); +const aminoTypes = new AminoTypes(allAminoConverters); +``` + +Each module follows the same structure: export `xxxTypes` for the registry, `createXxxAminoConverters()` for Amino support, and `setupXxxExtension()` for queries. This pattern scales cleanly regardless of how many custom modules your chain has. + +## Next Steps + + + + Configure CosmJS for a new Cosmos SDK chain with custom parameters. + + + Automate type generation with Telescope or ts-proto instead of hand-writing modules. + + diff --git a/cosmjs/v0.38.x/guides/extending/custom-types.mdx b/cosmjs/v0.38.x/guides/extending/custom-types.mdx new file mode 100644 index 000000000..0f6dd8ab9 --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/custom-types.mdx @@ -0,0 +1,148 @@ +--- +title: "Custom Protobuf Types" +description: "Register custom message types in the Registry, create type-safe encode objects, and decode transactions" +--- + +Every transaction message in Cosmos SDK is identified by a **type URL** (e.g. `"/cosmos.bank.v1beta1.MsgSend"`) and encoded as Protocol Buffers. The `Registry` in `@cosmjs/proto-signing` maps type URLs to their codec implementations so CosmJS can encode and decode messages. + +## Adding Types to the Registry + +Start from `defaultRegistryTypes`, which includes all standard Cosmos SDK message types, and add your own: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes, SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +import { MsgCreatePost } from "./generated/blog/v1/tx"; + +const registry = new Registry(defaultRegistryTypes); +registry.register("/blog.v1.MsgCreatePost", MsgCreatePost); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, gasPrice: GasPrice.fromString("0.025utoken") }, +); +``` + +Now `signAndBroadcast` can serialize `MsgCreatePost` messages: + +```typescript +const result = await client.signAndBroadcast( + senderAddress, + [ + { + typeUrl: "/blog.v1.MsgCreatePost", + value: MsgCreatePost.fromPartial({ + author: senderAddress, + title: "Hello Cosmos", + body: "This is my first post on-chain.", + }), + }, + ], + "auto", +); +``` + +## Registering Multiple Types + +When your module has several message types, define them as an array and spread into the registry: + +```typescript +import { GeneratedType, Registry } from "@cosmjs/proto-signing"; +import { defaultRegistryTypes } from "@cosmjs/stargate"; + +import { MsgCreatePost, MsgEditPost, MsgDeletePost } from "./generated/blog/v1/tx"; + +const blogTypes: ReadonlyArray<[string, GeneratedType]> = [ + ["/blog.v1.MsgCreatePost", MsgCreatePost], + ["/blog.v1.MsgEditPost", MsgEditPost], + ["/blog.v1.MsgDeletePost", MsgDeletePost], +]; + +const registry = new Registry([...defaultRegistryTypes, ...blogTypes]); +``` + +## Supported Codec Formats + +The `Registry` accepts types generated by any of these tools: + +| Generator | Interface | `fromPartial` | Notes | +|-----------|-----------|---------------|-------| +| [Telescope](https://github.com/cosmology-tech/telescope) 1.x | `TelescopeGeneratedType` | Yes | Used by OsmoJS, Stargaze, dYdX, and others | +| [ts-proto](https://github.com/stephenh/ts-proto) 1.x | `TsProtoGeneratedType` | Yes | Used by `cosmjs-types` (CosmJS's own types) | +| [ts-proto](https://github.com/stephenh/ts-proto) 2.x | `TsProto2GeneratedType` | Yes | Uses `@bufbuild/protobuf` wire format | +| [protobufjs](https://github.com/protobufjs/protobuf.js) | `PbjsGeneratedType` | No (uses `create`) | Runtime-only type definitions, no codegen step required | + +All four implement `encode` and `decode`. Types with `fromPartial` (Telescope, ts-proto) are preferred because they allow constructing messages from partial objects without specifying every field. + +See the [Code Generation](/cosmjs/v0.38.x/guides/extending/code-generation) page for details on each tool. + +## Type-Safe Encode Objects + +For large projects, define typed encode objects that narrow the `typeUrl` to a string literal. This prevents typos and gives you autocomplete on the `value` field: + +```typescript +import { EncodeObject } from "@cosmjs/proto-signing"; +import { MsgCreatePost } from "./generated/blog/v1/tx"; + +export interface MsgCreatePostEncodeObject extends EncodeObject { + readonly typeUrl: "/blog.v1.MsgCreatePost"; + readonly value: Partial; +} + +export function isMsgCreatePostEncodeObject( + o: EncodeObject, +): o is MsgCreatePostEncodeObject { + return o.typeUrl === "/blog.v1.MsgCreatePost"; +} +``` + +Use them when constructing transactions: + +```typescript +const msg: MsgCreatePostEncodeObject = { + typeUrl: "/blog.v1.MsgCreatePost", + value: MsgCreatePost.fromPartial({ + author: senderAddress, + title: "Type-safe message", + body: "The compiler catches typos in typeUrl.", + }), +}; + +const result = await client.signAndBroadcast(senderAddress, [msg], "auto"); +``` + +## Decoding Transactions + +The `Registry` also decodes incoming data. This is useful for parsing transactions from the blockchain or decoding responses: + +```typescript +import { decodeTxRaw } from "@cosmjs/proto-signing"; + +const tx = await client.getTx(txHash); +if (tx) { + const decoded = decodeTxRaw(tx.tx); + + for (const msg of decoded.body.messages) { + const decodedMsg = registry.decode(msg); + console.info(`${msg.typeUrl}:`, decodedMsg); + } +} +``` + +Without your custom types registered, `registry.decode` throws `Unregistered type url` for unknown message types. Register all types you expect to encounter before decoding. + +## Next Steps + + + + Build typed query methods for your custom module. + + + Add Amino JSON signing support for wallets like Keplr and Leap. + + + Generate TypeScript codecs from protobuf definitions automatically. + + diff --git a/cosmjs/v0.38.x/guides/extending/extending.mdx b/cosmjs/v0.38.x/guides/extending/extending.mdx new file mode 100644 index 000000000..e19e63618 --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/extending.mdx @@ -0,0 +1,45 @@ +--- +title: "Extending CosmJS" +description: "Register custom protobuf types, build query extensions, integrate custom modules, and support new Cosmos SDK chains" +--- + +CosmJS is designed to be extended. While it ships with support for standard Cosmos SDK modules (bank, staking, governance, IBC), most Cosmos chains include custom modules with their own message types and query services. This section walks through every extension point — from registering a single custom message type to building full module integrations with code generation tools. + +## Prerequisites + + + +```bash npm +npm install @cosmjs/stargate @cosmjs/proto-signing @cosmjs/tendermint-rpc @cosmjs/amino +``` + +```bash yarn +yarn add @cosmjs/stargate @cosmjs/proto-signing @cosmjs/tendermint-rpc @cosmjs/amino +``` + + + +You should be familiar with [signing clients](/cosmjs/v0.38.x/concepts/clients/signing-clients), [the Registry](/cosmjs/v0.38.x/concepts/messages-encoding/registry), and [encode objects](/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects) before proceeding. + +## Guides + + + + Register custom message types in the Registry, create type-safe encode objects, and decode transactions. + + + Build typed query extensions that wrap your module's gRPC query service. + + + Add Amino JSON signing support for custom message types used by wallets like Keplr and Leap. + + + Combine types, queries, and Amino converters into a complete module integration. + + + Configure CosmJS for new Cosmos SDK chains with custom prefixes, gas prices, and account types. + + + Generate TypeScript types from protobuf definitions using Telescope, ts-proto, or protobufjs. + + diff --git a/cosmjs/v0.38.x/guides/extending/new-chains.mdx b/cosmjs/v0.38.x/guides/extending/new-chains.mdx new file mode 100644 index 000000000..eeb16db52 --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/new-chains.mdx @@ -0,0 +1,177 @@ +--- +title: "Supporting New Chains" +description: "Configure CosmJS for new Cosmos SDK chains with custom prefixes, gas prices, and account types" +--- + +Connecting to a new Cosmos SDK chain typically involves configuring a few chain-specific parameters. CosmJS auto-detects the CometBFT version (0.37, 0.38, or 1.x), so transport setup is usually automatic. + +## Chain Configuration + +The minimum configuration you need for a new chain: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const chainConfig = { + rpcEndpoint: "https://rpc.my-chain.network", + prefix: "mychain", + denom: "umytoken", + gasPrice: "0.01umytoken", +}; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: chainConfig.prefix, +}); + +const client = await SigningStargateClient.connectWithSigner( + chainConfig.rpcEndpoint, + wallet, + { gasPrice: GasPrice.fromString(chainConfig.gasPrice) }, +); +``` + +The key parameters are: + +| Parameter | Purpose | Example | +|-----------|---------|---------| +| `rpcEndpoint` | CometBFT/Tendermint RPC URL | `"https://rpc.my-chain.network"` | +| `prefix` | Bech32 address prefix | `"osmo"`, `"cosmos"`, `"juno"` | +| `denom` | Fee token denomination | `"uosmo"`, `"uatom"` | +| `gasPrice` | Price per gas unit | `"0.025uosmo"` | + +## Chains with Custom Modules + +Most application-specific chains (Osmosis, dYdX, Stride, etc.) define custom modules beyond the standard Cosmos SDK set. Register their types and converters as described in the [Custom Modules](/cosmjs/v0.38.x/guides/extending/custom-modules) guide: + +```typescript +import { Registry } from "@cosmjs/proto-signing"; +import { + SigningStargateClient, + GasPrice, + AminoTypes, + defaultRegistryTypes, + createDefaultAminoConverters, +} from "@cosmjs/stargate"; + +const registry = new Registry([ + ...defaultRegistryTypes, + ...myChainModuleATypes, + ...myChainModuleBTypes, +]); + +const aminoTypes = new AminoTypes({ + ...createDefaultAminoConverters(), + ...createModuleAAminoConverters(), + ...createModuleBAminoConverters(), +}); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { registry, aminoTypes, gasPrice: GasPrice.fromString("0.01utoken") }, +); +``` + + +Many popular chains have pre-built TypeScript libraries generated with Telescope: [OsmoJS](https://github.com/osmosis-labs/osmojs) for Osmosis, [stargazejs](https://github.com/public-awesome/stargazejs) for Stargaze, [stridejs](https://github.com/Stride-Labs/stridejs) for Stride, and others. Check if one exists for your chain before writing custom module code. + + +## Custom Account Parsers + +Some chains use non-standard account types (e.g. `EthAccount` on EVM-compatible chains). The default `accountFromAny` parser won't recognize them, causing account lookups to fail. Pass a custom `accountParser` to handle these: + +```typescript +import { decodePubkey } from "@cosmjs/proto-signing"; +import { accountFromAny, AccountParser } from "@cosmjs/stargate"; +import { EthAccount } from "./generated/ethermint/types/v1/account"; +import { Any } from "cosmjs-types/google/protobuf/any"; + +const customAccountParser: AccountParser = (any: Any) => { + if (any.typeUrl === "/ethermint.types.v1.EthAccount") { + const ethAccount = EthAccount.decode(any.value); + const baseAccount = ethAccount.baseAccount; + if (!baseAccount) throw new Error("EthAccount missing baseAccount"); + return { + address: baseAccount.address, + pubkey: baseAccount.pubKey ? decodePubkey(baseAccount.pubKey) : null, + accountNumber: Number(baseAccount.accountNumber), + sequence: Number(baseAccount.sequence), + }; + } + return accountFromAny(any); +}; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { accountParser: customAccountParser }, +); +``` + +The `accountParser` option is available on both `StargateClient` (read-only) and `SigningStargateClient` (signing). The parser receives an `Any`-encoded account from the auth module and must return an `Account` object with `address`, `pubkey`, `accountNumber`, and `sequence`. + +## HD Derivation Paths + +Different chains may use different [BIP-44](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) coin types in their HD derivation path. The default is `m/44'/118'/0'/0/0` (coin type 118, the Cosmos Hub standard). Override this for chains that use a different coin type: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { stringToPath } from "@cosmjs/crypto"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "evmos", + hdPaths: [stringToPath("m/44'/60'/0'/0/0")], +}); +``` + +Common coin types: + +| Chain | Coin Type | HD Path | +|-------|-----------|---------| +| Cosmos Hub, most Cosmos chains | 118 | `m/44'/118'/0'/0/0` | +| Ethereum-based (Evmos, Injective) | 60 | `m/44'/60'/0'/0/0` | +| Terra | 330 | `m/44'/330'/0'/0/0` | +| Crypto.org | 394 | `m/44'/394'/0'/0/0` | + +```typescript +import { stringToPath } from "@cosmjs/crypto"; + +const cosmosPath = stringToPath("m/44'/118'/0'/0/0"); +const ethPath = stringToPath("m/44'/60'/0'/0/0"); +``` + +## Multiple Accounts + +To derive multiple accounts from the same mnemonic, pass multiple HD paths: + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; +import { stringToPath } from "@cosmjs/crypto"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, { + prefix: "cosmos", + hdPaths: [ + stringToPath("m/44'/118'/0'/0/0"), + stringToPath("m/44'/118'/0'/0/1"), + stringToPath("m/44'/118'/0'/0/2"), + ], +}); + +const accounts = await wallet.getAccounts(); +// accounts[0], accounts[1], accounts[2] — each with a different address +``` + +## Next Steps + + + + Build a complete module integration for your chain's custom message types. + + + Use Telescope or ts-proto to generate TypeScript types from your chain's protobuf definitions. + + + Special considerations for EVM-compatible Cosmos chains. + + diff --git a/cosmjs/v0.38.x/guides/extending/query-extensions.mdx b/cosmjs/v0.38.x/guides/extending/query-extensions.mdx new file mode 100644 index 000000000..d8e0163fe --- /dev/null +++ b/cosmjs/v0.38.x/guides/extending/query-extensions.mdx @@ -0,0 +1,157 @@ +--- +title: "Query Extensions" +description: "Build typed query extensions that wrap your module's gRPC query service" +--- + +CosmJS uses the **query extension** pattern to expose typed query methods on the client. Each extension wraps a protobuf `QueryClientImpl` generated from your module's `.proto` files and attaches its methods to a shared `QueryClient`. + +## The Extension Pattern + +An extension is a function that takes a `QueryClient` and returns an object with your query methods, namespaced under a key that represents your module: + +```typescript +import { createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; +import { QueryClientImpl } from "./generated/blog/v1/query"; + +export interface BlogExtension { + readonly blog: { + readonly post: (id: bigint) => Promise; + readonly posts: (author: string) => Promise; + }; +} + +export function setupBlogExtension(base: QueryClient): BlogExtension { + const rpc = createProtobufRpcClient(base); + const queryService = new QueryClientImpl(rpc); + + return { + blog: { + post: async (id: bigint) => { + const { post } = await queryService.Post({ id }); + if (!post) throw new Error(`Post ${id} not found`); + return post; + }, + posts: async (author: string) => { + const { posts } = await queryService.Posts({ author }); + return posts; + }, + }, + }; +} +``` + +The three layers work together: + +1. `createProtobufRpcClient` wraps the `QueryClient` into a protobuf-compatible RPC transport +2. `QueryClientImpl` (generated from your `.proto` files) provides typed query methods over that transport +3. Your extension function maps those raw RPC calls into a developer-friendly API + + +The outer key (`blog` above) namespaces your methods on the query client. Choose a name that matches your module to avoid collisions with other extensions. + + +## Composing Extensions + +Use `QueryClient.withExtensions` to combine your extension with built-in ones: + +```typescript +import { QueryClient, setupBankExtension, setupStakingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); + +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, + setupBlogExtension, +); + +const post = await queryClient.blog.post(1n); +const balance = await queryClient.bank.balance("cosmos1abc...", "utoken"); +``` + +`QueryClient.withExtensions` supports up to 18 extensions, which is enough for even the most feature-rich chains. The resulting client is fully typed — TypeScript knows about all the query namespaces you've composed. + +## Using QueryClientImpl Directly + +If you only need a quick one-off query without composing extensions, use the generated query service directly: + +```typescript +import { createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; +import { QueryClientImpl } from "./generated/blog/v1/query"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = new QueryClient(cometClient); +const rpc = createProtobufRpcClient(queryClient); +const blogQuery = new QueryClientImpl(rpc); + +const { post } = await blogQuery.Post({ id: 1n }); +``` + +This approach skips the extension boilerplate and is useful for scripts, debugging, or when you only query a single module. + +## Handling Pagination + +Many Cosmos SDK queries return paginated results. Pass `PageRequest` to control pagination and iterate through all pages: + +```typescript +import { createPagination, createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; +import { QueryClientImpl } from "./generated/blog/v1/query"; + +export interface BlogExtension { + readonly blog: { + readonly allPosts: (paginationKey?: Uint8Array) => Promise<{ + readonly posts: Post[]; + readonly nextKey: Uint8Array | undefined; + }>; + }; +} + +export function setupBlogExtension(base: QueryClient): BlogExtension { + const rpc = createProtobufRpcClient(base); + const queryService = new QueryClientImpl(rpc); + + return { + blog: { + allPosts: async (paginationKey?: Uint8Array) => { + const response = await queryService.Posts({ + pagination: createPagination(paginationKey), + }); + return { + posts: response.posts, + nextKey: response.pagination?.nextKey, + }; + }, + }, + }; +} +``` + +Iterate through all pages: + +```typescript +const allPosts: Post[] = []; +let nextKey: Uint8Array | undefined; + +do { + const page = await queryClient.blog.allPosts(nextKey); + allPosts.push(...page.posts); + nextKey = page.nextKey?.length ? page.nextKey : undefined; +} while (nextKey); +``` + +## Next Steps + + + + Register message types in the Registry for signing transactions. + + + Combine query extensions with types and Amino converters into a complete module. + + + Generate QueryClientImpl and message codecs from protobuf definitions. + + diff --git a/cosmjs/v0.38.x/guides/query/accounts.mdx b/cosmjs/v0.38.x/guides/query/accounts.mdx new file mode 100644 index 000000000..36931aae1 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/accounts.mdx @@ -0,0 +1,97 @@ +--- +title: "Account Queries" +description: "Look up account info, sequence numbers, and handle custom account types with AccountParser" +--- + +Account data is available through both the high-level client and the auth extension. Use `StargateClient` methods for most cases, and drop down to the auth extension when you need the raw protobuf response. + +## Using StargateClient + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const account = await client.getAccount("cosmos1..."); +if (account) { + console.info(account.address); + console.info(account.accountNumber); + console.info(account.sequence); + console.info(account.pubkey); +} + +const seq = await client.getSequence("cosmos1..."); +console.info(seq.accountNumber, seq.sequence); +``` + +`getAccount` returns `null` for addresses that have never received tokens. `getSequence` throws if the account does not exist. + +## Supported Account Types + +The default `accountFromAny` parser handles these Cosmos SDK account types: + +| Type URL | Account Type | +|----------|-------------| +| `/cosmos.auth.v1beta1.BaseAccount` | Standard account | +| `/cosmos.auth.v1beta1.ModuleAccount` | Module-owned account | +| `/cosmos.vesting.v1beta1.BaseVestingAccount` | Base vesting | +| `/cosmos.vesting.v1beta1.ContinuousVestingAccount` | Continuous vesting | +| `/cosmos.vesting.v1beta1.DelayedVestingAccount` | Delayed vesting | +| `/cosmos.vesting.v1beta1.PeriodicVestingAccount` | Periodic vesting | + +Any unrecognized type URL causes `accountFromAny` to throw. Use a custom `AccountParser` to handle chain-specific account types. + +## Using the Auth Extension Directly + +```typescript +import { QueryClient, setupAuthExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupAuthExtension); + +const anyAccount = await queryClient.auth.account("cosmos1..."); +``` + +The auth extension returns the raw protobuf `Any` type. `StargateClient` parses this with `accountFromAny`, which handles `BaseAccount`, `ModuleAccount`, and all vesting account types. + +## Custom Account Parser + +Chains with non-standard account types require a custom `AccountParser`: + +```typescript +import { StargateClient, Account, accountFromAny } from "@cosmjs/stargate"; +import { Any } from "cosmjs-types/google/protobuf/any"; + +function myAccountParser(any: Any): Account { + if (any.typeUrl === "/my.chain.CustomAccount") { + const decoded = MyCustomAccount.decode(any.value); + return { + address: decoded.address, + pubkey: null, + accountNumber: decoded.accountNumber, + sequence: decoded.sequence, + }; + } + return accountFromAny(any); +} + +const client = await StargateClient.connect("https://rpc.my-chain.network", { + accountParser: myAccountParser, +}); +``` + + +Fall back to `accountFromAny` for standard types so your parser stays forward-compatible with Cosmos SDK updates. + + +## Next Steps + + + + Token balances and supply. + + + Handle missing accounts and other query errors. + + diff --git a/cosmjs/v0.38.x/guides/query/bank.mdx b/cosmjs/v0.38.x/guides/query/bank.mdx new file mode 100644 index 000000000..48cb8e140 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/bank.mdx @@ -0,0 +1,58 @@ +--- +title: "Bank Queries" +description: "Query token balances, total supply, and denomination metadata using the bank extension" +--- + +The bank extension queries token balances, supply, and denomination metadata. + +```typescript +import { QueryClient, setupBankExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupBankExtension); + +const balance = await queryClient.bank.balance("cosmos1...", "uatom"); +console.info(balance); // { denom: "uatom", amount: "1000000" } + +const allBalances = await queryClient.bank.allBalances("cosmos1..."); +console.info(allBalances); // [{ denom: "uatom", amount: "1000000" }, ...] +``` + +## Available Methods + +| Method | Parameters | Returns | +|--------|-----------|---------| +| `balance` | `address, denom` | `Coin` | +| `allBalances` | `address` | `Coin[]` | +| `totalSupply` | `paginationKey?` | `QueryTotalSupplyResponse` | +| `supplyOf` | `denom` | `Coin` | +| `denomMetadata` | `denom` | `Metadata` | +| `denomsMetadata` | — | `Metadata[]` | + +## Total Supply with Pagination + +```typescript +const firstPage = await queryClient.bank.totalSupply(); +console.info(firstPage.supply); + +if (firstPage.pagination?.nextKey?.length) { + const secondPage = await queryClient.bank.totalSupply(firstPage.pagination.nextKey); + console.info(secondPage.supply); +} +``` + + +`totalSupply` is the only paginated method in the bank module. See [Pagination](/cosmjs/v0.38.x/guides/query/pagination) for the general pattern. + + +## Next Steps + + + + Validators, delegations, and staking pool. + + + Navigate paginated result sets. + + diff --git a/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx b/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx new file mode 100644 index 000000000..9e3e29135 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/blocks-and-chain-info.mdx @@ -0,0 +1,98 @@ +--- +title: "Blocks & Chain Info" +description: "Query block data, chain status, validator sets, and historical state" +--- + +Beyond module-specific queries, the CometBFT RPC layer provides block-level and chain-level information. You can access basic block data through `StargateClient` or use the CometBFT client directly for advanced queries. + +## Chain Status + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const chainId = await client.getChainId(); +const height = await client.getHeight(); +``` + +## Block Data + +```typescript +const latestBlock = await client.getBlock(); +console.info(latestBlock.header.height); +console.info(latestBlock.header.time); +console.info(latestBlock.header.chainId); +console.info(latestBlock.txs.length); + +const block100 = await client.getBlock(100); +``` + +## Using the CometBFT Client Directly + +For advanced block queries (block results, validator sets, block search), use the CometBFT client directly: + +```typescript +import { Comet38Client } from "@cosmjs/tendermint-rpc"; + +const cometClient = await Comet38Client.connect("https://rpc.my-chain.network"); + +const status = await cometClient.status(); +console.info(status.nodeInfo.network); +console.info(status.syncInfo.latestBlockHeight); +console.info(status.syncInfo.catchingUp); + +const validators = await cometClient.validatorsAll(100); +console.info(validators.validators); + +const blockResults = await cometClient.blockResults(100); +console.info(blockResults.results); + +const genesis = await cometClient.genesis(); +console.info(genesis.chainId); +``` + +### Available CometBFT Methods + +| Method | Description | +|--------|-------------| +| `status()` | Node info, sync status, latest block | +| `block(height?)` | Full block at height | +| `blockResults(height?)` | Tx results and events at height | +| `blockSearch(params)` | Search blocks by event query | +| `blockchain(min?, max?)` | Block headers in a height range | +| `validators(params)` | Validator set (paginated) | +| `validatorsAll(height?)` | Full validator set at height | +| `genesis()` | Genesis document | +| `health()` | Node health check | +| `numUnconfirmedTxs()` | Mempool summary | +| `tx(params)` | Single transaction by hash | +| `txSearch(params)` | Search transactions | +| `commit(height?)` | Signed block header | +| `abciInfo()` | ABCI application info | +| `abciQuery(params)` | Raw ABCI query | + +## Historical Queries + +`QueryClient.queryAbci` accepts an optional `desiredHeight` parameter, allowing you to query chain state as it existed at a specific block height: + +```typescript +import { QueryClient, setupBankExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupBankExtension); +``` + +The built-in extensions do not expose height parameters directly. For historical queries, use the lower-level `queryAbci` method or construct an RPC client that targets a specific height. This is primarily useful for building block explorers or auditing state changes. + +## Next Steps + + + + Search and decode transactions. + + + All available query methods. + + diff --git a/cosmjs/v0.38.x/guides/query/cosmwasm.mdx b/cosmjs/v0.38.x/guides/query/cosmwasm.mdx new file mode 100644 index 000000000..bb5ad8200 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/cosmwasm.mdx @@ -0,0 +1,57 @@ +--- +title: "CosmWasm Queries" +description: "Query smart contract state, metadata, and code info on CosmWasm-enabled chains" +--- + +For chains running CosmWasm, `CosmWasmClient` supports JSON smart queries and raw state lookups against contract storage. The wasm extension on `QueryClient` provides additional methods for code and contract metadata. + +## Smart Queries + +```typescript +import { CosmWasmClient } from "@cosmjs/cosmwasm"; + +const client = await CosmWasmClient.connect("https://rpc.my-chain.network"); + +const result = await client.queryContractSmart("osmo1contractaddr...", { + get_count: {}, +}); +console.info(result); // { count: 42 } +``` + +## Raw State Access + +```typescript +import { toAscii } from "@cosmjs/encoding"; + +const raw = await client.queryContractRaw("osmo1contractaddr...", toAscii("config")); +``` + +## Using the Wasm Extension + +The wasm extension on `QueryClient` provides additional methods for listing codes, contracts, and reading full contract state: + +```typescript +import { QueryClient } from "@cosmjs/stargate"; +import { setupWasmExtension } from "@cosmjs/cosmwasm"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupWasmExtension); + +const codes = await queryClient.wasm.listCodeInfo(); +const contracts = await queryClient.wasm.listContractsByCodeId(1); +const contractInfo = await queryClient.wasm.getContractInfo("osmo1contractaddr..."); +const history = await queryClient.wasm.getContractCodeHistory("osmo1contractaddr..."); +const allState = await queryClient.wasm.getAllContractState("osmo1contractaddr..."); +``` + +## Next Steps + + + + All available query methods and extensions. + + + Write query extensions for custom modules. + + diff --git a/cosmjs/v0.38.x/guides/query/custom-extensions.mdx b/cosmjs/v0.38.x/guides/query/custom-extensions.mdx new file mode 100644 index 000000000..74f88b394 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/custom-extensions.mdx @@ -0,0 +1,80 @@ +--- +title: "Custom Query Extensions" +description: "Write your own query extensions for custom chain modules and integrate them with QueryClient" +--- + +If your chain has custom modules, you can write your own query extensions that integrate seamlessly with `QueryClient`. This works with or without protobuf definitions. + +## From Protobuf Definitions + +If you have generated TypeScript types from your `.proto` files (using `ts-proto` or similar), wire them up with `createProtobufRpcClient`: + +```typescript +import { createProtobufRpcClient, QueryClient } from "@cosmjs/stargate"; +import { QueryClientImpl } from "./generated/mymodule/query"; + +export interface MyModuleExtension { + readonly mymodule: { + readonly myQuery: (param: string) => Promise; + }; +} + +export function setupMyModuleExtension(base: QueryClient): MyModuleExtension { + const rpc = createProtobufRpcClient(base); + const queryService = new QueryClientImpl(rpc); + + return { + mymodule: { + myQuery: async (param: string) => { + return queryService.MyQuery({ param }); + }, + }, + }; +} +``` + +## Using the Extension + +Compose your custom extension alongside built-in ones: + +```typescript +import { QueryClient, setupBankExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupMyModuleExtension, +); + +const result = await queryClient.mymodule.myQuery("cosmos1senderaddress..."); +``` + +## Without Protobuf Definitions + +You can also query any ABCI path directly using the raw query interface: + +```typescript +import { connectComet } from "@cosmjs/tendermint-rpc"; +import { QueryClient } from "@cosmjs/stargate"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = new QueryClient(cometClient); + +const response = await queryClient.queryAbci( + "/my.custom.module.Query/MyMethod", + encodedRequest, +); +``` + +## Next Steps + + + + All built-in query extensions. + + + Smart contract queries using the wasm extension. + + diff --git a/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx b/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx new file mode 100644 index 000000000..00ae9fb91 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/distribution-and-mint.mdx @@ -0,0 +1,80 @@ +--- +title: "Distribution & Mint Queries" +description: "Query staking rewards, validator commission, community pool, inflation, and minting parameters" +--- + +The distribution and mint extensions cover staking rewards, validator commission, community pool, and inflation parameters. + +## Distribution Queries + +```typescript +import { QueryClient, setupDistributionExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupDistributionExtension); + +const rewards = await queryClient.distribution.delegationRewards( + "cosmos1...", + "cosmosvaloper1...", +); +console.info(rewards.rewards); + +const totalRewards = await queryClient.distribution.delegationTotalRewards("cosmos1..."); +console.info(totalRewards.total); + +const commission = await queryClient.distribution.validatorCommission("cosmosvaloper1..."); +console.info(commission.commission); + +const pool = await queryClient.distribution.communityPool(); +console.info(pool.pool); + +const withdrawAddr = await queryClient.distribution.delegatorWithdrawAddress("cosmos1..."); +console.info(withdrawAddr.withdrawAddress); +``` + +### Available Methods + +| Method | Parameters | Paginated | +|--------|-----------|-----------| +| `delegationRewards` | `delegatorAddress, validatorAddress` | No | +| `delegationTotalRewards` | `delegatorAddress` | No | +| `delegatorValidators` | `delegatorAddress` | No | +| `delegatorWithdrawAddress` | `delegatorAddress` | No | +| `validatorCommission` | `validatorAddress` | No | +| `validatorOutstandingRewards` | `validatorAddress` | No | +| `validatorSlashes` | `validatorAddress, startHeight, endHeight, paginationKey?` | Yes | +| `communityPool` | — | No | +| `params` | — | No | + +## Mint Queries + +The mint extension queries inflation rate and minting parameters. + +```typescript +import { QueryClient, setupMintExtension } from "@cosmjs/stargate"; + +const queryClient = QueryClient.withExtensions(cometClient, setupMintExtension); + +const inflation = await queryClient.mint.inflation(); +console.info(inflation.toString()); + +const annualProvisions = await queryClient.mint.annualProvisions(); +console.info(annualProvisions.toString()); + +const params = await queryClient.mint.params(); +console.info(params.mintDenom); +console.info(params.inflationMin.toString()); +console.info(params.inflationMax.toString()); +``` + +## Next Steps + + + + Validators and delegations tied to these rewards. + + + Proposals that can modify distribution and mint parameters. + + diff --git a/cosmjs/v0.38.x/guides/query/error-handling.mdx b/cosmjs/v0.38.x/guides/query/error-handling.mdx new file mode 100644 index 000000000..3065fdb81 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/error-handling.mdx @@ -0,0 +1,81 @@ +--- +title: "Query Error Handling" +description: "Handle missing accounts, NotFound errors, broadcast failures, and timeouts" +--- + +CosmJS queries can throw errors for various reasons. The high-level clients handle common cases gracefully, but you should be aware of the patterns for each type of failure. + +## Missing Accounts + +`getAccount` returns `null` when the address has never received tokens. It catches `rpc error: code = NotFound` from the chain and converts it to `null`: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const account = await client.getAccount("cosmos1unknown..."); +if (account === null) { + console.info("Account does not exist on chain"); +} +``` + + +`getSequence` throws if the account does not exist — call `getAccount` first if the address might not be funded. + + +## Missing Delegations + +`getDelegation` returns `null` when there is no delegation between the given delegator and validator. It catches `"key not found"` errors: + +```typescript +const delegation = await client.getDelegation("cosmos1...", "cosmosvaloper1..."); +if (delegation === null) { + console.info("No delegation to this validator"); +} +``` + +## NotFound Errors on Extensions + +Extension methods do not catch errors automatically. A query for a non-existent resource (e.g., a denom that doesn't exist) throws with a message matching `rpc error: code = NotFound`: + +```typescript +try { + const metadata = await queryClient.bank.denomMetadata("nonexistent"); +} catch (error) { + if (error instanceof Error && /code = NotFound/i.test(error.message)) { + console.info("Denomination not found"); + } else { + throw error; + } +} +``` + +## Broadcast Errors + +When broadcasting fails at the CheckTx stage, a `BroadcastTxError` is thrown with `code`, `codespace`, and `log` fields. If the transaction is accepted but not included in a block within the timeout, a `TimeoutError` is thrown with the `txId` so you can check later: + +```typescript +import { TimeoutError, BroadcastTxError } from "@cosmjs/stargate"; + +try { + const result = await client.broadcastTx(signedTx); +} catch (error) { + if (error instanceof BroadcastTxError) { + console.info("Rejected:", error.code, error.codespace, error.log); + } else if (error instanceof TimeoutError) { + console.info("Timed out, check later with txId:", error.txId); + } +} +``` + +## Next Steps + + + + Search and decode transactions. + + + All available query methods and extensions. + + diff --git a/cosmjs/v0.38.x/guides/query/governance.mdx b/cosmjs/v0.38.x/guides/query/governance.mdx new file mode 100644 index 000000000..c5045bcba --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/governance.mdx @@ -0,0 +1,85 @@ +--- +title: "Governance Queries" +description: "Query proposals, votes, deposits, tallies, and governance parameters" +--- + +The governance extension queries proposals, votes, deposits, and tallies. + +```typescript +import { QueryClient, setupGovExtension } from "@cosmjs/stargate"; +import { ProposalStatus } from "cosmjs-types/cosmos/gov/v1beta1/gov"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupGovExtension); +``` + +## Proposals + +```typescript +const allProposals = await queryClient.gov.proposals( + ProposalStatus.PROPOSAL_STATUS_UNSPECIFIED, + "", + "", +); +console.info(allProposals.proposals); + +const votingProposals = await queryClient.gov.proposals( + ProposalStatus.PROPOSAL_STATUS_VOTING_PERIOD, + "", + "", +); + +const proposal = await queryClient.gov.proposal(1); +console.info(proposal.proposal); +``` + +## Votes and Deposits + +```typescript +const votes = await queryClient.gov.votes(1); +console.info(votes.votes); + +const vote = await queryClient.gov.vote(1, "cosmos1..."); +console.info(vote.vote); + +const deposits = await queryClient.gov.deposits(1); +console.info(deposits.deposits); + +const deposit = await queryClient.gov.deposit(1, "cosmos1..."); +``` + +## Tally and Params + +```typescript +const tally = await queryClient.gov.tally(1); +console.info(tally.tally); + +const votingParams = await queryClient.gov.params("voting"); +const depositParams = await queryClient.gov.params("deposit"); +const tallyParams = await queryClient.gov.params("tallying"); +``` + +## Available Methods + +| Method | Parameters | Paginated | +|--------|-----------|-----------| +| `proposals` | `proposalStatus, depositor, voter, paginationKey?` | Yes | +| `proposal` | `proposalId` | No | +| `votes` | `proposalId, paginationKey?` | Yes | +| `vote` | `proposalId, voterAddress` | No | +| `deposits` | `proposalId, paginationKey?` | Yes | +| `deposit` | `proposalId, depositorAddress` | No | +| `tally` | `proposalId` | No | +| `params` | `parametersType` | No | + +## Next Steps + + + + Validators and delegations. + + + Navigate paginated result sets. + + diff --git a/cosmjs/v0.38.x/guides/query/ibc.mdx b/cosmjs/v0.38.x/guides/query/ibc.mdx new file mode 100644 index 000000000..65090af48 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/ibc.mdx @@ -0,0 +1,60 @@ +--- +title: "IBC Queries" +description: "Query IBC channels, connections, clients, and transfer denomination traces" +--- + +The IBC extension provides queries for channels, connections, clients, and transfer denominations. It is the largest extension, organized into four namespaces: `channel`, `client`, `connection`, and `transfer`. + +```typescript +import { QueryClient, setupIbcExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupIbcExtension); +``` + +## Channels + +```typescript +const channel = await queryClient.ibc.channel.channel("transfer", "channel-0"); +const allChannels = await queryClient.ibc.channel.allChannels(); +const connChannels = await queryClient.ibc.channel.allConnectionChannels("connection-0"); +``` + +## Connections + +```typescript +const connection = await queryClient.ibc.connection.connection("connection-0"); +const allConnections = await queryClient.ibc.connection.allConnections(); +``` + +## Clients + +```typescript +const clientState = await queryClient.ibc.client.state("07-tendermint-0"); +const allStates = await queryClient.ibc.client.allStates(); +const allStatesTm = await queryClient.ibc.client.allStatesTm(); +``` + +## Transfer + +```typescript +const denomTrace = await queryClient.ibc.transfer.denomTrace("hash..."); +const allDenomTraces = await queryClient.ibc.transfer.allDenomTraces(); +const transferParams = await queryClient.ibc.transfer.params(); +``` + + +The IBC extension provides `all*` helper methods that automatically paginate through all results internally, so you don't need to handle pagination yourself. + + +## Next Steps + + + + Manual pagination for IBC queries that don't have `all*` helpers. + + + All available query extensions. + + diff --git a/cosmjs/v0.38.x/guides/query/pagination.mdx b/cosmjs/v0.38.x/guides/query/pagination.mdx new file mode 100644 index 000000000..3b04d77b1 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/pagination.mdx @@ -0,0 +1,107 @@ +--- +title: "Pagination" +description: "Navigate large result sets page by page using CosmJS pagination keys" +--- + +Many Cosmos SDK queries return paginated results. CosmJS query extensions accept an optional `paginationKey` parameter on paginated methods. Responses include a `pagination` field with a `nextKey` for fetching subsequent pages. + +## Manual Page-by-Page + +```typescript +import { QueryClient, setupStakingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupStakingExtension); + +let paginationKey: Uint8Array | undefined = undefined; + +do { + const response = await queryClient.staking.validators( + "BOND_STATUS_BONDED", + paginationKey, + ); + + for (const validator of response.validators) { + console.info(validator.description?.moniker); + } + + paginationKey = response.pagination?.nextKey; +} while (paginationKey !== undefined && paginationKey.length !== 0); +``` + +## How It Works + + + +Omit `paginationKey` (or pass `undefined`). CosmJS sends an empty `PageRequest` to the chain. + + +The response includes `pagination.nextKey` — a `Uint8Array` cursor pointing to the next page. + + +Pass the `nextKey` into the next call to fetch the following page. + + +When `nextKey` is `undefined` or empty, you've reached the last page. + + + +## Collecting All Results + +A common pattern is to accumulate all pages into a single array: + +```typescript +import { QueryClient, StakingExtension } from "@cosmjs/stargate"; +import { Validator } from "cosmjs-types/cosmos/staking/v1beta1/staking"; + +async function getAllValidators( + queryClient: QueryClient & StakingExtension, +): Promise { + const allValidators: Validator[] = []; + let paginationKey: Uint8Array | undefined = undefined; + + do { + const { validators, pagination } = await queryClient.staking.validators( + "BOND_STATUS_BONDED", + paginationKey, + ); + allValidators.push(...validators); + paginationKey = pagination?.nextKey; + } while (paginationKey !== undefined && paginationKey.length !== 0); + + return allValidators; +} +``` + + +`StargateClient.getBalanceStaked` uses this exact pattern internally to sum all delegations across pages. + + +## Paginated Methods by Module + +| Module | Paginated Methods | +|--------|------------------| +| **Bank** | `totalSupply` | +| **Staking** | `validators`, `delegatorDelegations`, `delegatorUnbondingDelegations`, `delegatorValidators`, `validatorDelegations`, `validatorUnbondingDelegations`, `redelegations` | +| **Gov** | `proposals`, `votes`, `deposits` | +| **Distribution** | `validatorSlashes` | +| **Authz** | `grants`, `granteeGrants`, `granterGrants` | +| **Feegrant** | `allowances` | +| **Slashing** | `signingInfos` | +| **IBC** | `channels`, `connectionChannels`, `packetCommitments`, `packetAcknowledgements`, `states`, `consensusStates`, `connections`, `denomTraces` | + + +The IBC extension provides `all*` convenience methods (e.g., `allChannels()`, `allConnections()`, `allDenomTraces()`) that handle pagination internally and return all results in one call. + + +## Next Steps + + + + All available query extensions. + + + Example of paginated supply queries. + + diff --git a/cosmjs/v0.38.x/guides/query/querying.mdx b/cosmjs/v0.38.x/guides/query/querying.mdx new file mode 100644 index 000000000..f051264e1 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/querying.mdx @@ -0,0 +1,165 @@ +--- +title: "Querying On-Chain Data" +description: "Read blockchain state using high-level client methods and composable QueryClient extensions" +--- + +CosmJS provides two ways to query on-chain data: convenience methods on the high-level clients (`StargateClient`, `CosmWasmClient`) and a low-level `QueryClient` with composable module extensions. Choose the approach that fits your needs — high-level methods for common tasks, extensions for full module coverage. + +## Prerequisites + +- `@cosmjs/stargate` installed (`npm install @cosmjs/stargate`) +- A connected client (see [Connect to a Chain](/cosmjs/v0.38.x/guides/connect/connect)) + +## Quick Start + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const balance = await client.getBalance("cosmos1...", "uatom"); +console.info(balance); // { denom: "uatom", amount: "1000000" } + +const account = await client.getAccount("cosmos1..."); +console.info(account); // { address, pubkey, accountNumber, sequence } + +client.disconnect(); +``` + +## High-Level Client Methods + +`StargateClient` bundles the most common queries behind simple methods. These cover bank, staking, auth, and transaction queries out of the box. + +| Method | Returns | Description | +|--------|---------|-------------| +| `getChainId()` | `string` | Chain identifier | +| `getHeight()` | `number` | Latest block height | +| `getBlock(height?)` | `Block` | Block data at the given or latest height | +| `getAccount(address)` | `Account \| null` | Account info (address, pubkey, sequence) | +| `getSequence(address)` | `SequenceResponse` | Account number and sequence | +| `getBalance(address, denom)` | `Coin` | Single-denom balance | +| `getAllBalances(address)` | `Coin[]` | All balances for an address | +| `getBalanceStaked(address)` | `Coin \| null` | Total staked balance across all validators | +| `getDelegation(delegator, validator)` | `Coin \| null` | Delegation to a specific validator | +| `getTx(id)` | `IndexedTx \| null` | Transaction by hash | +| `searchTx(query)` | `IndexedTx[]` | Search transactions by events | + +`CosmWasmClient` extends these with contract-specific queries: + +| Method | Returns | Description | +|--------|---------|-------------| +| `getCodes()` | `Code[]` | All uploaded WASM codes | +| `getCodeDetails(codeId)` | `CodeDetails` | Code metadata and bytecode | +| `getContracts(codeId)` | `string[]` | Contract addresses for a code ID | +| `getContractsByCreator(creator)` | `string[]` | Contracts created by an address | +| `getContract(address)` | `Contract` | Contract metadata | +| `getContractCodeHistory(address)` | `ContractCodeHistoryEntry[]` | Migration history | +| `queryContractRaw(address, key)` | `Uint8Array \| null` | Raw contract state by key | +| `queryContractSmart(address, query)` | `JsonObject` | JSON smart query | + +## Using QueryClient with Extensions + +For queries beyond what the high-level clients expose, build a `QueryClient` with the exact extensions you need. This gives you typed access to every query endpoint in each Cosmos SDK module. + +```typescript +import { + QueryClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, + setupMintExtension, +} from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, + setupMintExtension, +); +``` + +Extensions are merged into the `QueryClient` instance. Each one adds a namespace — `queryClient.bank`, `queryClient.staking`, `queryClient.gov`, etc. You can compose up to 18 extensions in a single call. + +## Combining Multiple Extensions + +You can compose any combination of extensions to build a query client tailored to your needs: + +```typescript +import { + QueryClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, + setupMintExtension, + setupSlashingExtension, + setupAuthzExtension, + setupFeegrantExtension, + setupIbcExtension, +} from "@cosmjs/stargate"; + +const queryClient = QueryClient.withExtensions( + cometClient, + setupBankExtension, + setupStakingExtension, + setupGovExtension, + setupDistributionExtension, + setupMintExtension, + setupSlashingExtension, + setupAuthzExtension, + setupFeegrantExtension, + setupIbcExtension, +); + +const balance = await queryClient.bank.balance("cosmos1...", "uatom"); +const validators = await queryClient.staking.validators("BOND_STATUS_BONDED"); +const inflation = await queryClient.mint.inflation(); +``` + +Each extension is independently typed — TypeScript knows exactly which namespaces and methods are available based on the setup functions you pass. + +## Next Steps + + + + Token balances, supply, and denomination metadata. + + + Validators, delegations, unbonding, and staking pool. + + + Proposals, votes, deposits, and tallies. + + + Account info, auth extension, and custom parsers. + + + Staking rewards, commission, inflation, and community pool. + + + Channels, connections, clients, and transfer denominations. + + + Search, decode, and inspect transactions and events. + + + Smart contract state and metadata queries. + + + Navigate large result sets page by page. + + + Block data, chain status, and CometBFT RPC. + + + Write query extensions for custom chain modules. + + + Handle missing data, NotFound errors, and broadcast failures. + + diff --git a/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx b/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx new file mode 100644 index 000000000..2de3dfd7d --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/slashing-authz-feegrant.mdx @@ -0,0 +1,80 @@ +--- +title: "Slashing, Authz & Fee Grant Queries" +description: "Query validator signing info, authorization grants, and fee allowances" +--- + +These extensions cover validator slashing info, account-to-account authorization grants, and fee allowances. + +## Slashing Queries + +The slashing extension queries validator signing info and slashing parameters. + +```typescript +import { QueryClient, setupSlashingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupSlashingExtension); + +const signingInfo = await queryClient.slashing.signingInfo("cosmosvalcons1..."); +console.info(signingInfo.valSigningInfo); + +const allSigningInfos = await queryClient.slashing.signingInfos(); +console.info(allSigningInfos.info); + +const params = await queryClient.slashing.params(); +console.info(params.params); +``` + +## Authz Queries + +The authz extension queries authorization grants between accounts. + +```typescript +import { QueryClient, setupAuthzExtension } from "@cosmjs/stargate"; + +const queryClient = QueryClient.withExtensions(cometClient, setupAuthzExtension); + +const grants = await queryClient.authz.grants( + "cosmos1granter...", + "cosmos1grantee...", + "/cosmos.bank.v1beta1.MsgSend", +); +console.info(grants.grants); + +const granteeGrants = await queryClient.authz.granteeGrants("cosmos1grantee..."); +console.info(granteeGrants.grants); + +const granterGrants = await queryClient.authz.granterGrants("cosmos1granter..."); +console.info(granterGrants.grants); +``` + +## Fee Grant Queries + +The feegrant extension queries fee allowances between accounts. + +```typescript +import { QueryClient, setupFeegrantExtension } from "@cosmjs/stargate"; + +const queryClient = QueryClient.withExtensions(cometClient, setupFeegrantExtension); + +const allowance = await queryClient.feegrant.allowance( + "cosmos1granter...", + "cosmos1grantee...", +); +console.info(allowance.allowance); + +const allAllowances = await queryClient.feegrant.allowances("cosmos1grantee..."); +console.info(allAllowances.allowances); +``` + +## Next Steps + + + + Validators and delegations. + + + All available query extensions. + + diff --git a/cosmjs/v0.38.x/guides/query/staking.mdx b/cosmjs/v0.38.x/guides/query/staking.mdx new file mode 100644 index 000000000..110fc3ddc --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/staking.mdx @@ -0,0 +1,98 @@ +--- +title: "Staking Queries" +description: "Query validators, delegations, unbonding, redelegations, and staking pool parameters" +--- + +The staking extension queries validators, delegations, unbonding, and redelegations. + +```typescript +import { QueryClient, setupStakingExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupStakingExtension); +``` + +## Validators + +```typescript +const bonded = await queryClient.staking.validators("BOND_STATUS_BONDED"); +console.info(bonded.validators); + +const unbonding = await queryClient.staking.validators("BOND_STATUS_UNBONDING"); +const unbonded = await queryClient.staking.validators("BOND_STATUS_UNBONDED"); + +const singleValidator = await queryClient.staking.validator("cosmosvaloper1..."); +console.info(singleValidator.validator); +``` + +## Delegations + +```typescript +const delegation = await queryClient.staking.delegation( + "cosmos1...", + "cosmosvaloper1...", +); +console.info(delegation.delegationResponse?.balance); + +const allDelegations = await queryClient.staking.delegatorDelegations("cosmos1..."); +console.info(allDelegations.delegationResponses); +``` + +## Unbonding and Redelegations + +```typescript +const unbonding = await queryClient.staking.unbondingDelegation( + "cosmos1...", + "cosmosvaloper1...", +); + +const allUnbonding = await queryClient.staking.delegatorUnbondingDelegations("cosmos1..."); + +const redelegations = await queryClient.staking.redelegations( + "cosmos1...", + "cosmosvaloper1source...", + "cosmosvaloper1dest...", +); +``` + +## Staking Pool and Params + +```typescript +const pool = await queryClient.staking.pool(); +console.info(pool.pool?.bondedTokens); +console.info(pool.pool?.notBondedTokens); + +const params = await queryClient.staking.params(); +console.info(params.params?.unbondingTime); +``` + +## Available Methods + +| Method | Parameters | Paginated | +|--------|-----------|-----------| +| `validators` | `status, paginationKey?` | Yes | +| `validator` | `validatorAddress` | No | +| `delegation` | `delegatorAddress, validatorAddress` | No | +| `delegatorDelegations` | `delegatorAddress, paginationKey?` | Yes | +| `delegatorUnbondingDelegations` | `delegatorAddress, paginationKey?` | Yes | +| `delegatorValidator` | `delegatorAddress, validatorAddress` | No | +| `delegatorValidators` | `delegatorAddress, paginationKey?` | Yes | +| `unbondingDelegation` | `delegatorAddress, validatorAddress` | No | +| `redelegations` | `delegatorAddress, srcValidator, dstValidator, paginationKey?` | Yes | +| `validatorDelegations` | `validatorAddress, paginationKey?` | Yes | +| `validatorUnbondingDelegations` | `validatorAddress, paginationKey?` | Yes | +| `historicalInfo` | `height` | No | +| `pool` | — | No | +| `params` | — | No | + +## Next Steps + + + + Staking rewards, commission, and inflation. + + + Navigate large result sets page by page. + + diff --git a/cosmjs/v0.38.x/guides/query/transactions.mdx b/cosmjs/v0.38.x/guides/query/transactions.mdx new file mode 100644 index 000000000..1bc378bb6 --- /dev/null +++ b/cosmjs/v0.38.x/guides/query/transactions.mdx @@ -0,0 +1,240 @@ +--- +title: "Transaction Queries" +description: "Search transactions by hash or events, decode raw bytes, parse events, and simulate gas" +--- + +You can look up transactions by hash, search by events, decode raw transaction bytes, and simulate gas usage — all without broadcasting anything on-chain. + +## Lookup by Hash + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const client = await StargateClient.connect("https://rpc.my-chain.network"); + +const tx = await client.getTx("A1B2C3D4..."); +if (tx) { + console.info(tx.height); + console.info(tx.code); // 0 = success + console.info(tx.events); + console.info(tx.gasUsed); +} +``` + +## Search by Events + +```typescript +// Raw Tendermint query string +const stringResults = await client.searchTx("message.sender='cosmos1...'"); + +// Or use the structured SearchPair[] form (see below) +const structuredResults = await client.searchTx([ + { key: "message.sender", value: "cosmos1..." }, + { key: "message.action", value: "/cosmos.bank.v1beta1.MsgSend" }, +]); +``` + +Event queries use Tendermint's query syntax. Multiple conditions are combined with `AND`. + +### Structured Query Syntax + +`searchTx` accepts either a raw query string or a structured `SearchPair[]`. Structured queries are safer — string values are automatically quoted and numeric values are left unquoted (required by Tendermint): + +```typescript +import { SearchPair } from "@cosmjs/stargate"; + +const query: SearchPair[] = [ + { key: "transfer.sender", value: "cosmos1..." }, + { key: "tx.height", value: 12345 }, +]; + +const txs = await client.searchTx(query); +``` + +## Decoding Raw Transaction Bytes + +`IndexedTx.tx` contains the raw transaction bytes. Use `decodeTxRaw` to inspect the messages, memo, fee, and signer info: + +```typescript +import { decodeTxRaw } from "@cosmjs/proto-signing"; + +const result = await client.getTx("A1B2C3D4..."); +if (result) { + const decoded = decodeTxRaw(result.tx); + + console.info(decoded.body.messages); + console.info(decoded.body.memo); + console.info(decoded.authInfo.fee); + console.info(decoded.signatures); +} +``` + +## Working with IndexedTx Fields + +The `IndexedTx` response provides several useful fields beyond the raw bytes: + +```typescript +const result = await client.getTx("A1B2C3D4..."); +if (result) { + console.info(result.height); + console.info(result.txIndex); + console.info(result.code); // 0 = success + console.info(result.gasUsed); // bigint + console.info(result.gasWanted); // bigint + console.info(result.events); // Event[] + console.info(result.msgResponses); // { typeUrl, value }[] (Cosmos SDK 0.46+) +} +``` + + +`rawLog` is deprecated and empty on Cosmos SDK 0.50+. Use `events` instead. + + +## Parsing Transaction Events + +Transaction results include events emitted by Cosmos SDK modules. You can extract specific attributes from these events. + +### From DeliverTxResponse + +After broadcasting with a `SigningStargateClient`, use events directly from the response: + +```typescript +import { SigningStargateClient, GasPrice, assertIsDeliverTxSuccess } from "@cosmjs/stargate"; + +const signingClient = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await signingClient.signAndBroadcast(sender, messages, "auto"); +assertIsDeliverTxSuccess(result); + +for (const event of result.events) { + if (event.type === "transfer") { + for (const attr of event.attributes) { + console.info(`${attr.key} = ${attr.value}`); + } + } +} +``` + +### From IndexedTx + +Events from searched transactions follow the same structure: + +```typescript +const tx = await client.getTx("A1B2C3D4..."); +if (tx) { + const transferEvents = tx.events.filter((e) => e.type === "transfer"); + for (const event of transferEvents) { + const recipient = event.attributes.find((a) => a.key === "recipient"); + const amount = event.attributes.find((a) => a.key === "amount"); + console.info(`${recipient?.value} received ${amount?.value}`); + } +} +``` + +### Extracting Contract Addresses (CosmWasm) + +After uploading or instantiating a CosmWasm contract, the contract address is in the events. Use the same filtering pattern to extract it (broadcast through `SigningCosmWasmClient`): + +```typescript +import { SigningCosmWasmClient } from "@cosmjs/cosmwasm"; +import { GasPrice } from "@cosmjs/stargate"; + +const wasmClient = await SigningCosmWasmClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uosmo") }, +); + +const result = await wasmClient.signAndBroadcast(sender, [instantiateMsg], "auto"); + +const instantiateEvent = result.events.find((e) => e.type === "instantiate"); +const contractAddress = instantiateEvent?.attributes.find( + (a) => a.key === "_contract_address", +); +console.info(contractAddress?.value); +``` + + +`SigningCosmWasmClient.instantiate` returns the contract address directly in its result, so you typically don't need to parse events manually for instantiation. + + +### Using parseRawLog (Legacy) + +For chains running Cosmos SDK < 0.50, you can parse the `rawLog` field through the `logs` namespace: + +```typescript +import { logs } from "@cosmjs/stargate"; + +const parsed = logs.parseRawLog(result.rawLog); +const attr = logs.findAttribute(parsed, "transfer", "amount"); +``` + + +`rawLog` is empty on Cosmos SDK 0.50+. Prefer working with `events` directly. + + +## Using the Tx Extension + +The tx extension provides a lower-level `getTx` and a `simulate` method for gas estimation: + +```typescript +import { QueryClient, setupTxExtension } from "@cosmjs/stargate"; +import { connectComet } from "@cosmjs/tendermint-rpc"; + +const cometClient = await connectComet("https://rpc.my-chain.network"); +const queryClient = QueryClient.withExtensions(cometClient, setupTxExtension); + +const txResponse = await queryClient.tx.getTx("A1B2C3D4..."); +console.info(txResponse.tx); +console.info(txResponse.txResponse); +``` + +## Gas Simulation + +Signing clients can simulate a transaction against the chain to estimate gas usage before broadcasting. Nothing is committed on-chain. + +```typescript +import { SigningStargateClient, GasPrice, calculateFee } from "@cosmjs/stargate"; + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const messages = [ + { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: { + fromAddress: "cosmos1sender...", + toAddress: "cosmos1recipient...", + amount: [{ denom: "uatom", amount: "1000000" }], + }, + }, +]; + +const gasEstimate = await client.simulate("cosmos1sender...", messages, "memo"); +console.info(gasEstimate); // e.g. 85432 + +const fee = calculateFee(Math.round(gasEstimate * 1.3), GasPrice.fromString("0.025uatom")); +console.info(fee); // { amount: [...], gas: "111062" } +``` + + +When you use `"auto"` as the fee in `signAndBroadcast`, the client calls `simulate` internally and applies a 1.4x multiplier to the result. + + +## Next Steps + + + + Handle broadcast errors and timeouts. + + + Block data and chain status. + + diff --git a/cosmjs/v0.38.x/guides/transactions/building-messages.mdx b/cosmjs/v0.38.x/guides/transactions/building-messages.mdx new file mode 100644 index 000000000..7b7fbb5ca --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/building-messages.mdx @@ -0,0 +1,63 @@ +--- +title: "Building Messages" +description: "Construct message objects for token transfers, staking, and multi-message transactions" +--- + +Every Cosmos SDK transaction contains one or more **messages** — typed instructions that tell the chain what to do. In CosmJS, messages are represented as `EncodeObject` values: a `typeUrl` string paired with a Protobuf message value. + +## Token Transfer (MsgSend) + +```typescript +import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; +import { coins } from "@cosmjs/proto-signing"; + +const sendMsg = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: MsgSend.fromPartial({ + fromAddress: senderAddress, + toAddress: "cosmos1recipientaddress...", + amount: coins(1_000_000, "uatom"), + }), +}; +``` + +`MsgSend.fromPartial()` creates a message from a partial object, filling in defaults for missing fields. The `coins` helper builds the `[{ denom, amount }]` array. + +## Staking Delegation + +```typescript +import { MsgDelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; + +const delegateMsg = { + typeUrl: "/cosmos.staking.v1beta1.MsgDelegate", + value: MsgDelegate.fromPartial({ + delegatorAddress: senderAddress, + validatorAddress: "cosmosvaloper1...", + amount: { denom: "uatom", amount: "1000000" }, + }), +}; +``` + +## Multiple Messages in One Transaction + +A single transaction can carry multiple messages. They execute atomically — all succeed or all fail: + +```typescript +const messages = [sendMsg, delegateMsg]; +const result = await client.signAndBroadcast(senderAddress, messages, "auto"); +``` + + +For type-safe message construction, use typed encode objects like `MsgSendEncodeObject` from `@cosmjs/stargate`. See [EncodeObject](/cosmjs/v0.38.x/concepts/messages-encoding/encode-objects) for the full list. + + +## Next Steps + + + + Estimate how much gas your messages will consume before broadcasting. + + + Register your own Protobuf message types with the Registry. + + diff --git a/cosmjs/v0.38.x/guides/transactions/confirmation.mdx b/cosmjs/v0.38.x/guides/transactions/confirmation.mdx new file mode 100644 index 000000000..f16f9bbe1 --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/confirmation.mdx @@ -0,0 +1,64 @@ +--- +title: "Waiting for Confirmation" +description: "Configure polling timeouts and handle transactions that take too long to land in a block" +--- + +When you call `signAndBroadcast`, the client handles confirmation automatically: + +1. The signed transaction is submitted via `broadcastTxSync` (CheckTx) +2. The client polls `getTx(txHash)` every 3 seconds (configurable) +3. Once the transaction appears in a block, the `DeliverTxResponse` is returned + +## Configuring Timeouts + +Control how long the client waits and how often it polls: + +```typescript +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { + gasPrice: GasPrice.fromString("0.025uatom"), + broadcastTimeoutMs: 120_000, + broadcastPollIntervalMs: 5_000, + }, +); +``` + +| Option | Default | Description | +|--------|---------|-------------| +| `broadcastTimeoutMs` | `60_000` (60s) | Maximum time to wait for block inclusion | +| `broadcastPollIntervalMs` | `3_000` (3s) | Interval between `getTx` polls | + +## Handling Timeouts + +If the transaction is not included within the timeout, a `TimeoutError` is thrown. The transaction may still succeed — it could be sitting in the mempool: + +```typescript +import { TimeoutError } from "@cosmjs/stargate"; + +try { + const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); +} catch (error) { + if (error instanceof TimeoutError) { + const txHash = error.txId; + const laterResult = await client.getTx(txHash); + } + throw error; +} +``` + + +A `TimeoutError` does **not** mean the transaction failed. The signed bytes were already submitted to the mempool. Always check with `getTx` before resubmitting, or you risk sending the transaction twice. + + +## Next Steps + + + + Handle CheckTx rejections, execution failures, and timeouts. + + + Read transaction events and look up past transactions. + + diff --git a/cosmjs/v0.38.x/guides/transactions/error-handling.mdx b/cosmjs/v0.38.x/guides/transactions/error-handling.mdx new file mode 100644 index 000000000..1779fbcc9 --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/error-handling.mdx @@ -0,0 +1,119 @@ +--- +title: "Error Handling" +description: "Handle CheckTx rejections, execution failures, and broadcast timeouts" +--- + +Transactions can fail at different stages, each with a distinct error type. A robust flow handles all of them. + +## Stage 1: CheckTx Rejection (`BroadcastTxError`) + +The node validates the transaction before adding it to the mempool. Common failures include invalid signatures, insufficient funds for fees, or unregistered message types. These throw a `BroadcastTxError`: + +```typescript +import { BroadcastTxError } from "@cosmjs/stargate"; + +try { + const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); +} catch (error) { + if (error instanceof BroadcastTxError) { + console.error("Rejected at CheckTx:"); + console.error(" Code:", error.code); + console.error(" Codespace:", error.codespace); + console.error(" Log:", error.log); + } +} +``` + +CheckTx rejections mean the transaction never entered a block and no gas was consumed. + +## Stage 2: Execution Failure (non-zero `code`) + +If the transaction passes CheckTx but fails during execution (out of gas, business logic error, etc.), `signAndBroadcast` still returns a `DeliverTxResponse` — but with a non-zero `code`. Gas is consumed up to the point of failure. + +```typescript +import { isDeliverTxFailure, assertIsDeliverTxSuccess } from "@cosmjs/stargate"; + +const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); + +if (isDeliverTxFailure(result)) { + console.error(`Transaction ${result.transactionHash} failed`); + console.error(` Code: ${result.code}`); + console.error(` Raw log: ${result.rawLog}`); +} + +assertIsDeliverTxSuccess(result); +``` + +`assertIsDeliverTxSuccess` throws an error if the transaction failed, making it useful for fail-fast workflows. + +## Stage 3: Timeout (`TimeoutError`) + +If the transaction is not included in a block before the polling timeout expires, a `TimeoutError` is thrown. The transaction may still succeed later: + +```typescript +import { TimeoutError } from "@cosmjs/stargate"; + +try { + const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); +} catch (error) { + if (error instanceof TimeoutError) { + console.warn("Tx submitted but not confirmed yet:", error.txId); + const laterResult = await client.getTx(error.txId); + } + throw error; +} +``` + +## Full Error Handling Pattern + +A robust transaction flow handles all three failure modes: + +```typescript +import { + SigningStargateClient, + GasPrice, + TimeoutError, + BroadcastTxError, + isDeliverTxSuccess, +} from "@cosmjs/stargate"; + +try { + const result = await client.signAndBroadcast(senderAddress, messages, "auto"); + + if (isDeliverTxSuccess(result)) { + console.info("Success:", result.transactionHash); + console.info("Gas used:", result.gasUsed.toString()); + } else { + console.error( + `Execution failed (code ${result.code}): ${result.rawLog}`, + ); + } +} catch (error) { + if (error instanceof BroadcastTxError) { + console.error(`CheckTx rejected (code ${error.code}): ${error.log}`); + } else if (error instanceof TimeoutError) { + console.warn("Tx submitted but not confirmed yet:", error.txId); + } else { + throw error; + } +} +``` + +## Error Summary + +| Stage | Error Type | Gas Charged? | Retryable? | +|-------|-----------|-------------|------------| +| CheckTx | `BroadcastTxError` | No | Rarely — fix the issue first | +| Block inclusion | `TimeoutError` | Unknown | Query `getTx` later — it may still land | +| Execution (DeliverTx) | `DeliverTxResponse` with `code !== 0` | Yes (up to failure point) | Depends on the error | + +## Next Steps + + + + Detailed reference for all CosmJS error classes. + + + Read transaction events and look up past transactions. + + diff --git a/cosmjs/v0.38.x/guides/transactions/events-and-lookups.mdx b/cosmjs/v0.38.x/guides/transactions/events-and-lookups.mdx new file mode 100644 index 000000000..3c60b7b9c --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/events-and-lookups.mdx @@ -0,0 +1,77 @@ +--- +title: "Events & Lookups" +description: "Read transaction events and look up past transactions by hash or event query" +--- + +After a transaction lands in a block, you can inspect the events it emitted and retrieve it later by hash or search criteria. + +## Reading Transaction Events + +Successful transactions emit **events** that describe what happened on-chain. You can inspect these from the `DeliverTxResponse`: + +```typescript +import { coins } from "@cosmjs/proto-signing"; + +const result = await client.sendTokens( + senderAddress, + "cosmos1recipientaddress...", + coins(1_000_000, "uatom"), + "auto", +); + +for (const event of result.events) { + if (event.type === "transfer") { + for (const attr of event.attributes) { + console.info(`${attr.key}: ${attr.value}`); + } + } +} +``` + +A `MsgSend` transaction typically emits `transfer`, `coin_spent`, `coin_received`, and `message` events. + +## Looking Up by Hash + +After broadcasting, you can retrieve a transaction by its hash: + +```typescript +const tx = await client.getTx(result.transactionHash); +if (tx) { + console.info("Included in block:", tx.height); + console.info("Code:", tx.code); +} +``` + +This is especially useful after a `TimeoutError` or when using `signAndBroadcastSync`, where you need to check the outcome later. + +## Searching by Events + +Search for transactions matching specific event criteria: + +```typescript +const txs = await client.searchTx(`transfer.recipient='cosmos1recipientaddress...'`); +for (const tx of txs) { + console.info(tx.hash, "at height", tx.height); +} +``` + +The query string uses CometBFT's event query syntax. Common patterns: + +| Query | Description | +|-------|-------------| +| `tx.hash='ABC123...'` | Find a specific transaction | +| `transfer.recipient='cosmos1...'` | Transfers received by an address | +| `message.sender='cosmos1...'` | Transactions sent by an address | +| `message.action='/cosmos.bank.v1beta1.MsgSend'` | All MsgSend transactions | +| `tx.height=12345` | Transactions at a specific block height | + +## Next Steps + + + + Decode raw transaction bytes and search with advanced filters. + + + Upload, instantiate, and execute smart contracts. + + diff --git a/cosmjs/v0.38.x/guides/transactions/send-transactions.mdx b/cosmjs/v0.38.x/guides/transactions/send-transactions.mdx new file mode 100644 index 000000000..606351654 --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/send-transactions.mdx @@ -0,0 +1,122 @@ +--- +title: "Send Transactions" +description: "Build messages, estimate gas, sign, broadcast, and handle the full transaction lifecycle with CosmJS" +--- + +Sending a transaction on a Cosmos SDK chain is a multi-step process: you build one or more messages, estimate gas, sign the transaction, broadcast it to a node, and then wait for block inclusion. This guide walks through each step using `SigningStargateClient`. + +## Prerequisites + +- **Node.js** v22 or later +- `@cosmjs/stargate` and `@cosmjs/proto-signing` installed +- An RPC endpoint for the target chain + + +```bash npm +npm install @cosmjs/stargate @cosmjs/proto-signing cosmjs-types +``` +```bash yarn +yarn add @cosmjs/stargate @cosmjs/proto-signing cosmjs-types +``` +```bash pnpm +pnpm add @cosmjs/stargate @cosmjs/proto-signing cosmjs-types +``` + + +## Set Up a Signing Client + +Create a wallet and connect a signing client. This example uses a mnemonic-based wallet for simplicity — see [Local Wallets](/cosmjs/v0.38.x/concepts/account/local-wallets) and [Injected Wallets](/cosmjs/v0.38.x/concepts/account/injected-wallets) for production options. + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your mnemonic words here ...", + { prefix: "cosmos" }, +); +const [{ address: senderAddress }] = await wallet.getAccounts(); + +const client = await SigningStargateClient.connectWithSigner( + "https://rpc.my-chain.network", + wallet, + { gasPrice: GasPrice.fromString("0.025uatom") }, +); +``` + + +Never hard-code mnemonics in source files. Use environment variables or a secrets manager. + + +Setting `gasPrice` in the client options enables `"auto"` fee estimation for all transactions. Without it, you must pass an explicit `StdFee` to every transaction method. + +## Transaction Lifecycle + +Every transaction follows these steps: + +1. **Build messages** — describe what the transaction should do +2. **Estimate gas** — simulate execution to determine fees +3. **Sign** — produce a cryptographic signature over the transaction bytes +4. **Broadcast** — send the signed transaction to a node +5. **Confirm** — wait for the transaction to be included in a block + +The simplest path combines all steps in a single call: + +```typescript +const result = await client.sendTokens( + senderAddress, + "cosmos1recipientaddress...", + [{ denom: "uatom", amount: "1000000" }], + "auto", +); + +console.info("Tx hash:", result.transactionHash); +``` + +The following pages break down each step in detail. + +## Convenience Methods + +`SigningStargateClient` provides high-level methods for the most common transactions. They construct the message internally and call `signAndBroadcast`: + +```typescript +const result = await client.sendTokens( + senderAddress, + "cosmos1recipientaddress...", + [{ denom: "uatom", amount: "1000000" }], + "auto", + "thanks for lunch", +); +``` + +| Method | Description | +|--------|-------------| +| `sendTokens(sender, recipient, amount, fee, memo?)` | Transfer tokens (`MsgSend`) | +| `delegateTokens(delegator, validator, amount, fee, memo?)` | Delegate to a validator (`MsgDelegate`) | +| `undelegateTokens(delegator, validator, amount, fee, memo?)` | Undelegate from a validator (`MsgUndelegate`) | +| `withdrawRewards(delegator, validator, fee, memo?)` | Withdraw staking rewards (`MsgWithdrawDelegatorReward`) | + +These convenience methods accept the same three fee forms — `"auto"`, a number multiplier, or an explicit `StdFee`. + +## Next Steps + + + + Construct message objects for token transfers, staking, and multi-message transactions. + + + Estimate gas with auto fees, manual simulation, or explicit fee objects. + + + Sign and broadcast transactions, or separate the two steps for advanced workflows. + + + Configure polling timeouts and handle transactions that take too long. + + + Handle CheckTx rejections, execution failures, and timeouts. + + + Read transaction events and look up past transactions by hash or query. + + diff --git a/cosmjs/v0.38.x/guides/transactions/signing-broadcasting.mdx b/cosmjs/v0.38.x/guides/transactions/signing-broadcasting.mdx new file mode 100644 index 000000000..1493e8e54 --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/signing-broadcasting.mdx @@ -0,0 +1,87 @@ +--- +title: "Signing & Broadcasting" +description: "Sign and broadcast transactions, or separate the two steps for advanced workflows" +--- + +Once you have your messages and fee, `SigningStargateClient` handles signing and broadcasting. There are three approaches depending on how much control you need. + +## `signAndBroadcast` — The Standard Flow + +Signs the transaction, broadcasts it, and polls until it is included in a block: + +```typescript +const result = await client.signAndBroadcast( + senderAddress, + [sendMsg], + "auto", + "payment for services", +); +``` + +The returned `DeliverTxResponse` contains everything about the executed transaction: + +| Field | Type | Description | +|-------|------|-------------| +| `transactionHash` | `string` | Hex-encoded transaction hash | +| `code` | `number` | `0` on success, non-zero on failure | +| `height` | `number` | Block height where the tx was included | +| `txIndex` | `number` | 0-based index of the transaction within the block | +| `gasUsed` | `bigint` | Actual gas consumed | +| `gasWanted` | `bigint` | Gas limit from the fee | +| `events` | `readonly Event[]` | Transaction events emitted during execution | +| `rawLog` | `string \| undefined` | Raw log string (often contains error details on failure) | +| `msgResponses` | `Array<{ typeUrl: string; value: Uint8Array }>` | Protobuf-encoded response for each message | + +## `signAndBroadcastSync` — Fire and Forget + +Signs and broadcasts but returns immediately with the transaction hash, without waiting for block inclusion: + +```typescript +const txHash = await client.signAndBroadcastSync( + senderAddress, + [sendMsg], + "auto", + "payment for services", +); +``` + +Use this when you want to submit a transaction and check the result later (e.g. via `client.getTx(txHash)`). + +## Separate Sign and Broadcast + +For advanced workflows (offline signing, multi-sig, or inspecting the signed bytes before broadcasting), separate the two steps: + +```typescript +import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx"; +import { calculateFee } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, "0.025uatom"); +const txRaw = await client.sign(senderAddress, [sendMsg], fee, "memo"); + +const txBytes = TxRaw.encode(txRaw).finish(); +const result = await client.broadcastTx(txBytes); +``` + +The `sign` method accepts an optional `explicitSignerData` parameter for offline signing, where account number, sequence, and chain ID must be provided manually: + +```typescript +const txRaw = await client.sign(senderAddress, [sendMsg], fee, "memo", { + accountNumber: 42, + sequence: 7, + chainId: "cosmoshub-4", +}); +``` + +## Next Steps + + + + Configure polling timeouts and handle transactions that take too long. + + + Offline signing, IBC transfers, and inspecting signed transactions. + + + Create wallets from mnemonics, or integrate browser extensions like Keplr. + + diff --git a/cosmjs/v0.38.x/guides/transactions/simulating-gas.mdx b/cosmjs/v0.38.x/guides/transactions/simulating-gas.mdx new file mode 100644 index 000000000..1dab5e04f --- /dev/null +++ b/cosmjs/v0.38.x/guides/transactions/simulating-gas.mdx @@ -0,0 +1,67 @@ +--- +title: "Simulating Gas" +description: "Estimate gas consumption with auto fees, manual simulation, or explicit fee objects" +--- + +Before broadcasting, you can simulate the transaction to estimate how much gas it will consume. This prevents out-of-gas failures. + +## Automatic Simulation with `"auto"` + +The simplest approach — pass `"auto"` as the fee and the client simulates internally: + +```typescript +const result = await client.signAndBroadcast(senderAddress, [sendMsg], "auto"); +``` + +Behind the scenes, the client: + +1. Sends the transaction to the chain's `Simulate` endpoint (without actually executing it) +2. Receives the estimated `gasUsed` +3. Multiplies by a safety buffer (default 1.4x) to get the gas limit +4. Calculates the fee from the gas limit and the configured `gasPrice` + +You can override the multiplier by passing a number instead of `"auto"`: + +```typescript +const result = await client.signAndBroadcast(senderAddress, [sendMsg], 1.6); +``` + +## Manual Simulation + +For more control, call `simulate` directly and build the fee yourself: + +```typescript +import { calculateFee, GasPrice } from "@cosmjs/stargate"; + +const gasEstimate = await client.simulate(senderAddress, [sendMsg], "optional memo"); +const gasLimit = Math.ceil(gasEstimate * 1.5); +const fee = calculateFee(gasLimit, GasPrice.fromString("0.025uatom")); + +const result = await client.signAndBroadcast(senderAddress, [sendMsg], fee, "optional memo"); +``` + +## Explicit Fee (No Simulation) + +When you know the gas cost ahead of time, skip simulation entirely by passing a `StdFee`: + +```typescript +import { calculateFee } from "@cosmjs/stargate"; + +const fee = calculateFee(200_000, "0.025uatom"); +const result = await client.signAndBroadcast(senderAddress, [sendMsg], fee); +``` + + +Simulation is an estimate. If chain state changes between simulation and broadcast (e.g. many concurrent transactions), actual gas may differ. The safety multiplier accounts for this, but high-contention scenarios may need a larger buffer (1.5–2.0x). + + +## Next Steps + + + + Understand gas pricing, fee calculation, and dynamic fee markets in depth. + + + Sign and send your transaction to the chain. + + diff --git a/cosmjs/v0.38.x/overview.mdx b/cosmjs/v0.38.x/overview.mdx new file mode 100644 index 000000000..562809e39 --- /dev/null +++ b/cosmjs/v0.38.x/overview.mdx @@ -0,0 +1,52 @@ +--- +title: What is CosmJS +description: The official JavaScript & TypeScript client library for Cosmos SDK blockchains +--- + +[CosmJS](https://github.com/cosmos/cosmjs) is the official JavaScript/TypeScript client library for interacting with Cosmos SDK blockchains. It enables web and Node.js applications to query on-chain state, construct and sign transactions, and broadcast them to the network. + +## Packages + +CosmJS is published as a set of scoped npm packages. Use the ones that match your needs: + +| Package | Description | +| --- | --- | +| `@cosmjs/stargate` | High-level client for querying and broadcasting on Cosmos SDK 0.40+ chains | +| `@cosmjs/proto-signing` | Wallet primitives and Protobuf-based transaction signing | +| `@cosmjs/cosmwasm` | Client for CosmWasm-enabled chains | +| `@cosmjs/amino` | Amino signing support for legacy compatibility | +| `@cosmjs/tendermint-rpc` | Low-level Tendermint/CometBFT RPC client | +| `@cosmjs/encoding` | Encoding utilities (hex, base64, bech32, UTF-8) | +| `@cosmjs/math` | Integer and decimal math for blockchain amounts | +| `@cosmjs/crypto` | Cryptographic primitives (secp256k1, SHA-256, etc.) | + +## Key Features + +- **Query chain state** — balances, accounts, staking, governance, and arbitrary module queries via Tendermint/CometBFT RPC +- **Sign transactions** — Protobuf (`SIGN_MODE_DIRECT`) and Amino (`SIGN_MODE_LEGACY_AMINO_JSON`) signing +- **Broadcast transactions** — submit signed transactions and monitor results +- **Wallet support** — generate wallets from mnemonics or integrate browser extensions like [Keplr](https://keplr.app) and [Leap](https://leapwallet.io) +- **Custom modules** — register custom message types for application-specific chains +- **CosmWasm** — first-class support for deploying, instantiating, and executing smart contracts + +## Getting Started + + + + Install CosmJS, connect to a node, query state, and send your first transaction. + + + Understand read-only and signing clients. + + + Query balances, accounts, staking, governance, and more. + + + Send tokens and broadcast arbitrary messages. + + + +## Further Resources + +- [CosmJS GitHub Repository](https://github.com/cosmos/cosmjs) +- [CosmJS API Documentation](https://cosmos.github.io/cosmjs) diff --git a/cosmjs/v0.38.x/quick-start.mdx b/cosmjs/v0.38.x/quick-start.mdx new file mode 100644 index 000000000..c9f63e986 --- /dev/null +++ b/cosmjs/v0.38.x/quick-start.mdx @@ -0,0 +1,171 @@ +--- +title: Quick Start +description: Install CosmJS, connect to a Cosmos SDK chain, query state, and send your first transaction +--- + +This guide walks you through installing CosmJS, connecting to a Cosmos SDK chain, querying on-chain state, and sending your first transaction. + +## Prerequisites + +- **Node.js** v22 or later +- **npm**, **yarn**, or **pnpm** +- A Cosmos SDK chain RPC endpoint (e.g. `https://rpc.my-chain.network` for the Cosmos Hub) + + + + + +```bash npm +npm install @cosmjs/stargate @cosmjs/proto-signing +``` +```bash yarn +yarn add @cosmjs/stargate @cosmjs/proto-signing +``` +```bash pnpm +pnpm add @cosmjs/stargate @cosmjs/proto-signing +``` + + + + + +Create a read-only client and verify the connection: + +```typescript +import { StargateClient } from "@cosmjs/stargate"; + +const rpcEndpoint = "https://cosmos-rpc.polkachu.com"; +const client = await StargateClient.connect(rpcEndpoint); + +const chainId = await client.getChainId(); +const height = await client.getHeight(); +console.log(`Connected to ${chainId} at height ${height}`); +``` + + +Find RPC endpoints for any Cosmos chain in the [chain registry](https://github.com/cosmos/chain-registry). + + + + + +Use the connected client to look up any account's balance: + +```typescript +const address = "cosmos1..."; +const balance = await client.getBalance(address, "uatom"); +console.log(`Balance: ${balance.amount} ${balance.denom}`); + +const account = await client.getAccount(address); +console.log("Account:", account); + +const allBalances = await client.getAllBalances(address); +console.log("All balances:", allBalances); +``` + + + + +To send transactions you need a signer. You can create one from a mnemonic for development, or connect a browser wallet like [Keplr](https://keplr.app) in production. + + + + +```typescript +import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing"; + +const wallet = await DirectSecp256k1HdWallet.fromMnemonic( + "your mnemonic words here ...", + { prefix: "cosmos" }, +); +const [{ address }] = await wallet.getAccounts(); +console.log("Signer address:", address); +``` + + +Never hard-code or commit mnemonics. Use environment variables or a secrets manager. + + + + + +```typescript +const chainId = "cosmoshub-4"; +await window.keplr.enable(chainId); +const offlineSigner = window.keplr.getOfflineSigner(chainId); +const [{ address }] = await offlineSigner.getAccounts(); +console.log("Keplr address:", address); +``` + + + + + + + +Connect a signing client and broadcast a token transfer: + +```typescript +import { SigningStargateClient, GasPrice } from "@cosmjs/stargate"; + +const signingClient = await SigningStargateClient.connectWithSigner( + rpcEndpoint, + wallet, // or offlineSigner from Keplr + { gasPrice: GasPrice.fromString("0.025uatom") }, +); + +const result = await signingClient.sendTokens( + address, + "cosmos1recipientaddress...", + [{ denom: "uatom", amount: "1000000" }], // 1 ATOM = 1,000,000 uatom + "auto", +); + +console.log("Tx hash:", result.transactionHash); +console.log("Gas used:", result.gasUsed); +``` + + +Setting fee to `"auto"` lets CosmJS simulate the transaction and estimate gas automatically. You can also pass an explicit `StdFee` object for fine-grained control. + + + + + +For transactions beyond simple token transfers, construct message objects directly: + +```typescript +import { MsgDelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; + +const msg = { + typeUrl: "/cosmos.staking.v1beta1.MsgDelegate", + value: MsgDelegate.fromPartial({ + delegatorAddress: address, + validatorAddress: "cosmosvaloper1...", + amount: { denom: "uatom", amount: "1000000" }, + }), +}; + +const result = await signingClient.signAndBroadcast(address, [msg], "auto"); +console.log("Tx hash:", result.transactionHash); +``` + + + + +## Next Steps + + + + Understand read-only and signing client architecture. + + + Query balances, staking, governance, and custom modules. + + + Configure gas pricing, simulation, and fee calculation. + + + Deploy, instantiate, and execute smart contracts. + + diff --git a/docs.json b/docs.json index 8a618a913..acbd7e690 100644 --- a/docs.json +++ b/docs.json @@ -177,7 +177,7 @@ }, { "label": "Cosmos EVM", - "href": "/evm" + "href": "/evm/v0.5.0/documentation/overview" }, { "label": "IBC", @@ -6999,6 +6999,210 @@ } ] }, + { + "dropdown": "CosmJS", + "icon": "js", + "versions": [ + { + "version": "v0.38.x", + "tabs": [ + { + "tab": "CosmJS", + "groups": [ + { + "group": "CosmJS", + "pages": [ + "cosmjs/v0.38.x/overview", + "cosmjs/v0.38.x/quick-start" + ] + }, + { + "group": "Concepts", + "pages": [ + { + "group": "Clients", + "pages": [ + "cosmjs/v0.38.x/concepts/clients/read-only-clients", + "cosmjs/v0.38.x/concepts/clients/signing-clients", + "cosmjs/v0.38.x/concepts/clients/stargate-vs-cosmwasm" + ] + }, + { + "group": "Accounts & Wallets", + "pages": [ + "cosmjs/v0.38.x/concepts/account/account", + "cosmjs/v0.38.x/concepts/account/offline-signers", + "cosmjs/v0.38.x/concepts/account/local-wallets", + "cosmjs/v0.38.x/concepts/account/injected-wallets", + "cosmjs/v0.38.x/concepts/account/bech32-addresses" + ] + }, + { + "group": "Messages & Encoding", + "pages": [ + "cosmjs/v0.38.x/concepts/messages-encoding/transaction-structure", + "cosmjs/v0.38.x/concepts/messages-encoding/encode-objects", + "cosmjs/v0.38.x/concepts/messages-encoding/registry", + "cosmjs/v0.38.x/concepts/messages-encoding/protobuf-encoding", + "cosmjs/v0.38.x/concepts/messages-encoding/amino-encoding", + "cosmjs/v0.38.x/concepts/messages-encoding/encoding-decoding" + ] + }, + { + "group": "Fees & Gas", + "pages": [ + "cosmjs/v0.38.x/concepts/fees-gas/gas-and-fees", + "cosmjs/v0.38.x/concepts/fees-gas/simulation", + "cosmjs/v0.38.x/concepts/fees-gas/dynamic-gas-pricing", + "cosmjs/v0.38.x/concepts/fees-gas/fee-grants" + ] + }, + { + "group": "Transactions", + "pages": [ + "cosmjs/v0.38.x/concepts/transactions/sign-broadcast", + "cosmjs/v0.38.x/concepts/transactions/direct-vs-amino", + "cosmjs/v0.38.x/concepts/transactions/custom-messages", + "cosmjs/v0.38.x/concepts/transactions/cosmwasm", + "cosmjs/v0.38.x/concepts/transactions/advanced" + ] + }, + { + "group": "Transports", + "pages": [ + "cosmjs/v0.38.x/concepts/transports/rpc-client", + "cosmjs/v0.38.x/concepts/transports/http", + "cosmjs/v0.38.x/concepts/transports/websocket", + "cosmjs/v0.38.x/concepts/transports/timeouts", + "cosmjs/v0.38.x/concepts/transports/json-rpc-streams" + ] + }, + { + "group": "Errors", + "pages": [ + "cosmjs/v0.38.x/concepts/errors/error-classes", + "cosmjs/v0.38.x/concepts/errors/transaction-execution", + "cosmjs/v0.38.x/concepts/errors/transport", + "cosmjs/v0.38.x/concepts/errors/signing-wallet", + "cosmjs/v0.38.x/concepts/errors/encoding", + "cosmjs/v0.38.x/concepts/errors/queries", + "cosmjs/v0.38.x/concepts/errors/gas-estimation", + "cosmjs/v0.38.x/concepts/errors/ledger", + "cosmjs/v0.38.x/concepts/errors/error-handling" + ] + }, + { + "group": "Cosmos EVM", + "pages": [ + "cosmjs/v0.38.x/concepts/cosmos-evm/key-differences", + "cosmjs/v0.38.x/concepts/cosmos-evm/wallets", + "cosmjs/v0.38.x/concepts/cosmos-evm/signing-client", + "cosmjs/v0.38.x/concepts/cosmos-evm/address-derivation", + "cosmjs/v0.38.x/concepts/cosmos-evm/signing", + "cosmjs/v0.38.x/concepts/cosmos-evm/querying", + "cosmjs/v0.38.x/concepts/cosmos-evm/packages", + "cosmjs/v0.38.x/concepts/cosmos-evm/full-example" + ] + } + ] + }, + { + "group": "Guides", + "pages": [ + { + "group": "Connect", + "pages": [ + "cosmjs/v0.38.x/guides/connect/connect", + "cosmjs/v0.38.x/guides/connect/http", + "cosmjs/v0.38.x/guides/connect/websocket", + "cosmjs/v0.38.x/guides/connect/timeouts", + "cosmjs/v0.38.x/guides/connect/custom-endpoints", + "cosmjs/v0.38.x/guides/connect/version-detection", + "cosmjs/v0.38.x/guides/connect/errors" + ] + }, + { + "group": "Transactions", + "pages": [ + "cosmjs/v0.38.x/guides/transactions/send-transactions", + "cosmjs/v0.38.x/guides/transactions/building-messages", + "cosmjs/v0.38.x/guides/transactions/simulating-gas", + "cosmjs/v0.38.x/guides/transactions/signing-broadcasting", + "cosmjs/v0.38.x/guides/transactions/confirmation", + "cosmjs/v0.38.x/guides/transactions/error-handling", + "cosmjs/v0.38.x/guides/transactions/events-and-lookups" + ] + }, + { + "group": "CosmWasm", + "pages": [ + "cosmjs/v0.38.x/guides/cosmwasm/cosmwasm", + "cosmjs/v0.38.x/guides/cosmwasm/querying", + "cosmjs/v0.38.x/guides/cosmwasm/uploading", + "cosmjs/v0.38.x/guides/cosmwasm/instantiating", + "cosmjs/v0.38.x/guides/cosmwasm/executing", + "cosmjs/v0.38.x/guides/cosmwasm/administration", + "cosmjs/v0.38.x/guides/cosmwasm/gas-and-advanced" + ] + }, + { + "group": "Querying", + "pages": [ + "cosmjs/v0.38.x/guides/query/querying", + "cosmjs/v0.38.x/guides/query/bank", + "cosmjs/v0.38.x/guides/query/staking", + "cosmjs/v0.38.x/guides/query/governance", + "cosmjs/v0.38.x/guides/query/accounts", + "cosmjs/v0.38.x/guides/query/distribution-and-mint", + "cosmjs/v0.38.x/guides/query/slashing-authz-feegrant", + "cosmjs/v0.38.x/guides/query/ibc", + "cosmjs/v0.38.x/guides/query/transactions", + "cosmjs/v0.38.x/guides/query/cosmwasm", + "cosmjs/v0.38.x/guides/query/pagination", + "cosmjs/v0.38.x/guides/query/blocks-and-chain-info", + "cosmjs/v0.38.x/guides/query/custom-extensions", + "cosmjs/v0.38.x/guides/query/error-handling" + ] + }, + { + "group": "Extending", + "pages": [ + "cosmjs/v0.38.x/guides/extending/extending", + "cosmjs/v0.38.x/guides/extending/custom-types", + "cosmjs/v0.38.x/guides/extending/query-extensions", + "cosmjs/v0.38.x/guides/extending/amino-converters", + "cosmjs/v0.38.x/guides/extending/custom-modules", + "cosmjs/v0.38.x/guides/extending/new-chains", + "cosmjs/v0.38.x/guides/extending/code-generation" + ] + } + ] + }, + { + "group": "API Reference", + "pages": [ + "cosmjs/v0.38.x/api-reference/stargate", + "cosmjs/v0.38.x/api-reference/cosmwasm", + "cosmjs/v0.38.x/api-reference/proto-signing", + "cosmjs/v0.38.x/api-reference/amino", + "cosmjs/v0.38.x/api-reference/crypto", + "cosmjs/v0.38.x/api-reference/encoding", + "cosmjs/v0.38.x/api-reference/math", + "cosmjs/v0.38.x/api-reference/tendermint-rpc", + "cosmjs/v0.38.x/api-reference/socket", + "cosmjs/v0.38.x/api-reference/stream", + "cosmjs/v0.38.x/api-reference/json-rpc", + "cosmjs/v0.38.x/api-reference/utils", + "cosmjs/v0.38.x/api-reference/faucet-client", + "cosmjs/v0.38.x/api-reference/ledger-amino" + ] + } + ] + } + ] + } + ] + }, { "dropdown": "Cosmos Hub", "icon": "/assets/icons/hub.svg", diff --git a/sdk/v0.50/user/run-node/interact-node.mdx b/sdk/v0.50/user/run-node/interact-node.mdx index ce280ee28..63ace4688 100644 --- a/sdk/v0.50/user/run-node/interact-node.mdx +++ b/sdk/v0.50/user/run-node/interact-node.mdx @@ -256,7 +256,7 @@ func main() { ### CosmJS -CosmJS documentation can be found at [Link](https://cosmos.github.io/cosmjs). As of January 2021, CosmJS documentation is still work in progress. +CosmJS is the official JavaScript/TypeScript client library for Cosmos SDK chains. See the dedicated [CosmJS guide](/cosmjs/v0.38.x/quick-start) for setup, querying, and transaction examples. ## Using the REST Endpoints diff --git a/sdk/v0.50/user/run-node/txs.mdx b/sdk/v0.50/user/run-node/txs.mdx index ef6f29d42..dfeddc61e 100644 --- a/sdk/v0.50/user/run-node/txs.mdx +++ b/sdk/v0.50/user/run-node/txs.mdx @@ -499,4 +499,4 @@ curl -X POST \ ## Using CosmJS (JavaScript & TypeScript) -CosmJS aims to build client libraries in JavaScript that can be embedded in web applications. Please see [Link](https://cosmos.github.io/cosmjs) for more information. As of January 2021, CosmJS documentation is still work in progress. +CosmJS is the official JavaScript/TypeScript client library for generating, signing, and broadcasting transactions on Cosmos SDK chains. See the dedicated [CosmJS guide](/cosmjs/v0.38.x/quick-start) for full setup and usage examples. diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..9ee6584b9 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,6928 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alcalzone/ansi-tokenize@^0.2.0": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.3.tgz#16b3728b96c845546191c28ce511766b52794e68" + integrity sha512-jsElTJ0sQ4wHRz+C45tfect76BwbTbgkgKByOzpCN9xG61N5V6u/glvg1CsNJhq2xJIFpKHSwG3D2wPPuEYOrQ== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ark/schema@0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@ark/schema/-/schema-0.55.0.tgz#017abe2afe1a959086abcf5aae05acee5f14b3b2" + integrity sha512-IlSIc0FmLKTDGr4I/FzNHauMn0MADA6bCjT1wauu4k6MyxhC1R9gz0olNpIRvK7lGGDwtc/VO0RUDNvVQW5WFg== + dependencies: + "@ark/util" "0.55.0" + +"@ark/schema@0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@ark/schema/-/schema-0.56.0.tgz#62126c285e372fa7f0be5c7419dd24728b090ab2" + integrity sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA== + dependencies: + "@ark/util" "0.56.0" + +"@ark/util@0.55.0": + version "0.55.0" + resolved "https://registry.yarnpkg.com/@ark/util/-/util-0.55.0.tgz#b991da6998ba942e4cb81db2772ad23ea3586bde" + integrity sha512-aWFNK7aqSvqFtVsl1xmbTjGbg91uqtJV7Za76YGNEwIO4qLjMfyY8flmmbhooYMuqPCO2jyxu8hve943D+w3bA== + +"@ark/util@0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@ark/util/-/util-0.56.0.tgz#d110f1c55ea934f0fba930deada16254791d7fe3" + integrity sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA== + +"@asyncapi/parser@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@asyncapi/parser/-/parser-3.4.0.tgz#b5a5aca565125579eb76c092c21ef357bcedd805" + integrity sha512-Sxn74oHiZSU6+cVeZy62iPZMFMvKp4jupMFHelSICCMw1qELmUHPvuZSr+ZHDmNGgHcEpzJM5HN02kR7T4g+PQ== + dependencies: + "@asyncapi/specs" "^6.8.0" + "@openapi-contrib/openapi-schema-to-json-schema" "~3.2.0" + "@stoplight/json" "3.21.0" + "@stoplight/json-ref-readers" "^1.2.2" + "@stoplight/json-ref-resolver" "^3.1.5" + "@stoplight/spectral-core" "^1.18.3" + "@stoplight/spectral-functions" "^1.7.2" + "@stoplight/spectral-parsers" "^1.0.2" + "@stoplight/spectral-ref-resolver" "^1.0.3" + "@stoplight/types" "^13.12.0" + "@types/json-schema" "^7.0.11" + "@types/urijs" "^1.19.19" + ajv "^8.17.1" + ajv-errors "^3.0.0" + ajv-formats "^2.1.1" + avsc "^5.7.5" + js-yaml "^4.1.0" + jsonpath-plus "^10.0.0" + node-fetch "2.6.7" + +"@asyncapi/specs@^6.8.0": + version "6.10.0" + resolved "https://registry.yarnpkg.com/@asyncapi/specs/-/specs-6.10.0.tgz#5f61bec36b95e7fa1c9fe2b866f4798458c6cc57" + integrity sha512-vB5oKLsdrLUORIZ5BXortZTlVyGWWMC1Nud/0LtgxQ3Yn2738HigAD6EVqScvpPsDUI/bcLVsYEXN4dtXQHVng== + dependencies: + "@types/json-schema" "^7.0.11" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.28.6.tgz#72499312ec58b1e2245ba4a4f550c132be4982f7" + integrity sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@canvas/image-data@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@canvas/image-data/-/image-data-1.1.0.tgz#ead4e594515f144cc372892cacb4b24ec6d43629" + integrity sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA== + +"@emnapi/runtime@^1.2.0", "@emnapi/runtime@^1.7.0": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5" + integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg== + dependencies: + tslib "^2.4.0" + +"@img/colour@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/colour/-/colour-1.0.0.tgz#d2fabb223455a793bf3bf9c70de3d28526aa8311" + integrity sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw== + +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz#6e0732dcade126b6670af7aa17060b926835ea86" + integrity sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.2.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-darwin-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz#19bc1dd6eba6d5a96283498b9c9f401180ee9c7b" + integrity sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.2.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz#2894c0cb87d42276c3889942e8e2db517a492c43" + integrity sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-darwin-x64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz#e63681f4539a94af9cd17246ed8881734386f8cc" + integrity sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz#b1b288b36864b3bce545ad91fa6dadcf1a4ad318" + integrity sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-arm@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz#b9260dd1ebe6f9e3bdbcbdcac9d2ac125f35852d" + integrity sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A== + +"@img/sharp-libvips-linux-ppc64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz#4b83ecf2a829057222b38848c7b022e7b4d07aa7" + integrity sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA== + +"@img/sharp-libvips-linux-riscv64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz#880b4678009e5a2080af192332b00b0aaf8a48de" + integrity sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-s390x@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz#74f343c8e10fad821b38f75ced30488939dc59ec" + integrity sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linux-x64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz#df4183e8bd8410f7d61b66859a35edeab0a531ce" + integrity sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-arm64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz#c8d6b48211df67137541007ee8d1b7b1f8ca8e06" + integrity sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-libvips-linuxmusl-x64@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz#be11c75bee5b080cbee31a153a8779448f919f75" + integrity sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz#7aa7764ef9c001f15e610546d42fce56911790cc" + integrity sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.2.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-arm@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz#5fb0c3695dd12522d39c3ff7a6bc816461780a0d" + integrity sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.2.4" + +"@img/sharp-linux-ppc64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz#9c213a81520a20caf66978f3d4c07456ff2e0813" + integrity sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA== + optionalDependencies: + "@img/sharp-libvips-linux-ppc64" "1.2.4" + +"@img/sharp-linux-riscv64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz#cdd28182774eadbe04f62675a16aabbccb833f60" + integrity sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw== + optionalDependencies: + "@img/sharp-libvips-linux-riscv64" "1.2.4" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-s390x@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz#93eac601b9f329bb27917e0e19098c722d630df7" + integrity sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.2.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linux-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz#55abc7cd754ffca5002b6c2b719abdfc846819a8" + integrity sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.2.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz#d6515ee971bb62f73001a4829b9d865a11b77086" + integrity sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.2.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz#d97978aec7c5212f999714f2f5b736457e12ee9f" + integrity sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.2.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-wasm32@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz#2f15803aa626f8c59dd7c9d0bbc766f1ab52cfa0" + integrity sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw== + dependencies: + "@emnapi/runtime" "^1.7.0" + +"@img/sharp-win32-arm64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz#3706e9e3ac35fddfc1c87f94e849f1b75307ce0a" + integrity sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g== + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-ia32@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz#0b71166599b049e032f085fb9263e02f4e4788de" + integrity sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + +"@img/sharp-win32-x64@0.34.5": + version "0.34.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz#a81ffb00e69267cd0a1d626eaedb8a8430b2b2f8" + integrity sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw== + +"@inquirer/ansi@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz#674a4c4d81ad460695cb2a1fc69d78cd187f337e" + integrity sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== + +"@inquirer/checkbox@^4.3.0", "@inquirer/checkbox@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.3.2.tgz#e1483e6519d6ffef97281a54d2a5baa0d81b3f3b" + integrity sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA== + dependencies: + "@inquirer/ansi" "^1.0.2" + "@inquirer/core" "^10.3.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/confirm@^5.1.19", "@inquirer/confirm@^5.1.21": + version "5.1.21" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.21.tgz#610c4acd7797d94890a6e2dde2c98eb1e891dd12" + integrity sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + +"@inquirer/core@^10.1.2", "@inquirer/core@^10.3.2": + version "10.3.2" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz#535979ff3ff4fe1e7cc4f83e2320504c743b7e20" + integrity sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== + dependencies: + "@inquirer/ansi" "^1.0.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" + cli-width "^4.1.0" + mute-stream "^2.0.0" + signal-exit "^4.1.0" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.3" + +"@inquirer/editor@^4.2.21", "@inquirer/editor@^4.2.23": + version "4.2.23" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.23.tgz#fe046a3bfdae931262de98c1052437d794322e0b" + integrity sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/external-editor" "^1.0.3" + "@inquirer/type" "^3.0.10" + +"@inquirer/expand@^4.0.21", "@inquirer/expand@^4.0.23": + version "4.0.23" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.23.tgz#a38b5f32226d75717c370bdfed792313b92bdc05" + integrity sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/external-editor@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz#c23988291ee676290fdab3fd306e64010a6d13b8" + integrity sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA== + dependencies: + chardet "^2.1.1" + iconv-lite "^0.7.0" + +"@inquirer/figures@^1.0.15": + version "1.0.15" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz#dbb49ed80df11df74268023b496ac5d9acd22b3a" + integrity sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== + +"@inquirer/input@^4.2.5", "@inquirer/input@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.3.1.tgz#778683b4c4c4d95d05d4b05c4a854964b73565b4" + integrity sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + +"@inquirer/number@^3.0.21", "@inquirer/number@^3.0.23": + version "3.0.23" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.23.tgz#3fdec2540d642093fd7526818fd8d4bdc7335094" + integrity sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + +"@inquirer/password@^4.0.21", "@inquirer/password@^4.0.23": + version "4.0.23" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.23.tgz#b9f5187c8c92fd7aa9eceb9d8f2ead0d7e7b000d" + integrity sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA== + dependencies: + "@inquirer/ansi" "^1.0.2" + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + +"@inquirer/prompts@7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.9.0.tgz#497718b2ac43b15cac636d8f7b501efd1574e1cd" + integrity sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A== + dependencies: + "@inquirer/checkbox" "^4.3.0" + "@inquirer/confirm" "^5.1.19" + "@inquirer/editor" "^4.2.21" + "@inquirer/expand" "^4.0.21" + "@inquirer/input" "^4.2.5" + "@inquirer/number" "^3.0.21" + "@inquirer/password" "^4.0.21" + "@inquirer/rawlist" "^4.1.9" + "@inquirer/search" "^3.2.0" + "@inquirer/select" "^4.4.0" + +"@inquirer/prompts@^7.2.1": + version "7.10.1" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.10.1.tgz#e1436c0484cf04c22548c74e2cd239e989d5f847" + integrity sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg== + dependencies: + "@inquirer/checkbox" "^4.3.2" + "@inquirer/confirm" "^5.1.21" + "@inquirer/editor" "^4.2.23" + "@inquirer/expand" "^4.0.23" + "@inquirer/input" "^4.3.1" + "@inquirer/number" "^3.0.23" + "@inquirer/password" "^4.0.23" + "@inquirer/rawlist" "^4.1.11" + "@inquirer/search" "^3.2.2" + "@inquirer/select" "^4.4.2" + +"@inquirer/rawlist@^4.1.11", "@inquirer/rawlist@^4.1.9": + version "4.1.11" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.1.11.tgz#313c8c3ffccb7d41e990c606465726b4a898a033" + integrity sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/search@^3.2.0", "@inquirer/search@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.2.2.tgz#4cc6fd574dcd434e4399badc37c742c3fd534ac8" + integrity sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA== + dependencies: + "@inquirer/core" "^10.3.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/select@^4.4.0", "@inquirer/select@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.4.2.tgz#2ac8fca960913f18f1d1b35323ed8fcd27d89323" + integrity sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w== + dependencies: + "@inquirer/ansi" "^1.0.2" + "@inquirer/core" "^10.3.2" + "@inquirer/figures" "^1.0.15" + "@inquirer/type" "^3.0.10" + yoctocolors-cjs "^2.1.3" + +"@inquirer/type@^3.0.10", "@inquirer/type@^3.0.2": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz#11ed564ec78432a200ea2601a212d24af8150d50" + integrity sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jsep-plugin/assignment@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@jsep-plugin/assignment/-/assignment-1.3.0.tgz#fcfc5417a04933f7ceee786e8ab498aa3ce2b242" + integrity sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ== + +"@jsep-plugin/regex@^1.0.1", "@jsep-plugin/regex@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@jsep-plugin/regex/-/regex-1.0.4.tgz#cb2fc423220fa71c609323b9ba7f7d344a755fcc" + integrity sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg== + +"@jsep-plugin/ternary@^1.0.2": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@jsep-plugin/ternary/-/ternary-1.1.4.tgz#1ac778bee799137f116cc108f3bf58b9615c45c3" + integrity sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg== + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" + integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== + +"@mdx-js/mdx@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.1.1.tgz#c5ffd991a7536b149e17175eee57a1a2a511c6d1" + integrity sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdx" "^2.0.0" + acorn "^8.0.0" + collapse-white-space "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-util-scope "^1.0.0" + estree-walker "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + markdown-extensions "^2.0.0" + recma-build-jsx "^1.0.0" + recma-jsx "^1.0.0" + recma-stringify "^1.0.0" + rehype-recma "^1.0.0" + remark-mdx "^3.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + source-map "^0.7.0" + unified "^11.0.0" + unist-util-position-from-estree "^2.0.0" + unist-util-stringify-position "^4.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +"@mdx-js/react@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-3.1.1.tgz#24bda7fffceb2fe256f954482123cda1be5f5fef" + integrity sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== + dependencies: + "@types/mdx" "^2.0.0" + +"@mintlify/cli@4.0.890": + version "4.0.890" + resolved "https://registry.yarnpkg.com/@mintlify/cli/-/cli-4.0.890.tgz#edacc431273ae63a738444e583fe994f805586ee" + integrity sha512-Xb9ZS6Z6Noc5V+/u8eGFJGZXuTldWbU5HcrwVWQyIFMgcQ5140FMWhDMC4BCr2cEJyo6M2V+TJ9+QcdOgAq2BA== + dependencies: + "@inquirer/prompts" "7.9.0" + "@mintlify/common" "1.0.672" + "@mintlify/link-rot" "3.0.829" + "@mintlify/models" "0.0.257" + "@mintlify/prebuild" "1.0.807" + "@mintlify/previewing" "4.0.863" + "@mintlify/validation" "0.1.560" + adm-zip "0.5.16" + chalk "5.2.0" + color "4.2.3" + detect-port "1.5.1" + front-matter "4.0.2" + fs-extra "11.2.0" + ink "6.3.0" + inquirer "12.3.0" + js-yaml "4.1.0" + mdast-util-mdx-jsx "3.2.0" + react "19.2.3" + semver "7.7.2" + unist-util-visit "5.0.0" + yargs "17.7.1" + +"@mintlify/common@1.0.661": + version "1.0.661" + resolved "https://registry.yarnpkg.com/@mintlify/common/-/common-1.0.661.tgz#a09c70e1469a55e5956c9642b393b9250350c86d" + integrity sha512-/Hdiblzaomp+AWStQ4smhVMgesQhffzQjC9aYBnmLReNdh2Js+ccQFUaWL3TNIxwiS2esaZvsHSV/D+zyRS3hg== + dependencies: + "@asyncapi/parser" "3.4.0" + "@mintlify/mdx" "^3.0.4" + "@mintlify/models" "0.0.255" + "@mintlify/openapi-parser" "^0.0.8" + "@mintlify/validation" "0.1.555" + "@sindresorhus/slugify" "2.2.0" + "@types/mdast" "4.0.4" + acorn "8.11.2" + acorn-jsx "5.3.2" + color-blend "4.0.0" + estree-util-to-js "2.0.0" + estree-walker "3.0.3" + front-matter "4.0.2" + hast-util-from-html "2.0.3" + hast-util-to-html "9.0.4" + hast-util-to-text "4.0.2" + hex-rgb "5.0.0" + ignore "7.0.5" + js-yaml "4.1.0" + lodash "4.17.21" + mdast-util-from-markdown "2.0.2" + mdast-util-gfm "3.0.0" + mdast-util-mdx "3.0.0" + mdast-util-mdx-jsx "3.1.3" + micromark-extension-gfm "3.0.0" + micromark-extension-mdx-jsx "3.0.1" + micromark-extension-mdxjs "3.0.0" + openapi-types "12.1.3" + postcss "8.5.6" + rehype-stringify "10.0.1" + remark "15.0.1" + remark-frontmatter "5.0.0" + remark-gfm "4.0.0" + remark-math "6.0.0" + remark-mdx "3.1.0" + remark-parse "11.0.0" + remark-rehype "11.1.1" + remark-stringify "11.0.0" + tailwindcss "3.4.4" + unified "11.0.5" + unist-builder "4.0.0" + unist-util-map "4.0.0" + unist-util-remove "4.0.0" + unist-util-remove-position "5.0.0" + unist-util-visit "5.0.0" + unist-util-visit-parents "6.0.1" + vfile "6.0.3" + +"@mintlify/common@1.0.672": + version "1.0.672" + resolved "https://registry.yarnpkg.com/@mintlify/common/-/common-1.0.672.tgz#277a6731b0a37cb0dbd1fc283aed77a1cd05c1c7" + integrity sha512-IqG05ZyuyoKUctv84tO3bNczcUjXSUmhcYk9MWGaUWDYgdrFe+uIcTI8oT9UrV549Vh4JVZpYvmHIjjhHgMtXA== + dependencies: + "@asyncapi/parser" "3.4.0" + "@mintlify/mdx" "^3.0.4" + "@mintlify/models" "0.0.257" + "@mintlify/openapi-parser" "^0.0.8" + "@mintlify/validation" "0.1.560" + "@sindresorhus/slugify" "2.2.0" + "@types/mdast" "4.0.4" + acorn "8.11.2" + acorn-jsx "5.3.2" + color-blend "4.0.0" + estree-util-to-js "2.0.0" + estree-walker "3.0.3" + front-matter "4.0.2" + hast-util-from-html "2.0.3" + hast-util-to-html "9.0.4" + hast-util-to-text "4.0.2" + hex-rgb "5.0.0" + ignore "7.0.5" + js-yaml "4.1.0" + lodash "4.17.21" + mdast-util-from-markdown "2.0.2" + mdast-util-gfm "3.0.0" + mdast-util-mdx "3.0.0" + mdast-util-mdx-jsx "3.1.3" + micromark-extension-gfm "3.0.0" + micromark-extension-mdx-jsx "3.0.1" + micromark-extension-mdxjs "3.0.0" + openapi-types "12.1.3" + postcss "8.5.6" + rehype-stringify "10.0.1" + remark "15.0.1" + remark-frontmatter "5.0.0" + remark-gfm "4.0.0" + remark-math "6.0.0" + remark-mdx "3.1.0" + remark-parse "11.0.0" + remark-rehype "11.1.1" + remark-stringify "11.0.0" + tailwindcss "3.4.4" + unified "11.0.5" + unist-builder "4.0.0" + unist-util-map "4.0.0" + unist-util-remove "4.0.0" + unist-util-remove-position "5.0.0" + unist-util-visit "5.0.0" + unist-util-visit-parents "6.0.1" + vfile "6.0.3" + +"@mintlify/link-rot@3.0.829": + version "3.0.829" + resolved "https://registry.yarnpkg.com/@mintlify/link-rot/-/link-rot-3.0.829.tgz#226ca1ed5dd1c7ea7e6be277480578f6d2e62f6c" + integrity sha512-DvEw9i8SM9/Cu7x48Kn9ppCHTskyF8HrxZoMcwBmCMpTNauC75rXArerk6WwwVhupa67CdYV0v3f5AXUpAPrLg== + dependencies: + "@mintlify/common" "1.0.672" + "@mintlify/prebuild" "1.0.807" + "@mintlify/previewing" "4.0.863" + "@mintlify/scraping" "4.0.522" + "@mintlify/validation" "0.1.560" + fs-extra "11.1.0" + unist-util-visit "4.1.2" + +"@mintlify/mdx@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@mintlify/mdx/-/mdx-3.0.4.tgz#11fa9f4cac0bd24dcaea5d0a99a68d08db5c453a" + integrity sha512-tJhdpnM5ReJLNJ2fuDRIEr0zgVd6id7/oAIfs26V46QlygiLsc8qx4Rz3LWIX51rUXW/cfakjj0EATxIciIw+g== + dependencies: + "@shikijs/transformers" "^3.11.0" + "@shikijs/twoslash" "^3.12.2" + arktype "^2.1.26" + hast-util-to-string "^3.0.1" + mdast-util-from-markdown "^2.0.2" + mdast-util-gfm "^3.1.0" + mdast-util-mdx-jsx "^3.2.0" + mdast-util-to-hast "^13.2.0" + next-mdx-remote-client "^1.0.3" + rehype-katex "^7.0.1" + remark-gfm "^4.0.0" + remark-math "^6.0.0" + remark-smartypants "^3.0.2" + shiki "^3.11.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + +"@mintlify/models@0.0.255": + version "0.0.255" + resolved "https://registry.yarnpkg.com/@mintlify/models/-/models-0.0.255.tgz#34347052d742c81430d9ad3e0b1b9ddf9533c5e9" + integrity sha512-LIUkfA7l7ypHAAuOW74ZJws/NwNRqlDRD/U466jarXvvSlGhJec/6J4/I+IEcBvWDnc9anLFKmnGO04jPKgAsg== + dependencies: + axios "1.10.0" + openapi-types "12.1.3" + +"@mintlify/models@0.0.257": + version "0.0.257" + resolved "https://registry.yarnpkg.com/@mintlify/models/-/models-0.0.257.tgz#323cb34b0c80ffb903a8138d8e49910353306adc" + integrity sha512-0Ddk4fY8IAR/HvXshGla5zwbLKbo53p6wGD01Kch8u/86UP5GT8PbFJRQonAO3DaI/veJ27WXZtP2eAvk9zdzw== + dependencies: + axios "1.10.0" + openapi-types "12.1.3" + +"@mintlify/openapi-parser@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@mintlify/openapi-parser/-/openapi-parser-0.0.8.tgz#09cf5fab762956dddc91dddfb818f076fe1aea81" + integrity sha512-9MBRq9lS4l4HITYCrqCL7T61MOb20q9IdU7HWhqYMNMM1jGO1nHjXasFy61yZ8V6gMZyyKQARGVoZ0ZrYN48Og== + dependencies: + ajv "^8.17.1" + ajv-draft-04 "^1.0.0" + ajv-formats "^3.0.1" + jsonpointer "^5.0.1" + leven "^4.0.0" + yaml "^2.4.5" + +"@mintlify/prebuild@1.0.807": + version "1.0.807" + resolved "https://registry.yarnpkg.com/@mintlify/prebuild/-/prebuild-1.0.807.tgz#314a39179f26e8b10a2c9e9cd6b58938475a5a71" + integrity sha512-Njpfy2bwlcyw9LUjnXOoMCq1VmRF5A26rx+mIOvA3Ho4VBB3JIAC9xylBU/cqxPRg5L72l8AsDDLeRx0e7E1/Q== + dependencies: + "@mintlify/common" "1.0.672" + "@mintlify/openapi-parser" "^0.0.8" + "@mintlify/scraping" "4.0.533" + "@mintlify/validation" "0.1.560" + chalk "5.3.0" + favicons "7.2.0" + front-matter "4.0.2" + fs-extra "11.1.0" + js-yaml "4.1.0" + openapi-types "12.1.3" + sharp "0.33.5" + sharp-ico "0.1.5" + unist-util-visit "4.1.2" + uuid "11.1.0" + +"@mintlify/previewing@4.0.863": + version "4.0.863" + resolved "https://registry.yarnpkg.com/@mintlify/previewing/-/previewing-4.0.863.tgz#3c3319e552f0ab46a1f3bfd5e4fb09cecbbedbbf" + integrity sha512-WhZhiaP5WGn9iqcbzWgJhjHDyzVfjDxLdZaHlirYdVSii7iJX0mO5lJtUNqF9+C/m+B019DYKcenA8bjeaM00A== + dependencies: + "@mintlify/common" "1.0.672" + "@mintlify/prebuild" "1.0.807" + "@mintlify/validation" "0.1.560" + better-opn "3.0.2" + chalk "5.2.0" + chokidar "3.5.3" + express "4.18.2" + front-matter "4.0.2" + fs-extra "11.1.0" + got "13.0.0" + ink "6.3.0" + ink-spinner "5.0.0" + is-online "10.0.0" + js-yaml "4.1.0" + openapi-types "12.1.3" + react "19.2.3" + socket.io "4.7.2" + tar "6.1.15" + unist-util-visit "4.1.2" + yargs "17.7.1" + +"@mintlify/scraping@4.0.522": + version "4.0.522" + resolved "https://registry.yarnpkg.com/@mintlify/scraping/-/scraping-4.0.522.tgz#8a4a2ad68b73d83c3719258c48c21cd5d2649680" + integrity sha512-PL2k52WT5S5OAgnT2K13bP7J2El6XwiVvQlrLvxDYw5KMMV+y34YVJI8ZscKb4trjitWDgyK0UTq2KN6NQgn6g== + dependencies: + "@mintlify/common" "1.0.661" + "@mintlify/openapi-parser" "^0.0.8" + fs-extra "11.1.1" + hast-util-to-mdast "10.1.0" + js-yaml "4.1.0" + mdast-util-mdx-jsx "3.1.3" + neotraverse "0.6.18" + puppeteer "22.14.0" + rehype-parse "9.0.1" + remark-gfm "4.0.0" + remark-mdx "3.0.1" + remark-parse "11.0.0" + remark-stringify "11.0.0" + unified "11.0.5" + unist-util-visit "5.0.0" + yargs "17.7.1" + zod "3.21.4" + +"@mintlify/scraping@4.0.533": + version "4.0.533" + resolved "https://registry.yarnpkg.com/@mintlify/scraping/-/scraping-4.0.533.tgz#41773991db12666f1896e4d3dc6723aa4b8aae68" + integrity sha512-K/Gn7KR/MTcsopQ3nP2ApU3hhmyf/vlGXc0mnb1z7EpgOIgQDHF9wPG9sUQOxJFeF6RsPL3brZXfv7B/BG5OIw== + dependencies: + "@mintlify/common" "1.0.672" + "@mintlify/openapi-parser" "^0.0.8" + fs-extra "11.1.1" + hast-util-to-mdast "10.1.0" + js-yaml "4.1.0" + mdast-util-mdx-jsx "3.1.3" + neotraverse "0.6.18" + puppeteer "22.14.0" + rehype-parse "9.0.1" + remark-gfm "4.0.0" + remark-mdx "3.0.1" + remark-parse "11.0.0" + remark-stringify "11.0.0" + unified "11.0.5" + unist-util-visit "5.0.0" + yargs "17.7.1" + zod "3.21.4" + +"@mintlify/validation@0.1.555": + version "0.1.555" + resolved "https://registry.yarnpkg.com/@mintlify/validation/-/validation-0.1.555.tgz#f27d454f357d2814383c55c8dd9db937a807bc22" + integrity sha512-11QVUReL4N5u8wSCgZt4RN7PA0jYQoMEBZ5IrUp5pgb5ZJBOoGV/vPsQrxPPa1cxsUDAuToNhtGxRQtOav/w8w== + dependencies: + "@mintlify/mdx" "^3.0.4" + "@mintlify/models" "0.0.255" + arktype "2.1.27" + js-yaml "4.1.0" + lcm "0.0.3" + lodash "4.17.21" + object-hash "3.0.0" + openapi-types "12.1.3" + uuid "11.1.0" + zod "3.21.4" + zod-to-json-schema "3.20.4" + +"@mintlify/validation@0.1.560": + version "0.1.560" + resolved "https://registry.yarnpkg.com/@mintlify/validation/-/validation-0.1.560.tgz#fef133daf9491fd977e112ac08a322ba286b11dc" + integrity sha512-9GA+zmWuhuJexdiAGHx7Xo+fYOan4lnxLnmEh0LMX2vLSyo/D+UpW+IpXbHJv92rziIWMCRx68wK09WMxPEISw== + dependencies: + "@mintlify/mdx" "^3.0.4" + "@mintlify/models" "0.0.257" + arktype "2.1.27" + js-yaml "4.1.0" + lcm "0.0.3" + lodash "4.17.21" + object-hash "3.0.0" + openapi-types "12.1.3" + uuid "11.1.0" + zod "3.21.4" + zod-to-json-schema "3.20.4" + +"@next/env@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.3.4.tgz#5b41485596d5bfea0918db73f90b7a6db734da3f" + integrity sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ== + +"@next/swc-darwin-arm64@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.4.tgz#cb2849b8374eb6b52376d4e7abed2a21a2ff24d6" + integrity sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg== + +"@next/swc-darwin-x64@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.4.tgz#aa7fd968af7e53aa17d4f234cf7722b3899712cf" + integrity sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw== + +"@next/swc-linux-arm64-gnu@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.4.tgz#5da3d6d6055665d0c3a2dab0bc0471064bc9eece" + integrity sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g== + +"@next/swc-linux-arm64-musl@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.4.tgz#9043ccc397746c94c2452d301e8f95a33aec22e8" + integrity sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw== + +"@next/swc-linux-x64-gnu@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.4.tgz#49a33f904a51a8c665406ca7e5a748f480bf195d" + integrity sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg== + +"@next/swc-linux-x64-musl@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.4.tgz#8beaff35d8f11961ea80d12a10226581df4c5a74" + integrity sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A== + +"@next/swc-win32-arm64-msvc@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.4.tgz#149d9a35068ecda317af138814539929c9c269af" + integrity sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ== + +"@next/swc-win32-x64-msvc@15.3.4": + version "15.3.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.4.tgz#a652327782d838c2b875eaf216187c51b8409775" + integrity sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@openapi-contrib/openapi-schema-to-json-schema@~3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@openapi-contrib/openapi-schema-to-json-schema/-/openapi-schema-to-json-schema-3.2.0.tgz#c4c92edd4478b5ecb3d99c29ecb355118259dccc" + integrity sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw== + dependencies: + fast-deep-equal "^3.1.3" + +"@puppeteer/browsers@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.3.0.tgz#791ea7d80450fea24eb19fb1d70c367ad4e08cae" + integrity sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA== + dependencies: + debug "^4.3.5" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.4.0" + semver "^7.6.3" + tar-fs "^3.0.6" + unbzip2-stream "^1.4.3" + yargs "^17.7.2" + +"@shikijs/core@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-3.21.0.tgz#9641d09865c43612b28e7931f9af68c8a62edd90" + integrity sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA== + dependencies: + "@shikijs/types" "3.21.0" + "@shikijs/vscode-textmate" "^10.0.2" + "@types/hast" "^3.0.4" + hast-util-to-html "^9.0.5" + +"@shikijs/engine-javascript@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-3.21.0.tgz#f04554fe87bed39d00ba4b140894b41cd207f5cb" + integrity sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ== + dependencies: + "@shikijs/types" "3.21.0" + "@shikijs/vscode-textmate" "^10.0.2" + oniguruma-to-es "^4.3.4" + +"@shikijs/engine-oniguruma@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.21.0.tgz#0e666454a03fd85d6c634d9dbe70a63f007a6323" + integrity sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ== + dependencies: + "@shikijs/types" "3.21.0" + "@shikijs/vscode-textmate" "^10.0.2" + +"@shikijs/langs@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-3.21.0.tgz#da33400a85c7cba75fc9f4a6b9feb69a6c39c800" + integrity sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA== + dependencies: + "@shikijs/types" "3.21.0" + +"@shikijs/themes@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-3.21.0.tgz#1955d642ea37d70d1137e6cf47da7dc9c34ff4c0" + integrity sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw== + dependencies: + "@shikijs/types" "3.21.0" + +"@shikijs/transformers@^3.11.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-3.21.0.tgz#23969f0757b56c42cca6f121e79ec3957710b09a" + integrity sha512-CZwvCWWIiRRiFk9/JKzdEooakAP8mQDtBOQ1TKiCaS2E1bYtyBCOkUzS8akO34/7ufICQ29oeSfkb3tT5KtrhA== + dependencies: + "@shikijs/core" "3.21.0" + "@shikijs/types" "3.21.0" + +"@shikijs/twoslash@^3.12.2": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/twoslash/-/twoslash-3.21.0.tgz#2088c259e144a7e46fdcce40078733ec164d941b" + integrity sha512-iH360udAYON2JwfIldoCiMZr9MljuQA5QRBivKLpEuEpmVCSwrR+0WTQ0eS1ptgGBdH9weFiIsA5wJDzsEzTYg== + dependencies: + "@shikijs/core" "3.21.0" + "@shikijs/types" "3.21.0" + twoslash "^0.3.6" + +"@shikijs/types@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-3.21.0.tgz#510d6ddbea65add27980a6ca36cc7bdabc7afe90" + integrity sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA== + dependencies: + "@shikijs/vscode-textmate" "^10.0.2" + "@types/hast" "^3.0.4" + +"@shikijs/vscode-textmate@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== + +"@sindresorhus/is@^5.2.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + +"@sindresorhus/slugify@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/slugify/-/slugify-2.2.0.tgz#42738974ff19a9a306d3523a8595152998cc758e" + integrity sha512-9Vybc/qX8Kj6pxJaapjkFbiUJPk7MAkCh/GFCxIBnnsuYCFPIXKvnLidG8xlepht3i24L5XemUmGtrJ3UWrl6w== + dependencies: + "@sindresorhus/transliterate" "^1.0.0" + escape-string-regexp "^5.0.0" + +"@sindresorhus/transliterate@^1.0.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz#2309fff65a868047e6d2dd70dec747c5b36a8327" + integrity sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ== + dependencies: + escape-string-regexp "^5.0.0" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + +"@stoplight/better-ajv-errors@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz#d74a5c4da5d786c17188d7f4edec505f089885fa" + integrity sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA== + dependencies: + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@stoplight/json-ref-readers@1.2.2", "@stoplight/json-ref-readers@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@stoplight/json-ref-readers/-/json-ref-readers-1.2.2.tgz#e5992bae597f228f988f362a4c0304c03a92008b" + integrity sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ== + dependencies: + node-fetch "^2.6.0" + tslib "^1.14.1" + +"@stoplight/json-ref-resolver@^3.1.5", "@stoplight/json-ref-resolver@~3.1.6": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@stoplight/json-ref-resolver/-/json-ref-resolver-3.1.6.tgz#dcf8724472b7d54e8e8952510f39b8ee901dcf56" + integrity sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A== + dependencies: + "@stoplight/json" "^3.21.0" + "@stoplight/path" "^1.3.2" + "@stoplight/types" "^12.3.0 || ^13.0.0" + "@types/urijs" "^1.19.19" + dependency-graph "~0.11.0" + fast-memoize "^2.5.2" + immer "^9.0.6" + lodash "^4.17.21" + tslib "^2.6.0" + urijs "^1.19.11" + +"@stoplight/json@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@stoplight/json/-/json-3.21.0.tgz#c0dff9c478f3365d7946cb6e34c17cc2fa84250b" + integrity sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g== + dependencies: + "@stoplight/ordered-object-literal" "^1.0.3" + "@stoplight/path" "^1.3.2" + "@stoplight/types" "^13.6.0" + jsonc-parser "~2.2.1" + lodash "^4.17.21" + safe-stable-stringify "^1.1" + +"@stoplight/json@^3.17.0", "@stoplight/json@^3.17.1", "@stoplight/json@^3.20.1", "@stoplight/json@^3.21.0", "@stoplight/json@~3.21.0": + version "3.21.7" + resolved "https://registry.yarnpkg.com/@stoplight/json/-/json-3.21.7.tgz#102f5fd11921984c96672ce4307850daa1cbfc7b" + integrity sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A== + dependencies: + "@stoplight/ordered-object-literal" "^1.0.3" + "@stoplight/path" "^1.3.2" + "@stoplight/types" "^13.6.0" + jsonc-parser "~2.2.1" + lodash "^4.17.21" + safe-stable-stringify "^1.1" + +"@stoplight/ordered-object-literal@^1.0.3", "@stoplight/ordered-object-literal@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@stoplight/ordered-object-literal/-/ordered-object-literal-1.0.5.tgz#06689095a4f1a53e9d9a5f0055f707c387af966a" + integrity sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg== + +"@stoplight/path@1.3.2", "@stoplight/path@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@stoplight/path/-/path-1.3.2.tgz#96e591496b72fde0f0cdae01a61d64f065bd9ede" + integrity sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ== + +"@stoplight/spectral-core@^1.18.3", "@stoplight/spectral-core@^1.19.2", "@stoplight/spectral-core@^1.19.4": + version "1.20.0" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-core/-/spectral-core-1.20.0.tgz#26572b66c2307c3562ed5c9c1c5891cf6f72778e" + integrity sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ== + dependencies: + "@stoplight/better-ajv-errors" "1.0.3" + "@stoplight/json" "~3.21.0" + "@stoplight/path" "1.3.2" + "@stoplight/spectral-parsers" "^1.0.0" + "@stoplight/spectral-ref-resolver" "^1.0.4" + "@stoplight/spectral-runtime" "^1.1.2" + "@stoplight/types" "~13.6.0" + "@types/es-aggregate-error" "^1.0.2" + "@types/json-schema" "^7.0.11" + ajv "^8.17.1" + ajv-errors "~3.0.0" + ajv-formats "~2.1.1" + es-aggregate-error "^1.0.7" + jsonpath-plus "^10.3.0" + lodash "~4.17.21" + lodash.topath "^4.5.2" + minimatch "3.1.2" + nimma "0.2.3" + pony-cause "^1.1.1" + simple-eval "1.0.1" + tslib "^2.8.1" + +"@stoplight/spectral-formats@^1.8.1": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-formats/-/spectral-formats-1.8.2.tgz#d5bbdb5d0802b118c9b8f8bbf72d6f34f4248b54" + integrity sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw== + dependencies: + "@stoplight/json" "^3.17.0" + "@stoplight/spectral-core" "^1.19.2" + "@types/json-schema" "^7.0.7" + tslib "^2.8.1" + +"@stoplight/spectral-functions@^1.7.2": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-functions/-/spectral-functions-1.10.1.tgz#3f7e6fb3185a295ae30c9165a8b1530f63e739aa" + integrity sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg== + dependencies: + "@stoplight/better-ajv-errors" "1.0.3" + "@stoplight/json" "^3.17.1" + "@stoplight/spectral-core" "^1.19.4" + "@stoplight/spectral-formats" "^1.8.1" + "@stoplight/spectral-runtime" "^1.1.2" + ajv "^8.17.1" + ajv-draft-04 "~1.0.0" + ajv-errors "~3.0.0" + ajv-formats "~2.1.1" + lodash "~4.17.21" + tslib "^2.8.1" + +"@stoplight/spectral-parsers@^1.0.0", "@stoplight/spectral-parsers@^1.0.2": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-parsers/-/spectral-parsers-1.0.5.tgz#2febd979b2917465759c97fe7375145f86574ff2" + integrity sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ== + dependencies: + "@stoplight/json" "~3.21.0" + "@stoplight/types" "^14.1.1" + "@stoplight/yaml" "~4.3.0" + tslib "^2.8.1" + +"@stoplight/spectral-ref-resolver@^1.0.3", "@stoplight/spectral-ref-resolver@^1.0.4": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-ref-resolver/-/spectral-ref-resolver-1.0.5.tgz#2462ae79bbb90b7fcc76b014118a0beeee5e64d5" + integrity sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA== + dependencies: + "@stoplight/json-ref-readers" "1.2.2" + "@stoplight/json-ref-resolver" "~3.1.6" + "@stoplight/spectral-runtime" "^1.1.2" + dependency-graph "0.11.0" + tslib "^2.8.1" + +"@stoplight/spectral-runtime@^1.1.2": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@stoplight/spectral-runtime/-/spectral-runtime-1.1.4.tgz#6e6f69169d352732b0a9b95e0cc151605c510042" + integrity sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ== + dependencies: + "@stoplight/json" "^3.20.1" + "@stoplight/path" "^1.3.2" + "@stoplight/types" "^13.6.0" + abort-controller "^3.0.0" + lodash "^4.17.21" + node-fetch "^2.7.0" + tslib "^2.8.1" + +"@stoplight/types@^12.3.0 || ^13.0.0", "@stoplight/types@^13.12.0", "@stoplight/types@^13.6.0": + version "13.20.0" + resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-13.20.0.tgz#d42682f1e3a14a3c60bdf0df08bff4023518763d" + integrity sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA== + dependencies: + "@types/json-schema" "^7.0.4" + utility-types "^3.10.0" + +"@stoplight/types@^14.1.1": + version "14.1.1" + resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-14.1.1.tgz#0dd5761aac25673a951955e984c724c138368b7a" + integrity sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g== + dependencies: + "@types/json-schema" "^7.0.4" + utility-types "^3.10.0" + +"@stoplight/types@~13.6.0": + version "13.6.0" + resolved "https://registry.yarnpkg.com/@stoplight/types/-/types-13.6.0.tgz#96c6aaae05858b36f589821cd52c95aa9b205ce7" + integrity sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ== + dependencies: + "@types/json-schema" "^7.0.4" + utility-types "^3.10.0" + +"@stoplight/yaml-ast-parser@0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.50.tgz#ed625a1d9ae63eb61980446e058fa745386ab61e" + integrity sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ== + +"@stoplight/yaml@~4.3.0": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@stoplight/yaml/-/yaml-4.3.0.tgz#ca403157472509812ccec6f277185e7e65d7bd7d" + integrity sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w== + dependencies: + "@stoplight/ordered-object-literal" "^1.0.5" + "@stoplight/types" "^14.1.1" + "@stoplight/yaml-ast-parser" "0.0.50" + tslib "^2.2.0" + +"@swc/counter@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.15": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== + dependencies: + tslib "^2.8.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + +"@types/cors@^2.8.12": + version "2.8.19" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342" + integrity sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg== + dependencies: + "@types/node" "*" + +"@types/debug@^4.0.0": + version "4.1.12" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== + dependencies: + "@types/ms" "*" + +"@types/es-aggregate-error@^1.0.2": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz#1472dfb0fb1cb4c3f2bd3b2a7b7e19f60a1d66c0" + integrity sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg== + dependencies: + "@types/node" "*" + +"@types/estree-jsx@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" + integrity sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/hast@^3.0.0", "@types/hast@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/json-schema@^7.0.11", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.7": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/katex@^0.16.0": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.8.tgz#80bf3e0814d09a846412a0b0f140946b79c36c3e" + integrity sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg== + +"@types/mdast@4.0.4", "@types/mdast@^4.0.0", "@types/mdast@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== + dependencies: + "@types/unist" "*" + +"@types/mdx@^2.0.0": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" + integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + +"@types/nlcst@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/nlcst/-/nlcst-2.0.3.tgz#31cad346eaab48a9a8a58465d3d05e2530dda762" + integrity sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA== + dependencies: + "@types/unist" "*" + +"@types/node@*", "@types/node@>=10.0.0": + version "25.0.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.9.tgz#81ce3579ddf67cae812a9d49c8a0ab90c82e7782" + integrity sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw== + dependencies: + undici-types "~7.16.0" + +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@types/unist@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + +"@types/urijs@^1.19.19": + version "1.19.26" + resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.26.tgz#500fc9912e0ba01d635480970bdc9ba0f45d7bc6" + integrity sha512-wkXrVzX5yoqLnndOwFsieJA7oKM8cNkOKJtf/3vVGSUFkWDKZvFHpIl9Pvqb/T9UsawBBFMTTD8xu7sK5MWuvg== + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +"@typescript/vfs@^1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@typescript/vfs/-/vfs-1.6.2.tgz#e66883c5a8dcc5d2794dfa05c8f9749d767219f8" + integrity sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g== + dependencies: + debug "^4.1.1" + +"@ungap/structured-clone@^1.0.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@~1.3.4, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@5.3.2, acorn-jsx@^5.0.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@8.11.2: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + +acorn@^8.0.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +address@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adm-zip@0.5.16: + version "0.5.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.16.tgz#0b5e4c779f07dedea5805cdccb1147071d94a909" + integrity sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ== + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + +aggregate-error@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== + dependencies: + clean-stack "^4.0.0" + indent-string "^5.0.0" + +ajv-draft-04@^1.0.0, ajv-draft-04@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" + integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== + +ajv-errors@^3.0.0, ajv-errors@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-3.0.0.tgz#e54f299f3a3d30fe144161e5f0d8d51196c527bc" + integrity sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ== + +ajv-formats@^2.1.1, ajv-formats@~2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== + dependencies: + ajv "^8.0.0" + +ajv@^8.0.0, ajv@^8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-escapes@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.2.0.tgz#31b25afa3edd3efc09d98c2fee831d460ff06b49" + integrity sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw== + dependencies: + environment "^1.0.0" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arkregex@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/arkregex/-/arkregex-0.0.3.tgz#2e2bdce5223e737cc134e4b0c9f228111d8cca57" + integrity sha512-bU21QJOJEFJK+BPNgv+5bVXkvRxyAvgnon75D92newgHxkBJTgiFwQxusyViYyJkETsddPlHyspshDQcCzmkNg== + dependencies: + "@ark/util" "0.55.0" + +arkregex@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/arkregex/-/arkregex-0.0.5.tgz#0a2d5f6ae11de6b6200f2326f65960f85dac62fb" + integrity sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw== + dependencies: + "@ark/util" "0.56.0" + +arktype@2.1.27: + version "2.1.27" + resolved "https://registry.yarnpkg.com/arktype/-/arktype-2.1.27.tgz#882f5ef93d05d292a10db0ad31cd37fa46efe048" + integrity sha512-enctOHxI4SULBv/TDtCVi5M8oLd4J5SVlPUblXDzSsOYQNMzmVbUosGBnJuZDKmFlN5Ie0/QVEuTE+Z5X1UhsQ== + dependencies: + "@ark/schema" "0.55.0" + "@ark/util" "0.55.0" + arkregex "0.0.3" + +arktype@^2.1.26: + version "2.1.29" + resolved "https://registry.yarnpkg.com/arktype/-/arktype-2.1.29.tgz#23bee076c8851d14e792bde6cd328b578a5654d9" + integrity sha512-jyfKk4xIOzvYNayqnD8ZJQqOwcrTOUbIU4293yrzAjA3O1dWh61j71ArMQ6tS/u4pD7vabSPe7nG3RCyoXW6RQ== + dependencies: + "@ark/schema" "0.56.0" + "@ark/util" "0.56.0" + arkregex "0.0.5" + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-iterate@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-2.0.1.tgz#6efd43f8295b3fee06251d3d62ead4bd9805dd24" + integrity sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg== + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +ast-types@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== + dependencies: + tslib "^2.0.1" + +astring@^1.8.0, astring@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" + integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== + +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +auto-bind@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-5.0.1.tgz#50d8e63ea5a1dddcb5e5e36451c1a8266ffbb2ae" + integrity sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +avsc@^5.7.5: + version "5.7.9" + resolved "https://registry.yarnpkg.com/avsc/-/avsc-5.7.9.tgz#8532cd47b2fbff95be4bc470c6780c258d86680a" + integrity sha512-yOA4wFeI7ET3v32Di/sUybQ+ttP20JHSW3mxLuNGeO0uD6PPcvLrIQXSvy/rhJOWU5JrYh7U4OHplWMmtAtjMg== + +axios@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.10.0.tgz#af320aee8632eaf2a400b6a1979fa75856f38d54" + integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +b4a@^1.6.4: + version "1.7.3" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.7.3.tgz#24cf7ccda28f5465b66aec2bac69e32809bf112f" + integrity sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q== + +bail@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bare-events@^2.5.4, bare-events@^2.7.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.8.2.tgz#7b3e10bd8e1fc80daf38bb516921678f566ab89f" + integrity sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ== + +bare-fs@^4.0.1: + version "4.5.2" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.5.2.tgz#d80ff8a9177e0db4818e7ba44b9302c0cf0788af" + integrity sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw== + dependencies: + bare-events "^2.5.4" + bare-path "^3.0.0" + bare-stream "^2.6.4" + bare-url "^2.2.2" + fast-fifo "^1.3.2" + +bare-os@^3.0.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.2.tgz#b3c4f5ad5e322c0fd0f3c29fc97d19009e2796e5" + integrity sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.6.4: + version "2.7.0" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.7.0.tgz#5b9e7dd0a354d06e82d6460c426728536c35d789" + integrity sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A== + dependencies: + streamx "^2.21.0" + +bare-url@^2.2.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.3.2.tgz#4aef382efa662b2180a6fe4ca07a71b39bdf7ca3" + integrity sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw== + dependencies: + bare-path "^3.0.0" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0, base64id@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +basic-ftp@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.1.0.tgz#00eb8128ce536aa697c45716c739bf38e8d890f5" + integrity sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw== + +better-opn@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-3.0.2.tgz#f96f35deaaf8f34144a4102651babcf00d1d8817" + integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== + dependencies: + open "^8.0.4" + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.2.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001579: + version "1.0.30001765" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz#4a78d8a797fd4124ebaab2043df942eb091648ee" + integrity sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + +chalk@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chalk@^5.6.0: + version "5.6.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== + +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + +chardet@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.1.tgz#5c75593704a642f71ee53717df234031e65373c8" + integrity sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chromium-bidi@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.2.tgz#91f9daa20984833b52221084480fbe0465b29c67" + integrity sha512-4WVBa6ijmUTVr9cZD4eicQD8Mdy/HCX3bzEIYYpmk0glqYLoWH+LqQEvV9RpDRzoQSbY1KJHloYXbDMXMbDPhg== + dependencies: + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.23.8" + +clean-stack@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== + dependencies: + escape-string-regexp "5.0.0" + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-spinners@^2.7.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== + dependencies: + convert-to-spaces "^2.0.1" + +collapse-white-space@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" + integrity sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw== + +color-blend@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/color-blend/-/color-blend-4.0.0.tgz#e9950e9fa5d6e552ff8bb107c39f7e83a0c1a3bb" + integrity sha512-fYODTHhI/NG+B5GnzvuL3kiFrK/UnkUezWFTgEPBTY5V+kpyfAn95Vn9sJeeCX6omrCOdxnqCL3CvH+6sXtIbw== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@4.2.3, color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cookie@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +cors@~2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +data-uri-to-buffer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.4, debug@^4.3.5, debug@~4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +debug@~4.3.1, debug@~4.3.2: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +decode-bmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/decode-bmp/-/decode-bmp-0.2.1.tgz#cec3e0197ec3b6c60f02220f50e8757030ff2427" + integrity sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA== + dependencies: + "@canvas/image-data" "^1.0.0" + to-data-view "^1.1.0" + +decode-ico@*: + version "0.4.1" + resolved "https://registry.yarnpkg.com/decode-ico/-/decode-ico-0.4.1.tgz#e0f7373081532c7b8495bd51fb225d354e14de25" + integrity sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA== + dependencies: + "@canvas/image-data" "^1.0.0" + decode-bmp "^0.2.0" + to-data-view "^1.1.0" + +decode-named-character-reference@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz#3e40603760874c2e5867691b599d73a7da25b53f" + integrity sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q== + dependencies: + character-entities "^2.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dependency-graph@0.11.0, dependency-graph@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.3, detect-libc@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + +detect-port@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + +devtools-protocol@0.0.1312386: + version "0.0.1312386" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz#5ab824d6f1669ec6c6eb0fba047e73601d969052" + integrity sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA== + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-packet@^5.2.4: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dns-socket@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/dns-socket/-/dns-socket-4.2.2.tgz#58b0186ec053ea0731feb06783c7eeac4b95b616" + integrity sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg== + dependencies: + dns-packet "^5.2.4" + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emoji-regex@^10.3.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" + integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +end-of-stream@^1.1.0: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + +engine.io@~6.5.2: + version "6.5.5" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.5.tgz#430b80d8840caab91a50e9e23cb551455195fc93" + integrity sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA== + dependencies: + "@types/cookie" "^0.4.1" + "@types/cors" "^2.8.12" + "@types/node" ">=10.0.0" + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + cors "~2.8.5" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + +entities@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694" + integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== + +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + +error-ex@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414" + integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: + version "1.24.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" + integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + +es-aggregate-error@^1.0.7: + version "1.0.14" + resolved "https://registry.yarnpkg.com/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz#f1a24f833d25056c2ebc92a8c04449374f8f9f65" + integrity sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA== + dependencies: + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + globalthis "^1.0.4" + has-property-descriptors "^1.0.2" + set-function-name "^2.0.2" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +es-toolkit@^1.39.10: + version "1.44.0" + resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.44.0.tgz#b363b436b6115c3cc9cc21954c1e08ecdaa51c8c" + integrity sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg== + +esast-util-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz#8d1cfb51ad534d2f159dc250e604f3478a79f1ad" + integrity sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + unist-util-position-from-estree "^2.0.0" + +esast-util-from-js@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz#5147bec34cc9da44accf52f87f239a40ac3e8225" + integrity sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw== + dependencies: + "@types/estree-jsx" "^1.0.0" + acorn "^8.0.0" + esast-util-from-estree "^2.0.0" + vfile-message "^4.0.0" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-util-attach-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" + integrity sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz#b6d0bced1dcc4f06f25cf0ceda2b2dcaf98168f1" + integrity sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz#0b5ef4c4ff13508b34dcd01ecfa945f61fce5dbd" + integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== + +estree-util-scope@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz#9cbdfc77f5cb51e3d9ed4ad9c4adbff22d43e585" + integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + +estree-util-to-js@2.0.0, estree-util-to-js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz#10a6fb924814e6abb62becf0d2bc4dea51d04f17" + integrity sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-visit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-2.0.0.tgz#13a9a9f40ff50ed0c022f831ddf4b58d05446feb" + integrity sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^3.0.0" + +estree-walker@3.0.3, estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +events-universal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" + integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== + dependencies: + bare-events "^2.7.0" + +express@4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-glob@^3.3.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-memoize@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" + integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== + +fast-uri@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" + integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== + +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + dependencies: + reusify "^1.0.4" + +fault@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fault/-/fault-2.0.1.tgz#d47ca9f37ca26e4bd38374a7c500b5a384755b6c" + integrity sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ== + dependencies: + format "^0.2.0" + +favicons@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/favicons/-/favicons-7.2.0.tgz#1f1662f1f69e5637c19275209003b7b822c24250" + integrity sha512-k/2rVBRIRzOeom3wI9jBPaSEvoTSQEW4iM0EveBmBBKFxO8mSyyRWtDlfC3VnEfu0avmjrMzy8/ZFPSe6F71Hw== + dependencies: + escape-html "^1.0.3" + sharp "^0.33.1" + xml2js "^0.6.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +follow-redirects@^1.15.6: + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + +form-data@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +front-matter@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" + integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== + dependencies: + js-yaml "^3.13.1" + +fs-extra@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gcd@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/gcd/-/gcd-0.0.1.tgz#41e0bb60bcc9245635419860a22544b230ba2f75" + integrity sha512-VNx3UEGr+ILJTiMs1+xc5SX1cMgJCrXezKPa003APUWNqQqaF6n25W8VcR7nHN6yRWbvvUTwCpZCFJeWC2kXlw== + +generator-function@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz#9bc4caa131702b4b61729cb7e42735bc550c9ee6" + integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-uri@^6.0.1: + version "6.0.5" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16" + integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +got@13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/got/-/got-13.0.0.tgz#a2402862cef27a5d0d1b07c0fb25d12b58175422" + integrity sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +got@^12.0.0, got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hast-util-embedded@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz#be4477780fbbe079cdba22982e357a0de4ba853e" + integrity sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-is-element "^3.0.0" + +hast-util-from-dom@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz#c3c92fbd8d4e1c1625edeb3a773952b9e4ad64a8" + integrity sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q== + dependencies: + "@types/hast" "^3.0.0" + hastscript "^9.0.0" + web-namespaces "^2.0.0" + +hast-util-from-html-isomorphic@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz#b31baee386a899a2472326a3c5692f29f86d1d3c" + integrity sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-from-dom "^5.0.0" + hast-util-from-html "^2.0.0" + unist-util-remove-position "^5.0.0" + +hast-util-from-html@2.0.3, hast-util-from-html@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz#485c74785358beb80c4ba6346299311ac4c49c82" + integrity sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.1.0" + hast-util-from-parse5 "^8.0.0" + parse5 "^7.0.0" + vfile "^6.0.0" + vfile-message "^4.0.0" + +hast-util-from-parse5@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz#830a35022fff28c3fea3697a98c2f4cc6b835a2e" + integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^9.0.0" + property-information "^7.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-has-property@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz#4e595e3cddb8ce530ea92f6fc4111a818d8e7f93" + integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-body-ok-link@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz#ef63cb2f14f04ecf775139cd92bda5026380d8b4" + integrity sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-is-element@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz#6e31a6532c217e5b533848c7e52c9d9369ca0932" + integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-minify-whitespace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz#7588fd1a53f48f1d30406b81959dffc3650daf55" + integrity sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-is-element "^3.0.0" + hast-util-whitespace "^3.0.0" + unist-util-is "^6.0.0" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz#fa284c0cd4a82a0dd6020de8300a7b1ebffa1690" + integrity sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== + dependencies: + "@types/hast" "^3.0.0" + hast-util-embedded "^3.0.0" + hast-util-has-property "^3.0.0" + hast-util-is-body-ok-link "^3.0.0" + hast-util-is-element "^3.0.0" + +hast-util-to-estree@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz#e654c1c9374645135695cc0ab9f70b8fcaf733d7" + integrity sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-attach-comments "^3.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + zwitch "^2.0.0" + +hast-util-to-html@9.0.4: + version "9.0.4" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz#d689c118c875aab1def692c58603e34335a0f5c5" + integrity sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-html@^9.0.0, hast-util-to-html@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" + integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-jsx-runtime@^2.0.0: + version "2.3.6" + resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz#ff31897aae59f62232e21594eac7ef6b63333e98" + integrity sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + style-to-js "^1.0.0" + unist-util-position "^5.0.0" + vfile-message "^4.0.0" + +hast-util-to-mdast@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/hast-util-to-mdast/-/hast-util-to-mdast-10.1.0.tgz#906c80fc263a9f09a33462317ffc6ad94f4ee3db" + integrity sha512-DsL/SvCK9V7+vfc6SLQ+vKIyBDXTk2KLSbfBYkH4zeF/uR1yBajHRhkzuaUSGOB1WJSTieJBdHwxlC+HLKvZZw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-phrasing "^3.0.0" + hast-util-to-html "^9.0.0" + hast-util-to-text "^4.0.0" + hast-util-whitespace "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-hast "^13.0.0" + mdast-util-to-string "^4.0.0" + rehype-minify-whitespace "^6.0.0" + trim-trailing-lines "^2.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + +hast-util-to-string@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz#a4f15e682849326dd211c97129c94b0c3e76527c" + integrity sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-to-text@4.0.2, hast-util-to-text@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz#57b676931e71bf9cb852453678495b3080bfae3e" + integrity sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + hast-util-is-element "^3.0.0" + unist-util-find-after "^5.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.1.tgz#dbc84bef6051d40084342c229c451cd9dc567dff" + integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + +hex-rgb@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hex-rgb/-/hex-rgb-5.0.0.tgz#e2c9eb6a37498d66c5a350a221ed4c2c7d1a92d6" + integrity sha512-NQO+lgVUCtHxZ792FodgW0zflK+ozS9X9dwGp9XvvmPlH7pyxd588cn24TD3rmPm/N0AIRXF10Otah8yKqGw4w== + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + +http-cache-semantics@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5" + integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +ico-endec@*: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ico-endec/-/ico-endec-0.1.6.tgz#9b320cc3ed0a0c779f54e998a8db49002abd7c6e" + integrity sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + +immer@^9.0.6: + version "9.0.21" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ink-spinner@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ink-spinner/-/ink-spinner-5.0.0.tgz#32ec318ef8ebb0ace8f595451f8e93280623429f" + integrity sha512-EYEasbEjkqLGyPOUc8hBJZNuC5GvXGMLu0w5gdTNskPc7Izc5vO3tdQEYnzvshucyGCBXc86ig0ujXPMWaQCdA== + dependencies: + cli-spinners "^2.7.0" + +ink@6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/ink/-/ink-6.3.0.tgz#9be9c3f550bd4e356249653504f6d974a0cddd13" + integrity sha512-2CbJAa7XeziZYe6pDS5RVLirRY28iSGMQuEV8jRU5NQsONQNfcR/BZHHc9vkMg2lGYTHTM2pskxC1YmY28p6bQ== + dependencies: + "@alcalzone/ansi-tokenize" "^0.2.0" + ansi-escapes "^7.0.0" + ansi-styles "^6.2.1" + auto-bind "^5.0.1" + chalk "^5.6.0" + cli-boxes "^3.0.0" + cli-cursor "^4.0.0" + cli-truncate "^4.0.0" + code-excerpt "^4.0.0" + es-toolkit "^1.39.10" + indent-string "^5.0.0" + is-in-ci "^2.0.0" + patch-console "^2.0.0" + react-reconciler "^0.32.0" + signal-exit "^3.0.7" + slice-ansi "^7.1.0" + stack-utils "^2.0.6" + string-width "^7.2.0" + type-fest "^4.27.0" + widest-line "^5.0.0" + wrap-ansi "^9.0.0" + ws "^8.18.0" + yoga-layout "~3.2.1" + +inline-style-parser@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz#b1fc68bfc0313b8685745e4464e37f9376b9c909" + integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== + +inquirer@12.3.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-12.3.0.tgz#c5142f49362f1347aa49a18e652db460f14092e6" + integrity sha512-3NixUXq+hM8ezj2wc7wC37b32/rHq1MwNZDYdvx+d6jokOD+r+i8Q4Pkylh9tISYP114A128LCX8RKhopC5RfQ== + dependencies: + "@inquirer/core" "^10.1.2" + "@inquirer/prompts" "^7.2.1" + "@inquirer/type" "^3.0.2" + ansi-escapes "^4.3.2" + mute-stream "^2.0.0" + run-async "^3.0.0" + rxjs "^7.8.1" + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +ip-address@^10.0.1: + version "10.1.0" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.1.0.tgz#d8dcffb34d0e02eb241427444a6e23f5b0595aa4" + integrity sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== + +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.4.tgz#1ee5553818511915685d33bb13d31bf854e5059d" + integrity sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA== + +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.16.1: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz#046b2a6d4f6b156b2233d3207d4b5a9783999b98" + integrity sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== + dependencies: + get-east-asian-width "^1.3.1" + +is-generator-function@^1.0.10: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== + dependencies: + call-bound "^1.0.4" + generator-function "^2.0.0" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + +is-in-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-in-ci/-/is-in-ci-2.0.0.tgz#e4b3471c555b47509a8311869c377c234967079f" + integrity sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w== + +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-online@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/is-online/-/is-online-10.0.0.tgz#5e02cee9f822fd9c19b060f0ecbdc798d37295a3" + integrity sha512-WCPdKwNDjXJJmUubf2VHLMDBkUZEtuOvpXUfUnUFbEnM6In9ByiScL4f4jKACz/fsb2qDkesFerW3snf/AYz3A== + dependencies: + got "^12.1.0" + p-any "^4.0.0" + p-timeout "^5.1.0" + public-ip "^5.0.0" + +is-plain-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +jiti@^1.21.0: + version "1.21.7" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" + integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.13.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + dependencies: + argparse "^2.0.1" + +jsep@^1.2.0, jsep@^1.3.6, jsep@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsep/-/jsep-1.4.0.tgz#19feccbfa51d8a79f72480b4b8e40ce2e17152f0" + integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +jsonc-parser@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.2.1.tgz#db73cd59d78cce28723199466b2a03d1be1df2bc" + integrity sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w== + +jsonfile@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpath-plus@^10.0.0, jsonpath-plus@^10.3.0, "jsonpath-plus@^6.0.1 || ^10.1.0": + version "10.3.0" + resolved "https://registry.yarnpkg.com/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz#59e22e4fa2298c68dfcd70659bb47f0cad525238" + integrity sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA== + dependencies: + "@jsep-plugin/assignment" "^1.3.0" + "@jsep-plugin/regex" "^1.0.4" + jsep "^1.4.0" + +jsonpointer@^5.0.0, jsonpointer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +katex@^0.16.0: + version "0.16.27" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.27.tgz#4ecf6f620e0ca1c1a5de722e85fcdcec49086a48" + integrity sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw== + dependencies: + commander "^8.3.0" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +lcm@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/lcm/-/lcm-0.0.3.tgz#4a3b11ce0363e297010806080ffeca02f77f8280" + integrity sha512-TB+ZjoillV6B26Vspf9l2L/vKaRY/4ep3hahcyVkCGFgsTNRUQdc24bQeNFiZeoxH0vr5+7SfNRMQuPHv/1IrQ== + dependencies: + gcd "^0.0.1" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +leven@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-4.1.0.tgz#1e37150e1711d18bb14e380a5c779995235a710e" + integrity sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew== + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lilconfig@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lodash.topath@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.topath/-/lodash.topath-4.5.2.tgz#3616351f3bba61994a0931989660bd03254fd009" + integrity sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg== + +lodash@4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lodash@^4.17.21, lodash@~4.17.21: + version "4.17.23" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a" + integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w== + +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +markdown-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" + integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== + +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mdast-util-find-and-replace@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz#70a3174c894e14df722abf43bc250cbae44b11df" + integrity sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +mdast-util-from-markdown@2.0.2, mdast-util-from-markdown@^2.0.0, mdast-util-from-markdown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" + integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + mdast-util-to-string "^4.0.0" + micromark "^4.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-decode-string "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-stringify-position "^4.0.0" + +mdast-util-frontmatter@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz#f5f929eb1eb36c8a7737475c7eb438261f964ee8" + integrity sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + escape-string-regexp "^5.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz#7778e9d9ca3df7238cc2bd3fa2b1bf6a65b19403" + integrity sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0, mdast-util-gfm@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz#2cdf63b92c2a331406b0fb0db4c077c1b0331751" + integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-math@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-3.0.0.tgz#8d79dd3baf8ab8ac781f62b8853768190b9a00b0" + integrity sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + longest-streak "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.1.0" + unist-util-remove-position "^5.0.0" + +mdast-util-mdx-expression@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz#43f0abac9adc756e2086f63822a38c8d3c3a5096" + integrity sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdx-jsx@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz#76b957b3da18ebcfd0de3a9b4451dcd6fdec2320" + integrity sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx-jsx@3.2.0, mdast-util-mdx-jsx@^3.0.0, mdast-util-mdx-jsx@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz#fd04c67a2a7499efb905a8a5c578dddc9fdada0d" + integrity sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + +mdast-util-mdx@3.0.0, mdast-util-mdx@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz#792f9cf0361b46bee1fdf1ef36beac424a099c41" + integrity sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-mdx-expression "^2.0.0" + mdast-util-mdx-jsx "^3.0.0" + mdast-util-mdxjs-esm "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-mdxjs-esm@^2.0.0, mdast-util-mdxjs-esm@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz#019cfbe757ad62dd557db35a695e7314bcc9fa97" + integrity sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-phrasing@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz#7cc0a8dec30eaf04b7b1a9661a92adb3382aa6e3" + integrity sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w== + dependencies: + "@types/mdast" "^4.0.0" + unist-util-is "^6.0.0" + +mdast-util-to-hast@^13.0.0, mdast-util-to-hast@^13.2.0: + version "13.2.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" + integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + +mdast-util-to-markdown@^2.0.0, mdast-util-to-markdown@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz#f910ffe60897f04bb4b7e7ee434486f76288361b" + integrity sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/unist" "^3.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^4.0.0" + mdast-util-to-string "^4.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-decode-string "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromark-core-commonmark@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4" + integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== + dependencies: + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-factory-destination "^2.0.0" + micromark-factory-label "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-factory-title "^2.0.0" + micromark-factory-whitespace "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-html-tag-name "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-frontmatter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz#651c52ffa5d7a8eeed687c513cd869885882d67a" + integrity sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg== + dependencies: + fault "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz#fac70bcbf51fe65f5f44033118d39be8a9b5940b" + integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@3.0.0, micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-math@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz#c42ee3b1dd5a9a03584e83dd8f08e3de510212c1" + integrity sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg== + dependencies: + "@types/katex" "^0.16.0" + devlop "^1.0.0" + katex "^0.16.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-expression@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz#43d058d999532fb3041195a3c3c05c46fa84543b" + integrity sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-mdx-jsx@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz#5abb83da5ddc8e473a374453e6ea56fbd66b59ad" + integrity sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-jsx@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz#ffc98bdb649798902fa9fc5689f67f9c1c902044" + integrity sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + estree-util-is-identifier-name "^3.0.0" + micromark-factory-mdx-expression "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdx-md@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz#1d252881ea35d74698423ab44917e1f5b197b92d" + integrity sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-mdxjs-esm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz#de21b2b045fd2059bd00d36746081de38390d54a" + integrity sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-extension-mdxjs@3.0.0, micromark-extension-mdxjs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz#b5a2e0ed449288f3f6f6c544358159557549de18" + integrity sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^3.0.0" + micromark-extension-mdx-jsx "^3.0.0" + micromark-extension-mdx-md "^2.0.0" + micromark-extension-mdxjs-esm "^3.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-destination@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-label@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== + dependencies: + devlop "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-mdx-expression@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz#bb09988610589c07d1c1e4425285895041b3dfa9" + integrity sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ== + dependencies: + "@types/estree" "^1.0.0" + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-events-to-acorn "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + unist-util-position-from-estree "^2.0.0" + vfile-message "^4.0.0" + +micromark-factory-space@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-title@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-factory-whitespace@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== + dependencies: + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-character@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-chunked@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-classify-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-combine-extensions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== + dependencies: + micromark-util-chunked "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-decode-numeric-character-reference@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-decode-string@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz#6cb99582e5d271e84efca8e61a807994d7161eb2" + integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== + +micromark-util-events-to-acorn@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz#e7a8a6b55a47e5a06c720d5a1c4abae8c37c98f3" + integrity sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg== + dependencies: + "@types/estree" "^1.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + estree-util-visit "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + vfile-message "^4.0.0" + +micromark-util-html-tag-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== + +micromark-util-normalize-identifier@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== + dependencies: + micromark-util-symbol "^2.0.0" + +micromark-util-resolve-all@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-subtokenize@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz#d8ade5ba0f3197a1cf6a2999fbbfe6357a1a19ee" + integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== + +micromark-util-types@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" + integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== + +micromark@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.2.tgz#91395a3e1884a198e62116e33c9c568e39936fdb" + integrity sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-decode-numeric-character-reference "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-subtokenize "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromatch@^4.0.5, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + +minimatch@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mint@^4.2.7: + version "4.2.286" + resolved "https://registry.yarnpkg.com/mint/-/mint-4.2.286.tgz#0f4d1d945a2c4198af25997ba7b62ef62078aa90" + integrity sha512-L4Kpz6Bbxtw5WzXuyJMKENdt9WDjB5+rz9cjoKvIqENFnGIy1+SonYsCDi1usbHD5H9YOdsoravBdFRx5+PPdg== + dependencies: + "@mintlify/cli" "4.0.890" + +mitt@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.11, nanoid@^3.3.6: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neotraverse@0.6.18: + version "0.6.18" + resolved "https://registry.yarnpkg.com/neotraverse/-/neotraverse-0.6.18.tgz#abcb33dda2e8e713cf6321b29405e822230cdb30" + integrity sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA== + +netmask@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== + +next-mdx-remote-client@^1.0.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/next-mdx-remote-client/-/next-mdx-remote-client-1.1.4.tgz#215bf0d88cf6e91832daecf27fc845ff4a7a1ce2" + integrity sha512-psCMdO50tfoT1kAH7OGXZvhyRfiHVK6IqwjmWFV5gtLo4dnqjAgcjcLNeJ92iI26UNlKShxYrBs1GQ6UXxk97A== + dependencies: + "@babel/code-frame" "^7.27.1" + "@mdx-js/mdx" "^3.1.1" + "@mdx-js/react" "^3.1.1" + remark-mdx-remove-esm "^1.2.1" + serialize-error "^12.0.0" + vfile "^6.0.3" + vfile-matter "^5.0.1" + +next@15.3.4: + version "15.3.4" + resolved "https://registry.yarnpkg.com/next/-/next-15.3.4.tgz#7a4863be14c998f1ec1e6d8d4e9e1a1291c8cbe3" + integrity sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA== + dependencies: + "@next/env" "15.3.4" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.15" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + postcss "8.4.31" + styled-jsx "5.1.6" + optionalDependencies: + "@next/swc-darwin-arm64" "15.3.4" + "@next/swc-darwin-x64" "15.3.4" + "@next/swc-linux-arm64-gnu" "15.3.4" + "@next/swc-linux-arm64-musl" "15.3.4" + "@next/swc-linux-x64-gnu" "15.3.4" + "@next/swc-linux-x64-musl" "15.3.4" + "@next/swc-win32-arm64-msvc" "15.3.4" + "@next/swc-win32-x64-msvc" "15.3.4" + sharp "^0.34.1" + +nimma@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/nimma/-/nimma-0.2.3.tgz#33cd6244ede857d9c8ac45b9d1aad07091559e45" + integrity sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA== + dependencies: + "@jsep-plugin/regex" "^1.0.1" + "@jsep-plugin/ternary" "^1.0.2" + astring "^1.8.1" + jsep "^1.2.0" + optionalDependencies: + jsonpath-plus "^6.0.1 || ^10.1.0" + lodash.topath "^4.5.2" + +nlcst-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz#05511e8461ebfb415952eb0b7e9a1a7d40471bd4" + integrity sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA== + dependencies: + "@types/nlcst" "^2.0.0" + +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^2.6.0, node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.1.tgz#751a20c8520e5725404c06015fea21d7567f25ef" + integrity sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ== + +object-assign@^4, object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@3.0.0, object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +oniguruma-parser@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz#82ba2208d7a2b69ee344b7efe0ae930c627dcc4a" + integrity sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w== + +oniguruma-to-es@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz#0b909d960faeb84511c979b1f2af64e9bc37ce34" + integrity sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA== + dependencies: + oniguruma-parser "^0.12.1" + regex "^6.0.1" + regex-recursion "^6.0.2" + +open@^8.0.4: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +openapi-types@12.1.3: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-any@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-4.0.0.tgz#0e9c8b0fa3e58cc79e6a1c6c715aa9326b6a4447" + integrity sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw== + dependencies: + p-cancelable "^3.0.0" + p-some "^6.0.0" + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-some@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-6.0.0.tgz#4613a822038abe125e42152ea9f7705a7967526f" + integrity sha512-CJbQCKdfSX3fIh8/QKgS+9rjm7OBNUTmwWswAFQAhc8j1NR1dsEDETUEuVUtQHZpV+J03LqWBEwvu0g1Yn+TYg== + dependencies: + aggregate-error "^4.0.0" + p-cancelable "^3.0.0" + +p-timeout@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + agent-base "^7.1.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" + +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== + dependencies: + "@types/unist" "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-latin@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse-latin/-/parse-latin-7.0.0.tgz#8dfacac26fa603f76417f36233fc45602a323e1d" + integrity sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ== + dependencies: + "@types/nlcst" "^2.0.0" + "@types/unist" "^3.0.0" + nlcst-to-string "^4.0.0" + unist-util-modify-children "^4.0.0" + unist-util-visit-children "^3.0.0" + vfile "^6.0.0" + +parse5@^7.0.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05" + integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== + dependencies: + entities "^6.0.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +patch-console@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-2.0.0.tgz#9023f4665840e66f40e9ce774f904a63167433bb" + integrity sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== + +pony-cause@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-1.1.1.tgz#f795524f83bebbf1878bd3587b45f69143cbf3f9" + integrity sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.1.0.tgz#003b63c6edde948766e40f3daf7e997ae43a5ce6" + integrity sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" + integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== + dependencies: + postcss-selector-parser "^6.1.1" + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@8.5.6, postcss@^8.4.23: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +property-information@^6.0.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== + +property-information@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" + integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-agent@^6.4.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.6" + lru-cache "^7.14.1" + pac-proxy-agent "^7.1.0" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.5" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +public-ip@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/public-ip/-/public-ip-5.0.0.tgz#b392fcc88552c3b36933a286068948816515f92a" + integrity sha512-xaH3pZMni/R2BG7ZXXaWS9Wc9wFlhyDVJF47IJ+3ali0TGv+2PsckKxbmo+rnx3ZxiV2wblVhtdS3bohAP6GGw== + dependencies: + dns-socket "^4.2.2" + got "^12.0.0" + is-ip "^3.1.0" + +pump@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" + integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +puppeteer-core@22.14.0: + version "22.14.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.14.0.tgz#5bb466adba725c966b0a86f0337a476d4c68ebec" + integrity sha512-rl4tOY5LcA3e374GAlsGGHc05HL3eGNf5rZ+uxkl6id9zVZKcwcp1Z+Nd6byb6WPiPeecT/dwz8f/iUm+AZQSw== + dependencies: + "@puppeteer/browsers" "2.3.0" + chromium-bidi "0.6.2" + debug "^4.3.5" + devtools-protocol "0.0.1312386" + ws "^8.18.0" + +puppeteer@22.14.0: + version "22.14.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.14.0.tgz#11697c929f5d9d7eac5a3438a0ff12dc65aedcbe" + integrity sha512-MGTR6/pM8zmWbTdazb6FKnwIihzsSEXBPH49mFFU96DNZpQOevCAZMnjBZGlZRGRzRK6aADCavR6SQtrbv5dQw== + dependencies: + "@puppeteer/browsers" "2.3.0" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1312386" + puppeteer-core "22.14.0" + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-reconciler@^0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.32.0.tgz#a08bcd8c454a4cd839164d6e05926e30a7a7fac2" + integrity sha512-2NPMOzgTlG0ZWdIf3qG+dcbLSoAc/uLfOwckc3ofy5sSK0pLJqnQLpUFxvGcN2rlXSjnVtGeeFLNimCQEj5gOQ== + dependencies: + scheduler "^0.26.0" + +react@19.2.3: + version "19.2.3" + resolved "https://registry.yarnpkg.com/react/-/react-19.2.3.tgz#d83e5e8e7a258cf6b4fe28640515f99b87cd19b8" + integrity sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA== + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recma-build-jsx@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz#c02f29e047e103d2fab2054954e1761b8ea253c4" + integrity sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew== + dependencies: + "@types/estree" "^1.0.0" + estree-util-build-jsx "^3.0.0" + vfile "^6.0.0" + +recma-jsx@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/recma-jsx/-/recma-jsx-1.0.1.tgz#58e718f45e2102ed0bf2fa994f05b70d76801a1a" + integrity sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w== + dependencies: + acorn-jsx "^5.0.0" + estree-util-to-js "^2.0.0" + recma-parse "^1.0.0" + recma-stringify "^1.0.0" + unified "^11.0.0" + +recma-parse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-parse/-/recma-parse-1.0.0.tgz#c351e161bb0ab47d86b92a98a9d891f9b6814b52" + integrity sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ== + dependencies: + "@types/estree" "^1.0.0" + esast-util-from-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +recma-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/recma-stringify/-/recma-stringify-1.0.0.tgz#54632030631e0c7546136ff9ef8fde8e7b44f130" + integrity sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g== + dependencies: + "@types/estree" "^1.0.0" + estree-util-to-js "^2.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regex-recursion@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-6.0.2.tgz#a0b1977a74c87f073377b938dbedfab2ea582b33" + integrity sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg== + dependencies: + regex-utilities "^2.3.0" + +regex-utilities@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" + integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== + +regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/regex/-/regex-6.1.0.tgz#d7ce98f8ee32da7497c13f6601fca2bc4a6a7803" + integrity sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg== + dependencies: + regex-utilities "^2.3.0" + +regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + +rehype-katex@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-7.0.1.tgz#832e6d7af2744a228981d1b0fe89483a9e7c93a1" + integrity sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA== + dependencies: + "@types/hast" "^3.0.0" + "@types/katex" "^0.16.0" + hast-util-from-html-isomorphic "^2.0.0" + hast-util-to-text "^4.0.0" + katex "^0.16.0" + unist-util-visit-parents "^6.0.0" + vfile "^6.0.0" + +rehype-minify-whitespace@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.2.tgz#7dd234ce0775656ce6b6b0aad0a6093de29b2278" + integrity sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-minify-whitespace "^1.0.0" + +rehype-parse@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-9.0.1.tgz#9993bda129acc64c417a9d3654a7be38b2a94c20" + integrity sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag== + dependencies: + "@types/hast" "^3.0.0" + hast-util-from-html "^2.0.0" + unified "^11.0.0" + +rehype-recma@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rehype-recma/-/rehype-recma-1.0.0.tgz#d68ef6344d05916bd96e25400c6261775411aa76" + integrity sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw== + dependencies: + "@types/estree" "^1.0.0" + "@types/hast" "^3.0.0" + hast-util-to-estree "^3.0.0" + +rehype-stringify@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-10.0.1.tgz#2ec1ebc56c6aba07905d3b4470bdf0f684f30b75" + integrity sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-html "^9.0.0" + unified "^11.0.0" + +remark-frontmatter@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz#b68d61552a421ec412c76f4f66c344627dc187a2" + integrity sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-frontmatter "^2.0.0" + micromark-extension-frontmatter "^2.0.0" + unified "^11.0.0" + +remark-gfm@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-gfm@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.1.tgz#33227b2a74397670d357bf05c098eaf8513f0d6b" + integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-math@6.0.0, remark-math@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-6.0.0.tgz#0acdf74675f1c195fea6efffa78582f7ed7fc0d7" + integrity sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-math "^3.0.0" + micromark-extension-math "^3.0.0" + unified "^11.0.0" + +remark-mdx-remove-esm@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/remark-mdx-remove-esm/-/remark-mdx-remove-esm-1.2.2.tgz#6901b691892c89d50abe35ad2fdec6c26af48091" + integrity sha512-YSaUwqiuJuD6S9XTAD6zmO4JJJZJgsRAdsl2drZO8/ssAVv0HXAg4vkSgHZAP46ORh8ERPFQrC7JWlbkwBwu1A== + dependencies: + "@types/mdast" "^4.0.4" + mdast-util-mdxjs-esm "^2.0.1" + unist-util-remove "^4.0.0" + +remark-mdx@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.0.1.tgz#8f73dd635c1874e44426e243f72c0977cf60e212" + integrity sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-mdx@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.1.0.tgz#f979be729ecb35318fa48e2135c1169607a78343" + integrity sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-mdx@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-3.1.1.tgz#047f97038bc7ec387aebb4b0a4fe23779999d845" + integrity sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg== + dependencies: + mdast-util-mdx "^3.0.0" + micromark-extension-mdxjs "^3.0.0" + +remark-parse@11.0.0, remark-parse@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" + integrity sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + micromark-util-types "^2.0.0" + unified "^11.0.0" + +remark-rehype@11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-rehype@^11.0.0: + version "11.1.2" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.2.tgz#2addaadda80ca9bd9aa0da763e74d16327683b37" + integrity sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-smartypants@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/remark-smartypants/-/remark-smartypants-3.0.2.tgz#cbaf2b39624c78fcbd6efa224678c1d2e9bc1dfb" + integrity sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA== + dependencies: + retext "^9.0.0" + retext-smartypants "^6.0.0" + unified "^11.0.4" + unist-util-visit "^5.0.0" + +remark-stringify@11.0.0, remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + +remark@15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/remark/-/remark-15.0.1.tgz#ac7e7563260513b66426bc47f850e7aa5862c37c" + integrity sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A== + dependencies: + "@types/mdast" "^4.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.22.2: + version "1.22.11" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" + integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== + dependencies: + is-core-module "^2.16.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-4.0.0.tgz#519560a4318975096def6e609d44100edaa4ccb9" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retext-latin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/retext-latin/-/retext-latin-4.0.0.tgz#d02498aa1fd39f1bf00e2ff59b1384c05d0c7ce3" + integrity sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA== + dependencies: + "@types/nlcst" "^2.0.0" + parse-latin "^7.0.0" + unified "^11.0.0" + +retext-smartypants@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/retext-smartypants/-/retext-smartypants-6.2.0.tgz#4e852c2974cf2cfa253eeec427c97efc43b5d158" + integrity sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ== + dependencies: + "@types/nlcst" "^2.0.0" + nlcst-to-string "^4.0.0" + unist-util-visit "^5.0.0" + +retext-stringify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/retext-stringify/-/retext-stringify-4.0.0.tgz#501d5440bd4d121e351c7c509f8507de9611e159" + integrity sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA== + dependencies: + "@types/nlcst" "^2.0.0" + nlcst-to-string "^4.0.0" + unified "^11.0.0" + +retext@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/retext/-/retext-9.0.0.tgz#ab5cd72836894167b0ca6ae70fdcfaa166267f7a" + integrity sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA== + dependencies: + "@types/nlcst" "^2.0.0" + retext-latin "^4.0.0" + retext-stringify "^4.0.0" + unified "^11.0.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.8.1: + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +safe-stable-stringify@^1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" + integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.4.tgz#f29c2bba80ce5b86f4343b4c2be9f2b96627cf8b" + integrity sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw== + +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== + +semver@7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +semver@^7.6.3, semver@^7.7.3: + version "7.7.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-12.0.0.tgz#aed3d5abff192c855707513929bf8bf48d712194" + integrity sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw== + dependencies: + type-fest "^4.31.0" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sharp-ico@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/sharp-ico/-/sharp-ico-0.1.5.tgz#5d263558adfb00903313db9403e20dc66ffcfa5b" + integrity sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q== + dependencies: + decode-ico "*" + ico-endec "*" + sharp "*" + +sharp@*, sharp@^0.34.1: + version "0.34.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.34.5.tgz#b6f148e4b8c61f1797bde11a9d1cfebbae2c57b0" + integrity sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg== + dependencies: + "@img/colour" "^1.0.0" + detect-libc "^2.1.2" + semver "^7.7.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.34.5" + "@img/sharp-darwin-x64" "0.34.5" + "@img/sharp-libvips-darwin-arm64" "1.2.4" + "@img/sharp-libvips-darwin-x64" "1.2.4" + "@img/sharp-libvips-linux-arm" "1.2.4" + "@img/sharp-libvips-linux-arm64" "1.2.4" + "@img/sharp-libvips-linux-ppc64" "1.2.4" + "@img/sharp-libvips-linux-riscv64" "1.2.4" + "@img/sharp-libvips-linux-s390x" "1.2.4" + "@img/sharp-libvips-linux-x64" "1.2.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.2.4" + "@img/sharp-libvips-linuxmusl-x64" "1.2.4" + "@img/sharp-linux-arm" "0.34.5" + "@img/sharp-linux-arm64" "0.34.5" + "@img/sharp-linux-ppc64" "0.34.5" + "@img/sharp-linux-riscv64" "0.34.5" + "@img/sharp-linux-s390x" "0.34.5" + "@img/sharp-linux-x64" "0.34.5" + "@img/sharp-linuxmusl-arm64" "0.34.5" + "@img/sharp-linuxmusl-x64" "0.34.5" + "@img/sharp-wasm32" "0.34.5" + "@img/sharp-win32-arm64" "0.34.5" + "@img/sharp-win32-ia32" "0.34.5" + "@img/sharp-win32-x64" "0.34.5" + +sharp@0.33.5, sharp@^0.33.1: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== + dependencies: + color "^4.2.3" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-darwin-x64" "0.33.5" + "@img/sharp-libvips-darwin-arm64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-arm64" "1.0.4" + "@img/sharp-libvips-linux-s390x" "1.0.4" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" + +shiki@^3.11.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-3.21.0.tgz#64686fe6bfc6b2b602d209eb6c8cdbc79d0eff22" + integrity sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w== + dependencies: + "@shikijs/core" "3.21.0" + "@shikijs/engine-javascript" "3.21.0" + "@shikijs/engine-oniguruma" "3.21.0" + "@shikijs/langs" "3.21.0" + "@shikijs/themes" "3.21.0" + "@shikijs/types" "3.21.0" + "@shikijs/vscode-textmate" "^10.0.2" + "@types/hast" "^3.0.4" + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.4, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +signal-exit@^3.0.2, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +simple-eval@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-eval/-/simple-eval-1.0.1.tgz#f91fc2b1583b7f5b972cdc088b769880087120a5" + integrity sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ== + dependencies: + jsep "^1.3.6" + +simple-swizzle@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz#a8d11a45a11600d6a1ecdff6363329e3648c3667" + integrity sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw== + dependencies: + is-arrayish "^0.3.1" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.2.tgz#adf7be70aa6d72162d907cd0e6d5c11f507b5403" + integrity sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socket.io-adapter@~2.5.2: + version "2.5.6" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz#c697f609d36a676a46749782274607d8df52c1d8" + integrity sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ== + dependencies: + debug "~4.4.1" + ws "~8.18.3" + +socket.io-parser@~4.2.4: + version "4.2.5" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.5.tgz#3f41b8d369129a93268f2abecba94b5292850099" + integrity sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.4.1" + +socket.io@4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002" + integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw== + dependencies: + accepts "~1.3.4" + base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" + +socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.7" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" + integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== + dependencies: + ip-address "^10.0.1" + smart-buffer "^4.2.0" + +source-map-js@^1.0.2, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map@^0.7.0: + version "0.7.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02" + integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +streamx@^2.15.0, streamx@^2.21.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.23.0.tgz#7d0f3d00d4a6c5de5728aecd6422b4008d66fd0b" + integrity sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg== + dependencies: + events-universal "^1.0.0" + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^7.0.0, string-width@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +stringify-entities@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + dependencies: + ansi-regex "^6.0.1" + +style-to-js@^1.0.0: + version "1.1.21" + resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.21.tgz#2908941187f857e79e28e9cd78008b9a0b3e0e8d" + integrity sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ== + dependencies: + style-to-object "1.0.14" + +style-to-object@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.14.tgz#1d22f0e7266bb8c6d8cae5caf4ec4f005e08f611" + integrity sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw== + dependencies: + inline-style-parser "0.2.7" + +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== + dependencies: + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.35.1" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1" + integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + tinyglobby "^0.2.11" + ts-interface-checker "^0.1.9" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.4.tgz#351d932273e6abfa75ce7d226b5bf3a6cb257c05" + integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tar-fs@^3.0.6: + version "3.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.1.tgz#4f164e59fb60f103d472360731e8c6bb4a7fe9ef" + integrity sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +tar@6.1.15: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tinyglobby@^0.2.11: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +to-data-view@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-data-view/-/to-data-view-1.1.0.tgz#08d6492b0b8deb9b29bdf1f61c23eadfa8994d00" + integrity sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + +trim-trailing-lines@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz#9aac7e89b09cb35badf663de7133c6de164f86df" + integrity sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg== + +trough@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.0, tslib@^2.8.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +twoslash-protocol@0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/twoslash-protocol/-/twoslash-protocol-0.3.6.tgz#841b7c6217ddec8a475a4e088b64cb9f80ef0fe3" + integrity sha512-FHGsJ9Q+EsNr5bEbgG3hnbkvEBdW5STgPU824AHUjB4kw0Dn4p8tABT7Ncg1Ie6V0+mDg3Qpy41VafZXcQhWMA== + +twoslash@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/twoslash/-/twoslash-0.3.6.tgz#cf647bfe138adf8c617002e4cbb2d4893b8ff832" + integrity sha512-VuI5OKl+MaUO9UIW3rXKoPgHI3X40ZgB/j12VY6h98Ae1mCBihjPvhOPeJWlxCYcmSbmeZt5ZKkK0dsVtp+6pA== + dependencies: + "@typescript/vfs" "^1.6.2" + twoslash-protocol "0.3.6" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^4.27.0, type-fest@^4.31.0: + version "4.41.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +unbzip2-stream@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== + +unified@11.0.5, unified@^11.0.0, unified@^11.0.4: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + +unist-builder@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-4.0.0.tgz#817b326c015a6f9f5e92bb55b8e8bc5e578fe243" + integrity sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-find-after@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz#3fccc1b086b56f34c8b798e1ff90b5c54468e896" + integrity sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-is@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-is@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" + integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-map@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-map/-/unist-util-map-4.0.0.tgz#29ab31b16d2760b2a31c71b2169500f5b00dbaac" + integrity sha512-HJs1tpkSmRJUzj6fskQrS5oYhBYlmtcvy4SepdDEEsL04FjBrgF0Mgggvxc1/qGBGgW7hRh9+UBK1aqTEnBpIA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-modify-children@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz#981d6308e887b005d1f491811d3cbcc254b315e9" + integrity sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw== + dependencies: + "@types/unist" "^3.0.0" + array-iterate "^2.0.0" + +unist-util-position-from-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz#d94da4df596529d1faa3de506202f0c9a23f2200" + integrity sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-remove-position@5.0.0, unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +unist-util-remove@4.0.0, unist-util-remove@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-4.0.0.tgz#94b7d6bbd24e42d2f841e947ed087be5c82b222e" + integrity sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-children@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz#4bced199b71d7f3c397543ea6cc39e7a7f37dc7e" + integrity sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit-parents@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz#777df7fb98652ce16b4b7cd999d0a1a40efa3a02" + integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + +unist-util-visit@5.0.0, unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +urijs@^1.19.11: + version "1.19.11" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== + +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utility-types@^3.10.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vfile-location@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-matter@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/vfile-matter/-/vfile-matter-5.0.1.tgz#3f701840dde13c68d72d5c5ebd9cf233dff84419" + integrity sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw== + dependencies: + vfile "^6.0.0" + yaml "^2.0.0" + +vfile-message@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.3.tgz#87b44dddd7b70f0641c2e3ed0864ba73e2ea8df4" + integrity sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@6.0.3, vfile@^6.0.0, vfile@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== + dependencies: + "@types/unist" "^3.0.0" + vfile-message "^4.0.0" + +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.19: + version "1.1.20" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +widest-line@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-5.0.0.tgz#b74826a1e480783345f0cd9061b49753c9da70d0" + integrity sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA== + dependencies: + string-width "^7.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98" + integrity sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.18.0: + version "8.19.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" + integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== + +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +ws@~8.18.3: + version "8.18.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" + integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + +xml2js@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.0.0, yaml@^2.3.4, yaml@^2.4.5: + version "2.8.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" + integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@17.7.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yoctocolors-cjs@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" + integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== + +yoga-layout@~3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/yoga-layout/-/yoga-layout-3.2.1.tgz#d2d1ba06f0e81c2eb650c3e5ad8b0b4adde1e843" + integrity sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ== + +zod-to-json-schema@3.20.4: + version "3.20.4" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.20.4.tgz#155f687c5a059fdc0f1bb3ff32d6e9200036b6f4" + integrity sha512-Un9+kInJ2Zt63n6Z7mLqBifzzPcOyX+b+Exuzf7L1+xqck9Q2EPByyTRduV3kmSPaXaRer1JCsucubpgL1fipg== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== + +zod@3.23.8: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==