diff --git a/examples/aggregations/package.json b/examples/aggregations/package.json index ee5830812..d45881028 100644 --- a/examples/aggregations/package.json +++ b/examples/aggregations/package.json @@ -10,9 +10,9 @@ "scripts": { "build": "graph build", "codegen": "graph codegen", - "create": "graph create example --node https://api.thegraph.com/deploy/", + "create": "graph create example --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create example --node http://127.0.0.1:8020", - "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy example --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020", "test": "graph test" }, diff --git a/examples/arweave-blocks-transactions/package.json b/examples/arweave-blocks-transactions/package.json index c608c3304..bf76c9b6a 100644 --- a/examples/arweave-blocks-transactions/package.json +++ b/examples/arweave-blocks-transactions/package.json @@ -12,9 +12,9 @@ "scripts": { "build": "graph build", "codegen": "graph codegen", - "create": "graph create arweave-example --node https://api.thegraph.com/deploy/", + "create": "graph create arweave-example --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create arweave-example --node http://localhost:8020", - "deploy": "graph deploy arweave-example --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy arweave-example --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy arweave-example -l v0.1.0 --ipfs http://localhost:5001 --node http://localhost:8020", "remove-local": "graph remove arweave-example --node http://localhost:8020" }, diff --git a/examples/cosmos-block-filtering/package.json b/examples/cosmos-block-filtering/package.json index 231eaee3a..dd8b7d839 100644 --- a/examples/cosmos-block-filtering/package.json +++ b/examples/cosmos-block-filtering/package.json @@ -11,9 +11,9 @@ "scripts": { "build": "graph build", "codegen": "graph codegen", - "create": "graph create cosmos-block-filtering --node https://api.thegraph.com/deploy/", + "create": "graph create cosmos-block-filtering --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create cosmos-block-filtering --node http://127.0.0.1:8020", - "deploy": "graph deploy cosmos-block-filtering --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy cosmos-block-filtering --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy cosmos-block-filtering -l v0.1.0 --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020", "prepare:cosmoshub": "mustache config/cosmoshub.json subgraph.template.yaml > subgraph.yaml", "prepare:osmosis": "mustache config/osmosis.json subgraph.template.yaml > subgraph.yaml", diff --git a/examples/cosmos-osmosis-token-swaps/package.json b/examples/cosmos-osmosis-token-swaps/package.json index 9be4cb1ab..e28e0827d 100644 --- a/examples/cosmos-osmosis-token-swaps/package.json +++ b/examples/cosmos-osmosis-token-swaps/package.json @@ -11,9 +11,9 @@ "scripts": { "build": "graph build", "codegen": "graph codegen", - "create": "graph create osmosis-token-swaps --node https://api.thegraph.com/deploy/", + "create": "graph create osmosis-token-swaps --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create osmosis-token-swaps --node http://0.0.0.0:8020", - "deploy": "graph deploy osmosis-token-swaps --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy osmosis-token-swaps --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy osmosis-token-swaps -l v0.1.0 --ipfs http://0.0.0.0:5001 --node http://0.0.0.0:8020", "remove-local": "graph remove osmosis-token-swaps --node http://0.0.0.0:8020" }, diff --git a/examples/cosmos-validator-delegations/package.json b/examples/cosmos-validator-delegations/package.json index 79c7fd7dd..572e875e4 100644 --- a/examples/cosmos-validator-delegations/package.json +++ b/examples/cosmos-validator-delegations/package.json @@ -11,9 +11,9 @@ "scripts": { "build": "graph build", "codegen": "graph codegen", - "create": "graph create cosmos-validator-delegations --node https://api.thegraph.com/deploy/", + "create": "graph create cosmos-validator-delegations --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create cosmos-validator-delegations --node http://127.0.0.1:8020", - "deploy": "graph deploy cosmos-validator-delegations --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy cosmos-validator-delegations --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy cosmos-validator-delegations -l v0.1.0 --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020", "prepare:cosmoshub": "mustache config/cosmoshub.json subgraph.template.yaml > subgraph.yaml", "prepare:osmosis": "mustache config/osmosis.json subgraph.template.yaml > subgraph.yaml", diff --git a/examples/cosmos-validator-rewards/package.json b/examples/cosmos-validator-rewards/package.json index 723f6ee14..45c49d870 100644 --- a/examples/cosmos-validator-rewards/package.json +++ b/examples/cosmos-validator-rewards/package.json @@ -11,9 +11,9 @@ "scripts": { "build": "graph build", "codegen": "graph codegen", - "create": "graph create cosmos-validator-rewards --node https://api.thegraph.com/deploy/", + "create": "graph create cosmos-validator-rewards --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create cosmos-validator-rewards --node http://127.0.0.1:8020", - "deploy": "graph deploy cosmos-validator-rewards --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy cosmos-validator-rewards --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy cosmos-validator-rewards -l v0.1.0 --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020", "prepare:cosmoshub": "mustache config/cosmoshub.json subgraph.template.yaml > subgraph.yaml", "prepare:osmosis": "mustache config/osmosis.json subgraph.template.yaml > subgraph.yaml", diff --git a/examples/ethereum-basic-event-handlers/hardhat/entrypoint.sh b/examples/ethereum-basic-event-handlers/hardhat/entrypoint.sh index 30304dca7..759aa1f59 100644 --- a/examples/ethereum-basic-event-handlers/hardhat/entrypoint.sh +++ b/examples/ethereum-basic-event-handlers/hardhat/entrypoint.sh @@ -3,10 +3,10 @@ #!/bin/sh # Change to the correct directory -cd /usr/src/app; +cd /usr/src/app # Run hardhat -pnpm localnode; +pnpm localnode # Keep node alive set -e diff --git a/examples/ethereum-basic-event-handlers/test/handlers.js b/examples/ethereum-basic-event-handlers/test/handlers.js index d176fdcb5..0fdd0ceea 100644 --- a/examples/ethereum-basic-event-handlers/test/handlers.js +++ b/examples/ethereum-basic-event-handlers/test/handlers.js @@ -1,8 +1,8 @@ -const path = require('node:path'); -const { system, patching, filesystem } = require('gluegun'); -const { createApolloFetch } = require('apollo-fetch'); -const { ethers } = require('hardhat'); -const { expect } = require('chai'); +import path from 'node:path'; +import { createApolloFetch } from 'apollo-fetch'; +import { expect } from 'chai'; +import { filesystem, patching, system } from 'gluegun'; +import { ethers } from 'hardhat'; const srcDir = path.join(__dirname, '..'); diff --git a/examples/ethereum-gravatar/package.json b/examples/ethereum-gravatar/package.json index 9b6a8c708..bda33a86d 100644 --- a/examples/ethereum-gravatar/package.json +++ b/examples/ethereum-gravatar/package.json @@ -12,9 +12,9 @@ "build": "graph build", "build:contract": "hardhat compile", "codegen": "graph codegen", - "create": "graph create example --node https://api.thegraph.com/deploy/", + "create": "graph create example --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create example --node http://127.0.0.1:8020", - "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy example --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020" }, "devDependencies": { diff --git a/examples/near-blocks/package.json b/examples/near-blocks/package.json index 8e7629f77..83bee499c 100644 --- a/examples/near-blocks/package.json +++ b/examples/near-blocks/package.json @@ -11,9 +11,9 @@ "scripts": { "build": "graph build", "codegen": "graph codegen", - "create": "graph create example --node https://api.thegraph.com/deploy/", + "create": "graph create example --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create example --node http://127.0.0.1:8020", - "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy example --ipfs http://localhost:5001 --node http://127.0.0.1:8020" }, "devDependencies": { diff --git a/examples/near-receipts/package.json b/examples/near-receipts/package.json index 0c51f9e2a..4a4d6b75f 100644 --- a/examples/near-receipts/package.json +++ b/examples/near-receipts/package.json @@ -11,9 +11,9 @@ "scripts": { "build": "graph build", "codegen": "graph codegen", - "create": "graph create example --node https://api.thegraph.com/deploy/", + "create": "graph create example --node https://api.studio.thegraph.com/deploy/", "create-local": "graph create example --node http://127.0.0.1:8020", - "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/", + "deploy": "graph deploy example --ipfs https://api.thegraph.com/ipfs/ --node https://api.studio.thegraph.com/deploy/", "deploy-local": "graph deploy example --ipfs http://localhost:5001 --node http://127.0.0.1:8020" }, "devDependencies": { diff --git a/package.json b/package.json index 42ceabc8a..15fdb0a6b 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,9 @@ "type-check": "pnpm --filter=@graphprotocol/graph-cli type-check" }, "devDependencies": { + "@babel/core": "^7.26.0", + "@babel/preset-env": "^7.26.0", + "@babel/preset-typescript": "^7.26.0", "@changesets/changelog-github": "^0.5.0", "@changesets/cli": "^2.27.10", "@theguild/eslint-config": "0.13.1", diff --git a/packages/cli/package.json b/packages/cli/package.json index 0c67473cc..91ce82f56 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -34,6 +34,7 @@ "@oclif/plugin-autocomplete": "^3.2.11", "@oclif/plugin-not-found": "^3.2.29", "@oclif/plugin-warn-if-update-available": "^3.1.24", + "@pinax/graph-networks-registry": "^0.6.5", "@whatwg-node/fetch": "^0.10.1", "assemblyscript": "0.27.31", "binary-install": "^1.1.0", diff --git a/packages/cli/src/command-helpers/abi.test.ts b/packages/cli/src/command-helpers/abi.test.ts index 73c4f1725..539fdf8e7 100644 --- a/packages/cli/src/command-helpers/abi.test.ts +++ b/packages/cli/src/command-helpers/abi.test.ts @@ -1,11 +1,9 @@ import { describe, expect, test } from 'vitest'; -import { getStartBlockForContract } from './abi.js'; +import { NetworksRegistry } from '@pinax/graph-networks-registry'; +import { ContractService } from './contracts'; // An object with some test cases for contract deployment block numbers const TEST_CONTRACT_START_BLOCKS = { - 'arbitrum-goerli': { - '0xde438d54c7b75f798985ae38a4d07b5431702077': 4_488_583, - }, 'arbitrum-one': { '0xF4d73326C13a4Fc5FD7A064217e12780e9Bd62c3': 226_981, }, @@ -18,9 +16,6 @@ const TEST_CONTRACT_START_BLOCKS = { fantom: { '0xf731202A3cf7EfA9368C2d7bD613926f7A144dB5': 28_771_200, }, - goerli: { - '0xff02b7d59975E76F67B63b20b813a9Ec0f6AbD60': 226_385, - }, mainnet: { '0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd': 10_736_242, }, @@ -36,6 +31,33 @@ const TEST_CONTRACT_START_BLOCKS = { optimism: { '0xc35DADB65012eC5796536bD9864eD8773aBc74C4': 7_019_815, }, + celo: { + '0x8084936982D089130e001b470eDf58faCA445008': 10186627, + }, + 'celo-alfajores': { + '0xc857ea98ab2dae9877c9fd23971152cd2776d0e4': 9_142_263, + }, + chapel: { + '0x549fb5626025237351446ac502decdf2f3a4c570': 25_509_955, + }, + 'fantom-testnet': { + '0xa40f1c7cc67180aa941e9ef66ee32f704e9600a6': 13_679_941, + }, + fuji: { + '0x7a2b3f2ca3e0b5867d44ef8bc5ba316f98e05f05': 18_710_858, + }, + gnosis: { + '0xdDCbf776dF3dE60163066A5ddDF2277cB445E0F3': 16655565, + }, + aurora: { + '0x76FA7f90D3900eB95Cfc58AB12c916984AeC50c8': 77431034, + }, + 'aurora-testnet': { + '0x76FA7f90D3900eB95Cfc58AB12c916984AeC50c8': 77431034, + }, + fuse: { + '0x3dB01570D97631f69bbb0ba39796865456Cf89A5': 1000000, + }, // Skipping these networks for now because they do not support the latest etherscan contracts API or is blockScout based @@ -87,14 +109,20 @@ const TEST_CONTRACT_START_BLOCKS = { }; // skip this test since its time consuming -describe.skip('getStartBlockForContract', () => { +describe.sequential('getStartBlockForContract', async () => { + const registry = await NetworksRegistry.fromLatestVersion(); + const contractService = new ContractService(registry); for (const [network, contracts] of Object.entries(TEST_CONTRACT_START_BLOCKS)) { for (const [contract, startBlockExp] of Object.entries(contracts)) { - test(`Returns the start block ${network} ${contract} ${startBlockExp}`, async () => { - //loop through the TEST_CONTRACT_START_BLOCKS object and test each network - const startBlock = await getStartBlockForContract(network, contract); - expect(startBlock).toBe(startBlockExp); - }); + test( + `Returns the start block ${network} ${contract} ${startBlockExp}`, + async () => { + //loop through the TEST_CONTRACT_START_BLOCKS object and test each network + const startBlock = await contractService.getStartBlock(network, contract); + expect(parseInt(startBlock)).toBe(startBlockExp); + }, + { timeout: 10000 }, + ); } } }); diff --git a/packages/cli/src/command-helpers/abi.ts b/packages/cli/src/command-helpers/abi.ts deleted file mode 100644 index d41c0a232..000000000 --- a/packages/cli/src/command-helpers/abi.ts +++ /dev/null @@ -1,528 +0,0 @@ -import immutable from 'immutable'; -import { GRAPH_CLI_SHARED_HEADERS } from '../constants.js'; -import debugFactory from '../debug.js'; -import fetch from '../fetch.js'; -import ABI from '../protocols/ethereum/abi.js'; -import { withSpinner } from './spinner.js'; - -const logger = debugFactory('graph-cli:abi-helpers'); - -const fetchFromEtherscan = async (url: string): Promise => { - const result = await fetch(url); - let json: any = {}; - - if (result.ok) { - json = await result.json().catch(error => { - throw new Error(`Failed to read JSON response from Etherscan: ${error}`); - }); - - // Etherscan returns a JSON object that has a `status`, a `message` and - // a `result` field. The `status` is '0' in case of errors and '1' in - // case of success - if (json.status === '1') return json; - } - - logger( - 'Failed to fetchFromEtherscan: [%s] %s (%s)\n%O', - result.status, - result.statusText, - result.url, - json, - ); - return null; -}; - -export const loadAbiFromEtherscan = async ( - ABICtor: typeof ABI, - network: string, - address: string, -): Promise => - await withSpinner( - `Fetching ABI from Etherscan`, - `Failed to fetch ABI from Etherscan`, - `Warnings while fetching ABI from Etherscan`, - async () => { - const scanApiUrl = getEtherscanLikeAPIUrl(network); - const json = await fetchFromEtherscan( - `${scanApiUrl}?module=contract&action=getabi&address=${address}`, - ); - - if (json) - return new ABICtor('Contract', undefined, immutable.fromJS(JSON.parse(json.result))); - - throw new Error('Try loading it from a local file'); - }, - ); - -export const loadStartBlockForContract = async ( - network: string, - address: string, -): Promise => - await withSpinner( - `Fetching Start Block`, - `Failed to fetch Start Block`, - `Warnings while fetching deploy contract transaction from Etherscan`, - async () => { - return getStartBlockForContract(network, address); - }, - ); - -export const loadContractNameForAddress = async ( - network: string, - address: string, -): Promise => - await withSpinner( - `Fetching Contract Name`, - `Failed to fetch Contract Name`, - `Warnings while fetching contract name from Etherscan`, - async () => { - return getContractNameForAddress(network, address); - }, - ); - -export const fetchDeployContractTransactionFromEtherscan = async ( - network: string, - address: string, -): Promise => { - const scanApiUrl = getEtherscanLikeAPIUrl(network); - const json = await fetchFromEtherscan( - `${scanApiUrl}?module=contract&action=getcontractcreation&contractaddresses=${address}`, - ); - - if (json) { - const hash = json.result[0].txHash; - logger('Successfully fetchDeployContractTransactionFromEtherscan. txHash: %s', hash); - return hash; - } - - throw new Error(`Failed to fetch deploy contract transaction`); -}; - -export const fetchTransactionByHashFromRPC = async ( - network: string, - transactionHash: string, -): Promise => { - let json: any; - const RPCURL = getPublicRPCEndpoint(network); - try { - if (!RPCURL) throw new Error(`Unable to fetch RPC URL for ${network}`); - const result = await fetch(String(RPCURL), { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...GRAPH_CLI_SHARED_HEADERS, - }, - body: JSON.stringify({ - jsonrpc: '2.0', - method: 'eth_getTransactionByHash', - params: [transactionHash], - id: 1, - }), - }); - json = await result.json(); - return json; - } catch (error) { - logger('Failed to fetchTransactionByHashFromRPC: %O', error); - throw new Error( - `Failed to run \`eth_getTransactionByHash\` on RPC (${RPCURL}) (run with env \`DEBUG=*\` for full error).`, - ); - } -}; - -export const fetchSourceCodeFromEtherscan = async ( - network: string, - address: string, -): Promise => { - const scanApiUrl = getEtherscanLikeAPIUrl(network); - const json = await fetchFromEtherscan( - `${scanApiUrl}?module=contract&action=getsourcecode&address=${address}`, - ); - - // Have to check that the SourceCode response is not empty due to Etherscan API bug responding with - // 1 - OK on non-valid contracts. - if (json.result[0].SourceCode) return json; - - throw new Error(`Failed to fetch contract source code: ${json.result[0].ABI}`); -}; - -export const getContractNameForAddress = async ( - network: string, - address: string, -): Promise => { - try { - const contractSourceCode = await fetchSourceCodeFromEtherscan(network, address); - let contractName: string = contractSourceCode.result[0].ContractName; - - // Some explorers will return the full path of the contract instead of just the name - // Example: contracts/SyncSwapRouter.sol:SyncSwapRouter - if (contractName.includes(':')) - contractName = contractName.substring(contractName.lastIndexOf(':') + 1); - - logger('Successfully getContractNameForAddress. contractName: %s', contractName); - return contractName; - } catch (error) { - logger('Failed to fetch getContractNameForAddress: %O', error); - throw new Error(error?.message); - } -}; - -export const getStartBlockForContract = async ( - network: string, - address: string, -): Promise => { - try { - const transactionHash = await fetchDeployContractTransactionFromEtherscan(network, address); - const txn = await fetchTransactionByHashFromRPC(network, transactionHash); - const blockNumber = parseInt(txn.result.blockNumber, 16); - logger('Successfully getStartBlockForContract. blockNumber: %s', blockNumber); - return blockNumber; - } catch (error) { - logger('Failed to fetch getStartBlockForContract: %O', error); - throw new Error(error?.message); - } -}; - -export const loadAbiFromBlockScout = async ( - ABICtor: typeof ABI, - network: string, - address: string, -) => - await withSpinner( - `Fetching ABI from BlockScout`, - `Failed to fetch ABI from BlockScout`, - `Warnings while fetching ABI from BlockScout`, - async () => { - const result = await fetch( - `https://blockscout.com/${network.replace( - '-', - '/', - )}/api?module=contract&action=getabi&address=${address}`, - ); - const json = await result.json(); - - // BlockScout returns a JSON object that has a `status`, a `message` and - // a `result` field. The `status` is '0' in case of errors and '1' in - // case of success - if (json.status === '1') { - logger('Successfully loadAbiFromBlockScout. address: %s', address); - return new ABICtor('Contract', undefined, immutable.fromJS(JSON.parse(json.result))); - } - logger('Failed to loadAbiFromBlockScout. address: %s', address); - throw new Error('ABI not found, try loading it from a local file'); - }, - ); - -const getEtherscanLikeAPIUrl = (network: string) => { - switch (network) { - case 'mainnet': - return `https://mainnet.abi.pinax.network/api`; - case 'arbitrum-one': - return `https://arbitrum-one.abi.pinax.network/api`; - case 'arbitrum-goerli': - return `https://api-goerli.arbiscan.io/api`; - case 'arbitrum-sepolia': - return `https://arbitrum-sepolia.abi.pinax.network/api`; - case 'bsc': - return `https://bsc.abi.pinax.network/api`; - case 'base-testnet': - return `https://api-goerli.basescan.org/api`; - case 'base-sepolia': - return `https://base-sepolia.abi.pinax.network/api`; - case 'base': - return `https://base.abi.pinax.network/api`; - case 'chapel': - return `https://bsc-testnet.abi.pinax.network/api`; - case 'matic': - return `https://polygon.abi.pinax.network/api`; - case 'mumbai': - return `https://polygon-mumbai.abi.pinax.network/api`; - case 'aurora': - return `https://explorer.mainnet.aurora.dev/api`; - case 'aurora-testnet': - return `https://explorer.testnet.aurora.dev/api`; - case 'optimism-goerli': - return `https://api-goerli-optimistic.etherscan.io/api`; - case 'optimism': - return `https://optimism.abi.pinax.network/api`; - case 'moonbeam': - return `https://moonbeam.abi.pinax.network/api`; - case 'moonriver': - return `https://api-moonriver.moonscan.io/api`; - case 'mbase': - return `https://moonbase.abi.pinax.network/api`; - case 'avalanche': - return `https://api.snowtrace.io/api`; - case 'fuji': - return `https://api-testnet.snowtrace.io/api`; - case 'celo': - return `https://celo.abi.pinax.network/api`; - case 'celo-alfajores': - return `https://celo-alfajores.abi.pinax.network/api`; - case 'gnosis': - return `https://gnosis.abi.pinax.network/api`; - case 'fantom': - return `https://fantom.abi.pinax.network/api`; - case 'fantom-testnet': - return `https://fantom-testnet.abi.pinax.network/api`; - case 'zksync-era': - return `https://block-explorer-api.mainnet.zksync.io/api`; - case 'zksync-era-testnet': - return `https://block-explorer-api.testnets.zksync.dev/api`; - case 'zksync-era-sepolia': - return 'https://block-explorer-api.sepolia.zksync.dev/api'; - case 'polygon-zkevm-testnet': - return `https://testnet-zkevm.polygonscan.com/api`; - case 'polygon-zkevm': - return `https://polygon-zkevm.abi.pinax.network/api`; - case 'sepolia': - return `https://sepolia.abi.pinax.network/api`; - case 'scroll-sepolia': - return `https://api-sepolia.scrollscan.dev/api`; - case 'optimism-sepolia': - return `https://optimism-sepolia.abi.pinax.network/api`; - case 'scroll': - return `https://api.scrollscan.com/api`; - case 'linea': - return `https://linea.abi.pinax.network/api`; - case 'linea-sepolia': - return 'https://linea-sepolia.abi.pinax.network/api'; - case 'linea-goerli': - return `https://api.linea-goerli.build/api`; - case 'blast-testnet': - return `https://blast-testnet.abi.pinax.network/api`; - case 'blast-mainnet': - return `https://blast.abi.pinax.network/api`; - case 'etherlink-testnet': - return `https://testnet-explorer.etherlink.com/api`; - case 'polygon-amoy': - return `https://polygon-amoy.abi.pinax.network/api`; - case 'gnosis-chiado': - return `https://gnosis-chiado.blockscout.com/api`; - case 'mode-mainnet': - return `https://explorer.mode.network/api`; - case 'mode-sepolia': - return `https://sepolia.explorer.mode.network/api`; - case 'fuse': - return 'https://explorer.fuse.io/api'; - case 'astar-zkevm-mainnet': - return `https://astar-zkevm.explorer.startale.com/api`; - case 'polygon-zkevm-cardona': - return `https://polygon-zkevm-cardona.abi.pinax.network/api`; - case 'sei-mainnet': - return `https://seitrace.com/pacific-1/api`; - case 'sei-atlantic': - return `https://seitrace.com/atlantic-2/api`; - case 'rootstock': - return 'https://rootstock.blockscout.com/api'; - case 'iotex': - return 'https://index.iotexscan.io/api'; - case 'gravity-mainnet': - return 'https://explorer.gravity.xyz/api'; - case 'gravity-testnet': - return 'https://explorer-sepolia.gravity.xyz/api'; - case 'etherlink-mainnet': - return 'https://explorer.etherlink.com/api'; - case 'iotex-testnet': - return 'https://testnet.index.iotexscan.io/api'; - case 'neox': - return 'https://xexplorer.neo.org/api/ngd/api'; - case 'neox-testnet': - return 'https://xt4scan.ngd.network/api/ngd/api'; - case 'arbitrum-nova': - return 'https://arbitrum-nova.abi.pinax.network/api'; - case 'soneium-testnet': - return 'https://soneium-minato.blockscout.com/api'; - case 'chiliz': - return 'https://scan.chiliz.com/api'; - case 'chiliz-testnet': - return 'https://spicy-explorer.chiliz.com/api'; - case 'boba': - return 'https://api.routescan.io/v2/network/mainnet/evm/288/etherscan/api'; - case 'boba-testnet': - return 'https://api.routescan.io/v2/network/testnet/evm/28882/etherscan/api'; - case 'boba-bnb': - return 'https://api.routescan.io/v2/network/mainnet/evm/56288/etherscan/api'; - case 'boba-bnb-testnet': - return 'https://api.routescan.io/v2/network/testnet/evm/9728/etherscan/api'; - case 'fuse-testnet': - return 'https://explorer.fusespark.io/api'; - case 'rootstock-testnet': - return 'https://rootstock-testnet.blockscout.com/api'; - case 'unichain-testnet': - return 'https://unichain-sepolia.blockscout.com/api'; - case 'lens-testnet': - return 'https://block-explorer-api.testnet.lens.dev/api'; - case 'abstract-testnet': - return 'https://block-explorer-api.testnet.abs.xyz/api'; - case 'corn': - return 'https://maizenet-explorer.usecorn.com/api'; - case 'corn-testnet': - return 'https://testnet-explorer.usecorn.com/api'; - default: - return `https://api-${network}.etherscan.io/api`; - } -}; -const getPublicRPCEndpoint = (network: string) => { - switch (network) { - case 'arbitrum-goerli': - return 'https://goerli-rollup.arbitrum.io/rpc'; - case 'arbitrum-one': - return 'https://arb1.arbitrum.io/rpc'; - case 'arbitrum-sepolia': - return `https://sepolia-rollup.arbitrum.io/rpc`; - case 'aurora': - return 'https://rpc.mainnet.aurora.dev'; - case 'aurora-testnet': - return 'https://rpc.testnet.aurora.dev'; - case 'avalanche': - return 'https://api.avax.network/ext/bc/C/rpc'; - case 'base-testnet': - return 'https://goerli.base.org'; - case 'base-sepolia': - return 'https://sepolia.base.org'; - case 'base': - return 'https://mainnet.base.org'; - case 'bsc': - return 'https://bsc-dataseed.binance.org'; - case 'celo': - return 'https://forno.celo.org'; - case 'celo-alfajores': - return 'https://alfajores-forno.celo-testnet.org'; - case 'chapel': - return 'https://rpc.chapel.dev'; - case 'clover': - return 'https://rpc.clover.finance'; - case 'fantom': - return 'https://rpcapi.fantom.network'; - case 'fantom-testnet': - return 'https://rpc.testnet.fantom.network'; - case 'fuji': - return 'https://api.avax-test.network/ext/bc/C/rpc'; - case 'fuse': - return 'https://rpc.fuse.io'; - case 'goerli': - return 'https://rpc.ankr.com/eth_goerli'; - case 'gnosis': - return 'https://rpc.gnosischain.com'; - case 'mainnet': - return 'https://rpc.ankr.com/eth'; - case 'matic': - return 'https://polygon-rpc.com/'; - case 'mbase': - return 'https://rpc.moonbase.moonbeam.network'; - case 'mumbai': - return 'https://rpc-mumbai.maticvigil.com'; - case 'moonbeam': - return 'https://rpc.api.moonbeam.network'; - case 'moonriver': - return 'https://moonriver.public.blastapi.io'; - case 'optimism': - return 'https://mainnet.optimism.io'; - case 'optimism-goerli': - return 'https://goerli.optimism.io'; - case 'poa-core': - return 'https://core.poa.network'; - case 'poa-sokol': - return 'https://sokol.poa.network'; - case 'polygon-zkevm-testnet': - return 'https://rpc.public.zkevm-test.net'; - case 'polygon-zkevm': - return 'https://zkevm-rpc.com'; - case 'rinkeby': - return 'https://rpc.ankr.com/eth_rinkeby'; - case 'zksync-era': - return 'https://mainnet.era.zksync.io'; - case 'zksync-era-testnet': - return 'https://testnet.era.zksync.dev'; - case 'zksync-era-sepolia': - return 'https://sepolia.era.zksync.dev'; - case 'sepolia': - return 'https://rpc.ankr.com/eth_sepolia'; - case 'scroll-sepolia': - return 'https://rpc.ankr.com/scroll_sepolia_testnet'; - case 'scroll': - return 'https://rpc.ankr.com/scroll'; - case 'linea': - return 'https://linea-mainnet.public.blastapi.io'; - case 'linea-sepolia': - return 'https://linea-sepolia.public.blastapi.io'; - case 'linea-goerli': - return 'https://linea-goerli.public.blastapi.io'; - case 'blast-testnet': - return 'https://sepolia.blast.io'; - case 'blast-mainnet': - return 'https://rpc.blast.io'; - case 'optimism-sepolia': - return 'https://sepolia.optimism.io'; - case 'etherlink-testnet': - return `https://node.ghostnet.etherlink.com`; - case 'polygon-amoy': - return `https://rpc-amoy.polygon.technology`; - case 'gnosis-chiado': - return `https://rpc.chiadochain.net`; - case 'mode-mainnet': - return `https://mainnet.mode.network`; - case 'mode-sepolia': - return `https://sepolia.mode.network`; - case 'astar-zkevm-mainnet': - return `https://1rpc.io/astr`; - case 'polygon-zkevm-cardona': - return `https://rpc.cardona.zkevm-rpc.com`; - case 'sei-mainnet': - return `https://evm-rpc.sei-apis.com`; - case 'sei-atlantic': - return `https://evm-rpc-testnet.sei-apis.com`; - case 'rootstock': - return 'https://public-node.rsk.co'; - case 'iotex': - return 'https://iotexrpc.com'; - case 'gravity-mainnet': - return 'https://rpc.gravity.xyz/'; - case 'gravity-testnet': - return 'https://rpc-sepolia.gravity.xyz'; - case 'etherlink-mainnet': - return 'https://node.mainnet.etherlink.com'; - case 'iotex-testnet': - return 'https://babel-api.testnet.iotex.io'; - case 'neox': - return 'https://mainnet-1.rpc.banelabs.org'; - case 'neox-testnet': - return 'https://neoxt4seed1.ngd.network'; - case 'arbitrum-nova': - return 'https://nova.arbitrum.io/rpc'; - case 'soneium-testnet': - return 'https://rpc.minato.soneium.org/'; - case 'chiliz': - return 'https://rpc.ankr.com/chiliz'; - case 'chiliz-testnet': - return 'https://spicy-rpc.chiliz.com'; - case 'boba': - return 'https://boba-eth.drpc.org'; - case 'boba-testnet': - return 'https://sepolia.boba.network'; - case 'boba-bnb': - return 'https://bnb.boba.network'; - case 'boba-bnb-testnet': - return 'https://testnet.bnb.boba.network'; - case 'fuse-testnet': - return 'https://rpc.fusespark.io'; - case 'rootstock-testnet': - return 'https://public-node.testnet.rsk.co'; - case 'kaia': - return 'https://public-en.node.kaia.io'; - case 'kaia-testnet': - return 'https://public-en.kairos.node.kaia.io'; - case 'unichain-testnet': - return 'https://sepolia.unichain.org'; - case 'lens-testnet': - return 'https://api.staging.lens.zksync.dev'; - case 'abstract-testnet': - return 'https://api.testnet.abs.xyz'; - case 'corn': - return 'https://maizenet-rpc.usecorn.com'; - case 'corn-testnet': - return 'https://testnet-rpc.usecorn.com'; - default: - throw new Error(`Unknown network: ${network}`); - } -}; diff --git a/packages/cli/src/command-helpers/compiler.ts b/packages/cli/src/command-helpers/compiler.ts index e27c210c1..8137b8d2c 100644 --- a/packages/cli/src/command-helpers/compiler.ts +++ b/packages/cli/src/command-helpers/compiler.ts @@ -3,7 +3,6 @@ import * as toolbox from 'gluegun'; import Compiler from '../compiler/index.js'; import { GRAPH_CLI_SHARED_HEADERS } from '../constants.js'; import Protocol from '../protocols/index.js'; -import { create } from '../utils.js'; interface CreateCompilerOptions { ipfs: string | URL | undefined; @@ -54,6 +53,7 @@ The IPFS URL must be of the following format: http(s)://host[:port]/[path]`); return null; } + const create = (await import('kubo-rpc-client')).create; // Connect to the IPFS node (if a node address was provided) const ipfsClient = ipfs ? create({ diff --git a/packages/cli/src/command-helpers/contracts.ts b/packages/cli/src/command-helpers/contracts.ts new file mode 100644 index 000000000..976ae3b9b --- /dev/null +++ b/packages/cli/src/command-helpers/contracts.ts @@ -0,0 +1,209 @@ +import immutable from 'immutable'; +import { NetworksRegistry } from '@pinax/graph-networks-registry'; +import debugFactory from '../debug.js'; +import fetch from '../fetch.js'; +import ABI from '../protocols/ethereum/abi.js'; +import { withSpinner } from './spinner.js'; + +const logger = debugFactory('graph-cli:contract-service'); + +export class ContractService { + constructor(private registry: NetworksRegistry) {} + + private async fetchFromEtherscan(url: string): Promise { + const result = await fetch(url).catch(_error => { + throw new Error(`Contract API is unreachable`); + }); + let json: any = {}; + + if (result.ok) { + json = await result.json().catch(error => { + throw new Error(`Invalid JSON: ${error}`); + }); + + if (json.status === '1') return json; + } + + logger( + 'Failed to fetch from contract API: [%s] %s (%s)\n%O', + result.status, + result.statusText, + result.url, + json, + ); + if (json.message) { + throw new Error(`${json.message ?? ''} - ${json.result ?? ''}`); + } + return null; + } + + // replace {api_key} with process.env[api_key] + // return empty string if env var not found + private applyVars(url: string): string { + const match = url.match(/\{([^}]+)\}/); + if (!match) return url; + const key = match[1]; + return process.env[key] ? url.replace(`{${key}}`, process.env[key]) : ''; + } + + private getEtherscanUrls(networkId: string) { + const network = this.registry.getNetworkById(networkId); + if (!network) { + throw new Error(`Invalid network ${networkId}`); + } + + return ( + network.apiUrls + ?.filter(item => ['etherscan', 'blockscout'].includes(item.kind)) + ?.map(item => item.url) + .map(this.applyVars) + .filter(Boolean) ?? [] + ); + } + + private getRpcUrls(networkId: string) { + const network = this.registry.getNetworkById(networkId); + if (!network) { + throw new Error(`Invalid network ${networkId}`); + } + + return network.rpcUrls?.map(this.applyVars).filter(Boolean) ?? []; + } + + async getABI(ABICtor: typeof ABI, networkId: string, address: string) { + const urls = this.getEtherscanUrls(networkId); + + let errors: string[] = []; + return await withSpinner( + `Fetching ABI from contract API`, + `Failed to fetch ABI from contract API`, + `Warnings while fetching ABI from contract API`, + async () => { + if (!urls.length) { + throw new Error(`No contract API available for ${networkId} in the registry`); + } + for (const url of urls) { + try { + const json = await this.fetchFromEtherscan( + `${url}?module=contract&action=getabi&address=${address}`, + ); + + if (json) { + return new ABICtor('Contract', undefined, immutable.fromJS(JSON.parse(json.result))); + } + throw new Error(`no result: ${JSON.stringify(json)}`); + } catch (error) { + logger(`Failed to fetch from ${url}: ${error}`); + errors.push(`${error}`); + } + } + + throw new Error(errors?.[0]); + }, + ); + } + + async getStartBlock(networkId: string, address: string): Promise { + const urls = this.getEtherscanUrls(networkId); + + return await withSpinner( + `Fetching start block`, + `Failed to fetch start block`, + `Warnings while fetching deploy contract transaction from contract API`, + async () => { + if (!urls.length) { + throw new Error(`No contract API available for ${networkId} in the registry`); + } + for (const url of urls) { + try { + const json = await this.fetchFromEtherscan( + `${url}?module=contract&action=getcontractcreation&contractaddresses=${address}`, + ); + + if (json?.result?.length) { + if (json.result[0]?.blockNumber) { + return json.result[0].blockNumber; + } + const txHash = json.result[0].txHash; + const tx = await this.fetchTransactionByHash(networkId, txHash); + if (!tx?.blockNumber) { + throw new Error(`no blockNumber: ${JSON.stringify(tx)}`); + } + return Number(tx.blockNumber).toString(); + } + throw new Error(`no result: ${JSON.stringify(json)}`); + } catch (error) { + logger(`Failed to fetch start block from ${url}: ${error}`); + } + } + + throw new Error(`Failed to fetch deploy contract transaction for ${address}`); + }, + ); + } + + async getContractName(networkId: string, address: string): Promise { + const urls = this.getEtherscanUrls(networkId); + + return await withSpinner( + `Fetching contract name`, + `Failed to fetch contract name`, + `Warnings while fetching contract name from contract API`, + async () => { + if (!urls.length) { + throw new Error(`No contract API available for ${networkId} in the registry`); + } + for (const url of urls) { + try { + const json = await this.fetchFromEtherscan( + `${url}?module=contract&action=getsourcecode&address=${address}`, + ); + + if (json) { + const { ContractName } = json.result[0]; + if (ContractName !== '') { + return ContractName; + } + } + throw new Error(`no result: ${JSON.stringify(json)}`); + } catch (error) { + logger(`Failed to fetch from ${url}: ${error}`); + } + } + + throw new Error(`Failed to fetch contract name for ${address}`); + }, + ); + } + + private async fetchTransactionByHash(networkId: string, txHash: string) { + const urls = this.getRpcUrls(networkId); + if (!urls.length) { + throw new Error(`No JSON-RPC available for ${networkId} in the registry`); + } + for (const url of urls) { + try { + const response = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + jsonrpc: '2.0', + method: 'eth_getTransactionByHash', + params: [txHash], + id: 1, + }), + }); + + const json = await response.json(); + if (json.result) { + return json.result; + } + throw new Error(JSON.stringify(json)); + } catch (error) { + logger(`Failed to fetch tx ${txHash} from ${url}: ${error}`); + } + } + + throw new Error(`JSON-RPC is unreachable`); + } +} diff --git a/packages/cli/src/command-helpers/file-resolver.ts b/packages/cli/src/command-helpers/file-resolver.ts new file mode 100644 index 000000000..c12b7e412 --- /dev/null +++ b/packages/cli/src/command-helpers/file-resolver.ts @@ -0,0 +1,74 @@ +import os from 'os'; +import path from 'path'; +import fs from 'fs-extra'; +import fetch from '../fetch.js'; +import { DEFAULT_IPFS_URL } from './ipfs.js'; + +export interface FileSource { + path: string; + cleanup?: () => void; +} + +export async function resolveFile( + source: string, + fileName: string, + timeout: number = 10_000, +): Promise { + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => reject(new Error('File download timed out')), timeout); + }); + + const resolvePromise = async (): Promise => { + // If it's a local file + try { + await fs.access(source, fs.constants.R_OK); + const stats = await fs.stat(source); + if (!stats.isFile()) { + throw new Error('Must be a file'); + } + return { path: source }; + } catch (error) { + if (error.code !== 'ENOENT') { + throw new Error(`Local file is not accessible: ${error.message}`); + } + } + + // Create temp directory for downloads + const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'graph-file-')); + const cleanup = () => fs.removeSync(tempDir); + + try { + // If it's an IPFS hash (Qm...) + if (source.startsWith('Qm')) { + const response = await fetch(`${DEFAULT_IPFS_URL}/cat?arg=${source}`); + if (!response.ok) { + throw new Error(`Failed to fetch file from IPFS: ${response.statusText}`); + } + const filePath = path.join(tempDir, fileName); + const buffer = Buffer.from(await response.arrayBuffer()); + await fs.writeFile(filePath, buffer); + return { path: filePath, cleanup }; + } + + // If it's a URL + if (source.startsWith('http')) { + const response = await fetch(source); + if (!response.ok) { + throw new Error(`Failed to fetch file from URL: ${response.statusText}`); + } + const filePath = path.join(tempDir, fileName); + const buffer = Buffer.from(await response.arrayBuffer()); + await fs.writeFile(filePath, buffer); + + return { path: filePath, cleanup }; + } + + throw new Error('Invalid file source. Must be a file path, IPFS hash, or URL'); + } catch (error) { + await cleanup(); + throw error; + } + }; + + return Promise.race([resolvePromise(), timeoutPromise]); +} diff --git a/packages/cli/src/command-helpers/scaffold.ts b/packages/cli/src/command-helpers/scaffold.ts index b19cc5236..1d7902737 100644 --- a/packages/cli/src/command-helpers/scaffold.ts +++ b/packages/cli/src/command-helpers/scaffold.ts @@ -110,6 +110,8 @@ const writeScaffoldDirectory = async (scaffold: any, directory: string, spinner: // Write file or recurse into subdirectory if (typeof content === 'string') { await fs.writeFile(filename, content, 'utf-8'); + } else if (Buffer.isBuffer(content)) { + await fs.writeFile(filename, content); } else if (content == null) { return; // continue loop } else { diff --git a/packages/cli/src/commands/add.ts b/packages/cli/src/commands/add.ts index 341242891..89466bbd2 100644 --- a/packages/cli/src/commands/add.ts +++ b/packages/cli/src/commands/add.ts @@ -1,12 +1,8 @@ import { filesystem, prompt, system } from 'gluegun'; import immutable from 'immutable'; import { Args, Command, Errors, Flags } from '@oclif/core'; -import { - loadAbiFromBlockScout, - loadAbiFromEtherscan, - loadContractNameForAddress, - loadStartBlockForContract, -} from '../command-helpers/abi.js'; +import { NetworksRegistry } from '@pinax/graph-networks-registry'; +import { ContractService } from '../command-helpers/contracts.js'; import * as DataSourcesExtractor from '../command-helpers/data-sources.js'; import { updateNetworksFile } from '../command-helpers/network.js'; import { @@ -77,8 +73,13 @@ export default class AddCommand extends Command { const network = manifest.result.getIn(['dataSources', 0, 'network']) as any; const result = manifest.result.asMutable(); const isLocalHost = network === 'localhost'; // This flag prevent Etherscan lookups in case the network selected is `localhost` + let contractService: ContractService | undefined; if (isLocalHost) this.warn('`localhost` network detected, prompting user for inputs'); + else { + const registry = await NetworksRegistry.fromLatestVersion(); + contractService = new ContractService(registry); + } let startBlock = startBlockFlag; let contractName = contractNameFlag; @@ -95,13 +96,11 @@ export default class AddCommand extends Command { let ethabi = null; if (abi) { ethabi = EthereumABI.load(contractName, abi); - } else if (network === 'poa-core') { - ethabi = await loadAbiFromBlockScout(EthereumABI, network, address); } else { try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - ethabi = await loadAbiFromEtherscan(EthereumABI, network, address); + ethabi = await contractService?.getABI(EthereumABI, network, address); } catch (error) { // we cannot ask user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { @@ -136,7 +135,7 @@ export default class AddCommand extends Command { try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - startBlock ||= Number(await loadStartBlockForContract(network, address)).toString(); + startBlock ||= Number(await contractService?.getStartBlock(network, address)).toString(); } catch (error) { // we cannot ask user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { @@ -160,7 +159,7 @@ export default class AddCommand extends Command { try { if (isLocalHost) throw Error; // Triggers user prompting without waiting for Etherscan lookup to fail - contractName = await loadContractNameForAddress(network, address); + contractName = (await contractService?.getContractName(network, address)) ?? ''; } catch (error) { // not asking user to do prompt in test environment if (process.env.NODE_ENV !== 'test') { diff --git a/packages/cli/src/commands/deploy.ts b/packages/cli/src/commands/deploy.ts index f87b365df..194210387 100644 --- a/packages/cli/src/commands/deploy.ts +++ b/packages/cli/src/commands/deploy.ts @@ -13,7 +13,6 @@ import { assertGraphTsVersion, assertManifestApiVersion } from '../command-helpe import { GRAPH_CLI_SHARED_HEADERS } from '../constants.js'; import debugFactory from '../debug.js'; import Protocol from '../protocols/index.js'; -import { create } from '../utils.js'; const headersFlag = Flags.custom>({ summary: 'Add custom headers that will be used by the IPFS HTTP client.', @@ -222,6 +221,7 @@ export default class DeployCommand extends Command { // we are provided the IPFS hash, so we deploy directly if (ipfsHash) { + const create = (await import('kubo-rpc-client')).create; // Connect to the IPFS node (if a node address was provided) const ipfsClient = create({ url: appendApiVersionForGraph(ipfs.toString()), diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 31e651c21..9ae2eec91 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -3,16 +3,13 @@ import os from 'os'; import path from 'path'; import { filesystem, prompt, system } from 'gluegun'; import { Args, Command, Flags } from '@oclif/core'; -import { - loadAbiFromBlockScout, - loadAbiFromEtherscan, - loadContractNameForAddress, - loadStartBlockForContract, -} from '../command-helpers/abi.js'; +import { Network, NetworksRegistry } from '@pinax/graph-networks-registry'; import { appendApiVersionForGraph } from '../command-helpers/compiler.js'; +import { ContractService } from '../command-helpers/contracts.js'; +import { resolveFile } from '../command-helpers/file-resolver.js'; import { DEFAULT_IPFS_URL } from '../command-helpers/ipfs.js'; import { initNetworksConfig } from '../command-helpers/network.js'; -import { chooseNodeUrl, SUBGRAPH_STUDIO_URL } from '../command-helpers/node.js'; +import { chooseNodeUrl } from '../command-helpers/node.js'; import { generateScaffold, writeScaffold } from '../command-helpers/scaffold.js'; import { sortWithPriority } from '../command-helpers/sort.js'; import { withSpinner } from '../command-helpers/spinner.js'; @@ -31,49 +28,6 @@ const protocolChoices = Array.from(Protocol.availableProtocols().keys()); const initDebugger = debugFactory('graph-cli:commands:init'); -/** - * a dynamic list of available networks supported by the studio - */ -const AVAILABLE_NETWORKS = async () => { - const logger = initDebugger.extend('AVAILABLE_NETWORKS'); - try { - logger('fetching chain_list from studio'); - const res = await fetch(SUBGRAPH_STUDIO_URL, { - method: 'POST', - headers: { - ...GRAPH_CLI_SHARED_HEADERS, - 'content-type': 'application/json', - }, - body: JSON.stringify({ - jsonrpc: '2.0', - id: 1, - method: 'chain_list', - params: [], - }), - }); - - if (!res.ok) { - logger( - "Something went wrong while fetching 'chain_list' from studio HTTP code: %o", - res.status, - ); - return null; - } - - const result = await res.json(); - if (result?.result) { - logger('chain_list result: %o', result.result); - return result.result as { studio: Array; hostedService: Array }; - } - - logger("Unable to get result for 'chain_list' from studio: %O", result); - return null; - } catch (e) { - logger('error: %O', e); - return null; - } -}; - const DEFAULT_EXAMPLE_SUBGRAPH = 'ethereum-gravatar'; export default class InitCommand extends Command { @@ -149,7 +103,7 @@ export default class InitCommand extends Command { network: Flags.string({ summary: 'Network the contract is deployed to.', description: - 'Check https://thegraph.com/docs/en/developing/supported-networks/ for supported networks', + 'Refer to https://github.com/graphprotocol/networks-registry/ for supported networks', dependsOn: ['from-contract'], }), @@ -241,6 +195,9 @@ export default class InitCommand extends Command { // If all parameters are provided from the command-line, // go straight to creating the subgraph from an existing contract if (fromContract && protocol && subgraphName && directory && network && node) { + const registry = await NetworksRegistry.fromLatestVersion(); + const contractService = new ContractService(registry); + if (!protocolChoices.includes(protocol as ProtocolName)) { this.error( `Protocol '${protocol}' is not supported, choose from these options: ${protocolChoices.join( @@ -262,11 +219,7 @@ export default class InitCommand extends Command { } } else { try { - if (network === 'poa-core') { - abi = await loadAbiFromBlockScout(ABI, network, fromContract); - } else { - abi = await loadAbiFromEtherscan(ABI, network, fromContract); - } + abi = await contractService.getABI(ABI, network, fromContract); } catch (e) { this.exit(1); } @@ -319,14 +272,12 @@ export default class InitCommand extends Command { } else { // Otherwise, take the user through the interactive form const answers = await processInitForm.bind(this)({ - protocol: protocol as ProtocolName | undefined, abi, abiPath, directory, source: fromContract, indexEvents, fromExample, - network, subgraphName, contractName, startBlock, @@ -337,9 +288,6 @@ export default class InitCommand extends Command { this.exit(1); } - ({ node } = chooseNodeUrl({ - node, - })); await initSubgraphFromContract.bind(this)( { protocolInstance: answers.protocolInstance, @@ -359,6 +307,9 @@ export default class InitCommand extends Command { }, { commands, addContract: true }, ); + if (answers.cleanup) { + answers.cleanup(); + } } // Exit with success this.exit(0); @@ -386,7 +337,7 @@ async function processFromExampleInitForm( { type: 'input', name: 'subgraphName', - message: () => 'Subgraph slug', + message: 'Subgraph slug', initial: initSubgraphName, }, ]); @@ -432,28 +383,24 @@ async function retryWithPrompt(func: () => Promise): Promise void) | undefined; } | undefined > { @@ -482,25 +430,81 @@ async function processInitForm( let contractNameFromEtherscan: string | undefined = undefined; try { - const { protocol } = await prompt.ask<{ protocol: ProtocolName }>({ + const registry = await NetworksRegistry.fromLatestVersion(); + const contractService = new ContractService(registry); + + const networks = sortWithPriority( + registry.networks, + n => n.issuanceRewards, + (a, b) => registry.networks.indexOf(a) - registry.networks.indexOf(b), + ); + + const networkToChoice = (n: Network) => ({ + name: n.id, + value: `${n.id}:${n.shortName}:${n.fullName}`.toLowerCase(), + hint: n.id, + message: `${n.fullName}`, + }); + + const formatChoices = (choices: ReturnType[]) => { + const shown = choices.slice(0, 20); + const remaining = networks.length - shown.length; + if (remaining == 0) return shown; + return [ + ...shown, + { + name: ``, + disabled: true, + hint: '', + message: ` < ${remaining} more >`, + }, + ]; + }; + + const { networkId } = await prompt.ask<{ networkId: string }>({ + type: 'autocomplete', + name: 'networkId', + required: true, + linebreak: true, + message: 'Network', + choices: formatChoices(networks.map(networkToChoice)), + format: value => `${value}`, + suggest: (input, _) => + formatChoices( + networks + .map(networkToChoice) + .filter(({ value }) => (value ?? '').includes(input.toLowerCase())), + ), + validate: value => (networks.find(n => n.id === value) ? true : 'Pick a network'), + }); + + const network = networks.find(n => n.id === networkId)!; + + const { protocol } = await prompt.ask<{ protocol: string }>({ type: 'select', name: 'protocol', - message: 'Protocol', - choices: protocolChoices, - skip: protocolChoices.includes(String(initProtocol) as ProtocolName), - result: value => { - if (initProtocol) { - initDebugger.extend('processInitForm')('initProtocol: %O', initProtocol); - return initProtocol; + message: 'Source', + choices: [ + { message: 'Smart contract', name: network.graphNode?.protocol ?? '', value: 'contract' }, + { message: 'Substreams', name: 'substreams', value: 'substreams' }, + { message: 'Subgraph', name: 'subgraph', value: 'subgraph' }, + ].filter(({ name }) => name), + validate: name => { + if (name === 'arweave') { + return 'Arweave only supported via substreams'; } - initDebugger.extend('processInitForm')('protocol: %O', value); - return value; + if (name === 'cosmos') { + return 'Cosmos chains only supported via substreams'; + } + return true; }, }); + initDebugger.extend('processInitForm')('protocol: %O', protocol); + const protocolInstance = new Protocol(protocol); const isComposedSubgraph = protocolInstance.isComposedSubgraph(); - const isSubstreams = protocol === 'substreams'; + const isSubstreams = protocolInstance.isSubstreams(); initDebugger.extend('processInitForm')('isSubstreams: %O', isSubstreams); const { subgraphName } = await prompt.ask<{ subgraphName: string }>([ @@ -521,37 +525,8 @@ async function processInitForm( }, ]); - let choices = (await AVAILABLE_NETWORKS())?.['studio']; - - if (!choices) { - this.error( - 'Unable to fetch available networks from API. Please report this issue. As a workaround you can pass `--network` flag from the available networks: https://thegraph.com/docs/en/developing/supported-networks', - { exit: 1 }, - ); - } - - choices = sortWithPriority(choices, ['mainnet']); - - const { network } = await prompt.ask<{ network: string }>([ - { - type: 'select', - name: 'network', - message: () => `${protocolInstance.displayName()} network`, - choices, - skip: initNetwork !== undefined, - result: value => { - if (initNetwork) { - initDebugger.extend('processInitForm')('initNetwork: %O', initNetwork); - return initNetwork; - } - initDebugger.extend('processInitForm')('network: %O', value); - return value; - }, - }, - ]); - const sourceMessage = isComposedSubgraph - ? 'Source subgraph identifier' + ? 'Source subgraph deployment ID' : `Contract ${protocolInstance.getContract()?.identifierName()}`; const { source } = await prompt.ask<{ source: string }>([ @@ -559,69 +534,59 @@ async function processInitForm( type: 'input', name: 'source', message: sourceMessage, - skip: () => !isComposedSubgraph, + skip: () => + initFromExample !== undefined || + isSubstreams || + (!protocolInstance.hasContract() && !isComposedSubgraph), initial: initContract, validate: async (value: string) => { - if (isComposedSubgraph) { - return true; - } - if (initFromExample !== undefined || !protocolInstance.hasContract()) { return true; } - - const protocolContract = protocolInstance.getContract(); - if (!protocolContract) { - return 'Contract not found.'; + if (isComposedSubgraph) { + return value.startsWith('Qm') ? true : 'Subgraph deployment ID must start with Qm'; } - // Validate whether the contract is valid - const { valid, error } = validateContract(value, protocolContract); + const { valid, error } = validateContract(value, protocolInstance.getContract()!); return valid ? true : error; }, - result: async (value: string) => { - if (initFromExample !== undefined || isSubstreams || initAbiPath || isComposedSubgraph) { - initDebugger("value: '%s'", value); - return value; + result: async (address: string) => { + if ( + initFromExample !== undefined || + initAbiPath || + protocolInstance.name !== 'ethereum' // we can only validate against Etherscan API + ) { + initDebugger("value: '%s'", address); + return address; } - const ABI = protocolInstance.getABI(); - - // Try loading the ABI from Etherscan, if none was provided + // If ABI is not provided, try to fetch it from Etherscan API if (protocolInstance.hasABIs() && !initAbi) { - if (network === 'poa-core') { - abiFromEtherscan = await retryWithPrompt(() => - loadAbiFromBlockScout(ABI, network, value), - ); - } else { - abiFromEtherscan = await retryWithPrompt(() => - loadAbiFromEtherscan(ABI, network, value), - ); - } + abiFromEtherscan = await retryWithPrompt(() => + contractService.getABI(protocolInstance.getABI(), networkId, address), + ); } - // If startBlock is not set, try to load it. + // If startBlock is not provided, try to fetch it from Etherscan API if (!initStartBlock) { - // Load startBlock for this contract const startBlock = await retryWithPrompt(() => - loadStartBlockForContract(network, value), + contractService.getStartBlock(networkId, address), ); if (startBlock) { startBlockFromEtherscan = Number(startBlock).toString(); } } - // If contract name is not set, try to load it. + // If contract name is not provided, try to fetch it from Etherscan API if (!initContractName) { - // Load contract name for this contract const contractName = await retryWithPrompt(() => - loadContractNameForAddress(network, value), + contractService.getContractName(networkId, address), ); if (contractName) { contractNameFromEtherscan = contractName; } } - return value; + return address; }, }, ]); @@ -636,15 +601,33 @@ async function processInitForm( }, ]); - const { spkg } = await prompt.ask<{ spkg: string }>([ + let spkgPath: string | undefined; + let spkgCleanup: (() => void) | undefined; + await prompt.ask<{ spkg: string }>([ { type: 'input', name: 'spkg', - message: 'SPKG file (path)', + message: 'Substreams SPKG (local path, IPFS hash, or URL)', initial: () => initSpkgPath, skip: () => !isSubstreams || !!initSpkgPath, - validate: value => - filesystem.exists(initSpkgPath || value) ? true : 'SPKG file does not exist', + validate: async value => { + if (!isSubstreams || !!initSpkgPath) return true; + return await withSpinner( + `Resolving Substreams SPKG file`, + `Failed to resolve SPKG file`, + `Warnings while resolving SPKG file`, + async () => { + try { + const { path, cleanup } = await resolveFile(value, 'substreams.spkg', 10_000); + spkgPath = path; + spkgCleanup = cleanup; + return true; + } catch (e) { + return e.message; + } + }, + ); + }, }, ]); @@ -666,6 +649,7 @@ async function processInitForm( initFromExample || abiFromEtherscan || !protocolInstance.hasABIs() || + isSubstreams || isComposedSubgraph ) { return true; @@ -707,7 +691,7 @@ async function processInitForm( { type: 'input', name: 'startBlock', - message: 'Start Block', + message: 'Start block', initial: initStartBlock || startBlockFromEtherscan || '0', skip: () => initFromExample !== undefined || isSubstreams, validate: value => parseInt(value) >= 0, @@ -718,7 +702,7 @@ async function processInitForm( { type: 'input', name: 'contractName', - message: 'Contract Name', + message: 'Contract name', initial: initContractName || contractNameFromEtherscan || 'Contract', skip: () => initFromExample !== undefined || !protocolInstance.hasContract() || isSubstreams, @@ -743,12 +727,13 @@ async function processInitForm( directory, startBlock, fromExample: !!initFromExample, - network, + network: network.id, contractName, source, indexEvents, - spkgPath: spkg, ipfs, + spkgPath, + cleanup: spkgCleanup, }; } catch (e) { this.error(e, { exit: 1 }); @@ -1066,9 +1051,7 @@ async function initSubgraphFromContract( addContract: boolean; }, ) { - const isSubstreams = protocolInstance.name === 'substreams'; const isComposedSubgraph = protocolInstance.isComposedSubgraph(); - if ( filesystem.exists(directory) && !(await prompt.confirm( @@ -1164,7 +1147,7 @@ async function initSubgraphFromContract( } // Substreams we have nothing to install or generate - if (!isSubstreams) { + if (!protocolInstance.isSubstreams()) { // Run code-generation const codegen = await runCodegen(directory, commands.codegen); if (codegen !== true) { @@ -1196,52 +1179,40 @@ async function addAnotherContract( { type: 'confirm', name: 'addAnother', - message: () => 'Add another contract? (y/n)', + message: () => 'Add another contract?', initial: false, required: true, }, ]); - if (addAnother) { - const ProtocolContract = protocolInstance.getContract()!; - - let validContract = ''; - for (;;) { - const { contract } = await prompt.ask<{ contract: string }>([ - { - type: 'input', - name: 'contract', - message: () => `\nContract ${ProtocolContract.identifierName()}`, - initial: ProtocolContract.identifierName(), - required: true, - }, - ]); - const { valid, error } = validateContract(contract, ProtocolContract); - if (valid) { - validContract = contract; - break; - } - this.log(`✖ ${error}`); - } - - // Get the cwd before process.chdir in order to switch back in the end of command execution - const cwd = process.cwd(); - - try { - if (fs.existsSync(directory)) { - process.chdir(directory); - } + if (!addAnother) return false; - const commandLine = [validContract]; + const ProtocolContract = protocolInstance.getContract()!; + const { contract } = await prompt.ask<{ contract: string }>([ + { + type: 'input', + name: 'contract', + initial: ProtocolContract.identifierName(), + required: true, + message: () => `\nContract ${ProtocolContract.identifierName()}`, + validate: value => { + const { valid, error } = validateContract(value, ProtocolContract); + return valid ? true : error; + }, + }, + ]); - await AddCommand.run(commandLine); - } catch (e) { - this.error(e); - } finally { - // TODO: safer way of doing this? - process.chdir(cwd); + const cwd = process.cwd(); + try { + if (fs.existsSync(directory)) { + process.chdir(directory); } + + await AddCommand.run([contract]); + } catch (e) { + this.error(e); } + process.chdir(cwd); - return addAnother; + return true; } diff --git a/packages/cli/src/protocols/index.ts b/packages/cli/src/protocols/index.ts index 1bfda8ff4..54cfbd6d9 100644 --- a/packages/cli/src/protocols/index.ts +++ b/packages/cli/src/protocols/index.ts @@ -96,72 +96,6 @@ export default class Protocol { }) as immutable.Collection>; } - static availableNetworks() { - return immutable.fromJS({ - arweave: ['arweave-mainnet'], - ethereum: [ - 'mainnet', - 'rinkeby', - 'goerli', - 'poa-core', - 'poa-sokol', - 'gnosis', - 'matic', - 'mumbai', - 'fantom', - 'fantom-testnet', - 'bsc', - 'chapel', - 'clover', - 'avalanche', - 'fuji', - 'celo', - 'celo-alfajores', - 'fuse', - 'moonbeam', - 'moonriver', - 'mbase', - 'arbitrum-one', - 'arbitrum-goerli', - 'arbitrum-sepolia', - 'optimism', - 'optimism-goerli', - 'aurora', - 'aurora-testnet', - 'base-testnet', - 'base', - 'zksync-era', - 'zksync-era-testnet', - 'sepolia', - 'polygon-zkevm-testnet', - 'polygon-zkevm', - 'scroll-sepolia', - 'scroll', - ], - near: ['near-mainnet', 'near-testnet'], - cosmos: [ - 'cosmoshub-4', - 'theta-testnet-001', // CosmosHub testnet - 'osmosis-1', - 'osmo-test-4', // Osmosis testnet - 'juno-1', - 'uni-3', // Juno testnet - ], - substreams: ['mainnet'], - subgraph: ['mainnet'], - }) as immutable.Map< - | 'arweave' - | 'ethereum' - | 'near' - | 'cosmos' - | 'substreams' - // this is temporary, until we have a better way to handle substreams triggers - | 'substreams/triggers' - | 'subgraph', - immutable.List - >; - } - static normalizeName(name: ProtocolName) { return Protocol.availableProtocols().findKey(possibleNames => { return possibleNames.includes(name); @@ -186,6 +120,10 @@ export default class Protocol { return this.config.contract != null; } + isSubstreams() { + return this.name === 'substreams'; + } + hasEvents() { // A problem with hasEvents usage in the codebase is that it's almost every where // where used, the ABI data is actually use after the conditional, so it seems @@ -345,5 +283,3 @@ const substreamsProtocol: ProtocolConfig = { manifestScaffold: SubstreamsManifestScaffold, mappingScaffold: undefined, }; - -protocolDebug('Available networks %M', Protocol.availableNetworks()); diff --git a/packages/cli/src/protocols/substreams/scaffold/manifest.ts b/packages/cli/src/protocols/substreams/scaffold/manifest.ts index adc90f306..bcbbd2e29 100644 --- a/packages/cli/src/protocols/substreams/scaffold/manifest.ts +++ b/packages/cli/src/protocols/substreams/scaffold/manifest.ts @@ -1,7 +1,7 @@ -export const source = ({ spkgPath }: { spkgPath?: string }) => ` +export const source = ({ spkgPath, spkgModule }: { spkgPath?: string; spkgModule?: string }) => ` package: - moduleName: graph_out - file: ${spkgPath || 'substreams-eth-block-meta-v0.1.0.spkg'}`; + moduleName: ${spkgModule || 'graph_out'} + file: ${spkgPath || 'substreams.spkg'}`; export const mapping = () => ` apiVersion: 0.0.5 diff --git a/packages/cli/src/scaffold/index.ts b/packages/cli/src/scaffold/index.ts index 2d62b6402..6cbc90032 100644 --- a/packages/cli/src/scaffold/index.ts +++ b/packages/cli/src/scaffold/index.ts @@ -1,3 +1,4 @@ +import fs from 'fs-extra'; import { strings } from 'gluegun'; import prettier from 'prettier'; import { getSubgraphBasename } from '../command-helpers/subgraph.js'; @@ -125,7 +126,7 @@ dataSources: - kind: ${this.protocol.name} name: ${this.contractName} network: ${this.network} - source: ${protocolManifest.source(this)} + source: ${protocolManifest.source({ ...this, spkgPath: './substreams.spkg', spkgModule: 'graph_out' })} mapping: ${protocolManifest.mapping(this)} `, { parser: 'yaml' }, @@ -149,6 +150,13 @@ dataSources: ); } + async generateSpkgContent() { + if (!this.spkgPath) { + return undefined; + } + return fs.readFile(this.spkgPath); + } + async generateTsConfig() { return await prettier.format( JSON.stringify({ @@ -215,6 +223,7 @@ dataSources: 'schema.graphql': await this.generateSchema(), 'package.json': await this.generatePackageJsonForSubstreams(), '.gitignore': await this.generateGitIgnoreFile(), + 'substreams.spkg': await this.generateSpkgContent(), }; } return { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a367de563..95e6f145e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,15 @@ importers: .: devDependencies: + '@babel/core': + specifier: ^7.26.0 + version: 7.26.0 + '@babel/preset-env': + specifier: ^7.26.0 + version: 7.26.0(@babel/core@7.26.0) + '@babel/preset-typescript': + specifier: ^7.26.0 + version: 7.26.0(@babel/core@7.26.0) '@changesets/changelog-github': specifier: ^0.5.0 version: 0.5.0(encoding@0.1.13) @@ -238,8 +247,11 @@ importers: specifier: ^3.2.29 version: 3.2.29(@types/node@22.10.1) '@oclif/plugin-warn-if-update-available': - specifier: ^3.1.24 - version: 3.1.24 + specifier: ^3.1.23 + version: 3.1.23 + '@pinax/graph-networks-registry': + specifier: ^0.6.4 + version: 0.6.5 '@whatwg-node/fetch': specifier: ^0.10.1 version: 0.10.1 @@ -455,18 +467,6 @@ importers: '@types/react': specifier: ^18.3.12 version: 18.3.12 - '@types/react-dom': - specifier: ^18.3.1 - version: 18.3.1 - '@types/semver': - specifier: ^7.5.8 - version: 7.5.8 - '@typescript-eslint/eslint-plugin': - specifier: ^8.17.0 - version: 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/parser': - specifier: ^8.17.0 - version: 8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.3.4(vite@6.0.2(@types/node@22.10.1)(jiti@2.4.1)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)) @@ -1259,6 +1259,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/plugin-transform-reserved-words@7.25.9': resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} engines: {node: '>=6.9.0'} @@ -1295,6 +1301,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.25.9': + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-unicode-escapes@7.25.9': resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} engines: {node: '>=6.9.0'} @@ -1325,6 +1337,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-flow@7.24.7': resolution: {integrity: sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==} engines: {node: '>=6.9.0'} @@ -1342,6 +1360,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.26.0': resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} @@ -2783,6 +2807,9 @@ packages: resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} engines: {node: '>=10.12.0'} + '@pinax/graph-networks-registry@0.6.5': + resolution: {integrity: sha512-Urm/C+phjJLP+W5OF7hCUMrlSqSNGfX8V2BmzXmVkME/NX1yBZCQinR3Zk2L2uedpOBjmp3o7vm7bdQy+DMHhA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3895,17 +3922,6 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.17.0': - resolution: {integrity: sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.15.0': resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3916,16 +3932,6 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.17.0': - resolution: {integrity: sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/scope-manager@7.16.1': resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3934,10 +3940,6 @@ packages: resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.17.0': - resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.16.1': resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3958,16 +3960,6 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.17.0': - resolution: {integrity: sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/types@7.16.1': resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3976,10 +3968,6 @@ packages: resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.17.0': - resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.16.1': resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3998,15 +3986,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.17.0': - resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/utils@7.16.1': resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -4023,16 +4002,6 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.17.0': - resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/visitor-keys@7.16.1': resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -4041,10 +4010,6 @@ packages: resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.17.0': - resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitejs/plugin-react@4.3.4': resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} @@ -4465,8 +4430,9 @@ packages: assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} @@ -8025,8 +7991,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} @@ -9672,17 +9639,22 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -10756,6 +10728,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -10763,6 +10748,13 @@ snapshots: regexpu-core: 6.2.0 semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 + semver: 6.3.1 + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -10774,6 +10766,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.7(supports-color@5.5.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.25.9(supports-color@5.5.0) @@ -10821,6 +10824,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -10830,6 +10842,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/helper-simple-access@7.25.9': dependencies: '@babel/traverse': 7.25.9(supports-color@5.5.0) @@ -10875,16 +10896,34 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -10894,6 +10933,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -10902,6 +10950,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -10915,6 +10971,10 @@ snapshots: dependencies: '@babel/core': 7.25.2 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -10955,11 +11015,21 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11031,11 +11101,22 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11045,6 +11126,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11054,16 +11144,35 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11072,6 +11181,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11080,6 +11197,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11092,39 +11217,84 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 '@babel/template': 7.25.9 + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11133,11 +11303,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-flow-strip-types@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11152,7 +11335,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.25.2)': + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.9 @@ -11161,26 +11352,55 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11189,6 +11409,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11198,6 +11426,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11208,6 +11445,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11216,27 +11463,56 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11244,6 +11520,13 @@ snapshots: '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11252,11 +11535,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11265,11 +11561,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11278,6 +11587,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11287,11 +11604,25 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11337,16 +11668,38 @@ snapshots: '@babel/helper-plugin-utils': 7.25.9 regenerator-transform: 0.15.2 + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11355,44 +11708,101 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/preset-env@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/compat-data': 7.26.2 @@ -11482,6 +11892,81 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/preset-flow@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11496,6 +11981,13 @@ snapshots: '@babel/types': 7.26.0 esutils: 2.0.3 + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 + esutils: 2.0.3 + '@babel/preset-react@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 @@ -11508,6 +12000,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 @@ -13243,7 +13746,7 @@ snapshots: '@oclif/plugin-help@6.2.18': dependencies: - '@oclif/core': 4.0.34 + '@oclif/core': 4.0.33 '@oclif/plugin-not-found@2.4.3(@types/node@22.10.1)(typescript@5.7.2)': dependencies: @@ -13361,6 +13864,8 @@ snapshots: tslib: 2.8.1 webcrypto-core: 1.8.1 + '@pinax/graph-networks-registry@0.6.5': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -14583,6 +15088,7 @@ snapshots: '@types/react-dom@18.3.1': dependencies: '@types/react': 18.3.12 + optional: true '@types/react@18.3.12': dependencies: @@ -14647,25 +15153,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/type-utils': 8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.17.0 - eslint: 9.16.0(jiti@2.4.1) - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)': + '@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.6.2)': dependencies: '@typescript-eslint/scope-manager': 8.15.0 '@typescript-eslint/types': 8.15.0 @@ -14678,19 +15166,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.17.0 - debug: 4.3.7(supports-color@5.5.0) - eslint: 9.16.0(jiti@2.4.1) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/scope-manager@7.16.1': dependencies: '@typescript-eslint/types': 7.16.1 @@ -14701,12 +15176,7 @@ snapshots: '@typescript-eslint/types': 8.15.0 '@typescript-eslint/visitor-keys': 8.15.0 - '@typescript-eslint/scope-manager@8.17.0': - dependencies: - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/visitor-keys': 8.17.0 - - '@typescript-eslint/type-utils@7.16.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)': + '@typescript-eslint/type-utils@7.16.1(eslint@9.15.0(jiti@2.4.1))(typescript@5.6.2)': dependencies: '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.6.2) '@typescript-eslint/utils': 7.16.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) @@ -14730,24 +15200,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': - dependencies: - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2) - debug: 4.3.7(supports-color@5.5.0) - eslint: 9.16.0(jiti@2.4.1) - ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@7.16.1': {} '@typescript-eslint/types@8.15.0': {} - '@typescript-eslint/types@8.17.0': {} - '@typescript-eslint/typescript-estree@7.16.1(typescript@5.6.2)': dependencies: '@typescript-eslint/types': 7.16.1 @@ -14778,22 +15234,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.17.0(typescript@5.7.2)': - dependencies: - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/visitor-keys': 8.17.0 - debug: 4.3.7(supports-color@5.5.0) - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@7.16.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)': + '@typescript-eslint/utils@7.16.1(eslint@9.15.0(jiti@2.4.1))(typescript@5.6.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) '@typescript-eslint/scope-manager': 7.16.1 @@ -14816,18 +15257,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.17.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.7.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) - '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/types': 8.17.0 - '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - eslint: 9.16.0(jiti@2.4.1) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/visitor-keys@7.16.1': dependencies: '@typescript-eslint/types': 7.16.1 @@ -14838,12 +15267,7 @@ snapshots: '@typescript-eslint/types': 8.15.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.17.0': - dependencies: - '@typescript-eslint/types': 8.17.0 - eslint-visitor-keys: 4.2.0 - - '@vitejs/plugin-react@4.3.4(vite@6.0.2(@types/node@22.10.1)(jiti@2.4.1)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': + '@vitejs/plugin-react@4.3.4(vite@6.0.1(@types/node@22.10.1)(jiti@2.4.1)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) @@ -15563,7 +15987,7 @@ snapshots: object.assign: 4.1.5 util: 0.12.5 - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} assertion-error@2.0.1: {} @@ -15705,6 +16129,15 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 @@ -15713,6 +16146,14 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.25.2): dependencies: '@babel/core': 7.25.2 @@ -15720,6 +16161,13 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + babel-plugin-styled-components@2.1.4(@babel/core@7.26.0)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0): dependencies: '@babel/helper-annotate-as-pure': 7.25.9 @@ -20230,7 +20678,7 @@ snapshots: pathe@1.1.2: {} - pathval@1.1.1: {} + pathval@2.0.0: {} pathval@2.0.0: {} @@ -21573,10 +22021,6 @@ snapshots: dependencies: typescript: 5.6.2 - ts-api-utils@1.4.3(typescript@5.7.2): - dependencies: - typescript: 5.7.2 - ts-command-line-args@2.5.1: dependencies: chalk: 4.1.2 @@ -22062,6 +22506,7 @@ snapshots: vite: 5.4.11(@types/node@22.10.1)(terser@5.36.0) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -22070,6 +22515,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml vite-plugin-node-polyfills@0.22.0(rollup@4.28.0)(vite@6.0.2(@types/node@22.10.1)(jiti@2.4.1)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1)): dependencies: @@ -22127,6 +22574,7 @@ snapshots: optionalDependencies: '@types/node': 22.10.1 transitivePeerDependencies: + - jiti - less - lightningcss - msw diff --git a/website/package.json b/website/package.json index 05a21c2a2..11feadf03 100644 --- a/website/package.json +++ b/website/package.json @@ -49,10 +49,6 @@ "@tanstack/router-vite-plugin": "^1.85.3", "@types/node": "^22.10.1", "@types/react": "^18.3.12", - "@types/react-dom": "^18.3.1", - "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^8.17.0", - "@typescript-eslint/parser": "^8.17.0", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", "eslint": "^9.16.0",