diff --git a/docs/build/basics/fees.md b/docs/build/basics/fees.md index 8cd11713e3..9e79cff333 100644 --- a/docs/build/basics/fees.md +++ b/docs/build/basics/fees.md @@ -328,7 +328,7 @@ access(all) fun add(_ a: Int, _ b: Int): Int { **Avoid excessive load and save operations** -Avoid costly loading and storage operations and [borrow references](https://cadence-lang.org/docs/1.0/design-patterns#avoid-excessive-load-and-save-storage-operations-prefer-in-place-mutations) where possible, for example: +Avoid costly loading and storage operations and [borrow references](https://cadence-lang.org/docs/design-patterns#avoid-excessive-load-and-save-storage-operations-prefer-in-place-mutations) where possible, for example: ```cadence transaction { diff --git a/docs/build/core-contracts/02-fungible-token.md b/docs/build/core-contracts/02-fungible-token.md index 6ba79b4c01..906b866f9c 100644 --- a/docs/build/core-contracts/02-fungible-token.md +++ b/docs/build/core-contracts/02-fungible-token.md @@ -6,7 +6,7 @@ sidebar_label: Fungible Token The `FungibleToken` contract implements the Fungible Token Standard. It is the second contract ever deployed on Flow. -- [Basic Fungible Token Tutorial](https://cadence-lang.org/docs/1.0/tutorial/fungible-tokens) +- [Basic Fungible Token Tutorial](https://cadence-lang.org/docs/tutorial/fungible-tokens) - [Fungible Token Guide](../guides/fungible-token.md) - [Fungible Token Standard Repo](https://github.com/onflow/flow-ft) diff --git a/docs/build/core-contracts/08-non-fungible-token.md b/docs/build/core-contracts/08-non-fungible-token.md index 9e5e974d32..b922506cab 100644 --- a/docs/build/core-contracts/08-non-fungible-token.md +++ b/docs/build/core-contracts/08-non-fungible-token.md @@ -7,7 +7,7 @@ sidebar_label: Non-Fungible Token The `NonFungibleToken` contract interface implements the Fungible Token Standard. All NFT contracts are encouraged to import and implement this standard. -- [Basic Non-Fungible Token Tutorial](https://cadence-lang.org/docs/1.0/tutorial/non-fungible-tokens-1) +- [Basic Non-Fungible Token Tutorial](https://cadence-lang.org/docs/tutorial/non-fungible-tokens-1) - [Non Fungible Token Guide](../guides/nft.md) - [Non Fungible Token Standard Repo](https://github.com/onflow/flow-nft) diff --git a/docs/build/differences-vs-evm/index.md b/docs/build/differences-vs-evm/index.md index 2dbf432b83..914642e917 100644 --- a/docs/build/differences-vs-evm/index.md +++ b/docs/build/differences-vs-evm/index.md @@ -185,7 +185,6 @@ If you're already familiar with blockchain development, here's a comparison betw - [Testing Smart Contracts](https://ethereum.org/en/developers/docs/smart-contracts/testing/) - [Cadence testing framework](https://cadence-lang.org/docs/testing-framework) enables native tests in Cadence. - [overflow](https://github.com/bjartek/overflow) for testing in Go. - - [js-testing](https://github.com/onflow/flow-js-testing) for testing in JS. @@ -200,7 +199,7 @@ If you're already familiar with blockchain development, here's a comparison betw [Cadence]: https://cadence-lang.org/ [Resources]: https://cadence-lang.org/docs/language/resources [Capability-based Security]: https://en.wikipedia.org/wiki/Capability-based_security -[Entitlements]: https://cadence-lang.org/docs/1.0/language/access-control#entitlements +[Entitlements]: https://cadence-lang.org/docs/language/access-control#entitlements [Capability-based Access Control]: https://cadence-lang.org/docs/language/capabilities [Guide for Solidity Developers]: https://cadence-lang.org/docs/solidity-to-cadence [The Cadence tutorial]: https://cadence-lang.org/docs/tutorial/first-steps @@ -209,4 +208,4 @@ If you're already familiar with blockchain development, here's a comparison betw [Scripts]: ../basics/scripts.md [Transactions]: https://cadence-lang.org/docs/language/transactions [Flow Primer]: https://flow.com/primer#primer-how-flow-works -[via an API]: ../../networks/flow-networks/index.md \ No newline at end of file +[via an API]: ../../networks/flow-networks/index.md diff --git a/docs/build/guides/account-linking/index.md b/docs/build/guides/account-linking/index.md index c32fa2380d..9e48793fd1 100644 --- a/docs/build/guides/account-linking/index.md +++ b/docs/build/guides/account-linking/index.md @@ -11,7 +11,7 @@ order to understand how we can achieve that we must first understand how account Accounts on flow can be accessed in Cadence through two types, `PublicAccount` and `Account`. As the name implies the `PublicAccount` type gives access to all public account information such as address, balance, storage capacity, etc., but doesn't allow changes to the account. The `Account` type (or more specifically, an -[entitled](https://cadence-lang.org/docs/1.0/language/access-control#entitlements) `&Account`) allows the same access as +[entitled](https://cadence-lang.org/docs/language/access-control#entitlements) `&Account`) allows the same access as `PublicAccount` but also allows changes to the account, including adding/revoking account keys, managing the deployed contracts, as well as linking and publishing Capabilities. diff --git a/docs/build/guides/fungible-token.md b/docs/build/guides/fungible-token.md index 82da4605af..162819ec0a 100644 --- a/docs/build/guides/fungible-token.md +++ b/docs/build/guides/fungible-token.md @@ -23,8 +23,8 @@ Resources are objects in Cadence that store data, but have special restrictions about how they can be stored and transferred, making them perfect for representing digital objects with real value. -You can learn more about resources in the Cadence [documentation](https://cadence-lang.org/docs/1.0/language/resources) -and [tutorials](https://cadence-lang.org/docs/1.0/tutorial/resources). +You can learn more about resources in the Cadence [documentation](https://cadence-lang.org/docs/language/resources) +and [tutorials](https://cadence-lang.org/docs/tutorial/resources). For fungible tokens specifically, tokens are represented by a resource type called a `Vault`: @@ -277,7 +277,7 @@ access(all) contract FooToken: FungibleToken { As you can see, this function has an `access(FungibleToken.Withdraw)` access modifier. This is an example of entitlements in Cadence. -[Entitlements](https://cadence-lang.org/docs/1.0/language/access-control#entitlements) +[Entitlements](https://cadence-lang.org/docs/language/access-control#entitlements) are a way for developers to restrict access to privileged fields and functions in a composite type like a resource when a reference is created for it. In this example, the `withdraw()` function is always accessible to code that @@ -294,15 +294,15 @@ defined by the FungibleToken contract: Entitlements are important to understand because they are what protects privileged functionality in your resource objects from being accessed by third-parties. -It is recommended to read the [entitlements documentation](https://cadence-lang.org/docs/1.0/language/access-control#entitlements) +It is recommended to read the [entitlements documentation](https://cadence-lang.org/docs/language/access-control#entitlements) to understand how to use the feature properly. -[References](https://cadence-lang.org/docs/1.0/language/references) can be freely up-casted and down-casted in Cadence, so it is important +[References](https://cadence-lang.org/docs/language/references) can be freely up-casted and down-casted in Cadence, so it is important for privileged functionality to be protected by an entitlement so that it can only be accessed if it is authorized. In addition to withdrawing, the vault also needs a way to deposit. -We'll [typecast](https://cadence-lang.org/docs/1.0/language/operators#casting-operators) +We'll [typecast](https://cadence-lang.org/docs/language/operators#casting-operators) to make sure we are dealing with the correct token, update the vault balance, and destroy the vault. Add this code to your resource: diff --git a/docs/build/guides/nft.md b/docs/build/guides/nft.md index 83665d70bc..79b7e33d67 100644 --- a/docs/build/guides/nft.md +++ b/docs/build/guides/nft.md @@ -366,7 +366,7 @@ access(all) resource Collection: NonFungibleToken.Collection { As you can see, this function has an `access(NonFungibleToken.Withdraw)` access modifier. This is an example of entitlements in Cadence. -[Entitlements](https://cadence-lang.org/docs/1.0/language/access-control#entitlements) +[Entitlements](https://cadence-lang.org/docs/language/access-control#entitlements) are a way for developers to restrict access to privileged fields and functions in a composite type like a resource when a reference is created for it. In this example, the `withdraw()` function is always accessible to code that @@ -383,10 +383,10 @@ defined by the `NonFungibleToken` contract: Entitlements are important to understand because they are what protects privileged functionality in your resource objects from being accessed by third-parties. -It is recommended to read the [entitlements documentation](https://cadence-lang.org/docs/1.0/language/access-control#entitlements) +It is recommended to read the [entitlements documentation](https://cadence-lang.org/docs/language/access-control#entitlements) to understand how to use the feature properly. -[References](https://cadence-lang.org/docs/1.0/language/references) can be freely up-casted and down-casted in Cadence, so it is important +[References](https://cadence-lang.org/docs/language/references) can be freely up-casted and down-casted in Cadence, so it is important for privileged functionality to be protected by an entitlement so that it can only be accessed if it is authorized. diff --git a/docs/build/smart-contracts/best-practices/project-development-tips.md b/docs/build/smart-contracts/best-practices/project-development-tips.md index 28fa5306ba..9bfe9445fe 100644 --- a/docs/build/smart-contracts/best-practices/project-development-tips.md +++ b/docs/build/smart-contracts/best-practices/project-development-tips.md @@ -173,7 +173,6 @@ which are noteworthy to mention for a typical smart contract project. Popular testing frameworks to use for cadence are listed here: - Cadence: [Cadence Testing Framework](../../smart-contracts/testing.md) -- Javascript: [Flow JS Testing](../../../tools/flow-js-testing/index.md) - Go: [Overflow](https://github.com/bjartek/overflow) The same person who writes the code should also write the tests. @@ -284,8 +283,8 @@ It also helps the owner to promote the project and themselves. Resources for Best Practices: -- [cadence/design-pattern](https://cadence-lang.org/docs/1.0/design-patterns) -- [cadence/anti-patterns](https://cadence-lang.org/docs/1.0/anti-patterns) +- [cadence/design-pattern](https://cadence-lang.org/docs/design-patterns) +- [cadence/anti-patterns](https://cadence-lang.org/docs/anti-patterns) - [cadence/security-best-practices](./security-best-practices.md) Composability and extensibility should also be priorities while designing, developing, diff --git a/docs/build/smart-contracts/best-practices/security-best-practices.md b/docs/build/smart-contracts/best-practices/security-best-practices.md index a6e7d86b21..356e3be084 100644 --- a/docs/build/smart-contracts/best-practices/security-best-practices.md +++ b/docs/build/smart-contracts/best-practices/security-best-practices.md @@ -6,7 +6,7 @@ sidebar_position: 3 This is an opinionated list of best practices Cadence developers should follow to write more secure Cadence code. -Some practices listed below might overlap with advice in the [Cadence Anti-Patterns](https://cadence-lang.org/docs/1.0/design-patterns) section, which is a recommended read as well. +Some practices listed below might overlap with advice in the [Cadence Anti-Patterns](https://cadence-lang.org/docs/design-patterns) section, which is a recommended read as well. ## References @@ -31,7 +31,7 @@ Always [borrow](https://cadence-lang.org/docs/language/capabilities) with the sp Access to an `&Account` gives access to whatever is specified in the account entitlements list when that account reference is created. -Therefore, [avoid using Account references](https://cadence-lang.org/docs/1.0/anti-patterns#avoid-using-authaccount-as-a-function-parameter) as a function parameter or field unless absolutely necessary and only use the minimal set of entitlements required +Therefore, [avoid using Account references](https://cadence-lang.org/docs/anti-patterns#avoid-using-authaccount-as-a-function-parameter) as a function parameter or field unless absolutely necessary and only use the minimal set of entitlements required for the specified functionality so that other account functionality cannot be accessed. It is preferable to use capabilities over direct `&Account` references when exposing account data. Using capabilities allows the revocation of access by unlinking and limits the access to a single value with a certain set of functionality. diff --git a/docs/build/smart-contracts/overview.md b/docs/build/smart-contracts/overview.md index 72e3081605..c745c65d9e 100644 --- a/docs/build/smart-contracts/overview.md +++ b/docs/build/smart-contracts/overview.md @@ -26,7 +26,6 @@ To build confidently, you will want to set up the appropriate local environment - [Flow Emulator](../../tools/emulator/index.md): A lightweight server that simulates the Flow blockchain (strongly recommended during development). - [Flow Dev Wallet](https://github.com/onflow/fcl-dev-wallet/): A utility to simulate user wallets in development. - [Visual Studio Code Extension](../../tools/vscode-extension/index.md): An IDE integration for developing smart contracts. -- [JS Testing Framework](https://github.com/onflow/flow-js-testing): A framework to test your smart contracts. ## Storing Data on Flow diff --git a/docs/build/smart-contracts/testing.md b/docs/build/smart-contracts/testing.md index c6a98a002c..7c2b7703db 100644 --- a/docs/build/smart-contracts/testing.md +++ b/docs/build/smart-contracts/testing.md @@ -250,26 +250,20 @@ You can find examples of Go tests in the following projects: [flow-core-contract These tests are tied to the emulator but can be refactored to run on testnet -### JavaScript Tests - -Tests in JavaScript can be written using [flow-js-testing](https://github.com/onflow/flow-js-testing). - -It is critical to test your applications and contracts thoroughly on the testnet as part of your road to the mainnet. Testing will help you understand how to create stable and robust applications using the Flow development stack. - ## Testing Your Application ### Automated Testing of Contract Code All contracts should include test coverage for _all contract functions_. Make sure you've accounted for success and failure cases appropriately. -Tests should also be runnable in automated environments (CI). You can use the [JavaScript testing framework](https://github.com/onflow/flow-js-testing) to create tests for your smart contract code. +Tests should also be runnable in automated environments (CI). You can use the [Cadence testing utils](https://cadence-lang.org/docs/testing-framework) to create tests for your smart contract code. ### Stress Testing Live Applications Before Mainnet Once you deployed your application to the testnet, you should record how your application handles non-trivial amounts of traffic to ensure there are no issues. -Get familiar with the [Cadence anti-patterns](https://cadence-lang.org/docs/1.0/anti-patterns) to avoid avoid problematic or unintended behavior. +Get familiar with the [Cadence anti-patterns](https://cadence-lang.org/docs/anti-patterns) to avoid avoid problematic or unintended behavior. diff --git a/docs/evm/accounts.md b/docs/evm/accounts.md index e01059682e..228f92e9e4 100644 --- a/docs/evm/accounts.md +++ b/docs/evm/accounts.md @@ -16,7 +16,7 @@ There are three types of accounts used for EVM on Flow. 1. **Externally Owned Accounts (EOA)**: EOAs are controlled by private individuals using cryptographic keys and can initiate transactions directly. They are the primary account type for users to interact with the blockchain, holding and sending cryptocurrency or calling smart contract functions. 2. **Contract Accounts**: These accounts hold smart contract code and are governed by this code's logic. Unlike EOAs, Contract Accounts do not initiate transactions on their own but can execute transactions in response to calls they receive from EOAs or other contracts. -3. **Cadence Owned Accounts (COA)**: This is an account type unique to Flow EVM. These accounts are managed by [Cadence resources](https://cadence-lang.org/docs/1.0/language/resources) and can be used to interact with the Flow EVM from within the Cadence environment. +3. **Cadence Owned Accounts (COA)**: This is an account type unique to Flow EVM. These accounts are managed by [Cadence resources](https://cadence-lang.org/docs/language/resources) and can be used to interact with the Flow EVM from within the Cadence environment. EOAs and Contract accounts function the same as on other EVM networks. Users may interact with these accounts using the standard EVM JSON-RPC API ([see endpoints here](./using.mdx)). You can read more about EOAs and Contract accounts on the [Ethereum docs](https://ethereum.org/developers/docs/accounts). @@ -38,7 +38,7 @@ COAs create powerful new opportunities to improve the UX, functionality and util - **Native Account Abstraction**: COAs are controlled by Cadence resources, which are in turn owned by Flow accounts. [Flow accounts](./accounts.md) have built-in support for multi-signature authentication, key rotation, and account recovery. As a Cadence resource, COAs naturally inherit [these features](../build/advanced-concepts/account-abstraction.md). -- **Fine-Grained Access Control**: As Cadence resources, access to a COA can be governed by more sophisticated policies than those available with basic EVM accounts. By utilizing powerful Cadence access control primitives such as [capabilities and entitlements](https://cadence-lang.org/docs/1.0/language/access-control), developers can restrict who is able to interact with a COA and what actions they are permitted to perform. +- **Fine-Grained Access Control**: As Cadence resources, access to a COA can be governed by more sophisticated policies than those available with basic EVM accounts. By utilizing powerful Cadence access control primitives such as [capabilities and entitlements](https://cadence-lang.org/docs/language/access-control), developers can restrict who is able to interact with a COA and what actions they are permitted to perform. ### Differences from Traditional EVM Accounts diff --git a/docs/tools/flow-js-testing/accounts.md b/docs/tools/flow-js-testing/accounts.md deleted file mode 100644 index f6688a2158..0000000000 --- a/docs/tools/flow-js-testing/accounts.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Account Management -sidebar_label: Accounts -description: How to manage accounts addresses ---- - -## Overview - -Flow accounts are not derived from a private key. This creates an issues for testing, since -you need to create actors in a specific order to use their addresses properly. - -To reduce this friction, `getAccountAddress`, allows you to access a specific address using an alias. This way you can think about actual actors -- for example `Alice` and `Bob` -- without needing to know their Flow addresses. - -It also helps you to write tests in a sequential or non-sequential way. Calling this method for the first time will create a new account and return the address. Calling it a second time with the same alias again will return the Flow address for that account, without creating new account. - -## Private Key Management - -#### Universal private key - -By default, accounts created and consumed by the Flow JS Testing library will use a universal private key for signing transactions. Generally, this alleviates the burden of any low-level key management and streamlines the process of testing cadence code. - -#### Custom private keys - -However, under some circumstances the user may wish to create accounts (see: [`createAccount`](./accounts.md#createaccountname-keys)) or sign for accounts (see: [`sendTransaction`](./send-transactions.md)) using custom private keys (i.e. private key value, [hashing algorithm](./api.md#hashalgorithm), [signing algorithm](./send-transactions.md#signaturealgorithm), etc.) - this functionality is facilitated by the aforementioned methods. - -## `getAccountAddress` - -Resolves name alias to a Flow address (`0x` prefixed) under the following conditions: - -- If an account with a specific name has not been previously accessed, the framework will create a new one and then store it under the provided alias. -- Next time when you call this method, it will grab exactly the same account. This allows you to create several accounts up-front and then use them throughout your code, without worrying that accounts match or trying to store and manage specific addresses. - -#### Arguments - -| Name | Type | Description | -| ------- | ------ | --------------------------------- | -| `alias` | string | The alias to reference or create. | - -#### Returns - -| Type | Description | -| ------------------------------------------------------------- | ---------------------------------------- | -| [Address](../clients/fcl-js/api.md#address) | `0x` prefixed address of aliased account | - -#### Usage - -```javascript -import {getAccountAddress} from "@onflow/flow-js-testing" - -const main = async () => { - const Alice = await getAccountAddress("Alice") - console.log({Alice}) -} - -main() -``` - -## `createAccount({name, keys})` - -In some cases, you may wish to manually create an account with a particular set of private keys - -#### Options - -_Pass in the following as a single object with the following keys._ - -| Key | Type | Required | Description | -| ------ | -------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `name` | string | No | human-readable name to be associated with created account (will be used for address lookup within [getAccountAddress](./accounts.md#getaccountaddress)) | -| `keys` | [[KeyObject](./api.md#keyobject) or [PublicKey](./api.md#publickey)] | No | An array of [KeyObjects](./api.md#keyobject) or [PublicKeys](./api.md#publickey) to be added to the account upon creation (defaults to the [universal private key](./accounts.md#universal-private-key)) | - -> 📣 if `name` field not provided, the account address will not be cached and you will be unable to look it up using [`getAccountAddress`](./accounts.md#getaccountaddress). - -#### Returns - -| Type | Description | -| ------------------------------------------------------------- | ---------------------------------------- | -| [Address](../clients/fcl-js/api.md#address) | `0x` prefixed address of created account | \ No newline at end of file diff --git a/docs/tools/flow-js-testing/api.md b/docs/tools/flow-js-testing/api.md deleted file mode 100644 index 85a09e2ca1..0000000000 --- a/docs/tools/flow-js-testing/api.md +++ /dev/null @@ -1,1772 +0,0 @@ -# JS Testing API Reference - -> ⚠️ **Required:** Your project must follow the [required structure](./structure.md) and it must be [initialized](./api.md#init) to use the following functions. - -## Accounts - -### `getAccountAddress` - -Resolves name alias to a Flow address (`0x` prefixed) under the following conditions: - -- If an account with a specific name has not been previously accessed, the framework will create a new one and then store it under the provided alias. -- Next time when you call this method, it will grab exactly the same account. This allows you to create several accounts up-front and then use them throughout your code, without worrying that accounts match or trying to store and manage specific addresses. - -#### Arguments - -| Name | Type | Description | -| ------- | ------ | --------------------------------- | -| `alias` | string | The alias to reference or create. | - -#### Returns - -| Type | Description | -| ------------------------------------------------------------- | ---------------------------------------- | -| [Address](../clients/fcl-js/api.md#address) | `0x` prefixed address of aliased account | - -#### Usage - -```javascript -import {getAccountAddress} from "@onflow/flow-js-testing" - -const main = async () => { - const Alice = await getAccountAddress("Alice") - console.log({Alice}) -} - -main() -``` - -### `createAccount({name, keys})` - -In some cases, you may wish to manually create an account with a particular set of private keys - -#### Options - -_Pass in the following as a single object with the following keys._ - -| Key | Type | Required | Description | -| ------ | -------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `name` | string | No | human-readable name to be associated with created account (will be used for address lookup within [getAccountAddress](./api.md#getaccountaddress)) | -| `keys` | [[KeyObject](./api.md#keyobject) or [PublicKey](./api.md#publickey)] | No | An array of [KeyObjects](./api.md#keyobject) or [PublicKeys](./api.md#publickey) to be added to the account upon creation (defaults to the [universal private key](./accounts.md#universal-private-key)) | - -> 📣 if `name` field not provided, the account address will not be cached and you will be unable to look it up using [`getAccountAddress`](./api.md#getaccountaddress). - -#### Returns - -| Type | Description | -| ------------------------------------------------------------- | ---------------------------------------- | -| [Address](../clients/fcl-js/api.md#address) | `0x` prefixed address of created account | - -## Contracts - -### `deployContractByName(props)` - -Deploys contract code located inside a Cadence file. Returns the transaction result. - -#### Arguments - -Props object accepts the following fields: - -| Name | Type | Optional | Description | -| -------------- | ------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | string | | name of the file in `contracts` folder (with `.cdc` extension) and name of the contract (please note those should be the same) | -| `to` | [Address](../clients/fcl-js/api.md#address) | ✅ | (optional) account address, where contract will be deployed. If this is not specified, framework will create new account with randomized alias. | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | (optional) object to use for address mapping of existing deployed contracts | -| `args` | [Any] | ✅ | (optional) arguments, which will be passed to contract initializer. (optional) if template does not expect any arguments. | -| `update` | boolean | ✅ | (optional) whether to update deployed contract. Default: `false` | -| `transformers` | [[CadenceTransformer](./api.md#cadencetransformer)] | ✅ | (optional) an array of operators to modify the code, before submitting it to network | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Result of the deploying transaction. | - -#### Usage - -```javascript -import path from "path"; -import { init, emulator, deployContractByName } from "@onflow/flow-js-testing"; - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence"); - - await init(basePath); - await emulator.start(); - - // We will deploy our contract to the address that corresponds to "Alice" alias - const to = await getAccountAddress("Alice"); - - // We assume there is a file on "../cadence/contracts/Wallet.cdc" path - const name = "Wallet"; - - // Arguments will be processed and type matched in the same order as they are specified - // inside of a contract template - const args = [1337, "Hello", { name: "Alice" }]; - - const [deploymentResult, err] = await deployContractByName({ to, name }); - console.log({ deploymentResult }, { err }); - } - - await emulator.stop(); -}; - -main(); -``` - -In a bit more rare case you would want to deploy contract code not from existing template file, but rather -from string representation of it. `deployContract` method will help you achieve this. - -### `deployContract(props)` - -Deploys contract code specified as string. Returns the transaction result. - -#### Arguments - -Props object accepts the following fields: - -| Name | Type | Optional | Description | -| -------------- | ------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | -| `contractCode` | string | | string representation of contract | -| `name` | string | | name of the contract to be deployed. Should be the same as the name of the contract provided in `contractCode` | -| `to` | [Address](../clients/fcl-js/api.md#address) | ✅ | account address, where contract will be deployed. If this is not specified, framework will create new account with randomized alias. | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for import resolver. Default: `{}` | -| `args` | [Any] | ✅ | arguments, which will be passed to contract initializer. Default: `[]` | -| `update` | boolean | ✅ | whether to update deployed contract. Default: `false` | -| `transformers` | [[CadenceTransformer](./api.md#cadencetransformer)] | ✅ | an array of operators to modify the code, before submitting it to network | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Result of the deploying transaction. | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - getAccountAddress, - deployContract, - executeScript, -} from "@onflow/flow-js-testing" -;(async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // We can specify, which account will hold the contract - const to = await getAccountAddress("Alice") - - const name = "Wallet" - const code = ` - access(all) contract Wallet{ - access(all) let balance: UInt - init(balance: UInt){ - self.balance = balance - } - } - ` - const args = [1337] - - await deployContract({to, name, code, args}) - - const [balance, err] = await executeScript({ - code: ` - import Wallet from 0x01 - access(all) fun main(): UInt{ - return Wallet.balance - } - `, - }) - console.log({balance}, {err}) - - await emulator.stop() -})() -``` - -While framework have automatic import resolver for Contracts you might want to know where it's currently deployed. -We provide a method `getContractAddress` for this. - -### `getContractAddress(name)` - -Returns address of the account where the contract is currently deployed. - -#### Arguments - -| Name | Type | Description | -| ------ | ------ | -------------------- | -| `name` | string | name of the contract | - -#### Returns - -| Type | Description | -| ------------------------------------------------------------- | --------------------- | -| [Address](../clients/fcl-js/api.md#address) | `0x` prefixed address | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, deployContractByName, getContractAddress} from "../src" -;(async () => { - const basePath = path.resolve(__dirname, "./cadence") - - await init(basePath) - await emulator.start() - - // if we omit "to" it will be deployed to Service Account - // but let's pretend we don't know where it will be deployed :) - await deployContractByName({name: "Hello"}) - - const contractAddress = await getContractAddress("Hello") - console.log({contractAddress}) - - await emulator.stop() -})() -``` - -📣 Framework does not support contracts with identical names deployed to different accounts. While you can deploy contract -to a new address, the internal system, which tracks where contracts are deployed, will only store last address. - -## Cryptography - -### `pubFlowKey(keyObject)` - -The `pubFlowKey` method exported by Flow JS Testing Library will generate an RLP-encoded public key given a private key, hashing algorithm, signing algorithm, and key weight. - -| Name | Type | Optional | Description | -| ----------- | ------------------------------- | -------- | -------------------------------------------------------------------------- | -| `keyObject` | [KeyObject](./api.md#keyobject) | ✅ | an object containing a private key & the key's hashing/signing information | - -If `keyObject` is not provided, Flow JS Testing will default to the [universal private key](./accounts.md#universal-private-key). - -#### Returns - -| Type | Description | -| ------ | ---------------------- | -| Buffer | RLP-encoded public key | - -#### Usage - -```javascript -import {pubFlowKey} from "@onflow/flow-js-testing" - -const key = { - privateKey: "a1b2c3", // private key as hex string - hashAlgorithm: HashAlgorithm.SHA3_256, - signatureAlgorithm: SignatureAlgorithm.ECDSA_P256, - weight: 1000, -} - -const pubKey = await pubFlowKey(key) // public key generated from keyObject provided -const genericPubKey = await pubFlowKey() // public key generated from universal private key/service key -``` - -### `signUserMessage(msgHex, signer, domainTag)` - -The `signUserMessage` method will produce a user signature of some arbitrary data using a particular signer. - -#### Arguments - -| Name | Type | Optional | Description | -| ----------- | -------------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `msgHex` | string or Buffer | | a hex-encoded string or Buffer which will be used to generate the signature | -| `signer` | [Address](../clients/fcl-js/api.md#address) or [SignerInfo](./api.md#signerinfoobject) | ✅ | [Address](../clients/fcl-js/api.md#address) or [SignerInfo](./api.md#signerinfoobject) object representing user to generate this signature for (default: [universal private key](./accounts.md#universal-private-key)) | -| `domainTag` | string | ✅ | Domain separation tag provided as a utf-8 encoded string (default: no domain separation tag). See more about [domain tags here](https://cadence-lang.org/docs/language/crypto#hashing-with-a-domain-tag). | - -#### Returns - -| Type | Description | -| ------------------------------------------- | -------------------------------------------------------------------------------------------------- | -| [SignatureObject](./api.md#signatureobject) | An object representing the signature for the message & account/keyId which signed for this message | - -#### Usage - -```javascript -import {signUserMessage, getAccountAddress} from "@onflow/flow-js-testing" - -const Alice = await getAccountAddress("Alice") -const msgHex = "a1b2c3" - -const signature = await generateUserSignature(msgHex, Alice) -``` - -## `verifyUserSigntatures(msgHex, signatures, domainTag)` - -Used to verify signatures generated by [`signUserMessage`](./api.md#signusermessagemessage-signer). This function takes an array of signatures and verifies that the total key weight sums to >= 1000 and that these signatures are valid. - -#### Arguments - -| Name | Type | Optional | Description | -| ------------ | --------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `msgHex` | string | | the message which the provided signatures correspond to provided as a hex-encoded string or Buffer | -| `signatures` | [[SignatureObject](./api.md#signatureobject)] | | An array of [SignatureObjects](./api.md#signatureobject) which will be verified against this message | -| `domainTag` | string | ✅ | Domain separation tag provided as a utf-8 encoded string (default: no domain separation tag). See more about [domain tags here](https://cadence-lang.org/docs/language/crypto#hashing-with-a-domain-tag). | - -#### Returns - -This method returns an object with the following keys: -| Type | Description | -| ---- | ----------- | -| boolean | Returns true if signatures are valid and total weight >= 1000 | - -#### Usage - -```javascript -import { - signUserMessage, - verifyUserSignatures, - getAccountAddress, -} from "@onflow/flow-js-testing" - -const Alice = await getAccountAddress("Alice") -const msgHex = "a1b2c3" - -const signature = await generateUserSignature(msgHex, Alice) - -console.log(await verifyUserSignatures(msgHex, Alice)) // true - -const Bob = await getAccountAddress("Bob") -console.log(await verifyUserSignatures(msgHex, Bob)) // false -``` - -## Emulator - -Flow Javascript Testing Framework exposes `emulator` singleton allowing you to run and stop emulator instance -programmatically. There are two methods available on it. - -### `emulator.start(options)` - -Starts emulator on a specified port. Returns Promise. - -#### Arguments - -| Name | Type | Optional | Description | -| --------- | --------------- | -------- | ------------------------------------------------------ | -| `options` | EmulatorOptions | ✅ | an object containing options for starting the emulator | - -#### EmulatorOptions - -| Key | Type | Optional | Description | -| -------------- | ------- | -------- | --------------------------------------------------------------------------------- | -| `logging` | boolean | ✅ | whether log messages from emulator shall be added to the output (default: false) | -| `flags` | string | ✅ | custom command-line flags to supply to the emulator (default: no flags) | -| `adminPort` | number | ✅ | override the port which the emulator will run the admin server on (default: auto) | -| `restPort` | number | ✅ | override the port which the emulator will run the REST server on (default: auto) | -| `grpcPort` | number | ✅ | override the port which the emulator will run the GRPC server on (default: auto) | -| `debuggerPort` | number | ✅ | override the port which the emulator will run the debug server on (default: auto) | - -#### Returns - -| Type | Description | -| --------------------------- | ---------------------------------------------------------------- | -| [Promise](./api.md#Promise) | Promise, which resolves to true if emulator started successfully | - -#### Usage - -```javascript -import path from "path" -import {emulator, init} from "../src" -;(async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - - // Start emulator instance on port 8080 - await emulator.start() - console.log("emulator is working") - - // Stop running emulator - await emulator.stop() - console.log("emulator has been stopped") -})() -``` - -### `emulator.stop()` - -Stops emulator instance. Returns Promise. - -#### Arguments - -This method does not expect any arguments. - -#### Returns - -| Type | Description | -| --------------------------- | ------------------------------------------------------------------ | -| [Promise](./api.md#Promise) | Promise, which resolves to true if emulator stopped without issues | - -#### Usage - -```javascript -import {emulator, init} from "@onflow/flow-js-testing" - -describe("test setup", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - await emulator.stop() - }) -}) -``` - -### `emulator.setLogging(newState)` - -Set logging flag on emulator, allowing to temporally enable/disable logging. - -#### Arguments - -| Name | Type | Description | -| ---------- | ------- | ---------------------- | -| `newState` | boolean | Enable/disable logging | - -#### Returns - -Method does not return anything. - -#### Usage - -```javascript -import path from "path" -import {emulator, init} from "@onflow/flow-js-testing" - -describe("test setup", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - await emulator.stop() - }) - - test("basic test", async () => { - // Turn on logging from begining - emulator.setLogging(true) - // some asserts and interactions - - // Turn off logging for later calls - emulator.setLogging(false) - // more asserts and interactions here - }) -}) -``` - -## FLOW Management - -Some actions on the network will require account to have certain amount of FLOW token - transaction and storage fees, -account creation, etc. - -Framework provides a method to query balance with `getFlowBalance` and mint new tokens via `mintFlow`. You can find -information how to use them below. - -### `getFlowBalance(address)` - -Fetch current FlowToken balance of account specified by address - -#### Arguments - -| Name | Type | Description | -| --------- | ------------------------------------------------------------- | ------------------------------- | -| `address` | [Address](../clients/fcl-js/api.md#address) | address of the account to check | - -#### Returns - -| Type | Description | -| ------ | ---------------------------------------------------------------------------- | -| string | UFix64 amount of FLOW tokens stored in account storage represented as string | - -#### Usage - -```javascript -import { - init, - emulator, - getAccountAddress, - getFlowBalance, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - const Alice = await getAccountAddress("Alice") - - const [result, error] = await getFlowBalance(Alice) - console.log({result}, {error}) - - await emulator.stop() -} - -main() -``` - -### `mintFlow(recipient, amount)` - -Sends transaction to mint specified amount of FLOW token and send it to recipient. - -> ⚠️ **Required:** Framework shall be initialized with `init` method for this method to work. - -#### Arguments - -| Name | Type | Description | -| ----------- | ------------------------------------------------------------- | ---------------------------------------------------------- | -| `recipient` | [Address](../clients/fcl-js/api.md#address) | address of the account to check | -| `amount` | string | UFix64 amount of FLOW tokens to mint and send to recipient | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Transaction result | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - getAccountAddress, - getFlowBalance, - mintFlow, -} from "../src" -;(async () => { - const basePath = path.resolve(__dirname, "./cadence") - - await init(basePath) - await emulator.start() - - // Get address for account with alias "Alice" - const Alice = await getAccountAddress("Alice") - - // Get initial balance - const [initialBalance] = await getFlowBalance(Alice) - console.log(initialBalance) - - // Add 1.0 FLOW tokens to Alice account - await mintFlow(Alice, "1.0") - - // Check updated balance - const updatedBalance = await getFlowBalance(Alice) - console.log({updatedBalance}) - - await emulator.stop() -})() -``` - -## Init - -For Framework to operate properly you need to initialize it first. -You can do it with provided `init` method. - -### init( basePath, options) - -Initializes framework variables. - -#### Arguments - -| Name | Type | Optional | Description | -| ---------- | ------ | -------- | ----------------------------------------------------- | -| `bastPath` | string | | path to the folder holding all Cadence template files | -| `options` | object | ✅ | options object to use during initialization | - -#### Options - -| Name | Type | Optional | Description | -| ------ | ---- | -------- | ------------------------------- | -| `pkey` | | ✅ | private key for service account | - -#### Returns - -| Type | Description | -| --------------------------- | --------------------------------------------------------------------- | -| [Promise](./api.md#Promise) | Promise, which resolves to true if framework was initialized properly | - -#### Usage - -```javascript -import path from "path" -import {init} from "@onflow/flow-js-testing" - -describe("test setup", () => { - beforeEach(async () => { - const basePath = path.resolve(__dirname, "../cadence") - await init(basePath) - - // alternatively you can pass specific port - // await init(basePath, {port: 8085}) - }) -}) -``` - -## Environment - -### `getBlockOffset()` - -Returns current block offset - amount of blocks added on top of real current block height. - -#### Returns - -| Type | Description | -| ------ | ------------------------------------------------------------------------------------------- | -| string | number representing amount of blocks added on top of real current block (encoded as string) | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, getBlockOffset} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - init(basePath) - await emulator.start() - - const [blockOffset, err] = await getBlockOffset() - console.log({blockOffset}, {err}) - - await emulator.stop() -} - -main() -``` - -### `setBlockOffset(offset)` - -Returns current block offset - amount of blocks added on top of real current block height. - -#### Arguments - -| Name | Type | Description | -| ---- | ---- | ----------- | - -#### Returns - -| Type | Description | -| ------ | ------------------------------------------------------------------------------ | -| number | number representing amount of blocks added on top of real current block height | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - executeScript, - getBlockOffset, - setBlockOffset, - sendTransaction, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - init(basePath) - await emulator.start() - - // Offset current block height by 42 - await setBlockOffset(42) - - const [blockOffset, err] = await getBlockOffset() - console.log({blockOffset}, {err}) - - // "getCurrentBlock().height" in your Cadence code will be replaced by Manager to a mocked value - const code = ` - access(all) fun main(): UInt64 { - return getCurrentBlock().height - } - ` - - const [result, error] = await executeScript({code}) - console.log({result}, {error}) - - await emulator.stop() -} - -main() -``` - -### `getTimestampOffset()` - -Returns current timestamp offset - amount of seconds added on top of real current timestamp. - -#### Returns - -| Type | Description | -| ------ | ---------------------------------------------------------------------------- | -| number | number representing amount of seconds added on top of real current timestamp | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, getTimestampOffset} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - init(basePath) - await emulator.start() - - const [timestampOffset, err] = await getTimestampOffset() - console.log({timestampOffset}, {err}) - - await emulator.stop() -} - -main() -``` - -### `setTimestampOffset(offset)` - -Returns current timestamp offset - amount of seconds added on top of real current timestamp. - -#### Arguments - -| Name | Type | Description | -| ---- | ---- | ----------- | - -#### Returns - -| Type | Description | -| ------ | ---------------------------------------------------------------------------- | -| number | number representing amount of seconds added on top of real current timestamp | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - executeScript, - getTimestampOffset, - setTimestampOffset, - sendTransaction, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - init(basePath) - await emulator.start() - - // Offset current timestamp by 10s - await setTimestampOffset(10) - - const [timestampOffset, err] = await getTimestampOffset() - console.log({timestampOffset}, {err}) - - // "getCurrentBlock().timestamp" in your Cadence code will be replaced by Manager to a mocked value - const code = ` - access(all) fun main(): UInt64 { - return getCurrentBlock().timestamp - } - ` - - const [result, error] = await executeScript({code}) - console.log({result}, {error}) - - await emulator.stop() -} - -main() -``` - -## Jest Helpers - -In order to simplify the process even further we've created several Jest-based methods, which will help you to catch -thrown errors and ensure your code works as intended. - -### `shallPass(ix)` - -Ensure transaction does not throw and sealed. - -#### Arguments - -| Name | Type | Description | -| ---- | ----------------------------------- | ---------------------------------------------------- | -| `ix` | [Interaction](./api.md#interaction) | interaction, either in form of a Promise or function | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Transaction result | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - shallPass, - sendTransaction, - getAccountAddress, -} from "js-testing-framework" - -// We need to set timeout for a higher number, cause some interactions might need more time -jest.setTimeout(10000) - -describe("interactions - sendTransaction", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "./cadence") - await init(basePath) - return emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - return emulator.stop() - }) - - test("basic transaction", async () => { - const code = ` - transaction(message: String){ - prepare(singer: &Account){ - log(message) - } - } - ` - const Alice = await getAccountAddress("Alice") - const signers = [Alice] - const args = ["Hello, Cadence"] - - const [txResult, error] = await shallPass( - sendTransaction({ - code, - signers, - args, - }) - ) - - // Transaction result will hold status, events and error message - console.log({txResult}, {error}) - }) -}) -``` - -### shallRevert(ix, message) - -Ensure interaction throws an error. Can test for specific error messages or catch any error message if `message` is not provided. -Returns Promise, which contains result, when resolved. - -#### Arguments - -| Name | Type | Description | -| ------------------------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| `ix` | [Interaction](./api.md#interaction) | transaction, either in form of a Promise or function | -| `message` **(optional)** | `string` or `RegExp` | expected error message provided as either a string equality or regular expression to match, matches any error by default | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Transaction result | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - shallPass, - sendTransaction, - getAccountAddress, -} from "js-testing-framework" - -// We need to set timeout for a higher number, cause some interactions might need more time -jest.setTimeout(10000) - -describe("interactions - sendTransaction", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "./cadence") - await init(basePath) - return emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - return emulator.stop() - }) - - test("basic transaction", async () => { - const code = ` - transaction(message: String){ - prepare(singer: &Account){ - panic("You shall not pass!") - } - } - ` - const Alice = await getAccountAddress("Alice") - const signers = [Alice] - const args = ["Hello, Cadence"] - - // Catch any cadence error - let [txResult, error] = await shallRevert( - sendTransaction({ - code, - signers, - args, - }) - ) - - // Catch only specific panic message - let [txResult2, error2] = await shallRevert( - sendTransaction({ - code, - signers, - args, - }), - "You shall not pass!" - ) - - // Transaction result will hold status, events and error message - console.log({txResult}, {error}) - }) -}) -``` - -### shallResolve(ix) - -Ensure interaction resolves without throwing errors. - -#### Arguments - -| Name | Type | Description | -| ---- | ----------------------------------- | ---------------------------------------------------- | -| `ix` | [Interaction](./api.md#interaction) | interaction, either in form of a Promise or function | - -#### Returns - -| Type | Description | -| ----------------------------------------------- | ------------------ | -| [InteractionResult](./api.md#InteractionResult) | Interaction result | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, shallPass, executeScript} from "js-testing-framework" - -// We need to set timeout for a higher number, cause some interactions might need more time -jest.setTimeout(10000) - -describe("interactions - sendTransaction", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "./cadence") - await init(basePath) - return emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - return emulator.stop() - }) - - test("basic script", async () => { - const code = ` - access(all) fun main():Int{ - return 42 - } - ` - - const [result, error] = await shallResolve( - executeScript({ - code, - }) - ) - - expect(result).toBe(42) - expect(error).toBe(null) - }) -}) -``` - -## Scripts - -It is often the case that you need to query current state of the network. For example, to check balance of the -account, read public value of the contract or ensure that user has specific resource in their storage. - -We abstract this interaction into single method called `executeScript`. Method have 2 different signatures. - -> ⚠️ **Required:** Your project must follow the [required structure](./structure.md) it must be [initialized](./init.md) to use the following functions. - -### `executeScript(props)` - -Provides explicit control over how you pass values. - -#### Arguments - -`props` object accepts following fields: - -| Name | Type | Optional | Description | -| -------------- | --------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------ | -| `code` | string | ✅ | string representation of Cadence script | -| `name` | string | ✅ | name of the file in `scripts` folder to use (sans `.cdc` extension) | -| `args` | [any] | ✅ | an array of arguments to pass to script. Optional if script does not expect any arguments. | -| `transformers` | [[CadenceTransformer](./api.md#cadencetransformer)] | ✅ | an array of operators to modify the code, before submitting it to network | - -> ⚠️ **Required:** Either `code` or `name` field shall be specified. Method will throw an error if both of them are empty. -> If `name` field provided, framework will source code from file and override value passed via `code` field. - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------- | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Script result | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, executeScript} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - init(basePath) - // Start emulator - await emulator.start() - - // Define code and arguments we want to pass - const code = ` - access(all) fun main(message: String): Int{ - log(message) - - return 42 - } - ` - const args = ["Hello, from Cadence"] - - const [result, error, logs] = await executeScript({code, args}) - console.log({result}, {error}, {logs}) - - // Stop emulator instance - await emulator.stop() -} - -main() -``` - -### `executeScript(name: string, args: [any])` - -This signature provides simplified way of executing a script, since most of the time you will utilize existing -Cadence files. - -#### Arguments - -| Name | Type | Optional | Description | -| ------ | ------ | -------- | ------------------------------------------------------------------------------------------------------ | -| `name` | string | | name of the file in `scripts` folder to use (sans `.cdc` extension) | -| `args` | [any] | ✅ | an array of arguments to pass to script. Optional if scripts don't expect any arguments. Default: `[]` | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------- | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Script result | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, executeScript} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - init(basePath) - // Start emulator - await emulator.start() - - // Define arguments we want to pass - const args = ["Hello, from Cadence"] - - // We assume there is a file `scripts/log-message.cdc` under base path - const [result, error, logs] = await executeScript("log-message", args) - console.log({result}, {error}, {logs}) - - await emulator.stop() -} - -main() -``` - -## Transactions - -Another common case is interactions that mutate network state - sending tokens from one account to another, minting new NFT, etc. Framework provides `sendTransaction` method to achieve this. This method have 2 different signatures. - -> ⚠️ **Required:** Your project must follow the [required structure](./structure.md) it must be [initialized](./init.md) to use the following functions. - -### `sendTransaction(props)` - -Send transaction to network. -Provides explicit control over how you pass values. - -#### Arguments - -`props` object accepts following fields: - -| Name | Type | Optional | Description | -| -------------- | ---------------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `code` | string | ✅ | string representation of Cadence transaction | -| `name` | string | ✅ | name of the file in `transaction` folder to use (sans `.cdc` extension) | -| `args` | [any] | ✅ | an array of arguments to pass to transaction. Optional if transaction does not expect any arguments. | -| `signers` | [[Address](../clients/fcl-js/api.md#address) or [SignerInfo](./api.md#signerinfoobject)] | ✅ | an array of [Address](../clients/fcl-js/api.md#address) or [SignerInfo](./api.md#signerinfoobject) objects representing transaction autorizers | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | name/address map to use as lookup table for addresses in import statements | -| `transformers` | [[CadenceTransformer](./api.md#cadencetransformer)] | ✅ | an array of operators to modify the code, before submitting it to network | - -> ⚠️ **Required:** Either `code` or `name` field shall be specified. Method will throw an error if both of them are empty. -> If `name` field provided, framework will source code from file and override value passed via `code` field. - -> 📣 if `signers` field not provided, service account will be used to authorize the transaction. - -> 📣 Pass `addressMap` only in cases, when you would want to override deployed contract. Otherwide -> imports can be resolved automatically without explicitly passing them via `addressMap` field - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - sendTransaction, - getAccountAddress, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - await init(basePath) - // Start emulator - await emulator.start() - - // Define code and arguments we want to pass - const code = ` - transaction(message: String){ - prepare(signer: &Account){ - log(message) - } - } - ` - const args = ["Hello, from Cadence"] - const Alice = await getAccountAddress("Alice") - const signers = [Alice] - - const [result, error, logs] = await sendTransaction({code, args, signers}) - console.log({result}, {error}, {logs}) - - // Stop emulator instance - await emulator.stop() -} - -main() -``` - -### `sendTransaction(name, signers, args)` - -This signature provides simplified way to send a transaction, since most of the time you will utilize existing -Cadence files. - -| Name | Type | Optional | Description | -| --------- | ---------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | string | ✅ | name of the file in `transaction` folder to use (sans `.cdc` extension) | -| `args` | [any] | ✅ | an array of arguments to pass to transaction. Optional if transaction does not expect any arguments. | -| `signers` | [[Address](../clients/fcl-js/api.md#address) or [SignerInfoObject](./api.md#signerinfoobject)] | ✅ | an array of [Address](../clients/fcl-js/api.md#address) or array of [SignerInfoObject](./api.md#signerinfoobject) representing transaction autorizers | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - sendTransaction, - shallPass, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - await init(basePath) - // Start emulator - await emulator.start() - - // Define arguments we want to pass - const args = ["Hello, Cadence"] - - const [result, error, logs] = await shallPass( - sendTransaction("log-message", [], args) - ) - console.log({result}, {error}, {logs}) - - // Stop the emulator instance - await emulator.stop() -} - -main() -``` - -## Templates - -The philosophy behind Flow JS Testing Framework is to be a set of helper methods. They can be used in -opinionated way, envisioned by Flow Team. Or they can work as building blocks, allowing developers to build their own -testing solution as they see fit. - -Following methods used inside other framework methods, but we feel encouraged to list them here as well. - -### `getTemplate(file, addressMap, byAddress)` - -Returns Cadence template as string with addresses replaced using addressMap - -| Name | Type | Optional | Description | -| ------------ | --------------------------------- | -------- | --------------------------------------------------------------------------------------------------------- | -| `file` | string | | relative (to the place from where the script was called) or absolute path to the file containing the code | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for address mapping of existing deployed contracts. Default: `{}` | -| `byAddress` | boolean | ✅ | whether addressMap is `{name:address}` or `{address:address}` type. Default: `false` | - -#### Returns - -| Type | Description | -| ------ | --------------------------- | -| string | content of a specified file | - -#### Usage - -```javascript -import path from "path" -import {init, getTemplate} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - await init(basePath) - - const template = await getTemplate("../cadence/scripts/get-name.cdc") - console.log({template}) -} - -main() -``` - -### `getContractCode(name, addressMap)` - -Returns Cadence template from file with `name` in `_basepath_/contracts` folder - -#### Arguments - -| Name | Type | Optional | Description | -| ------------ | --------------------------------- | -------- | ---------------------------------------------------------------- | -| `name` | string | | name of the contract template | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for address mapping of existing deployed contracts | - -#### Returns - -| Type | Description | -| ------ | -------------------------------------------- | -| string | Cadence template code for specified contract | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, getContractCode} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Let's assume we need to import MessageContract - await deployContractByName({name: "MessageContract"}) - const [MessageContract] = await getContractAddress("MessageContract") - const addressMap = {MessageContract} - - const contractTemplate = await getContractCode("HelloWorld", { - MessageContract, - }) - console.log({contractTemplate}) - - await emulator.stop() -} - -main() -``` - -### `getTransactionCode(name, addressMap)` - -Returns Cadence template from file with `name` in `_basepath_/transactions` folder - -#### Arguments - -| Name | Type | Optional | Description | -| ------------ | --------------------------------- | -------- | ---------------------------------------------------------------- | -| `name` | string | | name of the transaction template | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for address mapping of existing deployed contracts | - -#### Returns - -| Type | Description | -| ------ | ----------------------------------------------- | -| string | Cadence template code for specified transaction | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, getTransactionCode} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Let's assume we need to import MessageContract - await deployContractByName({name: "MessageContract"}) - const [MessageContract] = await getContractAddress("MessageContract") - const addressMap = {MessageContract} - - const txTemplate = await getTransactionCode({ - name: "set-message", - addressMap, - }) - console.log({txTemplate}) - - await emulator.stop() -} - -main() -``` - -### `getScriptCode(name, addressMap)` - -Returns Cadence template from file with `name` in `_basepath_/scripts` folder - -#### Arguments - -| Name | Type | Optional | Description | -| ------------ | --------------------------------- | -------- | ---------------------------------------------------------------- | -| `name` | string | | name of the script template | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for address mapping of existing deployed contracts | - -#### Returns - -| Type | Description | -| ------ | ------------------------------------------ | -| string | Cadence template code for specified script | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, getScriptCode} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Let's assume we need to import MessageContract - await deployContractByName({name: "MessageContract"}) - const [MessageContract] = await getContractAddress("MessageContract") - const addressMap = {MessageContract} - - const scriptTemplate = await getScriptCode({ - name: "get-message", - addressMap, - }) - - console.log({scriptTemplate}) - await emulator.stop() -} - -main() -``` - -## Storage Inspection - -### getPaths - -Retrieves information about the public, private, and storage paths for a given account. - -#### Arguments - -| Name | Type | Description | -| ------------------- | --------- | --------------------------------------------------------------------- | -| `address` | `string` | The address or name of the account to retrieve the paths from. | -| `useSet` (optional) | `boolean` | Whether to return the paths as a Set or an array. Defaults to `true`. | - -#### Returns - -An object containing the following properties: - -| Name | Type | Description | -| -------------- | -------------------------------- | ----------------------------------------------------------------- | -| `publicPaths` | `Array` or `Set` | An array or Set of the public paths for the account, as strings. | -| `privatePaths` | `Array` or `Set` | An array or Set of the private paths for the account, as strings. | -| `storagePaths` | `Array` or `Set` | An array or Set of the storage paths for the account, as strings. | - -> The `useSet` parameter determines whether the paths are returned as an array or Set. If `useSet` is `true`, the paths will be returned as a Set; otherwise, they will be returned as an array. - -#### Usage - -```js -import path from "path" -import {init, emulator} from "@onflow/flow-js-testing" -import {getAccountAddress, getPaths} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Get storage stats - const Alice = await getAccountAddress("Alice") - const paths = await getPaths(Alice) - const {publicPaths, privatePaths, storagePaths} = paths - - // Output result to console - console.log({Alice, paths}) - - await emulator.stop() -} - -main() -``` - -### getPathsWithType - -Retrieves public, private, and storage paths for a given account with extra information available on them - -#### Arguments - -| Name | Type | Description | -| --------- | -------- | -------------------------------------------------------------- | -| `address` | `string` | The address or name of the account to retrieve the paths from. | - -#### Returns - -An object containing the following properties: - -| Name | Type | Description | -| -------------- | -------- | ------------------------------------------------------------------------------------------ | -| `publicPaths` | `Object` | An object containing the public paths for the account, as keys and their types as values. | -| `privatePaths` | `Object` | An object containing the private paths for the account, as keys and their types as values. | -| `storagePaths` | `Object` | An object containing the storage paths for the account, as keys and their types as values. | - -> The types of the paths are not strictly defined and may vary depending on the actual types used in the account. - -#### Usage - -```js -import path from "path" -import {init, emulator} from "@onflow/flow-js-testing" -import {getPathsWithType} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - const {publicPaths} = await getPathsWithType("Alice") - const refTokenBalance = publicPaths.flowTokenBalance - - if ( - refTokenBalance.restrictionsList.has( - "A.ee82856bf20e2aa6.FungibleToken.Balance" - ) - ) { - console.log("Found specific restriction") - } - - if (refTokenBalance.haveRestrictions("FungibleToken.Balance")) { - console.log("Found matching restriction") - } - - await emulator.stop() -} - -main() -``` - -### getStorageValue - -#### Arguments - -| Name | Type | Description | -| --------- | -------- | ---------------------------------------------------------------------- | -| `account` | `string` | The address or name of the account to retrieve the storage value from. | -| `path` | `string` | The path of the storage value to retrieve. | - -#### Returns - -| Type | Description | -| -------------- | --------------------------------------------------------------------------- | -| `Promise` | The value of the storage at the given path, or `null` if no value is found. | - -#### Usage - -```js -import path from "path" -import {init, emulator} from "@onflow/flow-js-testing" -import {sendTransaction, getStorageValue} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Inplant some value into account - await sendTransaction({ - code: ` - transaction{ - prepare(signer: auth(StoreValue) &Account){ - signer.storage.save(42, to: /storage/answer) - } - } - `, - signers: [Alice], - }) - const answer = await getStorageValue("Alice", "answer") - console.log({answer}) - - await emulator.stop() -} - -main() -``` - -### getStorageStats - -Retrieves the storage statistics (used and capacity) for a given account. - -#### Arguments - -| Name | Type | Description | -| -------------------- | --------- | ------------------------------------------------------------------------------------------------ | -| `address` | `string` | The address or name of the account to check for storage statistics. | -| `convert` (optional) | `boolean` | Whether to convert the `used` and `capacity` values from strings to numbers. Defaults to `true`. | - -#### Returns - -A Promise that resolves to an object containing the following properties: - -| Name | Type | Description | -| ---------- | -------------------- | ---------------------------------------------------- | -| `used` | `number` or `string` | The amount of storage used by the account, in bytes. | -| `capacity` | `number` or `string` | The total storage capacity of the account, in bytes. | - -> If `convert` is `true`, the `used` and `capacity` values will be converted from strings to numbers before being returned. - -#### Usage - -```js -import path from "path" -import {init, emulator} from "@onflow/flow-js-testing" -import {getAccountAddress, getStorageStats} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Get storage stats - const Alice = await getAccountAddress("Alice") - const {capacity, used} = await getStorageStats(Alice) - - // Output result to console - console.log({Alice, capacity, used}) - - await emulator.stop() -} - -main() -``` - -## Types - -### `AddressMap` - -Object to use for address mapping of existing deployed contracts. Key shall be `string` and value shall be [Address](../clients/fcl-js/api.md#address) - -#### Example - -```javascript -const addressMap = { - Messanger: "0x01cf0e2f2f715450", - Logger: "0x179b6b1cb6755e31", -} -``` - -### `Interaction` - -Interaction is a Promise or function returning a promise. - -#### Example - -```javascript -const ix = async () => { - return new Promise((resolve, reject) => { - setTimeout(() => { - resolve(1337) - }) - }, 500) -} -``` - -### `CadenceTransformer` - -Function, which will get valid Cadence code, modify it and return valid Cadence code - -#### Example - -This transformer will look for occupancies of specific import statement and replace it with proper address, where it's deployed on Emulator - -```javascript -const replaceAddress = async code => { - const modified = code.replace( - /import\s+FungibleToken\s+from\s+0xFUNGIBLETOKEN/, - "import FungibleToken from 0xee82856bf20e2aa6" - ) - - return modified -} -``` - -### KeyObject - -Key objects are used to specify signer keys when [creating accounts](./accounts.md). - -| Key | Required | Value Type | Description | -| -------------------- | -------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| `hashAlgorithm` | No | [HashAlgorithm](./api.md#hashalgorithm) | Hashing algorithm to use for generating signatures to be signed by this key (default: `HashAlgorithm.SHA3_256`) | -| `privateKey` | Yes | string | Private key to use to generate the signature | -| `signatureAlgorithm` | No | [SignatureAlgorithm](./api.md#signaturealgorithm) | Signing algorithm used to sign transactions with this key (default: `SignatureAlgorithm.ECDSA_P256`) | -| `weight` | No | number | Weight of the key - see [Flow Core Concepts](../../build/basics/accounts.md#account-keys) for more information | - -### PublicKey - -Public keys are stored as `Buffer` objects which have been RLP encoded according to the [Flow spec](../../build/basics/accounts.md). - -In order to generate this object using the Flow JS Testing library, use the [`pubFlowKey` method](./api.md#pubflowkeykeyobject) exported by the library. - -```javascript -import {pubFlowKey} from "@onflow/flow-js-testing" - -const pubKey = await pubFlowKey({ - privateKey: ..., - hashAlgorithm: ..., - signatureAlgorithm: ..., - weight: ... -}) -``` - -### SignatureObject - -Signature objects are used to represent a signature for a particular message as well as the account and keyId which signed for this message. - -| Key | Value Type | Description | -| ----------- | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `addr` | [Address](../clients/fcl-js/api.md#address) | the address of the account which this signature has been generated for | -| `keyId` | number | [Address](../clients/fcl-js/api.md#address) or [SignerInfo](./api.md#signerinfoobject) object representing user to generate this signature for | -| `signature` | string | a hexidecimal-encoded string representation of the generated signature | - -### SignerInfoObject - -Signer Info objects are used to specify information about which signer and which key from this signer shall be used to [sign a transaction](./send-transactions.md). - -| Key | Required | Value Type | Description | -| -------------------- | -------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `addr` | Yes | [Address](../clients/fcl-js/api.md#address) | The address of the signer's account | -| `hashAlgorithm` | No | [HashAlgorithm](./api.md#hashalgorithm) | Hashing algorithm to use for generating the signature (default: `HashAlgorithm.SHA3_256`) | -| `keyId` | No | number | The index of the desired key to use from the signer's account (default: `0`) | -| `privateKey` | No | string | Private key to use to generate the signature (default: service account private key - this is the default PK for all accounts generated by Flow JS Testing Library, see: [accounts](./accounts.md)) | -| `signatureAlgorithm` | No | [SignatureAlgorithm](./api.md#signaturealgorithm) | Signing algorithm used to generate the signature (default: `SignatureAlgorithm.ECDSA_P256`) | - -### HashAlgorithm - -| Identifier | Value | -| ---------- | ----- | -| SHA2_256 | 1 | -| SHA3_256 | 3 | - -Hash algorithms may be provided as either an enum (accessible via the `HashAlgorithm` object exported by Flow JS Testing, i.e. `HashAlgorithm.SHA3_256`) or as a string representation of their enum identifier (i.e. `"SHA3_256"`) - -### SignatureAlgorithm - -| Identifier | Value | -| --------------- | ----- | -| ECDSA_P256 | 2 | -| ECDSA_secp256k1 | 3 | - -Signing algorithms may be provided as either an enum (accessible via the `SignatureAlgorithm` object exported by Flow JS Testing, i.e. `SignatureAlgorithm.ECDSA_P256`) or as a string representation of their enum identifier (i.e. `"ECDSA_P256"`) - -## Utilities - -### `isAddress(address)` - -Returns true if the given string is a validly formatted account [address](../clients/fcl-js/api.md#address) (both "0x" prefixed and non-prefixed are valid) - -#### Arguments - -| Name | Type | Optional | Description | -| --------- | ------ | -------- | -------------------------------- | -| `address` | string | | string to test against the regex | - -#### Returns - -| Type | Description | -| ------- | -------------------------------------------------------------------------------------------------------------------------- | -| boolean | Returns true if given string is a validly formatted account [address](../clients/fcl-js/api.md#address). | - -#### Usage - -```javascript -import {isAddress} from "@onflow/flow-js-testing" - -const badAddr = "0xqrtyff" -console.log(isAddress(badAddr)) // false - -const goodAddrWithPrefix = "0xf8d6e0586b0a20c1" -console.log(isAddress(goodAddrWithPrefix)) // true - -const goodAddrSansPrefix = "f8d6e0586b0a20c1" -console.log(isAddress(goodAddrSansPrefix)) // true -``` diff --git a/docs/tools/flow-js-testing/contracts.md b/docs/tools/flow-js-testing/contracts.md deleted file mode 100644 index 71477376fe..0000000000 --- a/docs/tools/flow-js-testing/contracts.md +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: Contracts Management -sidebar_label: Contracts -description: How to manage contracts ---- - -> ⚠️ **Required:** Your project must follow the [required structure](./structure.md) and it must be [initialized](./init.md) to use the following functions. - -## `deployContractByName(props)` - -Deploys contract code located inside a Cadence file. Returns the transaction result. - -#### Arguments - -Props object accepts the following fields: - -| Name | Type | Optional | Description | -| -------------- | ------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | string | | name of the file in `contracts` folder (with `.cdc` extension) and name of the contract (please note those should be the same) | -| `to` | [Address](../clients/fcl-js/api.md#address) | ✅ | (optional) account address, where contract will be deployed. If this is not specified, framework will create new account with randomized alias. | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | (optional) object to use for address mapping of existing deployed contracts | -| `args` | [Any] | ✅ | (optional) arguments, which will be passed to contract initializer. (optional) if template does not expect any arguments. | -| `update` | boolean | ✅ | (optional) whether to update deployed contract. Default: `false` | -| `transformers` | [[CadenceTransformer](./api.md#cadencetransformer)] | ✅ | an array of operators to modify the code, before submitting it to network | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Result of the deploying transaction. | - -#### Usage - -```javascript -import path from "path"; -import { init, emulator, deployContractByName } from "@onflow/flow-js-testing"; - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence"); - - await init(basePath); - await emulator.start(); - - // We will deploy our contract to the address that corresponds to "Alice" alias - const to = await getAccountAddress("Alice"); - - // We assume there is a file on "../cadence/contracts/Wallet.cdc" path - const name = "Wallet"; - - // Arguments will be processed and type matched in the same order as they are specified - // inside of a contract template - const args = [1337, "Hello", { name: "Alice" }]; - - const [deploymentResult, err] = await deployContractByName({ to, name }); - console.log({ deploymentResult }, { err }); - } - - await emulator.stop(); -}; - -main(); -``` - -In a bit more rare case you would want to deploy contract code not from existing template file, but rather -from string representation of it. `deployContract` method will help you achieve this. - -## `deployContract(props)` - -Deploys contract code specified as string. Returns the transaction result. - -#### Arguments - -Props object accepts the following fields: - -| Name | Type | Optional | Description | -| -------------- | ------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | -| `contractCode` | string | | string representation of contract | -| `name` | string | | name of the contract to be deployed. Should be the same as the name of the contract provided in `contractCode` | -| `to` | [Address](../clients/fcl-js/api.md#address) | ✅ | account address, where contract will be deployed. If this is not specified, framework will create new account with randomized alias. | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for import resolver. Default: `{}` | -| `args` | [Any] | ✅ | arguments, which will be passed to contract initializer. Default: `[]` | -| `update` | boolean | ✅ | whether to update deployed contract. Default: `false` | -| `transformers` | [[CadenceTransformer](./api.md#cadencetransformer)] | ✅ | an array of operators to modify the code, before submitting it to network | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Result of the deploying transaction. | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - getAccountAddress, - deployContract, - executeScript, -} from "@onflow/flow-js-testing" -;(async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // We can specify, which account will hold the contract - const to = await getAccountAddress("Alice") - - const name = "Wallet" - const code = ` - access(all) contract Wallet{ - access(all) let balance: UInt - init(balance: UInt){ - self.balance = balance - } - } - ` - const args = [1337] - - await deployContract({to, name, code, args}) - - const [balance, err] = await executeScript({ - code: ` - import Wallet from 0x01 - access(all) fun main(): UInt{ - return Wallet.balance - } - `, - }) - console.log({balance}, {err}) - - await emulator.stop() -})() -``` - -While framework have automatic import resolver for Contracts you might want to know where it's currently deployed. -We provide a method `getContractAddress` for this. - -### `getContractAddress(name)` - -Returns address of the account where the contract is currently deployed. - -#### Arguments - -| Name | Type | Description | -| ------ | ------ | -------------------- | -| `name` | string | name of the contract | - -#### Returns - -| Type | Description | -| ------------------------------------------------------------- | --------------------- | -| [Address](../clients/fcl-js/api.md#address) | `0x` prefixed address | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, deployContractByName, getContractAddress} from "../src" -;(async () => { - const basePath = path.resolve(__dirname, "./cadence") - - await init(basePath) - await emulator.start() - - // if we omit "to" it will be deployed to Service Account - // but let's pretend we don't know where it will be deployed :) - await deployContractByName({name: "Hello"}) - - const contractAddress = await getContractAddress("Hello") - console.log({contractAddress}) - - await emulator.stop() -})() -``` - -📣 Framework does not support contracts with identical names deployed to different accounts. While you can deploy contract -to a new address, the internal system, which tracks where contracts are deployed, will only store last address. diff --git a/docs/tools/flow-js-testing/emulator.md b/docs/tools/flow-js-testing/emulator.md deleted file mode 100644 index 7fdf96345b..0000000000 --- a/docs/tools/flow-js-testing/emulator.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: Emulator -sidebar_label: Emulator -description: How to start a new instance of emulator ---- - -Flow Javascript Testing Framework exposes `emulator` singleton allowing you to run and stop emulator instance -programmatically. There are two methods available on it. - -## `emulator.start(options)` - -Starts emulator on random available port, unless overriden in options. Returns Promise. - -#### Arguments - -| Name | Type | Optional | Description | -| --------- | ------------------------------------------------ | -------- | ------------------------------------------------------ | -| `options` | [EmulatorOptions](./emulator.md#emulatoroptions) | ✅ | an object containing options for starting the emulator | - -#### EmulatorOptions - -| Key | Type | Optional | Description | -| -------------- | ------- | -------- | --------------------------------------------------------------------------------- | -| `logging` | boolean | ✅ | whether log messages from emulator shall be added to the output (default: false) | -| `flags` | string | ✅ | custom command-line flags to supply to the emulator (default: "") | -| `adminPort` | number | ✅ | override the port which the emulator will run the admin server on (default: auto) | -| `restPort` | number | ✅ | override the port which the emulator will run the REST server on (default: auto) | -| `grpcPort` | number | ✅ | override the port which the emulator will run the GRPC server on (default: auto) | -| `debuggerPort` | number | ✅ | override the port which the emulator will run the debug server on (default: auto) | - -#### Returns - -| Type | Description | -| -------------------------------- | ---------------------------------------------------------------- | -| [Promise](./emulator.md#Promise) | Promise, which resolves to true if emulator started successfully | - -#### Usage - -```javascript -import {emulator, init} from "@onflow/flow-js-testing" - -describe("test setup", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - - // Start emulator instance on auto-selected available ports - await emulator.start() - }) -}) -``` - -## `emulator.stop()` - -Stops emulator instance. Returns Promise. - -#### Arguments - -This method does not expect any arguments. - -#### Usage - -```javascript -import {emulator, init} from "@onflow/flow-js-testing" - -describe("test setup", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - await emulator.stop() - }) -}) -``` - -## `emulator.setLogging(newState)` - -Set logging flag on emulator, allowing to temporally enable/disable logging. - -#### Arguments - -| Name | Type | Description | -| ---------- | ------- | ---------------------- | -| `newState` | boolean | Enable/disable logging | - -#### Usage - -```javascript -import {emulator, init} from "@onflow/flow-js-testing" - -describe("test setup", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - await emulator.stop() - }) - - test("basic test", async () => { - // Turn on logging from begining - emulator.setLogging(true) - // some asserts and interactions - - // Turn off logging for later calls - emulator.setLogging(false) - // more asserts and interactions here - }) -}) -``` diff --git a/docs/tools/flow-js-testing/examples/basic.md b/docs/tools/flow-js-testing/examples/basic.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/tools/flow-js-testing/examples/metadata.md b/docs/tools/flow-js-testing/examples/metadata.md deleted file mode 100644 index 4e69587545..0000000000 --- a/docs/tools/flow-js-testing/examples/metadata.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Additional Examples -sidebar_label: Additional Examples -description: More examples, which cover specific use cases ---- - -## Metadata - -You may want to pass dictionaries as arguments to your Cadence code. The most -common is metadata with `\{String:String\}` type - -```javascript -import {executeScript} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - await init(basePath) - // Start emulator - await emulator.start() - - const code = ` - access(all) fun main(metadata: {String: String}): String{ - return metadata["name"]! - } - ` - - // Define arguments we want to pass - const args = [{name: "Boris", nickname: "The Blade"}] - - // If something goes wrong with script execution, the method will throw an error - // so we need to catch it and proce - const [name, err] = await shallResolve(executeScript({code, args})) - console.log(name, err) - - await emulator.stop() -} - -main() -``` - -If you need to pass an array of dictionaries, it's not that different. Just replace the `args` variable above with -multiple values: - -```javascript -const args = [ - // This is array of dictionaries - [ - {name: "Boris", nickname: "The Blade"}, - {name: "Franky", nickname: "Four-Fingers"}, - ], -] -``` - -Or maybe you want to pass dictionary with type \{String: [String]\}: - -```javascript -const args = [ - { - names: ["Alice", "Bob", "Charlie"], - }, -] -``` - -Framework will try to resolve the types to the best of its abilities. If you encounter an error for your use case, -please create an issue here: [https://github.com/onflow/flow-js-testing/issues](https://github.com/onflow/flow-js-testing/issues) diff --git a/docs/tools/flow-js-testing/execute-scripts.md b/docs/tools/flow-js-testing/execute-scripts.md deleted file mode 100644 index d20d19efaf..0000000000 --- a/docs/tools/flow-js-testing/execute-scripts.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Execute Scripts -sidebar_label: Execute Scripts -description: How to execute scripts ---- - -It is often the case that you need to query current state of the network. For example, to check balance of the -account, read public value of the contract or ensure that user has specific resource in their storage. - -We abstract this interaction into single method called `executeScript`. Method have 2 different signatures. - -> ⚠️ **Required:** Your project must follow the [required structure](./structure.md) it must be [initialized](./init.md) to use the following functions. - -## `executeScript(props)` - -Provides explicit control over how you pass values. - -#### Arguments - -`props` object accepts following fields: - -| Name | Type | Optional | Description | -| -------------- | --------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------ | -| `code` | string | ✅ | string representation of Cadence script | -| `name` | string | ✅ | name of the file in `scripts` folder to use (sans `.cdc` extension) | -| `args` | [any] | ✅ | an array of arguments to pass to script. Optional if script does not expect any arguments. | -| `transformers` | [[CadenceTransformer](./api.md#cadencetransformer)] | ✅ | an array of operators to modify the code, before submitting it to network | - -> ⚠️ **Required:** Either `code` or `name` field shall be specified. Method will throw an error if both of them are empty. -> If `name` field provided, framework will source code from file and override value passed via `code` field. - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------- | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Script result | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, executeScript} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - init(basePath) - // Start emulator - await emulator.start() - - // Define code and arguments we want to pass - const code = ` - access(all) fun main(message: String): Int{ - log(message) - - return 42 - } - ` - const args = ["Hello, from Cadence"] - - const [result, error, logs] = await executeScript({code, args}) - console.log({result}, {error}, {logs}) - - // Stop emulator instance - await emulator.stop() -} - -main() -``` - -## `executeScript(name: string, args: [any])` - -This signature provides simplified way of executing a script, since most of the time you will utilize existing -Cadence files. - -#### Arguments - -| Name | Type | Optional | Description | -| ------ | ------ | -------- | ------------------------------------------------------------------------------------------------------ | -| `name` | string | | name of the file in `scripts` folder to use (sans `.cdc` extension) | -| `args` | [any] | ✅ | an array of arguments to pass to script. Optional if scripts don't expect any arguments. Default: `[]` | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------- | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Script result | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, executeScript} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - init(basePath) - // Start emulator - await emulator.start() - - // Define arguments we want to pass - const args = ["Hello, from Cadence"] - - // We assume there is a file `scripts/log-message.cdc` under base path - const [result, error, logs] = await executeScript("log-message", args) - console.log({result}, {error}, {logs}) - - await emulator.stop() -} - -main() -``` diff --git a/docs/tools/flow-js-testing/flow-token.md b/docs/tools/flow-js-testing/flow-token.md deleted file mode 100644 index 748ff1c06e..0000000000 --- a/docs/tools/flow-js-testing/flow-token.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: FLOW Token Management -sidebar_label: FLOW Token -description: How to mint FLOW Token ---- - -Some actions on the network will require an account to have a certain amount of FLOW (tokens) - transaction and storage fees, account creation, etc. -Framework provides a method to query FLOW balances with `getFlowBalance` and mint new tokens via `mintFlow`. - -## `getFlowBalance(address)` - -Returns current FLOW token balance of the specified account. - -#### Arguments - -| Name | Type | Description | -| --------- | ------------------------------------------------------------- | ------------------------------- | -| `address` | [Address](../clients/fcl-js/api.md#address) | address of the account to check | - -#### Returns - -| Type | Description | -| -------- | ------------------------------------------------------ | -| `string` | UFix64 amount of FLOW tokens stored in account storage | - -#### Usage - -```javascript -import { - init, - emulator, - getAccountAddress, - getFlowBalance, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - const Alice = await getAccountAddress("Alice") - - const [result, error] = await getFlowBalance(Alice) - console.log(result, error) - - await emulator.stop() -} - -main() -``` - -## `mintFlow(recipient, amount)` - -Sends transaction to mint the specified amount of FLOW and send it to recipient. - -> ⚠️ **Required:** Framework shall be initialized with `init` method for this method to work. - -#### Arguments - -| Name | Type | Description | -| ----------- | ------------------------------------------------------------- | ---------------------------------------------------------- | -| `recipient` | [Address](../clients/fcl-js/api.md#address) | address of the account to check | -| `amount` | string | UFix64 amount of FLOW tokens to mint and send to recipient | - -#### Usage - -```javascript -import {init, emulator, mintFlow} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - const Alice = await getAccountAddress("Alice") - const amount = "42.0" - const [mintResult, error] = await mintFlow(Alice) - console.log(mintResult, error) - - await emulator.stop() -} - -main() -``` diff --git a/docs/tools/flow-js-testing/generator.md b/docs/tools/flow-js-testing/generator.md deleted file mode 100644 index e8afdae43c..0000000000 --- a/docs/tools/flow-js-testing/generator.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Bootstrap Framework -sidebar_label: Bootstrap Framework -description: How to quickly init testing environment ---- - -### Init Testing Environment - -Bootstrap your testing environment with a single command: - -```shell -npx flow-js-testing init -``` - -When you run this command in the terminal it will initiate npm package in your current directory and create `package.json` file. -Then it will install dependencies. After the installation is finished, the utility will create the required config files for Babel, Jest and Flow CLI. - -> ⚠️ **Warning:** This command will overwrite `babel.config.sj`, `jest.config.js` and `flow.json` files in the folder, where -> it would be executed and also could affect your `package.json` file. That's why we advise you to use new empty folder -> to contain your Cadence related tests. - -### Generate New Test Suite - -Create a test suite file for your project with all necessary imports and setup for describe blocks. -You can start writing your asserts and expectations right away: - -```shell -npx flow-js-testing make [name] -``` - -#### Flags - -| Name | Description | -| --------------------- | ------------------------------------ | -| `-c` or `--clear` | Exclude comments from test suit code | -| `-b` or `--base-path` | Specify base path to Cadence folder | - -If you do not specify `name` as second argument, the tool will give your file a unique name. diff --git a/docs/tools/flow-js-testing/index.md b/docs/tools/flow-js-testing/index.md deleted file mode 100644 index 649546158e..0000000000 --- a/docs/tools/flow-js-testing/index.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Flow Javascript Testing -description: A Javascript Framework allowing you to test your Cadence code in a simple way ---- - -### The Problem - -Writing smart contracts can be complex. With the help of the Cadence language server you can catch some simple bugs during development - wrong types, spelling errors, etc. Checking interaction behaviour is harder. It's not uncommon that smart contract and integration testing engineers are two different people and thus this can create additional friction for your project. - -### The Solution - -Flow Javascript Testing Framework aims to reduce said complexity by providing a set of helpful methods allowing -you easily: - -- [Start and stop new emulator instance](./emulator.md) -- [Deploy contracts](./contracts.md) -- [Create new accounts](./accounts.md) -- [Send transactions](./send-transactions.md) -- [Execute scripts](./execute-scripts.md) -- [query balances and mint FLOW for specific account](./flow-token.md) - -Framework will handle creating and managing the private keys you need to sign transactions, and try to automatically resolve import statements (provided, that necessary contracts deployed), so you can focus on writing Cadence code. - -## Which testing library to choose? - -Some examples provided in this documentation are using Jest to highlight the process, but most of the methods in -framework are agnostic of any other testing library - except for the ones using Jest explicitly. So you can use whatever you feel more comfortable with. - -## Installation - -Follow [these steps](./install.md) to add framework to your project. diff --git a/docs/tools/flow-js-testing/init.md b/docs/tools/flow-js-testing/init.md deleted file mode 100644 index 2751c4204f..0000000000 --- a/docs/tools/flow-js-testing/init.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Init Framework -sidebar_label: Init -description: How to init framework ---- - -For Framework to operate properly you need to initialize it first. -You can do it with provided `init` method. - -### init( basePath, options) - -Initializes framework variables. - -#### Arguments - -| Name | Type | Optional | Description | -| ---------- | ------ | -------- | ----------------------------------------------------- | -| `basePath` | string | | path to the folder holding all Cadence template files | -| `options` | object | ✅ | options object to use during initialization | - -#### Options - -| Name | Type | Optional | Description | -| ------ | ---- | -------- | ------------------------------- | -| `pkey` | | ✅ | private key for service account | - -#### Usage - -```javascript -import path from "path" -import {init} from "@onflow/flow-js-testing" - -describe("test setup", () => { - beforeEach(async () => { - const basePath = path.resolve(__dirname, "../cadence") - await init(basePath) - - // alternatively you can pass specific port - // await init(basePath, {port: 8085}) - }) -}) -``` diff --git a/docs/tools/flow-js-testing/install.md b/docs/tools/flow-js-testing/install.md deleted file mode 100644 index 48b6ff0562..0000000000 --- a/docs/tools/flow-js-testing/install.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Install Flow Javascript Testing Framework -description: How to install the Flow command-line interface (CLI) ---- - -# Installation - -It's possible to install Flow Javacript Testing Framework manually and automatically, using generator. - -## Automatic Installation (via npx) - -Create new folder and move into it: - -```shell -mkdir test && cd ./test -``` - -Install `@onflow/flow-js-testing` - -```shell -npm install @onflow/flow-js-testing -``` - -Generate complete setup via `init` call: - -```shell -npx flow-js-testing init -``` - -Create new test suit via `make` call, specifying the name of the suit: - -```shell -npx flow-js-testing make basic-test -``` - -## Manual Installation - -If, for some reason, you would want to do this manually here's what you need to do. - -Create new folder and move into it: - -```shell -mkdir test && cd ./test -``` - -Initiate a project in that folder with: - -```shell -npm init -``` - -Then install all necessary packages by running following command: - -```shell -npm install @onflow/flow-js-testing jest @babel/core @babel/preset-env babel-jest -``` - -If your project _is_ JavaScript based, then run the above command from the folder that contains your project's `package.json` file. - -### Jest Config - -You'll need to configure Jest in order for tests to work properly. -Add `jest.config.json` file next to `package.json` and populate it with: - -```json -{ - "testEnvironment": "node", - "verbose": true, - "coveragePathIgnorePatterns": ["/node_modules/"], - "testTimeout": 50000 -} -``` - -### Babel Config - -Similarly, create `babel.config.json` then copy and paste the following configuration: - -```json -{ - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "node": "current" - } - } - ] - ] -} -``` diff --git a/docs/tools/flow-js-testing/jest-helpers.md b/docs/tools/flow-js-testing/jest-helpers.md deleted file mode 100644 index 89fb262472..0000000000 --- a/docs/tools/flow-js-testing/jest-helpers.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -title: Jest Helpers -sidebar_label: Jest Helpers -description: Helper methods for Jest ---- - -In order to simplify the process even further we've created several Jest-based methods, which will help you to catch -thrown errors and ensure your code works as intended. - -## `shallPass(ix)` - -Ensure transaction did not throw and was sealed. - -#### Arguments - -| Name | Type | Description | -| ---- | ----------------------------------- | ---------------------------------------------------- | -| `ix` | [Interaction](./api.md#interaction) | interaction, either in form of a Promise or function | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Transaction result | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - shallPass, - sendTransaction, - getAccountAddress, -} from "@onflow/flow-js-testing" - -// We need to set timeout for a higher number, because some transactions might take up some time -jest.setTimeout(10000) - -describe("interactions - sendTransaction", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "./cadence") - await init(basePath) - return emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - return emulator.stop() - }) - - test("basic transaction", async () => { - const code = ` - transaction(message: String){ - prepare(singer: &Account){ - log(message) - } - } - ` - const Alice = await getAccountAddress("Alice") - const signers = [Alice] - const args = ["Hello, Cadence"] - - const [txResult, error] = await shallPass( - sendTransaction({ - code, - signers, - args, - }) - ) - - // Transaction result will hold status, events and error message - console.log(txResult, error) - }) -}) -``` - -## shallRevert(ix, message) - -Ensure interaction throws an error. Can test for specific error messages or catch any error message if `message` is not provided. -Returns Promise, which contains result, when resolved. - -#### Arguments - -| Name | Type | Description | -| ------------------------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| `ix` | [Interaction](./api.md#interaction) | transaction, either in form of a Promise or function | -| `message` **(optional)** | `string` or `RegExp` | expected error message provided as either a string equality or regular expression to match, matches any error by default | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Transaction result | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - shallPass, - sendTransaction, - getAccountAddress, -} from "js-testing-framework" - -// We need to set timeout for a higher number, cause some interactions might need more time -jest.setTimeout(10000) - -describe("interactions - sendTransaction", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "./cadence") - await init(basePath) - return emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - return emulator.stop() - }) - - test("basic transaction", async () => { - const code = ` - transaction(message: String){ - prepare(singer: &Account){ - panic("You shall not pass!") - } - } - ` - const Alice = await getAccountAddress("Alice") - const signers = [Alice] - const args = ["Hello, Cadence"] - - const [txResult, error] = await shallRevert( - sendTransaction({ - code, - signers, - args, - }) - ) - - // Transaction result will hold status, events and error message - console.log(txResult, error) - }) -}) -``` - -## shallResolve(ix) - -Ensure interaction resolves without throwing errors. - -#### Arguments - -| Name | Type | Description | -| ---- | ----------------------------------- | ---------------------------------------------------- | -| `ix` | [Interaction](./api.md#interaction) | interaction, either in form of a Promise or function | - -#### Returns - -| Type | Description | -| --------------------------------------------------------------------------- | ------------------ | -| [ResponseObject](../clients/fcl-js/api.md#responseobject) | Transaction result | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, shallPass, executeScript} from "js-testing-framework" - -// We need to set timeout for a higher number, cause some interactions might need more time -jest.setTimeout(10000) - -describe("interactions - sendTransaction", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "./cadence") - await init(basePath) - return emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - return emulator.stop() - }) - - test("basic script", async () => { - const code = ` - access(all) fun main():Int{ - return 42 - } - ` - - const [result, error] = await shallResolve( - executeScript({ - code, - }) - ) - - expect(result).toBe(42) - expect(error).toBe(null) - }) -}) -``` - -## shallHavePath(account, path) - -Asserts that the given account has the given path enabled. - -#### Arguments - -| Name | Type | Description | -| --------- | -------- | --------------------------------------------------------- | -| `account` | `string` | The address or name of the account to check for the path. | -| `path` | `string` | The path to check for. | - -#### Returns - -| Type | Description | -| --------------- | --------------------------------------------------------------------------------------------- | -| `Promise` | A Promise that resolves when the assertion is complete, or rejects with an error if it fails. | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, shallPass, executeScript} from "js-testing-framework" - -// We need to set timeout for a higher number, cause some interactions might need more time -jest.setTimeout(10000) - -describe("interactions - sendTransaction", () => { - // Instantiate emulator and path to Cadence files - beforeEach(async () => { - const basePath = path.resolve(__dirname, "./cadence") - await init(basePath) - return emulator.start() - }) - - // Stop emulator, so it could be restarted - afterEach(async () => { - return emulator.stop() - }) - - describe("check path with Jest helper", () => { - test("pass account address", async () => { - const Alice = await getAccountAddress("Alice") - await shallHavePath(Alice, "/storage/flowTokenVault") - }) - - test("pass account name", async () => { - await shallHavePath("Alice", "/storage/flowTokenVault") - }) - }) -}) -``` - -## shallHaveStorageValue(account, params) - -Asserts that the given account has the expected storage value at the given path. - -#### Arguments - -| Name | Type | Description | -| ----------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------ | -| `account` | `string` | The address or name of the account to check for the storage value. | -| `params` | `{pathName: string, key?: string, expect: any}` | An object containing the path name, optional key, and expected value of the storage at the given path. | -| `params.pathName` | `string` | The path of the storage value to retrieve. | -| `params.key` | `string` (optional) | The key of the value to retrieve from the storage at the given path, if applicable. | -| `expect` | `any` | The expected value of the storage at the given path and key (if applicable). | - -#### Returns - -| Type | Description | -| --------------- | --------------------------------------------------------------------------------------------- | -| `Promise` | A Promise that resolves when the assertion is complete, or rejects with an error if it fails. | diff --git a/docs/tools/flow-js-testing/send-transactions.md b/docs/tools/flow-js-testing/send-transactions.md deleted file mode 100644 index 702c87121c..0000000000 --- a/docs/tools/flow-js-testing/send-transactions.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Send Transactions -sidebar_label: Send Transactions -description: How to send transactions ---- - -Another common case is interactions that mutate network state - sending tokens from one account to another, minting new NFT, etc. Framework provides `sendTransaction` method to achieve this. This method have 2 different signatures. - -> ⚠️ **Required:** Your project must follow the [required structure](./structure.md) it must be [initialized](./init.md) to use the following functions. - -## `sendTransaction(props)` - -Send transaction to network. -Provides explicit control over how you pass values. - -#### Arguments - -`props` object accepts following fields: - -| Name | Type | Optional | Description | -| -------------- | ---------------------------------------------------------------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `code` | string | ✅ | string representation of Cadence transaction | -| `name` | string | ✅ | name of the file in `transaction` folder to use (sans `.cdc` extension) | -| `args` | [any] | ✅ | an array of arguments to pass to transaction. Optional if transaction does not expect any arguments. | -| `signers` | [[Address](../clients/fcl-js/api.md#address) or [SignerInfo](./api.md#signerinfoobject)] | ✅ | an array of [Address](../clients/fcl-js/api.md#address) or [SignerInfo](./api.md#signerinfoobject) objects representing transaction autorizers | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | name/address map to use as lookup table for addresses in import statements | -| `transformers` | [[CadenceTransformer](./api.md#cadencetransformer)] | ✅ | an array of operators to modify the code, before submitting it to network | - -> ⚠️ **Required:** Either `code` or `name` field shall be specified. Method will throw an error if both of them are empty. -> If `name` field provided, framework will source code from file and override value passed via `code` field. - -> 📣 if `signers` field not provided, service account will be used to authorize the transaction. - -> 📣 Pass `addressMap` only in cases, when you would want to override deployed contract. Otherwide -> imports can be resolved automatically without explicitly passing them via `addressMap` field - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - sendTransaction, - getAccountAddress, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - await init(basePath) - // Start emulator - await emulator.start() - - // Define code and arguments we want to pass - const code = ` - transaction(message: String){ - prepare(signer: &Account){ - log(message) - } - } - ` - const args = ["Hello, from Cadence"] - const Alice = await getAccountAddress("Alice") - const signers = [Alice] - - const [result, error] = await sendTransaction({code, args, signers}) - console.log({result}, {error}) - - // Stop emulator instance - await emulator.stop() -} - -main() -``` - -## `sendTransaction(name, signers, args)` - -This signature provides simplified way to send a transaction, since most of the time you will utilize existing -Cadence files. - -| Name | Type | Optional | Description | -| --------- | ---------------------------------------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | string | ✅ | name of the file in `transaction` folder to use (sans `.cdc` extension) | -| `args` | [any] | ✅ | an array of arguments to pass to transaction. Optional if transaction does not expect any arguments. | -| `signers` | [[Address](../clients/fcl-js/api.md#address) or [SignerInfoObject](./api.md#signerinfoobject)] | ✅ | an array of [Address](../clients/fcl-js/api.md#address) or array of [SignerInfoObject](./api.md#signerinfoobject) representing transaction autorizers | - -#### Usage - -```javascript -import path from "path" -import { - init, - emulator, - sendTransaction, - shallPass, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - // Init framework - await init(basePath) - // Start emulator - await emulator.start() - - // Define arguments we want to pass - const args = ["Hello, Cadence"] - - const [result, error, logs] = await shallPass( - sendTransaction("log-message", [], args) - ) - console.log({result}, {error}, {logs}) - - // Stop the emulator instance - await emulator.stop() -} - -main() -``` diff --git a/docs/tools/flow-js-testing/structure.md b/docs/tools/flow-js-testing/structure.md deleted file mode 100644 index 9a673251df..0000000000 --- a/docs/tools/flow-js-testing/structure.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Folder Structure -sidebar_label: Folder Structure -description: How to structure your Cadence files ---- - -Currently, Framework expects a specific hierarchy of files inside your base directory. -There are no rules that enforce the name of the base directory, but there should be 3 folders inside with names: - -- `contracts` -- `transactions` -- `scripts` - -Each of those folders shall store corresponding templates types, i.e. `contracts` folder stores contract templates. - -You can have nested folders inside them, but templates in each of those root folders would be treated as of certain -type. - -## Usage - -#### File is in the root of `scripts` folder - -For this simple case you just need to specify name of the file - -```javascript -// Let's assume your base folder is one level above your test -const basePath = path.resolve("../cadence") -const [result, error] = await executeScript("log-message") -``` - -#### File is in nested folder - -Let's assume template you want to execute is in `scripts/utility/log-message` -In this case you will need to provide a path relative to `scripts` folder (no `/` prefix needed) - -```javascript -// Let's assume your base folder is one level above your test -const basePath = path.resolve("../cadence") -const [result, error] = await executeScript("utility/log-message") -``` diff --git a/docs/tools/flow-js-testing/templates.md b/docs/tools/flow-js-testing/templates.md deleted file mode 100644 index 5e68e23cd2..0000000000 --- a/docs/tools/flow-js-testing/templates.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -title: Template Code -sidebar_label: Templates -description: How to manage load Cadence template code ---- - -The Flow JS Testing Framework is essentially a set of helper methods. They can be used in an -opinionated way, envisioned by Flow Team. Or they can work as building blocks, allowing developers to build their own -testing solution as they see fit. Following methods used inside other framework methods, but we feel encouraged to list -them here as well. - -## `getTemplate(file, addressMap, byAddress)` - -Returns Cadence template as string with addresses replaced using addressMap - -| Name | Type | Optional | Description | -| ------------ | --------------------------------- | -------- | --------------------------------------------------------------------------------------------------------- | -| `file` | string | | relative (to the place from where the script was called) or absolute path to the file containing the code | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for address mapping of existing deployed contracts. Default: `{}` | -| `byAddress` | boolean | ✅ | whether addressMap is `{name:address}` or `{address:address}` type. Default: `false` | - -#### Returns - -| Type | Description | -| ------ | --------------------------- | -| string | content of a specified file | - -#### Usage - -```javascript -import path from "path" -import {init, getTemplate} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - init(basePath) - - const template = await getTemplate("../cadence/scripts/get-name.cdc") - console.log({template}) -} - -main() -``` - -## `getContractCode(name, addressMap)` - -Returns Cadence template from file with `name` in `_basepath_/contracts` folder - -#### Arguments - -| Name | Type | Optional | Description | -| ------------ | --------------------------------- | -------- | ---------------------------------------------------------------- | -| `name` | string | | name of the contract template | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for address mapping of existing deployed contracts | - -#### Returns - -| Type | Description | -| ------ | -------------------------------------------- | -| string | Cadence template code for specified contract | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, getContractCode} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Let's assume we need to import MessageContract - await deployContractByName({name: "MessageContract"}) - const MessageContract = await getContractAddress("MessageContract") - const addressMap = {MessageContract} - - const contractTemplate = await getContractCode("HelloWorld", { - MessageContract, - }) - console.log({contractTemplate}) - - await emulator.stop() -} - -main() -``` - -## `getTransactionCode(name, addressMap)` - -Returns Cadence template from file with `name` in `_basepath_/transactions` folder - -#### Arguments - -| Name | Type | Optional | Description | -| ------------ | --------------------------------- | -------- | ---------------------------------------------------------------- | -| `name` | string | | name of the transaction template | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for address mapping of existing deployed contracts | - -#### Returns - -| Type | Description | -| ------ | ----------------------------------------------- | -| string | Cadence template code for specified transaction | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, getTransactionCode} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Let's assume we need to import MessageContract - await deployContractByName({name: "MessageContract"}) - const MessageContract = await getContractAddress("MessageContract") - const addressMap = {MessageContract} - - const txTemplate = await getTransactionCode({ - name: "set-message", - addressMap, - }) - console.log({txTemplate}) - - await emulator.stop() -} - -main() -``` - -## `getScriptCode(name, addressMap)` - -Returns Cadence template from file with `name` in `_basepath_/scripts` folder - -#### Arguments - -| Name | Type | Optional | Description | -| ------------ | --------------------------------- | -------- | ---------------------------------------------------------------- | -| `name` | string | | name of the script template | -| `addressMap` | [AddressMap](./api.md#addressmap) | ✅ | object to use for address mapping of existing deployed contracts | - -#### Returns - -| Type | Description | -| ------ | ------------------------------------------ | -| string | Cadence template code for specified script | - -#### Usage - -```javascript -import path from "path" -import {init, emulator, getScriptCode} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - - await init(basePath) - await emulator.start() - - // Let's assume we need to import MessageContract - await deployContractByName({name: "MessageContract"}) - const MessageContract = await getContractAddress("MessageContract") - const addressMap = {MessageContract} - - const scriptTemplate = await getScriptCode({ - name: "get-message", - addressMap, - }) - - console.log({scriptTemplate}) - await emulator.stop() -} - -main() -``` - -## Examples - -If you don't have any contract dependencies, you can use those methods without specifying address map as second parameter. - -```javascript -import path from "path" -import { - init, - getContractCode, - getTransactionCode, - getScriptCode, -} from "@onflow/flow-js-testing" - -const main = async () => { - const basePath = path.resolve(__dirname, "../cadence") - await init(basePath) - - const contractWallet = await getContractCode({name: "Wallet"}) - const txGetCapability = await getTransactionCode({name: "get-capability"}) - const scriptGetBalance = await getScriptCode({name: "get-balance"}) - - console.log({contractWallet, txGetCapability, scriptGetBalance}) -} -main() -``` diff --git a/docs/tools/flow-js-testing/types.md b/docs/tools/flow-js-testing/types.md deleted file mode 100644 index eec7dd5a8e..0000000000 --- a/docs/tools/flow-js-testing/types.md +++ /dev/null @@ -1,28 +0,0 @@ -### `AddressMap` - -Object to use for address mapping of existing deployed contracts. Key shall be `string` and value shall be [Address](../clients/fcl-js/api.md#address) - -#### Example - -```javascript -const addressMap = { - Messanger: "0x01cf0e2f2f715450", - Logger: "0x179b6b1cb6755e31", -} -``` - -### `Interaction` - -Interaction is a Promise or function returning a promise. - -#### Example - -```javascript -const ix = async () => { - return new Promise((resolve, reject) => { - setTimeout(() => { - resolve(1337) - }) - }, 500) -} -``` diff --git a/docs/tools/nft-catalog/index.mdx b/docs/tools/nft-catalog/index.mdx deleted file mode 100644 index f6830659cb..0000000000 --- a/docs/tools/nft-catalog/index.mdx +++ /dev/null @@ -1,873 +0,0 @@ ---- -title: NFT Catalog -sidebar_label: NFT Catalog -description: The NFT Catalog is an on chain registry listing NFT collections that exists on Flow which adhere to the NFT metadata standard. ---- - - - -The NFT Catalog is in the process of being deprecated. -You can still use it for existing collections in the Catalog, -but no new collections will be added from now on. -Most of the functionality that the Catalog provided is now required -and handled by default by the NonFungibleToken standard with Metadata Views. - -Additionally, [TokenList](https://token-list.fixes.world) is a new permissionless tool that -provides some of the old aggregation functionality that NFT Catalog -provided without requiring approvals. - - - -The NFT Catalog is an on chain registry listing NFT collections -that exists on Flow which adhere to the NFT metadata standard. -This empowers dApp developers to easily build on top of -and discover interoperable NFT collections on Flow. - -## Live Site - -Checkout the catalog [site](https://www.flow-nft-catalog.com/) - -## Contract Addresses - -`NFTCatalog.cdc`: This contract contains the NFT Catalog - -| Network | Address | -| ------- | ------------------ | -| Mainnet | 0x49a7cda3a1eecc29 | -| Testnet | 0x324c34e1c517e4db | - -`NFTRetrieval.cdc`: This contract contains helper functions to make it easier to discover NFTs within accounts and from the catalog - -| Network | Address | -| ------- | ------------------ | -| Mainnet | 0x49a7cda3a1eecc29 | -| Testnet | 0x324c34e1c517e4db | - -## Using the Catalog (For marketplaces and other NFT applications) - -All of the below examples use the catalog in mainnet, you may replace the imports to the testnet address when using the testnet network. - -**Example 1 - Retrieve all NFT collections on the catalog** - -```cadence -import NFTCatalog from 0x49a7cda3a1eecc29 - -/* - The catalog is returned as a `String: NFTCatalogMetadata` - The key string is intended to be a unique identifier for a specific collection. - The NFTCatalogMetadata contains collection-level views corresponding to each - collection identifier. -*/ -access(all) fun main(): {String : NFTCatalog.NFTCatalogMetadata} { - return NFTCatalog.getCatalog() - -} -``` - -**Example 2 - Retrieve all collection names in the catalog** - -```cadence -import NFTCatalog from 0x49a7cda3a1eecc29 - -access(all) fun main(): [String] { - let catalog: {String : NFTCatalog.NFTCatalogMetadata} = NFTCatalog.getCatalog() - let catalogNames: [String] = [] - for collectionIdentifier in catalog.keys { - catalogNames.append(catalog[collectionIdentifier]!.collectionDisplay.name) - } - return catalogNames -} -``` - -**Example 3 - Retrieve NFT collections and counts owned by an account** - -```cadence -import MetadataViews from 0x1d7e57aa55817448 -import NFTCatalog from 0x49a7cda3a1eecc29 -import NFTRetrieval from 0x49a7cda3a1eecc29 - -access(all) fun main(ownerAddress: Address) : {String : Number} { - let catalog = NFTCatalog.getCatalog() - let account = getAuthAccount(ownerAddress) - let items : {String : Number} = {} - - for key in catalog.keys { - let value = catalog[key]! - let tempPathStr = "catalog".concat(key) - let tempPublicPath = PublicPath(identifier: tempPathStr)! - account.link<&{MetadataViews.ResolverCollection}>( - tempPublicPath, - target: value.collectionData.storagePath - ) - let collectionCap = account.capabilities.get<&{MetadataViews.ResolverCollection}>(tempPublicPath) - if !collectionCap.check() { - continue - } - let count = NFTRetrieval.getNFTCountFromCap(collectionIdentifier : key, collectionCap : collectionCap) - if count != 0 { - items[key] = count - } - } - - return items -} -``` - -`Sample Response...` - -```text -{ - "schmoes_prelaunch_token": 1 -} -``` - -**Example 4 - Retrieve all NFTs including metadata owned by an account** - -```cadence -import MetadataViews from 0x1d7e57aa55817448 -import NFTCatalog from 0x49a7cda3a1eecc29 -import NFTRetrieval from 0x49a7cda3a1eecc29 - -access(all) struct NFT { - access(all) let id : UInt64 - access(all) let name : String - access(all) let description : String - access(all) let thumbnail : String - access(all) let externalURL : String - access(all) let storagePath : StoragePath - access(all) let publicPath : PublicPath - access(all) let privatePath: PrivatePath - access(all) let publicLinkedType: Type - access(all) let privateLinkedType: Type - access(all) let collectionName : String - access(all) let collectionDescription: String - access(all) let collectionSquareImage : String - access(all) let collectionBannerImage : String - access(all) let royalties: [MetadataViews.Royalty] - - init( - id: UInt64, - name : String, - description : String, - thumbnail : String, - externalURL : String, - storagePath : StoragePath, - publicPath : PublicPath, - privatePath : PrivatePath, - publicLinkedType : Type, - privateLinkedType : Type, - collectionIdentifier: String, - collectionName : String, - collectionDescription : String, - collectionSquareImage : String, - collectionBannerImage : String, - royalties : [MetadataViews.Royalty] - ) { - self.id = id - self.name = name - self.description = description - self.thumbnail = thumbnail - self.externalURL = externalURL - self.storagePath = storagePath - self.publicPath = publicPath - self.privatePath = privatePath - self.publicLinkedType = publicLinkedType - self.privateLinkedType = privateLinkedType - self.collectionIdentifier = collectionIdentifier - self.collectionName = collectionName - self.collectionDescription = collectionDescription - self.collectionSquareImage = collectionSquareImage - self.collectionBannerImage = collectionBannerImage - self.royalties = royalties - } -} - -access(all) fun main(ownerAddress: Address) : { String : [NFT] } { - let catalog = NFTCatalog.getCatalog() - let account = getAuthAccount(ownerAddress) - let items : [NFTRetrieval.BaseNFTViewsV1] = [] - - let data : {String : [NFT] } = {} - - for key in catalog.keys { - let value = catalog[key]! - let tempPathStr = "catalog".concat(key) - let tempPublicPath = PublicPath(identifier: tempPathStr)! - let newCap = account.capabilities.issue<&{MetadataViews.ResolverCollection}> - (value.collectionData.storagePath) - account.capabilities.publish(newCap, tempPublicPath) - - let collectionCap = account.capabilities.get<&{MetadataViews.ResolverCollection}>(tempPublicPath) - if !collectionCap.check() { - continue - } - let views = NFTRetrieval.getNFTViewsFromCap(collectionIdentifier : key, collectionCap : collectionCap) - - let items : [NFT] = [] - for view in views { - let displayView = view.display - let externalURLView = view.externalURL - let collectionDataView = view.collectionData - let collectionDisplayView = view.collectionDisplay - let royaltyView = view.royalties - if (displayView == nil || externalURLView == nil || collectionDataView == nil || collectionDisplayView == nil || royaltyView == nil) { - // This NFT does not have the proper views implemented. Skipping.... - continue - } - - items.append( - NFT( - id: view.id, - name : displayView!.name, - description : displayView!.description, - thumbnail : displayView!.thumbnail.uri(), - externalURL : externalURLView!.url, - storagePath : collectionDataView!.storagePath, - publicPath : collectionDataView!.publicPath, - privatePath : collectionDataView!.providerPath, - publicLinkedType : collectionDataView!.publicLinkedType, - privateLinkedType : collectionDataView!.providerLinkedType, - collectionIdentifier: key, - collectionName : collectionDisplayView!.name, - collectionDescription : collectionDisplayView!.description, - collectionSquareImage : collectionDisplayView!.squareImage.file.uri(), - collectionBannerImage : collectionDisplayView!.bannerImage.file.uri(), - royalties : royaltyView!.getRoyalties() - ) - ) - } - data[key] = items - } - return data -} -``` - -`Sample Response...` - -```text -{ - "FlovatarComponent": [], - "schmoes_prelaunch_token": [ - s.aa16be98aac20e8073f923261531cbbdfae1464f570f5be796b57cdc97656248.NFT( - id: 1006, - name: "Schmoes Pre Launch Token #1006", - description: "", - thumbnail: "https://gateway.pinata.cloud/ipfs/QmXQ1iBke5wjcjYG22ACVXsCvtMJKEkwFiMf96UChP8uJq", - externalURL: "https://schmoes.io", - storagePath: /storage/SchmoesPreLaunchTokenCollection, - publicPath: /public/SchmoesPreLaunchTokenCollection, - privatePath: /private/SchmoesPreLaunchTokenCollection, - publicLinkedType: Type<&A.6c4fe48768523577.SchmoesPreLaunchToken.Collection{A.1d7e57aa55817448.NonFungibleToken.CollectionPublic,A. 1d7e57aa55817448.NonFungibleToken.Receiver,A.1d7e57aa55817448.MetadataViews.ResolverCollection}>(), - privateLinkedType: Type<&A.6c4fe48768523577.SchmoesPreLaunchToken.Collection{A.1d7e57aa55817448.NonFungibleToken.CollectionPublic,A.1d7e57aa55817448.NonFungibleToken.Provider,A.1d7e57aa55817448.MetadataViews.ResolverCollection}>(), - collectionName: "Schmoes Pre Launch Token", - collectionDescription: "", - collectionSquareImage: "https://gateway.pinata.cloud/ipfs/QmXQ1iBke5wjcjYG22ACVXsCvtMJKEkwFiMf96UChP8uJq", - collectionBannerImage: "https://gateway.pinata.cloud/ipfs/QmXQ1iBke5wjcjYG22ACVXsCvtMJKEkwFiMf96UChP8uJq", - royalties: [] - ) - ], - "Flovatar": [] -} -``` - -**Example 5 - Retrieve all NFTs including metadata owned by an account for large wallets** - -For Wallets that have a lot of NFTs you may run into memory issues. The common pattern to get around this for now is to retrieve just the ID's in a wallet by calling the following script - -```cadence -import MetadataViews from 0x1d7e57aa55817448 -import NFTCatalog from 0x49a7cda3a1eecc29 -import NFTRetrieval from 0x49a7cda3a1eecc29 - -access(all) fun main(ownerAddress: Address) : {String : [UInt64]} { - let catalog = NFTCatalog.getCatalog() - let account = getAuthAccount(ownerAddress) - - let items : {String : [UInt64]} = {} - - for key in catalog.keys { - let value = catalog[key]! - let tempPathStr = "catalogIDs".concat(key) - let tempPublicPath = PublicPath(identifier: tempPathStr)! - let newCap = account.capabilities.issue<&{MetadataViews.ResolverCollection}> - (value.collectionData.storagePath) - account.capabilities.publish(newCap, tempPublicPath) - - let collectionCap = account.capabilities.get<&{MetadataViews.ResolverCollection}>(tempPublicPath) - if !collectionCap.check() { - continue - } - - let ids = NFTRetrieval.getNFTIDsFromCap(collectionIdentifier : key, collectionCap : collectionCap) - - if ids.length > 0 { - items[key] = ids - } - } - return items - -} -``` - -and then use the ids to retrieve the full metadata for only those ids by calling the following script and passing in a map of collectlionIdentifer -> [ids] - -```cadence -import MetadataViews from 0x1d7e57aa55817448 -import NFTCatalog from 0x49a7cda3a1eecc29 -import NFTRetrieval from 0x49a7cda3a1eecc29 - -access(all) struct NFT { - access(all) let id : UInt64 - access(all) let name : String - access(all) let description : String - access(all) let thumbnail : String - access(all) let externalURL : String - access(all) let storagePath : StoragePath - access(all) let publicPath : PublicPath - access(all) let privatePath: PrivatePath - access(all) let publicLinkedType: Type - access(all) let privateLinkedType: Type - access(all) let collectionName : String - access(all) let collectionDescription: String - access(all) let collectionSquareImage : String - access(all) let collectionBannerImage : String - access(all) let royalties: [MetadataViews.Royalty] - - init( - id: UInt64, - name : String, - description : String, - thumbnail : String, - externalURL : String, - storagePath : StoragePath, - publicPath : PublicPath, - privatePath : PrivatePath, - publicLinkedType : Type, - privateLinkedType : Type, - collectionName : String, - collectionDescription : String, - collectionSquareImage : String, - collectionBannerImage : String, - royalties : [MetadataViews.Royalty] - ) { - self.id = id - self.name = name - self.description = description - self.thumbnail = thumbnail - self.externalURL = externalURL - self.storagePath = storagePath - self.publicPath = publicPath - self.privatePath = privatePath - self.publicLinkedType = publicLinkedType - self.privateLinkedType = privateLinkedType - self.collectionName = collectionName - self.collectionDescription = collectionDescription - self.collectionSquareImage = collectionSquareImage - self.collectionBannerImage = collectionBannerImage - self.royalties = royalties - } -} - -access(all) fun main(ownerAddress: Address, collections: {String : [UInt64]}) : {String : [NFT] } { - let data : {String : [NFT] } = {} - - let catalog = NFTCatalog.getCatalog() - let account = getAuthAccount(ownerAddress) - for collectionIdentifier in collections.keys { - if catalog.containsKey(collectionIdentifier) { - let value = catalog[collectionIdentifier]! - let tempPathStr = "catalog".concat(collectionIdentifier) - let tempPublicPath = PublicPath(identifier: tempPathStr)! - let newCap = account.capabilities.issue<&{MetadataViews.ResolverCollection}> - (value.collectionData.storagePath) - account.capabilities.publish(newCap, tempPublicPath) - - let collectionCap = account.capabilities.get<&{MetadataViews.ResolverCollection}>(tempPublicPath) - - if !collectionCap.check() { - return data - } - - let views = NFTRetrieval.getNFTViewsFromIDs(collectionIdentifier : collectionIdentifier, ids: collections[collectionIdentifier]!, collectionCap : collectionCap) - - let items : [NFT] = [] - - for view in views { - let displayView = view.display - let externalURLView = view.externalURL - let collectionDataView = view.collectionData - let collectionDisplayView = view.collectionDisplay - let royaltyView = view.royalties - if (displayView == nil || externalURLView == nil || collectionDataView == nil || collectionDisplayView == nil || royaltyView == nil) { - // Bad NFT. Skipping.... - continue - } - - items.append( - NFT( - id: view.id, - name : displayView!.name, - description : displayView!.description, - thumbnail : displayView!.thumbnail.uri(), - externalURL : externalURLView!.url, - storagePath : collectionDataView!.storagePath, - publicPath : collectionDataView!.publicPath, - privatePath : collectionDataView!.providerPath, - publicLinkedType : collectionDataView!.publicLinkedType, - privateLinkedType : collectionDataView!.providerLinkedType, - collectionName : collectionDisplayView!.name, - collectionDescription : collectionDisplayView!.description, - collectionSquareImage : collectionDisplayView!.squareImage.file.uri(), - collectionBannerImage : collectionDisplayView!.bannerImage.file.uri(), - royalties : royaltyView!.getRoyalties() - ) - ) - } - - data[collectionIdentifier] = items - } - } - - - return data -} -``` - -**Example 6 - Retrieve all MetadataViews for NFTs in a wallet** - -If you're looking for some MetadataViews that aren't in the [core view list](https://github.com/onflow/flow-nft/blob/master/contracts/MetadataViews.cdc#L36) you can leverage this script to grab all the views each NFT supports. Note: You lose some typing here but get more data. - -```cadence -import MetadataViews from 0x1d7e57aa55817448 -import NFTCatalog from 0x49a7cda3a1eecc29 -import NFTRetrieval from 0x49a7cda3a1eecc29 - -access(all) struct NFTCollectionData { - access(all) let storagePath : StoragePath - access(all) let publicPath : PublicPath - access(all) let publicLinkedType: Type - - init( - storagePath : StoragePath, - publicPath : PublicPath, - publicLinkedType : Type, - ) { - self.storagePath = storagePath - self.publicPath = publicPath - self.publicLinkedType = publicLinkedType - } -} - -access(all) fun main(ownerAddress: Address) : { String : {String : AnyStruct} } { - let catalog = NFTCatalog.getCatalog() - let account = getAuthAccount(ownerAddress) - let items : [MetadataViews.NFTView] = [] - - let data : { String : {String : AnyStruct} } = {} - - for key in catalog.keys { - let value = catalog[key]! - let tempPathStr = "catalog".concat(key) - let tempPublicPath = PublicPath(identifier: tempPathStr)! - let newCap = account.capabilities.issue<&{MetadataViews.ResolverCollection}> - (value.collectionData.storagePath) - account.capabilities.publish(newCap, tempPublicPath) - let collectionCap = account.capabilities.get<&{MetadataViews.ResolverCollection}>(tempPublicPath) - if !collectionCap.check() { - continue - } - - var views = NFTRetrieval.getAllMetadataViewsFromCap(collectionIdentifier : key, collectionCap : collectionCap) - - if views.keys.length == 0 { - continue - } - - // Cadence doesn't support function return types, lets manually get rid of it - let nftCollectionDisplayView = views[Type().identifier] as! MetadataViews.NFTCollectionData? - let collectionDataView = NFTCollectionData( - storagePath : nftCollectionDisplayView!.storagePath, - publicPath : nftCollectionDisplayView!.publicPath, - publicLinkedType : nftCollectionDisplayView!.publicLinkedType, - ) - views.insert(key: Type().identifier, collectionDataView) - - data[key] = views - } - - return data -} -``` - -**Example 7 - Setup a user’s account to receive a specific collection** - -1. Run the following script to retrieve some collection-level information for an NFT collection identifier from the catalog - -```cadence -import MetadataViews from 0x1d7e57aa55817448 -import NFTCatalog from 0x49a7cda3a1eecc29 -import NFTRetrieval from 0x49a7cda3a1eecc29 - -access(all) struct NFTCollection { - access(all) let storagePath : StoragePath - access(all) let publicPath : PublicPath - access(all) let privatePath: PrivatePath - access(all) let publicLinkedType: Type - access(all) let privateLinkedType: Type - access(all) let collectionName : String - access(all) let collectionDescription: String - access(all) let collectionSquareImage : String - access(all) let collectionBannerImage : String - - init( - storagePath : StoragePath, - publicPath : PublicPath, - privatePath : PrivatePath, - publicLinkedType : Type, - privateLinkedType : Type, - collectionName : String, - collectionDescription : String, - collectionSquareImage : String, - collectionBannerImage : String - ) { - self.storagePath = storagePath - self.publicPath = publicPath - self.privatePath = privatePath - self.publicLinkedType = publicLinkedType - self.privateLinkedType = privateLinkedType - self.collectionName = collectionName - self.collectionDescription = collectionDescription - self.collectionSquareImage = collectionSquareImage - self.collectionBannerImage = collectionBannerImage - } -} - -access(all) fun main(collectionIdentifier : String) : NFT? { - let catalog = NFTCatalog.getCatalog() - - assert(catalog.containsKey(collectionIdentifier), message: "Invalid Collection") - - return NFTCollection( - storagePath : collectionDataView!.storagePath, - publicPath : collectionDataView!.publicPath, - privatePath : collectionDataView!.providerPath, - publicLinkedType : collectionDataView!.publicLinkedType, - privateLinkedType : collectionDataView!.providerLinkedType, - collectionName : collectionDisplayView!.name, - collectionDescription : collectionDisplayView!.description, - collectionSquareImage : collectionDisplayView!.squareImage.file.uri(), - collectionBannerImage : collectionDisplayView!.bannerImage.file.uri() - ) - } - - panic("Invalid Token ID") -} -``` - -2. This script result can then be used to form a transaction by inserting the relevant variables from above into a transaction template like the following: - -```cadence -import NonFungibleToken from 0x1d7e57aa55817448 -import MetadataViews from 0x1d7e57aa55817448 -{ADDITIONAL_IMPORTS} - -transaction { - - prepare(signer: auth(BorrowValue, IssueStorageCapabilityController, PublishCapability, SaveValue, UnpublishCapability) &Account) { - - let collectionData = {CONTRACT_NAME}.resolveContractView(resourceType: nil, viewType: Type()) as! MetadataViews.NFTCollectionData? - ?? panic("Could not resolve NFTCollectionData view. The {CONTRACT_NAME} contract needs to implement the NFTCollectionData Metadata view in order to execute this transaction") - - // Return early if the account already has a collection - if signer.storage.borrow<&{CONTRACT_NAME}.Collection>(from: collectionData.storagePath) != nil { - return - } - - // Create a new empty collection - let collection <- {CONTRACT_NAME}.createEmptyCollection(nftType: Type<@{CONTRACT_NAME}.NFT>()) - - // save it to the account - signer.storage.save(<-collection, to: collectionData.storagePath) - - // create a public capability for the collection - signer.capabilities.unpublish(collectionData.publicPath) - let collectionCap = signer.capabilities.storage.issue<&{CONTRACT_NAME}.Collection>(collectionData.storagePath) - signer.capabilities.publish(collectionCap, at: collectionData.publicPath) - } -} - -``` - -An even easier way to setup an account without relying -on the NFT Catalog is to just use the generic setup account transaction. -All you need is the name and address of the contract! -```cadence -import "NonFungibleToken" -import "MetadataViews" - -/// This transaction is what an account would run -/// to set itself up to receive NFTs. This function -/// uses views to know where to set up the collection -/// in storage and to create the empty collection. -/// -/// @param contractAddress: The address of the contract that defines the token being initialized -/// @param contractName: The name of the contract that defines the token being initialized. Ex: "ExampleNFT" - -transaction(contractAddress: Address, contractName: String) { - - prepare(signer: auth(IssueStorageCapabilityController, PublishCapability, SaveValue) &Account) { - // Borrow a reference to the nft contract deployed to the passed account - let resolverRef = getAccount(contractAddress) - .contracts.borrow<&{NonFungibleToken}>(name: contractName) - ?? panic("Could not borrow NonFungibleToken reference to the contract. Make sure the provided contract name (" - .concat(contractName).concat(") and address (").concat(contractAddress.toString()).concat(") are correct!")) - - // Use that reference to retrieve the NFTCollectionData view - let collectionData = resolverRef.resolveContractView(resourceType: nil, viewType: Type()) as! MetadataViews.NFTCollectionData? - ?? panic("Could not resolve NFTCollectionData view. The ".concat(contractName).concat(" contract needs to implement the NFTCollectionData Metadata view in order to execute this transaction")) - - // Create a new empty collections - let emptyCollection <- collectionData.createEmptyCollection() - - // save it to the account - signer.storage.save(<-emptyCollection, to: collectionData.storagePath) - - // create a public capability for the collection - let collectionCap = signer.capabilities.storage.issue<&{NonFungibleToken.Collection}>( - collectionData.storagePath - ) - signer.capabilities.publish(collectionCap, at: collectionData.publicPath) - } -} -``` - -## Developer Usage - -### 1. [Install the Flow CLI](https://github.com/onflow/flow-cli) - -### 2. [Install Node](https://nodejs.org/en/) - -### 3. Clone the project - -```sh -git clone --depth=1 https://github.com/onflow/nft-catalog.git -``` - -### 4. Install packages - -- Run `npm install` in the root of the project - -### 5. Run Test Suite - -- Run `npm test` in the root of the project - -## Cadence Generation - -Using the NFT Catalog, you can generate common scripts and transactions to be run against the Flow Blockchain to support your application. - -### Generate from Javascript - -#### Installation - -``` -npm install @onflow/fcl -npm install flow-catalog -``` - -or - -``` -yarn add @onflow/fcl -yarn add flow-catalog -``` - -#### Usage - -_1. Retrieve a list of transactions available for code generation:_ -NOTE: In order to properly bootstrap the method, you will need to run and `await` on the `getAddressMaps()` method, passing it into all of the methods as shown below. - -``` -import { getAddressMaps, scripts } from "flow-catalog"; -import * as fcl from "@onflow/fcl" - -const main = async () => { - const addressMap = await getAddressMaps(); - console.log(await scripts.getSupportedGeneratedTransactions(addressMap)); -}; - -main(); -``` - -_2. Provide a Catalog collection identifier to generate code_ - -``` -const getTemplatedTransactionCode = async function() { - const catalogAddressMap = await getAddressMaps() - const result = await cadence.scripts.genTx({ - - /* - 'CollectionInitialization' is one of the available transactions from step 1. - 'Flunks' is the collection identifier in this case - 'Flow' is a fungible token identifier (if applicable to the transaction being used) - */ - - args: ['CollectionInitialization', 'Flunks', 'flow'], - addressMap: catalogAddressMap - }) - return result -} -``` - -_3. Use the generated code in a transaction_ - -``` -const txId = await fcl.mutate({ - cadence: await getTemplatedTransactionCode()[0], - limit: 9999, - args: (arg: any, t: any) => [] -}); -const transaction = await fcl.tx(txId).onceSealed() -return transaction -``` - -### Generate from non-Javascript environments - -Cadence scripts and transactions can be generated directly on-chain via scripts. You will need to be able to run cadence scripts to continue. - -_1. Retrieve a list of transactions available for code generation_ - -Run the following script to retrieve available code generation methods: https://github.com/dapperlabs/nft-catalog/blob/main/cadence/scripts/get_supported_generated_transactions.cdc - -_2. Provide a catalog collection identifier to generate code_ - -You may use the following script to generate code: https://github.com/dapperlabs/nft-catalog/blob/main/cadence/scripts/gen_tx.cdc - -For example, from the CLI this may be run like the following: -`flow -n mainnet scripts execute ./get_tx.cdc CollectionInitialization Flunks flow` - -In the above example, `CollectionInitialization` is one of the supported transactions returned from step 1, `Flunks` is the name of an entry on the catalog (https://www.flow-nft-catalog.com/catalog/mainnet/Flunks), and `flow` is a fungible token identifier. - -## NPM Module - -We exposed an interface to the catalog via a consumable NPM module. This library will expose a number of methods that can be called to interact with the catalog. - -### Methods - -Method signatures and their associating parameters/responses can be found in the `cadence/` folder of this repo. - -#### Scripts - -``` -checkForRecommendedV1Views -genTx -getAllNftsInAccount -getExamplenftCollectionLength -getExamplenftType -getNftCatalog -getNftCatalogProposals -getNftCollectionsForNftType -getNftIdsInAccount -getNftInAccount -getNftInAccountFromPath -getNftMetadataForCollectionIdentifier -getNftProposalForId -getNftsCountInAccount -getNftsInAccount -getNftsInAccountFromIds -getNftsInAccountFromPath -getSupportedGeneratedTransactions -hasAdminProxy -isCatalogAdmin -``` - -#### Transactions - -``` -addToNftCatalog -addToNftCatalogAdmin -approveNftCatalogProposal -mintExampleNft -mintNonstandardNft -proposeNftToCatalog -rejectNftCatalogProposal -removeFromNftCatalog -removeNftCatalogProposal -sendAdminCapabilityToProxy -setupExamplenftCollection -setupNftCatalogAdminProxy -setupNonstandardnftCollection -setupStorefront -transferExamplenft -updateNftCatalogEntry -withdrawNftProposalFromCatalog -``` - -### Installation - -``` -npm install flow-catalog -``` - -or - -``` -yarn add flow-catalog -``` - -### Usage - -Methods can be imported as follows, all nested methods live under the `scripts` or `transactions` variable. - -NOTE: In order to properly bootstrap the method, you will need to run and `await` on the `getAddressMaps()` method, passing it into all of the methods as shown below. - -``` -import { getAddressMaps, scripts } from "flow-catalog"; - -const main = async () => { - const addressMap = await getAddressMaps(); - console.log(await scripts.getNftCatalog(addressMap)); -}; - -main(); -``` - -The response of any method is a tuple-array, with the first element being the result, and the second being the error (if applicable). - -For example, the result of the method above would look like - - -``` -[ - { - BILPlayerCollection: { - contractName: 'Player', - contractAddress: '0x9e6cdb88e34fa1f3', - nftType: [Object], - collectionData: [Object], - collectionDisplay: [Object] - }, - ... - SoulMadeComponent: { - contractName: 'SoulMadeComponent', - contractAddress: '0x421c19b7dc122357', - nftType: [Object], - collectionData: [Object], - collectionDisplay: [Object] - } - }, - null -] -``` - -## License - -The works in these files: - -- [FungibleToken.cdc](https://github.com/onflow/nft-catalog/tree/main/cadence/contracts/FungibleToken.cdc) -- [NonFungibleToken.cdc](https://github.com/onflow/nft-catalog/tree/main/cadence/contracts/NonFungibleToken.cdc) -- [ExampleNFT.cdc](https://github.com/onflow/nft-catalog/tree/main/cadence/contracts/ExampleNFT.cdc) -- [MetadataViews.cdc](https://github.com/onflow/nft-catalog/tree/main/cadence/contracts/MetadataViews.cdc) -- [NFTCatalog.cdc](https://github.com/onflow/nft-catalog/tree/main/cadence/contracts/NFTCatalog.cdc) -- [NFTCatalogAdmin.cdc](https://github.com/onflow/nft-catalog/tree/main/cadence/contracts/NFTCatalogAdmin.cdc) -- [NFTRetrieval.cdc](https://github.com/onflow/nft-catalog/tree/main/cadence/contracts/NFTRetrieval.cdc) - -are under the [Unlicense](https://github.com/onflow/nft-catalog/blob/main/LICENSE). diff --git a/docusaurus.config.js b/docusaurus.config.js index 004d4f2b52..f138c94f64 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -631,26 +631,10 @@ const config = { async: true, onload: mixpanelOnLoad, }, - { - src: 'https://widget.kapa.ai/kapa-widget.bundle.js', - 'data-website-id': '0f0b3ed1-7761-4986-851e-09336ea6ef1c', - 'data-project-name': 'Flow', - 'data-project-color': '#2E8555', - 'data-project-logo': 'https://cryptologos.cc/logos/flow-flow-logo.png', - async: true, - }, { src: `${baseUrl}hotjar.js`, async: true, }, - { - src: 'https://widget.kapa.ai/kapa-widget.bundle.js', - 'data-website-id': '0f0b3ed1-7761-4986-851e-09336ea6ef1c', - 'data-project-name': 'Flow', - 'data-project-color': '#2E8555', - 'data-project-logo': 'https://cryptologos.cc/logos/flow-flow-logo.png', - async: true, - }, ], clientModules: [require.resolve('./src/modules/toolscards.ts')], }; diff --git a/package.json b/package.json index b4d157ca6e..6d30ca270e 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ }, "dependencies": { "@code-hike/mdx": "^0.9.0", + "@cookbookdev/docsbot": "^4.24.0", "@docusaurus/core": "^3.5.2", "@docusaurus/plugin-client-redirects": "^3.5.2", "@docusaurus/preset-classic": "^3.5.2", diff --git a/src/data/tools/index.ts b/src/data/tools/index.ts index f39e8cd67c..0e1acd2581 100644 --- a/src/data/tools/index.ts +++ b/src/data/tools/index.ts @@ -114,22 +114,6 @@ const cdcWebpackPlugin: Tool = { description: 'Webpack plugin that helps importing Cadence files.', }; -const jsTestingLibTool: Tool = { - repo: { - name: 'flow-js-testing', - owner: 'onflow', - }, - title: 'JS Testing Library', - authorIcon: 'https://avatars.githubusercontent.com/u/62387156?s=64&v=4', - authorName: 'onflow', - tags: ['documentation', 'active', 'local-dev'], - link: '/tools/flow-js-testing/', - stars: 38, - iconSrc: ToolTestingIconSrc, - description: - 'A Jest based framework to enable Cadence testing via a set of JavaScript methods and tools', -}; - const cadutTool: Tool = { repo: { name: 'flow-cadut', diff --git a/src/theme/SearchBar.js b/src/theme/SearchBar.js new file mode 100644 index 0000000000..cd0a7ee0b3 --- /dev/null +++ b/src/theme/SearchBar.js @@ -0,0 +1,17 @@ +import React from 'react'; +import SearchBar from '@theme-original/SearchBar'; +import AskCookbook from '@cookbookdev/docsbot/react'; +import BrowserOnly from '@docusaurus/BrowserOnly'; +/** It's a public API key, so it's safe to expose it here */ +const COOKBOOK_PUBLIC_API_KEY = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NzEyYWRkYjk5YjBmNWViM2ZkODQxOGMiLCJpYXQiOjE3MjkyNzc0MDMsImV4cCI6MjA0NDg1MzQwM30._bhlmAnFpvxvkTV0PvU-6FwabhFOdSOx-qed2UIogpY'; +export default function SearchBarWrapper(props) { + return ( + <> + + + {() => } + + + ); +} diff --git a/src/ui/design-system/src/lib/Components/HomepageStartListCadence/index.tsx b/src/ui/design-system/src/lib/Components/HomepageStartListCadence/index.tsx index 367fbf80f3..9837786578 100644 --- a/src/ui/design-system/src/lib/Components/HomepageStartListCadence/index.tsx +++ b/src/ui/design-system/src/lib/Components/HomepageStartListCadence/index.tsx @@ -47,7 +47,7 @@ const homepagePillData: Record = { subText: 'Chat with devs', }, 'network-upgrade': { - link: 'https://cadence-lang.org/docs/1.0/cadence-migration-guide/', + link: 'https://cadence-lang.org/docs/cadence-migration-guide/', icon: 'network-upgrade', text: 'Network Upgrade', subText: 'View latest', diff --git a/vercel.json b/vercel.json index ce81d39761..8baa83c87f 100644 --- a/vercel.json +++ b/vercel.json @@ -389,7 +389,7 @@ }, { "source": "/flow-js-testing/:path*", - "destination": "/tools/flow-js-testing/:path*", + "destination": "https://cadence-lang.org/docs/testing-framework", "permanent": true }, { @@ -659,12 +659,17 @@ }, { "source": "/tooling/flow-js-testing/:path*", - "destination": "/tools/flow-js-testing/:path*", + "destination": "https://cadence-lang.org/docs/testing-framework", + "permanent": true + }, + { + "source": "/tools/flow-js-testing/:path*", + "destination": "https://cadence-lang.org/docs/testing-framework", "permanent": true }, { "source": "/tooling/nft-catalog/(.*)", - "destination": "/tools/nft-catalog/", + "destination": "https://github.com/fixes-world/token-list", "permanent": true }, { @@ -758,7 +763,7 @@ }, { "source": "/tools/nft-catalog/(.+)", - "destination": "/tools/nft-catalog", + "destination": "https://github.com/fixes-world/token-list", "permanent": true }, { @@ -1212,12 +1217,12 @@ }, { "source": "/build/smart-contracts/best-practices/anti-patterns", - "destination": "https://cadence-lang.org/docs/1.0/anti-patterns", + "destination": "https://cadence-lang.org/docs/anti-patterns", "permanent": true }, { "source": "/build/smart-contracts/best-practices/design-patterns", - "destination": "https://cadence-lang.org/docs/1.0/design-patterns", + "destination": "https://cadence-lang.org/docs/design-patterns", "permanent": true }, { @@ -1233,6 +1238,11 @@ "destination": "/tools/error-codes", "permanent": true }, + { + "source": "/tools/nft-catalog/(.*)", + "destination": "https://github.com/fixes-world/token-list", + "permanent": true + }, { "source": "/build/getting-started/quickstarts/hello-world", "destination": "/build/getting-started/hello-world", diff --git a/yarn.lock b/yarn.lock index ccf716ab42..0c998a14b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,11 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== + "@algolia/autocomplete-core@1.8.2": version "1.8.2" resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz#8d758c8652742e2761450d2b615a841fca24e10e" @@ -222,6 +227,16 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/generator@^7.14.5": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56" + integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== + dependencies: + "@babel/types" "^7.25.7" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/generator@^7.23.3", "@babel/generator@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" @@ -539,6 +554,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== +"@babel/helper-string-parser@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" + integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== + "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" @@ -549,6 +569,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-identifier@^7.25.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" + integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== + "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" @@ -1945,6 +1970,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.13.10", "@babel/runtime@^7.20.13", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.25.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -1992,6 +2024,15 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/types@^7.14.5", "@babel/types@^7.20.7", "@babel/types@^7.25.7": + version "7.25.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" + integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg== + dependencies: + "@babel/helper-string-parser" "^7.25.7" + "@babel/helper-validator-identifier" "^7.25.7" + to-fast-properties "^2.0.0" + "@babel/types@^7.21.3", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" @@ -2039,6 +2080,77 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@cookbookdev/docsbot@^4.24.0": + version "4.24.0" + resolved "https://registry.yarnpkg.com/@cookbookdev/docsbot/-/docsbot-4.24.0.tgz#3537bd6e6c5e48152b6f15fa956fb2cb7caab4ec" + integrity sha512-8v62HNLzAKPVu1NjSI/o0bkR67GCz5WSlNXCOvBs4jJktny4s+XvrfXgG9wo/m8UyKuPky63skAWaKTE3I+M6g== + dependencies: + "@cookbookdev/sonner" "1.5.1" + "@headlessui/react" "^1.7.18" + "@headlessui/tailwindcss" "^0.2.0" + "@lingui/detect-locale" "^4.11.4" + "@lingui/macro" "^4.11.4" + "@lingui/react" "^4.11.4" + "@lingui/remote-loader" "^3.11.0" + "@monaco-editor/react" "^4.6.0" + "@radix-ui/react-avatar" "^1.0.4" + "@radix-ui/react-checkbox" "^1.0.4" + "@radix-ui/react-collapsible" "^1.0.3" + "@radix-ui/react-dialog" "^1.0.5" + "@radix-ui/react-dropdown-menu" "^2.0.6" + "@radix-ui/react-hover-card" "^1.0.7" + "@radix-ui/react-icons" "^1.3.0" + "@radix-ui/react-label" "^2.0.2" + "@radix-ui/react-popover" "^1.0.7" + "@radix-ui/react-scroll-area" "^1.0.5" + "@radix-ui/react-select" "^2.0.0" + "@radix-ui/react-separator" "^1.0.3" + "@radix-ui/react-slider" "^1.1.2" + "@radix-ui/react-slot" "^1.0.2" + "@radix-ui/react-tabs" "^1.0.4" + "@radix-ui/react-toast" "^1.1.5" + "@radix-ui/react-tooltip" "^1.0.7" + "@shikijs/rehype" "^1.12.1" + "@statsig/js-client" "^3.1.0" + "@statsig/react-bindings" "^3.1.0" + "@tailwindcss/line-clamp" "^0.4.4" + "@tanstack/react-table" "^8.11.7" + "@vercel/edge" "^1.1.1" + bcp-47 "^2.1.0" + can-dom-mutate "^2.0.9" + clsx "^2.1.0" + cmdk-react17 "^1.0.0" + color2k "^2.0.3" + fflate "^0.8.2" + file-saver "^2.0.5" + framer-motion "^6.5.1" + idb "^8.0.0" + iso-639-1 "^3.1.3" + jszip "^3.10.1" + nanoid "3.3.7" + posthog-js "^1.136.8" + prop-types "^15.8.1" + react-complex-tree "^2.3.7" + react-remark "^2.1.0" + react-resizable-panels "2.0.19" + recharts "^2.12.4" + rehype-react "^8.0.0" + remark-gfm "^4.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.1.0" + solc "^0.8.25" + styled-components "^6.1.8" + swr "^2.2.5" + tailwind-merge "^2.2.1" + tailwindcss-animate "^1.0.7" + use-sync-external-store "^1.2.0" + viem "2.9.16" + +"@cookbookdev/sonner@1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@cookbookdev/sonner/-/sonner-1.5.1.tgz#a50b53a1287d0a373e2fc1b2aea78cf1b45b82bb" + integrity sha512-MqPxvFpWKRWuYpKv6ktnT+nGa2mk4jz+OVgunlpIxqfLgMvJ/PSg9OQv0+QlR6iAbThyjiedD6exULSgogPTmA== + "@discordjs/builders@^1.5.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.7.0.tgz#e2478c7e55b0f4c40837edb8f102bce977323a37" @@ -2556,6 +2668,18 @@ dependencies: "@emotion/memoize" "^0.8.1" +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + "@emotion/memoize@^0.8.1": version "0.8.1" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" @@ -2620,6 +2744,21 @@ dependencies: "@floating-ui/utils" "^0.1.3" +"@floating-ui/core@^1.6.0": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== + dependencies: + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/dom@^1.0.0": + version "1.6.11" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.11.tgz#8631857838d34ee5712339eb7cbdfb8ad34da723" + integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.8" + "@floating-ui/dom@^1.2.1": version "1.5.3" resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" @@ -2635,11 +2774,23 @@ dependencies: "@floating-ui/dom" "^1.2.1" +"@floating-ui/react-dom@^2.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + "@floating-ui/utils@^0.1.3": version "0.1.6" resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== + "@fortawesome/fontawesome-common-types@6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.0.tgz#5d3912d28a2fb3e6c867320eb27a71f23e7bcb29" @@ -2685,6 +2836,19 @@ dependencies: client-only "^0.0.1" +"@headlessui/react@^1.7.18": + version "1.7.19" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.19.tgz#91c78cf5fcb254f4a0ebe96936d48421caf75f40" + integrity sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw== + dependencies: + "@tanstack/react-virtual" "^3.0.0-beta.60" + client-only "^0.0.1" + +"@headlessui/tailwindcss@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@headlessui/tailwindcss/-/tailwindcss-0.2.1.tgz#1becc201f69358a40e08bd676acc234b2cabe6e4" + integrity sha512-2+5+NZ+RzMyrVeCZOxdbvkUSssSxGvcUxphkIfSVLpRiKsj+/63T2TOL9dBYMXVfj/CGr6hMxSRInzXv6YY7sA== + "@humanwhocodes/config-array@^0.11.13": version "0.11.13" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" @@ -2809,6 +2973,77 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== +"@lingui/conf@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@lingui/conf/-/conf-4.13.0.tgz#5c63b45cee12fc3fbb0c5a340cbf986e5eb3845a" + integrity sha512-7NSinlzgSMKBezLsSM7DMwr0IpTHKr8nuSDpTZpI79+BhW+Xq38jPRQqMXdzItW8Cl/Lsdr3Y3MnYJIl8tADsQ== + dependencies: + "@babel/runtime" "^7.20.13" + chalk "^4.1.0" + cosmiconfig "^8.0.0" + jest-validate "^29.4.3" + jiti "^1.17.1" + lodash.get "^4.4.2" + +"@lingui/core@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@lingui/core/-/core-4.13.0.tgz#d21c062b4e7cec198dd602caf07fe212a98c0b2c" + integrity sha512-kRqQWeEVoqNrDtEdyHPWGsAHRStN8ObYc5a1gdyuBhoj1zaoUS/DMK5C7B1ZeTtj6rCCmZRs6d2tN12hsZ2zJA== + dependencies: + "@babel/runtime" "^7.20.13" + "@lingui/message-utils" "4.13.0" + unraw "^3.0.0" + +"@lingui/detect-locale@^4.11.4": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@lingui/detect-locale/-/detect-locale-4.13.0.tgz#cbca1a4152e9f66b4376a4b33f652afdc1aa99ca" + integrity sha512-1Q08tMdG3Avh7ruBxFPNA9Ll1ekunpIMHWg9MuGDcDsG/5ucNbZocUh9+iJxkqWmBMNbEaOj14oN8oRsHk2ufA== + +"@lingui/macro@^4.11.4": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@lingui/macro/-/macro-4.13.0.tgz#c63c0b69da92fcd6c1a322ac957b2ab288f10a9b" + integrity sha512-OjhaWOWbTCXHOOHNaGI0shMP3qrPjNZ19tpEx/iStAmJq64fkevx/HbDPI0uuqLX8v1NFWG/SzBMIQzJb5YOvA== + dependencies: + "@babel/runtime" "^7.20.13" + "@babel/types" "^7.20.7" + "@lingui/conf" "4.13.0" + "@lingui/core" "4.13.0" + "@lingui/message-utils" "4.13.0" + +"@lingui/message-utils@4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@lingui/message-utils/-/message-utils-4.13.0.tgz#ebf64c5c47857dc4d39fde673804c9966ae8c8d8" + integrity sha512-tI/WBVZym+APwqk0O3xTaF0k+RQIv5E4PqGHdXqwbofycHly2C+izH+hg6UeNctc6jd19GRwqu/4ga9knkdAlQ== + dependencies: + "@messageformat/parser" "^5.0.0" + js-sha256 "^0.10.1" + +"@lingui/react@^4.11.4": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@lingui/react/-/react-4.13.0.tgz#19d86560bcb0514738d8087eb567d6cc5caadc25" + integrity sha512-5remR9rVwosiiX/RnEWETHA8cpqQiP7U87OXXMPz67LuyG3XP8RP+ic75rVn284DHLHgpjDbauz7vYIz855ZoQ== + dependencies: + "@babel/runtime" "^7.20.13" + "@lingui/core" "4.13.0" + +"@lingui/remote-loader@^3.11.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@lingui/remote-loader/-/remote-loader-3.11.0.tgz#1c7906f356129e82ac15d1d9ac7644df6a1f5dcf" + integrity sha512-oAoSEbPfFm+GyAQQOhMCBcuZpyqW6HqUtkAbv/k8z1eqvuk2vmduxfZ9WicyU6T2V0vjgWekVdHRa83NObk8xQ== + dependencies: + "@babel/generator" "^7.14.5" + "@babel/types" "^7.14.5" + json5 "^2.2.0" + messageformat-parser "^4.1.3" + ramda "^0.27.1" + +"@mapbox/hast-util-table-cell-style@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.1.tgz#b8e92afdd38b668cf0762400de980073d2ade101" + integrity sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw== + dependencies: + unist-util-visit "^1.4.1" + "@mdx-js/mdx@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-3.0.0.tgz#37ef87685143fafedf1165f0a79e9fe95fbe5154" @@ -2852,6 +3087,97 @@ dependencies: "@types/mdx" "^2.0.0" +"@messageformat/parser@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@messageformat/parser/-/parser-5.1.0.tgz#05e4851c782d633ad735791dd0a68ee65d2a7201" + integrity sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ== + dependencies: + moo "^0.5.1" + +"@monaco-editor/loader@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.4.0.tgz#f08227057331ec890fa1e903912a5b711a2ad558" + integrity sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg== + dependencies: + state-local "^1.0.6" + +"@monaco-editor/react@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.6.0.tgz#bcc68671e358a21c3814566b865a54b191e24119" + integrity sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw== + dependencies: + "@monaco-editor/loader" "^1.4.0" + +"@motionone/animation@^10.12.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.18.0.tgz#868d00b447191816d5d5cf24b1cafa144017922b" + integrity sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw== + dependencies: + "@motionone/easing" "^10.18.0" + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/dom@10.12.0": + version "10.12.0" + resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.12.0.tgz#ae30827fd53219efca4e1150a5ff2165c28351ed" + integrity sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw== + dependencies: + "@motionone/animation" "^10.12.0" + "@motionone/generators" "^10.12.0" + "@motionone/types" "^10.12.0" + "@motionone/utils" "^10.12.0" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.18.0.tgz#7b82f6010dfee3a1bb0ee83abfbaff6edae0c708" + integrity sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg== + dependencies: + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/generators@^10.12.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.18.0.tgz#fe09ab5cfa0fb9a8884097feb7eb60abeb600762" + integrity sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg== + dependencies: + "@motionone/types" "^10.17.1" + "@motionone/utils" "^10.18.0" + tslib "^2.3.1" + +"@motionone/types@^10.12.0", "@motionone/types@^10.17.1": + version "10.17.1" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.1.tgz#cf487badbbdc9da0c2cb86ffc1e5d11147c6e6fb" + integrity sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A== + +"@motionone/utils@^10.12.0", "@motionone/utils@^10.18.0": + version "10.18.0" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.18.0.tgz#a59ff8932ed9009624bca07c56b28ef2bb2f885e" + integrity sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw== + dependencies: + "@motionone/types" "^10.17.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@noble/curves@1.2.0", "@noble/curves@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2947,6 +3273,602 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c" integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg== +"@radix-ui/number@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.1.0.tgz#1e95610461a09cdf8bb05c152e76ca1278d5da46" + integrity sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ== + +"@radix-ui/primitive@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.0.1.tgz#e46f9958b35d10e9f6dc71c497305c22e3e55dbd" + integrity sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/primitive@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" + integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== + +"@radix-ui/react-arrow@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" + integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-avatar@^1.0.4": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.1.1.tgz#5848d2ed5f34d18b36fc7e2d227c41fca8600ea1" + integrity sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw== + dependencies: + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-checkbox@^1.0.4": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-checkbox/-/react-checkbox-1.1.2.tgz#6465b800420923ecc39cbeaa8f357b5f09dbfd52" + integrity sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + +"@radix-ui/react-collapsible@^1.0.3": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz#1382cc9ec48f8b473c14f3779d317f0cdf6da5e9" + integrity sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-collection@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz#f18af78e46454a2360d103c2251773028b7724ed" + integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + +"@radix-ui/react-compose-refs@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" + integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-compose-refs@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" + integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== + +"@radix-ui/react-context@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" + integrity sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" + integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== + +"@radix-ui/react-context@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" + integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== + +"@radix-ui/react-dialog@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz#71657b1b116de6c7a0b03242d7d43e01062c7300" + integrity sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-portal" "1.0.4" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-dialog@^1.0.5": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz#d9345575211d6f2d13e209e84aec9a8584b54d6c" + integrity sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + +"@radix-ui/react-direction@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" + integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== + +"@radix-ui/react-dismissable-layer@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz#3f98425b82b9068dfbab5db5fff3df6ebf48b9d4" + integrity sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-escape-keydown" "1.0.3" + +"@radix-ui/react-dismissable-layer@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz#cbdcb739c5403382bdde5f9243042ba643883396" + integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown" "1.1.0" + +"@radix-ui/react-dropdown-menu@^2.0.6": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz#acc49577130e3c875ef0133bd1e271ea3392d924" + integrity sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-menu" "2.1.2" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-focus-guards@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" + integrity sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-focus-guards@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz#8635edd346304f8b42cae86b05912b61aef27afe" + integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg== + +"@radix-ui/react-focus-scope@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz#2ac45fce8c5bb33eb18419cdc1905ef4f1906525" + integrity sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-focus-scope@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" + integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-hover-card@^1.0.7": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-hover-card/-/react-hover-card-1.1.2.tgz#912e158cd9ee71cba86f08ba063d1f5953cfb0e6" + integrity sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-icons@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-icons/-/react-icons-1.3.0.tgz#c61af8f323d87682c5ca76b856d60c2312dbcb69" + integrity sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw== + +"@radix-ui/react-id@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.0.1.tgz#73cdc181f650e4df24f0b6a5b7aa426b912c88c0" + integrity sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-id@1.1.0", "@radix-ui/react-id@^1.0.1": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" + integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-label@^2.0.2": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-2.1.0.tgz#3aa2418d70bb242be37c51ff5e51a2adcbc372e3" + integrity sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-menu@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.1.2.tgz#91f6815845a4298dde775563ed2d80b7ad667899" + integrity sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-roving-focus" "1.1.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + +"@radix-ui/react-popover@^1.0.7": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.1.2.tgz#a0cab25f69aa49ad0077d91e9e9dcd323758020c" + integrity sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + +"@radix-ui/react-popper@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" + integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-rect" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/rect" "1.1.0" + +"@radix-ui/react-portal@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.4.tgz#df4bfd353db3b1e84e639e9c63a5f2565fb00e15" + integrity sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-portal@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.2.tgz#51eb46dae7505074b306ebcb985bf65cc547d74e" + integrity sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-presence@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz#491990ba913b8e2a5db1b06b203cb24b5cdef9ba" + integrity sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-presence@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz#98aba423dba5e0c687a782c0669dcd99de17f9b1" + integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-primitive@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" + integrity sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.2" + +"@radix-ui/react-primitive@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" + integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== + dependencies: + "@radix-ui/react-slot" "1.1.0" + +"@radix-ui/react-roving-focus@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz#b30c59daf7e714c748805bfe11c76f96caaac35e" + integrity sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-scroll-area@^1.0.5": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.0.tgz#d09fd693728b09c50145935bec6f91efc2661729" + integrity sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ== + dependencies: + "@radix-ui/number" "1.1.0" + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-select@^2.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.1.2.tgz#2346e118966db793940f6a866fd4cc5db2cc275e" + integrity sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA== + dependencies: + "@radix-ui/number" "1.1.0" + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + +"@radix-ui/react-separator@^1.0.3": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.1.0.tgz#ee0f4d86003b0e3ea7bc6ccab01ea0adee32663e" + integrity sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/react-slider@^1.1.2": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slider/-/react-slider-1.2.1.tgz#acb0804309890f3cd7a224b2b0c4c4704f32921b" + integrity sha512-bEzQoDW0XP+h/oGbutF5VMWJPAl/UU8IJjr7h02SOHDIIIxq+cep8nItVNoBV+OMmahCdqdF38FTpmXoqQUGvw== + dependencies: + "@radix-ui/number" "1.1.0" + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-previous" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + +"@radix-ui/react-slot@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" + integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + +"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.0.2": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" + integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + +"@radix-ui/react-tabs@^1.0.4": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.1.1.tgz#698bd97923f6bcd629738198a73beebcc4c88b30" + integrity sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-roving-focus" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + +"@radix-ui/react-toast@^1.1.5": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-toast/-/react-toast-1.2.2.tgz#fdd8ed0b80f47d6631dfd90278fee6debc06bf33" + integrity sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + +"@radix-ui/react-tooltip@^1.0.7": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.3.tgz#4250b14723f2d8477e7a3d0526c169f91d1f2f74" + integrity sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.0" + +"@radix-ui/react-use-callback-ref@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" + integrity sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-callback-ref@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" + integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== + +"@radix-ui/react-use-controllable-state@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz#ecd2ced34e6330caf89a82854aa2f77e07440286" + integrity sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-controllable-state@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" + integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-use-escape-keydown@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz#217b840c250541609c66f67ed7bab2b733620755" + integrity sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.1" + +"@radix-ui/react-use-escape-keydown@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" + integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + +"@radix-ui/react-use-layout-effect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz#be8c7bc809b0c8934acf6657b577daf948a75399" + integrity sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-layout-effect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" + integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== + +"@radix-ui/react-use-previous@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz#d4dd37b05520f1d996a384eb469320c2ada8377c" + integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og== + +"@radix-ui/react-use-rect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" + integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== + dependencies: + "@radix-ui/rect" "1.1.0" + +"@radix-ui/react-use-size@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" + integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-visually-hidden@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz#ad47a8572580f7034b3807c8e6740cd41038a5a2" + integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + +"@radix-ui/rect@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" + integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== + "@redocly/ajv@^8.11.0": version "8.11.0" resolved "https://registry.yarnpkg.com/@redocly/ajv/-/ajv-8.11.0.tgz#2fad322888dc0113af026e08fceb3e71aae495ae" @@ -3019,6 +3941,28 @@ resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec" integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA== +"@scure/base@~1.1.0", "@scure/base@~1.1.2": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/bip32@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" + integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA== + dependencies: + "@noble/curves" "~1.2.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.2" + +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@shikijs/core@1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.14.1.tgz#008f1c4a20ff83fd1672d9e31d76b687862f7511" @@ -3026,6 +3970,60 @@ dependencies: "@types/hast" "^3.0.4" +"@shikijs/core@1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.22.0.tgz#74e5d4485e5f7afa85109e322b42e400686f92bb" + integrity sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q== + dependencies: + "@shikijs/engine-javascript" "1.22.0" + "@shikijs/engine-oniguruma" "1.22.0" + "@shikijs/types" "1.22.0" + "@shikijs/vscode-textmate" "^9.3.0" + "@types/hast" "^3.0.4" + hast-util-to-html "^9.0.3" + +"@shikijs/engine-javascript@1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz#2e5db29f0421755492f5279f8224ef7a7f907a29" + integrity sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw== + dependencies: + "@shikijs/types" "1.22.0" + "@shikijs/vscode-textmate" "^9.3.0" + oniguruma-to-js "0.4.3" + +"@shikijs/engine-oniguruma@1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz#74c661fac4cd1f08f2c09b5d6e2fd2a6720d0401" + integrity sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw== + dependencies: + "@shikijs/types" "1.22.0" + "@shikijs/vscode-textmate" "^9.3.0" + +"@shikijs/rehype@^1.12.1": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@shikijs/rehype/-/rehype-1.22.0.tgz#152550a4939aab3f8e59642a5013491d20cbaf1a" + integrity sha512-lgbERrnR5CZFDryZNn/JEBA5h54hpRxMT7lXrXceDS7fiLl6ZBWLGk1nTypk9LT80M2lNZVeeh9UGS+wLoFtWQ== + dependencies: + "@shikijs/types" "1.22.0" + "@types/hast" "^3.0.4" + hast-util-to-string "^3.0.1" + shiki "1.22.0" + unified "^11.0.5" + unist-util-visit "^5.0.0" + +"@shikijs/types@1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-1.22.0.tgz#d2a572381395c9308b472c8199b8e0289753b9ad" + integrity sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww== + dependencies: + "@shikijs/vscode-textmate" "^9.3.0" + "@types/hast" "^3.0.4" + +"@shikijs/vscode-textmate@^9.3.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz#b2f1776e488c1d6c2b6cd129bab62f71bbc9c7ab" + integrity sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA== + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -3067,6 +4065,26 @@ micromark-util-character "^1.1.0" micromark-util-symbol "^1.0.1" +"@statsig/client-core@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@statsig/client-core/-/client-core-3.2.0.tgz#a043af7bfc819f9b744ed5735809c4b0dcf68251" + integrity sha512-d89AfWifsBwFewJh98uUySpQWjfkZ/ZML8HKyBlkq8vv3u17zSlhHfS4bpsw6IWlmQOapVO6ke1ByNPvNlxLCw== + +"@statsig/js-client@3.2.0", "@statsig/js-client@^3.1.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@statsig/js-client/-/js-client-3.2.0.tgz#7a4ef09259bd99f0d5607e38720e0c851227a4d9" + integrity sha512-TX2qw2w0/BaGKsn9UE0jjYmhNUXQZCgADlz6kjlGCyovb6j4r3+UsLH9XU3q3oHK8R6g2yqqcRmlJUe0oqJP3Q== + dependencies: + "@statsig/client-core" "3.2.0" + +"@statsig/react-bindings@^3.1.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@statsig/react-bindings/-/react-bindings-3.2.0.tgz#27cf311917d1ca36ce64580f90469326f5c06402" + integrity sha512-TB3tXbtUe1xKdcCQPA4ClKoiUPb6CgSXaEWC8QXhI5EGHmRYvHiZlfxM5xCYDabAfFKzGe/+giYqZitHy6BL9Q== + dependencies: + "@statsig/client-core" "3.2.0" + "@statsig/js-client" "3.2.0" + "@svgr/babel-plugin-add-jsx-attribute@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" @@ -3192,6 +4210,11 @@ dependencies: mini-svg-data-uri "^1.2.3" +"@tailwindcss/line-clamp@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz#767cf8e5d528a5d90c9740ca66eb079f5e87d423" + integrity sha512-5U6SY5z8N42VtrCrKlsTAA35gy2VSyYtHWCsg1H87NU1SXnEfekTVlrga9fzUDrrHcGi2Lb5KenUWb4lRQT5/g== + "@tailwindcss/typography@0.5.10": version "0.5.10" resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.10.tgz#2abde4c6d5c797ab49cf47610830a301de4c1e0a" @@ -3202,6 +4225,30 @@ lodash.merge "^4.6.2" postcss-selector-parser "6.0.10" +"@tanstack/react-table@^8.11.7": + version "8.20.5" + resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.20.5.tgz#19987d101e1ea25ef5406dce4352cab3932449d8" + integrity sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA== + dependencies: + "@tanstack/table-core" "8.20.5" + +"@tanstack/react-virtual@^3.0.0-beta.60": + version "3.10.8" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.8.tgz#bf4b06f157ed298644a96ab7efc1a2b01ab36e3c" + integrity sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA== + dependencies: + "@tanstack/virtual-core" "3.10.8" + +"@tanstack/table-core@8.20.5": + version "8.20.5" + resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.20.5.tgz#3974f0b090bed11243d4107283824167a395cf1d" + integrity sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg== + +"@tanstack/virtual-core@3.10.8": + version "3.10.8" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.8.tgz#975446a667755222f62884c19e5c3c66d959b8b4" + integrity sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA== + "@tokenizer/token@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" @@ -3261,6 +4308,57 @@ dependencies: "@types/node" "*" +"@types/d3-array@^3.0.3": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" + integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== + +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-ease@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-interpolate@^3.0.1": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a" + integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ== + +"@types/d3-scale@^4.0.2": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" + integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-shape@^3.1.0": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.6.tgz#65d40d5a548f0a023821773e39012805e6e31a72" + integrity sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time@*", "@types/d3-time@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" + integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== + +"@types/d3-timer@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== + "@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -3606,6 +4704,11 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== +"@types/unist@^2.0.3": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== + "@types/ws@^8.5.4", "@types/ws@^8.5.5": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -3746,6 +4849,11 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@vercel/edge@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@vercel/edge/-/edge-1.1.2.tgz#b89bc5fa927b9af64c99311afb4dcf48e7b9e87a" + integrity sha512-wt5SnhsMahWX8U9ZZhFUQoiXhMn/CUxA5xeMdZX1cwyOL1ZbDR3rNI8HRT9RSU73nDxeF6jlnqJyp/0Jy0VM2A== + "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" @@ -3882,6 +4990,11 @@ abbrev@^2.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== +abitype@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" + integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -4032,6 +5145,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" @@ -4067,6 +5185,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-hidden@^1.1.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" + integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== + dependencies: + tslib "^2.0.0" + array-buffer-byte-length@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" @@ -4297,6 +5422,15 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== +bcp-47@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bcp-47/-/bcp-47-2.1.0.tgz#7e80734c3338fe8320894981dccf4968c3092df6" + integrity sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w== + dependencies: + is-alphabetical "^2.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -4508,6 +5642,45 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== +can-dom-mutate@^2.0.9: + version "2.0.9" + resolved "https://registry.yarnpkg.com/can-dom-mutate/-/can-dom-mutate-2.0.9.tgz#8325a059f2dcd2951438ead4dbb9cf6047233762" + integrity sha512-t0CL8uvUu2n8Mx1h8Q6M0oE+F9HwP56H6JzdGspeXZTQR+Lxs72ozr/a+d25Au/fyPCCwga+SygxA+NEsqCu8A== + dependencies: + can-globals "^1.0.0" + can-namespace "1.0.0" + can-reflect "^1.17.6" + can-symbol "^1.6.4" + +can-globals@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/can-globals/-/can-globals-1.2.2.tgz#bf6eb3a3ab4ca46dfd0b3a1c8a2cc9932674cb14" + integrity sha512-wcsZoHIHd+pJ7Tx5NExRJggr3NGoOjJ38mRWlfyE6jAwG7N+Ha4opgosczrFBSHcVLeEJTg2WikCWJjOtgIP/w== + dependencies: + can-namespace "^1.0.0" + can-reflect "^1.2.6" + can-symbol "^1.0.0" + +can-namespace@1.0.0, can-namespace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/can-namespace/-/can-namespace-1.0.0.tgz#0b8fafafbb11352b9ead4222ffe3822405b43e99" + integrity sha512-1sBY/SLwwcmxz3NhyVhLjt2uD/dZ7V1mII82/MIXSDn5QXnslnosJnjlP8+yTx2uTCRvw1jlFDElRs4pX7AG5w== + +can-reflect@^1.17.6, can-reflect@^1.2.6: + version "1.19.2" + resolved "https://registry.yarnpkg.com/can-reflect/-/can-reflect-1.19.2.tgz#a6029322ec18358543216243926bebd9a3d3855c" + integrity sha512-cacR7uz67IscRJzYm5Fqzx/Nzh7xuR4ybiyn/hc2D8CNK37p/YanhGOn00JELnCNAN+DYfjnG+hBlph0jz6jHw== + dependencies: + can-namespace "^1.0.0" + can-symbol "^1.7.0" + +can-symbol@^1.0.0, can-symbol@^1.6.4, can-symbol@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/can-symbol/-/can-symbol-1.7.0.tgz#cdedb95a3e23f7f7ad0d2801afbb083f9f543ec6" + integrity sha512-4drWe3ohkmnk2Z6sOoJ5K7OoHTHzlCAMTPrTAcolUox78Csrlo6qJz9YlyCeskc9Whx+UXmT2tplXvur51k9iw== + dependencies: + can-namespace "^1.0.0" + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -4560,16 +5733,31 @@ character-entities-html4@^2.0.0: resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + character-entities-legacy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + character-entities@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + character-reference-invalid@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" @@ -4699,6 +5887,21 @@ clsx@^2.0.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== +clsx@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +cmdk-react17@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cmdk-react17/-/cmdk-react17-1.0.0.tgz#38424086014d6ca66ae74ce01f30c88fd45be34c" + integrity sha512-J83cFOqs/twjFQzN+CciDZ/YBX8K5vGFD5EAfCi3xJDgdCj3/XDi9pv7jYdrSCf7gRkUBV7x3PFBh4AP3Ue+0w== + dependencies: + "@radix-ui/react-dialog" "1.0.5" + "@radix-ui/react-id" "^1.0.1" + "@radix-ui/react-primitive" "1.0.3" + use-sync-external-store "^1.2.0" + collapse-white-space@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-2.1.0.tgz#640257174f9f42c740b40f3b55ee752924feefca" @@ -4728,6 +5931,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color2k@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/color2k/-/color2k-2.0.3.tgz#a771244f6b6285541c82aa65ff0a0c624046e533" + integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog== + colord@^2.9.3: version "2.9.3" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" @@ -4758,6 +5966,11 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + commander@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -4783,7 +5996,7 @@ commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^8.3.0: +commander@^8.1.0, commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== @@ -4945,6 +6158,11 @@ core-js@^3.31.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.3.tgz#3c644a323f0f533a0d360e9191e37f7fc059088d" integrity sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw== +core-js@^3.38.1: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.1.tgz#aa375b79a286a670388a1a363363d53677c0383e" + integrity sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -4961,7 +6179,7 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -cosmiconfig@^8.1.3, cosmiconfig@^8.2.0: +cosmiconfig@^8.0.0, cosmiconfig@^8.1.3, cosmiconfig@^8.2.0: version "8.3.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== @@ -5159,6 +6377,77 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +"d3-color@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-ease@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +"d3-format@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-scale@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-shape@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4": + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +d3-timer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + data-uri-to-buffer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" @@ -5209,6 +6498,11 @@ debug@^4.3.1: dependencies: ms "2.1.2" +decimal.js-light@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + decko@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817" @@ -5321,6 +6615,11 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" @@ -5470,6 +6769,14 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" @@ -6086,7 +7393,7 @@ eval@^0.1.8: "@types/node" "*" require-like ">= 0.1.1" -eventemitter3@^4.0.0: +eventemitter3@^4.0.0, eventemitter3@^4.0.1: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -6175,6 +7482,11 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-equals@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d" + integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ== + fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -6244,6 +7556,16 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" +fflate@^0.4.8: + version "0.4.8" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae" + integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA== + +fflate@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -6259,6 +7581,11 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + file-type@^18.3.0: version "18.7.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.7.0.tgz#cddb16f184d6b94106cfc4bb56978726b25cb2a2" @@ -6348,6 +7675,11 @@ follow-redirects@^1.0.0, follow-redirects@^1.14.8: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.12.1: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -6414,6 +7746,27 @@ fraction.js@^4.2.0, fraction.js@^4.3.6, fraction.js@^4.3.7: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +framer-motion@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-6.5.1.tgz#802448a16a6eb764124bf36d8cbdfa6dd6b931a7" + integrity sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw== + dependencies: + "@motionone/dom" "10.12.0" + framesync "6.0.1" + hey-listen "^1.0.8" + popmotion "11.0.3" + style-value-types "5.0.0" + tslib "^2.1.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framesync@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.0.1.tgz#5e32fc01f1c42b39c654c35b16440e07a25d6f20" + integrity sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA== + dependencies: + tslib "^2.1.0" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -6513,6 +7866,11 @@ get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -6807,6 +8165,19 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + hast-util-from-parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" @@ -6891,6 +8262,23 @@ hast-util-to-estree@^3.0.0: unist-util-position "^5.0.0" zwitch "^2.0.0" +hast-util-to-html@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz#a9999a0ba6b4919576a9105129fead85d37f302b" + integrity sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + hast-util-to-jsx-runtime@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.2.0.tgz#ffd59bfcf0eb8321c6ed511bfc4b399ac3404bc2" @@ -6919,6 +8307,13 @@ hast-util-to-parse5@^8.0.0: web-namespaces "^2.0.0" zwitch "^2.0.0" +hast-util-to-string@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz#a4f15e682849326dd211c97129c94b0c3e76527c" + integrity sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-text@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-2.0.1.tgz#04f2e065642a0edb08341976084aa217624a0f8b" @@ -6962,6 +8357,11 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -7169,6 +8569,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +idb@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/idb/-/idb-8.0.0.tgz#33d7ed894ed36e23bcb542fb701ad579bfaad41f" + integrity sha512-l//qvlAKGmQO31Qn7xdzagVPPaHTxXx199MhrAFuVBTPqydcPYBWjkrbv4Y0ktB+GmWOiwHl237UUOrLmQxLvw== + ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -7191,6 +8596,11 @@ image-size@^1.0.2: dependencies: queue "6.0.2" +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immer@^9.0.7: version "9.0.21" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" @@ -7286,6 +8696,11 @@ internal-slot@^1.0.5: hasown "^2.0.0" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -7308,11 +8723,24 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + is-alphabetical@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-alphanumerical@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" @@ -7388,6 +8816,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-decimal@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" @@ -7437,6 +8870,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + is-hexadecimal@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" @@ -7640,11 +9078,21 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +iso-639-1@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/iso-639-1/-/iso-639-1-3.1.3.tgz#73c0a8d19988837e1cf5c2fa397a67f72cd34aee" + integrity sha512-1jz0Wh9hyLMRwqEPchb/KZCiTqfFWtc9R3nm7GHPygBAKS8wdKJ3FH4lvLsri6UtAE5Kz5SnowtXZa//6bqMyw== + isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isows@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" + integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== + jackspeak@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" @@ -7663,6 +9111,11 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" @@ -7675,6 +9128,18 @@ jest-util@^29.7.0: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-validate@^29.4.3: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -7694,6 +9159,11 @@ jest-worker@^29.4.3: merge-stream "^2.0.0" supports-color "^8.0.0" +jiti@^1.17.1: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + jiti@^1.18.2, jiti@^1.19.1, jiti@^1.20.0: version "1.21.0" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" @@ -7715,6 +9185,16 @@ js-levenshtein@^1.1.6: resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== +js-sha256@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.10.1.tgz#b40104ba1368e823fdd5f41b66b104b15a0da60d" + integrity sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7740,6 +9220,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -7789,7 +9274,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.0.0, json5@^2.1.2, json5@^2.2.3: +json5@^2.0.0, json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -7813,6 +9298,16 @@ jsonfile@^6.0.1: object.assign "^4.1.4" object.values "^1.1.6" +jszip@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + katex@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" @@ -7870,6 +9365,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -7962,6 +9464,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -8080,6 +9587,13 @@ marked@^4.3.0: resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + mdast-util-directive@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" @@ -8104,6 +9618,17 @@ mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" +mdast-util-from-markdown@^0.8.0: + version "0.8.5" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" + integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string "^2.0.0" + micromark "~2.11.0" + parse-entities "^2.0.0" + unist-util-stringify-position "^2.0.0" + mdast-util-from-markdown@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz#52f14815ec291ed061f2922fd14d6689c810cb88" @@ -8261,6 +9786,20 @@ mdast-util-phrasing@^4.0.0: "@types/mdast" "^4.0.0" unist-util-is "^6.0.0" +mdast-util-to-hast@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" + integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + mdast-util-to-hast@^13.0.0: version "13.0.2" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" @@ -8289,6 +9828,11 @@ mdast-util-to-markdown@^2.0.0: unist-util-visit "^5.0.0" zwitch "^2.0.0" +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + mdast-util-to-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" @@ -8313,6 +9857,11 @@ mdn-data@2.0.30: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -8325,6 +9874,11 @@ memfs@^3.1.2, memfs@^3.4.3: dependencies: fs-monkey "^1.0.4" +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -8340,6 +9894,11 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +messageformat-parser@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-4.1.3.tgz#b824787f57fcda7d50769f5b63e8d4fda68f5b9e" + integrity sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -8761,6 +10320,14 @@ micromark@^4.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark@~2.11.0: + version "2.11.4" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" + integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== + dependencies: + debug "^4.0.0" + parse-entities "^2.0.0" + micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -8905,6 +10472,11 @@ mobx@^6.12.4: resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.13.1.tgz#76c41aa675199f75b84a257e4bec8ff839e33259" integrity sha512-ekLRxgjWJr8hVxj9ZKuClPwM/iHckx3euIJ3Np7zLVNtqJvfbbq7l370W/98C8EabdQ1pB5Jd3BbDWxJPNnaOg== +moo@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" + integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== + mrmime@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" @@ -8942,7 +10514,7 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.6, nanoid@^3.3.7: +nanoid@3.3.7, nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -9247,6 +10819,13 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +oniguruma-to-js@0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz#8d899714c21f5c7d59a3c0008ca50e848086d740" + integrity sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ== + dependencies: + regex "^4.3.2" + open@^8.0.9, open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -9281,6 +10860,11 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + p-cancelable@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" @@ -9363,6 +10947,11 @@ package-json@^8.1.0: registry-url "^6.0.0" semver "^7.3.7" +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -9378,6 +10967,18 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-entities@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" @@ -9614,6 +11215,16 @@ polished@^4.2.2: dependencies: "@babel/runtime" "^7.17.8" +popmotion@11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-11.0.3.tgz#565c5f6590bbcddab7a33a074bb2ba97e24b0cc9" + integrity sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA== + dependencies: + framesync "6.0.1" + hey-listen "^1.0.8" + style-value-types "5.0.0" + tslib "^2.1.0" + postcss-calc@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" @@ -9982,6 +11593,21 @@ postcss@^8.4.45: picocolors "^1.1.0" source-map-js "^1.2.1" +posthog-js@^1.136.8: + version "1.174.2" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.174.2.tgz#a8e92a5ff0c2f9451538b13ef0609e61343af694" + integrity sha512-UgS7eRcDVvVz2XSJ09NMX8zBcdpFnPayfiWDNF3xEbJTsIu1GipkkYNrVlsWlq8U1PIrviNm6i0Dyq8daaxssw== + dependencies: + core-js "^3.38.1" + fflate "^0.4.8" + preact "^10.19.3" + web-vitals "^4.2.0" + +preact@^10.19.3: + version "10.24.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.24.3.tgz#086386bd47071e3b45410ef20844c21e23828f64" + integrity sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -10007,6 +11633,15 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" @@ -10057,7 +11692,7 @@ prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -property-information@^5.0.0: +property-information@^5.0.0, property-information@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== @@ -10130,6 +11765,11 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +ramda@^0.27.1: + version "0.27.2" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" + integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -10167,6 +11807,11 @@ rc@1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-complex-tree@^2.3.7: + version "2.4.5" + resolved "https://registry.yarnpkg.com/react-complex-tree/-/react-complex-tree-2.4.5.tgz#d752172ea116108ad2d56da7eb6c0d2604b5ddef" + integrity sha512-RcdgHxe7uUlRHeHS8im1izuIZko3sbtrfR1ZbMuGi3I83AfpuAfQSzhCU7lNRKgAYCDyRGq+92N06uz8Wp3BDg== + react-dev-utils@^12.0.1: version "12.0.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" @@ -10235,7 +11880,7 @@ react-helmet-async@^1.3.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.2.0: +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0, react-is@^18.3.1: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== @@ -10264,6 +11909,51 @@ react-loadable-ssr-addon-v5-slorber@^1.0.1: dependencies: "@types/react" "*" +react-remark@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-remark/-/react-remark-2.1.0.tgz#dd68a32ab2d022e598b27dbfb754400e8f68555c" + integrity sha512-7dEPxRGQ23sOdvteuRGaQAs9cEOH/BOeCN4CqsJdk3laUDIDYRCWnM6a3z92PzXHUuxIRLXQNZx7SiO0ijUcbw== + dependencies: + rehype-react "^6.0.0" + remark-parse "^9.0.0" + remark-rehype "^8.0.0" + unified "^9.0.0" + +react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-remove-scroll@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07" + integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ== + dependencies: + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-resizable-panels@2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/react-resizable-panels/-/react-resizable-panels-2.0.19.tgz#df259898c682cb774af65c3bc38c1b29c855b99b" + integrity sha512-v3E41kfKSuCPIvJVb4nL4mIZjjKIn/gh6YqZF/gDfQDolv/8XnhJBek4EiV2gOr3hhc5A3kOGOayk3DhanpaQw== + react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" @@ -10307,6 +11997,24 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" +react-smooth@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-4.0.1.tgz#6200d8699bfe051ae40ba187988323b1449eab1a" + integrity sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w== + dependencies: + fast-equals "^5.0.1" + prop-types "^15.8.1" + react-transition-group "^4.4.5" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + react-tabs@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/react-tabs/-/react-tabs-6.0.2.tgz#bc1065c3828561fee285a8fd045f22e0fcdde1eb" @@ -10315,6 +12023,16 @@ react-tabs@^6.0.2: clsx "^2.0.0" prop-types "^15.5.0" +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -10337,7 +12055,7 @@ read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: json-parse-even-better-errors "^3.0.0" npm-normalize-package-bin "^3.0.0" -readable-stream@^2.0.1: +readable-stream@^2.0.1, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -10378,6 +12096,27 @@ reading-time@^1.5.0: resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== +recharts-scale@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" + integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== + dependencies: + decimal.js-light "^2.4.1" + +recharts@^2.12.4: + version "2.13.0" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.13.0.tgz#a293322ea357491393cc7ad6fcbb1e5f8e99bc93" + integrity sha512-sbfxjWQ+oLWSZEWmvbq/DFVdeRLqqA6d0CDjKx2PkxVVdoXo16jvENCE+u/x7HxOO+/fwx//nYRwb8p8X6s/lQ== + dependencies: + clsx "^2.0.0" + eventemitter3 "^4.0.1" + lodash "^4.17.21" + react-is "^18.3.1" + react-smooth "^4.0.0" + recharts-scale "^0.4.4" + tiny-invariant "^1.3.1" + victory-vendor "^36.6.8" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -10457,6 +12196,11 @@ regenerator-transform@^0.15.2: dependencies: "@babel/runtime" "^7.8.4" +regex@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/regex/-/regex-4.3.3.tgz#8cda73ccbdfa7c5691881d02f9bb142dba9daa6a" + integrity sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg== + regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" @@ -10533,6 +12277,23 @@ rehype-raw@^7.0.0: hast-util-raw "^9.0.0" vfile "^6.0.0" +rehype-react@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz#9b9bf188451ad6f63796b784fe1f51165c67b73a" + integrity sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg== + dependencies: + "@mapbox/hast-util-table-cell-style" "^0.2.0" + hast-to-hyperscript "^9.0.0" + +rehype-react@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-8.0.0.tgz#a3e2fecb10579af7bb065c7b232410a500699ba7" + integrity sha512-vzo0YxYbB2HE+36+9HWXVdxNoNDubx63r5LBzpxBGVWM8s9mdnMdbmuJBAX6TTyuGdZjZix6qU3GcSuKCIWivw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" + unified "^11.0.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -10614,6 +12375,13 @@ remark-parse@^11.0.0: micromark-util-types "^2.0.0" unified "^11.0.0" +remark-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" + integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== + dependencies: + mdast-util-from-markdown "^0.8.0" + remark-rehype@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.0.0.tgz#7f21c08738bde024be5f16e4a8b13e5d7a04cf6b" @@ -10625,6 +12393,24 @@ remark-rehype@^11.0.0: unified "^11.0.0" vfile "^6.0.0" +remark-rehype@^11.1.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-11.1.1.tgz#f864dd2947889a11997c0a2667cd6b38f685bca7" + integrity sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + mdast-util-to-hast "^13.0.0" + unified "^11.0.0" + vfile "^6.0.0" + +remark-rehype@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" + integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== + dependencies: + mdast-util-to-hast "^10.2.0" + remark-stringify@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" @@ -10892,6 +12678,11 @@ semver-diff@^4.0.0: dependencies: semver "^7.3.5" +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -11003,6 +12794,11 @@ set-function-name@^2.0.0: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -11059,6 +12855,18 @@ shiki@1.14.1: "@shikijs/core" "1.14.1" "@types/hast" "^3.0.4" +shiki@1.22.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.22.0.tgz#45d1dfff0e03a598af70e2ec8592f14ef07827b4" + integrity sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw== + dependencies: + "@shikijs/core" "1.22.0" + "@shikijs/engine-javascript" "1.22.0" + "@shikijs/engine-oniguruma" "1.22.0" + "@shikijs/types" "1.22.0" + "@shikijs/vscode-textmate" "^9.3.0" + "@types/hast" "^3.0.4" + should-equal@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" @@ -11185,6 +12993,19 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +solc@^0.8.25: + version "0.8.28" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.28.tgz#43f129ce31572625593677cc3ff53eb32100148c" + integrity sha512-AFCiJ+b4RosyyNhnfdVH4ZR1+TxiL91iluPjw0EJslIu4LXGM9NYqi2z5y8TqochC4tcH9QsHfwWhOIC9jPDKA== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + sort-css-media-queries@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz#aa33cf4a08e0225059448b6c40eddbf9f1c8334c" @@ -11271,6 +13092,11 @@ srcset@^4.0.0: resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== +state-local@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" + integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -11438,6 +13264,13 @@ strtok3@^7.0.0: "@tokenizer/token" "^0.3.0" peek-readable "^5.0.0" +style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + style-to-object@^0.4.0: version "0.4.4" resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" @@ -11445,6 +13278,14 @@ style-to-object@^0.4.0: dependencies: inline-style-parser "0.1.1" +style-value-types@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-5.0.0.tgz#76c35f0e579843d523187989da866729411fc8ad" + integrity sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA== + dependencies: + hey-listen "^1.0.8" + tslib "^2.1.0" + styled-components@^6.1.11: version "6.1.12" resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.12.tgz#0d9d511aacfb9052936146dcc2856559e6fae4df" @@ -11460,6 +13301,21 @@ styled-components@^6.1.11: stylis "4.3.2" tslib "2.6.2" +styled-components@^6.1.8: + version "6.1.13" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.13.tgz#2d777750b773b31469bd79df754a32479e9f475e" + integrity sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw== + dependencies: + "@emotion/is-prop-valid" "1.2.2" + "@emotion/unitless" "0.8.1" + "@types/stylis" "4.2.5" + css-to-react-native "3.2.0" + csstype "3.1.3" + postcss "8.4.38" + shallowequal "1.1.0" + stylis "4.3.2" + tslib "2.6.2" + stylehacks@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.1.1.tgz#543f91c10d17d00a440430362d419f79c25545a6" @@ -11552,11 +13408,29 @@ swagger2openapi@^7.0.8: yaml "^1.10.0" yargs "^17.0.1" +swr@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b" + integrity sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg== + dependencies: + client-only "^0.0.1" + use-sync-external-store "^1.2.0" + +tailwind-merge@^2.2.1: + version "2.5.4" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.4.tgz#4bf574e81fa061adeceba099ae4df56edcee78d1" + integrity sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q== + tailwind-scrollbar-hide@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/tailwind-scrollbar-hide/-/tailwind-scrollbar-hide-1.1.7.tgz#90b481fb2e204030e3919427416650c54f56f847" integrity sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA== +tailwindcss-animate@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4" + integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== + tailwindcss@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.5.tgz#22a59e2fbe0ecb6660809d9cc5f3976b077be3b8" @@ -11672,11 +13546,23 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== +tiny-invariant@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + tiny-warning@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -11770,6 +13656,11 @@ tslib@2.6.2, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6. resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.0.0, tslib@^2.3.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" + integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -12038,6 +13929,19 @@ unified@^11.0.0, unified@^11.0.3, unified@^11.0.4: trough "^2.0.0" vfile "^6.0.0" +unified@^11.0.5: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + unified@^9.0.0: version "9.2.2" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" @@ -12057,6 +13961,11 @@ unique-string@^3.0.0: dependencies: crypto-random-string "^4.0.0" +unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + unist-util-find-after@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-3.0.0.tgz#5c65fcebf64d4f8f496db46fa8fd0fbf354b43e6" @@ -12064,6 +13973,11 @@ unist-util-find-after@^3.0.0: dependencies: unist-util-is "^4.0.0" +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + unist-util-inspect@^7.0.0: version "7.0.2" resolved "https://registry.yarnpkg.com/unist-util-inspect/-/unist-util-inspect-7.0.2.tgz#858e4f02ee4053f7c6ada8bc81662901a0ee1893" @@ -12078,6 +13992,11 @@ unist-util-inspect@^8.0.0: dependencies: "@types/unist" "^3.0.0" +unist-util-is@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" + integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== + unist-util-is@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" @@ -12104,6 +14023,11 @@ unist-util-position-from-estree@^2.0.0: dependencies: "@types/unist" "^3.0.0" +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + unist-util-position@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" @@ -12140,6 +14064,13 @@ unist-util-stringify-position@^4.0.0: dependencies: "@types/unist" "^3.0.0" +unist-util-visit-parents@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" + integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== + dependencies: + unist-util-is "^3.0.0" + unist-util-visit-parents@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" @@ -12164,6 +14095,13 @@ unist-util-visit-parents@^6.0.0: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" +unist-util-visit@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" + integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== + dependencies: + unist-util-visit-parents "^2.0.0" + unist-util-visit@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" @@ -12201,6 +14139,11 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +unraw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unraw/-/unraw-3.0.0.tgz#73443ed70d2ab09ccbac2b00525602d5991fbbe3" + integrity sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg== + update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" @@ -12258,6 +14201,21 @@ url-template@^2.0.8: resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== +use-callback-ref@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== + dependencies: + tslib "^2.0.0" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + use-sync-external-store@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" @@ -12424,6 +14382,40 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" +victory-vendor@^36.6.8: + version "36.9.2" + resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.9.2.tgz#668b02a448fa4ea0f788dbf4228b7e64669ff801" + integrity sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ== + dependencies: + "@types/d3-array" "^3.0.3" + "@types/d3-ease" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-time" "^3.0.0" + "@types/d3-timer" "^3.0.0" + d3-array "^3.1.6" + d3-ease "^3.0.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-shape "^3.1.0" + d3-time "^3.0.0" + d3-timer "^3.0.1" + +viem@2.9.16: + version "2.9.16" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.9.16.tgz#2127871db1908a70798eddb820024b5f0ddc9152" + integrity sha512-FQRfN4G7uKEUs5DYvVrH/kZmTkwcSDpTBxnadpwG1EEP8nHm57WDpSaGN7PwSPVgJ6rMo5MENT5hgnqaNTlb2w== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "1.0.0" + isows "1.0.3" + ws "8.13.0" + walk-up-path@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" @@ -12459,6 +14451,11 @@ web-streams-polyfill@^3.0.3: resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== +web-vitals@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-4.2.3.tgz#270c4baecfbc6ec6fc15da1989e465e5f9b94fb7" + integrity sha512-/CFAm1mNxSmOj6i0Co+iGFJ58OS4NRGVP+AWS/l509uIK5a1bSoIVaHz/ZumpHTfHSZBpgrJ+wjfpAOrTHok5Q== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -12695,6 +14692,11 @@ write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +ws@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + ws@^7.3.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" @@ -12790,7 +14792,7 @@ zod@^3.23.8: resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== -zwitch@^2.0.0: +zwitch@^2.0.0, zwitch@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==