diff --git a/.cspell.json b/.cspell.json index 6789aae2d..0b1023cae 100644 --- a/.cspell.json +++ b/.cspell.json @@ -27,39 +27,8 @@ } ], "words": [ - "npm", - "webpack", - "prettier", - "markdownlint", - "mdx", - "appkit", - "reown", - "solana", - "wagmi", - "siwe", - "viem", - "Farcaster", - "Nethereum", - "walletconnect", - "CAIP", - "deeplink", - "RDNS", - "siws", - "siwx", - "walletkit", - "Cocoapods", - "Podfile", - "Multichain", - "devnet", - "testflight", - "nuxt", - "jitpack", - "Linea", - "polkadot", - "anza", - "kadena", - "keccak", - "XRPL", + "npm","webpack","prettier","markdownlint","mdx","appkit","reown","solana","wagmi","siwe","viem","Farcaster","Nethereum","walletconnect","CAIP","deeplink", + "RDNS","siws","siwx","walletkit","Cocoapods","Podfile","Multichain","devnet","testflight","nuxt","jitpack","Linea","polkadot","anza","kadena","keccak","XRPL", "keypair","tezos","Starknet", "utxos", "litecoin", "hedera", "satoshi", "kusama", "westend", "statemint", "passwordless", "Blockhash", "UTXO", "PSBT", "keypair", "keypairs", "deeplinking", "chainlist", "pubspec","artefacts","artefact","artefactId", "WCURI", "qrcode", "ECDH", "ciphertext", "HMAC", "mutez", "rebranded", "clickjacking", "openupm", "walletids", "walletid", "Keyserver", "CAPI", @@ -68,7 +37,8 @@ "johnsmith", "secp", "reimagined", "tgvideo", "solflare", "WBIPs", "xverse", "mycustomwallet", "seedphrases", "Pimlico", "signup", "onramps", "rainbowkit", "connectkit", "stablecoins", "fulfilment", "tictactoe", "dollar", "supabase", "Frontmatter", "LLMSTXT", "tokenpocket", "imtoken", "kraken", "ronin", "exodus", "argent", "zerion", "oneinch", "crypto-com", "imtoken", "kraken", "ronin", "robinhood", "exodus", "argent", "tokenpocket", "nosocial", "bitget", "leather", "binance", "uniswap", "safepal", "bybit", "phantom", "ledger", "timeless-x", "safe", "zerion", "oneinch", "crypto-com", "imtoken", "kraken", "ronin", "robinhood", "exodus", "argent", "tokenpocket", "Contractaddress", - "executionreverted", "FATF", "VASP", "LLMSTXT", "Frontmatter", "CASP", "DKMS" + "executionreverted", "FATF", "VASP", "LLMSTXT", "Frontmatter", "CASP", "DKMS", "hydradx", "phala", "astar", "mangata", "polkadotjs", "Dogecoin", "Blockbook", "vuejs", "xsmall", "rgba", "mintlify", "filteredwallets", + "tnum","minmax","toolkits", "autoplay", "Litoshi", "Litoshis", "encryptor's", "Everscale", "Bitcore", "satoshis", "Parachain", "Bitcore", "walletlist", "Userflow", "retryable", "USDS", "Arbirtrum" ] } diff --git a/README.md b/README.md index 2a31c904b..cac66266f 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,17 @@ We welcome contributions to improve our documentation! Here's how you can help: To run the documentation locally, you'll need to have Node.js installed on your machine. Then follow these steps: +1. Install dependencies: + ```bash + pnpm install + ``` +2. Run the development server: + ```bash + pnpm run dev + ``` + +or + 1. Install the Mintlify CLI globally: ```bash npm install -g mintlify @@ -71,6 +82,19 @@ The development server will automatically reload when you make changes to the do - Include code examples where appropriate - Test all code snippets to ensure they work as expected +### Building a project with AI? + +If you're using Cursor IDE (or another AI-based IDE) to build a project with Reown AppKit, we provide a `.mdc` file that enhances your development experience. The `reown-appkit.mdc` file in this repository contains Cursor-specific rules and type hints for Reown AppKit. + +To use it in your project: + +1. Copy the `reown-appkit.mdc` file from this repository +2. Create a `.cursor/rules` folder in your project's root directory (if it doesn't exist) +3. Place the `.mdc` file in your project's `.cursor/rules` folder + +For more info, refer to [Cursor's documentation](https://docs.cursor.com/context/rules#project-rules). + + ### Need Help? If you have any questions or need help with your contribution, please: diff --git a/advanced/multichain/polkadot/wallet-integration-guide.mdx b/advanced/multichain/polkadot/wallet-integration-guide.mdx index b33e5548d..d80f8db15 100644 --- a/advanced/multichain/polkadot/wallet-integration-guide.mdx +++ b/advanced/multichain/polkadot/wallet-integration-guide.mdx @@ -171,7 +171,7 @@ walletKit.on("session_request", async (requestEvent) => { # Sessions Persistence/Management -- sessions can be saved/stored so users dont have to pair repeatedly +- sessions can be saved/stored so users don't have to pair repeatedly - sessions can be disconnected from using `await walletKit.disconnectSession({ topic: topic });` passing the session topic. - sessions can be extended using `await walletKit.extendSession({ topic: topic });` passing the session topic. - Default session lifetime is 7 days for WalletConnect v2.0. diff --git a/advanced/multichain/rpc-reference/everscale-rpc.mdx b/advanced/multichain/rpc-reference/everscale-rpc.mdx index 4139ae8bd..da4fb9dcd 100644 --- a/advanced/multichain/rpc-reference/everscale-rpc.mdx +++ b/advanced/multichain/rpc-reference/everscale-rpc.mdx @@ -111,7 +111,7 @@ Message that can then be sent to the blockchain. ##### Returns: 1. signedExtMessage - signed external message; - 2. expireAt - мessage expiration timestamp + 2. expireAt - message expiration timestamp ##### Example: @@ -208,7 +208,7 @@ Sends an internal message from the user account without waiting for the transact 1. hash: string - external message hash; 2. account: string - destination account address (equals to source_address); - 3. expireAt: number - мessage expiration timestamp + 3. expireAt: number - message expiration timestamp ##### Example: @@ -259,7 +259,7 @@ Sends an external message to the contract without waiting for the transaction. 1. hash: string - external message hash; 2. account: string - destination account address (equals to source_address); - 3. expireAt: number - мessage expiration timestamp + 3. expireAt: number - message expiration timestamp ##### Example: diff --git a/appkit/android/core/one-click-auth.mdx b/appkit/android/core/one-click-auth.mdx index 358f189b1..9882f29db 100644 --- a/appkit/android/core/one-click-auth.mdx +++ b/appkit/android/core/one-click-auth.mdx @@ -70,6 +70,15 @@ If the wallet connecting to your dapp does not support One-Click Auth, the SDK w The latest release of AppKit supports link mode, a low latency mechanism for transporting One-Click Auth requests and session requests over universal links, reducing the need for a WebSocket connection with the Relay. This significantly enhances the user experience when connecting native dApps to native wallets by reducing the latency associated with networking connections, especially when the user has an unstable internet connection. + + + + To support link mode, configure your AppMetaData `appLink` with a valid universal link and set the `linkMode` property to `true`: ```kotlin @@ -112,6 +121,17 @@ Ensure that your App Link is properly configured in your app's Manifest file wit ``` +#### How does it look without Link Mode? + + + + + For more information on how to configure app links for your app, refer to the [Android Documentation](https://developer.android.com/training/app-links/verify-android-applinks). For enabling links to app content check [this](https://developer.android.com/training/app-links/deep-linking) documentation page. diff --git a/appkit/features/siwx/default.mdx b/appkit/authentication/siwx/default.mdx similarity index 74% rename from appkit/features/siwx/default.mdx rename to appkit/authentication/siwx/default.mdx index 108bb8d35..19c81e3e1 100644 --- a/appkit/features/siwx/default.mdx +++ b/appkit/authentication/siwx/default.mdx @@ -1,16 +1,26 @@ --- -title: Authentication (SIWX) -sidebarTitle: Sign in with X (SIWX) +title: Multichain Authentication (SIWX) +sidebarTitle: Multichain Authentication (SIWX) --- -## Introduction +The **Sign In With X** feature enables decentralized applications (Dapps) to authenticate users seamlessly across multiple blockchain networks, such as Ethereum, Solana, and Bitcoin, since this feature is **chain agnostic**. -The **Sign In With X** feature enables decentralized applications (Dapps) to authenticate users seamlessly across multiple blockchain networks, such as Ethereum, Polygon or Solana. This feature allows developers using our SDK to implement authentication by having users sign a unique string message with their blockchain wallets. The **Sign In With X** feature is designed in accordance with the [CAIP-122](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-122.md) standard, which establishes a chain-agnostic framework for blockchain-based authentication and authorization on off-chain services. - - +This feature allows developers using our SDK to implement authentication by having users sign a unique string message with their blockchain wallets. The **Sign In With X** feature is designed in accordance with the [CAIP-122](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-122.md) standard, which establishes a chain-agnostic framework for blockchain-based authentication and authorization on off-chain services. + + + - +## Demo + + + + ## Getting Started @@ -33,6 +43,10 @@ Read more about the [Default Implementation](./siwx-default). The Cloud Auth SIWX is a predefined implementation of the SIWX configuration plugin that uses the Cloud service to create and manage SIWX messages and sessions. With Cloud Auth SIWX, you will be able to see and control the sessions of your users using the [User Management Dashboard](/cloud/user-management). + +Cloud Auth SIWX is only available for `eip155` compatible networks. + + Read more about the [Cloud Auth Implementation](./siwx-cloud-auth). ### Custom Implementation diff --git a/appkit/features/siwx/siwx-cloud-auth.mdx b/appkit/authentication/siwx/siwx-cloud-auth.mdx similarity index 100% rename from appkit/features/siwx/siwx-cloud-auth.mdx rename to appkit/authentication/siwx/siwx-cloud-auth.mdx diff --git a/appkit/features/siwx/siwx-custom.mdx b/appkit/authentication/siwx/siwx-custom.mdx similarity index 100% rename from appkit/features/siwx/siwx-custom.mdx rename to appkit/authentication/siwx/siwx-custom.mdx diff --git a/appkit/features/siwx/siwx-default.mdx b/appkit/authentication/siwx/siwx-default.mdx similarity index 100% rename from appkit/features/siwx/siwx-default.mdx rename to appkit/authentication/siwx/siwx-default.mdx diff --git a/appkit/authentication/socials.mdx b/appkit/authentication/socials.mdx index 7ca22eaf5..c6652f23c 100644 --- a/appkit/authentication/socials.mdx +++ b/appkit/authentication/socials.mdx @@ -5,7 +5,20 @@ sidebarTitle: Email & Social Login Bring your app to a world of new users in minutes with default Email and Social login, giving both new and existing users the ability to seamlessly connect to your app using just an email address or social account. With minimal code changes, you can customize these options to suit your needs and use Smart Account functionality in minutes. - + + + + +## Demo + +Want to see social login in action? Try out the live demo to experience the seamless social login flow firsthand. + + ## Supported Providers diff --git a/appkit/features/chain-abstraction.mdx b/appkit/features/chain-abstraction.mdx new file mode 100644 index 000000000..632046b3e --- /dev/null +++ b/appkit/features/chain-abstraction.mdx @@ -0,0 +1,78 @@ +--- +title: Chain Abstraction +--- + +Chain Abstraction is a feature in Reown AppKit that enables dApps to facilitate seamless cross-chain transactions for users. It allows users to spend crypto tokens, such as stablecoins, across different blockchain networks without needing to manually bridge tokens, worry about network-specific tokens, or manage multiple wallets. + + +Chain Abstraction is currently an early access feature. + + + + + + +## Demo + +Want to see Chain Abstraction in action? Try out the live demo to experience Reown AppKit's Chain Abstraction flow firsthand. + + + + + +## When can you leverage Chain Abstraction? + +1. **Seamless Cross-Chain Transactions**: Users can transact on a target blockchain network even if their assets reside on a different source network. For example, a user can make a payment on the Base network using USDC held on Arbitrum. + +2. **Enhanced User Experience**: By abstracting the complexities of cross-chain interactions, dApps can offer a more intuitive and frictionless experience, reducing the need for users to understand or manage the underlying blockchain infrastructure. + +3. **Developer-Friendly Integration**: Reown AppKit provides a set of tools and methods, such as prepare and execute, that allow developers to integrate chain abstraction functionality into their dApps with minimal effort. + +## How It Works + +- **Transaction Preparation**: When a user initiates a transaction, the dApp uses the prepare method to determine if the user has sufficient funds on the target network. If not, it identifies the necessary bridging transactions required to move assets from the source to the target network. + +- **Transaction Execution**: Once the necessary transactions are prepared and signed, the execute method broadcasts them, handling the bridging process and completing the original transaction on the target network. + +- **Gas Estimation Handling**: To ensure accurate gas estimation, dApps should pass gas: null when sending transactions, allowing the wallet to handle gas calculations appropriately. + +## Networks and Assets Supported + +Currently, Chain Abstraction on AppKit supports the following assets on the following networks: + +| Network | Assets | +|-----------|-----------------| +| Optimism | USDC, USDT, ETH | +| Arbitrum | USDC, USDT, ETH | +| Base | USDC, USDS, ETH | +| Solana | USDC | + + +## Example Use Case + +Consider a scenario where a user wants to **purchase an NFT on the Base network but holds USDC only on the Arbitrum network**. With Chain Abstraction: + +- The dApp detects the asset location and prepares the necessary bridging transactions. + +- The user signs the transactions, and the assets are bridged from Arbitrum to Base. + +- The purchase is completed on the Base network without the user manually bridging assets or switching networks. + +You can try out this use case in the [demo above](#demo). + +## Get Started + + + + Get started with AppKit in React. + + + + Get started with AppKit in Next.js. + + diff --git a/appkit/features/onramp.mdx b/appkit/features/onramp.mdx index 41089aa9a..7e8956980 100644 --- a/appkit/features/onramp.mdx +++ b/appkit/features/onramp.mdx @@ -4,11 +4,13 @@ title: On-Ramp On-Ramp securely provides users access to over 100 cryptocurrencies from right within your app. In just a few clicks, users can purchase tokens to support in-app activity and transactions across multiple chains. Set up in minutes with just one line of code. - + + +## Demo + + + + ## Get Started @@ -59,15 +61,15 @@ Once connected, select "Buy Crypto" from the wallet modal. ### Choose your provider -Select "Coinbase" as your provider. +Select "Coinbase" or "Meld" as your provider. - + ### Complete your purchase -Complete your purchase using Coinbase Pay. You will be prompted to sign in to your Coinbase account. +Complete your purchase using your selected provider. You will be prompted to sign in to your Coinbase or Meld account. If the payment page does not appear, you can copy link from the wallet modal and paste it in your browser. @@ -76,7 +78,7 @@ If the payment page does not appear, you can copy link from the wallet modal and ### Select assets and amount -Choose the asset and amount you would like to purchase from Coinbase. +Choose the asset and amount you would like to purchase from your selected provider. diff --git a/appkit/features/smart-sessions.mdx b/appkit/features/smart-sessions.mdx new file mode 100644 index 000000000..225375221 --- /dev/null +++ b/appkit/features/smart-sessions.mdx @@ -0,0 +1,85 @@ +--- +title: Automated Onchain Actions (Smart Sessions) +sidebarTitle: Automated Onchain Actions (Smart Sessions) +--- + +Smart Sessions is a feature in Reown AppKit that allows users to grant decentralized applications (dApps) permission to perform specific blockchain actions on their behalf for a defined period of time. This eliminates the need for users to manually approve each transaction, enhancing the user experience by enabling seamless and automated interactions. + + +Smart Sessions is currently an early access feature. + + + + + + +## Demo + +Want to see Smart Sessions in action? Try out the live demo to experience Reown AppKit's Smart Sessions flow firsthand. + + +In order to try out the demo, you need to use the email login flow. If your email is test@gmail.com, enter it as test+smart-sessions@gmail.com. + + + + + + +## When can you leverage Smart Sessions? + +1. **Uninterrupted User Experience**: Users can authorize transactions to occur in the background, reducing friction and enhancing engagement, especially in contexts like gaming or decentralized finance (DeFi). + +2. **Enhanced Automation**: Web3 apps can automate routine tasks such as token swaps, staking, or loan repayments without requiring user intervention for each action. + +3. **Flexible Permissions**: Users can specify which functions a dApp is allowed to execute, the duration of the permissions, and other conditions, providing fine-grained control over delegated actions. + +## How It Works + +- **Permission Granting**: The user connects their wallet (e.g., via email) and grants the dApp permission to perform certain actions by approving a grantPermissions request. + +- **Server Interaction**: The dApp's backend server can then execute the authorized functions on behalf of the user by signing transactions using a predefined key pair. + +- **Transaction Execution**: The server prepares and sends the transactions to the blockchain, and can monitor their status to confirm successful execution. + +## Example Use Cases + +- **Recurring Payments**: Automate subscription renewals without requiring user approval each time. + +- **Automated Trading**: Set up limit orders or dollar-cost averaging strategies that execute based on predefined conditions. + +- **In-Game Transactions**: Allow games to perform actions like purchasing items or allocating resources without interrupting gameplay. + +## Supported Networks + +Currently, Smart Sessions are supported on Ethereum Sepolia and Base Sepolia. + +It will soon be available on Base Mainnet and all EVM chains supported by AppKit's [Smart Accounts](/appkit/features/smart-accounts). + + +Looking to add support for other networks? Contact sales@reown.com. + + +## Get Started + + + + Get started with AppKit in React. + + + + Get started with AppKit in Next.js. + + + + Get started with AppKit in Vue. + + + + Get started with AppKit in JavaScript. + + \ No newline at end of file diff --git a/appkit/features/swaps.mdx b/appkit/features/swaps.mdx index bc3ab0b38..6e6acc13f 100644 --- a/appkit/features/swaps.mdx +++ b/appkit/features/swaps.mdx @@ -2,7 +2,7 @@ title: Swaps --- -Enable users to easily switch between crypto assets without leaving your app. With Swaps, users can easily and securely swap tokens right within your app via the AppKit Modal. Set up in minutes with just one line of code. +With Swaps, they can securely exchange crypto tokens right inside your app using the AppKit Modal. **The setup takes just one line of code**. diff --git a/appkit/flutter/core/actions.mdx b/appkit/flutter/core/actions.mdx index aca31bf20..8493bccfa 100644 --- a/appkit/flutter/core/actions.mdx +++ b/appkit/flutter/core/actions.mdx @@ -17,20 +17,28 @@ ValueListenableBuilder( ``` -### - Launch the current wallet +### Launch block explorer -If you connected your dApp through deep linking to a Wallet app you can launch that wallet app with the following: +You can open the selected chain's block explorer easily: ```javascript -_appKitModal.launchConnectedWallet(); +_appKitModal.launchBlockExplorer(); ``` -### - Launch block explorer +### - Reconnect relay -You can open the selected chain's block explorer easily: +In most cases it shouldn't be needed as it is called internally but this method is useful to reconnect the relay when internet connection is back after inactivity. ```javascript -_appKitModal.launchBlockExplorer(); +await _appKitModal.reconnectRelay(); +``` + +### - Load account data such as balance and identity + +In most cases it shouldn't be needed as it is called internally but this method is useful to reload account data such as balance and identity. Particularly useful after a transaction. + +```javascript +await _appKitModal.loadAccountData(); ``` ### - Send an RPC request @@ -75,6 +83,16 @@ _appKitModal.getApprovedMethods(); _appKitModal.getApprovedEvents(); ``` +### - Request switch to or add chain + +If you add a new chain on an ongoing session you should call `requestSwitchToChain()` so the wallet can add it as well. Otherwise it will just be not usable. +`requestAddChain()` is called automatically by `requestSwitchToChain()` in case of failing with the proper error from the wallet. + +```javascript +await _appKitModal.requestSwitchToChain(ReownAppKitModalNetworkInfo newChain); +await _appKitModal.requestAddChain(ReownAppKitModalNetworkInfo newChain); +``` + ### - Interact with Smart Contracts diff --git a/appkit/flutter/core/custom-chains.mdx b/appkit/flutter/core/custom-chains.mdx index 0c9f88880..26b84f2e8 100644 --- a/appkit/flutter/core/custom-chains.mdx +++ b/appkit/flutter/core/custom-chains.mdx @@ -10,6 +10,11 @@ This means that if you intend to support just EVM and Solana networks then no fu However, with extra configuration to `ReownAppKitModalNetworks` and `optionalNamespaces` you can connect to whatever other network you'd like. + +If you are starting from scratch, you can avoid this by using our [CLI tool](https://pub.dev/packages/reown_cli) and passing the chains you want to support as arguments. + + + For instance, if you want to support also Polkadot blockchain then first add Polkadot to the supported networks list: ```javascript diff --git a/appkit/flutter/core/email.mdx b/appkit/flutter/core/email.mdx index e8f6fc1c6..680198e6d 100644 --- a/appkit/flutter/core/email.mdx +++ b/appkit/flutter/core/email.mdx @@ -4,6 +4,15 @@ title: Email & Social Wallets AppKit enables passwordless Web3 onboarding and authentication, allowing your users interact with your application by creating a non-custodial wallet with just their emails or social accounts. + + + + Remember to whitelist your dapp's iOS's bundleId and Android's packageName in your cloud configuration. @@ -12,15 +21,15 @@ Remember to whitelist your dapp's iOS's bundleId and Android's packageName in yo 3. Add your iOS Bundle ID and your Android Package Name - + Email and Social login are supported only on EVM networks and Solana. - + ## Integration In order to support Email and Social Wallets creation just set `featuresConfig:` parameter in `ReownAppKitModal` initialization. -```javascript {14-23} +```javascript {14-27} final _appKitModal = ReownAppKitModal( context: context, projectId: '{YOUR_PROJECT_ID}', @@ -35,26 +44,29 @@ final _appKitModal = ReownAppKitModal( ), ), featuresConfig: FeaturesConfig( - email: true, socials: [ - AppKitSocialOption.Farcaster, + AppKitSocialOption.Email, AppKitSocialOption.X, + AppKitSocialOption.Google, AppKitSocialOption.Apple, AppKitSocialOption.Discord, + AppKitSocialOption.GitHub, + AppKitSocialOption.Facebook, + AppKitSocialOption.Twitch, + AppKitSocialOption.Telegram, ], - showMainWallets: false, + showMainWallets: false, // OPTIONAL - true by default ), ); ``` ## Options -- **_email `bool`_** : This boolean defines whether you want to enable email login. Default `true` -- **_socials `List`_** : This list contains the list of social platforms that you want to enable for user authentication. The platforms in the example include Farcaster, X, Discord. Is empty by default, it means that no social options is enabled. -- **showMainWallets `bool`\_** : This boolean defines whether you want to show the main wallet options on the first connect screen. If this is `false` it will show a button that directs you to a new screen displaying all available wallets. Default `true`. +- **_socials `List`_** : This list contains the list of social platforms that you want to enable for user authentication. Is empty by default, it means that no social options is enabled. The buttons in the modal will be shown in the same order you configure the list. +- **_showMainWallets `bool`_** : This boolean defines whether you want to show the main wallet options on the first connect screen. If this is `false` it will show a button that directs you to a new screen displaying all available wallets. Default `true`. -In order for Email Wallet to work properly, either `AppKitModalConnectButton()` or `AppKitModalAccountButton()` has to be instantiated during the whole lifetime of the app. +In order for Farcaster to work properly, either `AppKitModalConnectButton()` or `AppKitModalAccountButton()` has to be instantiated during the whole lifetime of the app. If you already use them then nothing else has to be done, but in case you don't use them but still want to support Email & Social Wallets you would have to instantiate and hide them as follows: @@ -72,10 +84,6 @@ AppKitModalAccountButton( ## User Flow -1. Users will be able to connect to you application by simply using an email address. AppKit will send to them a One Time Password (OTP) to copy and paste in the modal, which will help to verify the user's authenticity. This will create a non-custodial wallet for your user which will be available in any application that integrates AppKit and Email Wallets. - -2. Eventually the user can optionally choose to move from a non-custodial wallet to a self-custodial one by pressing "Upgrade Wallet" on AppKit. This will open the (Reown secure website) that will walk your user through the upgrading process. +1. Users can connect to your application using either an email address or a social login option. Upon selecting an option, they will be redirected to a secure login page in the device’s default browser. If the Email option is selected, AppKit will first send an approval link to the user's email, followed by a One-Time Password (OTP) to be used in the login flow. This process helps verify the user’s identity. In both cases, whether using Email or Social login, a non-custodial wallet will be created for the user. This wallet will be accessible across any application that integrates AppKit and Email Wallets. - -Due to Safari’s strict third-party cookie policies, the SDK is not preserving sessions after the app is terminated (removed from memory). So upon app termination the user will have to re-authenticate themselves through a new OTP code if they want to sign. Our team is working to solve this issue soon. - +2. Eventually, users can optionally choose to upgrade from a non-custodial wallet to a self-custodial one by tapping “Upgrade Wallet” in AppKit. This action opens the Reown secure website, which guides the user through the upgrade process. diff --git a/appkit/flutter/core/installation.mdx b/appkit/flutter/core/installation.mdx index 6e54cd95a..6477d6275 100644 --- a/appkit/flutter/core/installation.mdx +++ b/appkit/flutter/core/installation.mdx @@ -9,9 +9,9 @@ Let's get started with the installation and configuration! ## Installation - + If you are just starting a new project, you can use our [CLI tool](https://pub.dev/packages/reown_cli) to get started quickly. - + 1. - Add `reown_appkit` as dependency in your `pubspec.yaml` and run `flutter pub get` (check out the [latest version](https://pub.dev/packages/reown_appkit/install)) - Or simply run `flutter pub add reown_appkit` @@ -79,8 +79,6 @@ Example: -
- ### Coinbase Wallet support Coinbase Wallet does not use the WalletConnect protocol for communication between the dApp and the wallet. diff --git a/appkit/flutter/core/link-mode.mdx b/appkit/flutter/core/link-mode.mdx index 786434017..a3d3ac782 100644 --- a/appkit/flutter/core/link-mode.mdx +++ b/appkit/flutter/core/link-mode.mdx @@ -6,6 +6,15 @@ AppKit Link Mode is a low latency mechanism for transporting One-Click Auth requ By enabling it, the wallet and dapp will communicate through declared Universal Links on iOS and/or App Links on Android **even without an internet connection.** + + + + For Link Mode to work fully, you also need to enable the [One-Click Auth + Sign In With Ethereum](./siwe) feature. @@ -51,6 +60,17 @@ void _onLinkCaptured(String link) async { } ``` +### How does it look without Link Mode? + + + + + ### Platform specifics: diff --git a/appkit/flutter/core/options.mdx b/appkit/flutter/core/options.mdx index 21b6915d1..8ec270102 100644 --- a/appkit/flutter/core/options.mdx +++ b/appkit/flutter/core/options.mdx @@ -4,6 +4,7 @@ title: Options ```javascript final _appKitModal = ReownAppKitModal( + logLevel: LogLevel.error, context: context, projectId: '{YOUR_PROJECT_ID}', metadata: const PairingMetadata( @@ -14,7 +15,7 @@ final _appKitModal = ReownAppKitModal( redirect: Redirect( // OPTIONAL native: 'exampleapp://', universal: 'https://reown.com/exampleapp', - linkMode: false, + linkMode: true|false, ), ), // disconnectOnDispose: false, @@ -25,12 +26,19 @@ final _appKitModal = ReownAppKitModal( // socials: [...], // OPTIONAL - empty by default // showMainWallets: true, // OPTIONAL - true by default // ), - // getBalanceFallback: () async { }, OPTIONAL - null by default - // requiredNamespaces: {}, OPTIONAL - null by default - // optionalNamespaces: {}, OPTIONAL - null by default - // featuredWalletIds: {}, OPTIONAL - null by default - // includedWalletIds: {}, OPTIONAL - null by default - // excludedWalletIds: {}, OPTIONAL - null by default + // getBalanceFallback: () async { }, // OPTIONAL - null by default + // requiredNamespaces: {}, // OPTIONAL - null by default + // optionalNamespaces: {}, // OPTIONAL - null by default + // featuredWalletIds: {}, // OPTIONAL - null by default + // includedWalletIds: {}, // OPTIONAL - null by default + // excludedWalletIds: {}, // OPTIONAL - null by default + // customWallets: [ // OPTIONAL - null by default + // ReownAppKitModalWalletInfo( + // listing: AppKitModalWalletListing( + // ... + // ), + // ), + // ], ); ``` @@ -56,7 +64,7 @@ This callback method will be triggered if getting the balance from our blockchai These are the set of namespaces that will be requested to the wallet you are connecting to. -These values are optionals and, in most cases, not required since AppKit already defines every required and optional namespace internally based on configured networks. +These values are optional and, in most cases, not required, as AppKit already defines all required and optional namespaces internally based on the configured networks (EVM and Solana by default). However, if you would want to override that definition with your own or support more networks than just EVM and Solana (i.e. Polkadot, Kadena, etc...) these are the object you should modify. See [Custom Networks](../core/custom-chains). section. @@ -96,3 +104,27 @@ final Set excludedWalletIds = { 'fd20dc426fb37566d803205b19bbc1d4096b248ac04548e3cfb6b3a38bd033aa', // Coinbase Wallet } ``` + +### customWallets: + +A list of user defined wallets. Example: + +```javascript +customWallets: [ + ReownAppKitModalWalletInfo( + listing: AppKitModalWalletListing( + id: '00001', + name: 'Reown Web Sample', + homepage: 'https://react-wallet.walletconnect.com', + imageId: + 'https://avatars.githubusercontent.com/u/179229932?s=200&v=4', + order: 1, + webappLink: 'https://react-wallet.walletconnect.com', + ), + ), +], +``` + +### disconnectOnDispose: + +Whether if you want to disconnect the user when disposing the context that holds your modal instance \ No newline at end of file diff --git a/appkit/flutter/core/usage.mdx b/appkit/flutter/core/usage.mdx index f3ad712cf..63a2f0318 100644 --- a/appkit/flutter/core/usage.mdx +++ b/appkit/flutter/core/usage.mdx @@ -23,6 +23,7 @@ In order to initialize `ReownAppKitModal()` instance you must provide a _project ```javascript // AppKit Modal instance final _appKitModal = ReownAppKitModal( + logLevel: LogLevel.error, context: context, projectId: '{YOUR_PROJECT_ID}', metadata: const PairingMetadata( @@ -30,12 +31,24 @@ final _appKitModal = ReownAppKitModal( description: 'Example app description', url: 'https://example.com/', icons: ['https://example.com/logo.png'], - redirect: Redirect( // OPTIONAL + redirect: Redirect( native: 'exampleapp://', universal: 'https://reown.com/exampleapp', linkMode: true|false, ), ), + enableAnalytics: true, + siweConfig: SIWEConfig(...), + featuresConfig: FeaturesConfig(...), + getBalanceFallback: () async {}, + disconnectOnDispose: true|false, + customWallets: [ + ReownAppKitModalWalletInfo( + listing: AppKitModalWalletListing( + ... + ), + ), + ], ); // Register here the event callbacks on the service you'd like to use. See `Events` section. diff --git a/appkit/ios/core/one-click-auth.mdx b/appkit/ios/core/one-click-auth.mdx index 7afcbbdaa..1bf0d212b 100644 --- a/appkit/ios/core/one-click-auth.mdx +++ b/appkit/ios/core/one-click-auth.mdx @@ -4,12 +4,12 @@ title: One-Click Auth / SIWE AppKit provides a simple solution for integrating with "Sign In With Ethereum" (SIWE), a form of authentication that enables users to control their digital identity with their Ethereum account. SIWE is a standard also known as EIP-4361. -### One-Click Auth +## One-Click Auth One-Click Auth represents a key advancement within WalletConnect v2, streamlining the user authentication process in AppKit by enabling them to seamlessly connect with a wallet and sign a SIWE message with just one click. Connecting a wallet, proving control of an address with an off-chain signature, authorizing specific actions. These are the kinds of authorizations that can be encoded as "ReCaps". ReCaps are permissions for a specific website or dapp that can be compactly encoded as a long string in the message you sign and translated by any wallet into a straight-forward one-sentence summary. WalletConnect uses permissions expressed as ReCaps to enable a One-Click Authentication. -### Configure your AppKit Client +## Configure your AppKit Client To integrate SIWE with AppKit, you need to configure your AppKit client using `AuthRequestParams`, which are required to create a SIWE message for the user to sign: @@ -19,6 +19,7 @@ AppKit.configure( authRequestParams: authRequestParams, ... ) +``` #### Example of AuthRequestParams @@ -64,6 +65,15 @@ AppKit.instance.authResponsePublisher.sink { (id, result) in The latest release of AppKit supports link mode, a low latency mechanism for transporting 1-click auth requests and session requests over universal links, eliminating the need for a WebSocket connection with the Relay. This significantly enhances the user experience when connecting native dApps to native wallets by reducing the latency associated with networking connections, especially when the user has an unstable internet connection. + + + + To support link mode, configure your AppMetadata.Redirect with a valid universal link and set the linkMode property to true: ```swift @@ -79,6 +89,17 @@ AppKit.configure( ) ``` +#### How does it look without Link Mode? + + + + + For more information on how to configure universal links for your app, refer to the [Apple Documentation](https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content?language=objc). For a debugging guide, visit the [Debugging Universal Links](https://developer.apple.com/documentation/technotes/tn3155-debugging-universal-links) page. diff --git a/appkit/javascript/core/actions.mdx b/appkit/javascript/core/actions.mdx index 6767aa48c..31d4fb1ad 100644 --- a/appkit/javascript/core/actions.mdx +++ b/appkit/javascript/core/actions.mdx @@ -1,9 +1,11 @@ +--- +title: Actions +--- + import WagmiActions from "/snippets/appkit/javascript/wagmi/actions.mdx"; import EthersActions from "/snippets/appkit/javascript/ethers/actions.mdx"; import SolanaActions from "/snippets/appkit/javascript/solana/actions.mdx"; -# Actions - Actions are functions that will help you control the modal, subscribe to wallet events and interact with them and smart contracts. ## Open and close the modal @@ -36,6 +38,16 @@ modal.open({ view: "Connect", namespace: "bip122" }); // to connect and show only ethereum wallets modal.open({ view: "Connect", namespace: "eip155" }); + +// to open swap with arguments +open({ + view: 'Swap', + arguments: { + amount: '321.123', + fromToken: 'USDC', + toToken: 'ETH' + } +}) ``` List of views you can select @@ -135,6 +147,80 @@ const modal = createAppKit({ wagmiConfig, projectId }); const themeMode = modal.getThemeMode(); ``` + +## Wallet Buttons + + +Using wallet buttons ([Demo in our Lab](https://appkit-lab.reown.com/library/wagmi-wallet-button/)), you can directly connect to the top 20 wallets, WalletConnect QR and also all the social logins. +This feature allows to customize dApps, enabling users to connect their wallets effortlessly, all without the need for the traditional modal. + +Follow these steps to use the component: + +1. Install the package: + + + +```bash npm +npm install @reown/appkit-wallet-button +``` + +```bash Yarn +yarn add @reown/appkit-wallet-button +``` + +```bash Bun +bun a @reown/appkit-wallet-button +``` + +```bash pnpm +pnpm add @reown/appkit-wallet-button +``` + + + +2. Import the library in your project and create the AppKit Wallet Button: + +```tsx +import { createAppKitWalletButton } from '@reown/appkit-wallet-button' + +// Create AppKit Wallet Button +const appKitWalletButton = createAppKitWalletButton() +``` + +3. Use this script for your Button called 'walletButton': + +```tsx +document.getElementById('walletButton')?.addEventListener( + 'click', async () => { + // check if it's ready + if (appKitWalletButton.isReady()) { + appKitWalletButton + .connect('walletConnect') + .then(data => { + console.log('connected', data) + }) + .catch(err => { + console.log('error connecting', err) + }) + } else { + console.log('appKitWalletButton is not ready') + } + } +) + + +``` + +#### Options for wallet property. +Change the string parameter `name` from `appKitWalletButton.connect(name)` in order to open a different wallet. + +| Type | Options | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| QR Code | `walletConnect` | +| Wallets | `metamask`, `trust`, `coinbase`, `rainbow`, `coinbase`, `jupiter`, `solflare`, `coin98`, `magic-eden`, `backpack`, `frontier`, `xverse`, `okx`, `bitget`, `leather`, `binance`, `uniswap`, `safepal`, `bybit`, `phantom`, `ledger`, `timeless-x`, `safe`, `zerion`, `oneinch`, `crypto-com`, `imtoken`, `kraken`, `ronin`, `robinhood`, `exodus`, `argent`, and `tokenpocket` | +| Social logins | `google`, `github`, `apple`, `facebook`, `x`, `discord`, and `farcaster` | + + ## themeVariables Set the `themeVariables` after creating the modal diff --git a/appkit/javascript/core/custom-connectors.mdx b/appkit/javascript/core/custom-connectors.mdx index 94656b9db..71ad4b4ee 100644 --- a/appkit/javascript/core/custom-connectors.mdx +++ b/appkit/javascript/core/custom-connectors.mdx @@ -1,6 +1,8 @@ -# Custom connectors +--- +title: Custom connectors +--- -Add custom connectors for Ethers or Wagmi +In AppKit, a 'connector' is the bridge between your app and a user's wallet. This page shows how to add custom connectors beyond the default ones, allowing your users to connect with additional wallet types and authentication methods. @@ -16,8 +18,9 @@ import { createAppKit } from '@reown/appkit' import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' import { reconnect, http, createConfig } from '@wagmi/core' import { CreateConnectorFn } from 'wagmi' -import { sepolia } from '@reown/appkit/networks' -import { walletConnect, coinbaseWallet, injected } from 'wagmi/connectors' +import { abstractTestnet } from '@reown/appkit/networks' +// you need to add the abstract library in order to make it work +import { abstractWalletConnector } from "@abstract-foundation/agw-react/connectors"; const projectId = 'YOUR_PROJECT_ID' @@ -27,22 +30,11 @@ const metadata = { // create the connectors (delete the ones you don't need) const connectors: CreateConnectorFn[] = [] -connectors.push(walletConnect({ projectId, metadata, showQrModal: false })) // showQrModal must be false -connectors.push(injected({ shimDisconnect: true })) -connectors.push( - coinbaseWallet({ - appName: metadata.name, - appLogoUrl: metadata.icons[0] - }) -) +connectors.push(abstractWalletConnector()) -export const networks = [sepolia] +export const networks = [abstractTestnet] export const wagmiAdapter = new WagmiAdapter({ - storage: - transports: { - [sepolia.id]: http() - }, connectors, projectId, networks @@ -53,72 +45,11 @@ export const config = wagmiAdapter.wagmiConfig createAppKit({ adapters: [wagmiAdapter], projectId, - networks: [sepolia] + networks }) ``` - - - -Coming soon... - - - -Add custom wallet adapters for Solana wallets by first installing the wallet adapter package and then including the adapters in the wallets array. You can find a more Solana wallet adapters [here](https://github.com/anza-xyz/wallet-adapter/tree/master/packages/wallets). - - - -```bash npm -npm install @solana/wallet-adapter-wallets -``` - -```bash Yarn -yarn add @solana/wallet-adapter-wallets -``` - -```bash Bun -bun a @solana/wallet-adapter-wallets -``` - -```bash pnpm -pnpm add @solana/wallet-adapter-wallets -``` - - -```ts -import { createAppKit } from "@reown/appkit"; -import { SolanaAdapter } from "@reown/appkit-adapter-solana"; -import { solana, solanaTestnet, solanaDevnet } from "@reown/appkit/networks"; - -import { - SolflareWalletAdapter, - PhantomWalletAdapter, -} from "@solana/wallet-adapter-wallets"; - -// 0. Set up Solana adapter -const solanaWeb3JsAdapter = new SolanaAdapter({ - wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()], -}); - -// 1. Get projectId from https://cloud.reown.com -const projectId = "YOUR_PROJECT_ID"; - -// 2. Set up the metadata -const metadata = { - //... -}; - -// 3. Create modal -const modal = createAppkit({ - adapters: [solanaWeb3JsAdapter], - networks: [solana, solanaTestnet, solanaDevnet], - metadata: metadata, - projectId, - features: { - analytics: true, - }, -}); -``` +Check our JavaScript Wagmi demo in [Github](https://github.com/reown-com/appkit-web-examples/) diff --git a/appkit/javascript/core/installation.mdx b/appkit/javascript/core/installation.mdx index e5506f39f..37e38f3cb 100644 --- a/appkit/javascript/core/installation.mdx +++ b/appkit/javascript/core/installation.mdx @@ -161,7 +161,7 @@ Create a new project on Reown Cloud at https://cloud.reown.com and obtain a new -Check the Javascript wagmi example +Check the JavaScript wagmi example @@ -174,7 +174,7 @@ Check the Javascript wagmi example -Check the Javascript ethers example +Check the JavaScript ethers example @@ -182,7 +182,7 @@ Check the Javascript ethers example -Check the Javascript Solana example +Check the JavaScript Solana example @@ -190,7 +190,7 @@ Check the Javascript Solana example -Check the Javascript Bitcoin example +Check the JavaScript Bitcoin example diff --git a/appkit/javascript/core/theming.mdx b/appkit/javascript/core/theming.mdx index 7f9c8b064..f9be7060a 100644 --- a/appkit/javascript/core/theming.mdx +++ b/appkit/javascript/core/theming.mdx @@ -1,5 +1,7 @@ -import Theming from "/snippets/appkit/shared/theming.mdx"; +--- +title: Theming +--- -# Theming +import Theming from "/snippets/appkit/shared/theming.mdx"; diff --git a/appkit/javascript/notifications/backend-integration.mdx b/appkit/javascript/notifications/backend-integration.mdx index afc5a2f88..919f14ecd 100644 --- a/appkit/javascript/notifications/backend-integration.mdx +++ b/appkit/javascript/notifications/backend-integration.mdx @@ -1,4 +1,6 @@ -# Backend Integration +--- +title: Backend Integration +--- Once an account is subscribed to your app's notifications you can test sending notifications to the account. You can subscribe in your app directly with our [Frontend Integration](frontend-integration/usage), or with one of the below testing options. diff --git a/appkit/javascript/notifications/demo.mdx b/appkit/javascript/notifications/demo.mdx index 1118aaa78..67f33a499 100644 --- a/appkit/javascript/notifications/demo.mdx +++ b/appkit/javascript/notifications/demo.mdx @@ -1,4 +1,6 @@ -# Demo +--- +title: Demo +--- ## Try Web3Inbox diff --git a/appkit/javascript/notifications/frontend-integration/examples.mdx b/appkit/javascript/notifications/frontend-integration/examples.mdx index 671312ae4..801c28bb6 100644 --- a/appkit/javascript/notifications/frontend-integration/examples.mdx +++ b/appkit/javascript/notifications/frontend-integration/examples.mdx @@ -1,4 +1,6 @@ -# Examples +--- +title: Examples +--- - Our production [GM App](https://gm.walletconnect.com) which sends daily "gm!" notifications to all subscribers. - [React GM Dapp](https://github.com/WalletConnect/gm-dapp) - a Web3Inbox Dapp using React, Typescript, Next.js & Ethers. diff --git a/appkit/javascript/notifications/frontend-integration/migration-guide.mdx b/appkit/javascript/notifications/frontend-integration/migration-guide.mdx index f077d5171..cb19c394b 100644 --- a/appkit/javascript/notifications/frontend-integration/migration-guide.mdx +++ b/appkit/javascript/notifications/frontend-integration/migration-guide.mdx @@ -1,6 +1,8 @@ -import Migration from "/snippets/appkit/shared/notifications/frontend-integration/migration/javascript.mdx"; +--- +title: Migration Guide +--- -# Migration Guide +import Migration from "/snippets/appkit/shared/notifications/frontend-integration/migration/javascript.mdx"; ## General Migration notes @@ -11,4 +13,4 @@ import Migration from "/snippets/appkit/shared/notifications/frontend-integratio ## Migrating from 0.x to 1.0.0 - \ No newline at end of file + diff --git a/appkit/javascript/notifications/frontend-integration/usage.mdx b/appkit/javascript/notifications/frontend-integration/usage.mdx index 4bef972b1..72ae0e5fc 100644 --- a/appkit/javascript/notifications/frontend-integration/usage.mdx +++ b/appkit/javascript/notifications/frontend-integration/usage.mdx @@ -1,8 +1,10 @@ +--- +title: Usage +--- + import Installation from "/snippets/appkit/shared/notifications/frontend-integration/usage/installation/javascript.mdx"; import Example from "/snippets/appkit/shared/notifications/frontend-integration/usage/example/javascript.mdx"; -# Usage - AppKit Notifications provides you the building blocks necessary to allow users to subscribe, receive notifications, and manage notification preferences, all from your app's UI. The Web3Inbox SDK supports both React hooks and JavaScript-based integrations. Before begin using Web3Inbox, you will first need to [setup your project](../cloud-setup) to send notifications. diff --git a/appkit/javascript/payments/pay-with-exchange.mdx b/appkit/javascript/payments/pay-with-exchange.mdx new file mode 100644 index 000000000..77fe5a19c --- /dev/null +++ b/appkit/javascript/payments/pay-with-exchange.mdx @@ -0,0 +1,110 @@ +--- +title: AppKit Pay with Exchange - Javascript +sidebarTitle: Pay with Exchange +--- + +**AppKit Pay with Exchange** unlocks a powerful new flow: users can pay in crypto directly from their Centralized Exchange (CEXs) accounts like Binance or Coinbase, with no new wallets, no app switching, and no lost conversions. + +## Quick Start +Here you can find a simplify process to integrate AppKit Pay with Javascript SDK: + + + Projects first need to install and set up Reown AppKit before integrating AppKit Pay. If you haven't done so, please refer to the [Reown AppKit docs](/appkit/overview#quickstart). + + +### Install the library + + + Projects currently using Reown AppKit to enable self-custodial wallet payments in their own checkout flows are encouraged to switch to AppKit Pay for a simpler integration and significantly improved user experience. AppKit Pay can be found in `@reown/appkit-pay` npm package. + + + + +```bash npm +npm install @reown/appkit-pay +``` + +```bash Yarn +yarn add @reown/appkit-pay +``` + +```bash Bun +bun a @reown/appkit-pay +``` + +```bash pnpm +pnpm add @reown/appkit-pay +``` + + +### Usage +```ts +import { usePay } from '@reown/appkit-pay'; +import { baseSepoliaETH } from '@reown/appkit-pay' +``` + +In order to run the payment, we are using the function `openPay`. + +```ts +// --- Open Modal --- +await openPay({ + recipient: addressRecipient, + amount: 0.0001, + paymentAsset: baseSepoliaETH +}); +``` + + +## Assets Configuration + +For the moment, AppKit Pay has pre-configured these assets: baseETH, baseSepoliaETH, and baseUSDC. + +```ts +import { baseETH, baseSepoliaETH, baseUSDC } from '@reown/appkit-pay' +``` + +For custom assets, you can create a paymentAsset object with all the information: + +```ts +// Configure the paymentAsset +const paymentAssetDetails = { + network: 'eip155:8453', // Base Mainnet + asset: 'native', // Or USDC in Base: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' + metadata: { + name: 'Ethereum', // Or 'USD Coin' + symbol: 'ETH', // Or 'USDC' + decimals: 18 // Or 6 for USDC + } +}; +``` + +## Functions + +### openPay +Opens the payment modal. Resolves when the modal is closed by the user or programmatically. + +`openPay(amount, addressRecipient, options: PaymentOptions): Promise` + +### getExchanges +Fetches available exchanges. + +`getExchanges(page?: number): Promise<{ exchanges: Exchange[], total: number }>` + +### getPayResult +Use with caution regarding timing; subscriptions are preferred. + +`getPayResult(): PayResult | null` + +Returns the result of the last successful payment. + +### getPayError +Use with caution regarding timing; subscriptions are preferred. + +`getPayError(): AppKitPayErrorMessage | null` + +Returns the error object if the last payment failed. + +### getIsPaymentInProgress +Checks if a payment is currently processing. + +`getIsPaymentInProgress(): boolean` \ No newline at end of file diff --git a/appkit/javascript/transactions/sponsored-transactions.mdx b/appkit/javascript/transactions/sponsored-transactions.mdx index f6286fb1d..7f1e2f57f 100644 --- a/appkit/javascript/transactions/sponsored-transactions.mdx +++ b/appkit/javascript/transactions/sponsored-transactions.mdx @@ -1,6 +1,7 @@ +--- +title: Sponsored Transactions +--- import SponsoredTransactions from "/snippets/appkit/shared/sponsored-transactions.mdx"; -# Sponsored Transactions - diff --git a/appkit/javascript/transactions/swaps.mdx b/appkit/javascript/transactions/swaps.mdx index 1d128f410..dddffedcc 100644 --- a/appkit/javascript/transactions/swaps.mdx +++ b/appkit/javascript/transactions/swaps.mdx @@ -1,5 +1,7 @@ -import Swaps from "/snippets/appkit/shared/swaps.mdx"; +--- +title: Swaps +--- -# Swaps +import Swaps from "/snippets/appkit/shared/swaps.mdx"; - \ No newline at end of file + diff --git a/appkit/next/core/custom-connectors.mdx b/appkit/next/core/custom-connectors.mdx index 692584f06..2f604a9a6 100644 --- a/appkit/next/core/custom-connectors.mdx +++ b/appkit/next/core/custom-connectors.mdx @@ -2,7 +2,7 @@ title: Custom connectors --- -Add custom connectors for Ethers or Wagmi +In AppKit, a 'connector' is the bridge between your app and a user's wallet. This page shows how to add custom connectors beyond the default ones, allowing your users to connect with additional wallet types and authentication methods. @@ -18,8 +18,9 @@ import { createAppKit } from '@reown/appkit/react' import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' import { http, WagmiProvider, CreateConnectorFn } from 'wagmi' -import { sepolia } from '@reown/appkit/networks' -import { walletConnect, coinbaseWallet, injected } from 'wagmi/connectors' +import { abstractTestnet } from '@reown/appkit/networks' +// you need to add the abstract library in order to make it work +import { abstractWalletConnector } from "@abstract-foundation/agw-react/connectors"; import { QueryClient, QueryClientProvider } from '@tanstack/react-query' const queryClient = new QueryClient() @@ -30,24 +31,13 @@ const metadata = { //... } -// create the connectors (delete the ones you don't need) +// create the custom connector (in this example Abastract) const connectors: CreateConnectorFn[] = [] -connectors.push(walletConnect({ projectId, metadata, showQrModal: false })) // showQrModal must be false -connectors.push(injected({ shimDisconnect: true })) -connectors.push( - coinbaseWallet({ - appName: metadata.name, - appLogoUrl: metadata.icons[0] - }) -) +connectors.push(abstractWalletConnector()) -export const networks = [sepolia] +export const networks = [abstractTestnet] export const wagmiAdapter = new WagmiAdapter({ - storage: - transports: { - [sepolia.id]: http() - }, connectors, projectId, networks @@ -58,7 +48,7 @@ export const config = wagmiAdapter.wagmiConfig createAppKit({ adapters: [wagmiAdapter], projectId, - networks: [sepolia] + networks }) export function ContextProvider({ children }) { @@ -70,68 +60,8 @@ export function ContextProvider({ children }) { } ``` - - - -Coming soon... +Check our Next.js Wagmi demo in [Github](https://github.com/reown-com/appkit-web-examples/) - -Add custom wallet adapters for Solana wallets by first installing the wallet adapter package and then including the adapters in the wallets array. You can find a more Solana wallet adapters [here](https://github.com/anza-xyz/wallet-adapter/tree/master/packages/wallets). - - - -```bash npm -npm install @solana/wallet-adapter-wallets -``` - -```bash Yarn -yarn add @solana/wallet-adapter-wallets -``` - -```bash Bun -bun a @solana/wallet-adapter-wallets -``` - -```bash pnpm -pnpm add @solana/wallet-adapter-wallets -``` - -```ts -import { createAppKit } from "@reown/appkit/react"; -import { SolanaAdapter } from "@reown/appkit-adapter-solana/react"; -import { solana, solanaTestnet, solanaDevnet } from "@reown/appkit/networks"; - -import { - SolflareWalletAdapter, - PhantomWalletAdapter, -} from "@solana/wallet-adapter-wallets"; - -// 0. Set up Solana adapter -const solanaWeb3JsAdapter = new SolanaAdapter({ - wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()], -}); - -// 1. Get projectId from https://cloud.reown.com -const projectId = "YOUR_PROJECT_ID"; - -// 2. Set up the metadata -const metadata = { - //... -}; - -// 3. Create the modal -const modal = createAppKit({ - adapters: [solanaWeb3JsAdapter], - networks: [solana, solanaTestnet, solanaDevnet], - metadata: metadata, - projectId, - features: { - analytics: true, - }, -}); -``` - - diff --git a/appkit/next/core/hooks.mdx b/appkit/next/core/hooks.mdx index 714888190..f0d8244a3 100644 --- a/appkit/next/core/hooks.mdx +++ b/appkit/next/core/hooks.mdx @@ -8,11 +8,54 @@ import Ethers5Hooks from "/snippets/appkit/next/ethers5/hooks.mdx"; import SolanaHooks from "/snippets/appkit/next/solana/hooks.mdx"; import OpenModal from "/snippets/appkit/next/core/open.mdx"; -Hooks are functions that will help you control the modal, subscribe to wallet events and interact with them and smart contracts. +Hooks are React functions that provide access to wallet connection features, modal controls, blockchain interactions, and wallet event subscriptions. They enable you to manage wallet connections, handle user authentication, interact with smart contracts, and respond to wallet events in your application. + +## Hook Ecosystem + +AppKit provides a comprehensive set of React hooks that work together to provide a complete wallet connection and blockchain interaction experience. These hooks can be categorized into several functional groups: + +- **Connection Hooks**: Manage wallet connections and user authentication (`useAppKit`, `useAppKitAccount`, `useDisconnect`) +- **Network Hooks**: Handle blockchain network selection and information (`useAppKitNetwork`) +- **UI Control Hooks**: Control the modal and UI elements (`useAppKitState`, `useAppKitTheme`) +- **Data Access Hooks**: Access wallet and blockchain data (`useAppKitBalance`, `useWalletInfo`) +- **Event Hooks**: Subscribe to wallet and connection events (`useAppKitEvents`) + +The diagram below illustrates how these hooks relate to each other and to the core AppKit functionality: + +```mermaid +graph TD + AppKit[AppKit Core] --> ConnHooks[Connection Hooks] + AppKit --> NetworkHooks[Network Hooks] + AppKit --> UIHooks[UI Control Hooks] + AppKit --> DataHooks[Data Access Hooks] + AppKit --> EventHooks[Event Hooks] + + ConnHooks --> useAppKit + ConnHooks --> useAppKitAccount + ConnHooks --> useDisconnect + ConnHooks --> useAppKitWallet + + NetworkHooks --> useAppKitNetwork + + UIHooks --> useAppKitState + UIHooks --> useAppKitTheme + + DataHooks --> useWalletInfo + DataHooks --> useAppKitBalance + + EventHooks --> useAppKitEvents + + useAppKit -.-> useAppKitAccount + useAppKitAccount -.-> useAppKitBalance + useAppKitNetwork -.-> useAppKitBalance + useAppKitWallet -.-> useAppKitAccount +``` + +These hooks provide a modular way to integrate wallet functionality into your application, allowing you to use only the features you need. ## useAppKit -Hook for controlling the modal. +The primary hook for controlling the modal's visibility and behavior. Use this hook when you need to programmatically open or close the modal, or when you want to show specific views like the connection screen or account details. ```ts import { useAppKit } from "@reown/appkit/react"; @@ -22,6 +65,12 @@ export default function Component() { } ``` +### Use Cases +- Opening the modal when a user clicks a "Connect Wallet" button +- Closing the modal after a successful connection +- Opening specific views of the modal (e.g., account view, connect view) +- Handling custom wallet connection flows + ### Returns - `open`: Function to open the modal @@ -33,7 +82,7 @@ export default function Component() { ## useAppKitAccount -Hook for accessing account data and connection status. +The essential hook for accessing wallet connection state and user information. Use this hook whenever you need to know if a user is connected, get their wallet address, or access their embedded wallet details. ```ts import { useAppKitAccount } from "@reown/appkit/react"; @@ -42,6 +91,16 @@ const { address, isConnected, caipAddress, status, embeddedWalletInfo } = useAppKitAccount(); ``` +### Use Cases +- Displaying the connected wallet address in your UI +- Checking if a user is connected before showing certain features +- Getting user information for embedded wallets +- Handling multi-chain scenarios where you need account info for specific chains + + + Related hooks: [useAppKitWallet](#useappkitwallet), [useDisconnect](#usedisconnect) + + Hook for accessing account data and connection status for each namespace when working in a multi-chain environment. ```ts @@ -64,8 +123,8 @@ const bip122Account = useAppKitAccount({ namespace: "bip122" }); // for bitcoin ```typescript type EmbeddedWalletInfo { user: { - username: string - email: string + email?: string | null | undefined + username?: string | null | undefined }, accountType: 'eoa' | 'smartAccount', authProvider: 'google' | 'apple' | 'facebook' | 'x' | 'discord' | 'farcaster' | 'github' | 'email', @@ -84,9 +143,103 @@ type UseAppKitAccountReturnType = { } ``` +## useAppKitWallet + + + + + +The direct wallet connection hook that enables connectivity to specific wallets without opening the modal. Use this hook when you want to provide direct wallet buttons, create a customized wallet selection interface, or implement social login options. + +Using the wallet button hooks ([Demo in our Lab](https://appkit-lab.reown.com/library/wagmi-wallet-button/)), you can directly connect to the top 20 wallets, WalletConnect QR and also all the social logins. +This hook allows to customize dApps, enabling users to connect their wallets effortlessly, all without the need to open the traditional modal. +Execute this command to install the library for use it: + + + +```bash npm +npm install @reown/appkit-wallet-button +``` + +```bash Yarn +yarn add @reown/appkit-wallet-button +``` + +```bash Bun +bun a @reown/appkit-wallet-button +``` + +```bash pnpm +pnpm add @reown/appkit-wallet-button +``` + + + +Then you have to import the hook in your project: + +```tsx +import { useAppKitWallet } from "@reown/appkit-wallet-button/react"; +``` + +And finally, you can use the hook in your project: + +```tsx +const { isReady, isPending, connect } = useAppKitWallet({ + onSuccess(parsedCaipAddress) { + // Access the parsed CAIP address object + // See: https://github.com/reown-com/appkit/blob/main/packages/common/src/utils/ParseUtil.ts#L3-L7 + // ... + }, + onError(error) { + // ... + } + }) + +... + +// Connect to WalletConnect + } ``` @@ -285,7 +261,7 @@ function HomePage() { Learn more about Reown AppKit [here](../react/core/installation) - + Use your own button to open the modal @@ -300,7 +276,7 @@ document.getElementById('my-button').addEventListener('click', () => { Learn more about Reown AppKit JavaScript [here](../javascript/core/installation) - + Use your own button to open the modal @@ -374,14 +350,13 @@ Unlike in v5, `modal.switchNetwork` takes the chain object as parameter rather t - (v5) - switchNetwork(137) -> switches the chain to Polygon as we are passing Polygon's chain id. - (Reown AppKit v1) - switchNetwork(polygon) -> `polygon` is imported from `@reown/appkit/networks`. -```tsx -/* highlight-delete-start */ +```tsx {4-6} +// Remove the following code line modal.switchNetwork(137); -/* highlight-delete-end */ -/* highlight-add-start */ + +// Add the following code lines import { polygon } from "@reown/appkit/networks"; modal.switchNetwork(polygon); -/* highlight-add-end */ ```
diff --git a/appkit/upgrade/to-reown-appkit-ethers5-web.mdx b/appkit/upgrade/to-reown-appkit-ethers5-web.mdx index b5038e05a..41aa042cb 100644 --- a/appkit/upgrade/to-reown-appkit-ethers5-web.mdx +++ b/appkit/upgrade/to-reown-appkit-ethers5-web.mdx @@ -1,7 +1,6 @@ --- -pagination_next: appkit/react/core/installation title: Migrate from Web3Modal v5 to Reown AppKit Solana -displayed_sidebar: mainSidebar +sidebarTitle: AppKit Ethers v5 --- # Upgrade Guide @@ -66,7 +65,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-ethers5 > - + You can start the AppKit configuration by using either the **default** or **advanced** mode. @@ -77,17 +76,15 @@ Make sure to set your configuration outside React components to avoid unwanted r Start by importing `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```tsx -/* highlight-delete-start */ +```tsx {5-9} +// Remove the following imports - import { createWeb3Modal, defaultConfig } from '@web3modal/ethers5/react' - import { arbitrum, mainnet } from 'viem/chains' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit/react' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { Ethers5Adapter } from '@reown/appkit-adapter-ethers5' -/* highlight-add-end */ ``` Then, remove the `defaultConfig` function that is being imported from the Ethers package in your code. @@ -103,20 +100,17 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* highlight-delete-start */ -+ const ethersConfig = defaultConfig({ ... }) -/* highlight-delete-end */ +// Remove the following code line +- const ethersConfig = defaultConfig({ ... }) ``` Finally, set up the `Ethers5Adapter` and pass the other parameters to `createAppKit` function. -```tsx -/* highlight-delete-start */ +```tsx {4-13} +// Remove the following code line - createWeb3Modal({ ... }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit/react' +// Add the following code lines + createAppKit({ adapters: [new Ethers5Adapter()], networks: [mainnet, arbitrum], @@ -126,11 +120,10 @@ Finally, set up the `Ethers5Adapter` and pass the other parameters to `createApp analytics: true, } }) -/* highlight-add-end */ ``` - + You can start the AppKit configuration by using either the **default** or **advanced** mode. @@ -141,16 +134,14 @@ Make sure to set your configuration outside React components to avoid unwanted r Start by importing `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```tsx -/* highlight-delete-start */ -import { createWeb3Modal, defaultConfig } from "@web3modal/ethers5/vue"; -/* highlight-delete-end */ - -/* highlight-add-start */ -import { createAppKit } from "@reown/appkit/vue"; -import { arbitrum, mainnet } from "@reown/appkit/networks"; -import { Ethers5Adapter } from "@reown/appkit-adapter-ethers5"; -/* highlight-add-end */ +```tsx {4-7} +// Remove the following imports +- import { createWeb3Modal, defaultConfig } from "@web3modal/ethers5/vue"; + +// Add the following imports ++ import { createAppKit } from "@reown/appkit/vue"; ++ import { arbitrum, mainnet } from "@reown/appkit/networks"; ++ import { Ethers5Adapter } from "@reown/appkit-adapter-ethers5"; ``` Then, remove the `defaultConfig` function that is being imported from the Ethers package in your code. @@ -166,21 +157,17 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* highlight-delete-start */ +// Remove the following code line - const ethersConfig = defaultConfig({ ... }) -/* highlight-delete-end */ ``` Finally, set up the `Ethers5Adapter` and pass the other parameters to `createAppKit` function. -```tsx -/* highlight-delete-start */ +```tsx {4-13} +// Remove the following code line - createWeb3Modal({ ethersConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit/vue' -// import { EthersAdapter } from '@reown/appkit-adapter-ethers5' +// Add the following code lines + const modal = createAppKit({ adapters: [new Ethers5Adapter()], networks: [mainnet, arbitrum], @@ -190,26 +177,23 @@ Finally, set up the `Ethers5Adapter` and pass the other parameters to `createApp analytics: true, } }) -/* highlight-add-end */ ``` - + Start by importing AppKit packages, then create Ethers5Adapter using your own settings or the default presets as shown below. Import `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```ts -/* highlight-delete-start */ -import { createWeb3Modal, defaultConfig } from '@web3modal/ethers5' -/* highlight-delete-end */ +```ts {4-8} +// Remove the following imports +- import { createWeb3Modal, defaultConfig } from '@web3modal/ethers5' -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { EthersAdapter } from '@reown/appkit-adapter-ethers5' -/* highlight-add-end */ ``` Then, remove the `defaultConfig` function that is being imported from the Ethers package in your code. @@ -225,25 +209,21 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Ethers Config */ -/* highlight-delete-start */ +// Remove the existing Ethers Config - const ethersConfig = defaultConfig({ ... }) -/* highlight-delete-end */ ``` Finally, set up the `Ethers5Adapter` and pass the other parameters to `createAppKit` function. -```ts -/* highlight-delete-start */ +```ts {9-18} +// Remove the following code line - const modal = createWeb3Modal({ ethersConfig, projectId, enableAnalytics: true }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit' +// Add the following code lines + const modal = createAppKit({ adapters: [new Ethers5Adapter()], networks: [mainnet, arbitrum], @@ -253,7 +233,6 @@ Finally, set up the `Ethers5Adapter` and pass the other parameters to `createApp analytics: true } }) -/* highlight-add-end */ ``` @@ -265,19 +244,16 @@ Finally, set up the `Ethers5Adapter` and pass the other parameters to `createApp > - + -```tsx -/* highlight-delete-start */ +```tsx {4-9} +// Remove the following import - import { useWeb3Modal } from '@web3modal/ethers5/react' -/* highlight-delete-end */ -/* highlight-add-start */ -+ import { useAppKit } from '@reown/appkit/react' -/* highlight-add-end */ +// Add the following import ++ import { useAppKit } from '@reown/appkit/react' function HomePage() { const { open } = useAppKit() - return } ``` @@ -285,7 +261,7 @@ function HomePage() { Learn more about Reown AppKit [here](../react/core/installation) - + Use your own button to open the modal. @@ -300,7 +276,7 @@ document.getElementById('my-button').addEventListener('click', () => { Learn more about Reown AppKit JavaScript [here](../javascript/core/installation) - + Use your own button to open the modal. @@ -374,14 +350,13 @@ Unlike in v5, `modal.switchNetwork` takes the chain object as parameter rather t - (v5) - switchNetwork(137) -> switches the chain to Polygon as we are passing Polygon's chain id. - (Reown AppKit v1) - switchNetwork(polygon) -> `polygon` is imported from `@reown/appkit/networks`. -```tsx -/* highlight-delete-start */ +```tsx {4-6} +// Remove the following code line modal.switchNetwork(137); -/* highlight-delete-end */ -/* highlight-add-start */ + +// Add the following code lines import { polygon } from "@reown/appkit/networks"; modal.switchNetwork(polygon); -/* highlight-add-end */ ```
diff --git a/appkit/upgrade/to-reown-appkit-solana-web.mdx b/appkit/upgrade/to-reown-appkit-solana-web.mdx index 33ae85656..2ceb8f82f 100644 --- a/appkit/upgrade/to-reown-appkit-solana-web.mdx +++ b/appkit/upgrade/to-reown-appkit-solana-web.mdx @@ -1,7 +1,6 @@ --- -pagination_next: appkit/react/core/installation title: Migrate from Web3Modal v5 to Reown AppKit Solana -displayed_sidebar: mainSidebar +sidebarTitle: AppKit Solana --- # Upgrade Guide @@ -44,19 +43,19 @@ Next, install the Reown AppKit and Solana wallet adapter packages. ```bash npm -npm install @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets +npm install @reown/appkit @reown/appkit-adapter-solana ``` ```bash Yarn -yarn add @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets +yarn add @reown/appkit @reown/appkit-adapter-solana ``` ```bash Bun -bun a @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets +bun a @reown/appkit @reown/appkit-adapter-solana ``` ```bash pnpm -pnpm add @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets +pnpm add @reown/appkit @reown/appkit-adapter-solana ``` @@ -66,50 +65,33 @@ pnpm add @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-walle > - + Make sure you update the imports in your codebase to reflect the new package names. -```tsx -/* highlight-delete-start */ + +```tsx {4-9} +// Remove the following imports - import { createWeb3Modal, defaultSolanaConfig, useWeb3ModalAccount, useWeb3ModalProvider } from '@web3modal/solana/react' - import { solana, solanaTestnet, solanaDevnet } from '@web3modal/solana/chains' -/* highlight-delete-end */ - -/_ highlight-add-start _/ - -- import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks - - ' - -- import { createAppKit } from '@reown/appkit/react - ' - -- import { SolanaAdapter } from '@reown/appkit-adapter-solana/react - - ' - -- import { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets' -/* highlight-add-end * - - / +// Add the following imports ++ import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks' ++ import { createAppKit } from '@reown/appkit/react' ++ import { SolanaAdapter } from '@reown/appkit-adapter-solana/react' +``` -```` Now, set up the Solana Adapter and the modal. The `chains` property is now `networks` in Reown AppKit. You should import them from `@reown/appkit/networks` package instead of importing these networks other packages. The `metadata` and the `projectId` are the same as before. -```tsx -/* highlight-delete-start */ +```tsx {5-15} +// Remove the following code lines - const solanaConfig = defaultSolanaConfig({ ... }); -- createWeb3Modal( ... }); -/* highlight-delete-end */ +- createWeb3Modal( ... ); -/* highlight-add-start */ -+ const solanaAdapter = new SolanaAdapter({ -+ wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()] -+ }) +// Add the following code lines ++ const solanaAdapter = new SolanaAdapter() + const modal = createAppKit({ + projectId, @@ -117,38 +99,21 @@ The `metadata` and the `projectId` are the same as before. + networks: [solana, solanaTestnet, solanaDevnet], + adapters: [solanaAdapter], + }) -/* highlight-add-end */ -```` +``` - + Make sure you update the imports in your codebase to reflect the new package names. -```tsx -/* highlight-delete-start */ +```tsx {4-13} +// Remove the following imports - import { createWeb3Modal, defaultSolanaConfig, useWeb3ModalAccount, useWeb3ModalProvider } from '@web3modal/solana/vue' - import { solana, solanaTestnet, solanaDevnet } from '@web3modal/solana/chains' -/* highlight-delete-end */ - -/_ highlight-add-start _/ - -- import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks - - ' - -- import { createAppKit } from '@reown/appkit/vue - - ' - -- import { SolanaAdapter } from '@reown/appkit-adapter-solana/vue - - ' - -- import { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets' -/* highlight-add-end * - / - -```` +// Add the following imports ++ import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks' ++ import { createAppKit } from '@reown/appkit/vue' ++ import { SolanaAdapter } from '@reown/appkit-adapter-solana/vue' +``` Now, set up the Solana Adapter and the modal. @@ -156,16 +121,13 @@ The `chains` property is now `networks` in Reown AppKit. You should import them The `metadata` and the `projectId` are the same as before. -```tsx -/* highlight-delete-start */ +```tsx {5-15} +// Remove the following code lines - const solanaConfig = defaultSolanaConfig({ ... }); -- createWeb3Modal( ... }); -/* highlight-delete-end */ +- createWeb3Modal( ... ); -/* highlight-add-start */ -+ const solanaAdapter = new SolanaAdapter({ -+ wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()] -+ }) +// Add the following code lines ++ const solanaAdapter = new SolanaAdapter() + const modal = createAppKit({ + projectId, @@ -173,54 +135,36 @@ The `metadata` and the `projectId` are the same as before. + networks: [solana, solanaTestnet, solanaDevnet], + adapters: [solanaAdapter], + }) -/* highlight-add-end */ -```` +``` - + Make sure you update the imports in your codebase to reflect the new package names. -```tsx -/* highlight-delete-start */ + +```tsx {5-8} +// Remove the following imports - import { createWeb3Modal, defaultSolanaConfig, useWeb3ModalAccount, useWeb3ModalProvider } from '@web3modal/solana/react' - import { solana, solanaTestnet, solanaDevnet } from '@web3modal/solana/chains' -/* highlight-delete-end */ - -/_ highlight-add-start _/ - -- import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks - - ' - -- import { createAppKit } from '@reown/appkit - - ' -- import { SolanaAdapter } from '@reown/appkit-adapter-solana - - ' - -- import { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets' -/* highlight-add-end * - - / +// Add the following imports ++ import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks' ++ import { createAppKit } from '@reown/appkit' ++ import { SolanaAdapter } from '@reown/appkit-adapter-solana' +``` -```` Now, set up the Solana Adapter and the modal. The `chains` property is now `networks` in Reown AppKit. You should import them from `@reown/appkit/networks` package instead of importing these networks other packages. The `metadata` and the `projectId` are the same as before. -```tsx -/* highlight-delete-start */ +```tsx {5-15} +// Remove the following code lines - const solanaConfig = defaultSolanaConfig({ ... }); -- createWeb3Modal( ... }); -/* highlight-delete-end */ +- createWeb3Modal( ... ); -/* highlight-add-start */ -+ const solanaAdapter = new SolanaAdapter({ -+ wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()] -+ }) +// Add the following code lines ++ const solanaAdapter = new SolanaAdapter() + const modal = createAppKit({ + projectId, @@ -228,8 +172,7 @@ The `metadata` and the `projectId` are the same as before. + networks: [solana, solanaTestnet, solanaDevnet], + adapters: [solanaAdapter], + }) -/* highlight-add-end */ -```` +``` @@ -241,19 +184,16 @@ The `metadata` and the `projectId` are the same as before. > - + -```tsx -/* highlight-delete-start */ +```tsx {4-10} +// Remove the following code line - import { useWeb3Modal } from '@web3modal/wagmi/react' -/* highlight-delete-end */ -/* highlight-add-start */ -+ import { useAppKit } from '@reown/appkit/react' -/* highlight-add-end */ +// Add the following code lines ++ import { useAppKit } from '@reown/appkit/react' function HomePage() { const { open } = useAppKit() - return } ``` @@ -261,7 +201,7 @@ function HomePage() { Learn more about Reown AppKit [here](../react/core/installation) - + Use your own button with to open the modal @@ -276,7 +216,7 @@ document.getElementById('my-button').addEventListener('click', () => { Learn more about Reown AppKit JavaScript [here](../javascript/core/installation) - + Use your own button with to open the modal @@ -350,14 +290,13 @@ Unlike in v5, `modal.switchNetwork` takes the chain object as parameter rather t - (v5) - switchNetwork(103) -> switches the chain to Solana Devnet as we are passing Solana Devnet's chain id. - (Reown AppKit v1) - switchNetwork(solanaDevnet) -> `solanaDevnet` is imported from `@reown/appkit/networks`. -```tsx -/* highlight-delete-start */ +```tsx {4-7} +// Remove the following code line modal.switchNetwork(103); -/* highlight-delete-end */ -/* highlight-add-start */ + +// Add the following code lines import { solanaDevnet } from "@reown/appkit/networks"; modal.switchNetwork(solanaDevnet); -/* highlight-add-end */ ``` diff --git a/appkit/upgrade/to-reown-appkit-web.mdx b/appkit/upgrade/to-reown-appkit-web.mdx index 9b88f5eaa..cb3c0e310 100644 --- a/appkit/upgrade/to-reown-appkit-web.mdx +++ b/appkit/upgrade/to-reown-appkit-web.mdx @@ -1,7 +1,6 @@ --- -pagination_next: appkit/react/core/installation title: Migrate from Web3Modal v5 to Reown AppKit -displayed_sidebar: mainSidebar +sidebarTitle: AppKit Wagmi --- # Upgrade Guide @@ -28,7 +27,7 @@ This guide will help you upgrade from Web3Modal v5 using Wagmi to the latest Reo > - + To upgrade from Web3Modal v5 to Reown AppKit start by removing Web3Modal v5 dependencies `@web3modal/ethereum` and `@web3modal/react`. Now you can install AppKit library and update `Wagmi` and `Viem`. @@ -52,7 +51,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi @tanstack/react-query - + To upgrade from Web3Modal v5 to Reown AppKit start by removing Web3Modal v5 dependencies `@web3modal/ethereum` and `@web3modal/react`. Now you can install AppKit library and update `@wagmi/core` and `Viem`. @@ -76,7 +75,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi - + To upgrade from Web3Modal v5 to Reown AppKit start by removing Web3Modal v5 dependencies `@web3modal/ethereum`, `Wagmi` and `@web3modal/vue`. Now you can install AppKit library and update `Viem`. @@ -108,7 +107,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi @tanstack/vue-query @wagmi/vu > - + You can start the AppKit configuration by using either the **default** or **advanced** mode. @@ -119,25 +118,23 @@ Make sure to set your configuration outside React components to avoid unwanted r Start by importing `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```tsx -/* highlight-delete-start */ +```tsx {6-9} +// Remove the following imports - import { createWeb3Modal } from '@web3modal/wagmi/react' - import { defaultWagmiConfig } from '@web3modal/wagmi/react/config' - import { arbitrum, mainnet } from 'viem/chains' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit/react' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' -/* highlight-add-end */ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {13-18} const projectId = 'YOUR_PROJECT_ID' const queryClient = new QueryClient() @@ -148,29 +145,23 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ +// Remove the existing Wagmi Config + const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ ``` Finally, pass `wagmiAdapter` and other parameters to `createAppKit` -```tsx -/* highlight-delete-start */ +```tsx {4-13, 21-22} +// Remove the following line - createWeb3Modal({ wagmiConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit/react' +// Add the following line + createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -180,29 +171,26 @@ Finally, pass `wagmiAdapter` and other parameters to `createAppKit` analytics: true, } }) -/* highlight-add-end */ export default function App() { return ( <> -/* highlight-delete-start */ -- -/* highlight-delete-end */ -/* highlight-add-start */ -+ -/* highlight-add-end */ + // Remove the following line +- + // Add the following line ++ - - - + + + ) } ``` - + You can start the AppKit configuration by using either the **default** or **advanced** mode. @@ -213,24 +201,22 @@ Make sure to set your configuration outside React components to avoid unwanted r Start by importing `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```tsx -/* highlight-delete-start */ -import { createWeb3Modal } from "@web3modal/wagmi/vue"; -import { defaultWagmiConfig } from "@web3modal/wagmi/react/config"; -import { WagmiConfig } from "wagmi"; -import { arbitrum, mainnet } from "viem/chains"; -/* highlight-delete-end */ +```tsx {7-10} +// Remove the following imports +- import { createWeb3Modal } from "@web3modal/wagmi/vue"; +- import { defaultWagmiConfig } from "@web3modal/wagmi/react/config"; +- import { WagmiConfig } from "wagmi"; +- import { arbitrum, mainnet } from "viem/chains"; -/* highlight-add-start */ -import { createAppKit } from "@reown/appkit/vue"; -import { arbitrum, mainnet } from "@reown/appkit/networks"; -import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; -/* highlight-add-end */ +// Add the following imports ++ import { createAppKit } from "@reown/appkit/vue"; ++ import { arbitrum, mainnet } from "@reown/appkit/networks"; ++ import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {12-17} const projectId = 'YOUR_PROJECT_ID' const metadata = { //optional @@ -240,29 +226,23 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ +// Remove the existing Wagmi Config - const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ ``` Pass `wagmiAdapter` (optional) and other parameters to `createAppKit` -```tsx -/* highlight-delete-start */ +```tsx {4-13} +// Remove the following code line - createWeb3Modal({ wagmiConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit/vue' +// Add the following code lines + const modal = createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -272,53 +252,53 @@ Pass `wagmiAdapter` (optional) and other parameters to `createAppKit` analytics: true, } }) -/* highlight-add-end */ ``` Finally, you need to initialized Vue Query in the `main.ts` -```tsx +```tsx {8-9, 12-13, 16-17} +// Remove the following code lines +- import { createWeb3Modal } from "@web3modal/wagmi/vue"; +- import { defaultWagmiConfig } from "@web3modal/wagmi/react/config"; +- import { WagmiConfig } from "wagmi"; +- import { arbitrum, mainnet } from "viem/chains"; + import { createApp } from "vue"; -/* highlight-add-start */ +// Add the following import import { QueryClient, VueQueryPlugin } from "@tanstack/vue-query"; -/* highlight-add-end */ -import App from "./App.vue"; -/* highlight-add-start */ +import App from "./App.vue"; +// Add the following code line const queryClient = new QueryClient(); -/* highlight-add-end */ createApp(App) - /* highlight-add-start */ + // Add the following code line .use(VueQueryPlugin, { queryClient }) - /* highlight-add-end */ .mount("#app"); ``` - + Start by importing AppKit packages, then create wagmiAdapter using your own settings or the default presets as shown below. Finally, pass wagmiAdapter to AppKit as one of the adapters. Import `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```ts -/* highlight-delete-start */ +```ts {6-9} +// Remove the following imports - import { createWeb3Modal, defaultWagmiConfig } from '@web3modal/wagmi/react' - import { createConfig } from '@wagmi/core' - import { arbitrum, mainnet } from 'viem/chains' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' -/* highlight-add-end */ ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {14-19} const projectId = 'YOUR_PROJECT_ID' const queryClient = new QueryClient() @@ -329,33 +309,27 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ +// Remove the existing Wagmi Config - const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ ``` Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. -```ts -/* highlight-delete-start */ +```ts {8-17} +// Remove the following code lines - const modal = createWeb3Modal({ wagmiConfig, projectId, enableAnalytics: true }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit' +// Add the following code lines + const modal = createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -365,7 +339,6 @@ Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. analytics: true } }) -/* highlight-add-end */ ``` @@ -377,15 +350,14 @@ Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. > - + -```tsx -/* highlight-delete-start */ +```tsx {4-5} +// Remove the following import - import { useWeb3Modal } from '@web3modal/wagmi/react' -/* highlight-delete-end */ -/* highlight-add-start */ + +// Add the following import + import { useAppKit } from '@reown/appkit/react' -/* highlight-add-end */ function HomePage() { const { open } = useAppKit() @@ -399,7 +371,7 @@ function HomePage() { Learn more about Reown AppKit [here](../react/core/installation). - + Use your own button with to open the modal. @@ -433,7 +405,7 @@ Use your own button with to open the modal. Learn more about integrating Reown AppKit with Vue [here](../vue/core/installation). - + Use your own button with to open the modal. @@ -509,14 +481,13 @@ Unlike in v5, `modal.switchNetwork` takes the chain object as parameter rather t - (v5) - switchNetwork(137) -> switches the chain to Polygon as we are passing Polygon's chain id. - (Reown AppKit v1) - switchNetwork(polygon) -> `polygon` is imported from `@reown/appkit/networks`. -```tsx -/* highlight-delete-start */ -modal.switchNetwork(137); -/* highlight-delete-end */ -/* highlight-add-start */ -import { polygon } from "@reown/appkit/networks"; -modal.switchNetwork(polygon); -/* highlight-add-end */ +```tsx {4-6} +// Remove the following code line +- modal.switchNetwork(137); + +// Add the following code lines ++ import { polygon } from "@reown/appkit/networks"; ++ modal.switchNetwork(polygon); ``` @@ -570,7 +541,7 @@ The following methods and listeners are exactly the same and do not have any spe > - + To upgrade from Web3Modal v4 to Reown AppKit start by removing Web3Modal v4 dependencies `@web3modal/wagmi`. Now you can install AppKit library and update `Wagmi` `@tanstack/react-query` and `Viem`. @@ -594,7 +565,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi - + To upgrade from Web3Modal v4 to Reown AppKit start by removing Web3Modal v4 dependencies `@web3modal/wagmi`. Now you can install AppKit library and update `@wagmi/core`, `@wagmi/connectors` and `Viem`. @@ -618,7 +589,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi - + To upgrade from Web3Modal v4 to Reown AppKit start by removing Web3Modal v4 dependencies `@web3modal/ethereum` and `@web3modal/vue`. Now you can install AppKit library and update `Wagmi` and `Viem`. @@ -650,7 +621,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi @tanstack/vue-query @wagmi/vu > - + You can start the AppKit configuration by using either the **default** or **advanced** mode. @@ -661,26 +632,24 @@ Make sure to set your configuration outside React components to avoid unwanted r Start by importing `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```tsx -/* highlight-delete-start */ +```tsx {5-10} +// Remove the following imports - import { createWeb3Modal, defaultWagmiConfig } from '@web3modal/wagmi/react' - import { WagmiConfig } from 'wagmi' - import { arbitrum, mainnet } from 'wagmi/chains' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit/react' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' + import { WagmiProvider } from 'wagmi' -/* highlight-add-end */ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {14-18} const projectId = 'YOUR_PROJECT_ID' const queryClient = new QueryClient() @@ -691,29 +660,23 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ -+ const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ +// Remove the existing Wagmi Config +- const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ ``` Finally, pass `wagmiAdapter` (optional) and other parameters to `createAppKit` -```tsx -/* highlight-delete-start */ +```tsx {4-13, 21-22, 29-30} +// Remove the following code line - createWeb3Modal({ wagmiConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit/react' +// Add the following code lines + createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -723,34 +686,30 @@ Finally, pass `wagmiAdapter` (optional) and other parameters to `createAppKit` analytics: true, } }) -/* highlight-add-end */ export default function App() { return ( <> -/* highlight-delete-start */ -- -/* highlight-delete-end */ -/* highlight-add-start */ -+ -/* highlight-add-end */ - - - - -/* highlight-delete-start */ -- -/* highlight-delete-end */ -/* highlight-add-start */ -+ -/* highlight-add-end */ + // Remove the following code line +- + + // Add the following code line ++ + + + + // Remove the following code line +- + + // Add the following code line ++ ) } ``` - + You can start the AppKit configuration by using either the **default** or **advanced** mode. @@ -761,24 +720,22 @@ Make sure to set your configuration outside React components to avoid unwanted r Start by importing `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```tsx -/* highlight-delete-start */ +```tsx {5-10} +// Remove the following imports - import { createWeb3Modal, defaultWagmiConfig } from '@web3modal/wagmi/vue' - import { WagmiConfig } from 'wagmi' - import { arbitrum, mainnet } from 'wagmi/chains' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit/vue' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' + import { WagmiPlugin } from '@wagmi/vue'; -/* highlight-add-end */ ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {12-17} const projectId = 'YOUR_PROJECT_ID' const metadata = { //optional @@ -788,29 +745,23 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ +// Remove the existing Wagmi Config - const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ ``` Pass `wagmiAdapter` (optional) and other parameters to `createAppKit` -```tsx -/* highlight-delete-start */ +```tsx {4-13, 18-19, 21-22} +// Remove the following code line - createWeb3Modal({ wagmiConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit/vue' +// Add the following code lines + const modal = createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -820,18 +771,15 @@ Pass `wagmiAdapter` (optional) and other parameters to `createAppKit` analytics: true, } }) -/* highlight-add-end */ export default function App() { return ( <> -/* highlight-add-start */ -+ -/* highlight-add-end */ - -/* highlight-add-start */ - -/* highlight-add-end */ + // Add the following code line ++ + + // Add the following code line ++ ) } @@ -839,48 +787,45 @@ export default function App() { Finally, you need to initialized Vue Query in the `main.ts` -```tsx +```tsx {4-6, 8-9, 12-13} +// Remove the following import import { createApp } from "vue"; -/* highlight-add-start */ -import { QueryClient, VueQueryPlugin } from "@tanstack/vue-query"; -/* highlight-add-end */ -import App from "./App.vue"; -/* highlight-add-start */ -const queryClient = new QueryClient(); -/* highlight-add-end */ +// Add the following imports ++ import { QueryClient, VueQueryPlugin } from "@tanstack/vue-query"; ++ import App from "./App.vue"; + +// Add the following code line ++ const queryClient = new QueryClient(); createApp(App) - /* highlight-add-start */ + // Add the following code line .use(VueQueryPlugin, { queryClient }) - /* highlight-add-end */ .mount("#app"); ``` - + Start by importing AppKit packages, then create wagmiAdapter using your own settings or the default presets as shown below. Finally, pass wagmiAdapter to AppKit as one of the adapters. Import `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```ts -/* highlight-delete-start */ +```ts {6-9} +// Remove the following imports - import { createWeb3Modal, defaultWagmiConfig } from '@web3modal/wagmi' - import { createConfig } from '@wagmi/core' - import { mainnet, arbitrum } from '@wagmi/core/chains' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' -/* highlight-add-end */ ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {14-18} const projectId = 'YOUR_PROJECT_ID' const queryClient = new QueryClient() @@ -891,34 +836,27 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ +// Remove the existing Wagmi Config - const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ -/* highlight-add-end */ ``` Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. -```ts -/* highlight-delete-start */ +```ts {8-17} +// Remove the following code lines - const modal = createWeb3Modal({ wagmiConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit' +// Add the following code lines + const modal = createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -928,7 +866,6 @@ Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. analytics: true } }) -/* highlight-add-end */ ``` @@ -940,19 +877,17 @@ Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. > - + -```tsx -/* highlight-delete-start */ +```tsx {4-5} +// Remove the following import - import { useWeb3Modal } from '@web3modal/wagmi/react' -/* highlight-delete-end */ -/* highlight-add-start */ + +// Add the following import + import { useAppKit } from '@reown/appkit/react' -/* highlight-add-end */ function HomePage() { const { open } = useAppKit() - return } ``` @@ -962,7 +897,7 @@ function HomePage() { Learn more about Reown AppKit [here](../react/core/installation). - + Use your own button with to open the modal. @@ -996,7 +931,7 @@ Use your own button with to open the modal. Learn more about integrating Reown AppKit with Vue [here](../vue/core/installation). - + Use your own button with to open the modal. @@ -1023,7 +958,7 @@ Learn more about integrating Reown AppKit with JavaScript [here](../javascript/c > - + To upgrade from Web3Modal v3 to Reown AppKit start by removing Web3Modal v3 dependencies `@web3modal/wagmi`. Now you can install AppKit library and update `Wagmi` and `Viem`. @@ -1047,7 +982,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi @tanstack/react-query - + To upgrade from Web3Modal v3 to Reown AppKit start by removing Web3Modal v5 dependencies `@web3modal/ethereum` and `@web3modal/react`. Now you can install AppKit library and update `@wagmi/core` and `Viem`. @@ -1071,7 +1006,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi - + To upgrade from Web3Modal v3 to Reown AppKit start by removing Web3Modal v5 dependencies `@web3modal/ethereum` and `@web3modal/vue`. Now you can install AppKit library and update `Wagmi` and `Viem`. @@ -1103,7 +1038,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-wagmi @tanstack/vue-query @wagmi/vu > - + You can start the AppKit configuration by using either the **default** or **advanced** mode. @@ -1114,26 +1049,24 @@ Make sure to set your configuration outside React components to avoid unwanted r Start by importing `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```tsx -/* highlight-delete-start */ +```tsx {6-10} +// Remove the following imports - import { createWeb3Modal, defaultWagmiConfig } from '@web3modal/wagmi/react' - import { arbitrum, mainnet } from 'wagmi/chains' - import { WagmiConfig } from 'wagmi' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit/react' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' + import { WagmiProvider } from 'wagmi' -/* highlight-add-end */ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {14-18} const projectId = 'YOUR_PROJECT_ID' const queryClient = new QueryClient() @@ -1144,29 +1077,23 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ +// Remove the existing Wagmi Config + const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ ``` Finally, pass `wagmiAdapter` (optional) and other parameters to `createAppKit` -```tsx -/* highlight-delete-start */ +```tsx {4-13, 21-22, 30-31} +// Remove the following code line - createWeb3Modal({ wagmiConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit/react' +// Add the following code lines + createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -1176,34 +1103,31 @@ Finally, pass `wagmiAdapter` (optional) and other parameters to `createAppKit` analytics: true, } }) -/* highlight-add-end */ export default function App() { return ( <> -/* highlight-delete-start */ -- -/* highlight-delete-end */ -/* highlight-add-start */ -+ -/* highlight-add-end */ + // Remove the following code line +- - - - -/* highlight-delete-start */ -- -/* highlight-delete-end */ -/* highlight-add-start */ -+ -/* highlight-add-end */ + // Add the following code line ++ + + + + + // Remove the following code line +- + + // Add the following code line ++ ) } ``` - + You can start the AppKit configuration by using either the **default** or **advanced** mode. @@ -1214,23 +1138,21 @@ Make sure to set your configuration outside React components to avoid unwanted r Start by importing `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```tsx -/* highlight-delete-start */ +```tsx {6-9} +// Remove the following imports - import { createWeb3Modal, defaultWagmiConfig } from '@web3modal/wagmi/vue' - import { WagmiConfig } from 'wagmi' - import { arbitrum, mainnet } from 'wagmi/chains' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit/vue' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' -/* highlight-add-end */ ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {13-17} const projectId = 'YOUR_PROJECT_ID' const metadata = { //optional @@ -1240,29 +1162,23 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ +// Remove the existing Wagmi Config - const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ ``` Pass `wagmiAdapter` (optional) and other parameters to `createAppKit` -```tsx -/* highlight-delete-start */ +```tsx {4-13, 18-19, 21-22} +// Remove the following code line - createWeb3Modal({ wagmiConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit/vue' +// Add the following code lines + const modal = createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -1272,18 +1188,15 @@ Pass `wagmiAdapter` (optional) and other parameters to `createAppKit` analytics: true, } }) -/* highlight-add-end */ export default function App() { return ( <> -/* highlight-add-start */ -+ -/* highlight-add-end */ - -/* highlight-add-start */ - -/* highlight-add-end */ + // Add the following code line ++ + + // Add the following code line ++ ) } @@ -1291,48 +1204,44 @@ export default function App() { Finally, you need to initialized Vue Query in the `main.ts` -```tsx +```tsx {3-4, 7-8, 11-12} import { createApp } from "vue"; -/* highlight-add-start */ + +// Add the following imports import { QueryClient, VueQueryPlugin } from "@tanstack/vue-query"; -/* highlight-add-end */ import App from "./App.vue"; -/* highlight-add-start */ +// Add the following code line const queryClient = new QueryClient(); -/* highlight-add-end */ createApp(App) - /* highlight-add-start */ + // Add the following code line .use(VueQueryPlugin, { queryClient }) - /* highlight-add-end */ .mount("#app"); ``` - + Start by importing AppKit packages, then create wagmiAdapter using your own settings or the default presets as shown below. Finally, pass wagmiAdapter to AppKit as one of the adapters. Import `createAppKit` from `@reown/appkit` and the necessary chains from `@reown/appkit/networks` -```ts -/* highlight-delete-start */ +```ts {6-9} +// Remove the following imports - import { createWeb3Modal, defaultWagmiConfig } from '@web3modal/wagmi' - import { createConfig } from '@wagmi/core' - import { mainnet, arbitrum } from '@wagmi/core/chains' -/* highlight-delete-end */ -/* highlight-add-start */ +// Add the following imports + import { createAppKit } from '@reown/appkit' + import { arbitrum, mainnet } from '@reown/appkit/networks' + import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' -/* highlight-add-end */ ``` Then create `wagmiAdapter` using `WagmiAdapter` function as shown below -```tsx +```tsx {14-19} const projectId = 'YOUR_PROJECT_ID' const queryClient = new QueryClient() @@ -1343,34 +1252,27 @@ const metadata = { //optional icons: ['https://avatars.githubusercontent.com/u/179229932'] } -/* Remove the existing Wagmi Config */ -/* highlight-delete-start */ +// Remove the existing Wagmi Config - const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata }) -/* highlight-delete-end */ -/* Create the Wagmi adapter */ -/* highlight-add-start */ +// Create the Wagmi adapter + const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId }) -/* highlight-add-end */ -/* highlight-add-end */ ``` Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. -```ts -/* highlight-delete-start */ +```ts {8-17} +// Remove the following code lines - const modal = createWeb3Modal({ wagmiConfig, projectId, chains }) -/* highlight-delete-end */ -/* highlight-add-start */ -// import { createAppKit } from '@reown/appkit' +// Add the following code lines + const modal = createAppKit({ adapters: [wagmiAdapter], networks: [mainnet, arbitrum], @@ -1380,7 +1282,6 @@ Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. analytics: true } }) -/* highlight-add-end */ ``` @@ -1392,15 +1293,14 @@ Finally, pass `wagmiAdapter`(optional) and other parameters to `createAppKit`. > - + -```tsx -/* highlight-delete-start */ +```tsx {4-5} +// Remove the following import - import { useWeb3Modal } from '@web3modal/wagmi/react' -/* highlight-delete-end */ -/* highlight-add-start */ + +// Add the following import + import { useAppKit } from '@reown/appkit/react' -/* highlight-add-end */ function HomePage() { const { open } = useAppKit() @@ -1414,7 +1314,7 @@ function HomePage() { Learn more about Reown AppKit [here](../react/core/installation). - + Use your own button with to open the modal. @@ -1448,7 +1348,7 @@ Use your own button with to open the modal. Learn more about integrating Reown AppKit with Vue [here](../vue/core/installation). - + Use your own button with to open the modal. diff --git a/appkit/upgrade/wcm.mdx b/appkit/upgrade/wcm.mdx index 036bc5135..314892f2e 100644 --- a/appkit/upgrade/wcm.mdx +++ b/appkit/upgrade/wcm.mdx @@ -1,27 +1,41 @@ --- -title: WalletConnect Modal to Reown AppKit Basic +title: WalletConnect Modal to Reown AppKit Core --- -**WalletConnect Modal will soon be deprecated.** Consequently, projects and developers need to upgrade to Reown AppKit Basic. The most basic version of Reown AppKit will contain the traditional WalletConnect Modal with a QR code that users can scan and connect their wallets to. +**Reown AppKit Core is the upgraded version of WalletConnect Modal.** It provides a user-friendly experience while maintaining the familiar QR code functionality for wallet connections. **AppKit Core** is the base version of Reown AppKit that includes the traditional WalletConnect Modal with QR code functionality. - +This is a preview version of Reown AppKit Core. -This guide will show you how to upgrade to the most basic version of Reown AppKit. There are three different categories that this guide will be addressing, they are: + + + -1. [**AppKit Basic**](#appkit-basic) -2. [**Ethereum Provider**](#ethereum-provider) -3. [**Universal Provider with AppKit**](#universalprovider-with-appkit) -4. [**Sign Client with AppKit**](#sign-client-with-appkit) +Please, follow the different sections based on which package you were using before. + +1. [**`@walletconnect/ethereum-provider`**](#ethereum-provider) +2. [**`@walletconnect/universal-provider`**](#universal-provider) +3. [**`@walletconnect/sign-client`**](#sign-client) +4. [**`@walletconnect/modal`**](#universal-provider) + + +If your project has `@walletconnect/modal` in the `package.json` or your project files, you need to remove it and uninstall it. After that, you can refer to the [Universal Provider path](#universal-provider) to setup AppKit Core in your project. + + + **AppKit Core** is the most basic version of Reown AppKit which replaces WalletConnect Modal. Please refer to [this section](#setting-up-appkit-core-from-scratch) if you are starting from scratch. ## Installation You first need to install the AppKit package in order to get started. You can do this by running the command below. + + Make sure to use a version equal or greater than v1.7.0 + + ```bash npm @@ -33,7 +47,7 @@ yarn add @reown/appkit ``` ```bash Bun -bun a @reown/appkit +bun add @reown/appkit ``` ```bash pnpm @@ -41,95 +55,63 @@ pnpm add @reown/appkit ``` -## AppKit Basic +## Ethereum Provider -This is the easiest way for developers to go multi-chain. AppKit Basic utilizes the `UniversalProvider` underneath and is a ready-to-use solution with hooks and methods. +The Ethereum Provider implementation remains the same as before. **Projects and developers don't need to change anything in their configuration; upgrading the Ethereum Provider to latest version is sufficient.** Projects will automatically receive the new QR modal UI. - - -```javascript -import { createAppKit } from '@reown/appkit/react' -import { mainnet } from '@reown/appkit/networks' + +Not all `themeVariables`will be compatible with the new UI, as `AppKit` uses a different design system than `walletConnectModal` + -const modal = createAppKit({ -adapters: [], //pass an empty array to only use WalletConnect QR -projectId: 'YOUR_PROJECT_ID', -metadata: { -name: 'My Website', -description: 'My Website Description', -url: 'https://mywebsite.com', // origin must match your domain & subdomain -icons: ['https://avatars.githubusercontent.com/u/37784886'] -}, -networks: [mainnet] -}) +### Examples -```` - +Below are the examples for the corresponding library/programming language. - -```javascript -import { createAppKit } from '@reown/appkit' -import { mainnet } from '@reown/appkit/networks' -const modal = createAppKit({ - adapters: [], //pass an empty array to only use WalletConnect QR - projectId: 'YOUR_PROJECT_ID', - metadata: { - name: 'My Website', - description: 'My Website Description', - url: 'https://mywebsite.com', // origin must match your domain & subdomain - icons: ['https://avatars.githubusercontent.com/u/37784886'] - }, - networks: [mainnet] -}) -```` +1. [**HTML**](https://github.com/reown-com/appkit/tree/main/examples/html-ep) +2. [**React**](https://github.com/reown-com/appkit/tree/main/examples/react-ep) +3. [**NextJS**](https://github.com/reown-com/appkit/tree/main/examples/next-ep-app-router) +4. [**Vue**](https://github.com/reown-com/appkit/tree/main/examples/vue-ep) - +## Universal Provider - -```javascript -import { createAppKit } from '@reown/appkit/vue' -import { mainnet } from '@reown/appkit/networks' +First, please uninstall the `@walletconnect/modal` package. You should also remove `@walletconnect/modal` from your `package.json` file. -const modal = createAppKit({ -adapters: [], //pass an empty array to only use WalletConnect QR -projectId: 'YOUR_PROJECT_ID', -metadata: { -name: 'My Website', -description: 'My Website Description', -url: 'https://mywebsite.com', // origin must match your domain & subdomain -icons: ['https://avatars.githubusercontent.com/u/37784886'] -}, -networks: [mainnet] -}) + -```` - +```bash npm +npm uninstall @walletconnect/modal +``` - +```bash Yarn +yarn remove @walletconnect/modal +``` -You can also refer to the "Multichain" section under AppKit "Core" for installation. [Click here](/appkit/react/core/multichain?platform=basic) to learn more. +```bash Bun +bun remove @walletconnect/modal +``` -### Examples +```bash pnpm +pnpm remove @walletconnect/modal +``` + -Below are the examples for the corresponding library/programming language. +Then, you can use the following code to configure AppKit with `UniversalProvider`. -1. [HTML](https://github.com/reown-com/appkit/tree/main/examples/html-ak-basic) -2. [React](https://github.com/reown-com/appkit/tree/main/examples/react-ak-basic) -3. [NextJS](https://github.com/reown-com/appkit/tree/main/examples/next-ak-basic-app-router) -4. [Vue](https://github.com/reown-com/appkit/tree/main/examples/vue-ak-basic) +```javascript {9-11, 34-43} +// Remove the code lines below the comment that says "Remove the code line below" +// Add the code lines in green -## Ethereum Provider +import { UniversalProvider } from '@walletconnect/universal-provider' -The Ethereum Provider implementation remains the same as before. Below is an example of how you can configure it: +// Remove the code line below +import { WalletConnectModal } from '@walletconnect/modal' -```javascript -import { EthereumProvider } from '@walletconnect/ethereum-provider' +// Add the code lines below +import { mainnet, solana } from '@reown/appkit/networks' +import { createAppKit } from '@reown/appkit/core' -const provider = await EthereumProvider.init({ +const provider = await UniversalProvider.init({ projectId: 'YOUR_PROJECT_ID', metadata: { name: 'My Website', @@ -137,375 +119,349 @@ const provider = await EthereumProvider.init({ url: 'https://mywebsite.com', // origin must match your domain & subdomain icons: ['https://avatars.githubusercontent.com/u/37784886'] }, - showQrModal: true, - optionalChains: [1, 137, 2020], - - /*Optional - Add custom RPCs for each supported chain*/ - rpcMap: { - 1: 'mainnet.rpc...', - 137: 'polygon.rpc...' - } }) +// Remove the code lines below +const modal = new WalletConnectModal({ + projectId: 'YOUR_PROJECT_ID', + chains: ['eip155:1', 'solana:mainnet'] +}) -// Connect EthereumProvider, this will open modal -await provider.connect() -```` - -### Changes Required - -Projects and developers don’t need to change anything in their configuration - upgrading the Ethereum Provider is sufficient. Projects will automatically receive the new QR modal UI. - - -Not all `themeVariables`will be compatible with the new UI, as `AppKit` uses a different design system than `walletConnectModal` - - -### Examples - -Below are the examples for the corresponding library/programming language. - -1. [**HTML**](https://github.com/reown-com/appkit/tree/main/examples/html-ep) -2. [**React**](https://github.com/reown-com/appkit/tree/main/examples/react-ep) -3. [**NextJS**](https://github.com/reown-com/appkit/tree/main/examples/next-ep-app-router) -4. [**Vue**](https://github.com/reown-com/appkit/tree/main/examples/vue-ep) - -## UniversalProvider with AppKit - -Here's how you can configure AppKit with `UniversalProvider`. - -```javascript -// NEW IMPLEMENTATION - -import { UniversalProvider } from "@walletconnect/universal-provider"; -import { createAppKit } from "@reown/appkit"; - -const provider = await UniversalProvider.init({ - projectId: "YOUR_PROJECT_ID", - metadata: { - name: "My Website", - description: "My Website Description", - url: "https://mywebsite.com", // origin must match your domain & subdomain - icons: ["https://avatars.githubusercontent.com/u/37784886"], - }, -}); +// listen to display_uri event and feed modal with uri +provider.on('display_uri', (uri: string) => { + modal.openModal({ uri }) +}) +// Add the code lines below const modal = createAppKit({ - projectId: "YOUR_PROJECT_ID", + projectId: 'YOUR_PROJECT_ID', networks: [mainnet, solana], -}); - -// listen to display_uri event and feed modal with uri -provider.on("display_uri", (uri: string) => { - modal.open({ uri, view: "ConnectingWalletConnectBasic" }); -}); + universalProvider: provider, + manualWCControl: true +}) +// A spinner will be showing until it's connected. +modal.open() // Connect provider, this will trigger display_uri event await provider.connect({ optionalNamespaces: { eip155: { methods: [ - "eth_sendTransaction", - "eth_signTransaction", - "eth_sign", - "personal_sign", - "eth_signTypedData", + 'eth_sendTransaction', + 'eth_signTransaction', + 'eth_sign', + 'personal_sign', + 'eth_signTypedData' ], - chains: ["eip155:1"], - events: ["chainChanged", "accountsChanged"], + chains: ['eip155:1'], + events: ['chainChanged', 'accountsChanged'] }, solana: { - methods: ["solana_signMessage", "solana_signTransaction"], - chains: ["solana:mainnet"], - events: ["chainChanged", "accountsChanged"], - }, - }, -}); + methods: ['solana_signMessage', 'solana_signTransaction'], + chains: ['solana:mainnet'], + events: ['chainChanged', 'accountsChanged'] + } + } +}) +``` -// OLD IMPLEMENTATION +### How to use a Custom Network -import { UniversalProvider } from "@walletconnect/universal-provider"; -import { WalletConnectModal } from "@walletconnect/modal"; +WalletConnect Modal has always been chain agnostic. AppKit Core is chain agnostic as well. Hence, you can configure custom networks like Polkadot, Cosmos, etc., using AppKit Core. -const provider = await UniversalProvider.init({ - projectId: "YOUR_PROJECT_ID", - metadata: { - name: "My Website", - description: "My Website Description", - url: "https://mywebsite.com", // origin must match your domain & subdomain - icons: ["https://avatars.githubusercontent.com/u/37784886"], + + + +```javascript +import { defineChain } from '@reown/appkit/networks' + +... + +const polkadot = defineChain({ + id: '91b171bb158e2d3848fa23a9f1c25182', + name: 'Polkadot', + nativeCurrency: { name: 'Polkadot', symbol: 'DOT', decimals: 10 }, + rpcUrls: { + default: { http: ['https://rpc.polkadot.io'], wss: 'wss://rpc.polkadot.io' } }, -}); + blockExplorers: { default: { name: 'Polkadot Explorer', url: 'https://polkadot.js.org/apps/' } }, + chainNamespace: 'polkadot', + caipNetworkId: 'polkadot:91b171bb158e2d3848fa23a9f1c25182' +}) -const modal = new WalletConnectModal({ - projectId: "YOUR_PROJECT_ID", - chains: ["eip155:1", "solana:mainnet"], -}); +... -// listen to display_uri event and feed modal with uri -provider.on("display_uri", (uri: string) => { - modal.openModal({ uri }); -}); +const modal = createAppKit({ + projectId: 'YOUR_PROJECT_ID', + networks: [polkadot], + universalProvider: provider, + manualWCControl: true +}) -// Connect provider, this will trigger display_uri event await provider.connect({ optionalNamespaces: { - eip155: { - methods: [ - "eth_sendTransaction", - "eth_signTransaction", - "eth_sign", - "personal_sign", - "eth_signTypedData", - ], - chains: ["eip155:1"], - events: ["chainChanged", "accountsChanged"], - }, - solana: { - methods: ["solana_signMessage", "solana_signTransaction"], - chains: ["solana:mainnet"], - events: ["chainChanged", "accountsChanged"], - }, - }, -}); + polkadot: { + methods: ['polkadot_signMessage', 'polkadot_signTransaction'], + chains: [polkadot.caipNetworkId], + events: [] + } + } +}) + ``` + -### Changes -For projects that are currently using the `UniversalProvider` with `WalletConnectModal` there are two options for you to upgrade. + -#### Option 1 +```javascript +import { defineChain } from '@reown/appkit/networks' -Upgrade to AppKit Basic and pass in the `UniversalProvider`. +... -```javascript -const provider = await UniversalProvider.init({ - projectId: 'YOUR_PROJECT_ID', - metadata: { - name: 'My Website', - description: 'My Website Description', - url: 'https://mywebsite.com', // origin must match your domain & subdomain - icons: ['https://avatars.githubusercontent.com/u/37784886'] +const cosmos = defineChain({ + id: 'cosmoshub-3', + name: 'Cosmos', + nativeCurrency: { name: 'Cosmos', symbol: 'ATOM', decimals: 6 }, + rpcUrls: { + default: { http: ['https://cosmos-rpc.publicnode.com:443'] } }, + blockExplorers: { default: { name: 'Sui Explorer', url: 'https://suiexplorer.com/' } }, + testnet: false, + chainNamespace: 'cosmos', + caipNetworkId: 'cosmos:cosmoshub-4' }) +... + const modal = createAppKit({ projectId: 'YOUR_PROJECT_ID', - networks: [mainnet, solana] - universalProvider: provider + networks: [cosmos], + universalProvider: provider, + manualWCControl: true }) -``` - -#### Option 2 - -Replace `WalletConnectModal` with `AppKit`. - -```javascript -//Old Code -/* highlight-delete-start */ -const modal = new WalletConnectModal({ - projectId: "YOUR_PROJECT_ID", - chains: ["eip155:1", "solana:mainnet"], -}); -provider.on("display_uri", (uri: string) => { - modal.openModal({ uri }); -}); -/* highlight-delete-end */ - -//New Code -/* highlight-add-start */ -const modal = createAppKit({ - projectId: "YOUR_PROJECT_ID", - networks: [mainnet, solana], -}); +await provider.connect({ + optionalNamespaces: { + cosmos: { + methods: ['cosmos_signDirect'], + chains: [cosmos.caipNetworkId], + events: [] + } + } +}) -provider.on("display_uri", (uri: string) => { - modal.open({ uri, view: "ConnectingWalletConnectBasic" }); -}); -/* highlight-add-end */ ``` + + + ### Examples -Below are the examples for the corresponding library/programming language. +Below are the examples for the corresponding library/programming language. 1. [**HTML**](https://github.com/reown-com/appkit/tree/main/examples/html-ak-basic-up) 2. [**React**](https://github.com/reown-com/appkit/tree/main/examples/react-ak-basic-up) 3. [**NextJS**](https://github.com/reown-com/appkit/tree/main/examples/next-ak-basic-up-app-router) 4. [**Vue**](https://github.com/reown-com/appkit/tree/main/examples/vue-ak-basic-up) -## Sign Client with AppKit -Below is how you can use `SignClient` with AppKit\*\*. +## Sign Client -```javascript -// Old Implementation -/*highlight-delete-start*/ -import { SignClient } from "@walletconnect/sign-client"; -import { WalletConnectModal } from "@walletconnect/modal"; +First, please uninstall the `@walletconnect/modal` package. You should also remove `@walletconnect/modal` from your `package.json` file. + + + +```bash npm +npm uninstall @walletconnect/modal +``` + +```bash Yarn +yarn remove @walletconnect/modal +``` + +```bash Bun +bun remove @walletconnect/modal +``` + +```bash pnpm +pnpm remove @walletconnect/modal +``` + + +Then, you can use the following code to configure AppKit with `SignClient`. + +```javascript {6-8, 26-32} +import { SignClient } from '@walletconnect/sign-client' + +// Remove the code line below +import { WalletConnectModal } from '@walletconnect/modal' + +// Add the code lines below +import { mainnet } from '@reown/appkit/networks' +import { createAppKit } from '@reown/appkit/core' const signClient = await SignClient.init({ - projectId: "YOUR_PROJECT_ID", + projectId: 'YOUR_PROJECT_ID', metadata: { - name: "My Website", - description: "My Website Description", - url: "https://mywebsite.com", // origin must match your domain & subdomain - icons: ["https://avatars.githubusercontent.com/u/37784886"], + name: 'My Website', + description: 'My Website Description', + url: 'https://mywebsite.com', // origin must match your domain & subdomain + icons: ['https://avatars.githubusercontent.com/u/37784886'] }, -}); +}) +// Remove the code lines below const modal = new WalletConnectModal({ - projectId: "YOUR_PROJECT_ID", - chains: ["eip155:1"], -}); + projectId: 'YOUR_PROJECT_ID', + chains: ['eip155:1'] +}) + +// Add the code lines below +const modal = createAppKit({ + projectId: 'YOUR_PROJECT_ID', + networks: [mainnet], + manualWCControl: true +}) // connect signClient and feed uri to modal const { uri, approval } = await signClient.connect({ - requiredNamespaces: { - eip155: { - methods: [ - "eth_sendTransaction", - "eth_signTransaction", - "eth_sign", - "personal_sign", - "eth_signTypedData", - ], - chains: ["eip155:1"], - events: ["chainChanged", "accountsChanged"], - }, - }, -}); + requiredNamespaces: { + eip155: { + methods: [ + 'eth_sendTransaction', + 'eth_signTransaction', + 'eth_sign', + 'personal_sign', + 'eth_signTypedData' + ], + chains: ['eip155:1'], + events: ['chainChanged', 'accountsChanged'] + } + } + }) + + if (uri) { + modal.openModal({ uri }) + const session = await approval() + modal.closeModal() + } +``` -if (uri) { - modal.openModal({ uri }); - const session = await approval(); - modal.closeModal(); -} -/*highlight-delete-end*/ -/*highlight-add-start*/ +### How to use a Custom Network -// New Implementation +WalletConnect Modal has always been chain agnostic. AppKit Core is chain agnostic as well. Hence, you can configure custom networks like Polkadot, Cosmos, etc., using AppKit Core. -import { SignClient } from "@walletconnect/sign-client"; -import { createAppKit } from "@reown/appkit"; + + -const signClient = await SignClient.init({ - projectId: "YOUR_PROJECT_ID", - metadata: { - name: "My Website", - description: "My Website Description", - url: "https://mywebsite.com", // origin must match your domain & subdomain - icons: ["https://avatars.githubusercontent.com/u/37784886"], +```javascript +import { defineChain } from '@reown/appkit/networks' + +... + +const polkadot = defineChain({ + id: '91b171bb158e2d3848fa23a9f1c25182', + name: 'Polkadot', + nativeCurrency: { name: 'Polkadot', symbol: 'DOT', decimals: 10 }, + rpcUrls: { + default: { http: ['https://rpc.polkadot.io'], wss: 'wss://rpc.polkadot.io' } }, -}); + blockExplorers: { default: { name: 'Polkadot Explorer', url: 'https://polkadot.js.org/apps/' } }, + chainNamespace: 'polkadot', + caipNetworkId: 'polkadot:91b171bb158e2d3848fa23a9f1c25182' +}) + +... const modal = createAppKit({ - projectId: "YOUR_PROJECT_ID", - networks: [mainnet], -}); + projectId: 'YOUR_PROJECT_ID', + networks: [polkadot], + manualWCControl: true +}) // connect signClient and feed uri to modal const { uri, approval } = await signClient.connect({ - requiredNamespaces: { - eip155: { - methods: [ - "eth_sendTransaction", - "eth_signTransaction", - "eth_sign", - "personal_sign", - "eth_signTypedData", - ], - chains: ["eip155:1"], - events: ["chainChanged", "accountsChanged"], - }, - }, -}); - -if (uri) { - modal.open({ uri, view: "ConnectingWalletConnectBasic" }); - const session = await approval(); - modal.close(); -} -/*highlight-add-end*/ -``` + requiredNamespaces: { + eip155: { + methods: ['polkadot_signMessage', 'polkadot_signTransaction'], + chains: [polkadot.caipNetworkId], + events: [] + } + } + }) -### Changes +... -For projects and developers that are currently using the `SignClient` with `WalletConnectModal` there is one option for you to upgrade. +``` + -#### Option 1 -Replace `WalletConnectModal` with AppKit. Below is what the implementation would look like. + ```javascript -// Old Code -/*highlight-delete-start*/ -const modal = new WalletConnectModal({ - projectId: "YOUR_PROJECT_ID", - chains: ["eip155:1", "solana:mainnet"], -}); +import { defineChain } from '@reown/appkit/networks' -const { uri, approval } = await signClient.connect({ - requiredNamespaces: { - eip155: { - methods: [ - "eth_sendTransaction", - "eth_signTransaction", - "eth_sign", - "personal_sign", - "eth_signTypedData", - ], - chains: ["eip155:1"], - events: ["chainChanged", "accountsChanged"], - }, +... + +const cosmos = defineChain({ + id: 'cosmoshub-3', + name: 'Cosmos', + nativeCurrency: { name: 'Cosmos', symbol: 'ATOM', decimals: 6 }, + rpcUrls: { + default: { http: ['https://cosmos-rpc.publicnode.com:443'] } }, -}); + blockExplorers: { default: { name: 'Sui Explorer', url: 'https://suiexplorer.com/' } }, + testnet: false, + chainNamespace: 'cosmos', + caipNetworkId: 'cosmos:cosmoshub-4' +}) -if (uri) { - modal.openModal({ uri }); - const session = await approval(); - modal.closeModal(); -} -/*highlight-delete-end*/ +... -// New Code -/*highlight-add-start*/ const modal = createAppKit({ - projectId: "YOUR_PROJECT_ID", - networks: [mainnet], -}); + projectId: 'YOUR_PROJECT_ID', + networks: [cosmos], + manualWCControl: true +}) // connect signClient and feed uri to modal const { uri, approval } = await signClient.connect({ - requiredNamespaces: { - eip155: { - methods: [ - "eth_sendTransaction", - "eth_signTransaction", - "eth_sign", - "personal_sign", - "eth_signTypedData", - ], - chains: ["eip155:1"], - events: ["chainChanged", "accountsChanged"], - }, - }, -}); - -if (uri) { - modal.open({ uri, view: "ConnectingWalletConnectBasic" }); - const session = await approval(); - modal.close(); -} -/*highlight-add-end*/ + requiredNamespaces: { + cosmos: { + methods: ['cosmos_signDirect'], + chains: [cosmos.caipNetworkId], + events: [] + } + } + }) + +... ``` + + + + ### Examples -Below are the examples for the corresponding library/programming language. +Below are the examples for the corresponding library/programming language. 1. [HTML](https://github.com/reown-com/appkit/tree/main/examples/html-ak-basic-sign-client) 2. [React](https://github.com/reown-com/appkit/tree/main/examples/react-ak-basic-sign-client) 3. [NextJS](https://github.com/reown-com/appkit/tree/main/examples/next-ak-basic-sign-client-app-router) 4. [Vue](https://github.com/reown-com/appkit/tree/main/examples/vue-ak-basic-sign-client) + +## Setting up AppKit Core from scratch + +If you are setting up AppKit Core from scratch, you can refer to the "Multichain" section under AppKit "Core" for installation which shows a basic installation of AppKit Core. [Click here](/appkit/react/core/multichain?platform=basic) to learn more. + +### Examples + +Below are the examples for the corresponding library/programming language. + +1. [HTML](https://github.com/reown-com/appkit/tree/main/examples/html-ak-basic) +2. [React](https://github.com/reown-com/appkit/tree/main/examples/react-ak-basic) +3. [NextJS](https://github.com/reown-com/appkit/tree/main/examples/next-ak-basic-app-router) +4. [Vue](https://github.com/reown-com/appkit/tree/main/examples/vue-ak-basic) diff --git a/appkit/vue/core/composables.mdx b/appkit/vue/core/composables.mdx index 91558ff5b..4b5359805 100644 --- a/appkit/vue/core/composables.mdx +++ b/appkit/vue/core/composables.mdx @@ -1,11 +1,13 @@ +--- +title: Composables +--- + import WagmiComposables from "/snippets/appkit/vue/wagmi/composables.mdx"; import EthersComposables from "/snippets/appkit/vue/ethers/composables.mdx"; import Ethers5Composables from "/snippets/appkit/vue/ethers5/composables.mdx"; import SolanaComposables from "/snippets/appkit/vue/solana/composables.mdx"; import OpenModal from "/snippets/appkit/vue/core/open.mdx"; -# Composables - Composables are functions that will help you control the modal, subscribe to wallet events and interact with them and smart contracts. ## useAppKit diff --git a/appkit/vue/core/custom-connectors.mdx b/appkit/vue/core/custom-connectors.mdx index c99e46194..dcfe10c22 100644 --- a/appkit/vue/core/custom-connectors.mdx +++ b/appkit/vue/core/custom-connectors.mdx @@ -1,6 +1,8 @@ -# Custom connectors +--- +title: Custom connectors +--- -Add custom connectors for Ethers or Wagmi +In AppKit, a 'connector' is the bridge between your app and a user's wallet. This page shows how to add custom connectors beyond the default ones, allowing your users to connect with additional wallet types and authentication methods. @@ -16,8 +18,9 @@ import { createAppKit } from '@reown/appkit/vue' import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' import { http, WagmiProvider, CreateConnectorFn } from 'wagmi' -import { sepolia } from '@reown/appkit/networks' -import { walletConnect, coinbaseWallet, injected } from 'wagmi/connectors' +import { abstractTestnet } from '@reown/appkit/networks' +// you need to add the abstract library in order to make it work +import { abstractWalletConnector } from "@abstract-foundation/agw-react/connectors"; const projectId = 'YOUR_PROJECT_ID' @@ -25,23 +28,13 @@ const metadata = { //.... } -// create the connectors (delete the ones you don't need) +// create the custom connector (in this example Abastract) const connectors: CreateConnectorFn[] = [] -connectors.push(walletConnect({ projectId, metadata, showQrModal: false })) // showQrModal must be false -connectors.push(injected({ shimDisconnect: true })) -connectors.push( - coinbaseWallet({ - appName: metadata.name, - appLogoUrl: metadata.icons[0] - }) -) +connectors.push(abstractWalletConnector()) -const export networks = [sepolia] +const export networks = [abstractTestnet] export const wagmiAdapter = new WagmiAdapter({ - transports: { - [sepolia.id]: http() - }, connectors, projectId, networks @@ -52,72 +45,11 @@ export const config = wagmiAdapter.wagmiConfig createAppKit({ adapters: [wagmiAdapter], projectId, - networks: [sepolia] + networks }) ``` - - - -Coming soon... - - - -Add custom wallet adapters for Solana wallets by first installing the wallet adapter package and then including the adapters in the wallets array. You can find a more Solana wallet adapters [here](https://github.com/anza-xyz/wallet-adapter/tree/master/packages/wallets). - - - -```bash npm -npm install @solana/wallet-adapter-wallets -``` - -```bash Yarn -yarn add @solana/wallet-adapter-wallets -``` - -```bash Bun -bun a @solana/wallet-adapter-wallets -``` - -```bash pnpm -pnpm add @solana/wallet-adapter-wallets -``` - - -```ts -import { createAppKit } from "@reown/appkit/vue"; -import { SolanaAdapter } from "@reown/appkit-adapter-solana/vue"; -import { solana, solanaTestnet, solanaDevnet } from "@reown/appkit/networks"; - -import { - SolflareWalletAdapter, - PhantomWalletAdapter, -} from "@solana/wallet-adapter-wallets"; - -// 0. Set up Solana adapter -const solanaWeb3JsAdapter = new SolanaAdapter({ - wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()], -}); - -// 1. Get projectId from https://cloud.reown.com -const projectId = "YOUR_PROJECT_ID"; - -// 2. Set up the metadata -const metadata = { - //... -}; - -// 3. Create the modal -const modal = createAppKit({ - adapters: [solanaWeb3JsAdapter], - networks: [solana, solanaTestnet, solanaDevnet], - metadata: metadata, - projectId, - features: { - analytics: true, - }, -}); -``` +Check our Vue Wagmi demo in [Github](https://github.com/reown-com/appkit-web-examples/) diff --git a/appkit/vue/core/installation.mdx b/appkit/vue/core/installation.mdx index a3cdc8fea..3d4ee2362 100644 --- a/appkit/vue/core/installation.mdx +++ b/appkit/vue/core/installation.mdx @@ -126,19 +126,19 @@ pnpm add @reown/appkit @reown/appkit-adapter-ethers ethers ```bash npm -npm install @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets +npm install @reown/appkit @reown/appkit-adapter-solana ``` ```bash Yarn -yarn add @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets +yarn add @reown/appkit @reown/appkit-adapter-solana ``` ```bash Bun -bun add @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets +bun add @reown/appkit @reown/appkit-adapter-solana ``` ```bash pnpm -pnpm add @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets +pnpm add @reown/appkit @reown/appkit-adapter-solana ``` diff --git a/appkit/vue/core/theming.mdx b/appkit/vue/core/theming.mdx index 7f9c8b064..f9be7060a 100644 --- a/appkit/vue/core/theming.mdx +++ b/appkit/vue/core/theming.mdx @@ -1,5 +1,7 @@ -import Theming from "/snippets/appkit/shared/theming.mdx"; +--- +title: Theming +--- -# Theming +import Theming from "/snippets/appkit/shared/theming.mdx"; diff --git a/appkit/vue/notifications/backend-integration.mdx b/appkit/vue/notifications/backend-integration.mdx index afc5a2f88..919f14ecd 100644 --- a/appkit/vue/notifications/backend-integration.mdx +++ b/appkit/vue/notifications/backend-integration.mdx @@ -1,4 +1,6 @@ -# Backend Integration +--- +title: Backend Integration +--- Once an account is subscribed to your app's notifications you can test sending notifications to the account. You can subscribe in your app directly with our [Frontend Integration](frontend-integration/usage), or with one of the below testing options. diff --git a/appkit/vue/notifications/cloud-sending.mdx b/appkit/vue/notifications/cloud-sending.mdx index 840ab2ee1..6af33d9b7 100644 --- a/appkit/vue/notifications/cloud-sending.mdx +++ b/appkit/vue/notifications/cloud-sending.mdx @@ -1,4 +1,6 @@ -# Sending with Cloud +--- +title: Sending with Cloud +--- You can send notifications to subscribed users easily in [Reown Cloud](https://cloud.reown.com). Sending to users involves targeting particular [notification types](./cloud-setup#notification-types) who will receive your notification if they have not opted-out. You can specify a title and body for the notification, as well as a call-to-action link which users will be taken to when clicking on the notification. diff --git a/appkit/vue/notifications/cloud-setup.mdx b/appkit/vue/notifications/cloud-setup.mdx index 0528f9715..396fe68ed 100644 --- a/appkit/vue/notifications/cloud-setup.mdx +++ b/appkit/vue/notifications/cloud-setup.mdx @@ -1,6 +1,8 @@ -import CloudBanner from "/snippets/cloud-banner.mdx"; +--- +title: Cloud Setup +--- -# Cloud Setup +import CloudBanner from "/snippets/cloud-banner.mdx"; This page explains the configuration required in order to obtain a Notify API Secret and configure your project to send notifications. diff --git a/appkit/vue/notifications/demo.mdx b/appkit/vue/notifications/demo.mdx index 56770254b..8fd623237 100644 --- a/appkit/vue/notifications/demo.mdx +++ b/appkit/vue/notifications/demo.mdx @@ -1,4 +1,6 @@ -# Demo +--- +title: Demo +--- ## Try AppKit Notifications diff --git a/appkit/vue/notifications/frontend-integration/api.mdx b/appkit/vue/notifications/frontend-integration/api.mdx index 76e8f8523..d78fa0657 100644 --- a/appkit/vue/notifications/frontend-integration/api.mdx +++ b/appkit/vue/notifications/frontend-integration/api.mdx @@ -1,3 +1,7 @@ +--- +title: API +--- + import CloudBanner from "/snippets/cloud-banner.mdx"; import Initialization from "/snippets/appkit/shared/notifications/frontend-integration/api/initialization/javascript.mdx"; @@ -9,8 +13,6 @@ import Types from "/snippets/appkit/shared/notifications/frontend-integration/ap import RegisteringPush from "/snippets/appkit/shared/notifications/frontend-integration/api/registering-push/javascript.mdx"; import Events from "/snippets/appkit/shared/notifications/frontend-integration/api/events/javascript.mdx"; -# API - ## Initialization diff --git a/appkit/vue/notifications/frontend-integration/examples.mdx b/appkit/vue/notifications/frontend-integration/examples.mdx index 671312ae4..801c28bb6 100644 --- a/appkit/vue/notifications/frontend-integration/examples.mdx +++ b/appkit/vue/notifications/frontend-integration/examples.mdx @@ -1,4 +1,6 @@ -# Examples +--- +title: Examples +--- - Our production [GM App](https://gm.walletconnect.com) which sends daily "gm!" notifications to all subscribers. - [React GM Dapp](https://github.com/WalletConnect/gm-dapp) - a Web3Inbox Dapp using React, Typescript, Next.js & Ethers. diff --git a/appkit/vue/notifications/frontend-integration/migration-guide.mdx b/appkit/vue/notifications/frontend-integration/migration-guide.mdx index 6ad5c9dcb..1b9fb3f34 100644 --- a/appkit/vue/notifications/frontend-integration/migration-guide.mdx +++ b/appkit/vue/notifications/frontend-integration/migration-guide.mdx @@ -1,6 +1,8 @@ -import Migration from "/snippets/appkit/shared/notifications/frontend-integration/migration/javascript.mdx"; +--- +title: Migration Guide +--- -# Migration Guide +import Migration from "/snippets/appkit/shared/notifications/frontend-integration/migration/javascript.mdx"; ## General Migration notes diff --git a/appkit/vue/notifications/frontend-integration/usage.mdx b/appkit/vue/notifications/frontend-integration/usage.mdx index cb5aad1e1..a95515e80 100644 --- a/appkit/vue/notifications/frontend-integration/usage.mdx +++ b/appkit/vue/notifications/frontend-integration/usage.mdx @@ -1,8 +1,10 @@ +--- +title: Usage +--- + import Installation from "/snippets/appkit/shared/notifications/frontend-integration/usage/installation/javascript.mdx"; import Example from "/snippets/appkit/shared/notifications/frontend-integration/usage/example/javascript.mdx"; -# Usage - AppKit Notifications provides you the building blocks necessary to allow users to subscribe, receive notifications, and manage notification preferences, all from your app's UI. The Web3Inbox SDK supports both React hooks and JavaScript-based integrations. Before begin using Web3Inbox, you will first need to [setup your project](../cloud-setup) to send notifications. diff --git a/appkit/vue/payments/pay-with-exchange.mdx b/appkit/vue/payments/pay-with-exchange.mdx new file mode 100644 index 000000000..29b5c837f --- /dev/null +++ b/appkit/vue/payments/pay-with-exchange.mdx @@ -0,0 +1,8 @@ +--- +title: AppKit Pay with Exchange - Vue +sidebarTitle: Pay with Exchange +--- + +import AppKitPay from "/snippets/appkit/shared/appkit-pay-react.mdx"; + + diff --git a/appkit/vue/solana/about/implementation.mdx b/appkit/vue/solana/about/implementation.mdx index 66241e3d0..f9771c7b9 100644 --- a/appkit/vue/solana/about/implementation.mdx +++ b/appkit/vue/solana/about/implementation.mdx @@ -21,9 +21,7 @@ In your `App.vue` file set up the following configuration } // 3. Create Wagmi Adapter - const solanaWeb3JsAdapter = new SolanaAdapter({ - wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()] - }) + const solanaWeb3JsAdapter = new SolanaAdapter() reconnect(solanaConfig) diff --git a/appkit/vue/transactions/sponsored-transactions.mdx b/appkit/vue/transactions/sponsored-transactions.mdx index ee231b56f..7f1e2f57f 100644 --- a/appkit/vue/transactions/sponsored-transactions.mdx +++ b/appkit/vue/transactions/sponsored-transactions.mdx @@ -1,5 +1,7 @@ -import SponsoredTransactions from "/snippets/appkit/shared/sponsored-transactions.mdx"; +--- +title: Sponsored Transactions +--- -# Sponsored Transactions +import SponsoredTransactions from "/snippets/appkit/shared/sponsored-transactions.mdx"; diff --git a/appkit/vue/transactions/swaps.mdx b/appkit/vue/transactions/swaps.mdx index 7d0d55299..0300f3e89 100644 --- a/appkit/vue/transactions/swaps.mdx +++ b/appkit/vue/transactions/swaps.mdx @@ -1,5 +1,7 @@ -import Swaps from "/snippets/appkit/shared/swaps.mdx"; +--- +title: Swaps +--- -# Swaps +import Swaps from "/snippets/appkit/shared/swaps.mdx"; diff --git a/cloud/explorer-submission.mdx b/cloud/explorer-submission.mdx index 66132b9a7..239deb481 100644 --- a/cloud/explorer-submission.mdx +++ b/cloud/explorer-submission.mdx @@ -20,7 +20,7 @@ However, doing so ensures that your project is listed under [WalletGuide](https: ## Project Details -- Go to the "Explorer" tab and fill in the details of your project. +- Go to the "WalletGuide" tab and fill in the details of your wallet. diff --git a/cloud/user-management.mdx b/cloud/user-management.mdx index 5e0d67772..0cc604754 100644 --- a/cloud/user-management.mdx +++ b/cloud/user-management.mdx @@ -2,11 +2,11 @@ title: User Management --- -Easily view and manage all authenticated users through AppKit [Cloud Auth SIWX](/appkit/features/siwx/siwx-cloud-auth), a drop-in hosted SIWX server that provides key insights into your user base. +Easily view and manage all authenticated users through AppKit [Cloud Auth SIWX](/appkit/authentication/siwx/siwx-cloud-auth), a drop-in hosted SIWX server that provides key insights into your user base. ## Usage -Refer to [Cloud Auth SIWX](/appkit/features/siwx/siwx-cloud-auth) for instructions on enabling this feature with AppKit. +Refer to [Cloud Auth SIWX](/appkit/authentication/siwx/siwx-cloud-auth) for instructions on enabling this feature with AppKit. ## Dashboard diff --git a/docs.json b/docs.json index 17d31ecd4..a680b8975 100644 --- a/docs.json +++ b/docs.json @@ -1,6 +1,6 @@ { "$schema": "https://mintlify.com/docs.json", - "theme": "maple", + "theme": "mint", "name": "Reown Docs", "colors": { "primary": "#008847", @@ -50,106 +50,36 @@ "destination": "/advanced/multichain/rpc-reference/:path*" } ], + "contextual": { + "options": ["chatgpt", "claude", "copy", "view"] + }, "navigation": { - "dropdowns": [ + "tabs": [ { - "dropdown": "Introduction", - "icon": "book", - "description": "Overview of Reown", - "groups": [ + "tab": "Docs", + "pages": [ { "group": "Introduction", - "icon": "bolt", - "pages": ["overview", "external-link-01"] + "pages": ["overview"] }, { - "group": "SDKs", + "group": "Guides", "pages": [ { - "group": "AppKit", - "icon": "layer-group", - "pages": [ - "appkit/overview", - { - "group": "Features", - "pages": [ - "appkit/features/index", - "appkit/features/swaps", - "appkit/features/onramp", - "appkit/features/multichain", - "appkit/features/smart-accounts", - "appkit/features/notifications", - "appkit/features/telegram-mini-apps", - "appkit/features/sponsored-transactions" - ] - }, - { - "group": "Network", - "pages": [ - "appkit/networks/evm", - "appkit/networks/solana", - "appkit/networks/bitcoin" - ] - }, - { - "group": "Authentication", - "pages": [ - "appkit/authentication/socials", - "appkit/authentication/one-click-auth", - "appkit/features/siwx/default" - ] - }, - { - "group": "Recipes", - "pages": [ - "appkit/recipes/telegram-mini-app", - "appkit/recipes/tenderly-virtual-testnets", - "appkit/recipes/wagmi-send-transaction", - "appkit/recipes/ethers-send-transaction", - "appkit/recipes/EVM-smart-contract-interaction", - "appkit/recipes/solana-send-transaction", - "appkit/recipes/bitcoin-send-transaction", - "appkit/recipes/switching-to-send-calls", - "appkit/recipes/sponsoring-first-transaction" - ] - }, - { - "group": "Upgrade", - "pages": ["appkit/upgrade/from-w3m-to-reown"] - }, - { - "group": "Migration", - "pages": [ - "appkit/migration/index", - "appkit/migration/from-rainbowkit-next", - "appkit/migration/from-connectkit-next", - "appkit/migration/from-anza-adapter-react" - ] - } - ] - }, - { - "group": "WalletKit", - "icon": "wallet", - "pages": [ - "walletkit/overview", - { - "group": "Features", - "pages": [ - "walletkit/features/one-click-auth", - "walletkit/features/notifications", - "walletkit/features/verify", - { - "group": "Early Access", - "pages": ["walletkit/features/early-access/chain-abstraction"] - } - ] - }, - "walletkit/best-practices", - { - "group": "Upgrade", - "pages": ["walletkit/upgrade/from-web3wallet-to-reown"] - } + "group": "AppKit Guides", + "pages":[ + "appkit/recipes/telegram-mini-app", + "appkit/recipes/tenderly-virtual-testnets", + "appkit/recipes/wagmi-send-transaction", + "appkit/recipes/ethers-send-transaction", + "appkit/recipes/EVM-smart-contract-interaction", + "appkit/recipes/solana-send-transaction", + "appkit/recipes/bitcoin-send-transaction", + "appkit/recipes/switching-to-send-calls", + "appkit/recipes/sponsoring-first-transaction", + "appkit/recipes/travel-rule", + "appkit/recipes/smart-sessions", + "appkit/recipes/troubleshooting" ] } ] @@ -157,15 +87,20 @@ { "group": "Cloud", "pages": [ - "cloud/explorer", - "cloud/explorer-submission", { - "group": "Explorer Chains", - "pages": ["cloud/chains/overview", "cloud/chains/chain-list"] - }, - { - "group": "Explorer Wallets", - "pages": ["cloud/wallets/wallet-list"] + "group": "Explorer", + "pages": [ + "cloud/explorer", + "cloud/explorer-submission", + { + "group": "Explorer Chains", + "pages": ["cloud/chains/overview", "cloud/chains/chain-list"] + }, + { + "group": "Explorer Wallets", + "pages": ["cloud/wallets/wallet-list"] + } + ] }, "cloud/user-management", "cloud/verify", @@ -255,21 +190,123 @@ }, { "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] + "pages": ["link-spec", "external-link-01", "advanced/faq"] } ] }, { - "dropdown": "AppKit - React", - "icon": "react", - "description": "AppKit on React", - "groups": [ + "tab": "AppKit", + "icon": "layer-group", + "dropdowns": [ { - "group": "AppKit", + "dropdown": "AppKit - Overview", "icon": "layer-group", "pages": [ { - "group": "Core", + "group": "Getting Started", + "pages": ["appkit/overview"] + }, + { + "group": "Features", + "pages": [ + "appkit/features/index", + "appkit/features/swaps", + "appkit/features/onramp", + "appkit/features/multichain", + "appkit/features/smart-accounts", + "appkit/features/notifications", + "appkit/features/telegram-mini-apps", + "appkit/features/sponsored-transactions", + "appkit/features/smart-sessions", + "appkit/features/chain-abstraction" + ] + }, + { + "group": "Authentication", + "pages": [ + "appkit/authentication/socials", + "appkit/authentication/one-click-auth", + "appkit/authentication/siwx/default" + ] + }, + { + "group": "Payments", + "pages": [ + "appkit/payments/overview", + "appkit/payments/pay-with-exchange", + "appkit/payments/one-click-checkout", + "appkit/payments/subscriptions" + ] + }, + { + "group": "Network", + "pages": [ + "appkit/networks/evm", + "appkit/networks/solana", + "appkit/networks/bitcoin" + ] + }, + { + "group": "Guides", + "pages": [ + "appkit/recipes/telegram-mini-app", + "appkit/recipes/tenderly-virtual-testnets", + "appkit/recipes/wagmi-send-transaction", + "appkit/recipes/ethers-send-transaction", + "appkit/recipes/EVM-smart-contract-interaction", + "appkit/recipes/solana-send-transaction", + "appkit/recipes/bitcoin-send-transaction", + "appkit/recipes/switching-to-send-calls", + "appkit/recipes/sponsoring-first-transaction", + "appkit/recipes/travel-rule", + "appkit/recipes/smart-sessions", + "appkit/recipes/troubleshooting" + ] + }, + { + "group": "Upgrade", + "pages": [ + { + "group": "AppKit", + "pages": [ + { + "group": "Web3Modal to Reown AppKit", + "pages": [ + "appkit/upgrade/from-w3m-to-reown", + { + "group": "Reown AppKit - Web", + "pages": ["appkit/upgrade/to-reown-appkit-web", "appkit/upgrade/to-reown-appkit-ethers-web", "appkit/upgrade/to-reown-appkit-ethers5-web", "appkit/upgrade/to-reown-appkit-solana-web"] + }, + "appkit/upgrade/from-web3modal-react-native", + "appkit/upgrade/from-web3modal-flutter", + "appkit/upgrade/from-web3modal-android", + "appkit/upgrade/from-web3modal-ios", + "appkit/upgrade/from-web3modal-unity" + ] + } + ] + }, + "appkit/upgrade/wcm" + ] + }, + { + "group": "Migration", + "pages": [ + "appkit/migration/index", + "appkit/migration/from-rainbowkit-next", + "appkit/migration/from-connectkit-next", + "appkit/migration/from-anza-adapter-react" + ] + } + ] + }, + { + "dropdown": "React", + "icon": "react", + "description": "AppKit on React", + "pages": [ + { + "group": "Fundamentals", "pages": [ "appkit/react/core/installation", "appkit/react/core/hooks", @@ -293,6 +330,12 @@ "appkit/react/early-access/chain-abstraction" ] }, + { + "group": "Payments", + "pages": [ + "appkit/react/payments/pay-with-exchange" + ] + }, { "group": "Transactions", "pages": [ @@ -327,35 +370,25 @@ ] } ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/react/cloud/verify", + "appkit/react/cloud/relay", + "appkit/react/cloud/blockchain-api", + "appkit/react/cloud/analytics" + ] } ] }, { - "group": "Cloud", - "pages": [ - "appkit/react/cloud/verify", - "appkit/react/cloud/relay", - "appkit/react/cloud/blockchain-api", - "appkit/react/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "AppKit - Next", - "icon": "square-n", - "description": "AppKit on NextJS", - "groups": [ - { - "group": "AppKit", - "icon": "layer-group", + "dropdown": "Next", + "icon": "square-n", + "description": "AppKit on NextJS", "pages": [ { - "group": "Core", + "group": "Fundamentals", "pages": [ "appkit/next/core/installation", "appkit/next/core/hooks", @@ -379,12 +412,18 @@ "appkit/next/early-access/chain-abstraction" ] }, + { + "group": "Payments", + "pages": [ + "appkit/next/payments/pay-with-exchange" + ] + }, { "group": "Transactions", "pages": [ "appkit/next/transactions/onramp", "appkit/next/transactions/swaps", - "appkit/next/transactions/sponsored-transactions" + "appkit/next/transactions/sponsored-transactions" ] }, { @@ -413,35 +452,25 @@ ] } ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/next/cloud/verify", + "appkit/next/cloud/relay", + "appkit/next/cloud/blockchain-api", + "appkit/next/cloud/analytics" + ] } ] }, { - "group": "Cloud", - "pages": [ - "appkit/next/cloud/verify", - "appkit/next/cloud/relay", - "appkit/next/cloud/blockchain-api", - "appkit/next/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "AppKit - Vue", - "icon": "vuejs", - "description": "AppKit on VueJS", - "groups": [ - { - "group": "AppKit", - "icon": "layer-group", + "dropdown": "Vue", + "icon": "vuejs", + "description": "AppKit on VueJS", "pages": [ { - "group": "Core", + "group": "Fundamentals", "pages": [ "appkit/vue/core/installation", "appkit/vue/core/composables", @@ -460,7 +489,15 @@ }, { "group": "Early Access", - "pages": ["appkit/vue/early-access/smart-session"] + "pages": [ + "appkit/vue/early-access/smart-session" + ] + }, + { + "group": "Payments", + "pages": [ + "appkit/vue/payments/pay-with-exchange" + ] }, { "group": "Transactions", @@ -496,35 +533,25 @@ ] } ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/vue/cloud/verify", + "appkit/vue/cloud/relay", + "appkit/vue/cloud/blockchain-api", + "appkit/vue/cloud/analytics" + ] } ] }, { - "group": "Cloud", - "pages": [ - "appkit/vue/cloud/verify", - "appkit/vue/cloud/relay", - "appkit/vue/cloud/blockchain-api", - "appkit/vue/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "AppKit - Javascript", - "icon": "js", - "description": "AppKit on Javascript", - "groups": [ - { - "group": "AppKit", - "icon": "layer-group", + "dropdown": "JavaScript", + "icon": "js", + "description": "AppKit on JavaScript", "pages": [ { - "group": "Core", + "group": "Fundamentals", "pages": [ "appkit/javascript/core/installation", "appkit/javascript/core/actions", @@ -543,7 +570,15 @@ }, { "group": "Early Access", - "pages": ["appkit/javascript/early-access/smart-session"] + "pages": [ + "appkit/javascript/early-access/smart-session" + ] + }, + { + "group": "Payments", + "pages": [ + "appkit/javascript/payments/pay-with-exchange" + ] }, { "group": "Transactions", @@ -579,35 +614,25 @@ ] } ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/javascript/cloud/verify", + "appkit/javascript/cloud/relay", + "appkit/javascript/cloud/blockchain-api", + "appkit/javascript/cloud/analytics" + ] } ] }, { - "group": "Cloud", - "pages": [ - "appkit/javascript/cloud/verify", - "appkit/javascript/cloud/relay", - "appkit/javascript/cloud/blockchain-api", - "appkit/javascript/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "AppKit - React Native", - "icon": "mobile-screen-button", - "description": "AppKit on React Native", - "groups": [ - { - "group": "AppKit", - "icon": "layer-group", + "dropdown": "React Native", + "icon": "mobile-screen-button", + "description": "AppKit on React Native", "pages": [ { - "group": "Core", + "group": "Fundamentals", "pages": [ "appkit/react-native/core/installation", "appkit/react-native/core/options", @@ -647,35 +672,25 @@ ] } ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/react-native/cloud/verify", + "appkit/react-native/cloud/relay", + "appkit/react-native/cloud/blockchain-api", + "appkit/react-native/cloud/analytics" + ] } ] }, { - "group": "Cloud", - "pages": [ - "appkit/react-native/cloud/verify", - "appkit/react-native/cloud/relay", - "appkit/react-native/cloud/blockchain-api", - "appkit/react-native/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "AppKit - Flutter", - "icon": "flutter", - "description": "AppKit on Flutter", - "groups": [ - { - "group": "AppKit", - "icon": "layer-group", + "dropdown": "Flutter", + "icon": "flutter", + "description": "AppKit on Flutter", "pages": [ { - "group": "Core", + "group": "Fundamentals", "pages": [ "appkit/flutter/core/installation", "appkit/flutter/core/usage", @@ -688,35 +703,25 @@ "appkit/flutter/core/theming", "appkit/flutter/core/custom-chains" ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/flutter/cloud/verify", + "appkit/flutter/cloud/relay", + "appkit/flutter/cloud/blockchain-api", + "appkit/flutter/cloud/analytics" + ] } ] }, { - "group": "Cloud", - "pages": [ - "appkit/flutter/cloud/verify", - "appkit/flutter/cloud/relay", - "appkit/flutter/cloud/blockchain-api", - "appkit/flutter/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "AppKit - Android", - "icon": "android", - "description": "AppKit on Android", - "groups": [ - { - "group": "AppKit", - "icon": "layer-group", + "dropdown": "Android", + "icon": "android", + "description": "AppKit on Android", "pages": [ { - "group": "Core", + "group": "Fundamentals", "pages": [ "appkit/android/core/installation", "appkit/android/core/usage", @@ -726,35 +731,25 @@ "appkit/android/core/components", "appkit/android/core/theming" ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/android/cloud/verify", + "appkit/android/cloud/relay", + "appkit/android/cloud/blockchain-api", + "appkit/android/cloud/analytics" + ] } ] }, { - "group": "Cloud", - "pages": [ - "appkit/android/cloud/verify", - "appkit/android/cloud/relay", - "appkit/android/cloud/blockchain-api", - "appkit/android/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "AppKit - iOS", - "icon": "apple", - "description": "AppKit on iOS", - "groups": [ - { - "group": "AppKit", - "icon": "layer-group", + "dropdown": "iOS", + "icon": "apple", + "description": "AppKit on iOS", "pages": [ { - "group": "Core", + "group": "Fundamentals", "pages": [ "appkit/ios/core/installation", "appkit/ios/core/usage", @@ -763,35 +758,25 @@ "appkit/ios/core/one-click-auth", "appkit/ios/core/custom-chains" ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/ios/cloud/verify", + "appkit/ios/cloud/relay", + "appkit/ios/cloud/blockchain-api", + "appkit/ios/cloud/analytics" + ] } ] }, { - "group": "Cloud", - "pages": [ - "appkit/ios/cloud/verify", - "appkit/ios/cloud/relay", - "appkit/ios/cloud/blockchain-api", - "appkit/ios/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "AppKit - Unity", - "icon": "unity", - "description": "AppKit on Unity", - "groups": [ - { - "group": "AppKit", - "icon": "layer-group", + "dropdown": "Unity", + "icon": "unity", + "description": "AppKit on Unity", "pages": [ { - "group": "Core", + "group": "Fundamentals", "pages": [ "appkit/unity/core/installation", "appkit/unity/core/usage", @@ -803,175 +788,187 @@ "appkit/unity/core/socials", "appkit/unity/core/smart-accounts" ] + }, + { + "group": "Cloud", + "pages": [ + "appkit/unity/cloud/verify", + "appkit/unity/cloud/relay", + "appkit/unity/cloud/blockchain-api", + "appkit/unity/cloud/analytics" + ] } ] - }, - { - "group": "Cloud", - "pages": [ - "appkit/unity/cloud/verify", - "appkit/unity/cloud/relay", - "appkit/unity/cloud/blockchain-api", - "appkit/unity/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] } ] }, { - "dropdown": "WalletKit - Web", - "icon": "js", - "description": "WalletKit on Web", - "groups": [ + "tab": "WalletKit", + "icon": "wallet", + "dropdowns": [ { - "group": "WalletKit", + "dropdown": "WalletKit - Overview", "icon": "wallet", + "pages": [ + { + "group": "Getting Started", + "pages": ["walletkit/overview"] + }, + { + "group": "Features", + "pages": [ + "walletkit/features/verify", + "walletkit/features/link-mode", + "walletkit/features/one-click-auth", + "walletkit/features/chain-abstraction", + "walletkit/features/notifications" + ] + }, + { + "group": "Production", + "pages": ["walletkit/best-practices"] + }, + { + "group": "Upgrade", + "pages": [ + { + "group": "Web3Wallet to Reown WalletKit", + "pages": [ + "walletkit/upgrade/from-web3wallet-to-reown", + "walletkit/upgrade/from-web3wallet-web", + "walletkit/upgrade/from-web3wallet-react-native", + "walletkit/upgrade/from-web3wallet-flutter", + "walletkit/upgrade/from-web3wallet-android", + "walletkit/upgrade/from-web3wallet-ios", + "walletkit/upgrade/from-web3wallet-unity" + ] + } + ] + } + ] + }, + { + "dropdown": "Web", + "icon": "js", + "description": "WalletKit on Web", "pages": [ "walletkit/web/installation", "walletkit/web/usage", "walletkit/web/one-click-auth", "walletkit/web/verify", "walletkit/web/eip5792", + "walletkit/web/chain-abstraction", "walletkit/web/best-practices", - "walletkit/web/resources" + "walletkit/web/resources", + { + "group": "Cloud", + "pages": [ + "walletkit/web/cloud/explorer-submission", + "walletkit/web/cloud/verify", + "walletkit/web/cloud/relay", + "walletkit/web/cloud/analytics" + ] + } ] }, { - "group": "Cloud", + "dropdown": "Android", + "icon": "android", + "description": "WalletKit on Android", "pages": [ - "walletkit/web/cloud/explorer-submission", - "walletkit/web/cloud/verify", - "walletkit/web/cloud/relay", - "walletkit/web/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "WalletKit - iOS", - "icon": "apple", - "description": "WalletKit on iOS", - "groups": [ - { - "group": "WalletKit", - "icon": "wallet", - "pages": [ - "walletkit/ios/installation", - "walletkit/ios/usage", - "walletkit/ios/one-click-auth", - "walletkit/ios/mobile-linking", - "walletkit/ios/link-mode", - "walletkit/ios/verify", - "walletkit/ios/eip5792", + { + "group": "Core", + "pages": [ + "walletkit/android/installation", + "walletkit/android/usage", + "walletkit/android/one-click-auth", + "walletkit/android/mobile-linking", + "walletkit/android/link-mode", + "walletkit/android/verify", + "walletkit/android/eip5792", + "walletkit/android/chain-abstraction", + "walletkit/android/best-practices", + "walletkit/android/resources" + ] + }, { "group": "Notifications", "pages": [ { "group": "Notify", "pages": [ - "walletkit/ios/notifications/notify/overview", - "walletkit/ios/notifications/notify/installation", - "walletkit/ios/notifications/notify/usage", - "walletkit/ios/notifications/notify/spam-protection", - "walletkit/ios/notifications/notify/resources" + "walletkit/android/notifications/notify/overview", + "walletkit/android/notifications/notify/installation", + "walletkit/android/notifications/notify/usage", + "walletkit/android/notifications/notify/spam-protection", + "walletkit/android/notifications/notify/resources" ] }, - "walletkit/ios/notifications/push" + "walletkit/android/notifications/push" ] }, { - "group": "Early Access", - "pages": ["walletkit/ios/early-access/chain-abstraction"] - }, - "walletkit/ios/best-practices", - "walletkit/ios/resources" - ] - }, - { - "group": "Cloud", - "pages": [ - "walletkit/ios/cloud/explorer-submission", - "walletkit/ios/cloud/verify", - "walletkit/ios/cloud/relay", - "walletkit/ios/cloud/analytics" + "group": "Cloud", + "pages": [ + "walletkit/android/cloud/explorer-submission", + "walletkit/android/cloud/verify", + "walletkit/android/cloud/relay", + "walletkit/android/cloud/analytics" + ] + } ] }, { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "WalletKit - Android", - "icon": "android", - "description": "WalletKit on Android", - "groups": [ - { - "group": "WalletKit", - "icon": "wallet", + "dropdown": "iOS", + "icon": "apple", + "description": "WalletKit on iOS", "pages": [ - "walletkit/android/installation", - "walletkit/android/usage", - "walletkit/android/one-click-auth", - "walletkit/android/mobile-linking", - "walletkit/android/link-mode", - "walletkit/android/verify", - "walletkit/android/eip5792", + { + "group": "Core", + "pages": [ + "walletkit/ios/installation", + "walletkit/ios/usage", + "walletkit/ios/one-click-auth", + "walletkit/ios/mobile-linking", + "walletkit/ios/link-mode", + "walletkit/ios/verify", + "walletkit/ios/eip5792", + "walletkit/ios/chain-abstraction", + "walletkit/ios/best-practices", + "walletkit/ios/resources" + ] + }, { "group": "Notifications", "pages": [ { "group": "Notify", "pages": [ - "walletkit/android/notifications/notify/overview", - "walletkit/android/notifications/notify/installation", - "walletkit/android/notifications/notify/usage", - "walletkit/android/notifications/notify/spam-protection", - "walletkit/android/notifications/notify/resources" + "walletkit/ios/notifications/notify/overview", + "walletkit/ios/notifications/notify/installation", + "walletkit/ios/notifications/notify/usage", + "walletkit/ios/notifications/notify/spam-protection", + "walletkit/ios/notifications/notify/resources" ] }, - "walletkit/android/notifications/push" + "walletkit/ios/notifications/push" ] }, { - "group": "Early Access", - "pages": ["walletkit/android/early-access/chain-abstraction"] - }, - "walletkit/android/best-practices", - "walletkit/android/resources" - ] - }, - { - "group": "Cloud", - "pages": [ - "walletkit/android/cloud/explorer-submission", - "walletkit/android/cloud/verify", - "walletkit/android/cloud/relay", - "walletkit/android/cloud/analytics" + "group": "Cloud", + "pages": [ + "walletkit/ios/cloud/explorer-submission", + "walletkit/ios/cloud/verify", + "walletkit/ios/cloud/relay", + "walletkit/ios/cloud/analytics" + ] + } ] }, { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "WalletKit - Flutter", - "icon": "flutter", - "description": "WalletKit on Flutter", - "groups": [ - { - "group": "WalletKit", - "icon": "wallet", + "dropdown": "Flutter", + "icon": "flutter", + "description": "WalletKit on Flutter", "pages": [ "walletkit/flutter/installation", "walletkit/flutter/usage", @@ -979,40 +976,39 @@ "walletkit/flutter/mobile-linking", "walletkit/flutter/link-mode", "walletkit/flutter/verify", - "walletkit/flutter/eip5792" - ] - }, - { - "group": "Cloud", - "pages": [ - "walletkit/flutter/cloud/explorer-submission", - "walletkit/flutter/cloud/verify", - "walletkit/flutter/cloud/relay", - "walletkit/flutter/cloud/analytics" + "walletkit/flutter/eip5792", + "walletkit/flutter/chain-abstraction", + { + "group": "Cloud", + "pages": [ + "walletkit/flutter/cloud/explorer-submission", + "walletkit/flutter/cloud/verify", + "walletkit/flutter/cloud/relay", + "walletkit/flutter/cloud/analytics" + ] + } ] }, { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "WalletKit - React Native", - "icon": "mobile-screen-button", - "description": "WalletKit on React Native", - "groups": [ - { - "group": "WalletKit", - "icon": "wallet", + "dropdown": "React Native", + "icon": "mobile-screen-button", + "description": "WalletKit on React Native", "pages": [ - "walletkit/react-native/installation", - "walletkit/react-native/usage", - "walletkit/react-native/one-click-auth", - "walletkit/react-native/mobile-linking", - "walletkit/react-native/link-mode", - "walletkit/react-native/verify", - "walletkit/react-native/eip5792", + { + "group": "Core", + "pages": [ + "walletkit/react-native/installation", + "walletkit/react-native/usage", + "walletkit/react-native/one-click-auth", + "walletkit/react-native/mobile-linking", + "walletkit/react-native/link-mode", + "walletkit/react-native/verify", + "walletkit/react-native/eip5792", + "walletkit/react-native/chain-abstraction", + "walletkit/react-native/best-practices", + "walletkit/react-native/resources" + ] + }, { "group": "Notifications", "pages": [ @@ -1028,71 +1024,34 @@ "walletkit/react-native/notifications/push" ] }, - "walletkit/react-native/best-practices", - "walletkit/react-native/resources" - ] - }, - { - "group": "Cloud", - "pages": [ - "walletkit/react-native/cloud/explorer-submission", - "walletkit/react-native/cloud/verify", - "walletkit/react-native/cloud/relay", - "walletkit/react-native/cloud/analytics", { - "group": "Early Access", - "pages": ["walletkit/react-native/early-access/chain-abstraction"] + "group": "Cloud", + "pages": [ + "walletkit/react-native/cloud/explorer-submission", + "walletkit/react-native/cloud/verify", + "walletkit/react-native/cloud/relay", + "walletkit/react-native/cloud/analytics" + ] } ] }, { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "WalletKit - .NET", - "icon": "code", - "description": "WalletKit on .NET", - "groups": [ - { - "group": "WalletKit", - "icon": "wallet", + "dropdown": ".NET", + "icon": "code", + "description": "WalletKit on .NET", "pages": [ "walletkit/c-sharp/installation", "walletkit/c-sharp/usage", - "walletkit/c-sharp/verify" - ] - }, - { - "group": "Cloud", - "pages": [ - "walletkit/c-sharp/cloud/explorer-submission", - "walletkit/c-sharp/cloud/verify", - "walletkit/c-sharp/cloud/relay", - "walletkit/c-sharp/cloud/analytics" - ] - }, - { - "group": "Technical Reference", - "pages": ["link-spec", "advanced/faq"] - } - ] - }, - { - "dropdown": "WalletConnectModal", - "icon": "wallet", - "description": "Guides on how to use WalletConnectModal", - "groups": [ - { - "group": "WalletConnectModal", - "pages": [ - "advanced/walletconnectmodal/about", - "advanced/walletconnectmodal/usage", - "advanced/walletconnectmodal/options", - "advanced/walletconnectmodal/theming", - "advanced/walletconnectmodal/resources" + "walletkit/c-sharp/verify", + { + "group": "Cloud", + "pages": [ + "walletkit/c-sharp/cloud/explorer-submission", + "walletkit/c-sharp/cloud/verify", + "walletkit/c-sharp/cloud/relay", + "walletkit/c-sharp/cloud/analytics" + ] + } ] } ] @@ -1107,7 +1066,7 @@ }, { "anchor": "Community", - "href": "https://discord.com/invite/kdTQHQ6AFQ", + "href": "https://discord.gg/reown", "icon": "discord" }, { @@ -1137,11 +1096,12 @@ }, "footer": { "socials": { + "website": "https://reown.com/", "x": "https://x.com/reown_", + "discord": "https://discord.gg/reown", + "linkedin": "https://www.linkedin.com/company/re-own", "github": "https://github.com/reown-com/reown-docs", - "website": "https://reown.com/", - "youtube": "https://www.youtube.com/@re_own", - "linkedin": "https://www.linkedin.com/company/re-own" + "youtube": "https://www.youtube.com/@re_own" } } } diff --git a/docs/walletkit/flutter/early-access/chain-abstraction.mdx b/docs/walletkit/flutter/early-access/chain-abstraction.mdx new file mode 100644 index 000000000..3660e334b --- /dev/null +++ b/docs/walletkit/flutter/early-access/chain-abstraction.mdx @@ -0,0 +1,243 @@ +import ChainAbstractionIntro from '../../shared/chain-abstraction-intro.mdx' + +# Chain Abstraction + + + +## Methods + +The following methods from WalletKit are used in implementing chain abstraction. + +:::note +💡 Chain abstraction is currently in the early access phase, use it carefully +::: + +### Prepare + +This method is used to check if chain abstraction is needed. If it is, it will return a response with the necessary transactions. +If it is not, it will return a response with the original transaction. + +```swift +Future prepare({ + required String chainId, + required String from, + required CallCompat call, + Currency? localCurrency, +}); +``` + +### Execute + +This method is used to execute the chain abstraction operation. The method will handle broadcasting all transactions in the correct order and monitor the cross-chain transfer process. It returns an `ExecuteDetails` object with the transaction status and results. + +```swift +Future execute({ + required UiFieldsCompat uiFields, + required List routeTxnSigs, + required String initialTxnSig, +}) +``` + +## Usage + +When sending a transaction, first check if chain abstraction is needed using the `prepare` method. Call the `execute` method to broadcast the routing and initial transactions and wait for it to be completed. + +If the operation is successful, you need to broadcast the initial transaction and await the transaction hash and receipt. +If the operation is not successful, send a JsonRpcError to the dapp and display the error to the user. + +```swift +final response = await _walletKit.prepare( + chainId: chainId, // selected chain id + from: from, // sender address + call: CallCompat( + to: to, // contract address + input: input, // calldata + ), +); +response.when( + success: (PrepareDetailedResponseSuccessCompat deatailResponse) { + deatailResponse.when( + available: (UiFieldsCompat uiFieldsCompat) { + // If the route is available, present a CA transaction UX flow and sign hashes when approved + final TxnDetailsCompat initial = uiFieldsCompat.initial; + final List route = uiFieldsCompat.route; + + final String initialSignature = signHashMethod(initial.transactionHashToSign); + final List routeSignatures = route.map((route) { + final String rSignature = signHashMethod(route.transactionHashToSign); + return rSignature; + }).toList(); + + await _walletKit.execute( + uiFields: uiFields, + initialTxnSig: initialSignature, + routeTxnSigs: routeSignatures, + ); + }, + notRequired: (PrepareResponseNotRequiredCompat notRequired) { + // user does not need to move funds from other chains + // proceeds as normal transaction with notRequired.initialTransaction + }, + ); + }, + error: (PrepareResponseError prepareError) { + // Show an error + // contains prepareError.error as BridgingError and could be either: + // noRoutesAvailable, insufficientFunds, insufficientGasFunds + }, +); +``` + +### Implementation during Session Request + +If you are looking to trigger Chain Abstraction during a eth_sendTransaction Session Request you should do it inside the session request handler as explained in [Responding to Session requests](../usage.mdx#responding-to-session-requests) section. + +```swift +Future _ethSendTransactionHandler(String topic, dynamic params) async { + final SessionRequest pendingRequest = _walletKit.pendingRequests.getAll().last; + final int requestId = pendingRequest.id; + final String chainId = pendingRequest.chainId; + + final transaction = (params as List).first as Map; + + // Intercept to check if Chain Abstraction is required + if (transaction.containsKey('input') || transaction.containsKey('data')) { + final inputData = transaction.containsKey('input') ?? transaction.containsKey('data'); + final response = await _walletKit.prepare( + chainId: chainId, + from: transaction['from'], + call: CallCompat( + to: transaction['to'], + input: inputData, + ), + ); + response.when( + success: (PrepareDetailedResponseSuccessCompat deatailResponse) { + deatailResponse.when( + available: (UiFieldsCompat uiFieldsCompat) { + // Only if the route is available, present a Chain Abstraction approval modal + // and proceed with execute() method + if (approved) { + final TxnDetailsCompat initial = uiFieldsCompat.initial; + final List route = uiFieldsCompat.route; + + final String initialSignature = signHashMethod(initial.transactionHashToSign); + final List routeSignatures = route.map((route) { + final String rSignature = signHashMethod(route.transactionHashToSign); + return rSignature; + }).toList(); + + final executeResponse = await _walletKit.execute( + uiFields: uiFields, + initialTxnSig: initialSignature, + routeTxnSigs: routeSignatures, + ); + + // Respond to the session request. Flow shouldn't end here as the transaction was processed + return await _walletKit.respondSessionRequest( + topic: topic, + response: JsonRpcResponse( + id: requestId, + jsonrpc: '2.0', + result: executeResponse.initialTxnReceipt, + ), + ); + } + }, + // If deatailResponse is not `available` type + // then let the flow to continue to regular send transacrion + ); + }, + ); + } + + // display a prompt for the user to approve or reject the request + // if approved + if (approved) { + final signedTx = await sendTransaction(transaction, int.parse(chainId)); + // respond to requester + await _walletKit.respondSessionRequest( + topic: topic, + response: JsonRpcResponse( + id: requestId, + jsonrpc: '2.0', + result: signedTx, + ), + ); + } + + // if rejected + return _walletKit.respondSessionRequest( + topic: topic, + response: JsonRpcResponse( + id: id, + jsonrpc: '2.0', + error: const JsonRpcError(code: 5001, message: 'User rejected method'), + ), + ); +} + +``` + +For example, check out implementation of chain abstraction in [sample wallet](https://github.com/reown-com/reown_flutter/blob/develop/packages/reown_walletkit/example/lib/dependencies/chain_services/evm_service.dart) with Flutter. + +### Token Balance + +You can use this method to query the token balance of the given address + +```swift +Future erc20TokenBalance({ + required String chainId, // chain id + required String token, // token address + required String owner, // user address +}) +``` + +## Android + +In your android (project's) build.gradle file add support for Jitpack: + +``` +allprojects { + repositories { + google() + mavenCentral() + maven { url 'https://jitpack.io' } // <- add jipack url + } +} +``` + +It shouldn't happen but if you encounter issues with minification, add the below rules to your application: + +``` +-keepattributes *Annotation* + +-keep class com.sun.jna.** { *; } +-keepclassmembers class com.sun.jna.** { + native ; + *; +} + +-keep class uniffi.** { *; } + +# Preserve all public and protected fields and methods +-keepclassmembers class ** { + public *; + protected *; +} + +-dontwarn uniffi.** +-dontwarn com.sun.jna.** +``` + +## Testing + +Best way to test Chain Abstraction is to use our Sample wallet. +- [Sample Wallet for iOS](https://testflight.apple.com/join/Uv0XoBuD) +- [Sample Wallet for Android](https://appdistribution.firebase.dev/i/2b8b3dce9e2831cd) + +You can also use the [AppKit laboratory](https://appkit-lab.reown.com/library/wagmi/) and try sending [USDC/USDT](../../../walletkit/features/early-access/chain-abstraction.mdx#what-are-the-supported-tokens-and-networks) with any chain abstraction-supported wallet. + + diff --git a/images/appkit-one-click-checkout.mp4 b/images/appkit-one-click-checkout.mp4 new file mode 100644 index 000000000..6d5fa7ec8 Binary files /dev/null and b/images/appkit-one-click-checkout.mp4 differ diff --git a/images/appkit-overview-demo.mp4 b/images/appkit-overview-demo.mp4 new file mode 100644 index 000000000..ff56c80b6 Binary files /dev/null and b/images/appkit-overview-demo.mp4 differ diff --git a/images/appkit-pay-with-exchange.mp4 b/images/appkit-pay-with-exchange.mp4 new file mode 100644 index 000000000..8e8e408f8 Binary files /dev/null and b/images/appkit-pay-with-exchange.mp4 differ diff --git a/images/appkit-pay.png b/images/appkit-pay.png new file mode 100644 index 000000000..4b5114d21 Binary files /dev/null and b/images/appkit-pay.png differ diff --git a/images/appkit-self-checkout.mp4 b/images/appkit-self-checkout.mp4 new file mode 100644 index 000000000..6aa2f222b Binary files /dev/null and b/images/appkit-self-checkout.mp4 differ diff --git a/images/chain-abstraction-demo.mp4 b/images/chain-abstraction-demo.mp4 new file mode 100644 index 000000000..f3272ae8a Binary files /dev/null and b/images/chain-abstraction-demo.mp4 differ diff --git a/images/cloud/1.png b/images/cloud/1.png index 52711f2ab..486f1ffb2 100644 Binary files a/images/cloud/1.png and b/images/cloud/1.png differ diff --git a/images/cloud/2.png b/images/cloud/2.png index 9a38327cf..a10a35707 100644 Binary files a/images/cloud/2.png and b/images/cloud/2.png differ diff --git a/images/cloud/3.png b/images/cloud/3.png index a08586248..60653d03c 100644 Binary files a/images/cloud/3.png and b/images/cloud/3.png differ diff --git a/images/email-login-flutter.mp4 b/images/email-login-flutter.mp4 new file mode 100644 index 000000000..da2eda440 Binary files /dev/null and b/images/email-login-flutter.mp4 differ diff --git a/images/link-mode.mp4 b/images/link-mode.mp4 new file mode 100644 index 000000000..171689345 Binary files /dev/null and b/images/link-mode.mp4 differ diff --git a/images/new-onramp.png b/images/new-onramp.png new file mode 100644 index 000000000..a5a236df5 Binary files /dev/null and b/images/new-onramp.png differ diff --git a/images/recipes/approveTx.jpg b/images/recipes/approveTx.jpg new file mode 100644 index 000000000..c57d60ecb Binary files /dev/null and b/images/recipes/approveTx.jpg differ diff --git a/images/recipes/smartSession.png b/images/recipes/smartSession.png new file mode 100644 index 000000000..e8e158c3c Binary files /dev/null and b/images/recipes/smartSession.png differ diff --git a/images/siwx.mp4 b/images/siwx.mp4 new file mode 100644 index 000000000..90c8819d4 Binary files /dev/null and b/images/siwx.mp4 differ diff --git a/images/smart-sessions-demo.mp4 b/images/smart-sessions-demo.mp4 new file mode 100644 index 000000000..05077fe9f Binary files /dev/null and b/images/smart-sessions-demo.mp4 differ diff --git a/images/socials-demo.mp4 b/images/socials-demo.mp4 new file mode 100644 index 000000000..c50d66639 Binary files /dev/null and b/images/socials-demo.mp4 differ diff --git a/images/without-link-mode.mp4 b/images/without-link-mode.mp4 new file mode 100644 index 000000000..084b8218e Binary files /dev/null and b/images/without-link-mode.mp4 differ diff --git a/overview.mdx b/overview.mdx index a812bbc83..02375486b 100644 --- a/overview.mdx +++ b/overview.mdx @@ -2,14 +2,59 @@ title: Overview --- - -WalletConnect Inc. is now known as Reown. -
See walletconnect.network for information about the WalletConnect Network. - -
+ +
+
+ WalletConnect Inc. is now known as Reown. See walletconnect.network for information about the WalletConnect Network. +
+ +
+
+ +## Quickstart + + + + Learn how to build a Web3 app using Reown AppKit in 10 minutes + + + + Learn how to build a Web3 app using Reown AppKit with AI + + + + Learn how to build a Web3 app using the AppKit CLI + + ## Reown -Reown is a UX-focused company that provides toolkits – AppKit and WalletKit – for anyone building onchain to leverage and unlock better UX. + +Reown empowers builders to create secure, user-friendly and insight-rich wallet and app UX. Providing all the tools to launch faster and scale smarter. + +Effortlessly integrate Reown's suite of SDKs. + + + + AppKit is a comprehensive SDK for creating seamless onchain UX, offering features like login (email & social), + gas fee sponsorship, multi-chain support, onramps, swaps, user insights, and access to more than 600 wallets. + + + + WalletKit is an open-source SDK for seamless wallet connections across blockchains. + It offers one-click authentication, secure transaction signing, phishing protection, + and advanced on-chain configurations like batch transactions and paymasters. + + + + + Reown offers free unlimited support for builders 24/7. Feel free to read the FAQ or get in touch. + + +## Are you building a Web3 App? + +If you're building a Web3 app, you can use Reown AppKit to get started quickly. Using Reown AppKit, you can provide end-to-end wallet connections and interactions for your users. @@ -32,40 +77,42 @@ Reown is a UX-focused company that provides toolkits – AppKit and WalletKit Migrate from other solutions to Reown AppKit - - Browse all our open-source repos + + Browse all of Reown's open-source repositories +Navigate to the [AppKit Overview](/appkit/overview) or click the **"AppKit" tab** in the top-left navbar to get started. +## Are you building a Web3 Wallet? -## Reown SDKs - -Effortlessly integrate our suite of SDKs. +If you're building a Web3 wallet, you can use Reown WalletKit to get started quickly. - - AppKit is a comprehensive SDK for creating seamless onchain UX, offering features like login (email & social), - gas fee sponsorship, multi-chain support, onramps, swaps, user insights, and access to more than 600 wallets. + + Get started with Reown WalletKit - - WalletKit is an open-source SDK for seamless wallet connections across blockchains. - It offers one-click authentication, secure transaction signing, phishing protection, - and advanced on-chain configurations like batch transactions and paymasters. + + Upgrade to latest version of Reown WalletKit - + + Learn about the features Reown WalletKit has to offer + - - Reown offers free unlimited support for builders 24/7. Feel free to read our FAQ or get in touch. - + + Browse all of Reown's open-source repositories + + + +Navigate to the [WalletKit Overview](/walletkit/overview) or click the **"WalletKit" tab** in the top-left navbar to get started. -## Recipes +## Guides Step-by-step guides and ready-to-use code examples designed to help you quickly implement common features and solve specific use cases using the SDK. Perfect for tackling real-world scenarios with ease. -**Click on the "Recipes" tab in the sidebar to explore more.** +**Click on the "Guides" section in the sidebar to explore more.** @@ -83,36 +130,40 @@ Step-by-step guides and ready-to-use code examples designed to help you quickly A guide to building on the Bitcoin network. + + + Learn how to use Reown AppKit to comply with travel rule regulations. + + + + Learn how to use Reown AppKit to sponsor gas fees for your users. + -## Join our community +## Join the Reown community Share your experience, contribute, or ask questions - - - Learn how to create a Telegram Mini App with Reown. + + + Follow Reown on X - - Step-by-step guide to building on Ethereum Virtual Machine (EVM). + + Join Reown's Discord community - - Learn how to develop on the Solana blockchain. + + Browse Reown's GitHub repositories - - A guide to building on the Bitcoin network. - ## How to contribute - Every page footer has an "Edit this page" link. -
Change the Markdown, open a Pull Request and we’ll merge it! + Navigate to the docs repo below and open a Pull Request with the required changes. The Reown team will review it and merge it!
diff --git a/package.json b/package.json new file mode 100644 index 000000000..4af180a48 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "mintlify-docs", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "pnpm run spell && mintlify dev", + "start": "pnpm run spell && mintlify dev", + "spell": "cspell '**/*.md' '**/*.mdx' " + }, + "devDependencies": { + "mintlify": "latest", + "cspell": "^8.16.1" + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..3d2e641c3 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7311 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + cspell: + specifier: ^8.16.1 + version: 8.18.1 + mintlify: + specifier: latest + version: 4.0.464(@types/node@22.14.0)(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + +packages: + + '@asyncapi/parser@3.4.0': + resolution: {integrity: sha512-Sxn74oHiZSU6+cVeZy62iPZMFMvKp4jupMFHelSICCMw1qELmUHPvuZSr+ZHDmNGgHcEpzJM5HN02kR7T4g+PQ==} + + '@asyncapi/specs@6.8.1': + resolution: {integrity: sha512-czHoAk3PeXTLR+X8IUaD+IpT+g+zUvkcgMDJVothBsan+oHN3jfcFcFUNdOPAAFoUCQN1hXF1dWuphWy05THlA==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@cspell/cspell-bundled-dicts@8.18.1': + resolution: {integrity: sha512-gxciVVfQqCVXYH0p2Q5D7x7/SgaW3Wv5UjRwO+TCme0P2lVLl/IcfjkujZX+6UQkT7X4QRglXo1QN141UcCRCQ==} + engines: {node: '>=18'} + + '@cspell/cspell-json-reporter@8.18.1': + resolution: {integrity: sha512-/U3/8bcOL5O35fI9F7nN7Mhic0K01ZRxRV/+5jj7atltBbqgFSxViHCZBX0lDZJM96gUHn+3r6q6/8VEJahpDA==} + engines: {node: '>=18'} + + '@cspell/cspell-pipe@8.18.1': + resolution: {integrity: sha512-QHndTQPkR1c02pvvQ7UKFtLjCXgY0OcX8zjTLrCkynmcQxJFjAZAh9cJ7NMOAxab+ciSnkaVf4KWaRSEG17z8Q==} + engines: {node: '>=18'} + + '@cspell/cspell-resolver@8.18.1': + resolution: {integrity: sha512-T2sUBv0p9Hnfyg1xT1u3ESKuIWaaIDo0I8idh5DSlTpHgLjdIeAwasmFjEJ28qZv8OKSGawcSQKgJbStfbZASQ==} + engines: {node: '>=18'} + + '@cspell/cspell-service-bus@8.18.1': + resolution: {integrity: sha512-PwWl7EyhGIu4wHEhvBJb6xVlqMtFwQk0qLDArBvugL6nA+MX9NfG/w7PTgS7tCkFjVF1ku2sDzDLTDWwEk+MLw==} + engines: {node: '>=18'} + + '@cspell/cspell-types@8.18.1': + resolution: {integrity: sha512-d/nMG+qnMbI/1JPm+lD0KcKpgtEHMRsHxkdtGyNCDgvHL/JOGaSHc5ERS3IUgBW0Dfya/3z9wPdaMcHEzt7YCQ==} + engines: {node: '>=18'} + + '@cspell/dict-ada@4.1.0': + resolution: {integrity: sha512-7SvmhmX170gyPd+uHXrfmqJBY5qLcCX8kTGURPVeGxmt8XNXT75uu9rnZO+jwrfuU2EimNoArdVy5GZRGljGNg==} + + '@cspell/dict-al@1.1.0': + resolution: {integrity: sha512-PtNI1KLmYkELYltbzuoztBxfi11jcE9HXBHCpID2lou/J4VMYKJPNqe4ZjVzSI9NYbMnMnyG3gkbhIdx66VSXg==} + + '@cspell/dict-aws@4.0.9': + resolution: {integrity: sha512-bDYdnnJGwSkIZ4gzrauu7qzOs/ZAY/FnU4k11LgdMI8BhwMfsbsy2EI1iS+sD/BI5ZnNT9kU5YR3WADeNOmhRg==} + + '@cspell/dict-bash@4.2.0': + resolution: {integrity: sha512-HOyOS+4AbCArZHs/wMxX/apRkjxg6NDWdt0jF9i9XkvJQUltMwEhyA2TWYjQ0kssBsnof+9amax2lhiZnh3kCg==} + + '@cspell/dict-companies@3.1.14': + resolution: {integrity: sha512-iqo1Ce4L7h0l0GFSicm2wCLtfuymwkvgFGhmu9UHyuIcTbdFkDErH+m6lH3Ed+QuskJlpQ9dM7puMIGqUlVERw==} + + '@cspell/dict-cpp@6.0.7': + resolution: {integrity: sha512-mk0AUx6au1BJQBTT2Uq9L+y43E0Cy0Vcm6TrK3Toi2iuBLWOnDR/xRE4nZADBsi6WnWoiyl3/QqA1gW2zPkGvQ==} + + '@cspell/dict-cryptocurrencies@5.0.4': + resolution: {integrity: sha512-6iFu7Abu+4Mgqq08YhTKHfH59mpMpGTwdzDB2Y8bbgiwnGFCeoiSkVkgLn1Kel2++hYcZ8vsAW/MJS9oXxuMag==} + + '@cspell/dict-csharp@4.0.6': + resolution: {integrity: sha512-w/+YsqOknjQXmIlWDRmkW+BHBPJZ/XDrfJhZRQnp0wzpPOGml7W0q1iae65P2AFRtTdPKYmvSz7AL5ZRkCnSIw==} + + '@cspell/dict-css@4.0.17': + resolution: {integrity: sha512-2EisRLHk6X/PdicybwlajLGKF5aJf4xnX2uuG5lexuYKt05xV/J/OiBADmi8q9obhxf1nesrMQbqAt+6CsHo/w==} + + '@cspell/dict-dart@2.3.0': + resolution: {integrity: sha512-1aY90lAicek8vYczGPDKr70pQSTQHwMFLbmWKTAI6iavmb1fisJBS1oTmMOKE4ximDf86MvVN6Ucwx3u/8HqLg==} + + '@cspell/dict-data-science@2.0.8': + resolution: {integrity: sha512-uyAtT+32PfM29wRBeAkUSbkytqI8bNszNfAz2sGPtZBRmsZTYugKMEO9eDjAIE/pnT9CmbjNuoiXhk+Ss4fCOg==} + + '@cspell/dict-django@4.1.4': + resolution: {integrity: sha512-fX38eUoPvytZ/2GA+g4bbdUtCMGNFSLbdJJPKX2vbewIQGfgSFJKY56vvcHJKAvw7FopjvgyS/98Ta9WN1gckg==} + + '@cspell/dict-docker@1.1.12': + resolution: {integrity: sha512-6d25ZPBnYZaT9D9An/x6g/4mk542R8bR3ipnby3QFCxnfdd6xaWiTcwDPsCgwN2aQZIQ1jX/fil9KmBEqIK/qA==} + + '@cspell/dict-dotnet@5.0.9': + resolution: {integrity: sha512-JGD6RJW5sHtO5lfiJl11a5DpPN6eKSz5M1YBa1I76j4dDOIqgZB6rQexlDlK1DH9B06X4GdDQwdBfnpAB0r2uQ==} + + '@cspell/dict-elixir@4.0.7': + resolution: {integrity: sha512-MAUqlMw73mgtSdxvbAvyRlvc3bYnrDqXQrx5K9SwW8F7fRYf9V4vWYFULh+UWwwkqkhX9w03ZqFYRTdkFku6uA==} + + '@cspell/dict-en-common-misspellings@2.0.10': + resolution: {integrity: sha512-80mXJLtr0tVEtzowrI7ycVae/ULAYImZUlr0kUTpa8i57AUk7Zy3pYBs44EYIKW7ZC9AHu4Qjjfq4vriAtyTDQ==} + + '@cspell/dict-en-gb@1.1.33': + resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} + + '@cspell/dict-en_us@4.3.37': + resolution: {integrity: sha512-lQUW4NF4pa7fH29OUUUrkaF0t8TnxirBRXc2SYs3b9JWMtaeqpwnSLXwh1LkJjIvxVf+Db7Rhojhj/+AJyHPqw==} + + '@cspell/dict-filetypes@3.0.11': + resolution: {integrity: sha512-bBtCHZLo7MiSRUqx5KEiPdGOmXIlDGY+L7SJEtRWZENpAKE+96rT7hj+TUUYWBbCzheqHr0OXZJFEKDgsG/uZg==} + + '@cspell/dict-flutter@1.1.0': + resolution: {integrity: sha512-3zDeS7zc2p8tr9YH9tfbOEYfopKY/srNsAa+kE3rfBTtQERAZeOhe5yxrnTPoufctXLyuUtcGMUTpxr3dO0iaA==} + + '@cspell/dict-fonts@4.0.4': + resolution: {integrity: sha512-cHFho4hjojBcHl6qxidl9CvUb492IuSk7xIf2G2wJzcHwGaCFa2o3gRcxmIg1j62guetAeDDFELizDaJlVRIOg==} + + '@cspell/dict-fsharp@1.1.0': + resolution: {integrity: sha512-oguWmHhGzgbgbEIBKtgKPrFSVAFtvGHaQS0oj+vacZqMObwkapcTGu7iwf4V3Bc2T3caf0QE6f6rQfIJFIAVsw==} + + '@cspell/dict-fullstack@3.2.6': + resolution: {integrity: sha512-cSaq9rz5RIU9j+0jcF2vnKPTQjxGXclntmoNp4XB7yFX2621PxJcekGjwf/lN5heJwVxGLL9toR0CBlGKwQBgA==} + + '@cspell/dict-gaming-terms@1.1.1': + resolution: {integrity: sha512-tb8GFxjTLDQstkJcJ90lDqF4rKKlMUKs5/ewePN9P+PYRSehqDpLI5S5meOfPit8LGszeOrjUdBQ4zXo7NpMyQ==} + + '@cspell/dict-git@3.0.4': + resolution: {integrity: sha512-C44M+m56rYn6QCsLbiKiedyPTMZxlDdEYAsPwwlL5bhMDDzXZ3Ic8OCQIhMbiunhCOJJT+er4URmOmM+sllnjg==} + + '@cspell/dict-golang@6.0.19': + resolution: {integrity: sha512-VS+oinB2/CbgmHE06kMJlj52OVMZM0S2EEXph3oaroNTgTuclSwdFylQmOEjquZi55kW+n3FM9MyWXiitB7Dtg==} + + '@cspell/dict-google@1.0.8': + resolution: {integrity: sha512-BnMHgcEeaLyloPmBs8phCqprI+4r2Jb8rni011A8hE+7FNk7FmLE3kiwxLFrcZnnb7eqM0agW4zUaNoB0P+z8A==} + + '@cspell/dict-haskell@4.0.5': + resolution: {integrity: sha512-s4BG/4tlj2pPM9Ha7IZYMhUujXDnI0Eq1+38UTTCpatYLbQqDwRFf2KNPLRqkroU+a44yTUAe0rkkKbwy4yRtQ==} + + '@cspell/dict-html-symbol-entities@4.0.3': + resolution: {integrity: sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A==} + + '@cspell/dict-html@4.0.11': + resolution: {integrity: sha512-QR3b/PB972SRQ2xICR1Nw/M44IJ6rjypwzA4jn+GH8ydjAX9acFNfc+hLZVyNe0FqsE90Gw3evLCOIF0vy1vQw==} + + '@cspell/dict-java@5.0.11': + resolution: {integrity: sha512-T4t/1JqeH33Raa/QK/eQe26FE17eUCtWu+JsYcTLkQTci2dk1DfcIKo8YVHvZXBnuM43ATns9Xs0s+AlqDeH7w==} + + '@cspell/dict-julia@1.1.0': + resolution: {integrity: sha512-CPUiesiXwy3HRoBR3joUseTZ9giFPCydSKu2rkh6I2nVjXnl5vFHzOMLXpbF4HQ1tH2CNfnDbUndxD+I+7eL9w==} + + '@cspell/dict-k8s@1.0.10': + resolution: {integrity: sha512-313haTrX9prep1yWO7N6Xw4D6tvUJ0Xsx+YhCP+5YrrcIKoEw5Rtlg8R4PPzLqe6zibw6aJ+Eqq+y76Vx5BZkw==} + + '@cspell/dict-kotlin@1.1.0': + resolution: {integrity: sha512-vySaVw6atY7LdwvstQowSbdxjXG6jDhjkWVWSjg1XsUckyzH1JRHXe9VahZz1i7dpoFEUOWQrhIe5B9482UyJQ==} + + '@cspell/dict-latex@4.0.3': + resolution: {integrity: sha512-2KXBt9fSpymYHxHfvhUpjUFyzrmN4c4P8mwIzweLyvqntBT3k0YGZJSriOdjfUjwSygrfEwiuPI1EMrvgrOMJw==} + + '@cspell/dict-lorem-ipsum@4.0.4': + resolution: {integrity: sha512-+4f7vtY4dp2b9N5fn0za/UR0kwFq2zDtA62JCbWHbpjvO9wukkbl4rZg4YudHbBgkl73HRnXFgCiwNhdIA1JPw==} + + '@cspell/dict-lua@4.0.7': + resolution: {integrity: sha512-Wbr7YSQw+cLHhTYTKV6cAljgMgcY+EUAxVIZW3ljKswEe4OLxnVJ7lPqZF5JKjlXdgCjbPSimsHqyAbC5pQN/Q==} + + '@cspell/dict-makefile@1.0.4': + resolution: {integrity: sha512-E4hG/c0ekPqUBvlkrVvzSoAA+SsDA9bLi4xSV3AXHTVru7Y2bVVGMPtpfF+fI3zTkww/jwinprcU1LSohI3ylw==} + + '@cspell/dict-markdown@2.0.10': + resolution: {integrity: sha512-vtVa6L/84F9sTjclTYDkWJF/Vx2c5xzxBKkQp+CEFlxOF2SYgm+RSoEvAvg5vj4N5kuqR4350ZlY3zl2eA3MXw==} + peerDependencies: + '@cspell/dict-css': ^4.0.17 + '@cspell/dict-html': ^4.0.11 + '@cspell/dict-html-symbol-entities': ^4.0.3 + '@cspell/dict-typescript': ^3.2.1 + + '@cspell/dict-monkeyc@1.0.10': + resolution: {integrity: sha512-7RTGyKsTIIVqzbvOtAu6Z/lwwxjGRtY5RkKPlXKHEoEAgIXwfDxb5EkVwzGQwQr8hF/D3HrdYbRT8MFBfsueZw==} + + '@cspell/dict-node@5.0.7': + resolution: {integrity: sha512-ZaPpBsHGQCqUyFPKLyCNUH2qzolDRm1/901IO8e7btk7bEDF56DN82VD43gPvD4HWz3yLs/WkcLa01KYAJpnOw==} + + '@cspell/dict-npm@5.1.33': + resolution: {integrity: sha512-ZJ7mFmAmaxLNix8JEnCCGhsA4PskQjaF+aDcShyxD5o43yKhSwKg7ePhgHhwAa19FjB7Kea2h4k++Oshu8xziQ==} + + '@cspell/dict-php@4.0.14': + resolution: {integrity: sha512-7zur8pyncYZglxNmqsRycOZ6inpDoVd4yFfz1pQRe5xaRWMiK3Km4n0/X/1YMWhh3e3Sl/fQg5Axb2hlN68t1g==} + + '@cspell/dict-powershell@5.0.14': + resolution: {integrity: sha512-ktjjvtkIUIYmj/SoGBYbr3/+CsRGNXGpvVANrY0wlm/IoGlGywhoTUDYN0IsGwI2b8Vktx3DZmQkfb3Wo38jBA==} + + '@cspell/dict-public-licenses@2.0.13': + resolution: {integrity: sha512-1Wdp/XH1ieim7CadXYE7YLnUlW0pULEjVl9WEeziZw3EKCAw8ZI8Ih44m4bEa5VNBLnuP5TfqC4iDautAleQzQ==} + + '@cspell/dict-python@4.2.17': + resolution: {integrity: sha512-xqMKfVc8d7yDaOChFdL2uWAN3Mw9qObB/Zr6t5w1OHbi23gWs7V1lI9d0mXAoqSK6N3mosbum4OIq/FleQDnlw==} + + '@cspell/dict-r@2.1.0': + resolution: {integrity: sha512-k2512wgGG0lTpTYH9w5Wwco+lAMf3Vz7mhqV8+OnalIE7muA0RSuD9tWBjiqLcX8zPvEJr4LdgxVju8Gk3OKyA==} + + '@cspell/dict-ruby@5.0.8': + resolution: {integrity: sha512-ixuTneU0aH1cPQRbWJvtvOntMFfeQR2KxT8LuAv5jBKqQWIHSxzGlp+zX3SVyoeR0kOWiu64/O5Yn836A5yMcQ==} + + '@cspell/dict-rust@4.0.11': + resolution: {integrity: sha512-OGWDEEzm8HlkSmtD8fV3pEcO2XBpzG2XYjgMCJCRwb2gRKvR+XIm6Dlhs04N/K2kU+iH8bvrqNpM8fS/BFl0uw==} + + '@cspell/dict-scala@5.0.7': + resolution: {integrity: sha512-yatpSDW/GwulzO3t7hB5peoWwzo+Y3qTc0pO24Jf6f88jsEeKmDeKkfgPbYuCgbE4jisGR4vs4+jfQZDIYmXPA==} + + '@cspell/dict-shell@1.1.0': + resolution: {integrity: sha512-D/xHXX7T37BJxNRf5JJHsvziFDvh23IF/KvkZXNSh8VqcRdod3BAz9VGHZf6VDqcZXr1VRqIYR3mQ8DSvs3AVQ==} + + '@cspell/dict-software-terms@5.0.4': + resolution: {integrity: sha512-y9wngLi4JhrmzPOOd64OsNdwaLPA2AzbdXqPpV+2d8LSnXwBtsmvIIg3Vt/w0QCzhNusbjVS26hlSu+Zk+fp9w==} + + '@cspell/dict-sql@2.2.0': + resolution: {integrity: sha512-MUop+d1AHSzXpBvQgQkCiok8Ejzb+nrzyG16E8TvKL2MQeDwnIvMe3bv90eukP6E1HWb+V/MA/4pnq0pcJWKqQ==} + + '@cspell/dict-svelte@1.0.6': + resolution: {integrity: sha512-8LAJHSBdwHCoKCSy72PXXzz7ulGROD0rP1CQ0StOqXOOlTUeSFaJJlxNYjlONgd2c62XBQiN2wgLhtPN+1Zv7Q==} + + '@cspell/dict-swift@2.0.5': + resolution: {integrity: sha512-3lGzDCwUmnrfckv3Q4eVSW3sK3cHqqHlPprFJZD4nAqt23ot7fic5ALR7J4joHpvDz36nHX34TgcbZNNZOC/JA==} + + '@cspell/dict-terraform@1.1.1': + resolution: {integrity: sha512-07KFDwCU7EnKl4hOZLsLKlj6Zceq/IsQ3LRWUyIjvGFfZHdoGtFdCp3ZPVgnFaAcd/DKv+WVkrOzUBSYqHopQQ==} + + '@cspell/dict-typescript@3.2.1': + resolution: {integrity: sha512-jdnKg4rBl75GUBTsUD6nTJl7FGvaIt5wWcWP7TZSC3rV1LfkwvbUiY3PiGpfJlAIdnLYSeFWIpYU9gyVgz206w==} + + '@cspell/dict-vue@3.0.4': + resolution: {integrity: sha512-0dPtI0lwHcAgSiQFx8CzvqjdoXROcH+1LyqgROCpBgppommWpVhbQ0eubnKotFEXgpUCONVkeZJ6Ql8NbTEu+w==} + + '@cspell/dynamic-import@8.18.1': + resolution: {integrity: sha512-VJHfS/Iv0Rx7wn1pjPmwgsaw6r72N5Cx2gL0slWk8Cogc8YiK7/6jsGnsvxJZVkHntJoiT8PrkIvhNKb3awD3g==} + engines: {node: '>=18.0'} + + '@cspell/filetypes@8.18.1': + resolution: {integrity: sha512-vTOb2itP0pjrccvt8wcKiTGyw0pFMTPI85H12T6n8ZhqXTktPgQH2gEf/SU/5tkPNnBKr4GJ+FdU5hJ27HzgXQ==} + engines: {node: '>=18'} + + '@cspell/strong-weak-map@8.18.1': + resolution: {integrity: sha512-gsgv+5ZQD4aHNHDdfNGoafVYkqRynyYgaodt9Dp/3o0YKYcxGf2jrX8SJ35MfZ61qln0n7P4Djrg+bFV2zNH5w==} + engines: {node: '>=18'} + + '@cspell/url@8.18.1': + resolution: {integrity: sha512-FRJbLYDC9ucpTOzbF6MohP2u5X3NU5L0RoVuoYCynqm/QOI38XP6WOEaI4H58CAn857bOIKZk0LZRPTGzi6Qlg==} + engines: {node: '>=18.0'} + + '@emnapi/runtime@1.4.0': + resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} + + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@inquirer/checkbox@4.1.5': + resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.9': + resolution: {integrity: sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.1.10': + resolution: {integrity: sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.10': + resolution: {integrity: sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.12': + resolution: {integrity: sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.11': + resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + engines: {node: '>=18'} + + '@inquirer/input@4.1.9': + resolution: {integrity: sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.12': + resolution: {integrity: sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.12': + resolution: {integrity: sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.4.1': + resolution: {integrity: sha512-UlmM5FVOZF0gpoe1PT/jN4vk8JmpIWBlMvTL8M+hlvPmzN89K6z03+IFmyeu/oFCenwdwHDr2gky7nIGSEVvlA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.0.12': + resolution: {integrity: sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.0.12': + resolution: {integrity: sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.1.1': + resolution: {integrity: sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.6': + resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@jsep-plugin/assignment@1.3.0': + resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.0.4': + resolution: {integrity: sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/ternary@1.1.4': + resolution: {integrity: sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@mdx-js/mdx@3.1.0': + resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} + + '@mdx-js/react@3.1.0': + resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@mintlify/cli@4.0.463': + resolution: {integrity: sha512-MBxzl9Bd8ZWim8rQfzRBysNJY6br4L707ecQhH1Cs5NQar96Vjr7VxPVoR551x2gd5tkNJfUzvS4osPA1i/hsA==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@mintlify/common@1.0.327': + resolution: {integrity: sha512-1lBfkBQ9ALxOaQXb1VdbPEf6Q72rsqF/aejd3hUewJr1K8fd43aoW0FOBkzc+48+KfhpGiMiKXjMVNrPxA/2AQ==} + + '@mintlify/link-rot@3.0.433': + resolution: {integrity: sha512-3hr/dWf7P4HrY5UA6lIc9K4pWUXdXTRXBzFiCa8CQZWLF93/QvsJr2GCftDJTEdqKTnxkKJwqU+uGFJl0YpuIw==} + engines: {node: '>=18.0.0'} + + '@mintlify/mdx@1.0.1': + resolution: {integrity: sha512-zrzt8nxoIgJeSUeuJaC8pbd5EHKjCq30qV2HMoqIHLjeE0l7hkMgjBPNWNde7CYDPig1ODS1kPuE5Bnt+/+PIg==} + peerDependencies: + react: ^18.3.1 + react-dom: ^18.3.1 + + '@mintlify/models@0.0.182': + resolution: {integrity: sha512-kJexQIZIA+NFFUeeYWx9gNt+2q/YDTszwT1xQaYIfLdx9GXibEYg8CkkJFisuGBVCOWXnm2XKDyDQpYPNFQafg==} + engines: {node: '>=18.0.0'} + + '@mintlify/openapi-parser@0.0.7': + resolution: {integrity: sha512-3ecbkzPbsnkKVZJypVL0H5pCTR7a4iLv4cP7zbffzAwy+vpH70JmPxNVpPPP62yLrdZlfNcMxu5xKeT7fllgMg==} + engines: {node: '>=18'} + + '@mintlify/prebuild@1.0.430': + resolution: {integrity: sha512-z8P8DoYYQNucnpSGo92b+kHQy3zjR3z8ab5wO3OHNVg7KVNqTe/VL9MSuO49VuxaeBO2aAi0TECNajpUbaEMOA==} + + '@mintlify/previewing@4.0.454': + resolution: {integrity: sha512-rRuD0tCb2mpV4Ls2/za+WPencdaaWQq7SXAO/3e+e6ah0lPk43JmiVxEbMRXPVjC1J5Tu3tp81D4bzSMoHa++A==} + engines: {node: '>=18.0.0'} + + '@mintlify/scraping@4.0.179': + resolution: {integrity: sha512-sVrUX+eAqk/G1Mngf/ZV4MIGUAtECnxR3rMOj9+/F2LOq2fRutRZ+6RAXGGlg38fgX2SFaUifq+T832yzh5g+A==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@mintlify/validation@0.1.332': + resolution: {integrity: sha512-ppKNe84Pa+vMTCuPcd/Sv6j/djELqWCNmOnCCP4ap4NNnB5k3c08zw5yLZuyoMLr04SYih7kPxWe6xBqMHuuYw==} + + '@openapi-contrib/openapi-schema-to-json-schema@3.2.0': + resolution: {integrity: sha512-Gj6C0JwCr8arj0sYuslWXUBSP/KnUlEGnPW4qxlXvAl543oaNQgMgIgkQUA6vs5BCCvwTEiL8m/wdWzfl4UvSw==} + + '@puppeteer/browsers@2.3.0': + resolution: {integrity: sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==} + engines: {node: '>=18'} + hasBin: true + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@sindresorhus/slugify@2.2.1': + resolution: {integrity: sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==} + engines: {node: '>=12'} + + '@sindresorhus/transliterate@1.6.0': + resolution: {integrity: sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==} + engines: {node: '>=12'} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@stoplight/better-ajv-errors@1.0.3': + resolution: {integrity: sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==} + engines: {node: ^12.20 || >= 14.13} + peerDependencies: + ajv: '>=8' + + '@stoplight/json-ref-readers@1.2.2': + resolution: {integrity: sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ==} + engines: {node: '>=8.3.0'} + + '@stoplight/json-ref-resolver@3.1.6': + resolution: {integrity: sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A==} + engines: {node: '>=8.3.0'} + + '@stoplight/json@3.21.0': + resolution: {integrity: sha512-5O0apqJ/t4sIevXCO3SBN9AHCEKKR/Zb4gaj7wYe5863jme9g02Q0n/GhM7ZCALkL+vGPTe4ZzTETP8TFtsw3g==} + engines: {node: '>=8.3.0'} + + '@stoplight/ordered-object-literal@1.0.5': + resolution: {integrity: sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg==} + engines: {node: '>=8'} + + '@stoplight/path@1.3.2': + resolution: {integrity: sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ==} + engines: {node: '>=8'} + + '@stoplight/spectral-core@1.19.5': + resolution: {integrity: sha512-i+njdliW7bAHGsHEgDvH0To/9IxiYiBELltkZ7ASVy4i+WXtZ40lQXpeRQRwePrBcSgQl0gcZFuKX10nmSHtbw==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-formats@1.8.2': + resolution: {integrity: sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-functions@1.9.4': + resolution: {integrity: sha512-+dgu7QQ1JIZFsNLhNbQLPA9tniIT3KjOc9ORv0LYSCLvZjkWT2bN7vgmathbXsbmhnmhvl15H9sRqUIqzi+qoQ==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-parsers@1.0.5': + resolution: {integrity: sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-ref-resolver@1.0.5': + resolution: {integrity: sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/spectral-runtime@1.1.4': + resolution: {integrity: sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ==} + engines: {node: ^16.20 || ^18.18 || >= 20.17} + + '@stoplight/types@13.20.0': + resolution: {integrity: sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/types@13.6.0': + resolution: {integrity: sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/types@14.1.1': + resolution: {integrity: sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g==} + engines: {node: ^12.20 || >=14.13} + + '@stoplight/yaml-ast-parser@0.0.50': + resolution: {integrity: sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ==} + + '@stoplight/yaml@4.3.0': + resolution: {integrity: sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w==} + engines: {node: '>=10.8'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/es-aggregate-error@1.0.6': + resolution: {integrity: sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/node@22.14.0': + resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} + + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + + '@types/react@19.1.0': + resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/urijs@1.19.25': + resolution: {integrity: sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-errors@3.0.0: + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} + peerDependencies: + ajv: ^8.0.1 + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + avsc@5.7.7: + resolution: {integrity: sha512-9cYNccliXZDByFsFliVwk5GvTq058Fj513CiR4E60ndDwmuXzTJEp/Bp8FyuRmGyYupLjHLs+JA9/CBoVS4/NQ==} + engines: {node: '>=0.11'} + + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + + bare-fs@4.1.2: + resolution: {integrity: sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.1: + resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + + better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk-template@1.1.0: + resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} + engines: {node: '>=14.16'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chromium-bidi@0.6.3: + resolution: {integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==} + peerDependencies: + devtools-protocol: '*' + + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + + clear-module@4.1.2: + resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} + engines: {node: '>=8'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-json@4.2.5: + resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cspell-config-lib@8.18.1: + resolution: {integrity: sha512-zdJ0uhLROSUrHoibysPw+AkxKPUmiG95hDtiL7s8smewkuaS1hpjqwsDBx981nHYs3xW3qDUfVATrAkSzb0VMw==} + engines: {node: '>=18'} + + cspell-dictionary@8.18.1: + resolution: {integrity: sha512-vKHEPSfkMKMR4S4tk6K2vHC+f3kdJK8Kdh/C0jDh6RRDjDsyAPxshtbremxOgAX6X8GaRUCROoMZ7FhB92+Y9w==} + engines: {node: '>=18'} + + cspell-gitignore@8.18.1: + resolution: {integrity: sha512-gp/AdUtW6FqpKY4YyYJ3kz0OsXApwsV1FOUA9Z0VnOYKVZtt2snh4uNlI4Ltq+wh7pDU8mqaPWmX6Xy+HSRDkQ==} + engines: {node: '>=18'} + hasBin: true + + cspell-glob@8.18.1: + resolution: {integrity: sha512-tlZXvzsN7dByHo69dz/HbJuQDUtrfhdioZ/LHaW7W9diG9NpaghgEfyX4fmsIXjU/2f66LDpYVY6osjtlOgyrg==} + engines: {node: '>=18'} + + cspell-grammar@8.18.1: + resolution: {integrity: sha512-V6XTN1B++7EzJA0H4g4XbNJtqm6Y3/iXdLeZ6sMRDaNFKXXwTbWRtn8gukDQIytyw09AnCUKeqGSzCVqw26Omg==} + engines: {node: '>=18'} + hasBin: true + + cspell-io@8.18.1: + resolution: {integrity: sha512-mm9SUEF2yShuTXDSjCbsAqYTEb6jrtgcCnlqIzpsZOJOOe+zj/VyzTy2NJvOrdvR59dikdaqB75VGBMfHi804g==} + engines: {node: '>=18'} + + cspell-lib@8.18.1: + resolution: {integrity: sha512-t1j+XB7515yHmrczK6I1N6j0a72vmL/6OxsMJnCucHC6DO0WkOqmHulNRH7LpFacnns0dx15lmrAqPg7gQFcIg==} + engines: {node: '>=18'} + + cspell-trie-lib@8.18.1: + resolution: {integrity: sha512-UaB36wsyp2eWeMtrbS6Q2t2WFvpedmGXJ879yHn9qKD7ViyUpI4cAbh6v7gWMUu+gjqCulXtke64k1ddmBihPQ==} + engines: {node: '>=18'} + + cspell@8.18.1: + resolution: {integrity: sha512-RE3LIgN9NAVcYBNX2NQVhLergok8EPymOuCUhu1vBR8cjRmioksn3CJeCoQgD8rPjalM+S9thYkMtOZc5Jjv2A==} + engines: {node: '>=18'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dependency-graph@0.11.0: + resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} + engines: {node: '>= 0.6.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} + hasBin: true + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + devtools-protocol@0.0.1312386: + resolution: {integrity: sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dns-socket@4.2.2: + resolution: {integrity: sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg==} + engines: {node: '>=6'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + + es-aggregate-error@1.0.13: + resolution: {integrity: sha512-KkzhUUuD2CUMqEc8JEqsXEMDHzDPE8RCjZeUBitsnB1eNcAJWQPiciKsMXe3Yytj4Flw1XLl46Qcf9OxvZha7A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.2.2: + resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} + engines: {node: '>=6.0.0'} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-memoize@2.5.2: + resolution: {integrity: sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + favicons@7.2.0: + resolution: {integrity: sha512-k/2rVBRIRzOeom3wI9jBPaSEvoTSQEW4iM0EveBmBBKFxO8mSyyRWtDlfC3VnEfu0avmjrMzy8/ZFPSe6F71Hw==} + engines: {node: '>=14.0.0'} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@9.1.0: + resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} + engines: {node: '>=18'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + flat-cache@5.0.0: + resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} + engines: {node: '>=18'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gcd@0.0.1: + resolution: {integrity: sha512-VNx3UEGr+ILJTiMs1+xc5SX1cMgJCrXezKPa003APUWNqQqaF6n25W8VcR7nHN6yRWbvvUTwCpZCFJeWC2kXlw==} + + gensequence@7.0.0: + resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} + engines: {node: '>=18'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-uri@6.0.4: + resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} + engines: {node: '>= 14'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + + hast-util-from-dom@5.0.1: + resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} + + hast-util-from-html-isomorphic@2.0.0: + resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-mdast@10.1.2: + resolution: {integrity: sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + inquirer@12.5.2: + resolution: {integrity: sha512-qoDk/vdSTIaXNXAoNnlg7ubexpJfUo7t8GT2vylxvE49BrLhToFuPPdMViidG2boHV7+AcP1TCkJs/+PPoF2QQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-ip@3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-online@10.0.0: + resolution: {integrity: sha512-WCPdKwNDjXJJmUubf2VHLMDBkUZEtuOvpXUfUnUFbEnM6In9ByiScL4f4jKACz/fsb2qDkesFerW3snf/AYz3A==} + engines: {node: '>=14.16'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsep@1.4.0: + resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} + engines: {node: '>= 10.16.0'} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + jsonc-parser@2.2.1: + resolution: {integrity: sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonpath-plus@10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + katex@0.16.21: + resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lcm@0.0.3: + resolution: {integrity: sha512-TB+ZjoillV6B26Vspf9l2L/vKaRY/4ep3hahcyVkCGFgsTNRUQdc24bQeNFiZeoxH0vr5+7SfNRMQuPHv/1IrQ==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + leven@4.0.0: + resolution: {integrity: sha512-puehA3YKku3osqPlNuzGDUHq8WpwXupUg1V6NXdV38G+gr+gkBwFC8g1b/+YcIvp8gnqVIus+eJCH/eGsRmJNw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lodash.topath@4.5.2: + resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mintlify@4.0.464: + resolution: {integrity: sha512-kFFaM6rM17lIDduG9Qbj4Ngeq3MFDfBDyHmm1BN6CoH0K6qJEs/rTm5gkRlrkQPq4sqPXBRwnHY9TGbyUzrArQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + next-mdx-remote-client@1.1.0: + resolution: {integrity: sha512-RuKP5Xe/cdgpeQOw1OqY6/t29DgjPQxvSUXpjr5OXB6gZpCnXrrruT6c+OwF2sskOA2jGjUbxVoavrB8CbGmQQ==} + engines: {node: '>=18.18.0'} + peerDependencies: + react: '>= 18.3.0 < 19.0.0' + react-dom: '>= 18.3.0 < 19.0.0' + + nimma@0.2.3: + resolution: {integrity: sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA==} + engines: {node: ^12.20 || >=14.13} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + ora@6.3.1: + resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-any@4.0.0: + resolution: {integrity: sha512-S/B50s+pAVe0wmEZHmBs/9yJXeZ5KhHzOsgKzt0hRdgkoR3DxW9ts46fcsWi/r3VnzsnkKS7q4uimze+zjdryw==} + engines: {node: '>=12.20'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-some@6.0.0: + resolution: {integrity: sha512-CJbQCKdfSX3fIh8/QKgS+9rjm7OBNUTmwWswAFQAhc8j1NR1dsEDETUEuVUtQHZpV+J03LqWBEwvu0g1Yn+TYg==} + engines: {node: '>=12.20'} + + p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parent-module@2.0.0: + resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} + engines: {node: '>=8'} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pony-cause@1.1.1: + resolution: {integrity: sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g==} + engines: {node: '>=12.0.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + property-information@7.0.0: + resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + public-ip@5.0.0: + resolution: {integrity: sha512-xaH3pZMni/R2BG7ZXXaWS9Wc9wFlhyDVJF47IJ+3ali0TGv+2PsckKxbmo+rnx3ZxiV2wblVhtdS3bohAP6GGw==} + engines: {node: ^14.13.1 || >=16.0.0} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + puppeteer-core@22.15.0: + resolution: {integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==} + engines: {node: '>=18'} + + puppeteer@22.15.0: + resolution: {integrity: sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==} + engines: {node: '>=18'} + hasBin: true + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.0: + resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + refractor@4.9.0: + resolution: {integrity: sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + rehype-katex@7.0.1: + resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} + + rehype-minify-whitespace@6.0.2: + resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-math@6.0.0: + resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} + + remark-mdx-remove-esm@1.1.0: + resolution: {integrity: sha512-oN3F9QRuPKSdzZi+wvEodBVjKwya63sl403pWzJvm0+c503iUjCDR+JAnP3Ho/4205IWbQ2NujPQi/B9kU6ZrA==} + + remark-mdx@3.1.0: + resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@1.1.1: + resolution: {integrity: sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-error@12.0.0: + resolution: {integrity: sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==} + engines: {node: '>=18'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-eval@1.0.1: + resolution: {integrity: sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ==} + engines: {node: '>=12'} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.4: + resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + style-to-js@1.1.16: + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + traverse@0.6.11: + resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} + engines: {node: '>= 0.4'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trim-trailing-lines@2.1.0: + resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.39.1: + resolution: {integrity: sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typedarray.prototype.slice@1.0.5: + resolution: {integrity: sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==} + engines: {node: '>= 0.4'} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-builder@4.0.0: + resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-map@4.0.0: + resolution: {integrity: sha512-HJs1tpkSmRJUzj6fskQrS5oYhBYlmtcvy4SepdDEEsL04FjBrgF0Mgggvxc1/qGBGgW7hRh9+UBK1aqTEnBpIA==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-matter@5.0.1: + resolution: {integrity: sha512-o6roP82AiX0XfkyTHyRCMXgHfltUNlXSEqCIS80f+mbAyiQBE2fxtDVMtseyytGx75sihiJFo/zR6r/4LTs2Cw==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xdg-basedir@5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: ^3.24.1 + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@asyncapi/parser@3.4.0': + dependencies: + '@asyncapi/specs': 6.8.1 + '@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.6 + '@stoplight/spectral-core': 1.19.5 + '@stoplight/spectral-functions': 1.9.4 + '@stoplight/spectral-parsers': 1.0.5 + '@stoplight/spectral-ref-resolver': 1.0.5 + '@stoplight/types': 13.20.0 + '@types/json-schema': 7.0.15 + '@types/urijs': 1.19.25 + ajv: 8.17.1 + ajv-errors: 3.0.0(ajv@8.17.1) + ajv-formats: 2.1.1(ajv@8.17.1) + avsc: 5.7.7 + js-yaml: 4.1.0 + jsonpath-plus: 10.3.0 + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + + '@asyncapi/specs@6.8.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.25.9': {} + + '@cspell/cspell-bundled-dicts@8.18.1': + dependencies: + '@cspell/dict-ada': 4.1.0 + '@cspell/dict-al': 1.1.0 + '@cspell/dict-aws': 4.0.9 + '@cspell/dict-bash': 4.2.0 + '@cspell/dict-companies': 3.1.14 + '@cspell/dict-cpp': 6.0.7 + '@cspell/dict-cryptocurrencies': 5.0.4 + '@cspell/dict-csharp': 4.0.6 + '@cspell/dict-css': 4.0.17 + '@cspell/dict-dart': 2.3.0 + '@cspell/dict-data-science': 2.0.8 + '@cspell/dict-django': 4.1.4 + '@cspell/dict-docker': 1.1.12 + '@cspell/dict-dotnet': 5.0.9 + '@cspell/dict-elixir': 4.0.7 + '@cspell/dict-en-common-misspellings': 2.0.10 + '@cspell/dict-en-gb': 1.1.33 + '@cspell/dict-en_us': 4.3.37 + '@cspell/dict-filetypes': 3.0.11 + '@cspell/dict-flutter': 1.1.0 + '@cspell/dict-fonts': 4.0.4 + '@cspell/dict-fsharp': 1.1.0 + '@cspell/dict-fullstack': 3.2.6 + '@cspell/dict-gaming-terms': 1.1.1 + '@cspell/dict-git': 3.0.4 + '@cspell/dict-golang': 6.0.19 + '@cspell/dict-google': 1.0.8 + '@cspell/dict-haskell': 4.0.5 + '@cspell/dict-html': 4.0.11 + '@cspell/dict-html-symbol-entities': 4.0.3 + '@cspell/dict-java': 5.0.11 + '@cspell/dict-julia': 1.1.0 + '@cspell/dict-k8s': 1.0.10 + '@cspell/dict-kotlin': 1.1.0 + '@cspell/dict-latex': 4.0.3 + '@cspell/dict-lorem-ipsum': 4.0.4 + '@cspell/dict-lua': 4.0.7 + '@cspell/dict-makefile': 1.0.4 + '@cspell/dict-markdown': 2.0.10(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.1) + '@cspell/dict-monkeyc': 1.0.10 + '@cspell/dict-node': 5.0.7 + '@cspell/dict-npm': 5.1.33 + '@cspell/dict-php': 4.0.14 + '@cspell/dict-powershell': 5.0.14 + '@cspell/dict-public-licenses': 2.0.13 + '@cspell/dict-python': 4.2.17 + '@cspell/dict-r': 2.1.0 + '@cspell/dict-ruby': 5.0.8 + '@cspell/dict-rust': 4.0.11 + '@cspell/dict-scala': 5.0.7 + '@cspell/dict-shell': 1.1.0 + '@cspell/dict-software-terms': 5.0.4 + '@cspell/dict-sql': 2.2.0 + '@cspell/dict-svelte': 1.0.6 + '@cspell/dict-swift': 2.0.5 + '@cspell/dict-terraform': 1.1.1 + '@cspell/dict-typescript': 3.2.1 + '@cspell/dict-vue': 3.0.4 + + '@cspell/cspell-json-reporter@8.18.1': + dependencies: + '@cspell/cspell-types': 8.18.1 + + '@cspell/cspell-pipe@8.18.1': {} + + '@cspell/cspell-resolver@8.18.1': + dependencies: + global-directory: 4.0.1 + + '@cspell/cspell-service-bus@8.18.1': {} + + '@cspell/cspell-types@8.18.1': {} + + '@cspell/dict-ada@4.1.0': {} + + '@cspell/dict-al@1.1.0': {} + + '@cspell/dict-aws@4.0.9': {} + + '@cspell/dict-bash@4.2.0': + dependencies: + '@cspell/dict-shell': 1.1.0 + + '@cspell/dict-companies@3.1.14': {} + + '@cspell/dict-cpp@6.0.7': {} + + '@cspell/dict-cryptocurrencies@5.0.4': {} + + '@cspell/dict-csharp@4.0.6': {} + + '@cspell/dict-css@4.0.17': {} + + '@cspell/dict-dart@2.3.0': {} + + '@cspell/dict-data-science@2.0.8': {} + + '@cspell/dict-django@4.1.4': {} + + '@cspell/dict-docker@1.1.12': {} + + '@cspell/dict-dotnet@5.0.9': {} + + '@cspell/dict-elixir@4.0.7': {} + + '@cspell/dict-en-common-misspellings@2.0.10': {} + + '@cspell/dict-en-gb@1.1.33': {} + + '@cspell/dict-en_us@4.3.37': {} + + '@cspell/dict-filetypes@3.0.11': {} + + '@cspell/dict-flutter@1.1.0': {} + + '@cspell/dict-fonts@4.0.4': {} + + '@cspell/dict-fsharp@1.1.0': {} + + '@cspell/dict-fullstack@3.2.6': {} + + '@cspell/dict-gaming-terms@1.1.1': {} + + '@cspell/dict-git@3.0.4': {} + + '@cspell/dict-golang@6.0.19': {} + + '@cspell/dict-google@1.0.8': {} + + '@cspell/dict-haskell@4.0.5': {} + + '@cspell/dict-html-symbol-entities@4.0.3': {} + + '@cspell/dict-html@4.0.11': {} + + '@cspell/dict-java@5.0.11': {} + + '@cspell/dict-julia@1.1.0': {} + + '@cspell/dict-k8s@1.0.10': {} + + '@cspell/dict-kotlin@1.1.0': {} + + '@cspell/dict-latex@4.0.3': {} + + '@cspell/dict-lorem-ipsum@4.0.4': {} + + '@cspell/dict-lua@4.0.7': {} + + '@cspell/dict-makefile@1.0.4': {} + + '@cspell/dict-markdown@2.0.10(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.1)': + dependencies: + '@cspell/dict-css': 4.0.17 + '@cspell/dict-html': 4.0.11 + '@cspell/dict-html-symbol-entities': 4.0.3 + '@cspell/dict-typescript': 3.2.1 + + '@cspell/dict-monkeyc@1.0.10': {} + + '@cspell/dict-node@5.0.7': {} + + '@cspell/dict-npm@5.1.33': {} + + '@cspell/dict-php@4.0.14': {} + + '@cspell/dict-powershell@5.0.14': {} + + '@cspell/dict-public-licenses@2.0.13': {} + + '@cspell/dict-python@4.2.17': + dependencies: + '@cspell/dict-data-science': 2.0.8 + + '@cspell/dict-r@2.1.0': {} + + '@cspell/dict-ruby@5.0.8': {} + + '@cspell/dict-rust@4.0.11': {} + + '@cspell/dict-scala@5.0.7': {} + + '@cspell/dict-shell@1.1.0': {} + + '@cspell/dict-software-terms@5.0.4': {} + + '@cspell/dict-sql@2.2.0': {} + + '@cspell/dict-svelte@1.0.6': {} + + '@cspell/dict-swift@2.0.5': {} + + '@cspell/dict-terraform@1.1.1': {} + + '@cspell/dict-typescript@3.2.1': {} + + '@cspell/dict-vue@3.0.4': {} + + '@cspell/dynamic-import@8.18.1': + dependencies: + '@cspell/url': 8.18.1 + import-meta-resolve: 4.1.0 + + '@cspell/filetypes@8.18.1': {} + + '@cspell/strong-weak-map@8.18.1': {} + + '@cspell/url@8.18.1': {} + + '@emnapi/runtime@1.4.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.4.0 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + + '@inquirer/checkbox@4.1.5(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.14.0) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/confirm@5.1.9(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/core@10.1.10(@types/node@22.14.0)': + dependencies: + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.14.0) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/editor@4.2.10(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + external-editor: 3.1.0 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/expand@4.0.12(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/figures@1.0.11': {} + + '@inquirer/input@4.1.9(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/number@3.0.12(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/password@4.0.12(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + ansi-escapes: 4.3.2 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/prompts@7.4.1(@types/node@22.14.0)': + dependencies: + '@inquirer/checkbox': 4.1.5(@types/node@22.14.0) + '@inquirer/confirm': 5.1.9(@types/node@22.14.0) + '@inquirer/editor': 4.2.10(@types/node@22.14.0) + '@inquirer/expand': 4.0.12(@types/node@22.14.0) + '@inquirer/input': 4.1.9(@types/node@22.14.0) + '@inquirer/number': 3.0.12(@types/node@22.14.0) + '@inquirer/password': 4.0.12(@types/node@22.14.0) + '@inquirer/rawlist': 4.0.12(@types/node@22.14.0) + '@inquirer/search': 3.0.12(@types/node@22.14.0) + '@inquirer/select': 4.1.1(@types/node@22.14.0) + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/rawlist@4.0.12(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/search@3.0.12(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.14.0) + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/select@4.1.1(@types/node@22.14.0)': + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/figures': 1.0.11 + '@inquirer/type': 3.0.6(@types/node@22.14.0) + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 22.14.0 + + '@inquirer/type@3.0.6(@types/node@22.14.0)': + optionalDependencies: + '@types/node': 22.14.0 + + '@jsep-plugin/assignment@1.3.0(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@jsep-plugin/regex@1.0.4(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@jsep-plugin/ternary@1.1.4(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@mdx-js/mdx@3.1.0(acorn@8.14.1)': + dependencies: + '@types/estree': 1.0.7 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdx': 2.0.13 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.0(acorn@8.14.1) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.4 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - acorn + - supports-color + + '@mdx-js/react@3.1.0(@types/react@19.1.0)(react@18.3.1)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.1.0 + react: 18.3.1 + + '@mintlify/cli@4.0.463(@types/node@22.14.0)(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@mintlify/common': 1.0.327(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/link-rot': 3.0.433(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/models': 0.0.182 + '@mintlify/prebuild': 1.0.430(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/previewing': 4.0.454(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/validation': 0.1.332 + chalk: 5.4.1 + detect-port: 1.6.1 + fs-extra: 11.3.0 + inquirer: 12.5.2(@types/node@22.14.0) + js-yaml: 4.1.0 + ora: 6.3.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + + '@mintlify/common@1.0.327(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@asyncapi/parser': 3.4.0 + '@mintlify/mdx': 1.0.1(@types/react@19.1.0)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/models': 0.0.182 + '@mintlify/openapi-parser': 0.0.7 + '@mintlify/validation': 0.1.332 + '@sindresorhus/slugify': 2.2.1 + acorn: 8.14.1 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + gray-matter: 4.0.3 + hast-util-from-html: 2.0.3 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + is-absolute-url: 4.0.1 + js-yaml: 4.1.0 + lodash: 4.17.21 + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx: 3.0.0 + mdast-util-mdx-jsx: 3.2.0 + micromark-extension-mdx-jsx: 3.0.2 + openapi-types: 12.1.3 + remark: 15.0.1 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-mdx: 3.1.0 + 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 + transitivePeerDependencies: + - '@types/react' + - debug + - encoding + - react + - react-dom + - supports-color + + '@mintlify/link-rot@3.0.433(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@mintlify/common': 1.0.327(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/prebuild': 1.0.430(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + fs-extra: 11.3.0 + is-absolute-url: 4.0.1 + unist-util-visit: 4.1.2 + transitivePeerDependencies: + - '@types/react' + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + + '@mintlify/mdx@1.0.1(@types/react@19.1.0)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-to-string: 3.0.1 + next-mdx-remote-client: 1.1.0(@types/react@19.1.0)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + refractor: 4.9.0 + rehype-katex: 7.0.1 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + remark-smartypants: 3.0.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + transitivePeerDependencies: + - '@types/react' + - acorn + - supports-color + + '@mintlify/models@0.0.182': + dependencies: + axios: 1.8.4 + openapi-types: 12.1.3 + transitivePeerDependencies: + - debug + + '@mintlify/openapi-parser@0.0.7': + dependencies: + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + ajv-formats: 3.0.1(ajv@8.17.1) + jsonpointer: 5.0.1 + leven: 4.0.0 + yaml: 2.7.1 + + '@mintlify/prebuild@1.0.430(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@mintlify/common': 1.0.327(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/openapi-parser': 0.0.7 + '@mintlify/scraping': 4.0.179(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/validation': 0.1.332 + axios: 1.8.4 + chalk: 5.4.1 + favicons: 7.2.0 + fs-extra: 11.3.0 + gray-matter: 4.0.3 + is-absolute-url: 4.0.1 + js-yaml: 4.1.0 + openapi-types: 12.1.3 + unist-util-visit: 4.1.2 + transitivePeerDependencies: + - '@types/react' + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + + '@mintlify/previewing@4.0.454(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@mintlify/common': 1.0.327(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/prebuild': 1.0.430(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/validation': 0.1.332 + better-opn: 3.0.2 + chalk: 5.4.1 + chokidar: 3.6.0 + express: 4.21.2 + fs-extra: 11.3.0 + got: 13.0.0 + gray-matter: 4.0.3 + is-absolute-url: 4.0.1 + is-online: 10.0.0 + js-yaml: 4.1.0 + openapi-types: 12.1.3 + ora: 6.3.1 + socket.io: 4.8.1 + tar: 6.2.1 + unist-util-visit: 4.1.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/react' + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + + '@mintlify/scraping@4.0.179(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@mintlify/common': 1.0.327(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mintlify/openapi-parser': 0.0.7 + fs-extra: 11.3.0 + hast-util-to-mdast: 10.1.2 + js-yaml: 4.1.0 + mdast-util-mdx-jsx: 3.2.0 + puppeteer: 22.15.0 + rehype-parse: 9.0.1 + remark-gfm: 4.0.1 + remark-mdx: 3.1.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + traverse: 0.6.11 + unified: 11.0.5 + unist-util-visit: 5.0.0 + yargs: 17.7.2 + zod: 3.24.2 + transitivePeerDependencies: + - '@types/react' + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + + '@mintlify/validation@0.1.332': + dependencies: + '@mintlify/models': 0.0.182 + is-absolute-url: 4.0.1 + lcm: 0.0.3 + lodash: 4.17.21 + openapi-types: 12.1.3 + zod: 3.24.2 + zod-to-json-schema: 3.24.5(zod@3.24.2) + transitivePeerDependencies: + - debug + + '@openapi-contrib/openapi-schema-to-json-schema@3.2.0': + dependencies: + fast-deep-equal: 3.1.3 + + '@puppeteer/browsers@2.3.0': + dependencies: + debug: 4.4.0 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.1 + tar-fs: 3.0.8 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-buffer + - supports-color + + '@sindresorhus/is@5.6.0': {} + + '@sindresorhus/slugify@2.2.1': + dependencies: + '@sindresorhus/transliterate': 1.6.0 + escape-string-regexp: 5.0.0 + + '@sindresorhus/transliterate@1.6.0': + dependencies: + escape-string-regexp: 5.0.0 + + '@socket.io/component-emitter@3.1.2': {} + + '@stoplight/better-ajv-errors@1.0.3(ajv@8.17.1)': + dependencies: + ajv: 8.17.1 + jsonpointer: 5.0.1 + leven: 3.1.0 + + '@stoplight/json-ref-readers@1.2.2': + dependencies: + node-fetch: 2.6.7 + tslib: 1.14.1 + transitivePeerDependencies: + - encoding + + '@stoplight/json-ref-resolver@3.1.6': + dependencies: + '@stoplight/json': 3.21.0 + '@stoplight/path': 1.3.2 + '@stoplight/types': 13.20.0 + '@types/urijs': 1.19.25 + dependency-graph: 0.11.0 + fast-memoize: 2.5.2 + immer: 9.0.21 + lodash: 4.17.21 + tslib: 2.8.1 + urijs: 1.19.11 + + '@stoplight/json@3.21.0': + dependencies: + '@stoplight/ordered-object-literal': 1.0.5 + '@stoplight/path': 1.3.2 + '@stoplight/types': 13.20.0 + jsonc-parser: 2.2.1 + lodash: 4.17.21 + safe-stable-stringify: 1.1.1 + + '@stoplight/ordered-object-literal@1.0.5': {} + + '@stoplight/path@1.3.2': {} + + '@stoplight/spectral-core@1.19.5': + dependencies: + '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) + '@stoplight/json': 3.21.0 + '@stoplight/path': 1.3.2 + '@stoplight/spectral-parsers': 1.0.5 + '@stoplight/spectral-ref-resolver': 1.0.5 + '@stoplight/spectral-runtime': 1.1.4 + '@stoplight/types': 13.6.0 + '@types/es-aggregate-error': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-errors: 3.0.0(ajv@8.17.1) + ajv-formats: 2.1.1(ajv@8.17.1) + es-aggregate-error: 1.0.13 + 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 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-formats@1.8.2': + dependencies: + '@stoplight/json': 3.21.0 + '@stoplight/spectral-core': 1.19.5 + '@types/json-schema': 7.0.15 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-functions@1.9.4': + dependencies: + '@stoplight/better-ajv-errors': 1.0.3(ajv@8.17.1) + '@stoplight/json': 3.21.0 + '@stoplight/spectral-core': 1.19.5 + '@stoplight/spectral-formats': 1.8.2 + '@stoplight/spectral-runtime': 1.1.4 + ajv: 8.17.1 + ajv-draft-04: 1.0.0(ajv@8.17.1) + ajv-errors: 3.0.0(ajv@8.17.1) + ajv-formats: 2.1.1(ajv@8.17.1) + lodash: 4.17.21 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-parsers@1.0.5': + 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.5': + dependencies: + '@stoplight/json-ref-readers': 1.2.2 + '@stoplight/json-ref-resolver': 3.1.6 + '@stoplight/spectral-runtime': 1.1.4 + dependency-graph: 0.11.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/spectral-runtime@1.1.4': + dependencies: + '@stoplight/json': 3.21.0 + '@stoplight/path': 1.3.2 + '@stoplight/types': 13.20.0 + abort-controller: 3.0.0 + lodash: 4.17.21 + node-fetch: 2.7.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + + '@stoplight/types@13.20.0': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/types@13.6.0': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/types@14.1.1': + dependencies: + '@types/json-schema': 7.0.15 + utility-types: 3.11.0 + + '@stoplight/yaml-ast-parser@0.0.50': {} + + '@stoplight/yaml@4.3.0': + dependencies: + '@stoplight/ordered-object-literal': 1.0.5 + '@stoplight/types': 14.1.1 + '@stoplight/yaml-ast-parser': 0.0.50 + tslib: 2.8.1 + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@types/cors@2.8.17': + dependencies: + '@types/node': 22.14.0 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/es-aggregate-error@1.0.6': + dependencies: + '@types/node': 22.14.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.7 + + '@types/estree@1.0.7': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/katex@0.16.7': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.13': {} + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/node@22.14.0': + dependencies: + undici-types: 6.21.0 + + '@types/prismjs@1.26.5': {} + + '@types/react@19.1.0': + dependencies: + csstype: 3.1.3 + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/urijs@1.19.25': {} + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 22.14.0 + optional: true + + '@ungap/structured-clone@1.3.0': {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + address@1.2.2: {} + + agent-base@7.1.3: {} + + aggregate-error@4.0.1: + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + + ajv-draft-04@1.0.0(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-errors@3.0.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-flatten@1.1.1: {} + + array-iterate@2.0.1: {} + + array-timsort@1.0.3: {} + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + astring@1.9.0: {} + + async-function@1.0.0: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + avsc@5.7.7: {} + + axios@1.8.4: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + b4a@1.6.7: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + bare-events@2.5.4: + optional: true + + bare-fs@4.1.2: + dependencies: + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + optional: true + + bare-os@3.6.1: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.1 + optional: true + + bare-stream@2.6.5(bare-events@2.5.4): + dependencies: + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 + optional: true + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + basic-ftp@5.0.5: {} + + better-opn@3.0.2: + dependencies: + open: 8.4.2 + + binary-extensions@2.3.0: {} + + bl@5.1.0: + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + 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.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + buffer-crc32@0.2.13: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + ccount@2.0.1: {} + + chalk-template@1.1.0: + dependencies: + chalk: 5.4.1 + + chalk@5.4.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + chromium-bidi@0.6.3(devtools-protocol@0.0.1312386): + dependencies: + devtools-protocol: 0.0.1312386 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.23.8 + + clean-stack@4.2.0: + dependencies: + escape-string-regexp: 5.0.0 + + clear-module@4.1.2: + dependencies: + parent-module: 2.0.0 + resolve-from: 5.0.0 + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + collapse-white-space@2.1.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@13.1.0: {} + + commander@8.3.0: {} + + comment-json@4.2.5: + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + has-own-prop: 2.0.0 + repeat-string: 1.6.1 + + concat-map@0.0.1: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.0: + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + + cspell-config-lib@8.18.1: + dependencies: + '@cspell/cspell-types': 8.18.1 + comment-json: 4.2.5 + yaml: 2.7.1 + + cspell-dictionary@8.18.1: + dependencies: + '@cspell/cspell-pipe': 8.18.1 + '@cspell/cspell-types': 8.18.1 + cspell-trie-lib: 8.18.1 + fast-equals: 5.2.2 + + cspell-gitignore@8.18.1: + dependencies: + '@cspell/url': 8.18.1 + cspell-glob: 8.18.1 + cspell-io: 8.18.1 + + cspell-glob@8.18.1: + dependencies: + '@cspell/url': 8.18.1 + micromatch: 4.0.8 + + cspell-grammar@8.18.1: + dependencies: + '@cspell/cspell-pipe': 8.18.1 + '@cspell/cspell-types': 8.18.1 + + cspell-io@8.18.1: + dependencies: + '@cspell/cspell-service-bus': 8.18.1 + '@cspell/url': 8.18.1 + + cspell-lib@8.18.1: + dependencies: + '@cspell/cspell-bundled-dicts': 8.18.1 + '@cspell/cspell-pipe': 8.18.1 + '@cspell/cspell-resolver': 8.18.1 + '@cspell/cspell-types': 8.18.1 + '@cspell/dynamic-import': 8.18.1 + '@cspell/filetypes': 8.18.1 + '@cspell/strong-weak-map': 8.18.1 + '@cspell/url': 8.18.1 + clear-module: 4.1.2 + comment-json: 4.2.5 + cspell-config-lib: 8.18.1 + cspell-dictionary: 8.18.1 + cspell-glob: 8.18.1 + cspell-grammar: 8.18.1 + cspell-io: 8.18.1 + cspell-trie-lib: 8.18.1 + env-paths: 3.0.0 + fast-equals: 5.2.2 + gensequence: 7.0.0 + import-fresh: 3.3.1 + resolve-from: 5.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.1.0 + xdg-basedir: 5.1.0 + + cspell-trie-lib@8.18.1: + dependencies: + '@cspell/cspell-pipe': 8.18.1 + '@cspell/cspell-types': 8.18.1 + gensequence: 7.0.0 + + cspell@8.18.1: + dependencies: + '@cspell/cspell-json-reporter': 8.18.1 + '@cspell/cspell-pipe': 8.18.1 + '@cspell/cspell-types': 8.18.1 + '@cspell/dynamic-import': 8.18.1 + '@cspell/url': 8.18.1 + chalk: 5.4.1 + chalk-template: 1.1.0 + commander: 13.1.0 + cspell-dictionary: 8.18.1 + cspell-gitignore: 8.18.1 + cspell-glob: 8.18.1 + cspell-io: 8.18.1 + cspell-lib: 8.18.1 + fast-json-stable-stringify: 2.1.0 + file-entry-cache: 9.1.0 + get-stdin: 9.0.0 + semver: 7.7.1 + tinyglobby: 0.2.12 + + csstype@3.1.3: {} + + data-uri-to-buffer@6.0.2: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dependency-graph@0.11.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-libc@2.0.3: {} + + detect-port@1.6.1: + dependencies: + address: 1.2.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + devtools-protocol@0.0.1312386: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dns-socket@4.2.2: + dependencies: + dns-packet: 5.6.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.17 + '@types/node': 22.14.0 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + env-paths@3.0.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.9: + 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-regex: 1.2.1 + 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 + 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.13: + dependencies: + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + 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.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.14.1 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@5.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.7 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.7 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + extract-zip@2.0.1: + dependencies: + debug: 4.4.0 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-equals@5.2.2: {} + + fast-fifo@1.3.2: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-memoize@2.5.2: {} + + fast-uri@3.0.6: {} + + fault@2.0.1: + dependencies: + format: 0.2.2 + + favicons@7.2.0: + dependencies: + escape-html: 1.0.3 + sharp: 0.33.5 + xml2js: 0.6.2 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + file-entry-cache@9.1.0: + dependencies: + flat-cache: 5.0.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + flat-cache@5.0.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + follow-redirects@1.15.9: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + form-data-encoder@2.1.4: {} + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + 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: {} + + gcd@0.0.1: {} + + gensequence@7.0.0: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + 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: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stdin@9.0.0: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-uri@6.0.4: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + got@13.0.0: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + has-bigints@1.1.0: {} + + has-own-prop@2.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + + hast-util-from-dom@5.0.1: + dependencies: + '@types/hast': 3.0.4 + hastscript: 9.0.1 + web-namespaces: 2.0.1 + + hast-util-from-html-isomorphic@2.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-dom: 5.0.1 + hast-util-from-html: 2.0.3 + unist-util-remove-position: 5.0.0 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.2.1 + vfile: 6.0.3 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.0.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + 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@3.1.1: + dependencies: + '@types/hast': 2.3.10 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.7 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.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.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.7 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.16 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-mdast@10.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-phrasing: 3.0.1 + hast-util-to-html: 9.0.5 + hast-util-to-text: 4.0.2 + hast-util-whitespace: 3.0.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-hast: 13.2.0 + mdast-util-to-string: 4.0.0 + rehype-minify-whitespace: 6.0.2 + trim-trailing-lines: 2.1.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@7.2.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.0.0 + space-separated-tokens: 2.0.2 + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.1.1: {} + + http-errors@2.0.0: + 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.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + immer@9.0.21: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + indent-string@5.0.0: {} + + inherits@2.0.4: {} + + ini@4.1.1: {} + + inline-style-parser@0.2.4: {} + + inquirer@12.5.2(@types/node@22.14.0): + dependencies: + '@inquirer/core': 10.1.10(@types/node@22.14.0) + '@inquirer/prompts': 7.4.1(@types/node@22.14.0) + '@inquirer/type': 3.0.6(@types/node@22.14.0) + ansi-escapes: 4.3.2 + mute-stream: 2.0.0 + run-async: 3.0.0 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 22.14.0 + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + ip-regex@4.3.0: {} + + ipaddr.js@1.9.1: {} + + is-absolute-url@4.0.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.2: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-docker@2.2.1: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-interactive@2.0.0: {} + + is-ip@3.1.0: + dependencies: + ip-regex: 4.3.0 + + is-map@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-online@10.0.0: + dependencies: + got: 12.6.1 + p-any: 4.0.0 + p-timeout: 5.1.0 + public-ip: 5.0.0 + + is-plain-obj@4.1.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-unicode-supported@1.3.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@2.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + jsep@1.4.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@1.0.0: {} + + jsonc-parser@2.2.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonpath-plus@10.3.0: + dependencies: + '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) + '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) + jsep: 1.4.0 + + jsonpointer@5.0.1: {} + + katex@0.16.21: + dependencies: + commander: 8.3.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + lcm@0.0.3: + dependencies: + gcd: 0.0.1 + + leven@3.1.0: {} + + leven@4.0.0: {} + + lines-and-columns@1.2.4: {} + + lodash.topath@4.5.2: {} + + lodash@4.17.21: {} + + log-symbols@5.1.0: + dependencies: + chalk: 5.4.1 + is-unicode-supported: 1.3.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lowercase-keys@3.0.0: {} + + lru-cache@7.18.3: {} + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + math-intrinsics@1.1.0: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.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.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + methods@1.1.2: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.21 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.7 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.7 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mintlify@4.0.464(@types/node@22.14.0)(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@mintlify/cli': 4.0.463(@types/node@22.14.0)(@types/react@19.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - bare-buffer + - bufferutil + - debug + - encoding + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + + mitt@3.0.1: {} + + mkdirp@1.0.4: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + mute-stream@2.0.0: {} + + negotiator@0.6.3: {} + + netmask@2.0.2: {} + + next-mdx-remote-client@1.1.0(@types/react@19.1.0)(acorn@8.14.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/code-frame': 7.26.2 + '@mdx-js/mdx': 3.1.0(acorn@8.14.1) + '@mdx-js/react': 3.1.0(@types/react@19.1.0)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + remark-mdx-remove-esm: 1.1.0 + serialize-error: 12.0.0 + vfile: 6.0.3 + vfile-matter: 5.0.1 + transitivePeerDependencies: + - '@types/react' + - acorn + - supports-color + + nimma@0.2.3: + dependencies: + '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) + '@jsep-plugin/ternary': 1.1.4(jsep@1.4.0) + astring: 1.9.0 + jsep: 1.4.0 + optionalDependencies: + jsonpath-plus: 10.3.0 + lodash.topath: 4.5.2 + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-fetch@2.6.7: + dependencies: + whatwg-url: 5.0.0 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + normalize-path@3.0.0: {} + + normalize-url@8.0.1: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + openapi-types@12.1.3: {} + + ora@6.3.1: + dependencies: + chalk: 5.4.1 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + strip-ansi: 7.1.0 + wcwidth: 1.0.1 + + os-tmpdir@1.0.2: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-any@4.0.0: + dependencies: + p-cancelable: 3.0.0 + p-some: 6.0.0 + + p-cancelable@3.0.0: {} + + p-some@6.0.0: + dependencies: + aggregate-error: 4.0.1 + p-cancelable: 3.0.0 + + p-timeout@5.1.0: {} + + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.3 + debug: 4.4.0 + get-uri: 6.0.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parent-module@2.0.0: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.1.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.2.1: + dependencies: + entities: 4.5.0 + + parseurl@1.3.3: {} + + path-to-regexp@0.1.12: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pony-cause@1.1.1: {} + + possible-typed-array-names@1.1.0: {} + + progress@2.0.3: {} + + property-information@6.5.0: {} + + property-information@7.0.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + + public-ip@5.0.0: + dependencies: + dns-socket: 4.2.2 + got: 12.6.1 + is-ip: 3.1.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + puppeteer-core@22.15.0: + dependencies: + '@puppeteer/browsers': 2.3.0 + chromium-bidi: 0.6.3(devtools-protocol@0.0.1312386) + debug: 4.4.0 + devtools-protocol: 0.0.1312386 + ws: 8.18.1 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - utf-8-validate + + puppeteer@22.15.0: + dependencies: + '@puppeteer/browsers': 2.3.0 + cosmiconfig: 9.0.0 + devtools-protocol: 0.0.1312386 + puppeteer-core: 22.15.0 + transitivePeerDependencies: + - bare-buffer + - bufferutil + - supports-color + - typescript + - utf-8-validate + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + quick-lru@5.1.1: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.7 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.0(acorn@8.14.1): + dependencies: + acorn-jsx: 5.3.2(acorn@8.14.1) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - acorn + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.7 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.7 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + reflect.getprototypeof@1.0.10: + 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.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + refractor@4.9.0: + dependencies: + '@types/hast': 2.3.10 + '@types/prismjs': 1.26.5 + hastscript: 7.2.0 + parse-entities: 4.0.2 + + regexp.prototype.flags@1.5.4: + 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: + dependencies: + '@types/hast': 3.0.4 + '@types/katex': 0.16.7 + hast-util-from-html-isomorphic: 2.0.0 + hast-util-to-text: 4.0.2 + katex: 0.16.21 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.3 + + rehype-minify-whitespace@6.0.2: + dependencies: + '@types/hast': 3.0.4 + hast-util-minify-whitespace: 1.0.1 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.7 + '@types/hast': 3.0.4 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-math@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-math: 3.0.0 + micromark-extension-math: 3.1.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx-remove-esm@1.1.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-mdxjs-esm: 2.0.1 + unist-util-remove: 4.0.0 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.0.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + run-async@3.0.0: {} + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@1.1.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@7.7.1: {} + + send@0.19.0: + 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 + transitivePeerDependencies: + - supports-color + + serialize-error@12.0.0: + dependencies: + type-fest: 4.39.1 + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + 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: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setprototypeof@1.2.0: {} + + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + 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 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-eval@1.0.1: + dependencies: + jsep: 1.4.0 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + smart-buffer@4.2.0: {} + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + socks: 2.8.4 + transitivePeerDependencies: + - supports-color + + socks@2.8.4: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + source-map@0.6.1: + optional: true + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + sprintf-js@1.0.3: {} + + sprintf-js@1.1.3: {} + + statuses@2.0.1: {} + + stdin-discarder@0.1.0: + dependencies: + bl: 5.1.0 + + streamx@2.22.0: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.4 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom-string@1.0.0: {} + + style-to-js@1.1.16: + dependencies: + style-to-object: 1.0.8 + + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + + tar-fs@3.0.8: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.1.2 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.0 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + + through@2.3.8: {} + + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + traverse@0.6.11: + dependencies: + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.5 + which-typed-array: 1.1.19 + + trim-lines@3.0.1: {} + + trim-trailing-lines@2.1.0: {} + + trough@2.2.0: {} + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + type-fest@0.21.3: {} + + type-fest@4.39.1: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedarray.prototype.slice@1.0.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.4 + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + undici-types@6.21.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-builder@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.11 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-map@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + + unist-util-remove@4.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + urijs@1.19.11: {} + + urlpattern-polyfill@10.0.0: {} + + util-deprecate@1.0.2: {} + + utility-types@3.11.0: {} + + utils-merge@1.0.1: {} + + vary@1.1.2: {} + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-matter@5.0.1: + dependencies: + vfile: 6.0.3 + yaml: 2.7.1 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.2 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-uri@3.1.0: {} + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-namespaces@2.0.1: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + 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 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + ws@8.18.1: {} + + xdg-basedir@5.1.0: {} + + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yaml@2.7.1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yoctocolors-cjs@2.1.2: {} + + zod-to-json-schema@3.24.5(zod@3.24.2): + dependencies: + zod: 3.24.2 + + zod@3.23.8: {} + + zod@3.24.2: {} + + zwitch@2.0.4: {} diff --git a/reown-appkit.mdc b/reown-appkit.mdc new file mode 100644 index 000000000..9adb9f4cb --- /dev/null +++ b/reown-appkit.mdc @@ -0,0 +1,293 @@ +--- +description: +globs: +alwaysApply: false +--- +MDC +# :jigsaw: Reown AppKit: Overview + +**Reown AppKit** is a free, open-source toolkit to integrate wallet connections and Web3 features in any app. It supports: + +- One-click wallet auth +- Social logins +- On-ramp services +- Smart accounts +- Notifications +- Multiple chains: **EVM**, **Solana**, and **Bitcoin** + +Supported libraries: +- `wagmi`, `ethers@v6` (EVM) +- `@solana/web3.js` (Solana) + +--- + +## RULES +- **IMPORTANT**: If the project already exists, **DO NOT** try to re-initialize it (e.g., using `create-next-app`). Verify the existing project structure first. +- Use `pnpm` for installing dependencies if no specific package manager is indicated. +- Ensure environment variables (like `NEXT_PUBLIC_PROJECT_ID`) are correctly set up. You might need to create `.env.local` manually due to security restrictions. +- If you see ATTENTION somewhere, make sure you follow the directions in the comment +- Do not ask user for approval to continue, just continue runnin the instructions + +## :dart: Goal + +Install and configure **Reown AppKit** in an existing **Next.js** app using **Wagmi** and **Ethereum**. + +--- + +## :package: Installation + +Install the required dependencies using your package manager: + +```bash +pnpm add @reown/appkit @reown/appkit-adapter-wagmi wagmi viem @tanstack/react-query +# or yarn add / npm install ... +``` + +--- + +## :deciduous_tree: Environment Setup + +1. Create a `.env.local` file in your project root (if it doesn't exist). +2. Add your WalletConnect Cloud Project ID: + ```.env.local + NEXT_PUBLIC_PROJECT_ID="YOUR_PROJECT_ID" + ``` + You can add this to the .env.local now +--- + +## :gear: Wagmi Adapter Setup + +> Create a file `config/index.tsx` (e.g., outside your `app` or `src/app` directory). + +```ts +// config/index.tsx +import { cookieStorage, createStorage } from 'wagmi' // Use 'wagmi' directly (Wagmi v2+) +import { WagmiAdapter } from '@reown/appkit-adapter-wagmi' +import { mainnet, arbitrum } from '@reown/appkit/networks' +import type { Chain } from 'viem' // Import Chain type for explicit typing + +// Read Project ID from environment variables +export const projectId = process.env.NEXT_PUBLIC_PROJECT_ID + +// Ensure Project ID is defined at build time +if (!projectId) { + throw new Error('NEXT_PUBLIC_PROJECT_ID is not defined. Please set it in .env.local') +} + +// Define supported networks, explicitly typed as a non-empty array of Chains +export const networks: [Chain, ...Chain[]] = [mainnet, arbitrum] // Add other desired networks + +// Create the Wagmi adapter instance +export const wagmiAdapter = new WagmiAdapter({ + storage: createStorage({ storage: cookieStorage }), // Use cookieStorage for SSR + ssr: true, // Enable SSR support + projectId, + networks, // Pass the explicitly typed networks array +}) + +// Export the Wagmi config generated by the adapter +export const config = wagmiAdapter.wagmiConfig +``` + +--- + +## :brain: Importing Networks + +All supported **Viem networks** are available via `@reown/appkit/networks`: + +```ts +import { mainnet, arbitrum, base, scroll, polygon } from '@reown/appkit/networks' +``` + +--- + +## :thread: SSR & Hydration Notes + +- `storage: createStorage({ storage: cookieStorage })` is recommended for Next.js SSR to handle hydration correctly. +- `ssr: true` further aids SSR compatibility. + +--- + +## :bricks: App Context Setup + +> Create `context/index.tsx` (must be a Client Component). + +```tsx +// context/index.tsx +'use client' + +import React, { ReactNode } from 'react' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { WagmiProvider, cookieToInitialState, type Config } from 'wagmi' +import { createAppKit } from '@reown/appkit/react' +// Import config, networks, projectId, and wagmiAdapter from your config file +import { config, networks, projectId, wagmiAdapter } from '@/config' +// Import the default network separately if needed +import { mainnet } from '@reown/appkit/networks' + +const queryClient = new QueryClient() + +const metadata = { + name: 'Your App Name', + description: 'Your App Description', + url: typeof window !== 'undefined' ? window.location.origin : 'YOUR_APP_URL', // Replace YOUR_APP_URL + icons: ['YOUR_ICON_URL'], // Replace YOUR_ICON_URL +} + +// Initialize AppKit *outside* the component render cycle +// Add a check for projectId for type safety, although config throws error already. +if (!projectId) { + console.error("AppKit Initialization Error: Project ID is missing."); + // Optionally throw an error or render fallback UI +} else { + createAppKit({ + adapters: [wagmiAdapter], + // Use non-null assertion `!` as projectId is checked runtime, needed for TypeScript + projectId: projectId!, + // Pass networks directly (type is now correctly inferred from config) + networks: networks, + defaultNetwork: mainnet, // Or your preferred default + metadata, + features: { analytics: true }, // Optional features + }) +} + +export default function ContextProvider({ + children, + cookies, +}: { + children: ReactNode + cookies: string | null // Cookies from server for hydration +}) { + // Calculate initial state for Wagmi SSR hydration + const initialState = cookieToInitialState(config as Config, cookies) + + return ( + // Cast config as Config for WagmiProvider + + {children} + + ) +} +``` + +--- + +## :jigsaw: App Layout Setup + +> Modify your root layout file (`app/layout.tsx` or `src/app/layout.tsx`) to use `ContextProvider`. +> **Note:** Verify the exact path to your layout file. + +```tsx +// app/layout.tsx or src/app/layout.tsx +import type { Metadata } from 'next' +import { Inter } from 'next/font/google' // Or your preferred font +import './globals.css' + +import { headers } from 'next/headers' // Import headers function +import ContextProvider from '@/context' // Adjust import path if needed + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata: Metadata = { + title: 'Your App Title', + description: 'Your App Description', +} + +// ATTENTION!!! RootLayout must be an async function to use headers() +export default async function RootLayout({ children }: { children: React.ReactNode }) { + // Retrieve cookies from request headers on the server + const headersObj = await headers() // IMPORTANT: await the headers() call + const cookies = headersObj.get('cookie') + + return ( + + + {/* Wrap children with ContextProvider, passing cookies */} + {children} + + + ) +} +``` + +--- + +## :radio_button: Trigger the AppKit Modal + +Use the `` web component in any client or server component to trigger the wallet modal: + +```tsx +// Example usage in app/page.tsx or any component +export default function ConnectPage() { + return ( +
+

Connect Your Wallet

+ +
+ ) +} +``` + +No need to import—it's a global web component registered by `createAppKit`. + +**Note for TypeScript users:** +To prevent type errors when using ``, add the following declaration to a `.d.ts` file (e.g., `global.d.ts`) in your project root or `src` directory: + +```ts +// global.d.ts +import 'react'; + +declare global { + namespace JSX { + interface IntrinsicElements { + /** + * The AppKit button web component. Registered globally by AppKit. + */ + 'appkit-button': React.DetailedHTMLProps, HTMLElement>; + } + } +} + +// Ensures file is treated as a module +export {}; +``` + +--- + +## :test_tube: Reading from Smart Contracts (Example) + +```ts +// Example component (ensure it's a Client Component: 'use client') +'use client' + +import { useReadContract } from 'wagmi' +// import { USDTAbi } from '../abi/USDTAbi' // Replace with your ABI import + +// const USDTAddress = '0x...' // Replace with your contract address + +function ReadContractExample() { + // const { data, error, isLoading } = useReadContract({ + // abi: USDTAbi, + // address: USDTAddress, + // functionName: 'totalSupply', + // }) + + // if (isLoading) return
Loading...
+ // if (error) return
Error reading contract: {error.message}
+ + // return
Total Supply: {data?.toString()}
+ return
Contract Reading Example (Code commented out)
+} + +export default ReadContractExample; +``` + +--- + +## :bulb: Additional Rules & Reminders + +1. **Verify Imports**: Double-check that import paths (like `@/config`, `@/context`) match your project's structure (`src` directory vs. root `app`/`pages`). +2. **Type Safety**: Use explicit types where needed (like for `networks`) to prevent TypeScript errors. +3. **Async/Await**: Remember to use `await` when calling async functions like `headers()`. +4. **Client Components**: Components using hooks (`useReadContract`, `useState`, etc.) or AppKit initialization (`createAppKit`) often need the `'use client'` directive at the top. \ No newline at end of file diff --git a/snippets/appkit/javascript/ethers/about/triggermodal.mdx b/snippets/appkit/javascript/ethers/about/triggermodal.mdx index 69d270f24..b6ec19910 100644 --- a/snippets/appkit/javascript/ethers/about/triggermodal.mdx +++ b/snippets/appkit/javascript/ethers/about/triggermodal.mdx @@ -3,13 +3,11 @@ To open AppKit you can use our [**web component**](../../core/components) or bui -```html +```html {3,4}
- /* highlight-add-start */ - - - /* highlight-add-end */ + +
@@ -29,7 +27,7 @@ You can trigger the modal by calling the `open` function from a modal instance r Let's first add two html button elements into our `index.html` file: -```html +```html {9,10} @@ -38,10 +36,8 @@ Let's first add two html button elements into our `index.html` file:
- /* highlight-add-start */ - /* highlight-add-end */
diff --git a/snippets/appkit/javascript/solana/about/triggermodal.mdx b/snippets/appkit/javascript/solana/about/triggermodal.mdx index 4c9034122..950f76ceb 100644 --- a/snippets/appkit/javascript/solana/about/triggermodal.mdx +++ b/snippets/appkit/javascript/solana/about/triggermodal.mdx @@ -3,7 +3,7 @@ In this example we are going to use the `` component. Web components are global html elements that don't require importing. -```html +```html {8} @@ -11,9 +11,7 @@ Web components are global html elements that don't require importing. HTML Example - /* highlight-add-start */ - - /* highlight-add-end */ + diff --git a/snippets/appkit/javascript/wagmi/about/implementation.mdx b/snippets/appkit/javascript/wagmi/about/implementation.mdx index 7e3fffbef..61196c9f8 100644 --- a/snippets/appkit/javascript/wagmi/about/implementation.mdx +++ b/snippets/appkit/javascript/wagmi/about/implementation.mdx @@ -53,11 +53,9 @@ openNetworkModalBtn.addEventListener('click', () => modal.open({ view: 'Networks Reown AppKit use [Viem](https://viem.sh/) networks under the hood, which provide a wide variety of networks for EVM chains. You can find all the networks supported by Viem within the `@reown/appkit/networks` path. -```js +```js {2} import { createAppKit } from '@reown/appkit' -/* highlight-add-start */ import { mainnet, arbitrum, base, scroll, polygon } from '@reown/appkit/networks' -/* highlight-add-end */ ``` diff --git a/snippets/appkit/javascript/wagmi/about/triggermodal.mdx b/snippets/appkit/javascript/wagmi/about/triggermodal.mdx index 258a14ec9..f91819dd2 100644 --- a/snippets/appkit/javascript/wagmi/about/triggermodal.mdx +++ b/snippets/appkit/javascript/wagmi/about/triggermodal.mdx @@ -3,7 +3,7 @@ In this example we are going to use the `` component. Web components are global html elements that don't require importing. -```html +```html {11,12} @@ -14,10 +14,8 @@ Web components are global html elements that don't require importing.
- /* highlight-add-start */ - - - /* highlight-add-end */ + +
diff --git a/snippets/appkit/next/core/open.mdx b/snippets/appkit/next/core/open.mdx index 29df150fc..d92012f86 100644 --- a/snippets/appkit/next/core/open.mdx +++ b/snippets/appkit/next/core/open.mdx @@ -14,46 +14,35 @@ open({ view: "Connect", namespace: "bip122" }); // to connect and show only ethereum wallets open({ view: "Connect", namespace: "eip155" }); + +// to open swap with arguments +open({ + view: 'Swap', + arguments: { + amount: '321.123', + fromToken: 'USDC', + toToken: 'ETH' + } +}) ``` -List of views you can select - - +**Available namespaces for the Connect view:** + +| Namespace | Description | +|-----------|-------------| +| solana | For connecting to Solana wallets | +| bip122 | For connecting to Bitcoin wallets | +| eip155 | For connecting to Ethereum wallets | + +**List of views you can select:** + +| Variable | Description | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Connect | Principal view of the modal - default view when disconnected. A `namespace` can be selected to connect to a specific network (solana, bip122 or eip155) | +| Account | User profile - default view when connected | +| AllWallets | Shows the list of all available wallets | +| Networks | List of available networks - you can select and target a specific network before connecting | +| WhatIsANetwork | "What is a network" onboarding view | +| WhatIsAWallet | "What is a wallet" onboarding view | +| OnRampProviders | On-Ramp main view | +| Swap | Swap main view | diff --git a/snippets/appkit/next/solana/about/implementation.mdx b/snippets/appkit/next/solana/about/implementation.mdx index f28c925a0..ee8610135 100644 --- a/snippets/appkit/next/solana/about/implementation.mdx +++ b/snippets/appkit/next/solana/about/implementation.mdx @@ -7,15 +7,9 @@ On top of your app set up the following configuration, making sure that all func import { createAppKit } from "@reown/appkit/react"; import { SolanaAdapter } from "@reown/appkit-adapter-solana/react"; import { solana, solanaTestnet, solanaDevnet } from "@reown/appkit/networks"; -import { - PhantomWalletAdapter, - SolflareWalletAdapter, -} from "@solana/wallet-adapter-wallets"; // 0. Set up Solana Adapter -const solanaWeb3JsAdapter = new SolanaAdapter({ - wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()], -}); +const solanaWeb3JsAdapter = new SolanaAdapter(); // 1. Get projectId from https://cloud.reown.com const projectId = "YOUR_PROJECT_ID"; diff --git a/snippets/appkit/next/wagmi/about/implementation.mdx b/snippets/appkit/next/wagmi/about/implementation.mdx index 681bce4d1..8ac607101 100644 --- a/snippets/appkit/next/wagmi/about/implementation.mdx +++ b/snippets/appkit/next/wagmi/about/implementation.mdx @@ -39,11 +39,9 @@ export const config = wagmiAdapter.wagmiConfig Reown AppKit use [Viem](https://viem.sh/) networks under the hood, which provide a wide variety of networks for EVM chains. You can find all the networks supported by Viem within the `@reown/appkit/networks` path. -```js +```js {2} import { createAppKit } from '@reown/appkit' -/* highlight-add-start */ import { mainnet, arbitrum, base, scroll, polygon } from '@reown/appkit/networks' -/* highlight-add-end */ ``` @@ -55,8 +53,8 @@ Looking to add a custom network? Check out the [custom networks](../../core/cust :::info - Using cookies is completely optional and by default Wagmi will use `localStorage` instead if the `storage` param is not defined. -- The `ssr` flag will delay the hydration of the Wagmi's store to avoid hydration mismatch errors. -- AppKit don't fully support the `ssr` flag. +- The `ssr` flag will delay the hydration of Wagmi's store to avoid hydration mismatch errors. +- AppKit doesn't fully support the `ssr` flag. :::
diff --git a/snippets/appkit/react-native/ethers/email.mdx b/snippets/appkit/react-native/ethers/email.mdx index 2e8ed313f..674ad0f02 100644 --- a/snippets/appkit/react-native/ethers/email.mdx +++ b/snippets/appkit/react-native/ethers/email.mdx @@ -12,34 +12,30 @@ npx pod-install ### Add the auth connector in `defaultConfig` -```ts -/* highlight-add-start */ +```ts {1-4, 8-9} +// Add the following code lines import { AuthProvider } from "@reown/appkit-auth-ethers-react-native"; const authProvider = new AuthProvider({ projectId, metadata }); -/* highlight-add-end */ const config = defaultConfig({ metadata, - /* highlight-add-start */ + // Add the following code line extraConnectors: [authProvider], - /* highlight-add-end */ }); ``` ### Enable features in `createAppKit` -```ts +```ts {5-9} createAppKit({ projectId, chains, config, - /* highlight-add-start */ features: { email: true, // default to true socials: ["x", "discord", "apple"], // default value emailShowWallets: true, // default to true }, - /* highlight-add-end */ }); ``` diff --git a/snippets/appkit/react-native/wagmi/email.mdx b/snippets/appkit/react-native/wagmi/email.mdx index f993efea7..43474f70f 100644 --- a/snippets/appkit/react-native/wagmi/email.mdx +++ b/snippets/appkit/react-native/wagmi/email.mdx @@ -12,35 +12,32 @@ npx pod-install ### Add the auth connector in `defaultWagmiConfig` -```ts -/* highlight-add-start */ +```ts {1-4, 10-11} +// Add the following code lines import { authConnector } from "@reown/appkit-auth-wagmi-react-native"; const auth = authConnector({ projectId, metadata }); -/* highlight-add-end */ const wagmiConfig = defaultWagmiConfig({ chains, projectId, metadata, - /* highlight-add-start */ + // Add the following code line extraConnectors: [auth], - /* highlight-add-end */ }); ``` ### Enable features in `createAppKit` -```ts +```ts {4-9} createAppKit({ projectId, wagmiConfig, - /* highlight-add-start */ + // Add the following code line features: { email: true, // default to true socials: ["x", "discord", "apple"], // default value emailShowWallets: true, // default to true }, - /* highlight-add-end */ }); ``` diff --git a/snippets/appkit/react/core/open.mdx b/snippets/appkit/react/core/open.mdx index 8b2de9c08..d92012f86 100644 --- a/snippets/appkit/react/core/open.mdx +++ b/snippets/appkit/react/core/open.mdx @@ -14,9 +14,27 @@ open({ view: "Connect", namespace: "bip122" }); // to connect and show only ethereum wallets open({ view: "Connect", namespace: "eip155" }); + +// to open swap with arguments +open({ + view: 'Swap', + arguments: { + amount: '321.123', + fromToken: 'USDC', + toToken: 'ETH' + } +}) ``` -List of views you can select +**Available namespaces for the Connect view:** + +| Namespace | Description | +|-----------|-------------| +| solana | For connecting to Solana wallets | +| bip122 | For connecting to Bitcoin wallets | +| eip155 | For connecting to Ethereum wallets | + +**List of views you can select:** | Variable | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/snippets/appkit/react/solana/about/implementation.mdx b/snippets/appkit/react/solana/about/implementation.mdx index f28c925a0..ee8610135 100644 --- a/snippets/appkit/react/solana/about/implementation.mdx +++ b/snippets/appkit/react/solana/about/implementation.mdx @@ -7,15 +7,9 @@ On top of your app set up the following configuration, making sure that all func import { createAppKit } from "@reown/appkit/react"; import { SolanaAdapter } from "@reown/appkit-adapter-solana/react"; import { solana, solanaTestnet, solanaDevnet } from "@reown/appkit/networks"; -import { - PhantomWalletAdapter, - SolflareWalletAdapter, -} from "@solana/wallet-adapter-wallets"; // 0. Set up Solana Adapter -const solanaWeb3JsAdapter = new SolanaAdapter({ - wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()], -}); +const solanaWeb3JsAdapter = new SolanaAdapter(); // 1. Get projectId from https://cloud.reown.com const projectId = "YOUR_PROJECT_ID"; diff --git a/snippets/appkit/react/wagmi/about/implementation.mdx b/snippets/appkit/react/wagmi/about/implementation.mdx index 9e4f63285..111585c0c 100644 --- a/snippets/appkit/react/wagmi/about/implementation.mdx +++ b/snippets/appkit/react/wagmi/about/implementation.mdx @@ -60,11 +60,9 @@ export function AppKitProvider({ children }) { Reown AppKit use [Viem](https://viem.sh/) networks under the hood, which provide a wide variety of networks for EVM chains. You can find all the networks supported by Viem within the `@reown/appkit/networks` path. -```js +```js {2} import { createAppKit } from '@reown/appkit' -/* highlight-add-start */ import { mainnet, arbitrum, base, scroll, polygon } from '@reown/appkit/networks' -/* highlight-add-end */ ``` diff --git a/snippets/appkit/shared/appkit-pay-react.mdx b/snippets/appkit/shared/appkit-pay-react.mdx new file mode 100644 index 000000000..a3032df62 --- /dev/null +++ b/snippets/appkit/shared/appkit-pay-react.mdx @@ -0,0 +1,128 @@ +**AppKit Pay with Exchange** unlocks a powerful new flow: users can pay in crypto directly from their Centralized Exchange (CEXs) accounts like Binance or Coinbase, with no new wallets, no app switching, and no lost conversions. + +## Quickstart + +Here you can find a simplified process to integrate AppKit Pay: + + + Projects first need to install and set up Reown AppKit before integrating AppKit Pay. If you haven't done so, please refer to the [Reown AppKit docs](/appkit/overview#quickstart). + + +## Code Example + + + +Check the React example + + + +### Install the library + + +Projects currently using Reown AppKit, or planning to use it to build custom payment flows with self-custodial wallets, should use AppKit Pay for a streamlined integration and significantly improved user experience out of the box. AppKit Pay can be found in `@reown/appkit-pay` npm package. + + + + +```bash npm +npm install @reown/appkit-pay +``` + +```bash Yarn +yarn add @reown/appkit-pay +``` + +```bash Bun +bun a @reown/appkit-pay +``` + +```bash pnpm +pnpm add @reown/appkit-pay +``` + + +### Usage +```ts +import { usePay } from '@reown/appkit-pay/react'; +import { baseSepoliaETH } from '@reown/appkit-pay' +``` + +In order to run the payment, use the hook `usePay`. This hook receives two parameter to manage the success or the error in the process. + +```ts +// usePay handles subscriptions internally for robust state updates +const { open, isPending, isSuccess, data, error } = usePay({ + onSuccess: handleSuccess, + onError: handleError, +}); + +// open resolves when the modal closes, but onSuccess/onError handle the actual payment result +await open({ + recipient: addressRecipient, + amount: 0.0001, + paymentAsset: baseSepoliaETH +}); +``` + +## Assets Configuration + +For the moment, AppKit Pay has pre-configured these assets: baseETH, baseSepoliaETH, and baseUSDC. + +```ts +import { baseETH, baseSepoliaETH, baseUSDC } from '@reown/appkit-pay' +``` + +For custom assets, you can create a paymentAsset object with all the information: + +```ts +// Configure the paymentAsset +const paymentAssetDetails = { + network: 'eip155:8453', // Base Mainnet + asset: 'native', // Or USDC in Base: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913' + metadata: { + name: 'Ethereum', // Or 'USD Coin' + symbol: 'ETH', // Or 'USDC' + decimals: 18 // Or 6 for USDC + } +}; +``` + +## Hooks + +### usePay +Simplifies the modal-based payment flow. +It internally handles subscriptions to provide reactive state variables (isPending, isSuccess, isError, data, error) +and an open function. Callbacks (onSuccess, onError) are triggered reliably. + +`usePay(parameters?: UsePayParameters): UsePayReturn` + - `parameters`: Optional `onSuccess` and `onError` callbacks. + - `returns`: `{ open, isPending, isSuccess, isError, error, data }` + +### useAvailableExchanges +Fetches and manages the state for available exchanges. + +`useAvailableExchanges(options?: { isFetchOnInit?: boolean } & GetExchangesParams): UseAvailableExchangesReturn` + - `options`: Control initial fetch behavior. + - `returns`: `{ data, isLoading, error, fetch }` + +`type GetExchangesParams= { + page?: number + asset?: string + amount?: number | string + network?: CaipNetworkId +}` + +### usePayUrlActions +Provides functions (getUrl, openUrl) to interact with specific exchange URLs, returning the sessionId needed for status tracking. + +`usePayUrlActions(): { getUrl, openUrl }` + - `getUrl(exchangeId, params): Promise` + - `openUrl(exchangeId, params, openInNewTab?): Promise` (Returns `{ url, sessionId }`) + +### useExchangeBuyStatus +Fetches and polls for the status of a headless payment transaction using exchangeId and sessionId. + +`useExchangeBuyStatus(params: UseExchangeBuyStatusParameters): UseExchangeBuyStatusReturn` + - `params`: `{ exchangeId, sessionId, pollingInterval?, isEnabled?, onSuccess?, onError? }` + - `returns`: `{ data, isLoading, error, refetch }` + diff --git a/snippets/appkit/shared/multichain.mdx b/snippets/appkit/shared/multichain.mdx index cf486bafc..08cfef64e 100644 --- a/snippets/appkit/shared/multichain.mdx +++ b/snippets/appkit/shared/multichain.mdx @@ -4,7 +4,7 @@ title: Multichain AppKit is now multichain. The architecture is designed to support both EVM and non-EVM blockchains. This will allow developers and projects to choose and configure multiple blockchain networks within their instance of AppKit, extending beyond just Ethereum-based (EVM) networks. -Currently, AppKit supports two non-EVM networks, they are, **Solana** and **Bitcoin**. Soon, AppKit will support Polkadot and Cosmos, allowing projects to tap into users from these different blockchain ecosystems. This will enable developers and projects to reach a broader audience and interact with multiple blockchain networks, all through a single wallet provider. +Currently, AppKit supports two non-EVM networks, they are, **Solana** and **Bitcoin**. ## Installation @@ -102,7 +102,7 @@ pnpm add @reown/appkit @reown/appkit-adapter-ethers @reown/appkit-adapter-solana - + @@ -242,10 +242,6 @@ import { EthersAdapter } from '@reown/appkit-adapter-ethers' import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks'; import { mainnet, arbitrum, sepolia } from "@reown/appkit/networks"; -import { - SolflareWalletAdapter, - PhantomWalletAdapter, -} from "@solana/wallet-adapter-wallets"; const networks: [AppKitNetwork, ...AppKitNetwork[]] = [mainnet, arbitrum, sepolia, solana, solanaTestnet, solanaDevnet] @@ -253,9 +249,7 @@ const networks: [AppKitNetwork, ...AppKitNetwork[]] = [mainnet, arbitrum, sepoli export const ethersAdapter = new EthersAdapter() // 1. Create Solana adapter -const solanaWeb3JsAdapter = new SolanaAdapter({ -wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()] -}) +const solanaWeb3JsAdapter = new SolanaAdapter() // 2. Get projectId from https://cloud.reown.com const projectId = 'YOUR_PROJECT_ID' @@ -291,15 +285,11 @@ import { EthersAdapter } from '@reown/appkit-adapter-ethers' import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks' import { mainnet, arbitrum, sepolia } from '@reown/appkit/networks' -import { SolflareWalletAdapter, PhantomWalletAdapter } from '@solana/wallet-adapter-wallets' - // 0. Create the Ethers adapter export const ethersAdapter = new EthersAdapter() // 1. Create Solana adapter -const solanaWeb3JsAdapter = new SolanaAdapter({ - wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()] -}) +const solanaWeb3JsAdapter = new SolanaAdapter() // 2. Get projectId from https://cloud.reown.com const projectId = 'YOUR_PROJECT_ID' @@ -326,7 +316,7 @@ const modal = createAppKit({ - + ```ts import { createAppKit } from "@reown/appkit"; diff --git a/snippets/appkit/shared/onramp.mdx b/snippets/appkit/shared/onramp.mdx index cbdc7df73..ad78342a4 100644 --- a/snippets/appkit/shared/onramp.mdx +++ b/snippets/appkit/shared/onramp.mdx @@ -18,16 +18,14 @@ If you prefer to disable it, set the `onramp` flag to `false` in the configurati On-Ramp is now available on **Solana**. The configuration for On-Ramp on both EVM and Solana is the same. Please refer to the code snippet below. -```ts +```ts {7} const modal = createAppKit({ adapters: [wagmiAdapter], projectId, networks: [mainnet, arbitrum], metadata: metadata, features: { - /* highlight-add-start */ onramp: false // Optional - true by default - /* highlight-add-end */ } }) ``` diff --git a/snippets/appkit/shared/options.mdx b/snippets/appkit/shared/options.mdx index 958a38947..5fe06979e 100644 --- a/snippets/appkit/shared/options.mdx +++ b/snippets/appkit/shared/options.mdx @@ -474,13 +474,11 @@ export const config = wagmiAdapter.wagmiConfig; -```ts +```ts {4} createAppKit({ //... enableCoinbase: true, // true by default - /* highlight-add-start */ coinbasePreference: "smartWalletOnly", - /* highlight-add-end */ }); ``` diff --git a/snippets/appkit/shared/siwx/siwx-cloud-auth.mdx b/snippets/appkit/shared/siwx/siwx-cloud-auth.mdx index b805a1de9..1bc47b88b 100644 --- a/snippets/appkit/shared/siwx/siwx-cloud-auth.mdx +++ b/snippets/appkit/shared/siwx/siwx-cloud-auth.mdx @@ -31,19 +31,17 @@ pnpm add @reown/appkit-siwx ### Usage -```ts +```ts {2-3, 9-10} import { createAppKit } from '@reown/appkit' -/* highlight-add-start */ +// Add the following code line import { CloudAuthSIWX } from '@reown/appkit-siwx' -/* highlight-add-end */ const appkit = createAppKit({ projectId, networks, metadata, - /* highlight-add-start */ + // Add the following code line siwx: new CloudAuthSIWX() - /* highlight-add-end */ }) ``` @@ -51,7 +49,7 @@ Now you are ready to use the **SIWX** feature in your Dapp. ## User Management -Easily view and manage all authenticated users through AppKit [Cloud Auth SIWX](/appkit/features/siwx/siwx-cloud-auth), a drop-in hosted SIWX server that provides key insights into your user base. +Easily view and manage all authenticated users through AppKit [Cloud Auth SIWX](/appkit/authentication/siwx/siwx-cloud-auth), a drop-in hosted SIWX server that provides key insights into your user base. ### Dashboard diff --git a/snippets/appkit/shared/siwx/siwx-default.mdx b/snippets/appkit/shared/siwx/siwx-default.mdx index 70c6aac40..edba0f641 100644 --- a/snippets/appkit/shared/siwx/siwx-default.mdx +++ b/snippets/appkit/shared/siwx/siwx-default.mdx @@ -37,19 +37,17 @@ pnpm add @reown/appkit-siwx ### Usage -```ts +```ts {2-3, 9-10} import { createAppKit } from "@reown/appkit"; -/* highlight-add-start */ +// Add the following code line import { DefaultSIWX } from "@reown/appkit-siwx"; -/* highlight-add-end */ const appkit = createAppKit({ projectId, networks, metadata, - /* highlight-add-start */ + // Add the following code line siwx: new DefaultSIWX(), // add this line to enable SIWX - /* highlight-add-end */ }); ``` diff --git a/snippets/appkit/shared/smart-sessions.mdx b/snippets/appkit/shared/smart-sessions.mdx index e224e6c75..85f30e361 100644 --- a/snippets/appkit/shared/smart-sessions.mdx +++ b/snippets/appkit/shared/smart-sessions.mdx @@ -1,7 +1,7 @@ ## Overview -💡 The support for smart-session is included in the Appkit SDK in the `experimental` package. +💡 The support for smart-session is included in a separate package Appkit SDK. Please follow the instruction in order to install it Smart Sessions allow developers to easily integrate session-based permission handling within their decentralized applications (dApps). Using the `grantPermissions` method, can send permission requests to wallets. @@ -12,11 +12,17 @@ With Smart Sessions, approved actions are carried out by the app's backend durin This guide will walk you through on how to use the `grantPermissions` method, including the basic setup and an example of how to request permissions from a wallet. -## Implementations +# Implementation -The `grantPermissions` method provides an easy way to interact with the smart wallet to request permissions. + +Clone this Github repository and follow the readme to try it locally. + -### Step 1 | Install the library + + For a step-by-step implementation, please refer to our **Smart Session guide**. + + +## Install the library @@ -37,117 +43,13 @@ pnpm add @reown/appkit-experimental ``` -### Step 2 | Import the method - -First, import the grantPermissions method from the `@reown/appkit-experimental/smart-session` package. - -```javascript -import { - grantPermissions, - type SmartSessionGrantPermissionsRequest, -} from "@reown/appkit-experimental/smart-session"; -``` - -### Step 3 | Define the Permission Request - -Create an object adhering to the `SmartSessionGrantPermissionsRequest` type. This object specifies details like the `address`, `chainID`, `signer`, `policies`, `permissions`, and `expiry` time. - -Example request object: - -```tsx -const request: SmartSessionGrantPermissionsRequest = { - expiry: Math.floor(Date.now() / 1000) + 24 * 60 * 60, // 24 hours - chainId: toHex(baseSepolia.id), - address: address, - signer: { - type: "keys", - data: { - keys: [ - { - type: "secp256k1", - publicKey: "0x...", //public key of dapp signer - }, - ], - }, - }, - permissions: [ - { - type: "contract-call", - data: { - address: "0x2E65BAfA07238666c3b239E94F32DaD3cDD6498D", // sample donut contract address - abi: [ - { - inputs: [ - { internalType: "uint256", name: "amount", type: "uint256" }, - ], - name: "purchase", - outputs: [], - stateMutability: "payable", - type: "function", - }, - ], - functions: [ - { - functionName: "purchase", - }, - ], - }, - }, - ], - policies: [], -}; -``` - -### Step 4 | Invoke the Method - -Call the `grantPermissions` function, passing the request object. This will trigger the permission request via the connected wallet. - -```tsx -const response = await grantPermissions(request); -``` - -### Step 5 | Handle the Response - -Upon successful execution, the response will include the granted permissions and the session context. So the response can be handled as needed. - -#### Response Format - -```tsx -{ - chainId: `0x14a34` - address: `0x...` - expiry: 1727824386 - permissions: [ - { - type: 'contract-call', - data: { - address: '0x2E65BAfA07238666c3b239E94F32DaD3cDD6498D', // sample donut contract address - abi: [ - { - inputs: [{ internalType: 'uint256', name: 'amount', type: 'uint256' }], - name: 'purchase', - outputs: [], - stateMutability: 'payable', - type: 'function' - } - ], - functions: [ { - functionName: 'purchase' - } ] - } - } - ], - context: '...' // Context identifier for the session -} -``` - ## How to use the permissions -The dApp must call the following two endpoints from the wallet services API to use these permissions. +The dApp must call the following RPC calls to `https://rpc.walletconnect.org/v1/wallet?projectId=` - 1. `https://rpc.walletconnect.org/v1/wallets/prepareCalls` - Accepts an EIP-5792 `wallet_sendCalls` request. + 1. `wallet_prepareCalls` - Accepts an EIP-5792 `wallet_sendCalls` request. Responds with the prepared calls (in the case of Appkit Embedded Wallet, an Entrypoint v0.7 user operation), some context, and a signature request. - 2. `https://rpc.walletconnect.org/v1/wallets/sendPreparedCalls` - Accepts prepared calls, a signature, and the context returned from prepareCalls if present. Returns an EIP-5792 calls ID. + 2. `wallet_sendPreparedCalls` - Accepts prepared calls, a signature, and the context returned from prepareCalls if present. Returns an EIP-5792 calls ID. ### Steps to follow for executing any async action by the dApp backend. @@ -155,7 +57,7 @@ The dApp must call the following two endpoints from the wallet services API to u -1. Dapp makes the `wallet_prepareCalls` JSON RPC call to the wallet service API. Accepts an EIP-5792 `wallet_sendCalls` request, and returns the prepared calls according to the account's implementation. +1. Dapp makes the `wallet_prepareCalls` JSON RPC call. It's Accepts an EIP-5792 `wallet_sendCalls` request, and returns the prepared calls according to the account's implementation. #### Parameter @@ -235,23 +137,8 @@ The dApp must call the following two endpoints from the wallet services API to u 2. App developers are expected to Sign the `signatureRequest.hash` returned from `wallet_prepareCalls` call using the dApp key (secp256k1 or secp256r1) -3. dApps makes the `wallet_sendPreparedCalls` JSON RPC call to wallet service API. The RPC accepts the prepared response from `wallet_prepareCalls` request along with a signature, and returns an [EIP-5792](https://eip.tools/eip/5792) call bundle ID. - -## Examples dApp +3. dApps makes the `wallet_sendPreparedCalls` JSON RPC call. The RPC accepts the prepared response from `wallet_prepareCalls` request along with a signature, and returns an [EIP-5792](https://eip.tools/eip/5792) call bundle ID. - - - - -- Tic Tac Toe | [Demo](https://smart-sessions-demo.reown.com/demo/tictactoe) | [Video](https://x.com/cyberdrk/status/1830109996841054208) -- Dollar Cost Average | [Demo](https://smart-sessions-demo.reown.com/demo/dca) | [Explanation](https://x.com/lukaisailovic/status/1871571013319684274) | [Video](https://x.com/cyberdrk/status/1854148190842610124) -- [Github examples repository](https://github.com/reown-com/web-examples/tree/main/advanced/dapps/smart-sessions-demo) - -## Reference - -- ERC-7715: Grant Permissions from Wallets | https://eip.tools/eip/7715 -- EIP-5792: Wallet Call API | https://eip.tools/eip/5792 -- ERC-4337 Entry Point | https://github.com/ethereum/ercs/blob/master/ERCS/erc-4337.md#entrypoint-definition ## Currently supported Permission types @@ -289,3 +176,21 @@ The dApp must call the following two endpoints from the wallet services API to u } } ``` + +## Advance Examples + + + + + +- Tic Tac Toe | [Demo](https://smart-sessions-demo.reown.com/demo/tictactoe) | [Video](https://x.com/cyberdrk/status/1830109996841054208) +- Dollar cost average | [Demo](https://smart-sessions-demo.reown.com/demo/dca) | [Explanation](https://x.com/lukaisailovic/status/1871571013319684274) | [Video](https://x.com/cyberdrk/status/1854148190842610124) +- [Github examples repository](https://github.com/reown-com/web-examples/tree/main/advanced/dapps/smart-sessions-demo) +- [Simple example implementation](https://github.com/reown-com/appkit-web-examples/tree/main/react/react-wagmi-smart-session) + +## Reference + +- ERC-7715: Grant Permissions from Wallets | https://eip.tools/eip/7715 +- EIP-5792: Wallet Call API | https://eip.tools/eip/5792 +- ERC-4337 Entry Point | https://github.com/ethereum/ercs/blob/master/ERCS/erc-4337.md#entrypoint-definition + diff --git a/snippets/appkit/shared/socials.mdx b/snippets/appkit/shared/socials.mdx index 2d808efa9..703457d81 100644 --- a/snippets/appkit/shared/socials.mdx +++ b/snippets/appkit/shared/socials.mdx @@ -3,13 +3,12 @@ To allow users to authenticate using their email or social accounts, you need to -```ts +```ts {6-20} const modal = createAppKit({ adapters: [wagmiAdapter], projectId, networks: [mainnet, arbitrum], metadata, - /* highlight-add-start */ features: { email: true, // default to true socials: [ @@ -24,20 +23,18 @@ const modal = createAppKit({ emailShowWallets: true, // default to true }, allWallets: "SHOW", // default to SHOW - /* highlight-add-end */ }); ``` -```ts +```ts {6-20} const modal = createAppKit({ adapters: [wagmiAdapter], projectId, networks: [mainnet, arbitrum], metadata, - /* highlight-add-start */ features: { email: true, // default to true socials: [ @@ -52,7 +49,6 @@ const modal = createAppKit({ emailShowWallets: true, // default to true }, allWallets: "SHOW", // default to SHOW - /* highlight-add-end */ }); ``` @@ -65,13 +61,12 @@ AppKit with ethers v5 does not support the `auth` parameter and social logins. I -```ts +```ts {6-20} const modal = createAppKit({ adapters: [solanaWeb3JsAdapter], projectId, networks: [solana, solanaTestnet, solanaDevnet], metadata, - /*highlight-add-start*/ features: { email: true, // default to true socials: [ @@ -86,7 +81,6 @@ const modal = createAppKit({ emailShowWallets: true, // default to true }, allWallets: "SHOW", // default to SHOW - /*highlight-add-end*/ }); ``` diff --git a/snippets/appkit/shared/swaps.mdx b/snippets/appkit/shared/swaps.mdx index 8d4417b80..7df64aaa8 100644 --- a/snippets/appkit/shared/swaps.mdx +++ b/snippets/appkit/shared/swaps.mdx @@ -23,16 +23,14 @@ The Swaps feature is enabled by default, so no additional configuration is requi If you prefer to disable it, set the `swaps` flag to `false` in the configuration of the `createAppKit` function. -```ts +```ts {7} const modal = createAppKit({ adapters: [wagmiAdapter], projectId, networks: [mainnet, arbitrum], metadata: metadata, features: { - /* highlight-add-start */ swaps: false // Optional - true by default - /* highlight-add-end */ } }) ``` diff --git a/snippets/appkit/shared/theming.mdx b/snippets/appkit/shared/theming.mdx index 656bc8865..1d1120244 100644 --- a/snippets/appkit/shared/theming.mdx +++ b/snippets/appkit/shared/theming.mdx @@ -1,6 +1,4 @@ -The theme for the AppKit integration in your dApp can be fully customized. Below are some examples: - -- [**Wormfare**](https://dashboard.wormfare.com/purchase) +The theme for the AppKit integration in your dApp can be fully customized. ## ThemeMode diff --git a/snippets/appkit/vue/core/open.mdx b/snippets/appkit/vue/core/open.mdx index 29df150fc..4d82585a8 100644 --- a/snippets/appkit/vue/core/open.mdx +++ b/snippets/appkit/vue/core/open.mdx @@ -14,6 +14,16 @@ open({ view: "Connect", namespace: "bip122" }); // to connect and show only ethereum wallets open({ view: "Connect", namespace: "eip155" }); + +// to open swap with arguments +open({ + view: 'Swap', + arguments: { + amount: '321.123', + fromToken: 'USDC', + toToken: 'ETH' + } +}) ``` List of views you can select diff --git a/snippets/appkit/vue/solana/implementation.mdx b/snippets/appkit/vue/solana/implementation.mdx index ff801bc6d..bc6a405b1 100644 --- a/snippets/appkit/vue/solana/implementation.mdx +++ b/snippets/appkit/vue/solana/implementation.mdx @@ -3,10 +3,6 @@ In your `App.vue` file set up the following configuration. ```html diff --git a/snippets/appkit/vue/wagmi/about/implementation.mdx b/snippets/appkit/vue/wagmi/about/implementation.mdx index da75bbbd5..4713418b3 100644 --- a/snippets/appkit/vue/wagmi/about/implementation.mdx +++ b/snippets/appkit/vue/wagmi/about/implementation.mdx @@ -53,11 +53,9 @@ In your `App.vue` file set up the following configuration Reown AppKit use [Viem](https://viem.sh/) networks under the hood, which provide a wide variety of networks for EVM chains. You can find all the networks supported by Viem within the `@reown/appkit/networks` path. -```js +```js {2} import { createAppKit } from '@reown/appkit/vue' -/* highlight-add-start */ import { mainnet, arbitrum, base, scroll, polygon } from '@reown/appkit/networks' -/* highlight-add-end */ ``` diff --git a/snippets/walletkit/shared/chain-abstraction/error-handling.mdx b/snippets/walletkit/shared/chain-abstraction/error-handling.mdx new file mode 100644 index 000000000..3a87b8ec7 --- /dev/null +++ b/snippets/walletkit/shared/chain-abstraction/error-handling.mdx @@ -0,0 +1,29 @@ +## Error Handling + +When implementing Chain Abstraction, you may encounter different types of errors. Here's how to handle them effectively: + +### Application-Level Errors + +These errors (`PrepareError`) indicate specific issues that need to be addressed and typically require user action: + +- **Insufficient Gas Fees**: User needs to add more gas tokens to their wallet +- **Malformed Transaction Requests**: Transaction parameters are invalid or incomplete +- **Minimum Bridging Amount Not Met**: Currently set at $0.60 +- **Invalid Token or Network Selection**: Selected token or network is not supported + +When handling these errors, you should display clear, user-friendly error messages that provide specific guidance on how to resolve the issue. Allow users to modify their transaction parameters and consider implementing validation checks before initiating transactions. + +### Retryable Errors + +These errors (`Result::Err`) indicate temporary issues that may be resolved by retrying the operation. +Examples of these types of issues include network connection timeouts, TLS negotiation issues, service outages, or other transient errors. + +For retryable errors, show a generic "oops" message to users and provide a retry button. Log detailed error information to your error tracking service, but avoid displaying technical details to end users. + + +For errors in the `execute()` method, a retry may not resolve the issue. In such cases, allow users to cancel the transaction, return them to the application, and let the application initiate a new transaction. + + +### Critical Errors + +Critical errors indicate bugs or implementation issues that should be treated as high-priority incidents: incorrect usage of WalletKit API, wrong data encoding or wrong fields passed to WalletKit, or WalletKit internal bugs. diff --git a/snippets/walletkit/shared/chain-abstraction/intro.mdx b/snippets/walletkit/shared/chain-abstraction/intro.mdx new file mode 100644 index 000000000..e240884b2 --- /dev/null +++ b/snippets/walletkit/shared/chain-abstraction/intro.mdx @@ -0,0 +1,25 @@ + +💡 Chain Abstraction is in early access. + + +Chain Abstraction in WalletKit enables users with stablecoins on any network to spend them on-the-fly on a different network. Our Chain Abstraction solution provides a toolkit for wallet developers to integrate this complex functionality using WalletKit. + +For example, when an app requests a 100 USDC payment on Base network but the user only has USDC on Arbitrum, WalletKit offers methods to detect this mismatch, generate necessary transactions, track the cross-chain transfer, and complete the original transaction after bridging finishes. + +## How It Works + + +Apps need to pass `gas` as null, while sending a transaction to allow proper gas estimation by the wallet. Refer to this [guide](../../../appkit/next/early-access/chain-abstraction) for more details. + + +When sending a transaction, you need to: +1. Check if the required chain has enough funds to complete the transaction +2. If not, use the `prepare` method to generate necessary bridging transactions +3. Sign routing and initial transaction hashes, prepared by the prepare method +4. Use `execute` method to broadcast routing and initial transactions and wait for it to be completed + +The following sequence diagram illustrates the complete flow of a chain abstraction operation, from the initial dapp request to the final transaction confirmation + + + + \ No newline at end of file diff --git a/walletkit/android/chain-abstraction.mdx b/walletkit/android/chain-abstraction.mdx new file mode 100644 index 000000000..8bd54409c --- /dev/null +++ b/walletkit/android/chain-abstraction.mdx @@ -0,0 +1,141 @@ +--- +title: Chain Abstraction +--- + +import HowItWorks from "/snippets/walletkit/shared/chain-abstraction/intro.mdx"; +import ErrorHandling from "/snippets/walletkit/shared/chain-abstraction/error-handling.mdx"; + + + +## Methods + +The following methods from WalletKit are used in implementing chain abstraction. + + +💡 Chain abstraction is currently in the early access phase and requires the `@ChainAbstractionExperimentalApi` annotation. + + +### Prepare + +This method is used to check if chain abstraction is needed. If it is, it will return a `PrepareSuccess.Available` object with the necessary transactions and funding information. +If it is not, it will return a `PrepareSuccess.NotRequired` object with the original transaction. + + +Accounts field is a list of CAIP-20 accounts you are sourcing from e.g. Solana account + + +```kotlin +@ChainAbstractionExperimentalApi +fun prepare( + initialTransaction: Wallet.Model.InitialTransaction, + accounts: List, + onSuccess: (Wallet.Model.PrepareSuccess) -> Unit, + onError: (Wallet.Model.PrepareError) -> Unit +) +``` + +### Execute + +This method is used to execute the chain abstraction operation. It broadcasts the bridging and initial transactions and waits for them to be completed. +The method returns a `ExecuteSuccess` object with the transaction hash and receipt. + +```kotlin +@ChainAbstractionExperimentalApi +fun execute( + prepareAvailable: Wallet.Model.PrepareSuccess.Available, + prepareSignedTxs: List, + initSignedTx: String, + onSuccess: (Wallet.Model.ExecuteSuccess) -> Unit, + onError: (Wallet.Model.Error) -> Unit +) +``` + +## Usage + +When sending a transaction, first check if chain abstraction is needed using the `prepare` method. If it is needed, you must sign all the fulfillment transactions and use the `execute` method. + +If the operation is successful, use `execute` method and await the transaction hash and receipt. +If the operation is unsuccessful, send the JsonRpcError to the dapp and display the error to the user. + +```kotlin + val initialTransaction = Wallet.Model.Transaction(...) + WalletKit.ChainAbstraction.prepare( + initialTransaction, + caip10Accounts, + onSuccess = { prepareSuccess -> + when (prepareSuccess) { + is Wallet.Model.PrepareSuccess.Available -> { + // If the route is available, present a CA transaction flow + + //sign route transactions + transactionsDetails?.route?.forEach { route -> + route.transactionDetails.forEach { transactionDetails -> + val signedTransaction = Signer.signHash(transactionDetails.transactionHashToSign, EthAccountDelegate.privateKey) + eip155Signatures.add(signedTransaction) + } + } + } + + //sign initial transaction + val signedInitialTx = Signer.signHash(transactionsDetails?.initialDetails.transactionHashToSign, EthAccountDelegate.privateKey) + + //Call the execute + WalletKit.ChainAbstraction.execute(prepareSuccess, eip155Signatures, signedInitialTx + onSuccess = { + //The execution of the Chain Abstraction is successfull + //Send the response to the Dapp or show to the user + }, + onError = { + //Execute error - wallet should send the JsonRpcError to a dapp for given request and display error to the user + } + ) + } + + is Wallet.Model.PrepareSuccess.NotRequired -> { + // user does not need to move funds from other chains, sign and broadcast original transaction + } + } + }, + onError = { prepareError -> + // One of the possible errors: NoRoutesAvailable, InsufficientFunds, InsufficientGasFunds - wallet should send the JsonRpcError to a dapp for given request and display error to the user + } + ) +``` + +For example, check out implementation of chain abstraction in [sample wallet](https://github.com/WalletConnect/WalletConnectKotlinV2/tree/master/sample/wallet) with Kotlin. + + + +## Testing + +To test Chain Abstraction, you can use the [AppKit laboratory](https://appkit-lab.reown.com/library/wagmi/) and try sending any supported [tokens](../../../walletkit/features/early-access/chain-abstraction.mdx#what-are-the-supported-tokens-and-networks) with any chain abstraction supported wallet. +You can also use this [sample wallet](https://appdistribution.firebase.dev/i/076a3bc9669d3bee) for testing. + + + +## ProGuard rules + +If you encounter issues with minification, add the below rules to your application: + +``` +-keepattributes *Annotation* + +-keep class com.sun.jna.** { *; } +-keepclassmembers class com.sun.jna.** { + native ; + *; +} + +-keep class uniffi.** { *; } + +# Preserve all public and protected fields and methods +-keepclassmembers class ** { + public *; + protected *; +} + +-dontwarn uniffi.** +-dontwarn com.sun.jna.** +``` \ No newline at end of file diff --git a/walletkit/android/early-access/chain-abstraction.mdx b/walletkit/android/early-access/chain-abstraction.mdx deleted file mode 100644 index 8f6d0d01d..000000000 --- a/walletkit/android/early-access/chain-abstraction.mdx +++ /dev/null @@ -1,240 +0,0 @@ ---- -title: Chain Abstraction ---- - -Chain Abstraction in WalletKit enables users with stablecoins on any network to spend them on-the-fly on a different network. Our Chain Abstraction solution provides a toolkit for wallet developers to integrate this complex functionality using WalletKit. - -For example, when an app requests a 100 USDC payment on Base network but the user only has USDC on Arbitrum, WalletKit offers methods to detect this mismatch, generate necessary transactions, track the cross-chain transfer, and complete the original transaction after bridging finishes. - -## How It Works - - -Apps need to pass `gas` as null, while sending a transaction to allow proper gas estimation by the wallet. Refer to this [guide](../../../appkit/next/early-access/chain-abstraction) for more details. - - -When sending a transaction, you need to: -1. Check if the required chain has enough funds to complete the transaction -2. If not, use the `prepare` method to generate necessary bridging transactions -3. Sign routing and initial transaction hashes, prepared by the prepare method -4. Use `execute` method to broadcast routing and initial transactions and wait for it to be completed - -The following sequence diagram illustrates the complete flow of a chain abstraction operation, from the initial dapp request to the final transaction confirmation - - - - - -## Methods - -The following methods from WalletKit are used in implementing chain abstraction. - - -Chain abstraction is currently in an early access phase and requires the `@ChainAbstractionExperimentalApi` annotation. - - -### Prepare - -This method is used to check if chain abstraction is needed. If it is, it will return a `PrepareSuccess.Available` object with the necessary transactions and funding information. -If it is not, it will return a `PrepareSuccess.NotRequired` object with the original transaction. - -```kotlin -@ChainAbstractionExperimentalApi -fun prepare( - initialTransaction: Wallet.Model.InitialTransaction, - onSuccess: (Wallet.Model.PrepareSuccess) -> Unit, - onError: (Wallet.Model.PrepareError) -> Unit -) -``` - -### Execute - -This method is used to execute the chain abstraction operation. It broadcasts the bridging and initial transactions and waits for them to be completed. -The method returns a `ExecuteSuccess` object with the transaction hash and receipt. - -```kotlin -@ChainAbstractionExperimentalApi -fun execute( - prepareAvailable: Wallet.Model.PrepareSuccess.Available, - prepareSignedTxs: List, - initSignedTx: String, - onSuccess: (Wallet.Model.ExecuteSuccess) -> Unit, - onError: (Wallet.Model.Error) -> Unit -) -``` - -### Usage - -When sending a transaction, first check if chain abstraction is needed using the `prepare` method. If it is needed, you must sign all the fulfillment transactions and use the `execute` method. - -If the operation is successful, use `execute` method and await the transaction hash and receipt. -If the operation is unsuccessful, send the JsonRpcError to the dapp and display the error to the user. - -```kotlin - val initialTransaction = Wallet.Model.Transaction(...) - WalletKit.ChainAbstraction.prepare( - initialTransaction, - onSuccess = { prepareSuccess -> - when (prepareSuccess) { - is Wallet.Model.PrepareSuccess.Available -> { - //Sign all the fulfilment transactions and init transaction - //Use execute method - - //Call the execute - WalletKit.ChainAbstraction.execute(prepareSuccess, prepareSignedTxs, initSignedTx - onSuccess = { - //The execution of the Chain Abstraction is successfull - //Send the response to the Dapp - }, - onError = { - //Execute error - wallet should send the JsonRpcError to a dapp for given request and display error to the user - } - ) - } - - is Wallet.Model.PrepareSuccess.NotRequired -> { - //Chain abstraction is not required, handle transaction as usual - } - } - }, - onError = { prepareError -> - // One of the possible errors: NoRoutesAvailable, InsufficientFunds, InsufficientGasFunds - wallet should send the JsonRpcError to a dapp for given request and display error to the user - } - ) -``` - -For example, check out implementation of chain abstraction in [sample wallet](https://github.com/WalletConnect/WalletConnectKotlinV2/tree/master/sample/wallet) with Kotlin. - -## Testing - -To test Chain Abstraction, you can use the [AppKit laboratory](https://appkit-lab.reown.com/library/wagmi/) and try sending [USDC/USDT](../../../walletkit/features/early-access/chain-abstraction.mdx#what-are-the-supported-tokens-and-networks) with any chain abstraction supported wallet. -You can also use this [sample wallet](https://appdistribution.firebase.dev/i/076a3bc9669d3bee) for testing. - - - -## Types - -Following are the types that are used in the chain abstraction methods. - -```kotlin - data class Transaction( - var from: String, - var to: String, - var value: String, - var gasLimit: String, - var input: String, - var nonce: String, - var chainId: String -) - -data class InitialTransaction( - var from: String, - var to: String, - var value: String, - var input: String, - var chainId: String -) - -data class FeeEstimatedTransaction( - var from: String, - var to: String, - var value: String, - var gasLimit: String, - var input: String, - var nonce: String, - var maxFeePerGas: String, - var maxPriorityFeePerGas: String, - var chainId: String -) - -sealed class PrepareSuccess { - data class Available( - val orchestratorId: String, - val checkIn: Long, - val transactions: List, - val initialTransaction: Transaction, - val initialTransactionMetadata: InitialTransactionMetadata, - val funding: List, - val transactionsDetails: TransactionsDetails - ) : PrepareSuccess() - - data class NotRequired(val initialTransaction: Transaction) : PrepareSuccess() -} - -data class InitialTransactionMetadata( - var symbol: String, - var amount: String, - var decimals: Int, - var tokenContract: String, - var transferTo: String -) - -data class FundingMetadata( - var chainId: String, - var tokenContract: String, - var symbol: String, - var amount: String, - var bridgingFee: String, - var decimals: Int -) - -sealed class PrepareError : Model() { - data object NoRoutesAvailable : PrepareError() - data object InsufficientFunds : PrepareError() - data object InsufficientGasFunds : PrepareError() - data class Unknown(val message: String) : PrepareError() -} - -data class TransactionsDetails( - var details: List, - var initialDetails: TransactionDetails, - var bridgeFees: List, - var localBridgeTotal: Amount, - var localFulfilmentTotal: Amount, - var localTotal: Amount -) - -data class TransactionDetails( - var transaction: FeeEstimatedTransaction, - var transactionFee: TransactionFee -) - -data class TransactionFee( - var fee: Amount, - var localFee: Amount -) - -data class Amount( - var symbol: String, - var amount: String, - var unit: String, - var formatted: String, - var formattedAlt: String -) -``` - -## ProGuard rules - -If you encounter issues with minification, add the below rules to your application: - -``` --keepattributes *Annotation* - --keep class com.sun.jna.** { *; } --keepclassmembers class com.sun.jna.** { - native ; - *; -} - --keep class uniffi.** { *; } - -# Preserve all public and protected fields and methods --keepclassmembers class ** { - public *; - protected *; -} - --dontwarn uniffi.** --dontwarn com.sun.jna.** -``` \ No newline at end of file diff --git a/walletkit/android/eip5792.mdx b/walletkit/android/eip5792.mdx index 1af8964a3..f01925b19 100644 --- a/walletkit/android/eip5792.mdx +++ b/walletkit/android/eip5792.mdx @@ -5,7 +5,180 @@ title: Wallet Call API WalletConnect supports [EIP-5792](https://eips.ethereum.org/EIPS/eip-5792#atomicbatch-capability), which defines new JSON-RPC methods that enable apps to ask a wallet to process a batch of onchain write calls and to check on the status of those calls. Applications can specify that these onchain calls be executed taking advantage of specific capabilities previously expressed by the wallet; an additional, a novel wallet RPC is defined to enable apps to query the wallet for those capabilities. +## Methods + - `wallet_sendCalls`: Requests that a wallet submits a batch of calls. - `wallet_getCallsStatus`: Returns the status of a call batch that was sent via wallet_sendCalls. - `wallet_showCallsStatus`: Requests that a wallet shows information about a given call bundle that was sent with wallet_sendCalls. - `wallet_getCapabilities`: This RPC allows an application to request capabilities from a wallet (e.g. batch transactions, paymaster communication). + +## Usage + +### wallet_getCallsStatus Example + +To enhance the user experience and eliminate the need for app switching, wallets can delegate the Wallet Service to query call status from a bundler. This delegation is configured during session approval by specifying the Wallet Service URL in the scoped properties. + +When configured, the dApp will automatically route all subsequent `wallet_getCallsStatus` requests through the delegated wallet service to the designated bundler. + +To implement this functionality, use `WalletKit.buildWalletService(methods)` util method that specifies the wallet service URL withing the supported methods: + +```kotlin +val scopedProperties = mapOf("eip155" to WalletKit.buildWalletService(listOf("wallet_getCallsStatus"))) +WalletKit.approveSession(..., scopedProperties) +``` + +## Usage + +### wallet_getCallsStatus Example + +To enhance the user experience and eliminate the need for app switching, wallets can delegate the Wallet Service to query call status from a bundler. This delegation is configured during session approval by specifying the Wallet Service URL in the scoped properties. + +When configured, the dApp will automatically route all subsequent `wallet_getCallsStatus` requests through the delegated wallet service to the designated bundler. + +To implement this functionality, use `WalletKit.buildWalletService(methods)` util method that specifies the wallet service URL withing the supported methods: + +```kotlin +val scopedProperties = mapOf("eip155" to WalletKit.buildWalletService(listOf("wallet_getCallsStatus"))) +WalletKit.approveSession(..., scopedProperties) +``` + +### wallet_getCapabilities Example + +The `wallet_getCapabilities` method is used to request information about the capabilities supported by a wallet. In accordance with EIP-5792, here’s how it should be implemented: + +### Request +```json +{ + "id": 1, + "jsonrpc": "2.0", + "method": "wallet_getCapabilities", + "params": ["0xd46e8dd67c5d32be8058bb8eb970870f07244567", ["0x2105", "0x14A34"]] +} +``` + +### Response +The wallet should return a response compliant with EIP-5792, where capabilities are organized by chain ID: + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "0x2105": { + "atomic": { + "status": "supported" + } + }, + "0x14A34": { + "atomic": { + "status": "unsupported" + } + } + } +} +``` + +## Capabilities in CAIP-25 Connection Requests + +CAIP-25 defines how capabilities can be expressed in wallet-to-dapp connections. These capabilities control how methods like `wallet_sendCalls` behave. + +### Session Properties + +In a connection request, dApps can request capabilities through `sessionProperties`. These capabilities can be universal (applying to all chains) or chain-specific: + +```json +"sessionProperties": { + "expiry": "2022-12-24T17:07:31+00:00", + "caip154": { + "supported": "true" + }, + "flow-control": { + "loose": [], + "strict": [], + "exoticThirdThing": [] + }, + "atomic": { + "status": "supported" + } +} +``` + +### Scoped Properties + +For chain-specific capabilities, dapps use `scopedProperties`: + +```json +"scopedProperties": { + "eip155:8453": { + "paymasterService": { + "supported": true + }, + "sessionKeys": { + "supported": true + } + }, + "eip155:84532": { + "auxiliaryFunds": { + "supported": true + } + } +} +``` + +### Wallet Response + +The wallet’s response should specify the capabilities it supports, in accordance with EIP-5792 and CAIP-25: + +```json +"sessionProperties": { + "expiry": "2022-12-24T17:07:31+00:00", + "caip154": { + "supported": "true" + }, + "flow-control": { + "loose": ["halt", "continue"], + "strict": ["continue"] + }, + "atomic": { + "status": "ready" + } +}, +"scopedProperties": { + "eip155:1": { + "atomic": { + "status": "supported" + } + }, + "eip155:137": { + "atomic": { + "status": "unsupported" + } + }, + "eip155:84532": { + "eip155:83532:0x0910e12C68d02B561a34569E1367c9AAb42bd810": { + "auxiliaryFunds": { + "supported": false + }, + "atomic": { + "status": "supported" + } + } + } +} +``` +- Capabilities shared across all address in a namespace can be expressed at top-level +- Address-specific capabilities can include exceptions to scope-wide capabilities + +### Atomic Capability + +According to [EIP-5792](https://eips.ethereum.org/EIPS/eip-5792), the `atomic` capability specifies how the wallet handles batches of transactions. It has three possible values: + +- `supported` — The wallet executes calls atomically and contiguously. +- `ready` — The wallet can upgrade to support atomic execution, pending user approval. +- `unsupported` — The wallet provides no atomicity guarantees. + +This capability is expressed per chain and is crucial for determining how `wallet_sendCalls` with `atomicRequired: true` will be handled. + +## References +- EIP-5792: https://eips.ethereum.org/EIPS/eip-5792#atomicbatch-capability +- CAIP-25 namespaces: https://github.com/ChainAgnostic/namespaces/blob/main/eip155/caip25.md \ No newline at end of file diff --git a/walletkit/android/link-mode.mdx b/walletkit/android/link-mode.mdx index 8aeebba0d..9d09bb5c2 100644 --- a/walletkit/android/link-mode.mdx +++ b/walletkit/android/link-mode.mdx @@ -2,10 +2,14 @@ title: Link Mode --- -WalletKit Link Mode is a low latency mechanism for transporting One-Click Auth requests and session requests over Universal Links, reducing the need for a WebSocket connection with the Relay. This significantly enhances the user experience when connecting native dApps to native wallets by reducing the latency associated with network connections, especially when the user has an unstable internet connection. +WalletKit Link Mode is a low latency mechanism for transporting [One-Click Auth](/walletkit/android/one-click-auth) requests and session requests over Universal Links, reducing the need for a WebSocket connection with the Relay. This significantly enhances the user experience when connecting native dApps to native wallets by reducing the latency associated with network connections, especially when the user has an unstable internet connection. To support Link Mode add a universal link for your wallet in Cloud project configuration dashboard, configure your AppMetaData `appLink` with a valid universal link and set the `linkMode` property to `true`: + +Make sure that [1-Click Auth](/walletkit/android/one-click-auth) is implemented before enabling Link Mode. + + ```kotlin {3-4} val appMetaData = Core.Model.AppMetaData( ... diff --git a/walletkit/features/early-access/chain-abstraction.mdx b/walletkit/features/chain-abstraction.mdx similarity index 74% rename from walletkit/features/early-access/chain-abstraction.mdx rename to walletkit/features/chain-abstraction.mdx index 5a84564db..8390e94cf 100644 --- a/walletkit/features/early-access/chain-abstraction.mdx +++ b/walletkit/features/chain-abstraction.mdx @@ -37,17 +37,25 @@ The user does not have any USDC on Base, but their wallet seamlessly allows them ## Get Started - + Get started with WalletKit in Android. - + Get started with WalletKit in iOS. - + + Get started with WalletKit in Flutter. + + + Get started with WalletKit in React Native. + + + Get started with WalletKit in Web. + @@ -60,18 +68,20 @@ Chain Abstraction is available on the following networks: - Base - Arbitrum - OP Mainnet +- Solana ### What are the supported tokens and networks? -Chain Abstraction supports the following stablecoins across different networks: +Chain Abstraction supports the following tokens across different networks: -| Network | Supported tokens | +| Network | Assets | |-----------|-----------------| -| OP Mainnet | USDC, USDT | -| Base | USDC | -| Arbitrum | USDC | +| Optimism | USDC, USDT, ETH | +| Arbitrum | USDC, USDT, ETH | +| Base | USDC, USDS, ETH | +| Solana | USDC | ### What are the limitations? -We currently support 1:1 transfers i.e. sourcing funds from one address to another. Make sure that you're transferring minimum 0.6 [USDC/USDT](/walletkit/../walletkit/features/early-access/chain-abstraction.mdx#what-are-the-supported-tokens-and-networks) and have enough gas to pay bridging fees. +We currently support 1:1 transfers i.e. sourcing funds from one address to another. Make sure that you're transferring minimum 0.6$ worth of tokens(/walletkit/../walletkit/features/early-access/chain-abstraction.mdx#what-are-the-supported-tokens-and-networks) and have enough gas to pay bridging fees. diff --git a/walletkit/features/link-mode.mdx b/walletkit/features/link-mode.mdx new file mode 100644 index 000000000..479c1a499 --- /dev/null +++ b/walletkit/features/link-mode.mdx @@ -0,0 +1,39 @@ +--- +title: Link Mode +--- + +WalletKit Link Mode is a low latency mechanism for transporting One-Click Auth requests and session requests over Universal Links, reducing the need for a WebSocket connection with the Relay. This significantly enhances the user experience when connecting native dApps to native wallets by reducing the latency associated with network connections, especially when the user has an unstable internet connection. + + + + + +## When and How can Link Mode help? + +Let's assume that a user is trying to connect their wallet to a native (mobile) dApp while commuting on a train with spotty internet. + +Now, if the user wants to sign a message on the dApp using their mobile wallet and the dApp relies on typical WebSocket connections to relay the session request. Due to unstable connectivity, the connection drops or lags, causing the wallet to not receive the sign message request promptly. + +**Using Link Mode, the dApp sends a Universal Link directly to the wallet app.** Since this doesn’t rely on maintaining a WebSocket session, the wallet receives the connection or signature request instantly and reliably, even in weak network conditions. + +## Get Started + + + + Get started with Link Mode in WalletKit - Android. + + + Get started with Link Mode in WalletKit - iOS. + + + Get started with Link Mode in WalletKit - Flutter. + + + Get started with Link Mode in WalletKit - React Native. + + \ No newline at end of file diff --git a/walletkit/features/verify.mdx b/walletkit/features/verify.mdx index b3e98659c..e76a87a33 100644 --- a/walletkit/features/verify.mdx +++ b/walletkit/features/verify.mdx @@ -1,10 +1,15 @@ - --- title: Verify API sidebarTitle: Verify --- + App Verification is a first-of-its-kind layered security solution that enables wallets to help users protect themselves from phishing attacks, with robust architecture enabling wallets to support users in better identifying the veracity of a domain they are attempting to connect to. + + + + + ## Get Started diff --git a/walletkit/flutter/chain-abstraction.mdx b/walletkit/flutter/chain-abstraction.mdx new file mode 100644 index 000000000..6f0acc72b --- /dev/null +++ b/walletkit/flutter/chain-abstraction.mdx @@ -0,0 +1,244 @@ +--- +title: Chain Abstraction +--- + +import HowItWorks from "/snippets/walletkit/shared/chain-abstraction/intro.mdx"; +import ErrorHandling from "/snippets/walletkit/shared/chain-abstraction/error-handling.mdx"; + + + +## Methods + +The following methods from WalletKit are used in implementing chain abstraction. + + +💡 Chain abstraction is currently in the early access phase + + +### Prepare + +This method is used to check if chain abstraction is needed. If it is, it will return a `PrepareDetailedResponseSuccessCompat` object with the necessary transactions and funding information. +If it is not, it will return a `PrepareResponseNotRequiredCompat` object with the original transaction. + +```swift +Future prepare({ + required String chainId, + required String from, + required CallCompat call, + Currency? localCurrency, +}); +``` + +### Execute + +This method is used to execute the chain abstraction operation. The method will handle broadcasting all transactions in the correct order and monitor the cross-chain transfer process. It returns an `ExecuteDetails` object with the transaction status and results. + +```swift +Future execute({ + required UiFieldsCompat uiFields, + required List routeTxnSigs, + required String initialTxnSig, +}) +``` + +## Usage + +When sending a transaction, first check if chain abstraction is needed using the `prepare` method. Call the `execute` method to broadcast the routing and initial transactions and wait for it to be completed. + +If the operation is successful, you need to broadcast the initial transaction and await the transaction hash and receipt. +If the operation is not successful, send a JsonRpcError to the dapp and display the error to the user. + +```swift +final response = await _walletKit.prepare( + chainId: chainId, // selected chain id + from: from, // sender address + call: CallCompat( + to: to, // contract address + input: input, // calldata + ), +); +response.when( + success: (PrepareDetailedResponseSuccessCompat deatailResponse) { + deatailResponse.when( + available: (UiFieldsCompat uiFieldsCompat) { + // If the route is available, present a CA transaction UX flow and sign hashes when approved + final TxnDetailsCompat initial = uiFieldsCompat.initial; + final List route = uiFieldsCompat.route; + + final String initialSignature = signHashMethod(initial.transactionHashToSign); + final List routeSignatures = route.map((route) { + final String rSignature = signHashMethod(route.transactionHashToSign); + return rSignature; + }).toList(); + + await _walletKit.execute( + uiFields: uiFields, + initialTxnSig: initialSignature, + routeTxnSigs: routeSignatures, + ); + }, + notRequired: (PrepareResponseNotRequiredCompat notRequired) { + // user does not need to move funds from other chains + // proceeds as normal transaction with notRequired.initialTransaction + }, + ); + }, + error: (PrepareResponseError prepareError) { + // Show an error + // contains prepareError.error as BridgingError and could be either: + // noRoutesAvailable, insufficientFunds, insufficientGasFunds + }, +); +``` + +### Implementation during Session Request + +If you are looking to trigger Chain Abstraction during a eth_sendTransaction Session Request you should do it inside the session request handler as explained in [Responding to Session requests](../usage.mdx#responding-to-session-requests) section. + +```swift +Future _ethSendTransactionHandler(String topic, dynamic params) async { + final SessionRequest pendingRequest = _walletKit.pendingRequests.getAll().last; + final int requestId = pendingRequest.id; + final String chainId = pendingRequest.chainId; + + final transaction = (params as List).first as Map; + + // Intercept to check if Chain Abstraction is required + if (transaction.containsKey('input') || transaction.containsKey('data')) { + final inputData = transaction.containsKey('input') ?? transaction.containsKey('data'); + final response = await _walletKit.prepare( + chainId: chainId, + from: transaction['from'], + call: CallCompat( + to: transaction['to'], + input: inputData, + ), + ); + response.when( + success: (PrepareDetailedResponseSuccessCompat deatailResponse) { + deatailResponse.when( + available: (UiFieldsCompat uiFieldsCompat) { + // Only if the route is available, present a Chain Abstraction approval modal + // and proceed with execute() method + if (approved) { + final TxnDetailsCompat initial = uiFieldsCompat.initial; + final List route = uiFieldsCompat.route; + + final String initialSignature = signHashMethod(initial.transactionHashToSign); + final List routeSignatures = route.map((route) { + final String rSignature = signHashMethod(route.transactionHashToSign); + return rSignature; + }).toList(); + + final executeResponse = await _walletKit.execute( + uiFields: uiFields, + initialTxnSig: initialSignature, + routeTxnSigs: routeSignatures, + ); + + // Respond to the session request. Flow shouldn't end here as the transaction was processed + return await _walletKit.respondSessionRequest( + topic: topic, + response: JsonRpcResponse( + id: requestId, + jsonrpc: '2.0', + result: executeResponse.initialTxnReceipt, + ), + ); + } + }, + // If deatailResponse is not `available` type + // then let the flow to continue to regular send transacrion + ); + }, + ); + } + + // display a prompt for the user to approve or reject the request + // if approved + if (approved) { + final signedTx = await sendTransaction(transaction, int.parse(chainId)); + // respond to requester + await _walletKit.respondSessionRequest( + topic: topic, + response: JsonRpcResponse( + id: requestId, + jsonrpc: '2.0', + result: signedTx, + ), + ); + } + + // if rejected + return _walletKit.respondSessionRequest( + topic: topic, + response: JsonRpcResponse( + id: id, + jsonrpc: '2.0', + error: const JsonRpcError(code: 5001, message: 'User rejected method'), + ), + ); +} + +``` + +For example, check out implementation of chain abstraction in [sample wallet](https://github.com/reown-com/reown_flutter/blob/develop/packages/reown_walletkit/example/lib/dependencies/chain_services/evm_service.dart) with Flutter. + +### Token Balance + +You can use this method to query the token balance of the given address + +```swift +Future erc20TokenBalance({ + required String chainId, // chain id + required String token, // token address + required String owner, // user address +}) +``` + + ## Android + + In your android (project's) build.gradle file add support for Jitpack: + + ``` + allprojects { + repositories { + google() + mavenCentral() + maven { url 'https://jitpack.io' } // <- add jipack url + } + } + ``` + + It shouldn't happen but if you encounter issues with minification, add the below rules to your application: + + ``` + -keepattributes *Annotation* + -keep class com.sun.jna.** { *; } + -keepclassmembers class com.sun.jna.** { + native ; + *; + } + -keep class uniffi.** { *; } + # Preserve all public and protected fields and methods + -keepclassmembers class ** { + public *; + protected *; + } + -dontwarn uniffi.** + -dontwarn com.sun.jna.** + ``` + + + +## Testing + +Best way to test Chain Abstraction is to use our Sample wallet. +- [Sample Wallet for iOS](https://testflight.apple.com/join/Uv0XoBuD) +- [Sample Wallet for Android](https://appdistribution.firebase.dev/i/2b8b3dce9e2831cd) + +You can also use the [AppKit laboratory](https://appkit-lab.reown.com/library/wagmi/) and try sending [USDC/USDT](../../../walletkit/features/early-access/chain-abstraction.mdx#what-are-the-supported-tokens-and-networks) with any chain abstraction-supported wallet. + + diff --git a/walletkit/flutter/eip5792.mdx b/walletkit/flutter/eip5792.mdx index 1af8964a3..13163f0f8 100644 --- a/walletkit/flutter/eip5792.mdx +++ b/walletkit/flutter/eip5792.mdx @@ -9,3 +9,165 @@ Applications can specify that these onchain calls be executed taking advantage o - `wallet_getCallsStatus`: Returns the status of a call batch that was sent via wallet_sendCalls. - `wallet_showCallsStatus`: Requests that a wallet shows information about a given call bundle that was sent with wallet_sendCalls. - `wallet_getCapabilities`: This RPC allows an application to request capabilities from a wallet (e.g. batch transactions, paymaster communication). + +## Usage + +### wallet_getCallsStatus Example + +To enhance the user experience and eliminate the need for app switching, wallets can delegate the Wallet Service to query call status from a bundler. This delegation is configured during session approval by specifying the Wallet Service URL in the scoped properties. + +When configured, the dApp will automatically route all subsequent `wallet_getCallsStatus` requests through the delegated wallet service to the designated bundler. + +To implement this functionality, specify the `scopedProperties` when approving a session: + +```json +"scopedProperties": { + "eip155": { + "walletService": [{ + "url": "", + "methods": ["wallet_getCallsStatus"] + }] + } +} +``` + +### wallet_getCapabilities Example + +The `wallet_getCapabilities` method is used to request information about what capabilities a wallet supports. Following EIP-5792, here's how it should be implemented: + +### Request +```json +{ + "id": 1, + "jsonrpc": "2.0", + "method": "wallet_getCapabilities", + "params": ["0xd46e8dd67c5d32be8058bb8eb970870f07244567", ["0x2105", "0x14A34"]] +} +``` + +### Response +The wallet should return a response following EIP-5792, where capabilities are organized by chain ID: + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": { + "0x2105": { + "atomic": { + "status": "supported" + } + }, + "0x14A34": { + "atomic": { + "status": "unsupported" + } + } + } +} +``` + +## Capabilities in CAIP-25 Connection Requests + +CAIP-25 defines how capabilities can be expressed in wallet-to-dapp connections. These capabilities control how methods like `wallet_sendCalls` behave. + +### Session Properties + +In a connection request, dapps can request capabilities via `sessionProperties`. These can be universal (across all chains) or chain-specific: + +```json +"sessionProperties": { + "expiry": "2022-12-24T17:07:31+00:00", + "caip154": { + "supported": "true" + }, + "flow-control": { + "loose": [], + "strict": [], + "exoticThirdThing": [] + }, + "atomic": { + "status": "supported" + } +} +``` + +### Scoped Properties + +For chain-specific capabilities, dapps use `scopedProperties`: + +```json +"scopedProperties": { + "eip155:8453": { + "paymasterService": { + "supported": true + }, + "sessionKeys": { + "supported": true + } + }, + "eip155:84532": { + "auxiliaryFunds": { + "supported": true + } + } +} +``` + +### Wallet Response + +A wallet's response should indicate which capabilities it actually supports, following EIP-5792 and CAIP-25: + +```json +"sessionProperties": { + "expiry": "2022-12-24T17:07:31+00:00", + "caip154": { + "supported": "true" + }, + "flow-control": { + "loose": ["halt", "continue"], + "strict": ["continue"] + }, + "atomic": { + "status": "ready" + } +}, +"scopedProperties": { + "eip155:1": { + "atomic": { + "status": "supported" + } + }, + "eip155:137": { + "atomic": { + "status": "unsupported" + } + }, + "eip155:84532": { + "eip155:83532:0x0910e12C68d02B561a34569E1367c9AAb42bd810": { + "auxiliaryFunds": { + "supported": false + }, + "atomic": { + "status": "supported" + } + } + } +} +``` +- Capabilities shared across all address in a namespace can be expressed at top-level +- Address-specific capabilities can include exceptions to scope-wide capabilities + +### Atomic Capability + +According to EIP-5792, the `atomic` capability specifies how the wallet will execute batches of transactions. It has three possible values: + +- `supported` - The wallet will execute calls atomically and contiguously +- `ready` - The wallet can upgrade to support atomic execution pending user approval +- `unsupported` - The wallet provides no atomicity guarantees + +This capability is expressed per chain and is crucial for determining how `wallet_sendCalls` with `atomicRequired: true` will be handled. + +## References +- EIP-5792: https://eips.ethereum.org/EIPS/eip-5792#atomicbatch-capability +- CAIP-25 namespaces: https://github.com/ChainAgnostic/namespaces/blob/main/eip155/caip25.md \ No newline at end of file diff --git a/walletkit/flutter/link-mode.mdx b/walletkit/flutter/link-mode.mdx index 40a8e9c5a..5732f0296 100644 --- a/walletkit/flutter/link-mode.mdx +++ b/walletkit/flutter/link-mode.mdx @@ -2,10 +2,14 @@ title: Link Mode --- -WalletKit Link Mode is a low latency mechanism for transporting One-Click Auth requests and session requests over Universal Links, reducing the need for a WebSocket connection with the Relay. This significantly enhances the user experience when connecting native dApps to native wallets by reducing the latency associated with network connections, especially when the user has an unstable internet connection. +WalletKit Link Mode is a low latency mechanism for transporting [One-Click Auth](/walletkit/flutter/one-click-auth) requests and session requests over Universal Links, reducing the need for a WebSocket connection with the Relay. This significantly enhances the user experience when connecting native dApps to native wallets by reducing the latency associated with network connections, especially when the user has an unstable internet connection. By enabling it, the wallet and dapp will communicate through declared Universal Links on iOS and/or App Links on Android **even without an internet connection.** + +Make sure that [One-Click Auth](/walletkit/flutter/one-click-auth) is implemented before enabling Link Mode. + + ### How to enable it: 1. Add a Universal Link for your wallet in the **Explorer** tab of your [**Cloud project configuration**](https://cloud.reown.com/sign-in), under the **Mobile Linking** section @@ -14,7 +18,7 @@ By enabling it, the wallet and dapp will communicate through declared Universal 3. Set the `linkMode` property to `true`: -```javascript +```javascript {12,13} final _walletKit = ReownWalletKit( core: ReownCore( projectId: '{YOUR_PROJECT_ID}', @@ -26,10 +30,8 @@ final _walletKit = ReownWalletKit( icons: ['https://example.com/logo.png'], redirect: Redirect( native: 'examplewallet://', - /* highlight-add-start */ universal: 'https://example.com/wallet', linkMode: true, - /* highlight-add-end */ ), ), ); diff --git a/walletkit/flutter/usage.mdx b/walletkit/flutter/usage.mdx index 66b7555ef..6b560531e 100644 --- a/walletkit/flutter/usage.mdx +++ b/walletkit/flutter/usage.mdx @@ -61,19 +61,64 @@ A session is a connection between a dapp and a wallet. It is established when a ### Namespace Builder -On flutter you don't need to worry about Namespace Builder as Flutter SDK would handle that for you and generate a namespace object with the supported ones. +On flutter you don't need to worry about Namespace Builder as Flutter SDK would handle that for you and generate a namespace object with the supported ones for you to approve. -All you have to do is make sure you are registering +All you have to do is make sure you register... -1. **events emitters** with `_walletKit.registerEventEmitter()` for events you want to support on your wallet -2. **request handlers** with `_walletKit.registerRequestHandler()` for methods you want to support on your wallet -3. **wallet's accounts** with `_walletKit.registerAccount()` for accounts you want these events and methods to be enabled on +1. **wallet's accounts** with `_walletKit.registerAccount()` for accounts you want events and methods to be enabled on. This is essential if you want to properly form a session object between your wallet and the requester dapp. +2. **request handlers** with `_walletKit.registerRequestHandler()` for methods you want to support on your wallet. Optional but **highly recommended** if you want to seamlessly create a session object, as we will see in the coming section. +3. **events emitters** with `_walletKit.registerEventEmitter()` for events you want to support on your wallet. Optional but recommended if you plan to send events such as `chainChanged` and `accountsChanged`. -for every **chain** you want to support. +And you'll have to do this **for every chain** you want to support on your wallet. -When a dApp propose a session, with declared required and/or optional namespaces, your wallet will be able to approve an **already generated set of namespaces** based on your registered events, methods and accounts. +```dart +// Quick example: -You can access this object in **SessionProposalEvent** during `onSessionProposal` event by querying `event.params.generatedNamespaces`. (See next section) +List supportedChains = ['eip155:1', 'eip155:10', ...]; +List walletAddresses = ['0x1234......']; +List supportedEvents = ['chainChanged', 'accountsChanged', ...]; + +Map get _methodHandlers => { + 'personal_sign': personalSignHandler, + 'eth_sendTransaction': ethSendTransactionHandler, +}; + +for (final chainId in supportedChains) { + for (var address in walletAddresses) { + _walletKit!.registerAccount( + chainId: chainId, // CAIP-2 format chain id + accountAddress: address, // 0x.... address + ); + } + + for (var handler in _methodHandlers.entries) { + _walletKit.registerRequestHandler( + chainId: chainId, + method: handler.key, + handler: handler.value, + ); + } + + for (final event in supportedEvents) { + _walletKit.registerEventEmitter( + chainId: chainId, + event: event, + ); + } +} +``` + +When a dApp propose a session, with declared namespaces, your wallet will be able to approve an **already generated set of namespaces** based on your registered accounts, methods and events. + +You can access this object in **SessionProposalEvent** during `onSessionProposal` event by querying `event.params.generatedNamespaces`. (See [Session Approval](#session-approval) below) + + +You can choose **not to use** `registerRequestHandler` to configure your supported methods and rather define them during session approval (See [Session Approval](#session-approval) below) + +By not using `registerRequestHandler` your methods requests are going to be sent through `onSessionRequest` event subscription. + +If you do choose to use `registerRequestHandler` **(highly recommended)** then `onSessionRequest` event subscription is not going to be called. + Flutter SDK provides a handy `MethodsConstants` and `EventsConstants` for already defined set of required and optional values. @@ -121,12 +166,7 @@ In @walletconnect/ethereum-provider, (our abstracted EVM SDK for apps) we suppor As mentioned before, the `SessionProposalEvent` is emitted when a dapp initiates a new session with your wallet. The event object will include the information about the dapp and requested namespaces. The wallet should display a prompt for the user to approve or reject the session. -To approve a session, call `approveSession()` and pass in the `event.id` and your approved namespaces. - -- If you decide to use the `registerRequestHandler()` method to register handlers for supported methods, as explained in previous section, you would use the `generatedNamespaces` object in the `approveSession` -- If you decide to handle session requests by subscribing to the `onSessionRequest` event, you would need to pass your own set of approved namespaces. - -Either way you decide you would subscribe to the `onSessionProposal` event and use `approveSession()` as follows: +To approve a session, subscribe to `onSessionProposal` event and call `approveSession()` passing in the `event.id` and the namespaces object. ```javascript _walletKit.onSessionProposal.subscribe((SessionProposalEvent? event) { @@ -135,11 +175,15 @@ _walletKit.onSessionProposal.subscribe((SessionProposalEvent? event) { // If approved _walletKit.approveSession( id: event.id, - namespaces: // event.params.generatedNamespaces! or approvedNamespaces, + namespaces: event.params.generatedNamespaces ?? {}, ); }); ``` + +As mentioned before, `namespaces:` should be either `event.params.generatedNamespaces!` if you decided to use `registerRequestHandler` method to configure your supported methods or a `Map` object defined by yourself if you decided **not** to use `registerRequestHandler` method + + #### Pairing The `pair` method initiates a pairing process with a dapp using the given `uri` (QR code from the dapps). To learn more about pairing, checkout out the [docs](https://specs.walletconnect.com/2.0/specs/clients/core/pairing/). @@ -172,9 +216,9 @@ _walletKit.onSessionProposal.subscribe((SessionProposalEvent? event) async { ### Responding to Session requests -To handle a session request, such as `personal_sign`, you have two ways and they are mutually exclusive, so, you use either one way or the other: +To handle a session request, such as `personal_sign`, you have two ways as explained before, and they are mutually exclusive, so, either you use onSessionRequest event subscription or your methods handlers configured with `registerRequestHandler`. -1. Default one is to register a request handler for the methods and chains you want to support. So let's say your wallet supports `eip155:1` and `eip155:137`. This would translate to: +1. The **recommended one** is to register a request handler for the methods and chains you want to support. So let's say your wallet supports `eip155:1` and `eip155:137`. This would translate to: ```javascript final supportedChains = ['eip155:1', 'eip155:137']; @@ -182,6 +226,7 @@ Map supportedMethods = { 'personal_sign': _personalSignHandler, 'eth_sendTransaction': _ethSendTransactionHandler, }; +// Register your handlers as stated in Namespace Builder section for (var chainId in supportedChains) { for (var method in supportedMethods.entries) { _walletKit.registerRequestHandler( @@ -193,7 +238,8 @@ for (var chainId in supportedChains) { } Future _personalSignHandler(String topic, dynamic params) async { - final id = _walletKit.pendingRequests.getAll().first; + final SessionRequest pendingRequest = _walletKit.pendingRequests.getAll().last; + final int requestId = pendingRequest.id; // message should arrive encoded final decoded = hex.decode(params.first.substring(2)); @@ -203,17 +249,18 @@ Future _personalSignHandler(String topic, dynamic params) async { // if approved if (approved) { // Your code to sign the message here - final signature = ... + final signature = await signMessage(message); return _walletKit.respondSessionRequest( topic: topic, response: JsonRpcResponse( - id: id, + id: requestId, jsonrpc: '2.0', result: signature, ), ); } + // if rejected return _walletKit.respondSessionRequest( topic: topic, @@ -226,13 +273,40 @@ Future _personalSignHandler(String topic, dynamic params) async { } Future _ethSendTransactionHandler(String topic, dynamic params) async { - // ... + final SessionRequest pendingRequest = _walletKit.pendingRequests.getAll().last; + final int requestId = pendingRequest.id; + final String chainId = pendingRequest.chainId; + + final transaction = (params as List).first as Map; + + // display a prompt for the user to approve or reject the request + // if approved + if (approved) { + final signedTx = await sendTransaction(transaction, int.parse(chainId)); + // respond to requester + await _walletKit.respondSessionRequest( + topic: topic, + response: JsonRpcResponse( + id: requestId, + jsonrpc: '2.0', + result: signedTx, + ), + ); + } + + // if rejected + return _walletKit.respondSessionRequest( + topic: topic, + response: JsonRpcResponse( + id: id, + jsonrpc: '2.0', + error: const JsonRpcError(code: 5001, message: 'User rejected method'), + ), + ); } ``` -Once you have your handlers registered, these are going to be triggered _INSTEAD OF_ the `onSessionRequest` event. - -2. The other way is subscribing to onSessionRequest events and handle the request based on the method that is firing the event +2. The other way is subscribing to `onSessionRequest` events (if you didn't use `generatedNamespaces` object) and handle the request based on the method that is firing the event. ```javascript _walletKit.onSessionRequest.subscribe(_onSessionRequest); @@ -277,9 +351,13 @@ void _onSessionRequest(SessionRequestEvent? event) async { } ``` + +Remember that if you have handlers registered these are going to be triggered **instead of** the `onSessionRequest` event. + + ### Updating a Session -If you wish to include new accounts or chains or methods in an existing session, `updateSession` allows you to do so. +If you wish to include new accounts, chains or methods in an existing session, `updateSession` allows you to do so. You need pass in the `topic` and a new `Namespaces` object that contains all of the existing namespaces as well as the new data you wish to include. After you update the session, the dapp connected to your wallet will receive a `SessionUpdate` event. @@ -319,7 +397,7 @@ await _walletKit.core.pairing.disconnect( #### Supporting session events -In order to support session events, such as `chainChanged` or `accountChanged`, you would have to to register an event emitter for such events, for every chain you want to emit an event for (similar to request handlers). +In order to support session events, such as `chainChanged` or `accountChanged`, you would have to register an event emitter for such events, for every chain you want to emit an event for (similar to request handlers). ```javascript final supportedChains = ['eip155:1', 'eip155:137']; diff --git a/walletkit/ios/early-access/chain-abstraction.mdx b/walletkit/ios/chain-abstraction.mdx similarity index 64% rename from walletkit/ios/early-access/chain-abstraction.mdx rename to walletkit/ios/chain-abstraction.mdx index ec78b6bd9..76adf5ae7 100644 --- a/walletkit/ios/early-access/chain-abstraction.mdx +++ b/walletkit/ios/chain-abstraction.mdx @@ -2,34 +2,17 @@ title: Chain Abstraction --- -Chain Abstraction in WalletKit enables users with stablecoins on any network to spend them on-the-fly on a different network. Our Chain Abstraction solution provides a toolkit for wallet developers to integrate this complex functionality using WalletKit. +import HowItWorks from "/snippets/walletkit/shared/chain-abstraction/intro.mdx"; +import ErrorHandling from "/snippets/walletkit/shared/chain-abstraction/error-handling.mdx"; -For example, when an app requests a 100 USDC payment on Base network but the user only has USDC on Arbitrum, WalletKit offers methods to detect this mismatch, generate necessary transactions, track the cross-chain transfer, and complete the original transaction after bridging finishes. - -## How It Works - - -Apps need to pass `gas` as null, while sending a transaction to allow proper gas estimation by the wallet. Refer to this [guide](../../../appkit/next/early-access/chain-abstraction) for more details. - - -When sending a transaction, you need to: -1. Check if the required chain has enough funds to complete the transaction -2. If not, use the `prepare` method to generate necessary bridging transactions -3. Sign routing and initial transaction hashes, prepared by the prepare method -4. Invoke `execute` method to broadcast routing and initial transactions and wait for it to be completed - -The following sequence diagram illustrates the complete flow of a chain abstraction operation, from the initial dapp request to the final transaction confirmation - - - - + ## Methods -Following are the methods from WalletKit that you will use in implementing chain abstraction. +The following methods from WalletKit are used in implementing chain abstraction. -💡 Chain abstraction is currently in the early access phase +💡 Chain abstraction is currently in the early access phase, use with careful ### Prepare @@ -93,15 +76,16 @@ case .success(let routeResponse): case .error(let routeResponseError): // Show an error } - ``` For example, check out implementation of chain abstraction in [sample wallet](https://github.com/reown-com/reown-swift/blob/develop/Example/WalletApp/PresentationLayer/Wallet/CATransactionModal/CATransactionPresenter.swift) with Swift. + + ## Testing Best way to test Chain Abstraction is to use [sample wallet](https://testflight.apple.com/join/09bTAryp). -You can also use the [AppKit laboratory](https://appkit-lab.reown.com/library/wagmi/) and try sending [USDC/USDT](../../../walletkit/features/early-access/chain-abstraction.mdx#what-are-the-supported-tokens-and-networks) with any chain abstraction-supported wallet. +You can also use the [AppKit laboratory](https://appkit-lab.reown.com/library/wagmi/) and try sending any supported [tokens](../../../walletkit/features/early-access/chain-abstraction.mdx#what-are-the-supported-tokens-and-networks) with any chain abstraction-supported wallet.