diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..a93857328 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,53 @@ + +# Contributing to Indexer Components + +Welcome to the Graph Protocol! Thanks a ton for your interest in contributing. + +If you run into any problems feel free to create an issue. PRs are much appreciated for simple things. Here's [a list of good first issues](https://github.com/graphprotocol/indexer/labels/good%20first%20issue). If it's something more complex we'd appreciate having a quick chat in GitHub Issues or Discord. + +Join the conversation on our [Discord](https://discord.gg/graphprotocol). + +Please follow the [Code of Conduct](https://github.com/graphprotocol/graph-node/blob/master/CODE_OF_CONDUCT.md) for all the communications and at events. Thank you! + +## Development flow + +#### Clone the repository and install the dependencies: + +```sh +git clone git@github.com:graphprotocol/indexer.git +cd indexer +yarn +``` + +#### To run the tests: + +```sh +yarn test +``` + +#### Creating new resolvers + +The [`indexer-common`](./packages/indexer-common/) package is shared between the different indexer packages in this repository. If you are creating a new resolver, you should add it to the `indexer-common` package. This way, the resolver can be shared between the different indexer packages. To introduce a new resolver, you should: +1. Add the GraphQL schema in [`packages/indexer-common/src/indexer-management/schema.graphql`](./packages/indexer-common/src/indexer-management/schema.graphql). +2. Run `yarn codegen` this uses the [GraphQL Codegen Server preset](https://the-guild.dev/graphql/codegen/docs/guides/graphql-server-apollo-yoga-with-server-preset) to generate TypeScript types for the schema and resolvers. +3. Now you should see resolver in [`packages/indexer-common/src/schema/indexer-management/resolvers`](./packages/indexer-common/src/schema/indexer-management/resolvers/) directory and write the logic for the resolver in the file. + +#### GraphQL Unit Testing + +We use [Jest](https://jestjs.io/) for unit testing. You can write tests for your resolvers in the `__tests__` directory in the same directory as the resolver. For example, if you have a resolver in `packages/indexer-common/src/schema/indexer-management/resolvers/MyResolver.ts`, you should write tests for it in `packages/indexer-common/src/schema/indexer-management/resolvers/__tests__/MyResolver.test.ts`. The test setup utilizes [HTTP Injection from GraphQL Yoga](https://the-guild.dev/graphql/yoga-server/docs/features/testing). + +## Commit messages and pull requests + +We use the following format for commit messages: +`{package-name}: {Brief description of changes}`, for example: `indexer-cli: Remove l1 support`. + +If multiple packages are being changed list them all like this: `all: ` + +If a shared package is touched and impacts multiple packages, you can use short-had like this: `*: `. + +The body of the message can be terse, with just enough information to explain what the commit does overall. In a lot of cases, more extensive explanations of _how_ the commit achieves its goal are better as comments +in the code. + +Commits in a pull request should be structured in such a way that each commit consists of a small logical step towards the overall goal of the pull request. Your pull request should make it as easy as possible for the +reviewer to follow each change you are making. For example, it is a good idea to separate simple mechanical changes like renaming a method that touches many files from logic changes. Your pull request should not be +structured into commits according to how you implemented your feature, often indicated by commit messages like 'Fix problem' or 'Cleanup'. Flex a bit, and make the world think that you implemented your feature perfectly, in small logical steps, in one sitting without ever having to touch up something you did earlier in the pull request. (In reality, that means you'll use `git rebase -i` a lot) diff --git a/packages/indexer-agent/src/__tests__/agent.ts b/packages/indexer-agent/src/__tests__/agent.ts index 700e15f98..ce3845bca 100644 --- a/packages/indexer-agent/src/__tests__/agent.ts +++ b/packages/indexer-agent/src/__tests__/agent.ts @@ -3,10 +3,8 @@ import { consolidateAllocationDecisions, } from '../agent' import { + GeneratedGraphQLTypes, INDEXING_RULE_GLOBAL, - IndexingDecisionBasis, - IndexingRuleAttributes, - SubgraphIdentifierType, SubgraphVersion, } from '@graphprotocol/indexer-common' import { SubgraphDeploymentID } from '@graphprotocol/common-ts' @@ -16,8 +14,8 @@ describe('Agent convenience function tests', () => { const inputRules = [ { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, - allocationAmount: '2300', + identifierType: 'group', + allocationAmount: BigInt(2300), parallelAllocations: null, maxAllocationPercentage: null, minSignal: null, @@ -25,12 +23,16 @@ describe('Agent convenience function tests', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', + autoRenewal: false, + requireSupported: false, + safety: false, + protocolNetwork: 'sepolia', }, { identifier: '0x0000000000000000000000000000000000000000-0', - identifierType: SubgraphIdentifierType.SUBGRAPH, - allocationAmount: '3000', + identifierType: 'subgraph', + allocationAmount: BigInt(3000), parallelAllocations: null, maxAllocationPercentage: null, minSignal: null, @@ -38,12 +40,16 @@ describe('Agent convenience function tests', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', + autoRenewal: false, + requireSupported: false, + safety: false, + protocolNetwork: 'sepolia', }, { identifier: 'QmZZtzZkfzCWMNrajxBf22q7BC9HzoT5iJUK3S8qA6zNZr', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '12000', + identifierType: 'deployment', + allocationAmount: BigInt(12000), parallelAllocations: null, maxAllocationPercentage: null, minSignal: null, @@ -51,9 +57,13 @@ describe('Agent convenience function tests', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', + protocolNetwork: 'sepolia', + autoRenewal: false, + requireSupported: false, + safety: false, }, - ] as IndexingRuleAttributes[] + ] satisfies GeneratedGraphQLTypes.IndexingRule[] const subgraphs = [ { @@ -73,8 +83,8 @@ describe('Agent convenience function tests', () => { const expectedRules = [ { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, - allocationAmount: '2300', + identifierType: 'group', + allocationAmount: BigInt(2300), parallelAllocations: null, maxAllocationPercentage: null, minSignal: null, @@ -82,13 +92,17 @@ describe('Agent convenience function tests', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', + protocolNetwork: 'sepolia', + autoRenewal: false, + requireSupported: false, + safety: false, }, { identifier: '0xc9d18c59e4aaf2c1f86dfef16fbdc0f81eae8ada58d87a23d2666c45704b8823', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '3000', + identifierType: 'deployment', + allocationAmount: BigInt(3000), parallelAllocations: null, maxAllocationPercentage: null, minSignal: null, @@ -96,12 +110,16 @@ describe('Agent convenience function tests', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', + protocolNetwork: 'sepolia', + autoRenewal: false, + requireSupported: false, + safety: false, }, { identifier: 'QmZZtzZkfzCWMNrajxBf22q7BC9HzoT5iJUK3S8qA6zNZr', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '12000', + identifierType: 'deployment', + allocationAmount: BigInt(12000), parallelAllocations: null, maxAllocationPercentage: null, minSignal: null, @@ -109,9 +127,13 @@ describe('Agent convenience function tests', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', + protocolNetwork: 'sepolia', + autoRenewal: false, + requireSupported: false, + safety: false, }, - ] as IndexingRuleAttributes[] + ] satisfies GeneratedGraphQLTypes.IndexingRule[] expect( convertSubgraphBasedRulesToDeploymentBased(inputRules, subgraphs, 1000), @@ -122,8 +144,8 @@ describe('Agent convenience function tests', () => { const inputRules = [ { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, - allocationAmount: '2300', + identifierType: 'group', + allocationAmount: BigInt(2300), parallelAllocations: null, maxAllocationPercentage: null, minSignal: null, @@ -131,12 +153,16 @@ describe('Agent convenience function tests', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', + protocolNetwork: 'sepolia', + autoRenewal: false, + requireSupported: false, + safety: false, }, { identifier: 'QmZZtzZkfzCWMNrajxBf22q7BC9HzoT5iJUK3S8qA6zNZr', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '12000', + identifierType: 'deployment', + allocationAmount: BigInt(12000), parallelAllocations: null, maxAllocationPercentage: null, minSignal: null, @@ -144,9 +170,13 @@ describe('Agent convenience function tests', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', + protocolNetwork: 'sepolia', + autoRenewal: false, + requireSupported: false, + safety: false, }, - ] as IndexingRuleAttributes[] + ] satisfies GeneratedGraphQLTypes.IndexingRule[] const subgraphs = [ { diff --git a/packages/indexer-agent/src/__tests__/indexer.ts b/packages/indexer-agent/src/__tests__/indexer.ts index f8c1567de..52e4bedd6 100644 --- a/packages/indexer-agent/src/__tests__/indexer.ts +++ b/packages/indexer-agent/src/__tests__/indexer.ts @@ -7,9 +7,7 @@ import { parseGRT, } from '@graphprotocol/common-ts' import { - createIndexerManagementClient, defineIndexerManagementModels, - IndexerManagementClient, IndexerManagementModels, GraphNode, Operator, @@ -19,9 +17,9 @@ import { QueryFeeModels, defineQueryFeeModels, MultiNetworks, + createIndexerManagementYogaClient, loadTestYamlConfig, } from '@graphprotocol/indexer-common' -import { BigNumber } from 'ethers' import { Sequelize } from 'sequelize' const TEST_DISPUTE_1: POIDisputeAttributes = { @@ -67,52 +65,15 @@ const TEST_DISPUTE_2: POIDisputeAttributes = { protocolNetwork: 'eip155:421614', } -const POI_DISPUTES_CONVERTERS_FROM_GRAPHQL: Record< - keyof POIDisputeAttributes, - (x: never) => string | BigNumber | number | undefined -> = { - allocationID: x => x, - subgraphDeploymentID: x => x, - allocationIndexer: x => x, - allocationAmount: x => x, - allocationProof: x => x, - closedEpoch: x => +x, - closedEpochStartBlockHash: x => x, - closedEpochStartBlockNumber: x => +x, - closedEpochReferenceProof: x => x, - previousEpochStartBlockHash: x => x, - previousEpochStartBlockNumber: x => +x, - previousEpochReferenceProof: x => x, - status: x => x, - protocolNetwork: x => x, -} - -/** - * Parses a POI dispute returned from the indexer management GraphQL - * API into normalized form. - */ -const disputeFromGraphQL = ( - dispute: Partial, -): POIDisputeAttributes => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const obj = {} as any - for (const [key, value] of Object.entries(dispute)) { - if (key === '__typename') { - continue - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - obj[key] = (POI_DISPUTES_CONVERTERS_FROM_GRAPHQL as any)[key](value) - } - return obj as POIDisputeAttributes -} - declare const __DATABASE__: never let sequelize: Sequelize let models: IndexerManagementModels let queryFeeModels: QueryFeeModels let logger: Logger -let indexerManagementClient: IndexerManagementClient +let indexerManagementClient: Awaited< + ReturnType +> let graphNode: GraphNode let operator: Operator let metrics: Metrics @@ -157,7 +118,7 @@ const setup = async () => { (n: Network) => n.specification.networkIdentifier, ) - indexerManagementClient = await createIndexerManagementClient({ + indexerManagementClient = await createIndexerManagementYogaClient({ models, graphNode, logger, @@ -217,34 +178,34 @@ describe('Indexer tests', () => { test('Store POI Disputes is idempotent', async () => { const disputes: POIDisputeAttributes[] = [TEST_DISPUTE_1, TEST_DISPUTE_2] - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const expectedResult = disputes.map((dispute: Record) => { - return disputeFromGraphQL(dispute) - }) - await expect(operator.storePoiDisputes(disputes)).resolves.toEqual( - expectedResult, - ) - await expect(operator.storePoiDisputes(disputes)).resolves.toEqual( - expectedResult, - ) - await expect(operator.storePoiDisputes(disputes)).resolves.toEqual( - expectedResult, - ) + const result1 = (await operator.storePoiDisputes(disputes)).map(a => ({ + ...a, + allocationAmount: a.allocationAmount.toString(), + })) + expect(result1).toEqual(disputes) + const result2 = (await operator.storePoiDisputes(disputes)).map(a => ({ + ...a, + allocationAmount: a.allocationAmount.toString(), + })) + expect(result2).toEqual(disputes) + const result3 = (await operator.storePoiDisputes(disputes)).map(a => ({ + ...a, + allocationAmount: a.allocationAmount.toString(), + })) + expect(result3).toEqual(disputes) }) test('Fetch POIDisputes', async () => { const disputes: POIDisputeAttributes[] = [TEST_DISPUTE_1, TEST_DISPUTE_2] - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const expectedResult = disputes.map((dispute: Record) => { - return disputeFromGraphQL(dispute) - }) - const expectedFilteredResult = [disputeFromGraphQL(TEST_DISPUTE_2)] - await expect(operator.storePoiDisputes(disputes)).resolves.toEqual( - expectedResult, - ) - await expect( - operator.fetchPOIDisputes('potential', 205, 'eip155:421614'), - ).resolves.toEqual(expectedFilteredResult) + const result1 = (await operator.storePoiDisputes(disputes)).map(a => ({ + ...a, + allocationAmount: a.allocationAmount.toString(), + })) + expect(result1).toEqual(disputes) + const result2 = ( + await operator.fetchPOIDisputes('potential', 205, 'eip155:421614') + ).map(a => ({ ...a, allocationAmount: a.allocationAmount.toString() })) + expect(result2).toEqual([TEST_DISPUTE_2]) }) }) diff --git a/packages/indexer-agent/src/agent.ts b/packages/indexer-agent/src/agent.ts index abf1c5dde..9bd8f1a44 100644 --- a/packages/indexer-agent/src/agent.ts +++ b/packages/indexer-agent/src/agent.ts @@ -9,22 +9,18 @@ import { } from '@graphprotocol/common-ts' import { ActivationCriteria, - ActionStatus, + GeneratedGraphQLTypes, Allocation, AllocationManagementMode, allocationRewardsPool, AllocationStatus, indexerError, IndexerErrorCode, - IndexingDecisionBasis, - IndexerManagementClient, - IndexingRuleAttributes, Network, POIDisputeAttributes, RewardsPool, Subgraph, SubgraphDeployment, - SubgraphIdentifierType, evaluateDeployments, AllocationDecision, GraphNode, @@ -36,6 +32,7 @@ import { networkIsL2, networkIsL1, DeploymentManagementMode, + IndexerManagementYogaClient, SubgraphStatus, } from '@graphprotocol/indexer-common' @@ -55,12 +52,12 @@ const deploymentInList = ( list.find(item => item.bytes32 === deployment.bytes32) !== undefined const deploymentRuleInList = ( - list: IndexingRuleAttributes[], + list: GeneratedGraphQLTypes.IndexingRule[], deployment: SubgraphDeploymentID, ): boolean => list.find( rule => - rule.identifierType == SubgraphIdentifierType.DEPLOYMENT && + rule.identifierType == 'deployment' && new SubgraphDeploymentID(rule.identifier).toString() == deployment.toString(), ) !== undefined @@ -76,13 +73,13 @@ const uniqueDeployments = ( ): SubgraphDeploymentID[] => deployments.filter(uniqueDeploymentsOnly) export const convertSubgraphBasedRulesToDeploymentBased = ( - rules: IndexingRuleAttributes[], + rules: GeneratedGraphQLTypes.IndexingRule[], subgraphs: Subgraph[], previousVersionBuffer: number, -): IndexingRuleAttributes[] => { - const toAdd: IndexingRuleAttributes[] = [] +): GeneratedGraphQLTypes.IndexingRule[] => { + const toAdd: GeneratedGraphQLTypes.IndexingRule[] = [] rules.map(rule => { - if (rule.identifierType !== SubgraphIdentifierType.SUBGRAPH) { + if (rule.identifierType !== 'subgraph') { return rule } const ruleSubgraph = subgraphs.find( @@ -96,7 +93,7 @@ export const convertSubgraphBasedRulesToDeploymentBased = ( if (latestDeploymentVersion) { if (!deploymentRuleInList(rules, latestDeploymentVersion!.deployment)) { rule.identifier = latestDeploymentVersion!.deployment.toString() - rule.identifierType = SubgraphIdentifierType.DEPLOYMENT + rule.identifierType = 'deployment' } const currentTimestamp = Math.floor(Date.now() / 1000) @@ -114,8 +111,7 @@ export const convertSubgraphBasedRulesToDeploymentBased = ( const previousDeploymentRule = { ...rule } previousDeploymentRule.identifier = previousDeploymentVersion!.deployment.toString() - previousDeploymentRule.identifierType = - SubgraphIdentifierType.DEPLOYMENT + previousDeploymentRule.identifierType = 'deployment' toAdd.push(previousDeploymentRule) } } @@ -186,7 +182,7 @@ export class Agent { metrics: Metrics graphNode: GraphNode multiNetworks: MultiNetworks - indexerManagement: IndexerManagementClient + indexerManagement: IndexerManagementYogaClient offchainSubgraphs: SubgraphDeploymentID[] autoMigrationSupport: boolean deploymentManagement: DeploymentManagementMode @@ -285,42 +281,45 @@ export class Agent { }, ) - const indexingRules: Eventual> = - timer(requestIntervalSmall).tryMap( - async () => { - return this.multiNetworks.map(async ({ network, operator }) => { - logger.trace('Fetching indexing rules', { - protocolNetwork: network.specification.networkIdentifier, - }) - let rules = await operator.indexingRules(true) - const subgraphRuleIds = rules - .filter( - rule => rule.identifierType == SubgraphIdentifierType.SUBGRAPH, - ) - .map(rule => rule.identifier!) - const subgraphsMatchingRules = - await network.networkMonitor.subgraphs(subgraphRuleIds) - if (subgraphsMatchingRules.length >= 1) { - const epochLength = - await network.contracts.epochManager.epochLength() - const blockPeriod = 15 - const bufferPeriod = epochLength.toNumber() * blockPeriod * 100 // 100 epochs - rules = convertSubgraphBasedRulesToDeploymentBased( - rules, - subgraphsMatchingRules, - bufferPeriod, - ) - } - return rules + const indexingRules: Eventual< + NetworkMapped + > = timer(requestIntervalSmall).tryMap( + async () => { + return this.multiNetworks.map(async ({ network, operator }) => { + logger.trace('Fetching indexing rules', { + protocolNetwork: network.specification.networkIdentifier, }) - }, - { - onError: error => - logger.warn(`Failed to obtain indexing rules, trying again later`, { - error, - }), - }, - ) + let rules = await operator.indexingRules(true) + const subgraphRuleIds = rules + .filter( + rule => + rule.identifierType == + GeneratedGraphQLTypes.IdentifierType.subgraph, + ) + .map(rule => rule.identifier!) + const subgraphsMatchingRules = + await network.networkMonitor.subgraphs(subgraphRuleIds) + if (subgraphsMatchingRules.length >= 1) { + const epochLength = + await network.contracts.epochManager.epochLength() + const blockPeriod = 15 + const bufferPeriod = epochLength.toNumber() * blockPeriod * 100 // 100 epochs + rules = convertSubgraphBasedRulesToDeploymentBased( + rules, + subgraphsMatchingRules, + bufferPeriod, + ) + } + return rules + }) + }, + { + onError: error => + logger.warn(`Failed to obtain indexing rules, trying again later`, { + error, + }), + }, + ) const activeDeployments: Eventual = timer( requestIntervalSmall, @@ -414,10 +413,7 @@ export class Agent { ({ indexingRules, networkDeployments }) => { return mapValues( this.multiNetworks.zip(indexingRules, networkDeployments), - ([indexingRules, networkDeployments]: [ - IndexingRuleAttributes[], - SubgraphDeployment[], - ]) => { + ([indexingRules, networkDeployments]) => { // Identify subgraph deployments on the network that are worth picking up; // these may overlap with the ones we're already indexing logger.trace('Evaluating which deployments are worth allocating to') @@ -537,9 +533,7 @@ export class Agent { // Add offchain subgraphs to the deployment list from rules Object.values(indexingRules) .flat() - .filter( - rule => rule?.decisionBasis === IndexingDecisionBasis.OFFCHAIN, - ) + .filter(rule => rule?.decisionBasis === 'offchain') .forEach(rule => { targetDeploymentIDs.add(new SubgraphDeploymentID(rule.identifier)) }) @@ -1196,7 +1190,7 @@ export class Agent { ) => { // Do nothing if there are already approved actions in the queue awaiting execution const approvedActions = await operator.fetchActions({ - status: ActionStatus.APPROVED, + status: GeneratedGraphQLTypes.ActionStatus.approved, protocolNetwork: network.specification.networkIdentifier, }) if (approvedActions.length > 0) { diff --git a/packages/indexer-agent/src/commands/start.ts b/packages/indexer-agent/src/commands/start.ts index fd9db785f..a9252e667 100644 --- a/packages/indexer-agent/src/commands/start.ts +++ b/packages/indexer-agent/src/commands/start.ts @@ -11,8 +11,8 @@ import { SubgraphDeploymentID, } from '@graphprotocol/common-ts' import { - createIndexerManagementClient, createIndexerManagementServer, + createIndexerManagementYogaClient, defineIndexerManagementModels, defineQueryFeeModels, GraphNode, @@ -612,7 +612,7 @@ export async function run( (n: Network) => n.specification.networkIdentifier, ) - const indexerManagementClient = await createIndexerManagementClient({ + const indexerManagementClient = await createIndexerManagementYogaClient({ models: managementModels, graphNode, logger, diff --git a/packages/indexer-agent/src/cost.ts b/packages/indexer-agent/src/cost.ts index a97677d91..368e0386a 100644 --- a/packages/indexer-agent/src/cost.ts +++ b/packages/indexer-agent/src/cost.ts @@ -8,7 +8,10 @@ import { timer, Address, } from '@graphprotocol/common-ts' -import { IndexerManagementClient, Network } from '@graphprotocol/indexer-common' +import { + IndexerManagementYogaClient, + Network, +} from '@graphprotocol/indexer-common' import { Contract, providers } from 'ethers' interface CostModelAutomationMetrics { @@ -34,7 +37,7 @@ const registerMetrics = (metrics: Metrics): CostModelAutomationMetrics => ({ export interface StartCostModelAutomationOptions { logger: Logger networks: Network[] - indexerManagement: IndexerManagementClient + indexerManagement: IndexerManagementYogaClient metrics: Metrics } @@ -43,7 +46,7 @@ interface CostModelAutomationOptions { logger: Logger ethereum: providers.BaseProvider contracts: NetworkContracts - indexerManagement: IndexerManagementClient + indexerManagement: IndexerManagementYogaClient daiContractAddress: Address metrics: CostModelAutomationMetrics } diff --git a/packages/indexer-agent/src/types.ts b/packages/indexer-agent/src/types.ts index f71f9d295..5a8b38ae5 100644 --- a/packages/indexer-agent/src/types.ts +++ b/packages/indexer-agent/src/types.ts @@ -3,7 +3,7 @@ import { Network, GraphNode, DeploymentManagementMode, - IndexerManagementClient, + IndexerManagementYogaClient, Operator, } from '@graphprotocol/indexer-common' @@ -19,7 +19,7 @@ export interface AgentConfigs { metrics: Metrics graphNode: GraphNode operators: Operator[] - indexerManagement: IndexerManagementClient + indexerManagement: IndexerManagementYogaClient networks: Network[] deploymentManagement: DeploymentManagementMode autoMigrationSupport: boolean diff --git a/packages/indexer-cli/src/__tests__/util.ts b/packages/indexer-cli/src/__tests__/util.ts index 4d5813fbc..4b30cecfd 100644 --- a/packages/indexer-cli/src/__tests__/util.ts +++ b/packages/indexer-cli/src/__tests__/util.ts @@ -7,24 +7,20 @@ import path from 'path' import { Sequelize } from 'sequelize' import stripAnsi from 'strip-ansi' import { - ActionStatus, - ActionType, CostModelVariables, - createIndexerManagementClient, createIndexerManagementServer, defineIndexerManagementModels, defineQueryFeeModels, GraphNode, - IndexerManagementClient, IndexerManagementDefaults, IndexerManagementModels, - IndexingDecisionBasis, loadTestYamlConfig, MultiNetworks, Network, QueryFeeModels, specification, - SubgraphIdentifierType, + IndexerManagementYogaClient, + createIndexerManagementYogaClient, } from '@graphprotocol/indexer-common' import { connectDatabase, @@ -49,7 +45,7 @@ let sequelize: Sequelize let models: IndexerManagementModels let queryFeeModels: QueryFeeModels let logger: Logger -let indexerManagementClient: IndexerManagementClient +let indexerManagementClient: IndexerManagementYogaClient let server: http.Server let sockets: Socket[] = [] let metrics: Metrics @@ -117,7 +113,7 @@ export const setup = async (multiNetworksEnabled: boolean) => { }, } - indexerManagementClient = await createIndexerManagementClient({ + indexerManagementClient = await createIndexerManagementYogaClient({ models, graphNode, logger, @@ -168,9 +164,9 @@ export const seedIndexingRules = async () => { await models.IndexingRule.create({ id: 1, identifier: 'global', - identifierType: SubgraphIdentifierType.GROUP, + identifierType: 'group', protocolNetwork: 'eip155:421614', - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', requireSupported: true, safety: true, autoRenewal: true, @@ -180,9 +176,9 @@ export const seedIndexingRules = async () => { await models.IndexingRule.create({ id: 2, identifier: 'QmSrf6VVPyg9NGdS1xhLmoosk3qZQaWhfoSTHE2H7sht6Q', - identifierType: SubgraphIdentifierType.DEPLOYMENT, + identifierType: 'deployment', protocolNetwork: 'eip155:421614', - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', requireSupported: true, safety: true, autoRenewal: true, @@ -190,9 +186,9 @@ export const seedIndexingRules = async () => { await models.IndexingRule.create({ id: 3, identifier: 'QmZfeJYR86UARzp9HiXbURWunYgC9ywvPvoePNbuaATrEK', - identifierType: SubgraphIdentifierType.DEPLOYMENT, + identifierType: 'deployment', protocolNetwork: 'eip155:421614', - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + decisionBasis: 'offchain', requireSupported: true, safety: true, autoRenewal: true, @@ -200,9 +196,9 @@ export const seedIndexingRules = async () => { await models.IndexingRule.create({ id: 4, identifier: '0x0000000000000000000000000000000000000000-0', - identifierType: SubgraphIdentifierType.SUBGRAPH, + identifierType: 'subgraph', protocolNetwork: 'eip155:421614', - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', requireSupported: true, safety: true, autoRenewal: true, @@ -211,9 +207,9 @@ export const seedIndexingRules = async () => { await models.IndexingRule.create({ id: 5, identifier: '0x0000000000000000000000000000000000000000-1', - identifierType: SubgraphIdentifierType.SUBGRAPH, + identifierType: 'subgraph', protocolNetwork: 'eip155:421614', - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + decisionBasis: 'offchain', requireSupported: true, safety: true, autoRenewal: true, @@ -221,11 +217,11 @@ export const seedIndexingRules = async () => { await models.IndexingRule.create({ id: 6, identifier: '0x0000000000000000000000000000000000000000-2', - identifierType: SubgraphIdentifierType.SUBGRAPH, + identifierType: 'subgraph', protocolNetwork: 'eip155:421614', allocationAmount: parseGRT('1000').toString(), allocationLifetime: 12, - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + decisionBasis: 'offchain', requireSupported: true, safety: true, autoRenewal: true, @@ -279,8 +275,8 @@ export const seedActions = async () => { logger.debug('Seed Actions') await models.Action.create({ id: 1, - type: ActionType.ALLOCATE, - status: ActionStatus.SUCCESS, + type: 'allocate', + status: 'success', deploymentID: 'QmSrf6VVPyg9NGdS1xhLmoosk3qZQaWhfoSTHE2H7sht6Q', source: 'test', reason: 'test', @@ -288,8 +284,8 @@ export const seedActions = async () => { }) await models.Action.create({ id: 2, - type: ActionType.UNALLOCATE, - status: ActionStatus.FAILED, + type: 'unallocate', + status: 'failed', deploymentID: 'QmSrf6VVPyg9NGdS1xhLmoosk3qZQaWhfoSTHE2H7sht6Q', source: 'test', reason: 'test', diff --git a/packages/indexer-cli/src/actions.ts b/packages/indexer-cli/src/actions.ts index b3815ebc0..48d60c26a 100644 --- a/packages/indexer-cli/src/actions.ts +++ b/packages/indexer-cli/src/actions.ts @@ -1,21 +1,17 @@ import { - ActionFilter, - ActionInput, ActionParams, ActionResult, - ActionStatus, - ActionType, ActionUpdateInput, - IndexerManagementClient, + GeneratedGraphQLTypes, nullPassThrough, OrderDirection, parseBoolean, - validateNetworkIdentifier, } from '@graphprotocol/indexer-common' import { validatePOI, validateRequiredParams } from './command-helpers' import gql from 'graphql-tag' import { utils } from 'ethers' import { parseGRT } from '@graphprotocol/common-ts' +import { Client } from '@urql/core' export interface GenericActionInputParams { targetDeployment: string @@ -27,17 +23,17 @@ export interface GenericActionInputParams { // Make separate functions for each action type parsing from generic? export async function buildActionInput( - type: ActionType, + type: GeneratedGraphQLTypes.ActionType, actionParams: GenericActionInputParams, source: string, reason: string, - status: ActionStatus, + status: GeneratedGraphQLTypes.ActionStatus, priority: number, protocolNetwork: string, -): Promise { +): Promise { await validateActionInput(type, actionParams) switch (type) { - case ActionType.ALLOCATE: + case 'allocate': return { deploymentID: actionParams.targetDeployment, amount: actionParams.param1?.toString(), @@ -48,7 +44,7 @@ export async function buildActionInput( priority, protocolNetwork, } - case ActionType.UNALLOCATE: { + case 'unallocate': { let poi = actionParams.param2 if (poi == '0' || poi == '0x0') { poi = utils.hexlify(Array(32).fill(0)) @@ -66,7 +62,7 @@ export async function buildActionInput( protocolNetwork, } } - case ActionType.REALLOCATE: { + case 'reallocate': { let poi = actionParams.param3 if (poi == '0' || poi == '0x0') { poi = utils.hexlify(Array(32).fill(0)) @@ -89,18 +85,18 @@ export async function buildActionInput( } export async function validateActionInput( - type: ActionType, + type: GeneratedGraphQLTypes.ActionType, actionParams: GenericActionInputParams, ): Promise { let requiredFields: string[] = [] switch (type) { - case ActionType.ALLOCATE: + case 'allocate': requiredFields = requiredFields.concat(['targetDeployment', 'param1']) break - case ActionType.UNALLOCATE: + case 'unallocate': requiredFields = requiredFields.concat(['targetDeployment', 'param1']) break - case ActionType.REALLOCATE: + case 'reallocate': requiredFields = requiredFields.concat(['targetDeployment', 'param1', 'param2']) } @@ -110,30 +106,34 @@ export async function validateActionInput( ) } -export function validateActionType(input: string): ActionType { - const validVariants = Object.keys(ActionType).map(variant => - variant.toLocaleLowerCase(), +export function validateActionType(input: string): GeneratedGraphQLTypes.ActionType { + const validVariants = Object.keys(GeneratedGraphQLTypes.ActionType).map(variant => + variant.toLowerCase(), ) - if (!validVariants.includes(input.toLocaleLowerCase())) { + if (!validVariants.includes(input.toLowerCase())) { throw Error( `Invalid 'ActionType' "${input}", must be one of ['${validVariants.join(`', '`)}']`, ) } - return ActionType[input.toUpperCase() as keyof typeof ActionType] + return GeneratedGraphQLTypes.ActionType[ + input.toLowerCase() as keyof typeof GeneratedGraphQLTypes.ActionType + ] } -export function validateActionStatus(input: string): ActionStatus { - const validVariants = Object.keys(ActionStatus).map(variant => - variant.toLocaleLowerCase(), +export function validateActionStatus(input: string): GeneratedGraphQLTypes.ActionStatus { + const validVariants = Object.keys(GeneratedGraphQLTypes.ActionStatus).map(variant => + variant.toLowerCase(), ) - if (!validVariants.includes(input.toLocaleLowerCase())) { + if (!validVariants.includes(input.toLowerCase())) { throw Error( `Invalid 'ActionStatus' "${input}", must be one of ['${validVariants.join( `', '`, )}']`, ) } - return ActionStatus[input.toUpperCase() as keyof typeof ActionStatus] + return GeneratedGraphQLTypes.ActionStatus[ + input.toUpperCase() as keyof typeof GeneratedGraphQLTypes.ActionStatus + ] } export function buildActionFilter( @@ -142,8 +142,8 @@ export function buildActionFilter( status: string | undefined, source: string | undefined, reason: string | undefined, -): ActionFilter { - const filter: ActionFilter = {} +): GeneratedGraphQLTypes.ActionFilter { + const filter: GeneratedGraphQLTypes.ActionFilter = {} if (id) { filter.id = +id } @@ -168,8 +168,8 @@ export function buildActionFilter( } export async function queueActions( - client: IndexerManagementClient, - actions: ActionInput[], + client: Client, + actions: GeneratedGraphQLTypes.ActionInput[], ): Promise { const result = await client .mutation( @@ -202,8 +202,11 @@ export async function queueActions( return result.data.queueActions } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const ACTION_PARAMS_PARSERS: Record any> = { +const ACTION_PARAMS_PARSERS: Record< + keyof GeneratedGraphQLTypes.ActionUpdateInput, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (x: never) => any +> = { deploymentID: x => nullPassThrough(x), allocationID: x => x, amount: nullPassThrough(parseGRT), @@ -212,7 +215,7 @@ const ACTION_PARAMS_PARSERS: Record any> type: x => validateActionType(x), status: x => validateActionStatus(x), reason: nullPassThrough, - protocolNetwork: x => validateNetworkIdentifier(x), + id: x => nullPassThrough(x), } /** @@ -232,9 +235,7 @@ export const parseActionUpdateInput = (input: object): ActionUpdateInput => { return obj as ActionUpdateInput } -export async function executeApprovedActions( - client: IndexerManagementClient, -): Promise { +export async function executeApprovedActions(client: Client): Promise { const result = await client .mutation(gql` mutation executeApprovedActions { @@ -265,7 +266,7 @@ export async function executeApprovedActions( } export async function approveActions( - client: IndexerManagementClient, + client: Client, actionIDs: number[], ): Promise { const result = await client @@ -301,7 +302,7 @@ export async function approveActions( } export async function cancelActions( - client: IndexerManagementClient, + client: Client, actionIDs: number[], ): Promise { const result = await client @@ -337,7 +338,7 @@ export async function cancelActions( } export async function fetchAction( - client: IndexerManagementClient, + client: Client, actionID: number, ): Promise { const result = await client @@ -373,8 +374,8 @@ export async function fetchAction( } export async function fetchActions( - client: IndexerManagementClient, - actionFilter: ActionFilter, + client: Client, + actionFilter: GeneratedGraphQLTypes.ActionFilter, first?: number, orderBy?: ActionParams, orderDirection?: OrderDirection, @@ -423,7 +424,7 @@ export async function fetchActions( } export async function deleteActions( - client: IndexerManagementClient, + client: Client, actionIDs: number[], ): Promise { const result = await client @@ -460,8 +461,8 @@ export async function deleteActions( } export async function updateActions( - client: IndexerManagementClient, - filter: ActionFilter, + client: Client, + filter: GeneratedGraphQLTypes.ActionFilter, action: ActionUpdateInput, ): Promise { const result = await client diff --git a/packages/indexer-cli/src/allocations.ts b/packages/indexer-cli/src/allocations.ts index 16cd86fdd..083c60195 100644 --- a/packages/indexer-cli/src/allocations.ts +++ b/packages/indexer-cli/src/allocations.ts @@ -4,7 +4,6 @@ import { GluegunPrint } from 'gluegun' import { table, getBorderCharacters } from 'table' import { BigNumber, utils } from 'ethers' import { OutputFormat, parseOutputFormat, pickFields } from './command-helpers' -import { IndexerManagementClient } from '@graphprotocol/indexer-common' import gql from 'graphql-tag' import { CloseAllocationResult, @@ -12,6 +11,7 @@ import { ReallocateAllocationResult, resolveChainAlias, } from '@graphprotocol/indexer-common' +import { Client } from '@urql/core' export interface IndexerAllocation { id: number @@ -171,7 +171,7 @@ function nullPassThrough(fn: (x: T) => U): (x: T | null) => U | null { } export const createAllocation = async ( - client: IndexerManagementClient, + client: Client, deployment: string, amount: BigNumber, indexNode: string | undefined, @@ -216,7 +216,7 @@ export const createAllocation = async ( } export const closeAllocation = async ( - client: IndexerManagementClient, + client: Client, allocationID: string, poi: string | undefined, force: boolean, @@ -262,7 +262,7 @@ export const closeAllocation = async ( } export const reallocateAllocation = async ( - client: IndexerManagementClient, + client: Client, allocationID: string, poi: string | undefined, amount: BigNumber, @@ -313,7 +313,7 @@ export const reallocateAllocation = async ( } export const submitCollectReceiptsJob = async ( - client: IndexerManagementClient, + client: Client, allocationID: string, protocolNetwork: string, ): Promise => { diff --git a/packages/indexer-cli/src/client.ts b/packages/indexer-cli/src/client.ts index 0896a71c2..abfbcc044 100644 --- a/packages/indexer-cli/src/client.ts +++ b/packages/indexer-cli/src/client.ts @@ -1,11 +1,6 @@ import { createClient } from '@urql/core' import fetch from 'isomorphic-fetch' -import { IndexerManagementClient } from '@graphprotocol/indexer-common' -export const createIndexerManagementClient = async ({ - url, -}: { - url: string -}): Promise => { - return createClient({ url, fetch }) as unknown as IndexerManagementClient +export const createIndexerManagementClient = async ({ url }: { url: string }) => { + return createClient({ url, fetch }) } diff --git a/packages/indexer-cli/src/commands/indexer/actions/approve.ts b/packages/indexer-cli/src/commands/indexer/actions/approve.ts index 52e32f55c..800b50c7e 100644 --- a/packages/indexer-cli/src/commands/indexer/actions/approve.ts +++ b/packages/indexer-cli/src/commands/indexer/actions/approve.ts @@ -10,7 +10,7 @@ import { extractProtocolNetworkOption, } from '../../../command-helpers' import { approveActions, fetchActions } from '../../../actions' -import { ActionStatus, resolveChainAlias } from '@graphprotocol/indexer-common' +import { GeneratedGraphQLTypes, resolveChainAlias } from '@graphprotocol/indexer-common' const HELP = ` ${chalk.bold('graph indexer actions approve')} [options] [ ...] @@ -65,7 +65,7 @@ module.exports = { ) } const queuedActions = await fetchActions(client, { - status: ActionStatus.QUEUED, + status: GeneratedGraphQLTypes.ActionStatus.queued, protocolNetwork, }) diff --git a/packages/indexer-cli/src/commands/indexer/actions/get.ts b/packages/indexer-cli/src/commands/indexer/actions/get.ts index ce73d2740..15844757d 100644 --- a/packages/indexer-cli/src/commands/indexer/actions/get.ts +++ b/packages/indexer-cli/src/commands/indexer/actions/get.ts @@ -92,8 +92,8 @@ module.exports = { } = parameters.options const [action] = fixParameters(parameters, { h, help }) || [] - let orderByParam = ActionParams.ID - let orderDirectionValue = OrderDirection.DESC + let orderByParam: ActionParams = ActionParams.id + let orderDirectionValue: OrderDirection = OrderDirection.desc const outputFormat = o || output || 'table' const protocolNetwork: string | undefined = extractProtocolNetworkOption( @@ -140,10 +140,10 @@ module.exports = { } if (orderBy) { - orderByParam = ActionParams[orderBy.toUpperCase() as keyof typeof ActionParams] + orderByParam = ActionParams[orderBy as keyof typeof ActionParams] orderDirectionValue = orderDirection - ? OrderDirection[orderDirection.toUpperCase() as keyof typeof OrderDirection] - : OrderDirection.DESC + ? OrderDirection[orderDirection.toLowerCase() as keyof typeof OrderDirection] + : OrderDirection.desc } if (!['undefined', 'number'].includes(typeof first)) { diff --git a/packages/indexer-cli/src/commands/indexer/actions/queue.ts b/packages/indexer-cli/src/commands/indexer/actions/queue.ts index f334b40ea..ca70e53c0 100644 --- a/packages/indexer-cli/src/commands/indexer/actions/queue.ts +++ b/packages/indexer-cli/src/commands/indexer/actions/queue.ts @@ -8,11 +8,7 @@ import { printObjectOrArray, } from '../../../command-helpers' import { buildActionInput, queueActions, validateActionType } from '../../../actions' -import { - ActionInput, - ActionStatus, - resolveChainAlias, -} from '@graphprotocol/indexer-common' +import { GeneratedGraphQLTypes, resolveChainAlias } from '@graphprotocol/indexer-common' const HELP = ` ${chalk.bold( @@ -65,7 +61,7 @@ module.exports = { const [type, targetDeployment, param1, param2, param3, param4] = parameters.array || [] - let actionInputParams: ActionInput + let actionInputParams: GeneratedGraphQLTypes.ActionInput try { if (!['json', 'yaml', 'table'].includes(outputFormat)) { throw Error( @@ -80,7 +76,7 @@ module.exports = { { targetDeployment, param1, param2, param3, param4 }, decisionSource, decisionReason, - ActionStatus.QUEUED, + 'queued', executionPriority, networkIdentifier, ) diff --git a/packages/indexer-cli/src/commands/indexer/actions/update.ts b/packages/indexer-cli/src/commands/indexer/actions/update.ts index 6ea470cac..961222e4b 100644 --- a/packages/indexer-cli/src/commands/indexer/actions/update.ts +++ b/packages/indexer-cli/src/commands/indexer/actions/update.ts @@ -3,8 +3,8 @@ import chalk from 'chalk' import { Action, - ActionFilter, ActionUpdateInput, + GeneratedGraphQLTypes, resolveChainAlias, } from '@graphprotocol/indexer-common' import { loadValidatedConfig } from '../../../config' @@ -44,7 +44,7 @@ module.exports = { const [...setValues] = fixParameters(parameters, { h, help }) || [] let updateActionInput: ActionUpdateInput = {} - let actionFilter: ActionFilter = {} + let actionFilter: GeneratedGraphQLTypes.ActionFilter = {} const outputFormat = o || output || 'table' diff --git a/packages/indexer-cli/src/commands/indexer/allocations/create.ts b/packages/indexer-cli/src/commands/indexer/allocations/create.ts index 6986bfbe2..2a9bf2391 100644 --- a/packages/indexer-cli/src/commands/indexer/allocations/create.ts +++ b/packages/indexer-cli/src/commands/indexer/allocations/create.ts @@ -7,7 +7,6 @@ import { BigNumber } from 'ethers' import { createAllocation } from '../../../allocations' import { processIdentifier, - SubgraphIdentifierType, validateNetworkIdentifier, } from '@graphprotocol/indexer-common' import { printObjectOrArray } from '../../../command-helpers' @@ -73,7 +72,7 @@ module.exports = { all: false, global: false, }) - if (type !== SubgraphIdentifierType.DEPLOYMENT) { + if (type !== 'deployment') { throw Error( `Invalid 'deploymentID' provided (${deploymentID}), must be bytes32 or base58 formatted)`, ) diff --git a/packages/indexer-cli/src/commands/indexer/allocations/get.ts b/packages/indexer-cli/src/commands/indexer/allocations/get.ts index 2ab707567..75655220e 100644 --- a/packages/indexer-cli/src/commands/indexer/allocations/get.ts +++ b/packages/indexer-cli/src/commands/indexer/allocations/get.ts @@ -6,7 +6,7 @@ import { createIndexerManagementClient } from '../../../client' import { extractProtocolNetworkOption, fixParameters } from '../../../command-helpers' import gql from 'graphql-tag' import { SubgraphDeploymentID } from '@graphprotocol/common-ts' -import { processIdentifier, SubgraphIdentifierType } from '@graphprotocol/indexer-common' +import { GeneratedGraphQLTypes, processIdentifier } from '@graphprotocol/indexer-common' import { IndexerAllocation, printIndexerAllocations } from '../../../allocations' import { utils } from 'ethers' @@ -75,14 +75,14 @@ module.exports = { } let deploymentString: string | undefined = undefined - let type: SubgraphIdentifierType + let type: GeneratedGraphQLTypes.IdentifierType if (deployment) { ;[deploymentString, type] = await processIdentifier(deployment, { all: true, global: false, }) - if (type !== SubgraphIdentifierType.DEPLOYMENT) { + if (type !== 'deployment') { throw Error( `Invalid '--deployment' must be a valid deployment ID (bytes32 or base58 formatted)`, ) diff --git a/packages/indexer-cli/src/commands/indexer/rules/maybe.ts b/packages/indexer-cli/src/commands/indexer/rules/maybe.ts index b23b5cb61..0f08b423b 100644 --- a/packages/indexer-cli/src/commands/indexer/rules/maybe.ts +++ b/packages/indexer-cli/src/commands/indexer/rules/maybe.ts @@ -8,7 +8,7 @@ import { fixParameters, parseOutputFormat, } from '../../../command-helpers' -import { IndexingDecisionBasis, processIdentifier } from '@graphprotocol/indexer-common' +import { processIdentifier } from '@graphprotocol/indexer-common' import { setIndexingRule, displayRules, parseIndexingRule } from '../../../rules' const HELP = ` @@ -54,7 +54,7 @@ module.exports = { const inputRule = parseIndexingRule({ identifier, identifierType, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: 'rules', protocolNetwork, }) diff --git a/packages/indexer-cli/src/commands/indexer/rules/offchain.ts b/packages/indexer-cli/src/commands/indexer/rules/offchain.ts index 0c43b3166..13d512da4 100644 --- a/packages/indexer-cli/src/commands/indexer/rules/offchain.ts +++ b/packages/indexer-cli/src/commands/indexer/rules/offchain.ts @@ -8,7 +8,7 @@ import { fixParameters, parseOutputFormat, } from '../../../command-helpers' -import { IndexingDecisionBasis, processIdentifier } from '@graphprotocol/indexer-common' +import { processIdentifier } from '@graphprotocol/indexer-common' import { setIndexingRule, displayRules, parseIndexingRule } from '../../../rules' const HELP = ` @@ -56,7 +56,7 @@ module.exports = { identifier, identifierType, protocolNetwork, - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + decisionBasis: 'offchain', }) // Update the indexing rule according to the key/value pairs diff --git a/packages/indexer-cli/src/commands/indexer/rules/start.ts b/packages/indexer-cli/src/commands/indexer/rules/start.ts index e3e50b16c..20fe5ddd3 100644 --- a/packages/indexer-cli/src/commands/indexer/rules/start.ts +++ b/packages/indexer-cli/src/commands/indexer/rules/start.ts @@ -8,7 +8,7 @@ import { fixParameters, parseOutputFormat, } from '../../../command-helpers' -import { IndexingDecisionBasis, processIdentifier } from '@graphprotocol/indexer-common' +import { processIdentifier } from '@graphprotocol/indexer-common' import { setIndexingRule, displayRules, parseIndexingRule } from '../../../rules' const HELP = ` @@ -56,7 +56,7 @@ module.exports = { const inputRule = parseIndexingRule({ identifier, identifierType, - decisionBasis: IndexingDecisionBasis.ALWAYS, + decisionBasis: 'always', protocolNetwork, }) diff --git a/packages/indexer-cli/src/commands/indexer/rules/stop.ts b/packages/indexer-cli/src/commands/indexer/rules/stop.ts index 0816d689f..0fa83eab2 100644 --- a/packages/indexer-cli/src/commands/indexer/rules/stop.ts +++ b/packages/indexer-cli/src/commands/indexer/rules/stop.ts @@ -8,7 +8,7 @@ import { fixParameters, parseOutputFormat, } from '../../../command-helpers' -import { IndexingDecisionBasis, processIdentifier } from '@graphprotocol/indexer-common' +import { processIdentifier } from '@graphprotocol/indexer-common' import { setIndexingRule, displayRules, parseIndexingRule } from '../../../rules' const HELP = ` @@ -56,7 +56,7 @@ module.exports = { const inputRule = parseIndexingRule({ identifier, identifierType, - decisionBasis: IndexingDecisionBasis.NEVER, + decisionBasis: 'never', protocolNetwork, }) diff --git a/packages/indexer-cli/src/cost.ts b/packages/indexer-cli/src/cost.ts index af2fc51d8..cc9359278 100644 --- a/packages/indexer-cli/src/cost.ts +++ b/packages/indexer-cli/src/cost.ts @@ -1,14 +1,11 @@ import { SubgraphDeploymentID } from '@graphprotocol/common-ts' -import { - CostModelAttributes, - GraphQLCostModel, - IndexerManagementClient, -} from '@graphprotocol/indexer-common' +import { CostModelAttributes, GeneratedGraphQLTypes } from '@graphprotocol/indexer-common' import gql from 'graphql-tag' import yaml from 'yaml' import { GluegunPrint } from 'gluegun' import { table, getBorderCharacters } from 'table' import { OutputFormat, pickFields } from './command-helpers' +import { Client } from '@urql/core' export type SubgraphDeploymentIDIsh = SubgraphDeploymentID | 'all' | 'global' @@ -68,7 +65,7 @@ const COST_MODEL_CONVERTERS_TO_GRAPHQL: Record< * Parses a user-provided cost model into a normalized form. */ export const parseCostModel = ( - cost: Partial, + cost: Partial, ): Partial => { // eslint-disable-next-line @typescript-eslint/no-explicit-any const obj = {} as any @@ -190,7 +187,7 @@ export const printCostModels = ( } export const costModels = async ( - client: IndexerManagementClient, + client: Client, ): Promise[]> => { const result = await client .query(gql` @@ -212,7 +209,7 @@ export const costModels = async ( } export const costModel = async ( - client: IndexerManagementClient, + client: Client, deployment: SubgraphDeploymentIDIsh, ): Promise | null> => { const result = await client @@ -242,7 +239,7 @@ export const costModel = async ( } export const setCostModel = async ( - client: IndexerManagementClient, + client: Client, costModel: Partial, ): Promise> => { const result = await client @@ -268,7 +265,7 @@ export const setCostModel = async ( } export const deleteCostModels = async ( - client: IndexerManagementClient, + client: Client, deployments: string[], ): Promise => { const result = await client diff --git a/packages/indexer-cli/src/disputes.ts b/packages/indexer-cli/src/disputes.ts index e3fa12bb4..2a4c29bbc 100644 --- a/packages/indexer-cli/src/disputes.ts +++ b/packages/indexer-cli/src/disputes.ts @@ -1,5 +1,4 @@ import { - IndexerManagementClient, POIDisputeAttributes, indexerError, IndexerErrorCode, @@ -10,6 +9,7 @@ import yaml from 'yaml' import { GluegunPrint } from 'gluegun' import { table, getBorderCharacters } from 'table' import { OutputFormat } from './command-helpers' +import { Client } from '@urql/core' const DISPUTE_FORMATTERS: Record string> = { allocationID: x => x, @@ -129,7 +129,7 @@ export const printDisputes = ( } export const disputes = async ( - client: IndexerManagementClient, + client: Client, status: string, minClosedEpoch: number, protocolNetwork: string | undefined, diff --git a/packages/indexer-cli/src/rules.ts b/packages/indexer-cli/src/rules.ts index e50027849..37d7c43e4 100644 --- a/packages/indexer-cli/src/rules.ts +++ b/packages/indexer-cli/src/rules.ts @@ -3,9 +3,7 @@ import { nullPassThrough, parseBoolean, parseDecisionBasis, - IndexerManagementClient, IndexingRuleAttributes, - IndexingDecisionBasis, IndexingRuleIdentifier, resolveChainAlias, } from '@graphprotocol/indexer-common' @@ -15,6 +13,7 @@ import { table, getBorderCharacters } from 'table' import { BigNumber, utils } from 'ethers' import { OutputFormat, pickFields } from './command-helpers' import chalk from 'chalk' +import { Client } from '@urql/core' export type SubgraphDeploymentIDIsh = SubgraphDeploymentID | 'global' | 'all' @@ -213,12 +212,8 @@ export const displayRules = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any const rules = ruleOrRules.map(rule => formatIndexingRule(pickFields(rule, keys))) - const onchainRules = rules.filter( - rule => rule?.decisionBasis !== IndexingDecisionBasis.OFFCHAIN, - ) - const offchainRules = rules.filter( - rule => rule?.decisionBasis === IndexingDecisionBasis.OFFCHAIN, - ) + const onchainRules = rules.filter(rule => rule?.decisionBasis !== 'offchain') + const offchainRules = rules.filter(rule => rule?.decisionBasis === 'offchain') // Display indexing rules set to sync off-chain if any const offchainRulesDisplay = offchainRules.length @@ -242,7 +237,7 @@ export const displayRules = ( } export const indexingRules = async ( - client: IndexerManagementClient, + client: Client, merged: boolean, protocolNetwork?: string, ): Promise[]> => { @@ -282,7 +277,7 @@ export const indexingRules = async ( } export const indexingRule = async ( - client: IndexerManagementClient, + client: Client, identifier: IndexingRuleIdentifier, merged: boolean, ): Promise | null> => { @@ -326,7 +321,7 @@ export const indexingRule = async ( } export const setIndexingRule = async ( - client: IndexerManagementClient, + client: Client, rule: Partial, ): Promise> => { const result = await client @@ -365,7 +360,7 @@ export const setIndexingRule = async ( } export const deleteIndexingRules = async ( - client: IndexerManagementClient, + client: Client, deployments: IndexingRuleIdentifier[], ): Promise => { const result = await client diff --git a/packages/indexer-common/.eslintignore b/packages/indexer-common/.eslintignore index 5a19e8ace..105b88eef 100644 --- a/packages/indexer-common/.eslintignore +++ b/packages/indexer-common/.eslintignore @@ -1,3 +1,4 @@ node_modules dist -coverage \ No newline at end of file +coverage +src/schema/*.generated.ts diff --git a/packages/indexer-common/codegen.ts b/packages/indexer-common/codegen.ts new file mode 100644 index 000000000..4ead36a49 --- /dev/null +++ b/packages/indexer-common/codegen.ts @@ -0,0 +1,19 @@ +import type { CodegenConfig } from '@graphql-codegen/cli' +import { defineConfig } from '@eddeee888/gcg-typescript-resolver-files' + +const config: CodegenConfig = { + schema: 'src/indexer-management/schema.graphql', + hooks: { + afterOneFileWrite: ['yarn format'], + }, + generates: { + 'src/schema': defineConfig({ + typesPluginsConfig: { + contextType: '@graphprotocol/indexer-common#IndexerManagementResolverContext', + enumsAsConst: true, + enumsAsTypes: false, + }, + }), + }, +} +export default config diff --git a/packages/indexer-common/jest.config.js b/packages/indexer-common/jest.config.js index bca010358..415b20af4 100644 --- a/packages/indexer-common/jest.config.js +++ b/packages/indexer-common/jest.config.js @@ -12,6 +12,7 @@ module.exports = { testEnvironment: 'node', testPathIgnorePatterns: ['/node_modules/', '/dist/', '/.yalc', 'util.ts'], transformIgnorePatterns: ['!node_modules/'], + transform: { '^.+\\.tsx?$': ['ts-jest'] }, globals: { __DATABASE__: { host: process.env.POSTGRES_TEST_HOST || bail('POSTGRES_TEST_HOST is not defined'), diff --git a/packages/indexer-common/package.json b/packages/indexer-common/package.json index a1bb6ae3e..7f4519864 100644 --- a/packages/indexer-common/package.json +++ b/packages/indexer-common/package.json @@ -13,24 +13,25 @@ "scripts": { "format": "prettier --write 'src/**/*.ts'", "lint": "eslint . --ext .ts,.tsx --fix", - "compile": "tsc", + "compile": "yarn codegen && tsc", "prepare": "yarn format && yarn lint && yarn compile", "test": "LOG_LEVEL=info jest --colors --verbose --runInBand --detectOpenHandles", "test:ci": "LOG_LEVEL=info jest --verbose --maxWorkers=1 --ci", "test:debug": "LOG_LEVEL=debug jest --runInBand --detectOpenHandles --verbose", "test:watch": "jest --runInBand --detectOpenHandles --watch --passWithNoTests --verbose", - "clean": "rm -rf ./node_modules ./dist ./tsconfig.tsbuildinfo" + "clean": "rm -rf ./node_modules ./dist ./tsconfig.tsbuildinfo", + "codegen": "graphql-codegen --config codegen.ts" }, "dependencies": { "@graphprotocol/common-ts": "2.0.9", "@graphprotocol/cost-model": "0.1.18", + "@graphql-tools/executor-http": "^1.0.9", "@semiotic-labs/tap-contracts-bindings": "^1.2.1", "@thi.ng/heaps": "1.2.38", "@types/lodash.clonedeep": "^4.5.7", "@types/lodash.intersection": "^4.4.7", "@types/lodash.xor": "^4.5.7", "@urql/core": "2.4.4", - "@urql/exchange-execute": "1.2.2", "axios": "1.6.2", "body-parser": "1.20.2", "cors": "2.8.5", @@ -39,7 +40,9 @@ "express": "4.18.2", "fastify": "3.25.0", "graphql": "16.8.0", + "graphql-scalars": "^1.22.5", "graphql-tag": "2.12.6", + "graphql-yoga": "^5.1.1", "jayson": "3.6.6", "lodash.clonedeep": "^4.5.0", "lodash.groupby": "^4.6.0", @@ -61,6 +64,8 @@ }, "devDependencies": { "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@eddeee888/gcg-typescript-resolver-files": "^0.7.2", + "@graphql-codegen/cli": "^5.0.2", "@types/cors": "2.8.14", "@types/express": "4.17.17", "@types/jest": "29.5.4", @@ -83,8 +88,7 @@ "resolutions": { "ethers": "5.7.0", "sequelize": "6.33.0", - "@ethersproject/bignumber": "5.7.0", - "@urql/exchange-execute/@urql/core": "2.4.4" + "@ethersproject/bignumber": "5.7.0" }, "babel": { "presets": [], diff --git a/packages/indexer-common/src/actions.ts b/packages/indexer-common/src/actions.ts index 9aec66814..92694bdc9 100644 --- a/packages/indexer-common/src/actions.ts +++ b/packages/indexer-common/src/actions.ts @@ -1,53 +1,29 @@ import { NetworkMonitor } from './indexer-management' import { AllocationStatus } from './allocations' import { Logger } from '@graphprotocol/common-ts' -import { WhereOperators, WhereOptions } from 'sequelize' +import { WhereOptions } from 'sequelize' import { Op } from 'sequelize' import { WhereAttributeHashValue } from 'sequelize/types/model' import { validateNetworkIdentifier } from './parsers' +import { + ActionFilter, + ActionUpdateInput, + ActionParams, + ActionInput, + ActionType, + ActionStatus, +} from './schema/types.generated' -export interface ActionParamsInput { - deploymentID?: string - allocationID?: string - amount?: string - poi?: string - force?: boolean -} +export { ActionUpdateInput, ActionParams } export interface ActionItem { - params: ActionParamsInput + params: ActionUpdateInput type: ActionType reason: string status?: ActionStatus protocolNetwork: string } -export interface ActionUpdateInput { - deploymentID?: string - allocationID?: string - amount?: string - poi?: string - force?: boolean - type?: ActionType - status?: ActionStatus - reason?: string - protocolNetwork?: string -} - -export interface ActionInput { - type: ActionType - deploymentID: string - allocationID?: string - amount?: string - poi?: string - force?: boolean - source: string - reason: string - status: ActionStatus - priority: number | undefined - protocolNetwork: string -} - export const isValidActionInput = ( /* eslint-disable @typescript-eslint/no-explicit-any */ variableToCheck: any, @@ -57,14 +33,14 @@ export const isValidActionInput = ( } let hasActionParams = false switch (variableToCheck.type) { - case ActionType.ALLOCATE: + case ActionType.allocate: hasActionParams = 'deploymentID' in variableToCheck && 'amount' in variableToCheck break - case ActionType.UNALLOCATE: + case ActionType.unallocate: hasActionParams = 'deploymentID' in variableToCheck && 'allocationID' in variableToCheck break - case ActionType.REALLOCATE: + case ActionType.reallocate: hasActionParams = 'deploymentID' in variableToCheck && 'allocationID' in variableToCheck && @@ -110,12 +86,10 @@ export const validateActionInputs = async ( // Must have status QUEUED or APPROVED if ( - [ - ActionStatus.FAILED, - ActionStatus.SUCCESS, - ActionStatus.PENDING, - ActionStatus.CANCELED, - ].includes(action.status) + action.status === 'failed' || + action.status === 'success' || + action.status === 'pending' || + action.status === 'canceled' ) { throw Error( `Cannot queue action with status ${action.status}, must be one of ['APPROVED', 'QUEUED']`, @@ -124,6 +98,7 @@ export const validateActionInputs = async ( // Action must target an existing subgraph deployment const subgraphDeployment = await networkMonitor.subgraphDeployment( + // @ts-expect-error - deploymentID should be here action.deploymentID, ) if (!subgraphDeployment) { @@ -133,7 +108,7 @@ export const validateActionInputs = async ( } // Unallocate & reallocate actions must target an active allocationID - if ([ActionType.UNALLOCATE, ActionType.REALLOCATE].includes(action.type)) { + if (action.type === 'unallocate' || action.type === 'reallocate') { // allocationID must belong to active allocation // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const allocation = await networkMonitor.allocation(action.allocationID!) @@ -153,16 +128,6 @@ export const validateActionInputs = async ( } } -export interface ActionFilter { - id?: number | undefined - type?: ActionType - status?: ActionStatus - source?: string - reason?: string - updatedAt?: WhereOperators - protocolNetwork?: string -} - export const actionFilterToWhereOptions = (filter: ActionFilter): WhereOptions => { const whereOptions = [] as WhereAttributeHashValue[] @@ -193,36 +158,3 @@ export interface ActionResult { transaction: string | null protocolNetwork: string } - -export enum ActionType { - ALLOCATE = 'allocate', - UNALLOCATE = 'unallocate', - REALLOCATE = 'reallocate', -} - -export enum ActionStatus { - QUEUED = 'queued', - APPROVED = 'approved', - PENDING = 'pending', - SUCCESS = 'success', - FAILED = 'failed', - CANCELED = 'canceled', -} - -export enum ActionParams { - ID = 'id', - STATUS = 'status', - TYPE = 'type', - DEPLOYMENT_ID = 'deploymentID', - ALLOCATION_ID = 'allocationID', - TRANSACTION = 'transaction', - AMOUNT = 'amount', - POI = 'poi', - FORCE = 'force', - SOURCE = 'source', - REASON = 'reason', - PRIORITY = 'priority', - CREATED_AT = 'createdAt', - UPDATED_AT = 'updatedAt', - PROTOCOL_NETWORK = 'protocolNetwork', -} diff --git a/packages/indexer-common/src/index.ts b/packages/indexer-common/src/index.ts index 0090cad0d..4a2d508b9 100644 --- a/packages/indexer-common/src/index.ts +++ b/packages/indexer-common/src/index.ts @@ -17,3 +17,8 @@ export * from './utils' export * from './parsers' export * as specification from './network-specification' export * from './multi-networks' +export * as GeneratedGraphQLTypes from './schema/types.generated' +export { + createIndexerManagementYogaClient, + type IndexerManagementYogaClient, +} from './indexer-management/yoga' diff --git a/packages/indexer-common/src/indexer-management/__tests__/allocations.test.ts b/packages/indexer-common/src/indexer-management/__tests__/allocations.test.ts index a240206a9..95ea343eb 100644 --- a/packages/indexer-common/src/indexer-management/__tests__/allocations.test.ts +++ b/packages/indexer-common/src/indexer-management/__tests__/allocations.test.ts @@ -1,6 +1,5 @@ import { Action, - ActionType, AllocationManager, defineIndexerManagementModels, defineQueryFeeModels, @@ -24,6 +23,7 @@ import { testNetworkSpecification, } from './util' import { Sequelize } from 'sequelize' +import { ActionType } from '../../schema/types.generated' // Make global Jest variables available // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -136,14 +136,14 @@ describe('Allocation Manager', () => { const reallocate = balances[2] // Allocate test action - expect(allocate.action.type).toBe(ActionType.ALLOCATE) + expect(allocate.action.type).toBe(ActionType.allocate) expect(allocate.allocates).toStrictEqual(parseGRT('10000')) expect(allocate.rewards.isZero()).toBeTruthy() expect(allocate.unallocates.isZero()).toBeTruthy() expect(allocate.balance).toStrictEqual(parseGRT('10000')) // Unallocate test action - expect(unallocate.action.type).toBe(ActionType.UNALLOCATE) + expect(unallocate.action.type).toBe(ActionType.unallocate) expect(unallocate.allocates.isZero()).toBeTruthy() expect(unallocate.rewards.isZero()).toBeFalsy() expect(unallocate.unallocates).toStrictEqual(parseGRT('10000')) @@ -152,7 +152,7 @@ describe('Allocation Manager', () => { ) // This Reallocate test Action intentionally uses a null or zeroed POI, so it should not accrue rewards. - expect(reallocate.action.type).toBe(ActionType.REALLOCATE) + expect(reallocate.action.type).toBe(ActionType.reallocate) expect(reallocate.allocates).toStrictEqual(parseGRT('10000')) expect(reallocate.rewards.isZero()).toBeTruthy() expect(reallocate.unallocates).toStrictEqual(parseGRT('10000')) diff --git a/packages/indexer-common/src/indexer-management/__tests__/helpers.test.ts b/packages/indexer-common/src/indexer-management/__tests__/helpers.test.ts index 62c7ca595..bff6ca21f 100644 --- a/packages/indexer-common/src/indexer-management/__tests__/helpers.test.ts +++ b/packages/indexer-common/src/indexer-management/__tests__/helpers.test.ts @@ -10,15 +10,14 @@ import { import { defineIndexerManagementModels, IndexerManagementModels, - IndexingDecisionBasis, IndexingRuleAttributes, } from '../models' import { defineQueryFeeModels, specification as spec } from '../../index' import { networkIsL1, networkIsL2 } from '../types' import { fetchIndexingRules, upsertIndexingRule } from '../rules' -import { SubgraphFreshnessChecker, SubgraphIdentifierType } from '../../subgraphs' +import { SubgraphFreshnessChecker } from '../../subgraphs' import { ActionManager } from '../actions' -import { actionFilterToWhereOptions, ActionStatus, ActionType } from '../../actions' +import { actionFilterToWhereOptions } from '../../actions' import { literal, Op, Sequelize } from 'sequelize' import { Allocation, @@ -35,6 +34,12 @@ import { getTestProvider, } from '@graphprotocol/indexer-common' import { mockLogger, mockProvider } from '../../__tests__/subgraph.test' +import { + ActionStatus, + ActionType, + IdentifierType, + IndexingDecisionBasis, +} from '../../schema/types.generated' import { BigNumber, ethers, utils } from 'ethers' // Make global Jest variable available @@ -163,8 +168,8 @@ describe('Indexing Rules', () => { const indexingRule = { identifier: deployment, allocationAmount: '5000', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - decisionBasis: IndexingDecisionBasis.ALWAYS, + identifierType: IdentifierType.deployment, + decisionBasis: IndexingDecisionBasis.always, protocolNetwork: 'arbitrum-sepolia', } as Partial const setIndexingRuleResult = await upsertIndexingRule(logger, models, indexingRule) @@ -175,11 +180,11 @@ describe('Indexing Rules', () => { expect(setIndexingRuleResult).toHaveProperty('identifier', deployment) expect(setIndexingRuleResult).toHaveProperty( 'identifierType', - SubgraphIdentifierType.DEPLOYMENT.toString(), + IdentifierType.deployment.toString(), ) expect(setIndexingRuleResult).toHaveProperty( 'decisionBasis', - IndexingDecisionBasis.ALWAYS, + IndexingDecisionBasis.always, ) // When reading directly to the database, `protocolNetwork` must be in the CAIP2-ID format. @@ -194,8 +199,8 @@ describe('Actions', () => { test('Generate where options', async () => { const ActionFilter = { - status: ActionStatus.FAILED, - type: ActionType.ALLOCATE, + status: ActionStatus.failed, + type: ActionType.allocate, } expect(actionFilterToWhereOptions(ActionFilter)).toEqual({ [Op.and]: [{ status: 'failed' }, { type: 'allocate' }], @@ -203,8 +208,8 @@ describe('Actions', () => { const yesterday = literal("NOW() - INTERVAL '1d'") const ActionFilter2 = { - status: ActionStatus.FAILED, - type: ActionType.ALLOCATE, + status: ActionStatus.failed, + type: ActionType.allocate, updatedAt: { [Op.gte]: yesterday }, } @@ -226,8 +231,8 @@ describe('Actions', () => { test('Insert and fetch actions', async () => { const action = { - status: ActionStatus.FAILED, - type: ActionType.ALLOCATE, + status: ActionStatus.failed, + type: ActionType.allocate, deploymentID: 'QmQ44hgrWWt3Qf2X9XEX2fPyTbmQbChxwNm5c1t4mhKpGt', amount: '10000', force: false, @@ -241,8 +246,8 @@ describe('Actions', () => { await models.Action.upsert(action) const filterOptions = { - status: ActionStatus.FAILED, - type: ActionType.ALLOCATE, + status: ActionStatus.failed, + type: ActionType.allocate, } const whereOptions = actionFilterToWhereOptions(filterOptions) @@ -251,27 +256,55 @@ describe('Actions', () => { }) await expect( - ActionManager.fetchActions(models, null, filterOptions), + ActionManager.fetchActions( + models, + null, + filterOptions, + undefined, + undefined, + undefined, + ), ).resolves.toHaveLength(1) await expect( - ActionManager.fetchActions(models, null, filterOptions), + ActionManager.fetchActions( + models, + null, + filterOptions, + undefined, + undefined, + undefined, + ), ).resolves.toHaveLength(1) await expect( - ActionManager.fetchActions(models, null, { - status: ActionStatus.FAILED, - type: ActionType.ALLOCATE, - updatedAt: { [Op.gte]: literal("NOW() - INTERVAL '1d'") }, - }), + ActionManager.fetchActions( + models, + null, + { + status: ActionStatus.failed, + type: ActionType.allocate, + updatedAt: { [Op.gte]: literal("NOW() - INTERVAL '1d'") }, + }, + undefined, + undefined, + undefined, + ), ).resolves.toHaveLength(1) await expect( - ActionManager.fetchActions(models, null, { - status: ActionStatus.FAILED, - type: ActionType.ALLOCATE, - updatedAt: { [Op.lte]: literal("NOW() - INTERVAL '1d'") }, - }), + ActionManager.fetchActions( + models, + null, + { + status: ActionStatus.failed, + type: ActionType.allocate, + updatedAt: { [Op.lte]: literal("NOW() - INTERVAL '1d'") }, + }, + undefined, + undefined, + undefined, + ), ).resolves.toHaveLength(0) }) }) diff --git a/packages/indexer-common/src/indexer-management/__tests__/resolvers/actions.test.ts b/packages/indexer-common/src/indexer-management/__tests__/resolvers/actions.test.ts index 1bce61e46..dc4b3705f 100644 --- a/packages/indexer-common/src/indexer-management/__tests__/resolvers/actions.test.ts +++ b/packages/indexer-common/src/indexer-management/__tests__/resolvers/actions.test.ts @@ -10,23 +10,12 @@ import { createMetrics, } from '@graphprotocol/common-ts' -import { IndexerManagementClient } from '../../client' import { Action, defineIndexerManagementModels, IndexerManagementModels, } from '../../models' -import { - ActionInput, - ActionParams, - ActionStatus, - ActionType, - defineQueryFeeModels, - OrderDirection, - QueryFeeModels, -} from '@graphprotocol/indexer-common' -import { CombinedError } from '@urql/core' -import { GraphQLError } from 'graphql' +import { defineQueryFeeModels, QueryFeeModels } from '@graphprotocol/indexer-common' import { createTestManagementClient, invalidReallocateAction, @@ -36,6 +25,10 @@ import { subgraphDeployment2, subgraphDeployment3, } from '../util' +import { buildHTTPExecutor } from '@graphql-tools/executor-http' +import { GraphQLError } from 'graphql' +import { isAsyncIterable } from 'graphql-yoga' +import { ActionStatus, ActionType, ActionInput } from '../../../schema/types.generated' const QUEUE_ACTIONS_MUTATION = gql` mutation queueActions($actions: [ActionInput!]!) { @@ -59,7 +52,7 @@ const QUEUE_ACTIONS_MUTATION = gql` ` const APPROVE_ACTIONS_MUTATION = gql` - mutation approveActions($actionIDs: [Int!]!) { + mutation approveActions($actionIDs: [String!]!) { approveActions(actionIDs: $actionIDs) { id type @@ -80,7 +73,7 @@ const APPROVE_ACTIONS_MUTATION = gql` ` const CANCEL_ACTIONS_MUTATION = gql` - mutation cancelActions($actionIDs: [Int!]!) { + mutation cancelActions($actionIDs: [String!]!) { cancelActions(actionIDs: $actionIDs) { id type @@ -147,7 +140,7 @@ const ACTIONS_QUERY = gql` ` const DELETE_ACTIONS_MUTATION = gql` - mutation deleteActions($actionIDs: [Int!]!) { + mutation deleteActions($actionIDs: [String!]!) { deleteActions(actionIDs: $actionIDs) } ` @@ -178,7 +171,7 @@ let sequelize: Sequelize let managementModels: IndexerManagementModels let queryFeeModels: QueryFeeModels let logger: Logger -let client: IndexerManagementClient +let executor: ReturnType let metrics: Metrics // Make global Jest variables available @@ -199,7 +192,10 @@ const setup = async () => { async: false, level: __LOG_LEVEL__ ?? 'error', }) - client = await createTestManagementClient(__DATABASE__, logger, true, metrics) + const client = await createTestManagementClient(__DATABASE__, logger, true, metrics) + executor = buildHTTPExecutor({ + fetch: client.yoga.fetch, + }) } const setupEach = async () => { @@ -236,15 +232,19 @@ describe('Actions', () => { const expected = await actionInputToExpected(inputAction, 1) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: [inputAction] }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { + actions: [inputAction], + }, + }), ).resolves.toHaveProperty('data.queueActions', [expected]) await expect( - client - .query(ACTIONS_QUERY, { - filter: { status: ActionStatus.QUEUED, source: 'indexerAgent' }, - }) - .toPromise(), + executor({ + document: ACTIONS_QUERY, + variables: { filter: { status: ActionStatus.queued, source: 'indexerAgent' } }, + }), ).resolves.toHaveProperty('data.actions', [expected]) }) @@ -271,20 +271,24 @@ describe('Actions', () => { ) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: inputActions }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: inputActions }, + }), ).resolves.toHaveProperty('data.queueActions', expecteds) await expect( - client - .query(ACTIONS_QUERY, { + executor({ + document: ACTIONS_QUERY, + variables: { filter: { - status: ActionStatus.QUEUED, - type: ActionType.ALLOCATE, + status: ActionStatus.queued, + type: ActionType.allocate, }, - orderBy: ActionParams.SOURCE, - orderDirection: OrderDirection.DESC, - }) - .toPromise(), + orderBy: 'source', + orderDirection: 'desc', + }, + }), ).resolves.toHaveProperty( 'data.actions', expecteds.sort((a, b) => (a.source > b.source ? -1 : 1)), @@ -311,31 +315,37 @@ describe('Actions', () => { ) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: inputActions }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: inputActions }, + }), ).resolves.toHaveProperty('data.queueActions', expecteds) await expect( - client - .query(ACTIONS_QUERY, { + executor({ + document: ACTIONS_QUERY, + variables: { filter: { - status: ActionStatus.QUEUED, - type: ActionType.ALLOCATE, + status: ActionStatus.queued, + type: ActionType.allocate, source: 'indexerAgent', }, orderBy: 'adonut', - orderDirection: OrderDirection.DESC, - }) - .toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - 'Variable "$orderBy" got invalid value "adonut"; Value "adonut" does not exist in "ActionParams" enum. Did you mean the enum value "amount"?', - ), - ], + orderDirection: 'desc', + }, }), - ) + ).resolves.toHaveProperty('errors', [ + { + locations: [ + { + column: 39, + line: 1, + }, + ], + message: + 'Variable "$orderBy" got invalid value "adonut"; Value "adonut" does not exist in "ActionParams" enum. Did you mean the enum value "amount"?', + }, + ]) }) test('Cancel all actions in queue', async () => { @@ -356,32 +366,36 @@ describe('Actions', () => { ) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: inputActions }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: inputActions }, + }), ).resolves.toHaveProperty('data.queueActions', expecteds) // Cancel all actions - const toCancel = expecteds.map((action) => action.id) + const toCancel = expecteds.map((action) => action.id.toString()) const expectedCancels = expecteds.map((action) => { - action.status = ActionStatus.CANCELED + action.status = ActionStatus.canceled return action }) await expect( - client.mutation(CANCEL_ACTIONS_MUTATION, { actionIDs: toCancel }).toPromise(), + executor({ document: CANCEL_ACTIONS_MUTATION, variables: { actionIDs: toCancel } }), ).resolves.toHaveProperty('data.cancelActions', expectedCancels) await expect( - client - .query(ACTIONS_QUERY, { + executor({ + document: ACTIONS_QUERY, + variables: { filter: { - status: ActionStatus.CANCELED, + status: ActionStatus.canceled, source: 'indexerAgent', }, - orderBy: ActionParams.ID, - orderDirection: OrderDirection.ASC, - }) - .toPromise(), + orderBy: 'id', + orderDirection: 'asc', + }, + }), ).resolves.toHaveProperty('data.actions', expectedCancels) }) @@ -403,39 +417,52 @@ describe('Actions', () => { ) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: inputActions }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: inputActions }, + }), ).resolves.toHaveProperty('data.queueActions', expecteds) - const actions = await client - .query(ACTIONS_QUERY, { filter: { type: ActionType.ALLOCATE } }) - .toPromise() + const actions = await executor({ + document: ACTIONS_QUERY, + variables: { + filter: { type: ActionType.allocate }, + }, + }) + + if (isAsyncIterable(actions)) { + throw new Error('Expected actions to be an array') + } + const subgraph1ActionID = actions.data.actions // eslint-disable-next-line @typescript-eslint/no-explicit-any .filter((action: any) => action.deploymentID === subgraphDeployment2) // eslint-disable-next-line @typescript-eslint/no-explicit-any - .map((action: any) => action.id) + .map((action: any) => action.id.toString()) const expectedApprovedAction = expecteds.find( (action) => action.deploymentID === subgraphDeployment2, ) /* eslint-disable @typescript-eslint/no-non-null-assertion */ - expectedApprovedAction!['status'] = ActionStatus.APPROVED + expectedApprovedAction!['status'] = ActionStatus.approved await expect( - client - .mutation(APPROVE_ACTIONS_MUTATION, { actionIDs: subgraph1ActionID }) - .toPromise(), + executor({ + document: APPROVE_ACTIONS_MUTATION, + variables: { actionIDs: subgraph1ActionID }, + }), ).resolves.toHaveProperty('data.approveActions', [expectedApprovedAction]) await expect( - client - .query(ACTIONS_QUERY, { + executor({ + document: ACTIONS_QUERY, + variables: { filter: { - status: ActionStatus.APPROVED, + status: ActionStatus.approved, source: 'indexerAgent', }, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.actions', [expectedApprovedAction]) }) @@ -457,32 +484,39 @@ describe('Actions', () => { ) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: inputActions }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: inputActions }, + }), ).resolves.toHaveProperty('data.queueActions', expecteds) - const actions = await client - .query(ACTIONS_QUERY, { filter: { type: ActionType.ALLOCATE } }) - .toPromise() - const actionIDs = actions.data.actions.map((action: any) => action.id) + const actions = await executor({ + document: ACTIONS_QUERY, + variables: { filter: { type: ActionType.allocate } }, + }) + if (isAsyncIterable(actions)) { + throw new Error('Expected actions to be an array') + } + + const actionIDs = actions.data.actions.map((action: any) => action.id.toString()) await expect( - client.mutation(DELETE_ACTIONS_MUTATION, { actionIDs }).toPromise(), + executor({ document: DELETE_ACTIONS_MUTATION, variables: { actionIDs } }), ).resolves.toHaveProperty('data.deleteActions', 3) }) test('Delete non-existent action in queue', async () => { - const actionIDs = [0] + const actionIDs = ['0'] await expect( - client.mutation(DELETE_ACTIONS_MUTATION, { actionIDs }).toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError('Delete action failed: No action items found with id in [0]'), - ], - }), - ) + executor({ document: DELETE_ACTIONS_MUTATION, variables: { actionIDs } }), + ).resolves.toHaveProperty('errors', [ + { + path: ['deleteActions'], + locations: [{ line: 2, column: 3 }], + message: 'Delete action failed: No action items found with id in [0]', + }, + ]) }) test('Reject empty action input', async () => { @@ -500,36 +534,34 @@ describe('Actions', () => { `Variable "$actions" got invalid value {} at "actions[0]"; Field "${fieldName}" of required type "${fieldType}!" was not provided.`, ), ) - const expected = new CombinedError({ graphQLErrors }) - - await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: [{}] }).toPromise(), - ).resolves.toHaveProperty('error', expected) + const result = await executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: [{}] }, + }) + if (isAsyncIterable(result)) { + throw new Error('Expected result to be an async iterable') + } + expect(result).toHaveProperty('errors') + expect(result.errors).toHaveLength(graphQLErrors.length) }) test('Reject action with invalid params for action type', async () => { const inputAction = invalidReallocateAction - const expected = { ...inputAction, protocolNetwork: 'eip155:421614' } - const fields = JSON.stringify(expected) + await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: [inputAction] }).toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - `Failed to queue action: Invalid action input, actionInput: ${fields}`, - ), - ], + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: [inputAction] }, }), - ) + ).resolves.toHaveProperty('errors') await expect( - client - .query(ACTIONS_QUERY, { - filter: { status: ActionStatus.QUEUED, source: 'indexerAgent' }, - }) - .toPromise(), + executor({ + document: ACTIONS_QUERY, + variables: { + filter: { status: ActionStatus.queued, source: 'indexerAgent' }, + }, + }), ).resolves.toHaveProperty('data.actions', []) }) @@ -538,15 +570,19 @@ describe('Actions', () => { const expected = await actionInputToExpected(inputAction, 1) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: [inputAction] }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: [inputAction] }, + }), ).resolves.toHaveProperty('data.queueActions', [expected]) await expect( - client - .query(ACTIONS_QUERY, { - filter: { status: ActionStatus.QUEUED, source: 'indexerAgent' }, - }) - .toPromise(), + executor({ + document: ACTIONS_QUERY, + variables: { + filter: { status: ActionStatus.queued, source: 'indexerAgent' }, + }, + }), ).resolves.toHaveProperty( 'data.actions', [expected].sort((a, b) => (a.id > b.id ? -1 : 1)), @@ -556,20 +592,11 @@ describe('Actions', () => { differentSourceSameTarget.source = 'different' await expect( - client - .mutation(QUEUE_ACTIONS_MUTATION, { actions: [differentSourceSameTarget] }) - .toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - `Duplicate action found in queue that effects 'Qmew9PZUJCoDzXqqU6vGyTENTKHrrN4dy5h94kertfudqy' but NOT overwritten because it has a different source and/or status. If you ` + - `would like to replace the item currently in the queue please cancel it and then queue the proposed action`, - ), - ], + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: [differentSourceSameTarget] }, }), - ) + ).resolves.toHaveProperty('errors') }) test('Update duplicate approved action (effects deployment already targeted by approved action)', async () => { @@ -577,56 +604,71 @@ describe('Actions', () => { const expected = await actionInputToExpected(inputAction, 1) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: [inputAction] }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: [inputAction] }, + }), ).resolves.toHaveProperty('data.queueActions', [expected]) - const actions = await client - .query(ACTIONS_QUERY, { filter: { type: ActionType.ALLOCATE } }) - .toPromise() + const actions = await executor({ + document: ACTIONS_QUERY, + variables: { filter: { type: ActionType.allocate } }, + }) + + if (isAsyncIterable(actions)) { + throw new Error('Expected actions to be an array') + } + const subgraph1ActionID = actions.data.actions // eslint-disable-next-line @typescript-eslint/no-explicit-any .filter((action: any) => action.deploymentID === queuedAllocateAction.deploymentID) // eslint-disable-next-line @typescript-eslint/no-explicit-any - .map((action: any) => action.id) + .map((action: any) => action.id.toString()) const expectedApprovedAction = { ...expected } /* eslint-disable @typescript-eslint/no-non-null-assertion */ - expectedApprovedAction!['status'] = ActionStatus.APPROVED + expectedApprovedAction!['status'] = ActionStatus.approved await expect( - client - .mutation(APPROVE_ACTIONS_MUTATION, { actionIDs: subgraph1ActionID }) - .toPromise(), + executor({ + document: APPROVE_ACTIONS_MUTATION, + variables: { actionIDs: subgraph1ActionID }, + }), ).resolves.toHaveProperty('data.approveActions', [expectedApprovedAction]) await expect( - client - .query(ACTIONS_QUERY, { + executor({ + document: ACTIONS_QUERY, + variables: { filter: { - status: ActionStatus.APPROVED, + status: ActionStatus.approved, source: 'indexerAgent', }, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.actions', [expectedApprovedAction]) const updateAction = { ...inputAction } updateAction.amount = '25000' - updateAction.status = ActionStatus.APPROVED + updateAction.status = ActionStatus.approved const expectedUpdated = { ...expectedApprovedAction } expectedUpdated.amount = '25000' await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: [updateAction] }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: [updateAction] }, + }), ).resolves.toHaveProperty('data.queueActions', [expectedUpdated]) await expect( - client - .query(ACTIONS_QUERY, { - filter: { status: ActionStatus.APPROVED, source: 'indexerAgent' }, - }) - .toPromise(), + executor({ + document: ACTIONS_QUERY, + variables: { + filter: { status: ActionStatus.approved, source: 'indexerAgent' }, + }, + }), ).resolves.toHaveProperty('data.actions', [expectedUpdated]) }) @@ -639,17 +681,17 @@ describe('Actions', () => { const inputActions = [{ ...invalidUnallocateAction, allocationID: closedAllocation }] await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: inputActions }).toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - `An active allocation does not exist with id = '${closedAllocation}'`, - ), - ], + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: inputActions }, }), - ) + ).resolves.toHaveProperty('errors', [ + { + path: ['queueActions'], + locations: [{ line: 2, column: 3 }], + message: `An active allocation does not exist with id = '${closedAllocation}'`, + }, + ]) }) test('Reject approve request with nonexistent actionID ', async () => { @@ -670,38 +712,42 @@ describe('Actions', () => { ) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: inputActions }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: inputActions }, + }), ).resolves.toHaveProperty('data.queueActions', expecteds) await expect( - client.mutation(APPROVE_ACTIONS_MUTATION, { actionIDs: [100, 200] }).toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - `Approve action failed: No action items found with id in [100,200]`, - ), - ], + executor({ + document: APPROVE_ACTIONS_MUTATION, + variables: { actionIDs: ['100', '200'] }, }), - ) + ).resolves.toHaveProperty('errors', [ + { + path: ['approveActions'], + locations: [{ line: 2, column: 3 }], + message: 'Approve action failed: No action items found with id in [100,200]', + }, + ]) await expect( - client - .query(ACTIONS_QUERY, { + executor({ + document: ACTIONS_QUERY, + variables: { filter: { - status: ActionStatus.APPROVED, + status: ActionStatus.approved, source: 'indexerAgent', }, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.actions', []) }) test('Reject queueing for action that has recently failed', async () => { const failedAction = { - status: ActionStatus.FAILED, - type: ActionType.ALLOCATE, + status: ActionStatus.failed, + type: ActionType.allocate, deploymentID: subgraphDeployment1, amount: '10000', force: false, @@ -710,44 +756,43 @@ describe('Actions', () => { priority: 0, // When writing directly to the database, `protocolNetwork` must be in the CAIP2-ID format. protocolNetwork: 'eip155:421614', - } as ActionInput + } satisfies ActionInput const proposedAction = { - status: ActionStatus.QUEUED, - type: ActionType.ALLOCATE, + status: ActionStatus.queued, + type: ActionType.allocate, deploymentID: subgraphDeployment1, amount: '10000', source: 'indexerAgent', reason: 'indexingRule', priority: 0, protocolNetwork: 'arbitrum-sepolia', - } as ActionInput + } satisfies ActionInput await managementModels.Action.create(failedAction, { validate: true, returning: true, }) - const result = await client - .mutation(QUEUE_ACTIONS_MUTATION, { actions: [proposedAction] }) - .toPromise() - - expect(result).toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - `Recently executed 'allocate' action found in queue targeting '${subgraphDeployment1}', ignoring.`, - ), - ], + await expect( + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: [proposedAction] }, }), - ) + ).resolves.toHaveProperty('errors', [ + { + path: ['queueActions'], + locations: [{ line: 2, column: 3 }], + message: `Recently executed 'allocate' action found in queue targeting '${subgraphDeployment1}', ignoring.`, + }, + ]) await expect( - client - .query(ACTIONS_QUERY, { + executor({ + document: ACTIONS_QUERY, + variables: { filter: { source: 'indexerAgent' }, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.actions', [ await actionInputToExpected(failedAction, 1), ]) @@ -755,8 +800,8 @@ describe('Actions', () => { test('Reject queueing for action that has recently succeeded', async () => { const successfulAction = { - status: ActionStatus.SUCCESS, - type: ActionType.ALLOCATE, + status: ActionStatus.success, + type: ActionType.allocate, deploymentID: subgraphDeployment1, amount: '10000', force: false, @@ -765,18 +810,18 @@ describe('Actions', () => { priority: 0, // When writing directly to the database, `protocolNetwork` must be in the CAIP2-ID format. protocolNetwork: 'eip155:421614', - } as ActionInput + } satisfies ActionInput const proposedAction = { - status: ActionStatus.QUEUED, - type: ActionType.ALLOCATE, + status: ActionStatus.queued, + type: ActionType.allocate, deploymentID: subgraphDeployment1, amount: '10000', source: 'indexerAgent', reason: 'indexingRule', priority: 0, protocolNetwork: 'arbitrum-sepolia', - } as ActionInput + } satisfies ActionInput await managementModels.Action.create(successfulAction, { validate: true, @@ -784,23 +829,22 @@ describe('Actions', () => { }) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: [proposedAction] }).toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - `Recently executed 'allocate' action found in queue targeting '${subgraphDeployment1}', ignoring.`, - ), - ], + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: [proposedAction] }, }), - ) + ).resolves.toHaveProperty('errors', [ + { + path: ['queueActions'], + locations: [{ line: 2, column: 3 }], + message: `Recently executed 'allocate' action found in queue targeting '${subgraphDeployment1}', ignoring.`, + }, + ]) await expect( - client - .query(ACTIONS_QUERY, { - filter: { source: 'indexerAgent' }, - }) - .toPromise(), + executor({ + document: ACTIONS_QUERY, + variables: { filter: { source: 'indexerAgent' } }, + }), ).resolves.toHaveProperty('data.actions', [ await actionInputToExpected(successfulAction, 1), ]) @@ -808,8 +852,8 @@ describe('Actions', () => { test('Update all queued unallocate actions', async () => { const queuedUnallocateAction = { - status: ActionStatus.QUEUED, - type: ActionType.UNALLOCATE, + status: ActionStatus.queued, + type: ActionType.unallocate, deploymentID: subgraphDeployment1, amount: '10000', force: false, @@ -818,11 +862,11 @@ describe('Actions', () => { priority: 0, // When writing directly to the database, `protocolNetwork` must be in the CAIP2-ID format. protocolNetwork: 'eip155:421614', - } as ActionInput + } satisfies ActionInput const queuedAllocateAction = { - status: ActionStatus.QUEUED, - type: ActionType.ALLOCATE, + status: ActionStatus.queued, + type: ActionType.allocate, deploymentID: subgraphDeployment1, force: false, amount: '10000', @@ -830,7 +874,7 @@ describe('Actions', () => { reason: 'indexingRule', priority: 0, protocolNetwork: 'arbitrum-sepolia', - } as ActionInput + } satisfies ActionInput await managementModels.Action.create(queuedUnallocateAction, { validate: true, @@ -851,7 +895,10 @@ describe('Actions', () => { ).sort((a, b) => a.id - b.id) await expect( - client.mutation(QUEUE_ACTIONS_MUTATION, { actions: inputActions }).toPromise(), + executor({ + document: QUEUE_ACTIONS_MUTATION, + variables: { actions: inputActions }, + }), ).resolves.toHaveProperty('data.queueActions', expecteds) const updatedExpecteds = expecteds.map((value) => { @@ -860,14 +907,15 @@ describe('Actions', () => { }) await expect( - client - .mutation(UPDATE_ACTIONS_MUTATION, { + executor({ + document: UPDATE_ACTIONS_MUTATION, + variables: { filter: { type: 'allocate' }, action: { force: true, }, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.updateActions', updatedExpecteds) }) }) diff --git a/packages/indexer-common/src/indexer-management/__tests__/resolvers/cost-models.test.ts b/packages/indexer-common/src/indexer-management/__tests__/resolvers/cost-models.test.ts index 06013d733..067b62468 100644 --- a/packages/indexer-common/src/indexer-management/__tests__/resolvers/cost-models.test.ts +++ b/packages/indexer-common/src/indexer-management/__tests__/resolvers/cost-models.test.ts @@ -6,12 +6,10 @@ import { connectDatabase, createMetrics, } from '@graphprotocol/common-ts' -import { IndexerManagementClient } from '../../client' import { defineIndexerManagementModels, IndexerManagementModels } from '../../models' -import { CombinedError } from '@urql/core' -import { GraphQLError } from 'graphql' import { createTestManagementClient } from '../util' import { defineQueryFeeModels } from '../../../query-fees/models' +import { buildHTTPExecutor } from '@graphql-tools/executor-http' // Make global Jest variable available // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -30,11 +28,7 @@ const SET_COST_MODEL_MUTATION = gql` const DELETE_COST_MODELS_MUTATION = gql` mutation deleteCostModels($deployments: [String!]!) { - deleteCostModels(deployments: $deployments) { - deployment - model - variables - } + deleteCostModels(deployments: $deployments) } ` @@ -71,8 +65,9 @@ const GET_COST_MODELS_DEPLOYMENTS_QUERY = gql` let sequelize: Sequelize let models: IndexerManagementModels let logger: Logger -let client: IndexerManagementClient +let executor: ReturnType const metrics = createMetrics() +let setDai: (dai: string) => Promise const setupAll = async () => { logger = createLogger({ @@ -92,13 +87,18 @@ const setupAll = async () => { level: __LOG_LEVEL__ ?? 'error', }) - client = await createTestManagementClient( + const client = await createTestManagementClient( __DATABASE__, logger, true, metrics, 'eip155:1', // Override with mainnet to enable the Cost Model feature ) + + setDai = client.setDai + executor = buildHTTPExecutor({ + fetch: client.yoga.fetch, + }) } const teardownAll = async () => { @@ -133,11 +133,10 @@ describe('Cost models', () => { const expected = { ...input } await expect( - client - .mutation(SET_COST_MODEL_MUTATION, { - costModel: input, - }) - .toPromise(), + executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }), ).resolves.toHaveProperty('data.setCostModel', expected) }) @@ -154,11 +153,12 @@ describe('Cost models', () => { } await expect( - client - .mutation(SET_COST_MODEL_MUTATION, { + executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.setCostModel', expected) }) @@ -175,11 +175,12 @@ describe('Cost models', () => { } await expect( - client - .mutation(SET_COST_MODEL_MUTATION, { + executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.setCostModel', expected) }) @@ -193,49 +194,50 @@ describe('Cost models', () => { const expected = { ...input } await expect( - client - .mutation(SET_COST_MODEL_MUTATION, { - costModel: input, - }) - .toPromise(), + executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }), ).resolves.toHaveProperty('data.setCostModel', expected) //Double check await expect( - client - .query(GET_COST_MODEL_QUERY, { + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment: 'global', - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.costModel', expected) //Check non-existent const expectFallback = expected expectFallback.deployment = 'blah' await expect( - client - .query(GET_COST_MODEL_QUERY, { + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment: 'blah', - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.costModel', expected) //Delete global cost model await expect( - client - .mutation(DELETE_COST_MODELS_MUTATION, { + executor({ + document: DELETE_COST_MODELS_MUTATION, + variables: { deployments: [input.deployment], - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.deleteCostModels', 1) //Check non-existent without global cost model await expect( - client - .query(GET_COST_MODEL_QUERY, { - deployment: 'blah', - }) - .toPromise(), + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment: 'blah' }, + }), ).resolves.toHaveProperty('data.costModel', null) }) @@ -291,23 +293,25 @@ describe('Cost models', () => { for (const update of updates) { await expect( - client - .mutation(SET_COST_MODEL_MUTATION, { + executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: update.input, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.setCostModel', update.expected) } }) test('Get non-existent model', async () => { await expect( - client - .query(GET_COST_MODEL_QUERY, { + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment: '0x0000000000000000000000000000000000000000000000000000000000000000', - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.costModel', null) }) @@ -315,11 +319,10 @@ describe('Cost models', () => { const deployment = 'QmTBxvMF6YnbT1eYeRx9XQpH4WvxTV53vdptCCZFiZSprg' // Model doesn't exist when global is not set await expect( - client - .query(GET_COST_MODEL_QUERY, { - deployment, - }) - .toPromise(), + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment }, + }), ).resolves.toHaveProperty('data.costModel', null) // Set global model @@ -333,22 +336,24 @@ describe('Cost models', () => { // Global model set await expect( - client - .mutation(SET_COST_MODEL_MUTATION, { + executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.setCostModel', expected) // Global fallback to non-existent model const expectFallback = expected expectFallback.deployment = deployment await expect( - client - .query(GET_COST_MODEL_QUERY, { + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.costModel', expectFallback) }) @@ -367,12 +372,18 @@ describe('Cost models', () => { ] for (const input of inputs) { - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }) } for (const input of inputs) { await expect( - client.query(GET_COST_MODEL_QUERY, { deployment: input.deployment }).toPromise(), + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment: input.deployment }, + }), ).resolves.toHaveProperty('data.costModel', input) } }) @@ -392,10 +403,13 @@ describe('Cost models', () => { ] for (const input of inputs) { - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }) } - await expect(client.query(GET_COST_MODELS_QUERY).toPromise()).resolves.toHaveProperty( + await expect(executor({ document: GET_COST_MODELS_QUERY })).resolves.toHaveProperty( 'data.costModels', inputs, ) @@ -418,16 +432,20 @@ describe('Cost models', () => { '0x2222222222222222222222222222222222222222222222222222222222222222' for (const input of inputs) { - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }) } // only defined cost models are returned await expect( - client - .query(GET_COST_MODELS_DEPLOYMENTS_QUERY, { + executor({ + document: GET_COST_MODELS_DEPLOYMENTS_QUERY, + variables: { deployments: inputs.map((model) => model.deployment).concat([nonexisting]), - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.costModels', inputs) // Set global model @@ -438,21 +456,23 @@ describe('Cost models', () => { } const expected = { ...global_input } await expect( - client - .mutation(SET_COST_MODEL_MUTATION, { + executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: global_input, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.setCostModel', expected) // Global fallback global_input.deployment = nonexisting await expect( - client - .query(GET_COST_MODELS_DEPLOYMENTS_QUERY, { + executor({ + document: GET_COST_MODELS_DEPLOYMENTS_QUERY, + variables: { deployments: inputs.map((model) => model.deployment).concat([nonexisting]), - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.costModels', inputs.concat([global_input])) }) @@ -463,7 +483,7 @@ describe('Cost models', () => { variables: JSON.stringify({ n: 100 }), } - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ document: SET_COST_MODEL_MUTATION, variables: { costModel: input } }) input = { deployment: '0x0000000000000000000000000000000000000000000000000000000000000000', @@ -476,9 +496,9 @@ describe('Cost models', () => { variables: JSON.stringify({}), } - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ document: SET_COST_MODEL_MUTATION, variables: { costModel: input } }) - await expect(client.query(GET_COST_MODELS_QUERY).toPromise()).resolves.toHaveProperty( + await expect(executor({ document: GET_COST_MODELS_QUERY })).resolves.toHaveProperty( 'data.costModels', [expected], ) @@ -499,20 +519,27 @@ describe('Cost models', () => { ] for (const input of inputs) { - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }) } for (const input of inputs) { await expect( - client.query(GET_COST_MODEL_QUERY, { deployment: input.deployment }).toPromise(), + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment: input.deployment }, + }), ).resolves.toHaveProperty('data.costModel', input) } for (const input of inputs) { await expect( - client - .mutation(DELETE_COST_MODELS_MUTATION, { deployments: [input.deployment] }) - .toPromise(), + executor({ + document: DELETE_COST_MODELS_MUTATION, + variables: { deployments: [input.deployment] }, + }), ).resolves.toHaveProperty('data.deleteCostModels', 1) } }) @@ -532,21 +559,28 @@ describe('Cost models', () => { ] for (const input of inputs) { - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }) } for (const input of inputs) { await expect( - client.query(GET_COST_MODEL_QUERY, { deployment: input.deployment }).toPromise(), + executor({ + document: GET_COST_MODEL_QUERY, + variables: { deployment: input.deployment }, + }), ).resolves.toHaveProperty('data.costModel', input) } await expect( - client - .mutation(DELETE_COST_MODELS_MUTATION, { + executor({ + document: DELETE_COST_MODELS_MUTATION, + variables: { deployments: inputs.map((d) => d.deployment), - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.deleteCostModels', 2) }) @@ -565,15 +599,19 @@ describe('Cost models', () => { ] for (const input of inputs) { - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }) } await expect( - client - .mutation(DELETE_COST_MODELS_MUTATION, { + executor({ + document: DELETE_COST_MODELS_MUTATION, + variables: { deployments: inputs.map((d) => d.deployment), - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.deleteCostModels', 2) }) }) @@ -588,16 +626,22 @@ describe('Feature: Inject $DAI variable', () => { model: 'query { votes } => 10 * $n;', variables: JSON.stringify({ DAI: '10.0' }), } - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: initial }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: initial }, + }) const update = { deployment: '0x0000000000000000000000000000000000000000000000000000000000000000', model: null, variables: JSON.stringify({}), } - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: update }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: update }, + }) - await expect(client.query(GET_COST_MODELS_QUERY).toPromise()).resolves.toHaveProperty( + await expect(executor({ document: GET_COST_MODELS_QUERY })).resolves.toHaveProperty( 'data.costModels', [initial], ) @@ -609,17 +653,24 @@ describe('Feature: Inject $DAI variable', () => { model: 'query { votes } => 10 * $n;', variables: JSON.stringify({ DAI: '10.0' }), } - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: initial }).toPromise() + await executor({ + variables: { costModel: initial }, + document: SET_COST_MODEL_MUTATION, + }) const update = { deployment: '0x0000000000000000000000000000000000000000000000000000000000000000', model: initial.model, variables: JSON.stringify({ DAI: '15.0' }), } - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: update }).toPromise() - await expect(client.query(GET_COST_MODELS_QUERY).toPromise()).resolves.toHaveProperty( - 'data.costModels', - [update], - ) + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: update }, + }) + await expect( + executor({ + document: GET_COST_MODELS_QUERY, + }), + ).resolves.toHaveProperty('data.costModels', [update]) }) test('$DAI updates are applied to all cost models', async () => { @@ -637,12 +688,15 @@ describe('Feature: Inject $DAI variable', () => { ] for (const input of inputs) { - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ + variables: { costModel: input }, + document: SET_COST_MODEL_MUTATION, + }) } - await client.setDai('15.3') + await setDai('15.3') - await expect(client.query(GET_COST_MODELS_QUERY).toPromise()).resolves.toHaveProperty( + await expect(executor({ document: GET_COST_MODELS_QUERY })).resolves.toHaveProperty( 'data.costModels', [ { @@ -674,28 +728,32 @@ describe('Feature: Inject $DAI variable', () => { ] // This time, set the DAI value first - await client.setDai('15.3') + await setDai('15.3') // THEN add new cost models for (const input of inputs) { - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: input }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: input }, + }) } - await expect(client.query(GET_COST_MODELS_QUERY).toPromise()).resolves.toHaveProperty( - 'data.costModels', - [ - { - ...inputs[0], - // DAI was replaced here - variables: JSON.stringify({ n: 100, DAI: '15.3' }), - }, - { - ...inputs[1], - // DAI was added here - variables: JSON.stringify({ n: 10, DAI: '15.3' }), - }, - ], - ) + await expect( + executor({ + document: GET_COST_MODELS_QUERY, + }), + ).resolves.toHaveProperty('data.costModels', [ + { + ...inputs[0], + // DAI was replaced here + variables: JSON.stringify({ n: 100, DAI: '15.3' }), + }, + { + ...inputs[1], + // DAI was added here + variables: JSON.stringify({ n: 10, DAI: '15.3' }), + }, + ]) }) test('$DAI is preserved when cost model is updated', async () => { @@ -705,14 +763,20 @@ describe('Feature: Inject $DAI variable', () => { variables: JSON.stringify({ n: 5, DAI: '10.0' }), } - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: initial }).toPromise() + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: initial }, + }) const update = { deployment: '0x0000000000000000000000000000000000000000000000000000000000000000', model: 'default => 1;', variables: null, } - await client.mutation(SET_COST_MODEL_MUTATION, { costModel: update }).toPromise() - await expect(client.query(GET_COST_MODELS_QUERY).toPromise()).resolves.toHaveProperty( + await executor({ + document: SET_COST_MODEL_MUTATION, + variables: { costModel: update }, + }) + await expect(executor({ document: GET_COST_MODELS_QUERY })).resolves.toHaveProperty( 'data.costModels', [ { @@ -737,19 +801,24 @@ describe('Feature: Inject $DAI variable', () => { model: 'query { votes } => 10 * $n;', variables: JSON.stringify({ n: 5, DAI: '10.0' }), } - await clientNoInjectDai - .mutation(SET_COST_MODEL_MUTATION, { costModel: initial }) - .toPromise() + + await buildHTTPExecutor({ + fetch: clientNoInjectDai.yoga.fetch, + })({ document: SET_COST_MODEL_MUTATION, variables: { costModel: initial } }) + const update = { deployment: '0x0000000000000000000000000000000000000000000000000000000000000000', model: initial.model, variables: JSON.stringify({}), } - await clientNoInjectDai - .mutation(SET_COST_MODEL_MUTATION, { costModel: update }) - .toPromise() + + await buildHTTPExecutor({ + fetch: clientNoInjectDai.yoga.fetch, + })({ document: SET_COST_MODEL_MUTATION, variables: { costModel: update } }) await expect( - clientNoInjectDai.query(GET_COST_MODELS_QUERY).toPromise(), + buildHTTPExecutor({ + fetch: clientNoInjectDai.yoga.fetch, + })({ document: GET_COST_MODELS_QUERY }), ).resolves.toHaveProperty('data.costModels', [update]) }) }) @@ -763,17 +832,14 @@ describe('Cost model validation', () => { } await expect( - client.mutation(SET_COST_MODEL_MUTATION, { costModel }).toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - 'Invalid cost model or variables: Failed to compile cost model', - ), - ], - }), - ) + executor({ document: SET_COST_MODEL_MUTATION, variables: { costModel } }), + ).resolves.toHaveProperty('errors', [ + { + path: ['setCostModel'], + locations: [{ line: 2, column: 3 }], + message: 'Invalid cost model or variables: Failed to compile cost model', + }, + ]) }) test('Invalid cost model variables are rejected', async () => { @@ -784,16 +850,13 @@ describe('Cost model validation', () => { } await expect( - client.mutation(SET_COST_MODEL_MUTATION, { costModel }).toPromise(), - ).resolves.toHaveProperty( - 'error', - new CombinedError({ - graphQLErrors: [ - new GraphQLError( - 'Invalid cost model or variables: Failed to compile cost model', - ), - ], - }), - ) + executor({ document: SET_COST_MODEL_MUTATION, variables: { costModel } }), + ).resolves.toHaveProperty('errors', [ + { + path: ['setCostModel'], + locations: [{ line: 2, column: 3 }], + message: 'Invalid cost model or variables: Failed to compile cost model', + }, + ]) }) }) diff --git a/packages/indexer-common/src/indexer-management/__tests__/resolvers/indexing-rules.test.ts b/packages/indexer-common/src/indexer-management/__tests__/resolvers/indexing-rules.test.ts index bf92003b7..e4701d318 100644 --- a/packages/indexer-common/src/indexer-management/__tests__/resolvers/indexing-rules.test.ts +++ b/packages/indexer-common/src/indexer-management/__tests__/resolvers/indexing-rules.test.ts @@ -6,19 +6,17 @@ import { Logger, createMetrics, } from '@graphprotocol/common-ts' -import { IndexerManagementClient } from '../../client' +import { buildHTTPExecutor } from '@graphql-tools/executor-http' import { defineIndexerManagementModels, IndexerManagementModels, - IndexingDecisionBasis, INDEXING_RULE_GLOBAL, } from '../../models' -import { - SubgraphIdentifierType, - defineQueryFeeModels, -} from '@graphprotocol/indexer-common' +import { defineQueryFeeModels } from '@graphprotocol/indexer-common' import { createTestManagementClient, defaults } from '../util' +import { isAsyncIterable } from 'graphql-yoga' +import { IdentifierType, IndexingDecisionBasis } from '../../../schema/types.generated' // Make global Jest variable available // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -110,7 +108,7 @@ const INDEXING_RULES_QUERY = gql` let sequelize: Sequelize let models: IndexerManagementModels let logger: Logger -let client: IndexerManagementClient +let executor: ReturnType const metrics = createMetrics() const setupAll = async () => { @@ -124,7 +122,10 @@ const setupAll = async () => { async: false, level: __LOG_LEVEL__ ?? 'error', }) - client = await createTestManagementClient(__DATABASE__, logger, true, metrics) + const client = await createTestManagementClient(__DATABASE__, logger, true, metrics) + executor = buildHTTPExecutor({ + fetch: client.yoga.fetch, + }) } const teardownAll = async () => { @@ -152,8 +153,8 @@ describe('Indexing rules', () => { test('Set and get global rule (partial)', async () => { const input = { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, - allocationAmount: '1000', + identifierType: IdentifierType.group, + allocationAmount: 1000, protocolNetwork: 'arbitrum-sepolia', } @@ -168,7 +169,7 @@ describe('Indexing rules', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: IndexingDecisionBasis.rules, requireSupported: true, safety: true, protocolNetwork: 'eip155:421614', @@ -176,7 +177,7 @@ describe('Indexing rules', () => { // Update the rule and ensure the right data is returned await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: input }).toPromise(), + executor({ variables: { rule: input }, document: SET_INDEXING_RULE_MUTATION }), ).resolves.toHaveProperty('data.setIndexingRule', expected) // Query the rule to make sure it's updated in the db @@ -185,27 +186,29 @@ describe('Indexing rules', () => { protocolNetwork: 'arbitrum-sepolia', } - const result = await client - .query(INDEXING_RULE_QUERY, { identifier: ruleIdentifier, merged: false }) - .toPromise() - expect(result).toHaveProperty('data.indexingRule', expected) + await expect( + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: ruleIdentifier, merged: false }, + }), + ).resolves.toHaveProperty('data.indexingRule', expected) }) test('Set and get global rule (complete)', async () => { const input = { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, - allocationAmount: '1', + identifierType: IdentifierType.group, + allocationAmount: 1, allocationLifetime: 10, autoRenewal: true, parallelAllocations: 1, maxAllocationPercentage: 0.5, - minSignal: '2', - maxSignal: '3', - minStake: '4', - minAverageQueryFees: '5', + minSignal: 2, + maxSignal: 3, + minStake: 4, + minAverageQueryFees: 5, custom: JSON.stringify({ foo: 'bar' }), - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: IndexingDecisionBasis.rules, requireSupported: true, safety: true, protocolNetwork: 'arbitrum-sepolia', @@ -218,7 +221,7 @@ describe('Indexing rules', () => { // Update the rule await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: input }).toPromise(), + executor({ document: SET_INDEXING_RULE_MUTATION, variables: { rule: input } }), ).resolves.toHaveProperty('data.setIndexingRule', expected) // Query the rule to make sure it's updated in the db @@ -226,19 +229,21 @@ describe('Indexing rules', () => { identifier: INDEXING_RULE_GLOBAL, protocolNetwork: 'arbitrum-sepolia', } + await expect( - client - .query(INDEXING_RULE_QUERY, { identifier: ruleIdentifier, merged: false }) - .toPromise(), + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: ruleIdentifier, merged: false }, + }), ).resolves.toHaveProperty('data.indexingRule', expected) }) test('Set and get global rule (partial update)', async () => { const originalInput = { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, - allocationAmount: '1', - minSignal: '2', + identifierType: IdentifierType.group, + allocationAmount: 1, + minSignal: 2, protocolNetwork: 'arbitrum-sepolia', } @@ -252,7 +257,7 @@ describe('Indexing rules', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: IndexingDecisionBasis.rules, requireSupported: true, safety: true, protocolNetwork: 'eip155:421614', @@ -260,15 +265,18 @@ describe('Indexing rules', () => { // Write the original await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: originalInput }).toPromise(), + executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: originalInput }, + }), ).resolves.toHaveProperty('data.setIndexingRule', original) const update = { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, + identifierType: IdentifierType.group, allocationAmount: null, - maxSignal: '3', - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + maxSignal: 3, + decisionBasis: IndexingDecisionBasis.offchain, autoRenewal: true, safety: false, protocolNetwork: 'arbitrum-sepolia', @@ -282,7 +290,7 @@ describe('Indexing rules', () => { // Update the rule await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: update }).toPromise(), + executor({ document: SET_INDEXING_RULE_MUTATION, variables: { rule: update } }), ).resolves.toHaveProperty('data.setIndexingRule', expected) // Query the rule to make sure it's updated in the db @@ -291,9 +299,10 @@ describe('Indexing rules', () => { protocolNetwork: 'arbitrum-sepolia', } await expect( - client - .query(INDEXING_RULE_QUERY, { identifier: ruleIdentifier, merged: false }) - .toPromise(), + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: ruleIdentifier, merged: false }, + }), ).resolves.toHaveProperty('data.indexingRule', expected) }) @@ -301,10 +310,10 @@ describe('Indexing rules', () => { const originalIdentifier = 'QmZSJPm74tvhgr8uzhqvyQm2J6YSbUEj4nF6j8WxxUQLsC' const originalInput = { identifier: originalIdentifier, - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '1', - minSignal: '2', - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + identifierType: IdentifierType.deployment, + allocationAmount: 1, + minSignal: 2, + decisionBasis: IndexingDecisionBasis.offchain, protocolNetwork: 'arbitrum-sepolia', } @@ -318,7 +327,7 @@ describe('Indexing rules', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + decisionBasis: IndexingDecisionBasis.offchain, requireSupported: true, safety: true, protocolNetwork: 'eip155:421614', @@ -326,15 +335,18 @@ describe('Indexing rules', () => { // Write the original await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: originalInput }).toPromise(), + executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: originalInput }, + }), ).resolves.toHaveProperty('data.setIndexingRule', original) const update = { identifier: originalIdentifier, - identifierType: SubgraphIdentifierType.DEPLOYMENT, + identifierType: IdentifierType.deployment, allocationAmount: null, - maxSignal: '3', - decisionBasis: IndexingDecisionBasis.ALWAYS, + maxSignal: 3, + decisionBasis: IndexingDecisionBasis.always, allocationLifetime: 2, autoRenewal: false, requireSupported: false, @@ -350,7 +362,7 @@ describe('Indexing rules', () => { // Update the rule await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: update }).toPromise(), + executor({ document: SET_INDEXING_RULE_MUTATION, variables: { rule: update } }), ).resolves.toHaveProperty('data.setIndexingRule', expected) // Query the rule to make sure it's updated in the db @@ -359,19 +371,20 @@ describe('Indexing rules', () => { protocolNetwork: update.protocolNetwork, } await expect( - client - .query(INDEXING_RULE_QUERY, { + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: ruleIdentifier, merged: false, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.indexingRule', expected) const updateAgain = { identifier: '0xa4e311bfa7edabed7b31d93e0b3e751659669852ef46adbedd44dc2454db4bf3', - identifierType: SubgraphIdentifierType.DEPLOYMENT, + identifierType: IdentifierType.deployment, allocationLifetime: null, - decisionBasis: IndexingDecisionBasis.NEVER, + decisionBasis: IndexingDecisionBasis.never, autoRenewal: true, protocolNetwork: 'arbitrum-sepolia', } @@ -386,7 +399,10 @@ describe('Indexing rules', () => { // Update the rule await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: updateAgain }).toPromise(), + executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: updateAgain }, + }), ).resolves.toHaveProperty('data.setIndexingRule', expectedAgain) // Query the rule to make sure it's updated in the db @@ -395,31 +411,32 @@ describe('Indexing rules', () => { protocolNetwork: updateAgain.protocolNetwork, } await expect( - client - .query(INDEXING_RULE_QUERY, { + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: ruleIdentifierAgain, merged: false, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.indexingRule', expectedAgain) }) test('Set and get global and deployment rule', async () => { const globalInput = { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, - allocationAmount: '1', - minSignal: '1', - decisionBasis: IndexingDecisionBasis.NEVER, + identifierType: IdentifierType.group, + allocationAmount: 1, + minSignal: 1, + decisionBasis: IndexingDecisionBasis.never, protocolNetwork: 'arbitrum-sepolia', } const deploymentInput = { identifier: '0xa4e311bfa7edabed7b31d93e0b3e751659669852ef46adbedd44dc2454db4bf3', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '1', - minSignal: '2', - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + identifierType: IdentifierType.deployment, + allocationAmount: 1, + minSignal: 2, + decisionBasis: IndexingDecisionBasis.offchain, requireSupported: false, autoRenewal: false, safety: true, @@ -436,7 +453,7 @@ describe('Indexing rules', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.NEVER, + decisionBasis: IndexingDecisionBasis.never, requireSupported: true, safety: true, protocolNetwork: 'eip155:421614', @@ -452,7 +469,7 @@ describe('Indexing rules', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + decisionBasis: IndexingDecisionBasis.offchain, requireSupported: false, safety: true, protocolNetwork: 'eip155:421614', @@ -461,10 +478,16 @@ describe('Indexing rules', () => { // Write the orginals await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: globalInput }).toPromise(), + executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: globalInput }, + }), ).resolves.toHaveProperty('data.setIndexingRule', globalExpected) await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: deploymentInput }).toPromise(), + executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: deploymentInput }, + }), ).resolves.toHaveProperty('data.setIndexingRule', deploymentExpected) // Query the global rule @@ -473,12 +496,10 @@ describe('Indexing rules', () => { protocolNetwork: 'arbitrum-sepolia', } await expect( - client - .query(INDEXING_RULE_QUERY, { - identifier: globalRuleIdentifier, - merged: false, - }) - .toPromise(), + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: globalRuleIdentifier, merged: false }, + }), ).resolves.toHaveProperty('data.indexingRule', globalExpected) // Query the rule for the deployment @@ -487,31 +508,30 @@ describe('Indexing rules', () => { protocolNetwork: 'arbitrum-sepolia', } await expect( - client - .query(INDEXING_RULE_QUERY, { + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: deploymentRuleIdentifier, merged: false, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.indexingRule', deploymentExpected) // Query all rules together await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: false, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', [globalExpected, deploymentExpected]) }) test('Set, delete and get rule', async () => { const input = { identifier: 'QmZSJPm74tvhgr8uzhqvyQm2J6YSbUEj4nF6j8WxxUQLsC', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '1', - minSignal: '2', + identifierType: IdentifierType.deployment, + allocationAmount: 1, + minSignal: 2, allocationLifetime: 20, autoRenewal: false, protocolNetwork: 'arbitrum-sepolia', @@ -527,7 +547,7 @@ describe('Indexing rules', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: IndexingDecisionBasis.rules, requireSupported: true, safety: true, protocolNetwork: 'eip155:421614', @@ -535,17 +555,15 @@ describe('Indexing rules', () => { // Write the rule await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: input }).toPromise(), + executor({ document: SET_INDEXING_RULE_MUTATION, variables: { rule: input } }), ).resolves.toHaveProperty('data.setIndexingRule', expected) // Query all rules await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: false, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', [expected]) // Delete the rule @@ -554,29 +572,28 @@ describe('Indexing rules', () => { protocolNetwork: 'arbitrum-sepolia', } await expect( - client - .mutation(DELETE_INDEXING_RULE_MUTATION, { + executor({ + document: DELETE_INDEXING_RULE_MUTATION, + variables: { identifier: ruleIdentifier, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.deleteIndexingRule', true) // Query all rules together await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: false, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', []) }) test('Clear a parameter', async () => { const input = { identifier: 'QmZSJPm74tvhgr8uzhqvyQm2J6YSbUEj4nF6j8WxxUQLsC', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '1', + identifierType: IdentifierType.deployment, + allocationAmount: 1, requireSupported: true, safety: true, protocolNetwork: 'arbitrum-sepolia', @@ -593,32 +610,31 @@ describe('Indexing rules', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.RULES, + decisionBasis: IndexingDecisionBasis.rules, protocolNetwork: 'eip155:421614', } // Write the rule await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: input }).toPromise(), + executor({ document: SET_INDEXING_RULE_MUTATION, variables: { rule: input } }), ).resolves.toHaveProperty('data.setIndexingRule', expectedBefore) // Query all rules await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: false, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', [expectedBefore]) // Clear the allocationAmount field await expect( - client - .mutation(SET_INDEXING_RULE_MUTATION, { + executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: { ...expectedBefore, allocationAmount: null }, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.setIndexingRule', { ...expectedBefore, allocationAmount: null, @@ -626,12 +642,10 @@ describe('Indexing rules', () => { // Query the rules again to see that the update went through await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: false, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', [ { ...expectedBefore, allocationAmount: null }, ]) @@ -640,11 +654,11 @@ describe('Indexing rules', () => { test('Set and get global and deployment rule (merged)', async () => { const globalInput = { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, - allocationAmount: '1', - minSignal: '1', - decisionBasis: IndexingDecisionBasis.NEVER, - minAverageQueryFees: '1', + identifierType: IdentifierType.group, + allocationAmount: 1, + minSignal: 1, + decisionBasis: IndexingDecisionBasis.never, + minAverageQueryFees: 1, allocationLifetime: 15, requireSupported: true, autoRenewal: true, @@ -654,10 +668,10 @@ describe('Indexing rules', () => { const deploymentInput = { identifier: 'QmZSJPm74tvhgr8uzhqvyQm2J6YSbUEj4nF6j8WxxUQLsC', - identifierType: SubgraphIdentifierType.DEPLOYMENT, - allocationAmount: '1', - minSignal: '2', - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + identifierType: IdentifierType.deployment, + allocationAmount: 1, + minSignal: 2, + decisionBasis: IndexingDecisionBasis.offchain, allocationLifetime: 10, autoRenewal: false, requireSupported: false, @@ -674,7 +688,7 @@ describe('Indexing rules', () => { maxSignal: null, minStake: null, custom: null, - decisionBasis: IndexingDecisionBasis.NEVER, + decisionBasis: IndexingDecisionBasis.never, requireSupported: true, safety: false, protocolNetwork: 'eip155:421614', @@ -690,7 +704,7 @@ describe('Indexing rules', () => { minStake: null, minAverageQueryFees: null, custom: null, - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + decisionBasis: IndexingDecisionBasis.offchain, requireSupported: false, safety: true, protocolNetwork: 'eip155:421614', @@ -704,9 +718,9 @@ describe('Indexing rules', () => { maxAllocationPercentage: null, maxSignal: null, minStake: null, - minAverageQueryFees: '1', + minAverageQueryFees: 1, custom: null, - decisionBasis: IndexingDecisionBasis.OFFCHAIN, + decisionBasis: IndexingDecisionBasis.offchain, requireSupported: false, safety: true, protocolNetwork: 'eip155:421614', @@ -714,10 +728,16 @@ describe('Indexing rules', () => { // Write the orginals await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: globalInput }).toPromise(), + executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: globalInput }, + }), ).resolves.toHaveProperty('data.setIndexingRule', globalExpected) await expect( - client.mutation(SET_INDEXING_RULE_MUTATION, { rule: deploymentInput }).toPromise(), + executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: deploymentInput }, + }), ).resolves.toHaveProperty('data.setIndexingRule', deploymentExpected) // Query the global rule @@ -726,12 +746,13 @@ describe('Indexing rules', () => { protocolNetwork: 'arbitrum-sepolia', } await expect( - client - .query(INDEXING_RULE_QUERY, { + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: globalRuleIdentifier, merged: false, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.indexingRule', globalExpected) // Query the rule for the deployment merged with the global rule @@ -740,32 +761,29 @@ describe('Indexing rules', () => { protocolNetwork: 'arbitrum-sepolia', } await expect( - client - .query(INDEXING_RULE_QUERY, { + executor({ + document: INDEXING_RULE_QUERY, + variables: { identifier: ruleIdentifier, merged: true, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.indexingRule', deploymentMergedExpected) // Query all rules together (without merging) await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: false, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', [globalExpected, deploymentExpected]) // Query all rules together (with merging) await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: true, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: true, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', [ globalExpected, deploymentMergedExpected, @@ -775,35 +793,37 @@ describe('Indexing rules', () => { test('Delete global rules (which should reset)', async () => { const globalInput = { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, + identifierType: IdentifierType.group, allocationAmount: '1', minSignal: '1', - decisionBasis: IndexingDecisionBasis.NEVER, + decisionBasis: IndexingDecisionBasis.never, minAverageQueryFees: '1', protocolNetwork: 'arbitrum-sepolia', } - await client.mutation(SET_INDEXING_RULE_MUTATION, { rule: globalInput }).toPromise() + await executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: globalInput }, + }) const globalRuleIdentifier = { identifier: INDEXING_RULE_GLOBAL, protocolNetwork: 'arbitrum-sepolia', } await expect( - client - .mutation(DELETE_INDEXING_RULE_MUTATION, { + executor({ + document: DELETE_INDEXING_RULE_MUTATION, + variables: { identifier: globalRuleIdentifier, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.deleteIndexingRule', true) await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: false, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', [ { ...defaults.globalIndexingRule, @@ -811,7 +831,7 @@ describe('Indexing rules', () => { custom: null, decisionBasis: 'rules', identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, + identifierType: IdentifierType.group, allocationLifetime: null, autoRenewal: true, maxAllocationPercentage: null, @@ -827,10 +847,10 @@ describe('Indexing rules', () => { test('Delete multiple rules, including global (which should reset)', async () => { const globalInput = { identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, + identifierType: IdentifierType.group, allocationAmount: '1', minSignal: '1', - decisionBasis: IndexingDecisionBasis.NEVER, + decisionBasis: IndexingDecisionBasis.never, minAverageQueryFees: '1', requireSupported: false, safety: false, @@ -839,7 +859,7 @@ describe('Indexing rules', () => { const deploymentInput = { identifier: 'QmZSJPm74tvhgr8uzhqvyQm2J6YSbUEj4nF6j8WxxUQLsC', - identifierType: SubgraphIdentifierType.DEPLOYMENT, + identifierType: IdentifierType.deployment, allocationAmount: '1', minSignal: '2', requireSupported: true, @@ -847,10 +867,14 @@ describe('Indexing rules', () => { protocolNetwork: 'arbitrum-sepolia', } - await client.mutation(SET_INDEXING_RULE_MUTATION, { rule: globalInput }).toPromise() - await client - .mutation(SET_INDEXING_RULE_MUTATION, { rule: deploymentInput }) - .toPromise() + await executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: globalInput }, + }) + await executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: deploymentInput }, + }) const globalRuleIdentifier = { identifier: INDEXING_RULE_GLOBAL, @@ -862,20 +886,19 @@ describe('Indexing rules', () => { } await expect( - client - .mutation(DELETE_INDEXING_RULES_MUTATION, { + executor({ + document: DELETE_INDEXING_RULES_MUTATION, + variables: { identifiers: [globalRuleIdentifier, deploymentRuleIdentifier], - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.deleteIndexingRules', true) await expect( - client - .query(INDEXING_RULES_QUERY, { - merged: false, - protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }), ).resolves.toHaveProperty('data.indexingRules', [ { ...defaults.globalIndexingRule, @@ -883,7 +906,7 @@ describe('Indexing rules', () => { custom: null, decisionBasis: 'rules', identifier: INDEXING_RULE_GLOBAL, - identifierType: SubgraphIdentifierType.GROUP, + identifierType: IdentifierType.group, allocationLifetime: null, autoRenewal: true, maxAllocationPercentage: null, @@ -900,7 +923,7 @@ describe('Indexing rules', () => { test('Invalid protocolNetwork value prevents rule creation', async () => { const deploymentInput = { identifier: 'QmZSJPm74tvhgr8uzhqvyQm2J6YSbUEj4nF6j8WxxUQLsC', - identifierType: SubgraphIdentifierType.DEPLOYMENT, + identifierType: IdentifierType.deployment, allocationAmount: '1', minSignal: '2', requireSupported: true, @@ -908,18 +931,25 @@ describe('Indexing rules', () => { protocolNetwork: 'unsupported', } - const result = await client - .mutation(SET_INDEXING_RULE_MUTATION, { rule: deploymentInput }) - .toPromise() + const result = await executor({ + document: SET_INDEXING_RULE_MUTATION, + variables: { rule: deploymentInput }, + }) // Mutation must not succeed expect(result).toHaveProperty('data', null) // Must not create any Rule in the database - const rows = await client - .query(INDEXING_RULES_QUERY, { merged: false, protocolNetwork: 'arbitrum-sepolia' }) - .toPromise() + const rows = await executor({ + document: INDEXING_RULES_QUERY, + variables: { merged: false, protocolNetwork: 'arbitrum-sepolia' }, + }) + + if (isAsyncIterable(rows)) { + throw new Error('Expected rows to be an array, but it is an async iterable') + } + expect(rows.data.indexingRules).toEqual([]) }) }) diff --git a/packages/indexer-common/src/indexer-management/__tests__/resolvers/poi-disputes.test.ts b/packages/indexer-common/src/indexer-management/__tests__/resolvers/poi-disputes.test.ts index 7ec174af4..d3da70120 100644 --- a/packages/indexer-common/src/indexer-management/__tests__/resolvers/poi-disputes.test.ts +++ b/packages/indexer-common/src/indexer-management/__tests__/resolvers/poi-disputes.test.ts @@ -6,7 +6,7 @@ import { createLogger, Logger, } from '@graphprotocol/common-ts' -import { IndexerManagementClient } from '../../client' +import { buildHTTPExecutor } from '@graphql-tools/executor-http' import { defineIndexerManagementModels, IndexerManagementModels, @@ -181,7 +181,7 @@ function toObjectArray(disputes: POIDisputeAttributes[]): Record[] let sequelize: Sequelize let models: IndexerManagementModels let logger: Logger -let client: IndexerManagementClient +let executor: ReturnType const metrics = createMetrics() const setupAll = async () => { @@ -195,7 +195,10 @@ const setupAll = async () => { async: false, level: __LOG_LEVEL__ ?? 'error', }) - client = await createTestManagementClient(__DATABASE__, logger, true, metrics) + const client = await createTestManagementClient(__DATABASE__, logger, true, metrics) + executor = buildHTTPExecutor({ + fetch: client.yoga.fetch, + }) logger.info('Finished setting up Test Indexer Management Client') } @@ -226,11 +229,12 @@ describe('POI disputes', () => { const expected = toObjectArray(disputes) await expect( - client - .mutation(STORE_POI_DISPUTES_MUTATION, { + executor({ + document: STORE_POI_DISPUTES_MUTATION, + variables: { disputes: disputes, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.storeDisputes', expected) }) @@ -240,14 +244,17 @@ describe('POI disputes', () => { protocolNetwork: 'arbitrum-sepolia', } await expect( - client.query(GET_POI_DISPUTE_QUERY, { identifier }).toPromise(), + executor({ document: GET_POI_DISPUTE_QUERY, variables: { identifier } }), ).resolves.toHaveProperty('data.dispute', null) }) test('Get one dispute at a time', async () => { const disputes = TEST_DISPUTES_ARRAY - await client.mutation(STORE_POI_DISPUTES_MUTATION, { disputes: disputes }).toPromise() + await executor({ + document: STORE_POI_DISPUTES_MUTATION, + variables: { disputes: disputes }, + }) for (const dispute of disputes) { const identifier = { @@ -256,7 +263,7 @@ describe('POI disputes', () => { } const expected = { ...dispute, protocolNetwork: 'eip155:421614' } await expect( - client.query(GET_POI_DISPUTE_QUERY, { identifier }).toPromise(), + executor({ document: GET_POI_DISPUTE_QUERY, variables: { identifier } }), ).resolves.toHaveProperty('data.dispute', expected) } }) @@ -264,7 +271,10 @@ describe('POI disputes', () => { test('Get all potential disputes', async () => { const disputes = TEST_DISPUTES_ARRAY - await client.mutation(STORE_POI_DISPUTES_MUTATION, { disputes: disputes }).toPromise() + await executor({ + document: STORE_POI_DISPUTES_MUTATION, + variables: { disputes: disputes }, + }) // Once persisted, the protocol network identifier assumes the CAIP2-ID format const expected = disputes.map((dispute) => ({ @@ -273,39 +283,47 @@ describe('POI disputes', () => { })) await expect( - client - .query(GET_POI_DISPUTES_QUERY, { + executor({ + document: GET_POI_DISPUTES_QUERY, + variables: { status: 'potential', minClosedEpoch: 0, protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.disputes', expected) }) test('Get disputes with closed epoch greater than', async () => { const disputes = TEST_DISPUTES_ARRAY - await client.mutation(STORE_POI_DISPUTES_MUTATION, { disputes: disputes }).toPromise() + await executor({ + document: STORE_POI_DISPUTES_MUTATION, + variables: { disputes: disputes }, + }) // Once persisted, the protocol network identifier assumes the CAIP2-ID format const expected = [{ ...TEST_DISPUTE_2, protocolNetwork: 'eip155:421614' }] await expect( - client - .query(GET_POI_DISPUTES_QUERY, { + executor({ + document: GET_POI_DISPUTES_QUERY, + variables: { status: 'potential', minClosedEpoch: 205, protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.disputes', expected) }) test('Remove dispute from store', async () => { const disputes = TEST_DISPUTES_ARRAY - await client.mutation(STORE_POI_DISPUTES_MUTATION, { disputes: disputes }).toPromise() + await executor({ + document: STORE_POI_DISPUTES_MUTATION, + variables: { disputes: disputes }, + }) const identifiers = [ { @@ -314,11 +332,12 @@ describe('POI disputes', () => { }, ] await expect( - client - .mutation(DELETE_POI_DISPUTES_QUERY, { + executor({ + document: DELETE_POI_DISPUTES_QUERY, + variables: { identifiers, - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.deleteDisputes', 1) disputes.splice(0, 1) @@ -329,20 +348,24 @@ describe('POI disputes', () => { })) await expect( - client - .query(GET_POI_DISPUTES_QUERY, { + executor({ + document: GET_POI_DISPUTES_QUERY, + variables: { status: 'potential', minClosedEpoch: 0, protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.disputes', expected) }) test('Remove multiple disputes from store', async () => { const disputes = [TEST_DISPUTE_1, TEST_DISPUTE_2, TEST_DISPUTE_3] - await client.mutation(STORE_POI_DISPUTES_MUTATION, { disputes: disputes }).toPromise() + await executor({ + document: STORE_POI_DISPUTES_MUTATION, + variables: { disputes: disputes }, + }) const identifiers = [ { @@ -356,7 +379,7 @@ describe('POI disputes', () => { ] await expect( - client.mutation(DELETE_POI_DISPUTES_QUERY, { identifiers }).toPromise(), + executor({ document: DELETE_POI_DISPUTES_QUERY, variables: { identifiers } }), ).resolves.toHaveProperty('data.deleteDisputes', 2) disputes.splice(0, 2) @@ -367,13 +390,14 @@ describe('POI disputes', () => { })) await expect( - client - .query(GET_POI_DISPUTES_QUERY, { + executor({ + document: GET_POI_DISPUTES_QUERY, + variables: { status: 'potential', minClosedEpoch: 0, protocolNetwork: 'arbitrum-sepolia', - }) - .toPromise(), + }, + }), ).resolves.toHaveProperty('data.disputes', expected) }) }) diff --git a/packages/indexer-common/src/indexer-management/__tests__/util.ts b/packages/indexer-common/src/indexer-management/__tests__/util.ts index 1e08fda22..dc6d3eee3 100644 --- a/packages/indexer-common/src/indexer-management/__tests__/util.ts +++ b/packages/indexer-common/src/indexer-management/__tests__/util.ts @@ -1,12 +1,7 @@ import { - ActionInput, - ActionStatus, - ActionType, - createIndexerManagementClient, defineIndexerManagementModels, defineQueryFeeModels, GraphNode, - IndexerManagementClient, IndexerManagementDefaults, loadTestYamlConfig, MultiNetworks, @@ -14,19 +9,21 @@ import { specification, } from '@graphprotocol/indexer-common' import { connectDatabase, Metrics, Logger, parseGRT } from '@graphprotocol/common-ts' +import { createIndexerManagementYogaClient } from '../../indexer-management/yoga' +import { ActionInput, ActionStatus, ActionType } from '../../schema/types.generated' const yamlObj = loadTestYamlConfig() export const testNetworkSpecification: specification.NetworkSpecification = specification.NetworkSpecification.parse(yamlObj) -export const createTestManagementClient = async ( +export async function createTestManagementClient( // eslint-disable-next-line @typescript-eslint/no-explicit-any databaseOptions: any, logger: Logger, injectDai: boolean, metrics: Metrics, networkIdentifierOverride?: string, -): Promise => { +) { // Clearing the registry prevents duplicate metric registration in the default registry. metrics.registry.clear() @@ -73,7 +70,7 @@ export const createTestManagementClient = async ( (n: Network) => n.specification.networkIdentifier, ) - return await createIndexerManagementClient({ + return await createIndexerManagementYogaClient({ models: managementModels, graphNode, logger, @@ -96,8 +93,8 @@ export const subgraphDeployment2 = 'QmWq1pmnhEvx25qxpYYj9Yp6E1xMKMVoUjXVQBxUJmre export const subgraphDeployment3 = 'QmRhH2nhNibDVPZmYqq3TUZZARZ77vgjYCvPNiGBCogtgM' export const queuedAllocateAction = { - status: ActionStatus.QUEUED, - type: ActionType.ALLOCATE, + status: ActionStatus.queued, + type: ActionType.allocate, deploymentID: subgraphDeployment1, amount: '10000', force: false, @@ -108,8 +105,8 @@ export const queuedAllocateAction = { } as ActionInput export const invalidUnallocateAction = { - status: ActionStatus.QUEUED, - type: ActionType.UNALLOCATE, + status: ActionStatus.queued, + type: ActionType.unallocate, allocationID: '0x8f63930129e585c69482b56390a09b6b176f4a4c', deploymentID: subgraphDeployment1, amount: undefined, @@ -122,8 +119,8 @@ export const invalidUnallocateAction = { } as ActionInput export const invalidReallocateAction = { - status: ActionStatus.QUEUED, - type: ActionType.REALLOCATE, + status: ActionStatus.queued, + type: ActionType.reallocate, deploymentID: subgraphDeployment1, allocationID: '0x000009a610d8b4fd4d1e020e22cc55a623fe7d2a', poi: '0x0000000000000000000000000000000000000000000000000000000000000000', diff --git a/packages/indexer-common/src/indexer-management/actions.ts b/packages/indexer-common/src/indexer-management/actions.ts index fde4fd0ee..6b9ee4775 100644 --- a/packages/indexer-common/src/indexer-management/actions.ts +++ b/packages/indexer-common/src/indexer-management/actions.ts @@ -1,9 +1,7 @@ import { Action, - ActionFilter, actionFilterToWhereOptions, ActionParams, - ActionStatus, ActionUpdateInput, AllocationManager, AllocationManagementMode, @@ -20,9 +18,18 @@ import { GraphNode, } from '@graphprotocol/indexer-common' -import { Order, Transaction } from 'sequelize' +import { Order, Transaction, WhereOperators } from 'sequelize' import { Eventual, join, Logger, timer } from '@graphprotocol/common-ts' import groupBy from 'lodash.groupby' +import { + ActionStatus, + ActionFilter as GraphQLActionFilter, + Maybe, +} from '../schema/types.generated' + +type ActionFilter = GraphQLActionFilter & { + updatedAt?: WhereOperators +} export class ActionManager { declare multiNetworks: MultiNetworks @@ -121,9 +128,14 @@ export class ActionManager { logger.trace('Fetching approved actions') let actions: Action[] = [] try { - actions = await ActionManager.fetchActions(this.models, null, { - status: ActionStatus.APPROVED, - }) + actions = await ActionManager.fetchActions( + this.models, + null, + { + status: ActionStatus.approved, + }, + null, + ) logger.trace(`Fetched ${actions.length} approved actions`) } catch (err) { logger.warn('Failed to fetch approved actions from queue', { err }) @@ -205,7 +217,7 @@ export class ActionManager { ): Promise { let updatedActions: Action[] = [] for (const result of results) { - const status = isActionFailure(result) ? ActionStatus.FAILED : ActionStatus.SUCCESS + const status = isActionFailure(result) ? ActionStatus.failed : ActionStatus.success const [, updatedAction] = await this.models.Action.update( { status: status, @@ -247,7 +259,7 @@ export class ActionManager { approvedActions = ( await this.models.Action.findAll({ where: { - status: ActionStatus.APPROVED, + status: ActionStatus.approved, protocolNetwork, }, order: [['priority', 'ASC']], @@ -294,7 +306,7 @@ export class ActionManager { models: IndexerManagementModels, transaction: Transaction | null, filter: ActionFilter, - orderBy?: ActionParams, + orderBy: Maybe, orderDirection?: OrderDirection, first?: number, ): Promise { @@ -320,7 +332,8 @@ export class ActionManager { 'Cannot bulk update actions without a filter, please provide a least 1 filter value', ) } - return await models.Action.update( + return models.Action.update( + // @ts-expect-error need to improve { ...action }, { where: actionFilterToWhereOptions(filter), diff --git a/packages/indexer-common/src/indexer-management/allocations.ts b/packages/indexer-common/src/indexer-management/allocations.ts index 569632408..fd4574596 100644 --- a/packages/indexer-common/src/indexer-management/allocations.ts +++ b/packages/indexer-common/src/indexer-management/allocations.ts @@ -8,7 +8,6 @@ import { import { Action, ActionFailure, - ActionType, Allocation, allocationIdProof, AllocationResult, @@ -21,14 +20,12 @@ import { IndexerError, IndexerErrorCode, IndexerManagementModels, - IndexingDecisionBasis, IndexingRuleAttributes, IndexingStatus, isActionFailure, isDeploymentWorthAllocatingTowards, Network, ReallocateAllocationResult, - SubgraphIdentifierType, SubgraphStatus, uniqueAllocationID, upsertIndexingRule, @@ -44,6 +41,11 @@ import { import { BytesLike } from '@ethersproject/bytes' import pMap from 'p-map' +import { + ActionType, + IdentifierType, + IndexingDecisionBasis, +} from '../schema/types.generated' export interface TransactionPreparationContext { activeAllocations: Allocation[] @@ -212,7 +214,7 @@ export class AllocationManager { } switch (action.type) { - case ActionType.ALLOCATE: + case 'allocate': return await this.confirmAllocate( action.id, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -221,14 +223,14 @@ export class AllocationManager { action.amount!, receipt, ) - case ActionType.UNALLOCATE: + case 'unallocate': return await this.confirmUnallocate( action.id, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion action.allocationID!, receipt, ) - case ActionType.REALLOCATE: + case 'reallocate': return await this.confirmReallocate( action.id, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -265,7 +267,7 @@ export class AllocationManager { }) try { switch (action.type) { - case ActionType.ALLOCATE: + case 'allocate': return await this.prepareAllocate( logger, context, @@ -274,7 +276,7 @@ export class AllocationManager { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion parseGRT(action.amount!), ) - case ActionType.UNALLOCATE: + case 'unallocate': return await this.prepareUnallocate( logger, context, @@ -283,7 +285,7 @@ export class AllocationManager { action.poi === null ? undefined : action.poi, action.force === null ? false : action.force, ) - case ActionType.REALLOCATE: + case 'reallocate': return await this.prepareReallocate( logger, context, @@ -311,7 +313,7 @@ export class AllocationManager { } async deployBeforeAllocating(logger: Logger, actions: Action[]): Promise { - const allocateActions = actions.filter((action) => action.type == ActionType.ALLOCATE) + const allocateActions = actions.filter((action) => action.type == ActionType.allocate) logger.info('Ensure subgraph deployments are deployed before we allocate to them', { allocateActions, }) @@ -494,8 +496,8 @@ export class AllocationManager { const indexingRule = { identifier: deployment, allocationAmount: amount, - identifierType: SubgraphIdentifierType.DEPLOYMENT, - decisionBasis: IndexingDecisionBasis.ALWAYS, + identifierType: IdentifierType.deployment, + decisionBasis: IndexingDecisionBasis.always, protocolNetwork: this.network.specification.networkIdentifier, } as Partial @@ -648,8 +650,8 @@ export class AllocationManager { const neverIndexingRule = { identifier: allocation.subgraphDeployment.id.ipfsHash, protocolNetwork: this.network.specification.networkIdentifier, - identifierType: SubgraphIdentifierType.DEPLOYMENT, - decisionBasis: IndexingDecisionBasis.NEVER, + identifierType: IdentifierType.deployment, + decisionBasis: IndexingDecisionBasis.never, } as Partial await upsertIndexingRule(logger, this.models, neverIndexingRule) @@ -941,8 +943,8 @@ export class AllocationManager { const indexingRule = { identifier: allocation.subgraphDeployment.id.ipfsHash, allocationAmount: formatGRT(createAllocationEventLogs.tokens), - identifierType: SubgraphIdentifierType.DEPLOYMENT, - decisionBasis: IndexingDecisionBasis.ALWAYS, + identifierType: IdentifierType.deployment, + decisionBasis: IndexingDecisionBasis.always, protocolNetwork: this.network.specification.networkIdentifier, } as Partial @@ -1033,7 +1035,7 @@ export class AllocationManager { // We intentionally don't check if the allocation is active now because it will be checked // later, when we prepare the transaction. - if (action.type === ActionType.UNALLOCATE || action.type === ActionType.REALLOCATE) { + if (action.type === 'unallocate' || action.type === 'reallocate') { // Ensure this Action have a valid allocationID if (action.allocationID === null || action.allocationID === undefined) { throw Error( diff --git a/packages/indexer-common/src/indexer-management/client.ts b/packages/indexer-common/src/indexer-management/client.ts deleted file mode 100644 index 164aa404f..000000000 --- a/packages/indexer-common/src/indexer-management/client.ts +++ /dev/null @@ -1,546 +0,0 @@ -import { buildSchema, print } from 'graphql' -import gql from 'graphql-tag' -import { executeExchange } from '@urql/exchange-execute' -import { Client, ClientOptions } from '@urql/core' -import { equal, Logger, mutable, WritableEventual } from '@graphprotocol/common-ts' - -import { IndexerManagementModels, IndexingRuleCreationAttributes } from './models' - -import actionResolvers from './resolvers/actions' -import allocationResolvers from './resolvers/allocations' -import costModelResolvers from './resolvers/cost-models' -import indexingRuleResolvers from './resolvers/indexing-rules' -import poiDisputeResolvers from './resolvers/poi-disputes' -import statusResolvers from './resolvers/indexer-status' -import { BigNumber } from 'ethers' -import { Op, Sequelize } from 'sequelize' -import { GraphNode } from '../graph-node' -import { ActionManager, MultiNetworks, Network } from '@graphprotocol/indexer-common' - -export interface IndexerManagementResolverContext { - models: IndexerManagementModels - graphNode: GraphNode - logger: Logger - defaults: IndexerManagementDefaults - actionManager: ActionManager | undefined - multiNetworks: MultiNetworks | undefined - dai: WritableEventual -} - -const SCHEMA_SDL = gql` - scalar BigInt - - enum OrderDirection { - asc - desc - } - - enum IndexingDecisionBasis { - rules - never - always - offchain - } - - enum IdentifierType { - deployment - subgraph - group - } - - input AllocationFilter { - status: String - allocation: String - subgraphDeployment: String - protocolNetwork: String - } - - enum AllocationStatus { - Null # == indexer == address(0) - Active # == not Null && tokens > 0 # - Closed # == Active && closedAtEpoch != 0. Still can collect, while you are waiting to be finalized. a.k.a settling - Finalized # == Closing && closedAtEpoch + channelDisputeEpochs > now(). Note, the subgraph has no way to return this value. it is implied - Claimed # == not Null && tokens == 0 - i.e. finalized, and all tokens withdrawn - } - - type Allocation { - id: String! - indexer: String! - subgraphDeployment: String! - allocatedTokens: String! - createdAtEpoch: Int! - closedAtEpoch: Int - ageInEpochs: Int! - indexingRewards: String! - queryFeesCollected: String! - signalledTokens: BigInt! - stakedTokens: BigInt! - status: AllocationStatus! - protocolNetwork: String! - } - - type CreateAllocationResult { - allocation: String! - deployment: String! - allocatedTokens: String! - protocolNetwork: String! - } - - type CloseAllocationResult { - allocation: String! - allocatedTokens: String! - indexingRewards: String! - receiptsWorthCollecting: Boolean! - protocolNetwork: String! - } - - type ReallocateAllocationResult { - closedAllocation: String! - indexingRewardsCollected: String! - receiptsWorthCollecting: Boolean! - createdAllocation: String! - createdAllocationStake: String! - protocolNetwork: String! - } - - enum ActionStatus { - queued - approved - pending - success - failed - canceled - } - - enum ActionType { - allocate - unallocate - reallocate - } - - type Action { - id: Int! - status: ActionStatus! - type: ActionType! - deploymentID: String - allocationID: String - amount: String - poi: String - force: Boolean - priority: Int! - source: String! - reason: String! - transaction: String - failureReason: String - createdAt: BigInt! - updatedAt: BigInt - protocolNetwork: String! - } - - input ActionInput { - status: ActionStatus! - type: ActionType! - deploymentID: String - allocationID: String - amount: String - poi: String - force: Boolean - source: String! - reason: String! - priority: Int! - protocolNetwork: String! - } - - input ActionUpdateInput { - id: Int - deploymentID: String - allocationID: String - amount: Int - poi: String - force: Boolean - type: ActionType - status: ActionStatus - reason: String - } - - enum ActionParams { - id - status - type - deploymentID - allocationID - transaction - amount - poi - force - source - reason - priority - createdAt - updatedAt - protocolNetwork - } - - type ActionResult { - id: Int! - type: ActionType! - deploymentID: String - allocationID: String - amount: String - poi: String - force: Boolean - source: String! - reason: String! - status: String! - transaction: String - failureReason: String - priority: Int - protocolNetwork: String! - } - - input ActionFilter { - id: Int - protocolNetwork: String - type: ActionType - status: String - source: String - reason: String - } - - input POIDisputeIdentifier { - allocationID: String! - protocolNetwork: String! - } - - type POIDispute { - allocationID: String! - subgraphDeploymentID: String! - allocationIndexer: String! - allocationAmount: BigInt! - allocationProof: String! - closedEpoch: Int! - closedEpochStartBlockHash: String! - closedEpochStartBlockNumber: Int! - closedEpochReferenceProof: String - previousEpochStartBlockHash: String! - previousEpochStartBlockNumber: Int! - previousEpochReferenceProof: String - status: String! - protocolNetwork: String! - } - - input POIDisputeInput { - allocationID: String! - subgraphDeploymentID: String! - allocationIndexer: String! - allocationAmount: BigInt! - allocationProof: String! - closedEpoch: Int! - closedEpochStartBlockHash: String! - closedEpochStartBlockNumber: Int! - closedEpochReferenceProof: String - previousEpochStartBlockHash: String! - previousEpochStartBlockNumber: Int! - previousEpochReferenceProof: String - status: String! - protocolNetwork: String! - } - - type IndexingRule { - identifier: String! - identifierType: IdentifierType! - allocationAmount: BigInt - allocationLifetime: Int - autoRenewal: Boolean! - parallelAllocations: Int - maxAllocationPercentage: Float - minSignal: BigInt - maxSignal: BigInt - minStake: BigInt - minAverageQueryFees: BigInt - custom: String - decisionBasis: IndexingDecisionBasis! - requireSupported: Boolean! - safety: Boolean! - protocolNetwork: String! - } - - input IndexingRuleInput { - identifier: String! - identifierType: IdentifierType! - allocationAmount: BigInt - allocationLifetime: Int - autoRenewal: Boolean - parallelAllocations: Int - maxAllocationPercentage: Float - minSignal: BigInt - maxSignal: BigInt - minStake: BigInt - minAverageQueryFees: BigInt - custom: String - decisionBasis: IndexingDecisionBasis - requireSupported: Boolean - safety: Boolean - protocolNetwork: String! - } - - input IndexingRuleIdentifier { - identifier: String! - protocolNetwork: String! - } - - type GeoLocation { - latitude: String! - longitude: String! - } - - type IndexerRegistration { - url: String - protocolNetwork: String! - address: String - registered: Boolean! - location: GeoLocation - } - - type IndexingError { - handler: String - message: String! - } - - type BlockPointer { - number: Int! - hash: String! - } - - type ChainIndexingStatus { - network: String! - latestBlock: BlockPointer - chainHeadBlock: BlockPointer - earliestBlock: BlockPointer - } - - type IndexerDeployment { - subgraphDeployment: String! - synced: Boolean! - health: String! - fatalError: IndexingError - node: String - chains: [ChainIndexingStatus] - } - - type IndexerAllocation { - id: String! - allocatedTokens: BigInt! - createdAtEpoch: Int! - closedAtEpoch: Int - subgraphDeployment: String! - signalledTokens: BigInt! - stakedTokens: BigInt! - } - - type IndexerEndpointTest { - test: String! - error: String - possibleActions: [String]! - } - - type IndexerEndpoint { - url: String - healthy: Boolean! - protocolNetwork: String! - tests: [IndexerEndpointTest!]! - } - - type IndexerEndpoints { - service: IndexerEndpoint! - status: IndexerEndpoint! - } - - type CostModel { - deployment: String! - model: String - variables: String - } - - input CostModelInput { - deployment: String! - model: String - variables: String - } - - type Query { - indexingRule( - identifier: IndexingRuleIdentifier! - merged: Boolean! = false - ): IndexingRule - indexingRules(merged: Boolean! = false, protocolNetwork: String): [IndexingRule!]! - indexerRegistration(protocolNetwork: String!): IndexerRegistration! - indexerDeployments: [IndexerDeployment]! - indexerAllocations(protocolNetwork: String!): [IndexerAllocation]! - indexerEndpoints(protocolNetwork: String): [IndexerEndpoints!]! - - costModels(deployments: [String!]): [CostModel!]! - costModel(deployment: String!): CostModel - - dispute(identifier: POIDisputeIdentifier!): POIDispute - disputes( - status: String! - minClosedEpoch: Int! - protocolNetwork: String - ): [POIDispute]! - disputesClosedAfter(closedAfterBlock: BigInt!, protocolNetwork: String): [POIDispute]! - - allocations(filter: AllocationFilter!): [Allocation!]! - - action(actionID: String!): Action - actions( - filter: ActionFilter - orderBy: ActionParams - orderDirection: OrderDirection - first: Int - ): [Action]! - } - - type Mutation { - setIndexingRule(rule: IndexingRuleInput!): IndexingRule! - deleteIndexingRule(identifier: IndexingRuleIdentifier!): Boolean! - deleteIndexingRules(identifiers: [IndexingRuleIdentifier!]!): Boolean! - - setCostModel(costModel: CostModelInput!): CostModel! - deleteCostModels(deployments: [String!]!): Int! - - storeDisputes(disputes: [POIDisputeInput!]!): [POIDispute!] - deleteDisputes(identifiers: [POIDisputeIdentifier!]!): Int! - - createAllocation( - deployment: String! - amount: String! - indexNode: String - protocolNetwork: String! - ): CreateAllocationResult! - closeAllocation( - allocation: String! - poi: String - force: Boolean - protocolNetwork: String! - ): CloseAllocationResult! - reallocateAllocation( - allocation: String! - poi: String - amount: String! - force: Boolean - protocolNetwork: String! - ): ReallocateAllocationResult! - submitCollectReceiptsJob(allocation: String!, protocolNetwork: String!): Boolean! - - updateAction(action: ActionInput!): Action! - updateActions(filter: ActionFilter!, action: ActionUpdateInput!): [Action]! - queueActions(actions: [ActionInput!]!): [Action]! - cancelActions(actionIDs: [String!]!): [Action]! - deleteActions(actionIDs: [String!]!): Int! - approveActions(actionIDs: [String!]!): [Action]! - executeApprovedActions: [ActionResult!]! - } -` - -export interface IndexerManagementDefaults { - globalIndexingRule: Omit< - IndexingRuleCreationAttributes, - 'identifier' | 'allocationAmount' - > & { allocationAmount: BigNumber } -} - -export interface IndexerManagementClientOptions { - logger: Logger - models: IndexerManagementModels - graphNode: GraphNode - multiNetworks: MultiNetworks | undefined - defaults: IndexerManagementDefaults -} - -export class IndexerManagementClient extends Client { - private logger?: Logger - private models: IndexerManagementModels - private dai: WritableEventual - - constructor( - clientOptions: ClientOptions, - options: IndexerManagementClientOptions, - featureOptions: { dai: WritableEventual }, - ) { - super(clientOptions) - - this.logger = options.logger - this.models = options.models - this.dai = featureOptions.dai - } - - public async setDai(value: string): Promise { - // Get current value - const oldValue = this.dai.valueReady ? await this.dai.value() : undefined - - // Don't do anything if there is no change - if (equal(oldValue, value)) { - return - } - - // Notify others of the new value - this.dai.push(value) - - // Update DAI in all cost models - const update = `'${JSON.stringify({ DAI: value })}'::jsonb` - await this.models.CostModel.update( - { - // This merges DAI into the variables, overwriting existing values - variables: Sequelize.literal(`coalesce(variables, '{}'::jsonb) || ${update}`), - }, - { - // TODO: update to match all rows?? - where: { model: { [Op.not]: null } }, - }, - ) - } -} - -// TODO:L2: Put the IndexerManagementClient creation inside the Agent, and receive -// MultiNetworks from it -export const createIndexerManagementClient = async ( - options: IndexerManagementClientOptions, -): Promise => { - const { models, graphNode, logger, defaults, multiNetworks } = options - const schema = buildSchema(print(SCHEMA_SDL)) - const resolvers = { - ...indexingRuleResolvers, - ...statusResolvers, - ...costModelResolvers, - ...poiDisputeResolvers, - ...allocationResolvers, - ...actionResolvers, - } - - const dai: WritableEventual = mutable() - - const actionManager = multiNetworks - ? await ActionManager.create(multiNetworks, logger, models, graphNode) - : undefined - - const context: IndexerManagementResolverContext = { - models, - graphNode, - defaults, - logger: logger.child({ component: 'IndexerManagementClient' }), - dai, - multiNetworks, - actionManager, - } - - const exchange = executeExchange({ - schema, - rootValue: resolvers, - context, - }) - - return new IndexerManagementClient({ url: 'no-op', exchanges: [exchange] }, options, { - dai, - }) -} diff --git a/packages/indexer-common/src/indexer-management/context.ts b/packages/indexer-common/src/indexer-management/context.ts new file mode 100644 index 000000000..e674abc21 --- /dev/null +++ b/packages/indexer-common/src/indexer-management/context.ts @@ -0,0 +1,24 @@ +import { Logger, WritableEventual } from '@graphprotocol/common-ts' +import { IndexerManagementModels, IndexingRuleCreationAttributes } from './models' +import { GraphNode } from '../graph-node' +import { BigNumber } from 'ethers' +import { ActionManager } from './actions' +import { MultiNetworks } from '../multi-networks' +import { Network } from '../network' + +export interface IndexerManagementDefaults { + globalIndexingRule: Omit< + IndexingRuleCreationAttributes, + 'identifier' | 'allocationAmount' + > & { allocationAmount: BigNumber } +} + +export interface IndexerManagementResolverContext { + models: IndexerManagementModels + graphNode: GraphNode + logger: Logger + defaults: IndexerManagementDefaults + actionManager: ActionManager | undefined + multiNetworks: MultiNetworks | undefined + dai: WritableEventual +} diff --git a/packages/indexer-common/src/indexer-management/index.ts b/packages/indexer-common/src/indexer-management/index.ts index 6990e72b3..83bbc9d2b 100644 --- a/packages/indexer-common/src/indexer-management/index.ts +++ b/packages/indexer-common/src/indexer-management/index.ts @@ -1,8 +1,10 @@ export * from './actions' export * from './allocations' -export * from './client' export * from './models' export * from './monitor' export * from './server' export * from './rules' export * from './types' +export * from './context' + +export { isAsyncIterable } from 'graphql-yoga' diff --git a/packages/indexer-common/src/indexer-management/models/action.ts b/packages/indexer-common/src/indexer-management/models/action.ts index 642a9fbca..131b1f249 100644 --- a/packages/indexer-common/src/indexer-management/models/action.ts +++ b/packages/indexer-common/src/indexer-management/models/action.ts @@ -9,7 +9,11 @@ import { Sequelize, } from 'sequelize' import { caip2IdRegex } from '../../parsers' -import { ActionStatus, ActionType } from '@graphprotocol/indexer-common' +import { + Action as GraphQLAction, + ActionType, + ActionStatus, +} from '../../schema/types.generated' export class Action extends Model< InferAttributes, @@ -37,9 +41,13 @@ export class Action extends Model< declare protocolNetwork: string - // eslint-disable-next-line @typescript-eslint/ban-types - public toGraphQL(): object { - return { ...this.toJSON(), __typename: 'Action' } + public toGraphQL(): GraphQLAction { + return { + ...this.toJSON(), + __typename: 'Action', + createdAt: BigInt(this.createdAt.getMilliseconds()), + updatedAt: BigInt(this.updatedAt.getMilliseconds()), + } } } @@ -58,9 +66,9 @@ export const defineActionModels = (sequelize: Sequelize): ActionModels => { }, type: { type: DataTypes.ENUM( - ActionType.ALLOCATE, - ActionType.UNALLOCATE, - ActionType.REALLOCATE, + ActionType.allocate, + ActionType.unallocate, + ActionType.reallocate, ), allowNull: false, validate: { @@ -76,12 +84,12 @@ export const defineActionModels = (sequelize: Sequelize): ActionModels => { }, status: { type: DataTypes.ENUM( - ActionStatus.SUCCESS, - ActionStatus.FAILED, - ActionStatus.QUEUED, - ActionStatus.APPROVED, - ActionStatus.PENDING, - ActionStatus.CANCELED, + ActionStatus.success, + ActionStatus.failed, + ActionStatus.queued, + ActionStatus.approved, + ActionStatus.pending, + ActionStatus.canceled, ), allowNull: false, defaultValue: 'queued', @@ -158,21 +166,21 @@ export const defineActionModels = (sequelize: Sequelize): ActionModels => { validate: { requiredActionParams() { switch (this.type) { - case ActionType.ALLOCATE: + case ActionType.allocate: if (this.deploymentID === null || this.amount === null) { throw new Error( `ActionType.ALLOCATE action must have required params: ['deploymentID','amount']`, ) } break - case ActionType.UNALLOCATE: + case ActionType.unallocate: if (this.deploymentID === null || this.allocationID === null) { throw new Error( `ActionType.UNALLOCATE action must have required params: ['deploymentID','allocationID']`, ) } break - case ActionType.REALLOCATE: + case ActionType.reallocate: if ( this.deploymentID === null || this.allocationID === null || diff --git a/packages/indexer-common/src/indexer-management/models/cost-model.ts b/packages/indexer-common/src/indexer-management/models/cost-model.ts index 65cb27bb4..008fa9ab6 100644 --- a/packages/indexer-common/src/indexer-management/models/cost-model.ts +++ b/packages/indexer-common/src/indexer-management/models/cost-model.ts @@ -2,15 +2,13 @@ import { Optional, Model, DataTypes, Sequelize } from 'sequelize' import { utils } from 'ethers' - -export interface GraphQLCostModel { - deployment: string - model: string | null | undefined - variables: string | null | undefined -} +import { + CostModel as GraphQLCostModelType, + CostModelInput as GraphQLCostModelInput, +} from '../../schema/types.generated' export const parseGraphQLCostModel = ( - costModel: GraphQLCostModel, + costModel: GraphQLCostModelInput, ): CostModelCreationAttributes => { try { const variables = !costModel.variables @@ -54,8 +52,7 @@ export class CostModel public createdAt!: Date public updatedAt!: Date - // eslint-disable-next-line @typescript-eslint/ban-types - public toGraphQL(): object { + public toGraphQL(): GraphQLCostModelType { return { ...this.toJSON(), variables: diff --git a/packages/indexer-common/src/indexer-management/models/indexing-rule.ts b/packages/indexer-common/src/indexer-management/models/indexing-rule.ts index 76ee2b265..420c2cc1c 100644 --- a/packages/indexer-common/src/indexer-management/models/indexing-rule.ts +++ b/packages/indexer-common/src/indexer-management/models/indexing-rule.ts @@ -1,22 +1,20 @@ /* eslint-disable @typescript-eslint/no-empty-interface */ import { DataTypes, Model, Optional, Sequelize } from 'sequelize' -import { processIdentifier, SubgraphIdentifierType } from '../../subgraphs' +import { processIdentifier } from '../../subgraphs' import { caip2IdRegex } from '../../parsers' - -export enum IndexingDecisionBasis { - RULES = 'rules', - NEVER = 'never', - ALWAYS = 'always', - OFFCHAIN = 'offchain', -} +import { + IndexingRule as GraphQLIndexingRuleType, + IdentifierType, + IndexingDecisionBasis, +} from '../../schema/types.generated' export const INDEXING_RULE_GLOBAL = 'global' export interface IndexingRuleAttributes { id: number identifier: string - identifierType: SubgraphIdentifierType + identifierType: IdentifierType allocationAmount: string | null allocationLifetime: number | null autoRenewal: boolean @@ -68,7 +66,7 @@ export class IndexingRule { public id!: number public identifier!: string - public identifierType!: SubgraphIdentifierType + public identifierType!: IdentifierType public allocationAmount!: string | null public allocationLifetime!: number | null public autoRenewal!: boolean @@ -87,8 +85,8 @@ export class IndexingRule public createdAt!: Date public updatedAt!: Date - // eslint-disable-next-line @typescript-eslint/ban-types - public toGraphQL(): object { + public toGraphQL(): GraphQLIndexingRuleType { + // @ts-expect-error find a way to use `Maybe` with `T | null` return { ...this.toJSON(), __typename: 'IndexingRule' } } @@ -116,7 +114,7 @@ export class IndexingRule } // eslint-disable-next-line @typescript-eslint/ban-types - public mergeToGraphQL(global: IndexingRule | null): object { + public mergeToGraphQL(global: IndexingRule | null): GraphQLIndexingRuleType { if (global instanceof IndexingRule) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const globalRule: { [key: string]: any } | null = global.toJSON() @@ -133,6 +131,7 @@ export class IndexingRule rule[k] = globalRule[k] } } + // @ts-expect-error TODO: very hacky, we need a better way to ensure this type is correct. return { ...rule, __typename: 'IndexingRule' } } else { return this.toGraphQL() @@ -165,7 +164,11 @@ export const defineIndexingRuleModels = (sequelize: Sequelize): IndexingRuleMode }, }, identifierType: { - type: DataTypes.ENUM('deployment', 'subgraph', 'group'), + type: DataTypes.ENUM( + IdentifierType.deployment, + IdentifierType.subgraph, + IdentifierType.group, + ), defaultValue: 'group', }, allocationAmount: { @@ -245,7 +248,12 @@ export const defineIndexingRuleModels = (sequelize: Sequelize): IndexingRuleMode allowNull: true, }, decisionBasis: { - type: DataTypes.ENUM('rules', 'never', 'always', 'offchain'), + type: DataTypes.ENUM( + IndexingDecisionBasis.rules, + IndexingDecisionBasis.never, + IndexingDecisionBasis.always, + IndexingDecisionBasis.offchain, + ), allowNull: false, defaultValue: 'rules', }, diff --git a/packages/indexer-common/src/indexer-management/models/poi-dispute.ts b/packages/indexer-common/src/indexer-management/models/poi-dispute.ts index 3be43835b..fbd6b9551 100644 --- a/packages/indexer-common/src/indexer-management/models/poi-dispute.ts +++ b/packages/indexer-common/src/indexer-management/models/poi-dispute.ts @@ -3,7 +3,7 @@ import { Optional, Model, DataTypes, Sequelize } from 'sequelize' import { utils } from 'ethers' import { caip2IdRegex } from '../../parsers' - +import { POIDispute as GraphQLPOIDispute } from '../../schema/types.generated' export interface POIDisputeAttributes { allocationID: string subgraphDeploymentID: string @@ -69,9 +69,12 @@ export class POIDispute public createdAt!: Date public updatedAt!: Date - // eslint-disable-next-line @typescript-eslint/ban-types - public toGraphQL(): object { - return { ...this.toJSON(), __typename: 'POIDispute' } + public toGraphQL(): GraphQLPOIDispute { + return { + ...this.toJSON(), + __typename: 'POIDispute', + allocationAmount: BigInt(this.allocationAmount), + } } } diff --git a/packages/indexer-common/src/indexer-management/resolvers/actions.ts b/packages/indexer-common/src/indexer-management/resolvers/actions.ts deleted file mode 100644 index 1e246754c..000000000 --- a/packages/indexer-common/src/indexer-management/resolvers/actions.ts +++ /dev/null @@ -1,411 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ -import { IndexerManagementResolverContext } from '../client' -import { Logger } from '@graphprotocol/common-ts' -import { - Action, - ActionFilter, - ActionInput, - ActionParams, - ActionResult, - ActionStatus, - ActionType, - ActionUpdateInput, - IndexerManagementModels, - Network, - NetworkMapped, - OrderDirection, - validateActionInputs, - validateNetworkIdentifier, -} from '@graphprotocol/indexer-common' -import { literal, Op, Transaction } from 'sequelize' -import { ActionManager } from '../actions' -import groupBy from 'lodash.groupby' - -// Perform insert, update, or no-op depending on existing queue data -// INSERT - No item in the queue yet targeting this deploymentID -// UPDATE - Already an item in the queue targeting the same deploymentID AND that item was added by the same 'source' -// NO-OP - Already an item in the queue targeting the same deploymentID BUT was added by a different source -// TODO: Use pending status for actions in process of execution, detect here and if duplicate pending found, NOOP -async function executeQueueOperation( - logger: Logger, - action: ActionInput, - actionsAwaitingExecution: Action[], - recentlyAttemptedActions: Action[], - models: IndexerManagementModels, - transaction: Transaction, -): Promise { - // Check for previously failed conflicting actions - const conflictingActions = recentlyAttemptedActions.filter(function (recentAction) { - const areEqual = compareActions(recentAction, action) - const fromAgent = action.source === 'indexerAgent' - return areEqual && fromAgent - }) - if (conflictingActions.length > 0) { - const message = `Recently executed '${action.type}' action found in queue targeting '${action.deploymentID}', ignoring.` - logger.warn(message, { - recentlyAttemptedAction: conflictingActions, - proposedAction: action, - }) - throw Error(message) - } - - // Check for duplicated actions - const duplicateActions = actionsAwaitingExecution.filter( - (a) => - a.deploymentID === action.deploymentID && - a.protocolNetwork === action.protocolNetwork, - ) - if (duplicateActions.length === 0) { - logger.trace('Inserting Action in database', { action }) - return [ - await models.Action.create(action, { - validate: true, - returning: true, - transaction, - }), - ] - } else if (duplicateActions.length === 1) { - if ( - duplicateActions[0].source === action.source && - duplicateActions[0].status === action.status - ) { - // TODO: Log this only when update will actually change existing item - logger.trace( - `Action found in queue that effects the same deployment as proposed queue action, updating existing action`, - { - actionInQueue: duplicateActions, - proposedAction: action, - proposedSource: action.source, - actionSources: duplicateActions[0].source, - }, - ) - const [, updatedAction] = await models.Action.update( - { ...action }, - { - where: { id: duplicateActions[0].id }, - returning: true, - validate: true, - transaction, - }, - ) - return updatedAction - } else { - const message = - `Duplicate action found in queue that effects '${action.deploymentID}' but NOT overwritten because it has a different source and/or status. If you ` + - `would like to replace the item currently in the queue please cancel it and then queue the proposed action` - logger.warn(message, { - actionInQueue: duplicateActions, - proposedAction: action, - }) - throw Error(message) - } - } else { - throw Error( - `Uniqueness constraint broken: Multiple actions items targeting the same deployment found in queue (ActionStatus = queued). Something has gone wrong, please cleanup your 'Actions' table to continue`, - ) - } -} - -export default { - action: async ( - { actionID }: { actionID: string }, - { logger, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug(`Execute 'action' query`, { - actionID, - }) - return await models.Action.findOne({ - where: { id: actionID }, - }) - }, - - actions: async ( - { - filter, - orderBy, - orderDirection, - first, - }: { - filter: ActionFilter - orderBy: ActionParams - orderDirection: OrderDirection - first: number - }, - { logger, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug(`Execute 'actions' query`, { - filter, - orderBy, - orderDirection, - first, - }) - return await ActionManager.fetchActions( - models, - null, - filter, - orderBy, - orderDirection, - first, - ) - }, - - queueActions: async ( - { actions }: { actions: ActionInput[] }, - { actionManager, logger, multiNetworks, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug(`Execute 'queueActions' mutation`, { - actions, - }) - - if (!actionManager || !multiNetworks) { - throw Error('IndexerManagementClient must be in `network` mode to modify actions') - } - - // Sanitize protocol network identifier - actions.forEach((action) => { - try { - action.protocolNetwork = validateNetworkIdentifier(action.protocolNetwork) - } catch (e) { - throw Error(`Invalid value for the field 'protocolNetwork'. ${e}`) - } - }) - - // Let Network Monitors validate actions based on their protocol networks - await multiNetworks.mapNetworkMapped( - groupBy(actions, (action) => action.protocolNetwork), - (network: Network, actions: ActionInput[]) => - validateActionInputs(actions, network.networkMonitor, logger), - ) - - let results: ActionResult[] = [] - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await models.Action.sequelize!.transaction(async (transaction) => { - const alreadyQueuedActions = await ActionManager.fetchActions(models, transaction, { - status: ActionStatus.QUEUED, - }) - const alreadyApprovedActions = await ActionManager.fetchActions( - models, - transaction, - { - status: ActionStatus.APPROVED, - }, - ) - const actionsAwaitingExecution = alreadyQueuedActions.concat(alreadyApprovedActions) - - // Fetch recently attempted actions - const last15Minutes = { - [Op.gte]: literal("NOW() - INTERVAL '15m'"), - } - - const recentlyFailedActions = await ActionManager.fetchActions( - models, - transaction, - { - status: ActionStatus.FAILED, - updatedAt: last15Minutes, - }, - ) - - const recentlySuccessfulActions = await ActionManager.fetchActions( - models, - transaction, - { - status: ActionStatus.SUCCESS, - updatedAt: last15Minutes, - }, - ) - - logger.trace('Recently attempted actions', { - recentlySuccessfulActions, - recentlyFailedActions, - }) - - const recentlyAttemptedActions = recentlyFailedActions.concat( - recentlySuccessfulActions, - ) - - for (const action of actions) { - const result = await executeQueueOperation( - logger, - action, - actionsAwaitingExecution, - recentlyAttemptedActions, - models, - transaction, - ) - results = results.concat(result) - } - }) - - return results - }, - - cancelActions: async ( - { actionIDs }: { actionIDs: number[] }, - { logger, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug(`Execute 'cancelActions' mutation`, { - actionIDs, - }) - const [, canceledActions] = await models.Action.update( - { status: ActionStatus.CANCELED }, - { where: { id: actionIDs }, returning: true }, - ) - - if (canceledActions.length === 0) { - throw Error(`Cancel action failed: No action items found with id in [${actionIDs}]`) - } - - return canceledActions - }, - - deleteActions: async ( - { actionIDs }: { actionIDs: number[] }, - { logger, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug(`Execute 'deleteActions' mutation`, { - actionIDs, - }) - const numDeleted = await models.Action.destroy({ where: { id: actionIDs } }) - - if (numDeleted === 0) { - throw Error(`Delete action failed: No action items found with id in [${actionIDs}]`) - } - - return numDeleted - }, - - updateAction: async ( - { action }: { action: Action }, - { logger, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug(`Execute 'updateAction' mutation`, { - action, - }) - const [, updatedActions] = await models.Action.update(action, { - where: { id: action.id }, - returning: true, - }) - - if (updatedActions.length === 0) { - throw Error( - `Update action failed, are you sure there is an item in the queue with id = ${action.id}`, - ) - } - if (updatedActions.length > 1) { - throw Error( - `${updatedActions.length} action items updated in the queue. Should be '1'`, - ) - } - return updatedActions[0] - }, - - updateActions: async ( - { - filter, - action, - }: { - filter: ActionFilter - action: ActionUpdateInput - }, - { logger, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug(`Execute 'updateActions' mutation`, { - filter, - action, - }) - - const results = await ActionManager.updateActions(models, action, filter) - - if (results[0] === 0) { - const msg = `Actions update failed: No action was matched by the filter, '${JSON.stringify( - filter, - )}'` - logger.debug(msg) - throw Error(msg) - } - logger.info(`'${results[0]}' actions updated`) - - return results[1] - }, - - approveActions: async ( - { actionIDs }: { actionIDs: number[] }, - { logger, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug(`Execute 'approveActions' mutation`, { - actionIDs, - }) - const [, updatedActions] = await models.Action.update( - { status: ActionStatus.APPROVED }, - { where: { id: actionIDs }, returning: true }, - ) - - if (updatedActions.length === 0) { - throw Error( - `Approve action failed: No action items found with id in [${actionIDs}]`, - ) - } - - return updatedActions - }, - - executeApprovedActions: async ( - _: unknown, - { logger: parentLogger, actionManager }: IndexerManagementResolverContext, - ): Promise => { - const logger = parentLogger.child({ function: 'executeApprovedActions' }) - logger.trace(`Begin executing 'executeApprovedActions' mutation`) - if (!actionManager) { - throw Error('IndexerManagementClient must be in `network` mode to modify actions') - } - const result: NetworkMapped = await actionManager.multiNetworks.map( - async (network: Network) => { - logger.debug(`Execute 'executeApprovedActions' mutation`, { - protocolNetwork: network.specification.networkIdentifier, - }) - try { - return await actionManager.executeApprovedActions(network) - } catch (error) { - logger.error('Failed to execute approved actions for network', { - protocolNetwork: network.specification.networkIdentifier, - error, - }) - return [] - } - }, - ) - return Object.values(result).flat() - }, -} - -// Helper function to assess equality among a enqueued and a proposed actions -function compareActions(enqueued: Action, proposed: ActionInput): boolean { - // actions are not the same if they target different protocol networks - if (enqueued.protocolNetwork !== proposed.protocolNetwork) { - return false - } - - // actions are not the same if they target different deployments - if (enqueued.deploymentID !== proposed.deploymentID) { - return false - } - // actions are not the same if they have different types - if (enqueued.type !== proposed.type) { - return false - } - - // Different fields are used to assess equality depending on the action type - const amount = enqueued.amount === proposed.amount - const poi = enqueued.poi == proposed.poi - const force = enqueued.force == proposed.force - switch (proposed.type) { - case ActionType.ALLOCATE: - return amount - case ActionType.UNALLOCATE: - return poi && force - case ActionType.REALLOCATE: - return amount && poi && force - } -} diff --git a/packages/indexer-common/src/indexer-management/resolvers/allocations.ts b/packages/indexer-common/src/indexer-management/resolvers/allocations.ts deleted file mode 100644 index f5ad5da3a..000000000 --- a/packages/indexer-common/src/indexer-management/resolvers/allocations.ts +++ /dev/null @@ -1,1070 +0,0 @@ -import { epochElapsedBlocks, Network } from '@graphprotocol/indexer-common' -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/ban-types */ - -import pMap from 'p-map' -import gql from 'graphql-tag' -import { BigNumber, utils } from 'ethers' - -import { - Address, - formatGRT, - Logger, - parseGRT, - SubgraphDeploymentID, - toAddress, -} from '@graphprotocol/common-ts' -import { - allocationIdProof, - AllocationStatus, - CloseAllocationResult, - CreateAllocationResult, - indexerError, - IndexerErrorCode, - IndexerManagementResolverContext, - IndexingDecisionBasis, - IndexingRuleAttributes, - NetworkSubgraph, - ReallocateAllocationResult, - SubgraphIdentifierType, - uniqueAllocationID, -} from '@graphprotocol/indexer-common' -import { extractNetwork } from './utils' - -interface AllocationFilter { - status: 'active' | 'closed' - allocation: string | null - subgraphDeployment: string | null - protocolNetwork: string | null -} - -enum AllocationQuery { - all = 'all', - active = 'active', - closed = 'closed', - allocation = 'allocation', -} - -interface AllocationInfo { - id: Address - indexer: Address - subgraphDeployment: string - signalledTokens: string - stakedTokens: string - allocatedTokens: string - createdAtEpoch: number - closedAtEpoch: number | null - ageInEpochs: number - closeDeadlineEpoch: number - closeDeadlineBlocksRemaining: number - closeDeadlineTimeRemaining: number - indexingRewards: string - queryFeesCollected: string - status: string - protocolNetwork: string -} - -const ALLOCATION_QUERIES = { - [AllocationQuery.all]: gql` - query allocations($indexer: String!) { - allocations(where: { indexer: $indexer }, first: 1000) { - id - subgraphDeployment { - id - stakedTokens - signalledTokens - } - indexer { - id - } - allocatedTokens - createdAtEpoch - closedAtEpoch - indexingRewards - queryFeesCollected - status - } - } - `, - [AllocationQuery.active]: gql` - query allocations($indexer: String!) { - allocations(where: { indexer: $indexer, status: Active }, first: 1000) { - id - subgraphDeployment { - id - stakedTokens - signalledTokens - } - indexer { - id - } - allocatedTokens - createdAtEpoch - closedAtEpoch - indexingRewards - queryFeesCollected - status - } - } - `, - [AllocationQuery.closed]: gql` - query allocations($indexer: String!) { - allocations(where: { indexer: $indexer, status: Closed }, first: 1000) { - id - subgraphDeployment { - id - stakedTokens - signalledTokens - } - indexer { - id - } - allocatedTokens - createdAtEpoch - closedAtEpoch - indexingRewards - queryFeesCollected - status - } - } - `, - [AllocationQuery.allocation]: gql` - query allocations($allocation: String!) { - allocations(where: { id: $allocation }, first: 1000) { - id - subgraphDeployment { - id - stakedTokens - signalledTokens - } - indexer { - id - } - allocatedTokens - createdAtEpoch - closedAtEpoch - indexingRewards - queryFeesCollected - status - } - } - `, -} - -async function queryAllocations( - logger: Logger, - networkSubgraph: NetworkSubgraph, - variables: { - indexer: Address - allocation: Address | null - status: 'active' | 'closed' | null - }, - context: { - currentEpoch: number - currentEpochStartBlock: number - currentEpochElapsedBlocks: number - maxAllocationEpochs: number - blocksPerEpoch: number - avgBlockTime: number - protocolNetwork: string - }, -): Promise { - logger.trace('Query Allocations', { - variables, - context, - }) - - let filterType: AllocationQuery - let filterVars: object - if (variables.allocation) { - filterType = AllocationQuery.allocation - filterVars = { - allocation: variables.allocation.toLowerCase(), - } - } else if (variables.status == null && variables.allocation == null) { - filterType = AllocationQuery.all - filterVars = { - indexer: variables.indexer.toLowerCase(), - } - } else if (variables.status == 'active') { - filterType = AllocationQuery.active - filterVars = { - indexer: variables.indexer.toLowerCase(), - } - } else if (variables.status == 'closed') { - filterType = AllocationQuery.closed - filterVars = { - indexer: variables.indexer.toLowerCase(), - } - } else { - // Shouldn't ever get here - throw new Error( - `Unsupported combination of variables provided, variables: ${variables}`, - ) - } - - const result = await networkSubgraph.checkedQuery( - ALLOCATION_QUERIES[filterType], - filterVars, - ) - - if (result.data.allocations.length == 0) { - // TODO: Is 'Claimable' still the correct term here, after Exponential Rebates? - logger.info(`No 'Claimable' allocations found`) - return [] - } - - if (result.error) { - logger.warning('Query failed', { - error: result.error, - }) - throw result.error - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return pMap( - result.data.allocations, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async (allocation: any): Promise => { - const deadlineEpoch = allocation.createdAtEpoch + context.maxAllocationEpochs - const remainingBlocks = - // blocks remaining in current epoch - context.blocksPerEpoch - - context.currentEpochElapsedBlocks + - // blocks in the remaining epochs after this one - context.blocksPerEpoch * (deadlineEpoch - context.currentEpoch - 1) - return { - id: allocation.id, - indexer: allocation.indexer.id, - subgraphDeployment: new SubgraphDeploymentID(allocation.subgraphDeployment.id) - .ipfsHash, - signalledTokens: allocation.subgraphDeployment.signalledTokens, - stakedTokens: allocation.subgraphDeployment.stakedTokens, - allocatedTokens: BigNumber.from(allocation.allocatedTokens).toString(), - createdAtEpoch: allocation.createdAtEpoch, - closedAtEpoch: allocation.closedAtEpoch, - ageInEpochs: allocation.closedAtEpoch - ? allocation.closedAtEpoch - allocation.createdAtEpoch - : context.currentEpoch - allocation.createdAtEpoch, - closeDeadlineEpoch: allocation.createdAtEpoch + context.maxAllocationEpochs, - closeDeadlineBlocksRemaining: remainingBlocks, - closeDeadlineTimeRemaining: remainingBlocks * context.avgBlockTime, - indexingRewards: allocation.indexingRewards, - queryFeesCollected: allocation.queryFeesCollected, - status: allocation.status, - protocolNetwork: context.protocolNetwork, - } - }, - ) -} - -export default { - allocations: async ( - { filter }: { filter: AllocationFilter }, - { multiNetworks, logger }: IndexerManagementResolverContext, - ): Promise => { - logger.debug('Execute allocations() query', { - filter, - }) - if (!multiNetworks) { - throw Error( - 'IndexerManagementClient must be in `network` mode to fetch allocations', - ) - } - - const allocationsByNetwork = await multiNetworks.map( - async (network: Network): Promise => { - // Return early if a different protocol network is specifically requested - if ( - filter.protocolNetwork && - filter.protocolNetwork !== network.specification.networkIdentifier - ) { - return [] - } - - const { - networkMonitor, - networkSubgraph, - contracts, - specification: { - indexerOptions: { address }, - }, - } = network - - const [currentEpoch, maxAllocationEpochs, epochLength] = await Promise.all([ - networkMonitor.networkCurrentEpoch(), - contracts.staking.maxAllocationEpochs(), - contracts.epochManager.epochLength(), - ]) - - const allocation = filter.allocation - ? filter.allocation === 'all' - ? null - : toAddress(filter.allocation) - : null - - const variables = { - indexer: toAddress(address), - allocation, - status: filter.status, - } - - const context = { - currentEpoch: currentEpoch.epochNumber, - currentEpochStartBlock: currentEpoch.startBlockNumber, - currentEpochElapsedBlocks: epochElapsedBlocks(currentEpoch), - latestBlock: currentEpoch.latestBlock, - maxAllocationEpochs, - blocksPerEpoch: epochLength.toNumber(), - avgBlockTime: 13000, - protocolNetwork: network.specification.networkIdentifier, - } - - return queryAllocations(logger, networkSubgraph, variables, context) - }, - ) - - return Object.values(allocationsByNetwork).flat() - }, - - createAllocation: async ( - { - deployment, - amount, - protocolNetwork, - }: { - deployment: string - amount: string - protocolNetwork: string - }, - { multiNetworks, graphNode, logger, models }: IndexerManagementResolverContext, - ): Promise => { - logger.debug('Execute createAllocation() mutation', { - deployment, - amount, - protocolNetwork, - }) - if (!multiNetworks) { - throw Error( - 'IndexerManagementClient must be in `network` mode to fetch allocations', - ) - } - const network = extractNetwork(protocolNetwork, multiNetworks) - const networkMonitor = network.networkMonitor - const contracts = network.contracts - const transactionManager = network.transactionManager - const address = network.specification.indexerOptions.address - - const allocationAmount = parseGRT(amount) - const subgraphDeployment = new SubgraphDeploymentID(deployment) - - const activeAllocations = await networkMonitor.allocations(AllocationStatus.ACTIVE) - - const allocation = activeAllocations.find( - (allocation) => - allocation.subgraphDeployment.id.toString() === subgraphDeployment.toString(), - ) - if (allocation) { - logger.warn('Already allocated to deployment', { - deployment: allocation.subgraphDeployment.id.ipfsHash, - activeAllocation: allocation.id, - }) - throw indexerError( - IndexerErrorCode.IE060, - `Allocation failed. An active allocation already exists for deployment '${allocation.subgraphDeployment.id.ipfsHash}'`, - ) - } - - if (allocationAmount.lt('0')) { - logger.warn('Cannot allocate a negative amount of GRT', { - amount: formatGRT(allocationAmount), - }) - throw indexerError( - IndexerErrorCode.IE061, - `Invalid allocation amount provided (${amount.toString()}). Must use positive allocation amount`, - ) - } - - try { - const currentEpoch = await contracts.epochManager.currentEpoch() - - // Identify how many GRT the indexer has staked - const freeStake = await contracts.staking.getIndexerCapacity(address) - - // If there isn't enough left for allocating, abort - if (freeStake.lt(allocationAmount)) { - logger.error( - `Allocation of ${formatGRT( - allocationAmount, - )} GRT cancelled: indexer only has a free stake amount of ${formatGRT( - freeStake, - )} GRT`, - ) - throw indexerError( - IndexerErrorCode.IE013, - `Allocation of ${formatGRT( - allocationAmount, - )} GRT cancelled: indexer only has a free stake amount of ${formatGRT( - freeStake, - )} GRT`, - ) - } - - // Ensure subgraph is deployed before allocating - await graphNode.ensure( - `indexer-agent/${subgraphDeployment.ipfsHash.slice(-10)}`, - subgraphDeployment, - ) - - logger.debug('Obtain a unique Allocation ID') - - // Obtain a unique allocation ID - const { allocationSigner, allocationId } = uniqueAllocationID( - transactionManager.wallet.mnemonic.phrase, - currentEpoch.toNumber(), - subgraphDeployment, - activeAllocations.map((allocation) => allocation.id), - ) - - // Double-check whether the allocationID already exists on chain, to - // avoid unnecessary transactions. - // Note: We're checking the allocation state here, which is defined as - // - // enum AllocationState { Null, Active, Closed, Finalized } - // - // in the contracts. - const state = await contracts.staking.getAllocationState(allocationId) - if (state !== 0) { - logger.debug(`Skipping allocation as it already exists onchain`, { - indexer: address, - allocation: allocationId, - state, - }) - throw indexerError( - IndexerErrorCode.IE066, - `Allocation '${allocationId}' already exists onchain`, - ) - } - - logger.debug('Generating new allocation ID proof', { - newAllocationSigner: allocationSigner, - newAllocationID: allocationId, - indexerAddress: address, - }) - - const proof = await allocationIdProof(allocationSigner, address, allocationId) - - logger.debug('Successfully generated allocation ID proof', { - allocationIDProof: proof, - }) - - logger.debug(`Sending allocateFrom transaction`, { - indexer: address, - subgraphDeployment: subgraphDeployment.ipfsHash, - amount: formatGRT(allocationAmount), - allocation: allocationId, - proof, - protocolNetwork, - }) - - const receipt = await transactionManager.executeTransaction( - async () => - contracts.staking.estimateGas.allocateFrom( - address, - subgraphDeployment.bytes32, - allocationAmount, - allocationId, - utils.hexlify(Array(32).fill(0)), - proof, - ), - async (gasLimit) => - contracts.staking.allocateFrom( - address, - subgraphDeployment.bytes32, - allocationAmount, - allocationId, - utils.hexlify(Array(32).fill(0)), - proof, - { gasLimit }, - ), - logger.child({ action: 'allocate' }), - ) - - if (receipt === 'paused' || receipt === 'unauthorized') { - throw indexerError( - IndexerErrorCode.IE062, - `Allocation not created. ${ - receipt === 'paused' ? 'Network paused' : 'Operator not authorized' - }`, - ) - } - - const createAllocationEventLogs = network.transactionManager.findEvent( - 'AllocationCreated', - network.contracts.staking.interface, - 'subgraphDeploymentID', - subgraphDeployment.toString(), - receipt, - logger, - ) - - if (!createAllocationEventLogs) { - throw indexerError( - IndexerErrorCode.IE014, - `Allocation create transaction was never mined`, - ) - } - - logger.info(`Successfully allocated to subgraph deployment`, { - amountGRT: formatGRT(createAllocationEventLogs.tokens), - allocation: createAllocationEventLogs.allocationID, - epoch: createAllocationEventLogs.epoch.toString(), - transaction: receipt.transactionHash, - }) - - logger.debug( - `Updating indexing rules, so indexer-agent will now manage the active allocation`, - ) - const indexingRule = { - identifier: subgraphDeployment.ipfsHash, - allocationAmount: allocationAmount.toString(), - identifierType: SubgraphIdentifierType.DEPLOYMENT, - decisionBasis: IndexingDecisionBasis.ALWAYS, - protocolNetwork, - } as Partial - - await models.IndexingRule.upsert(indexingRule) - - // Since upsert succeeded, we _must_ have a rule - const updatedRule = await models.IndexingRule.findOne({ - where: { identifier: indexingRule.identifier }, - }) - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - logger.debug(`DecisionBasis.ALWAYS rule merged into indexing rules`, { - rule: updatedRule, - }) - - return { - actionID: 0, - type: 'allocate', - transactionID: receipt.transactionHash, - deployment, - allocation: createAllocationEventLogs.allocationID, - allocatedTokens: formatGRT(allocationAmount.toString()), - protocolNetwork, - } - } catch (error) { - logger.error(`Failed to allocate`, { - amount: formatGRT(allocationAmount), - error, - }) - throw error - } - }, - - closeAllocation: async ( - { - allocation, - poi, - force, - protocolNetwork, - }: { - allocation: string - poi: string | undefined - force: boolean - protocolNetwork: string - }, - { logger, models, multiNetworks }: IndexerManagementResolverContext, - ): Promise => { - logger.debug('Execute closeAllocation() mutation', { - allocationID: allocation, - poi: poi || 'none provided', - }) - if (!multiNetworks) { - throw Error( - 'IndexerManagementClient must be in `network` mode to fetch allocations', - ) - } - const network = extractNetwork(protocolNetwork, multiNetworks) - const networkMonitor = network.networkMonitor - const contracts = network.contracts - const transactionManager = network.transactionManager - const receiptCollector = network.receiptCollector - - const allocationData = await networkMonitor.allocation(allocation) - - try { - poi = await networkMonitor.resolvePOI(allocationData, poi, force) - - // Double-check whether the allocation is still active on chain, to - // avoid unnecessary transactions. - // Note: We're checking the allocation state here, which is defined as - // - // enum AllocationState { Null, Active, Closed, Finalized } - // - // in the contracts. - const state = await contracts.staking.getAllocationState(allocationData.id) - if (state !== 1) { - throw indexerError(IndexerErrorCode.IE065, 'Allocation has already been closed') - } - - logger.debug('Sending closeAllocation transaction') - const receipt = await transactionManager.executeTransaction( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - () => contracts.staking.estimateGas.closeAllocation(allocationData.id, poi!), - (gasLimit) => - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - contracts.staking.closeAllocation(allocationData.id, poi!, { - gasLimit, - }), - logger, - ) - - if (receipt === 'paused' || receipt === 'unauthorized') { - throw indexerError( - IndexerErrorCode.IE062, - `Allocation '${allocationData.id}' could not be closed: ${receipt}`, - ) - } - - const closeAllocationEventLogs = transactionManager.findEvent( - 'AllocationClosed', - contracts.staking.interface, - 'allocationID', - allocation, - receipt, - logger, - ) - - if (!closeAllocationEventLogs) { - throw indexerError( - IndexerErrorCode.IE015, - `Allocation close transaction was never successfully mined`, - ) - } - - const rewardsEventLogs = transactionManager.findEvent( - 'RewardsAssigned', - contracts.rewardsManager.interface, - 'allocationID', - allocation, - receipt, - logger, - ) - - const rewardsAssigned = rewardsEventLogs ? rewardsEventLogs.amount : 0 - - if (rewardsAssigned == 0) { - logger.warn('No rewards were distributed upon closing the allocation') - } - - logger.info(`Successfully closed allocation`, { - deployment: closeAllocationEventLogs.subgraphDeploymentID, - allocation: closeAllocationEventLogs.allocationID, - indexer: closeAllocationEventLogs.indexer, - amountGRT: formatGRT(closeAllocationEventLogs.tokens), - effectiveAllocation: closeAllocationEventLogs.effectiveAllocation.toString(), - poi: closeAllocationEventLogs.poi, - epoch: closeAllocationEventLogs.epoch.toString(), - transaction: receipt.transactionHash, - indexingRewards: rewardsAssigned, - }) - - logger.info('Identifying receipts worth collecting', { - allocation: closeAllocationEventLogs.allocationID, - }) - - // Collect query fees for this allocation - const isCollectingQueryFees = await receiptCollector.collectReceipts( - 0, - allocationData, - ) - - logger.debug( - `Updating indexing rules, so indexer-agent keeps the deployment synced but doesn't reallocate to it`, - ) - const offchainIndexingRule = { - protocolNetwork: network.specification.networkIdentifier, - identifier: allocationData.subgraphDeployment.id.ipfsHash, - identifierType: SubgraphIdentifierType.DEPLOYMENT, - decisionBasis: IndexingDecisionBasis.OFFCHAIN, - } as Partial - - await models.IndexingRule.upsert(offchainIndexingRule) - - // Since upsert succeeded, we _must_ have a rule - const updatedRule = await models.IndexingRule.findOne({ - where: { identifier: offchainIndexingRule.identifier }, - }) - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - logger.info(`DecisionBasis.OFFCHAIN rule merged into indexing rules`, { - rule: updatedRule, - }) - - return { - actionID: 0, - type: 'unallocate', - transactionID: receipt.transactionHash, - allocation: closeAllocationEventLogs.allocationID, - allocatedTokens: formatGRT(closeAllocationEventLogs.tokens), - indexingRewards: formatGRT(rewardsAssigned), - receiptsWorthCollecting: isCollectingQueryFees, - protocolNetwork: network.specification.networkIdentifier, - } - } catch (error) { - logger.error(error.toString()) - throw error - } - }, - - reallocateAllocation: async ( - { - allocation, - poi, - amount, - force, - protocolNetwork, - }: { - allocation: string - poi: string | undefined - amount: string - force: boolean - protocolNetwork: string - }, - { logger, models, multiNetworks }: IndexerManagementResolverContext, - ): Promise => { - logger = logger.child({ - component: 'reallocateAllocationResolver', - }) - - logger.info('Reallocating allocation', { - allocation: allocation, - poi: poi || 'none provided', - amount, - force, - }) - - if (!multiNetworks) { - throw Error( - 'IndexerManagementClient must be in `network` mode to fetch allocations', - ) - } - - // Obtain the Network object and its associated components and data - const network = extractNetwork(protocolNetwork, multiNetworks) - const networkMonitor = network.networkMonitor - const contracts = network.contracts - const transactionManager = network.transactionManager - const receiptCollector = network.receiptCollector - const address = network.specification.indexerOptions.address - - const allocationAmount = parseGRT(amount) - - const activeAllocations = await networkMonitor.allocations(AllocationStatus.ACTIVE) - - const allocationAddress = toAddress(allocation) - const allocationData = activeAllocations.find((allocation) => { - return allocation.id === allocationAddress - }) - - if (!allocationData) { - throw indexerError( - IndexerErrorCode.IE063, - `Reallocation failed: No active allocation with id '${allocation}' found`, - ) - } - - try { - const currentEpoch = await contracts.epochManager.currentEpoch() - - logger.debug('Resolving POI') - const allocationPOI = await networkMonitor.resolvePOI(allocationData, poi, force) - logger.debug('POI resolved', { - userProvidedPOI: poi, - poi: allocationPOI, - }) - - // Double-check whether the allocation is still active on chain, to - // avoid unnecessary transactions. - // Note: We're checking the allocation state here, which is defined as - // - // enum AllocationState { Null, Active, Closed, Finalized } - // - // in the contracts. - const state = await contracts.staking.getAllocationState(allocationData.id) - if (state !== 1) { - logger.warn(`Allocation has already been closed`) - throw indexerError(IndexerErrorCode.IE065, `Allocation has already been closed`) - } - - if (allocationAmount.lt('0')) { - logger.warn('Cannot reallocate a negative amount of GRT', { - amount: allocationAmount.toString(), - }) - throw indexerError( - IndexerErrorCode.IE061, - 'Cannot reallocate a negative amount of GRT', - ) - } - - logger.info(`Reallocate to subgraph deployment`, { - existingAllocationAmount: formatGRT(allocationData.allocatedTokens), - newAllocationAmount: formatGRT(allocationAmount), - epoch: currentEpoch.toString(), - }) - - // Identify how many GRT the indexer has staked - const freeStake = await contracts.staking.getIndexerCapacity(address) - - // When reallocating, we will first close the old allocation and free up the GRT in that allocation - // This GRT will be available in addition to freeStake for the new allocation - const postCloseFreeStake = freeStake.add(allocationData.allocatedTokens) - - // If there isn't enough left for allocating, abort - if (postCloseFreeStake.lt(allocationAmount)) { - throw indexerError( - IndexerErrorCode.IE013, - `Unable to allocate ${formatGRT( - allocationAmount, - )} GRT: indexer only has a free stake amount of ${formatGRT( - freeStake, - )} GRT, plus ${formatGRT( - allocationData.allocatedTokens, - )} GRT from the existing allocation`, - ) - } - - logger.debug('Generating a new unique Allocation ID') - const { allocationSigner, allocationId: newAllocationId } = uniqueAllocationID( - transactionManager.wallet.mnemonic.phrase, - currentEpoch.toNumber(), - allocationData.subgraphDeployment.id, - activeAllocations.map((allocation) => allocation.id), - ) - - logger.debug('New unique Allocation ID generated', { - newAllocationID: newAllocationId, - newAllocationSigner: allocationSigner, - }) - - // Double-check whether the allocationID already exists on chain, to - // avoid unnecessary transactions. - // Note: We're checking the allocation state here, which is defined as - // - // enum AllocationState { Null, Active, Closed, Finalized } - // - // in the contracts. - const newAllocationState = - await contracts.staking.getAllocationState(newAllocationId) - if (newAllocationState !== 0) { - logger.warn(`Skipping Allocation as it already exists onchain`, { - indexer: address, - allocation: newAllocationId, - newAllocationState, - }) - throw indexerError(IndexerErrorCode.IE066, 'AllocationID already exists') - } - - logger.debug('Generating new allocation ID proof', { - newAllocationSigner: allocationSigner, - newAllocationID: newAllocationId, - indexerAddress: address, - }) - const proof = await allocationIdProof(allocationSigner, address, newAllocationId) - logger.debug('Successfully generated allocation ID proof', { - allocationIDProof: proof, - }) - - logger.info(`Sending close and allocate multicall transaction`, { - indexer: address, - amount: formatGRT(allocationAmount), - oldAllocation: allocationData.id, - newAllocation: newAllocationId, - newAllocationAmount: formatGRT(allocationAmount), - deployment: allocationData.subgraphDeployment.id.toString(), - poi: allocationPOI, - proof, - epoch: currentEpoch.toString(), - }) - - const callData = [ - await contracts.staking.populateTransaction.closeAllocation( - allocationData.id, - allocationPOI, - ), - await contracts.staking.populateTransaction.allocateFrom( - address, - allocationData.subgraphDeployment.id.bytes32, - allocationAmount, - newAllocationId, - utils.hexlify(Array(32).fill(0)), // metadata - proof, - ), - ].map((tx) => tx.data as string) - - const receipt = await transactionManager.executeTransaction( - async () => contracts.staking.estimateGas.multicall(callData), - async (gasLimit) => contracts.staking.multicall(callData, { gasLimit }), - logger.child({ - function: 'closeAndAllocate', - }), - ) - - if (receipt === 'paused' || receipt === 'unauthorized') { - throw indexerError( - IndexerErrorCode.IE062, - `Allocation '${newAllocationId}' could not be closed: ${receipt}`, - ) - } - - const createAllocationEventLogs = transactionManager.findEvent( - 'AllocationCreated', - contracts.staking.interface, - 'subgraphDeploymentID', - allocationData.subgraphDeployment.id.toString(), - receipt, - logger, - ) - - if (!createAllocationEventLogs) { - throw indexerError(IndexerErrorCode.IE014, `Allocation was never mined`) - } - - const closeAllocationEventLogs = transactionManager.findEvent( - 'AllocationClosed', - contracts.staking.interface, - 'allocationID', - allocation, - receipt, - logger, - ) - - if (!closeAllocationEventLogs) { - throw indexerError( - IndexerErrorCode.IE015, - `Allocation close transaction was never successfully mined`, - ) - } - - const rewardsEventLogs = transactionManager.findEvent( - 'RewardsAssigned', - contracts.rewardsManager.interface, - 'allocationID', - allocation, - receipt, - logger, - ) - - const rewardsAssigned = rewardsEventLogs ? rewardsEventLogs.amount : 0 - - if (rewardsAssigned == 0) { - logger.warn('No rewards were distributed upon closing the allocation') - } - - logger.info(`Successfully reallocated allocation`, { - deployment: createAllocationEventLogs.subgraphDeploymentID, - closedAllocation: closeAllocationEventLogs.allocationID, - closedAllocationStakeGRT: formatGRT(closeAllocationEventLogs.tokens), - closedAllocationPOI: closeAllocationEventLogs.poi, - closedAllocationEpoch: closeAllocationEventLogs.epoch.toString(), - indexingRewardsCollected: rewardsAssigned, - createdAllocation: createAllocationEventLogs.allocationID, - createdAllocationStakeGRT: formatGRT(createAllocationEventLogs.tokens), - indexer: createAllocationEventLogs.indexer, - epoch: createAllocationEventLogs.epoch.toString(), - transaction: receipt.transactionHash, - }) - - logger.info('Identifying receipts worth collecting', { - allocation: closeAllocationEventLogs.allocationID, - }) - - // Collect query fees for this allocation - const isCollectingQueryFees = await receiptCollector.collectReceipts( - 0, - allocationData, - ) - - logger.debug( - `Updating indexing rules, so indexer-agent will now manage the active allocation`, - ) - const indexingRule = { - identifier: allocationData.subgraphDeployment.id.ipfsHash, - allocationAmount: allocationAmount.toString(), - identifierType: SubgraphIdentifierType.DEPLOYMENT, - decisionBasis: IndexingDecisionBasis.ALWAYS, - protocolNetwork, - } as Partial - - await models.IndexingRule.upsert(indexingRule) - - // Since upsert succeeded, we _must_ have a rule - const updatedRule = await models.IndexingRule.findOne({ - where: { identifier: indexingRule.identifier }, - }) - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - logger.debug(`DecisionBasis.ALWAYS rule merged into indexing rules`, { - rule: updatedRule, - }) - - return { - actionID: 0, - type: 'reallocate', - transactionID: receipt.transactionHash, - closedAllocation: closeAllocationEventLogs.allocationID, - indexingRewardsCollected: formatGRT(rewardsAssigned), - receiptsWorthCollecting: isCollectingQueryFees, - createdAllocation: createAllocationEventLogs.allocationID, - createdAllocationStake: formatGRT(createAllocationEventLogs.tokens), - protocolNetwork, - } - } catch (error) { - logger.error(error.toString()) - throw error - } - }, - - submitCollectReceiptsJob: async ( - { - allocation, - protocolNetwork, - }: { - allocation: string - protocolNetwork: string - }, - { logger, multiNetworks }: IndexerManagementResolverContext, - ): Promise => { - logger.debug('Execute collectAllocationReceipts() mutation', { - allocationID: allocation, - protocolNetwork, - }) - if (!multiNetworks) { - throw Error( - 'IndexerManagementClient must be in `network` mode to collect receipts for an allocation', - ) - } - const network = extractNetwork(protocolNetwork, multiNetworks) - const networkMonitor = network.networkMonitor - const receiptCollector = network.receiptCollector - - const allocationData = await networkMonitor.allocation(allocation) - - try { - logger.info('Identifying receipts worth collecting', { - allocation: allocation, - }) - - // Collect query fees for this allocation - const collecting = await receiptCollector.collectReceipts(0, allocationData) - - logger.info(`Submitted allocation receipt collection job for execution`, { - allocationID: allocation, - protocolNetwork: network.specification.networkIdentifier, - }) - return collecting - } catch (error) { - logger.error(error.toString()) - throw error - } - }, -} diff --git a/packages/indexer-common/src/indexer-management/resolvers/cost-models.ts b/packages/indexer-common/src/indexer-management/resolvers/cost-models.ts deleted file mode 100644 index 8a8e8885d..000000000 --- a/packages/indexer-common/src/indexer-management/resolvers/cost-models.ts +++ /dev/null @@ -1,172 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/ban-types */ - -import { - CostModelVariables, - COST_MODEL_GLOBAL, - GraphQLCostModel, - parseGraphQLCostModel, -} from '../models' -import { IndexerManagementResolverContext } from '../client' -import { compileAsync } from '@graphprotocol/cost-model' - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const getVariable = (vars: CostModelVariables | null, name: string): any | undefined => { - if (vars === null) { - return undefined - } else { - try { - if (Object.prototype.hasOwnProperty.call(vars, name)) { - return vars[name] - } else { - return undefined - } - } catch (e) { - return undefined - } - } -} - -const setVariable = ( - vars: CostModelVariables | null, - name: string, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - value: any, -): CostModelVariables => { - if (vars === null) { - return { [name]: value } - } else { - try { - vars[name] = value - return vars - } catch (e) { - return vars - } - } -} - -export default { - costModel: async ( - { deployment }: { deployment: string }, - { models }: IndexerManagementResolverContext, - ): Promise => { - const model = await models.CostModel.findOne({ - where: { deployment }, - }) - if (model) { - return model.toGraphQL() - } - - const globalModel = await models.CostModel.findOne({ - where: { deployment: COST_MODEL_GLOBAL }, - }) - if (globalModel) { - globalModel.setDataValue('deployment', deployment) - return globalModel.toGraphQL() - } - - return null - }, - - costModels: async ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - { deployments }: { deployments: string[] | null | undefined }, - { models }: IndexerManagementResolverContext, - ): Promise => { - const costModels = await models.CostModel.findAll({ - where: deployments ? { deployment: deployments } : undefined, - order: [['deployment', 'ASC']], - }) - const definedDeployments = new Set(costModels.map((model) => model.deployment)) - const undefinedDeployments = deployments?.filter((d) => !definedDeployments.has(d)) - const globalModel = await models.CostModel.findOne({ - where: { deployment: COST_MODEL_GLOBAL }, - }) - if (globalModel && undefinedDeployments) { - const mergedCostModels = undefinedDeployments.map((d) => { - globalModel.setDataValue('deployment', d) - return globalModel.toGraphQL() - }) - return costModels.map((model) => model.toGraphQL()).concat(mergedCostModels) - } - - return costModels.map((model) => model.toGraphQL()) - }, - - setCostModel: async ( - { costModel }: { deployment: string; costModel: GraphQLCostModel }, - { models, multiNetworks, dai }: IndexerManagementResolverContext, - ): Promise => { - if (!multiNetworks) { - throw new Error('No network configuration available') - } - if (Object.keys(multiNetworks.inner).length !== 1) { - throw Error('Must be in single network mode to set cost models') - } - const network = Object.values(multiNetworks.inner)[0] - const injectDai = network.specification.dai.inject - if (network.specification.networkIdentifier !== 'eip155:1' && injectDai) { - throw new Error( - `Can't set cost model: DAI injection enabled but not on Ethereum Mainnet`, - ) - } - - const update = parseGraphQLCostModel(costModel) - - // Validate cost model - try { - const modelForValidation = update.model || 'default => 1;' - const variablesForValidation = JSON.stringify(update.variables || {}) - await compileAsync(modelForValidation, variablesForValidation) - } catch (err) { - throw new Error(`Invalid cost model or variables: ${err.message}`) - } - const [model] = await models.CostModel.findOrBuild({ - where: { deployment: update.deployment }, - }) - // logger.info('Fetched current model', { current: model, update }) - // model.set('deployment', update.deployment || model.deployment) - // // model.set('model', update.model || model.model) - // model.model = update.model || model.model - // logger.info('Merged models', { now: model }) - model.deployment = update.deployment || model.deployment - model.model = update.model || model.model - - // Update the model variables (fall back to current value if unchanged) - let variables = update.variables || model.variables - - if (injectDai) { - const oldDai = getVariable(model.variables, 'DAI') - const newDai = getVariable(update.variables, 'DAI') - - // Inject the latest DAI value if available - if (dai.valueReady) { - variables = setVariable(variables, 'DAI', await dai.value()) - } else if (newDai === undefined && oldDai !== undefined) { - // Otherwise preserve the old DAI value if there is one; - // this ensures it's never dropped - variables = setVariable(variables, 'DAI', oldDai) - } - } - - // Apply new variables - model.variables = variables - - return (await model.save()).toGraphQL() - }, - - deleteCostModels: async ( - { deployments }: { deployments: string[] }, - { models }: IndexerManagementResolverContext, - ): Promise => { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return await models.CostModel.sequelize!.transaction(async (transaction) => { - return await models.CostModel.destroy({ - where: { - deployment: deployments, - }, - transaction, - }) - }) - }, -} diff --git a/packages/indexer-common/src/indexer-management/resolvers/indexer-status.ts b/packages/indexer-common/src/indexer-management/resolvers/indexer-status.ts deleted file mode 100644 index dad36df87..000000000 --- a/packages/indexer-common/src/indexer-management/resolvers/indexer-status.ts +++ /dev/null @@ -1,317 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ - -import geohash from 'ngeohash' -import gql from 'graphql-tag' -import { IndexerManagementResolverContext } from '../client' -import { SubgraphDeploymentID } from '@graphprotocol/common-ts' -import { - indexerError, - IndexerErrorCode, - Network, - validateNetworkIdentifier, -} from '@graphprotocol/indexer-common' -import { extractNetwork } from './utils' -interface Test { - test: (url: string) => string - run: (url: string) => Promise - possibleActions: (url: string) => string[] -} - -interface TestResult { - test: string - error: string | null - possibleActions: string[] -} - -const testURL = async ( - url: string, - tests: Test[], -): Promise<{ url: string; ok: boolean; tests: TestResult[] }> => { - const results: TestResult[] = [] - - for (const test of tests) { - const cmd = test.test(url) - - try { - await test.run(url) - - results.push({ - test: cmd, - error: null, - possibleActions: [], - }) - } catch (e) { - results.push({ - test: cmd, - error: e.message, - possibleActions: test.possibleActions(url), - }) - } - } - - return { url, tests: results, ok: !results.find((result) => result.error !== null) } -} - -const URL_VALIDATION_TEST: Test = { - test: () => `URL validation`, - run: async (url) => { - new URL(url) - }, - possibleActions: (url) => [`Make sure ${url} is a valid URL`], -} - -export default { - indexerRegistration: async ( - { protocolNetwork: unvalidatedProtocolNetwork }: { protocolNetwork: string }, - { multiNetworks }: IndexerManagementResolverContext, - ): Promise => { - if (!multiNetworks) { - throw Error( - 'IndexerManagementClient must be in `network` mode to fetch indexer registration information', - ) - } - - const network = extractNetwork(unvalidatedProtocolNetwork, multiNetworks) - const protocolNetwork = network.specification.networkIdentifier - const address = network.specification.indexerOptions.address - const contracts = network.contracts - const registered = await contracts.serviceRegistry.isRegistered(address) - - if (registered) { - const service = await contracts.serviceRegistry.services(address) - return { - address, - protocolNetwork, - url: service.url, - location: geohash.decode(service.geohash), - registered, - __typename: 'IndexerRegistration', - } - } else { - return { - address, - url: null, - registered, - protocolNetwork, - location: null, - __typename: 'IndexerRegistration', - } - } - }, - - indexerDeployments: async ( - _: {}, - { graphNode }: IndexerManagementResolverContext, - ): Promise => { - const result = await graphNode.indexingStatus([]) - return result.map((status) => ({ - ...status, - subgraphDeployment: status.subgraphDeployment.ipfsHash, - })) - }, - - indexerAllocations: async ( - { protocolNetwork }: { protocolNetwork: string }, - { multiNetworks, logger }: IndexerManagementResolverContext, - ): Promise => { - if (!multiNetworks) { - throw Error( - 'IndexerManagementClient must be in `network` mode to fetch indexer allocations', - ) - } - - const network = extractNetwork(protocolNetwork, multiNetworks) - const address = network.specification.indexerOptions.address - - try { - const result = await network.networkSubgraph.checkedQuery( - gql` - query allocations($indexer: String!) { - allocations( - where: { indexer: $indexer, status: Active } - first: 1000 - orderDirection: desc - ) { - id - allocatedTokens - createdAtEpoch - closedAtEpoch - subgraphDeployment { - id - stakedTokens - signalledTokens - } - } - } - `, - { indexer: address.toLocaleLowerCase() }, - ) - if (result.error) { - throw result.error - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return result.data.allocations.map((allocation: any) => ({ - ...allocation, - subgraphDeployment: new SubgraphDeploymentID(allocation.subgraphDeployment.id) - .ipfsHash, - signalledTokens: allocation.subgraphDeployment.signalledTokens, - stakedTokens: allocation.subgraphDeployment.stakedTokens, - protocolNetwork: network.specification.networkIdentifier, - })) - } catch (error) { - const err = indexerError(IndexerErrorCode.IE010, error) - logger?.error(`Failed to query indexer allocations`, { - err, - }) - throw err - } - }, - - indexerEndpoints: async ( - { protocolNetwork: unvalidatedProtocolNetwork }: { protocolNetwork: string | null }, - { multiNetworks, logger }: IndexerManagementResolverContext, - ): Promise => { - if (!multiNetworks) { - throw Error( - 'IndexerManagementClient must be in `network` mode to fetch indexer endpoints', - ) - } - const endpoints: Endpoints[] = [] - let networkIdentifier: string | null = null - - // Validate protocol network - try { - if (unvalidatedProtocolNetwork) { - networkIdentifier = validateNetworkIdentifier(unvalidatedProtocolNetwork) - } - } catch (parseError) { - throw new Error( - `Invalid protocol network identifier: '${unvalidatedProtocolNetwork}'. Error: ${parseError}`, - ) - } - - await multiNetworks.map(async (network: Network) => { - // Skip if this query asks for another protocol network - if ( - networkIdentifier && - networkIdentifier !== network.specification.networkIdentifier - ) { - return - } - try { - const networkEndpoints = await endpointForNetwork(network) - endpoints.push(networkEndpoints) - } catch (err) { - // Ignore endpoints for this network - logger?.warn(`Failed to detect service endpoints for network`, { - err, - protocolNetwork: network.specification.networkIdentifier, - }) - } - }) - return endpoints - }, -} - -interface Endpoint { - url: string | null - healthy: boolean - protocolNetwork: string - // eslint-disable-next-line @typescript-eslint/no-explicit-any - tests: any[] -} - -interface Endpoints { - service: Endpoint - status: Endpoint -} - -function defaultEndpoint(protocolNetwork: string): Endpoint { - return { - url: null as string | null, - healthy: false, - protocolNetwork, - tests: [] as TestResult[], - } -} -function defaultEndpoints(protocolNetwork: string): Endpoints { - return { - service: defaultEndpoint(protocolNetwork), - status: defaultEndpoint(protocolNetwork), - } -} - -async function endpointForNetwork(network: Network): Promise { - const contracts = network.contracts - const address = network.specification.indexerOptions.address - const endpoints = defaultEndpoints(network.specification.networkIdentifier) - const service = await contracts.serviceRegistry.services(address) - if (service) { - { - const { url, tests, ok } = await testURL(service.url, [ - URL_VALIDATION_TEST, - { - test: (url) => `http get ${url}`, - run: async (url) => { - const response = await fetch(url) - if (!response.ok) { - throw new Error( - `Returned status ${response.status}: ${ - response.body ? response.body.toString() : 'No data returned' - }`, - ) - } - }, - possibleActions: (url) => [ - `Make sure ${url} can be resolved and reached from this machine`, - `Make sure the port of ${url} is set up correctly`, - `Make sure the test command returns an HTTP status code < 400`, - ], - }, - ]) - - endpoints.service.url = url - endpoints.service.healthy = ok - endpoints.service.tests = tests - } - - { - const statusURL = endpoints.service.url.endsWith('/') - ? endpoints.service.url.substring(0, endpoints.service.url.length - 1) + '/status' - : endpoints.service.url + '/status' - - const { url, tests, ok } = await testURL(statusURL, [ - URL_VALIDATION_TEST, - { - test: (url) => `http post ${url} query="{ indexingStatuses { subgraph } }"`, - run: async (url) => { - const response = await fetch(url, { - method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify({ query: '{ indexingStatuses { subgraph } }' }), - }) - if (!response.ok) { - throw new Error( - `Returned status ${response.status}: ${ - response.body ? response.body.toString() : 'No data returned' - }`, - ) - } - }, - possibleActions: (url) => [ - `Make sure ${url} can be reached from this machine`, - `Make sure the port of ${url} is set up correctly`, - `Make sure ${url} is the /status endpoint of indexer-service`, - `Make sure the test command returns an HTTP status code < 400`, - `Make sure the test command returns a valid GraphQL response`, - ], - }, - ]) - - endpoints.status.url = url - endpoints.status.healthy = ok - endpoints.status.tests = tests - } - } - return endpoints -} diff --git a/packages/indexer-common/src/indexer-management/resolvers/indexing-rules.ts b/packages/indexer-common/src/indexer-management/resolvers/indexing-rules.ts deleted file mode 100644 index b9a4c32d1..000000000 --- a/packages/indexer-common/src/indexer-management/resolvers/indexing-rules.ts +++ /dev/null @@ -1,197 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ - -import { - IndexerManagementModels, - INDEXING_RULE_GLOBAL, - IndexingRuleIdentifier, - IndexingRuleCreationAttributes, -} from '../models' -import { IndexerManagementDefaults, IndexerManagementResolverContext } from '../client' -import { Transaction } from 'sequelize/types' -import { fetchIndexingRules } from '../rules' -import { processIdentifier } from '../../' -import { validateNetworkIdentifier } from '../../parsers' -import groupBy from 'lodash.groupby' - -const resetGlobalRule = async ( - ruleIdentifier: IndexingRuleIdentifier, - defaults: IndexerManagementDefaults['globalIndexingRule'], - models: IndexerManagementModels, - transaction: Transaction, -) => { - await models.IndexingRule.upsert( - { - ...defaults, - ...ruleIdentifier, - allocationAmount: defaults.allocationAmount.toString(), - }, - { transaction }, - ) -} - -export default { - indexingRule: async ( - { - identifier: indexingRuleIdentifier, - merged, - }: { identifier: IndexingRuleIdentifier; merged: boolean }, - { models }: IndexerManagementResolverContext, - ): Promise => { - const [identifier] = await processIdentifier(indexingRuleIdentifier.identifier, { - all: false, - global: true, - }) - - // Sanitize protocol network identifier - const protocolNetwork = validateNetworkIdentifier( - indexingRuleIdentifier.protocolNetwork, - ) - - const rule = await models.IndexingRule.findOne({ - where: { identifier, protocolNetwork }, - }) - if (rule && merged) { - return rule.mergeToGraphQL( - await models.IndexingRule.findOne({ - where: { identifier: INDEXING_RULE_GLOBAL }, - }), - ) - } else { - return rule?.toGraphQL() || null - } - }, - - indexingRules: async ( - { - merged, - protocolNetwork: uncheckedProtocolNetwork, - }: { merged: boolean; protocolNetwork: string | undefined }, - { models }: IndexerManagementResolverContext, - ): Promise => { - // Convert the input `protocolNetwork` value to a CAIP2-ID - const protocolNetwork = uncheckedProtocolNetwork - ? validateNetworkIdentifier(uncheckedProtocolNetwork) - : undefined - return await fetchIndexingRules(models, merged, protocolNetwork) - }, - - setIndexingRule: async ( - { rule }: { rule: IndexingRuleCreationAttributes }, - { models }: IndexerManagementResolverContext, - ): Promise => { - if (!rule.identifier) { - throw Error('Cannot set indexingRule without identifier') - } - - if (!rule.protocolNetwork) { - throw Error("Cannot set an indexing rule without the field 'protocolNetwork'") - } else { - try { - rule.protocolNetwork = validateNetworkIdentifier(rule.protocolNetwork) - } catch (e) { - throw Error(`Invalid value for the field 'protocolNetwork'. ${e}`) - } - } - - const [identifier] = await processIdentifier(rule.identifier, { - all: false, - global: true, - }) - rule.identifier = identifier - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [updatedRule, _created] = await models.IndexingRule.upsert(rule) - return updatedRule.toGraphQL() - }, - - deleteIndexingRule: async ( - { identifier: indexingRuleIdentifier }: { identifier: IndexingRuleIdentifier }, - { models, defaults }: IndexerManagementResolverContext, - ): Promise => { - const [identifier] = await processIdentifier(indexingRuleIdentifier.identifier, { - all: false, - global: true, - }) - - // Sanitize protocol network identifier - const protocolNetwork = validateNetworkIdentifier( - indexingRuleIdentifier.protocolNetwork, - ) - - const validatedRuleIdentifier = { - protocolNetwork, - identifier, - } - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return await models.IndexingRule.sequelize!.transaction(async (transaction) => { - const numDeleted = await models.IndexingRule.destroy({ - where: validatedRuleIdentifier, - transaction, - }) - - // Reset the global rule - if (validatedRuleIdentifier.identifier === 'global') { - await resetGlobalRule( - validatedRuleIdentifier, - defaults.globalIndexingRule, - models, - transaction, - ) - } - - return numDeleted > 0 - }) - }, - - deleteIndexingRules: async ( - { identifiers: indexingRuleIdentifiers }: { identifiers: IndexingRuleIdentifier[] }, - { models, defaults }: IndexerManagementResolverContext, - ): Promise => { - let totalNumDeleted = 0 - - // Sanitize protocol network identifiers - for (const identifier of indexingRuleIdentifiers) { - identifier.protocolNetwork = validateNetworkIdentifier(identifier.protocolNetwork) - } - - // Batch deletions by the `IndexingRuleIdentifier.protocolNetwork` attribute . - const batches = groupBy( - indexingRuleIdentifiers, - (x: IndexingRuleIdentifier) => x.protocolNetwork, - ) - - for (const protocolNetwork in batches) { - const batch = batches[protocolNetwork] - const identifiers = await Promise.all( - batch.map( - async ({ identifier }: IndexingRuleIdentifier) => - (await processIdentifier(identifier, { all: false, global: true }))[0], - ), - ) - // Execute deletion batch - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - await models.IndexingRule.sequelize!.transaction(async (transaction) => { - const numDeleted = await models.IndexingRule.destroy({ - where: { - identifier: identifiers, - protocolNetwork: protocolNetwork, - }, - transaction, - }) - - if (identifiers.includes('global')) { - const globalIdentifier = { identifier: 'global', protocolNetwork } - await resetGlobalRule( - globalIdentifier, - defaults.globalIndexingRule, - models, - transaction, - ) - } - totalNumDeleted += numDeleted - }) - } - return totalNumDeleted > 0 - }, -} diff --git a/packages/indexer-common/src/indexer-management/resolvers/poi-disputes.ts b/packages/indexer-common/src/indexer-management/resolvers/poi-disputes.ts deleted file mode 100644 index faf200fcd..000000000 --- a/packages/indexer-common/src/indexer-management/resolvers/poi-disputes.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ - -import { POIDispute, POIDisputeIdentifier, POIDisputeCreationAttributes } from '../models' -import { IndexerManagementResolverContext } from '../client' -import { validateNetworkIdentifier } from '../../parsers' -import { Op, WhereOptions } from 'sequelize' -import groupBy from 'lodash.groupby' - -export default { - dispute: async ( - { identifier }: { identifier: POIDisputeIdentifier }, - { models }: IndexerManagementResolverContext, - ): Promise => { - const dispute = await models.POIDispute.findOne({ - where: { ...identifier }, - }) - return dispute?.toGraphQL() || dispute - }, - - disputes: async ( - { - status, - minClosedEpoch, - protocolNetwork: uncheckedProtocolNetwork, - }: { status: string; minClosedEpoch: number; protocolNetwork: string | undefined }, - { models }: IndexerManagementResolverContext, - ): Promise => { - // Sanitize protocol network identifier - const protocolNetwork = uncheckedProtocolNetwork - ? validateNetworkIdentifier(uncheckedProtocolNetwork) - : undefined - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const sqlAndExpression: WhereOptions = [ - { status }, - { closedEpoch: { [Op.gte]: minClosedEpoch } }, - ] - - if (protocolNetwork) { - sqlAndExpression.push({ protocolNetwork }) - } - - const disputes = await models.POIDispute.findAll({ - where: { [Op.and]: sqlAndExpression }, - order: [['allocationAmount', 'DESC']], - }) - return disputes.map((dispute) => dispute.toGraphQL()) - }, - - storeDisputes: async ( - { disputes }: { disputes: POIDisputeCreationAttributes[] }, - { models }: IndexerManagementResolverContext, - ): Promise => { - // Sanitize protocol network identifiers - for (const dispute of disputes) { - if (!dispute.protocolNetwork) { - throw new Error(`Dispute is missing the attribute 'protocolNetwork'`) - } - dispute.protocolNetwork = validateNetworkIdentifier(dispute.protocolNetwork) - } - - const createdDisputes = await models.POIDispute.bulkCreate(disputes, { - returning: true, - validate: true, - updateOnDuplicate: [ - 'closedEpochReferenceProof', - 'previousEpochReferenceProof', - 'status', - ], - conflictAttributes: ['allocationID', 'protocolNetwork'], - }) - return createdDisputes.map((dispute: POIDispute) => dispute.toGraphQL()) - }, - - deleteDisputes: async ( - { identifiers }: { identifiers: POIDisputeIdentifier[] }, - { models }: IndexerManagementResolverContext, - ): Promise => { - let totalNumDeleted = 0 - - // Sanitize protocol network identifiers - for (const identifier of identifiers) { - if (!identifier.protocolNetwork) { - throw new Error(`Dispute is missing the attribute 'protocolNetwork'`) - } - identifier.protocolNetwork = validateNetworkIdentifier(identifier.protocolNetwork) - } - - // Batch by protocolNetwork - const batches = groupBy(identifiers, (x: POIDisputeIdentifier) => x.protocolNetwork) - - for (const protocolNetwork in batches) { - const batch = batches[protocolNetwork] - const numDeleted = await models.POIDispute.destroy({ - where: { - allocationID: batch.map((x) => x.allocationID), - }, - force: true, - }) - totalNumDeleted += numDeleted - } - return totalNumDeleted - }, -} diff --git a/packages/indexer-common/src/indexer-management/rules.ts b/packages/indexer-common/src/indexer-management/rules.ts index 656dd532b..642862bc9 100644 --- a/packages/indexer-common/src/indexer-management/rules.ts +++ b/packages/indexer-common/src/indexer-management/rules.ts @@ -2,17 +2,17 @@ import { Logger } from '@graphprotocol/common-ts' import { IndexerManagementModels, INDEXING_RULE_GLOBAL, - IndexingRule, IndexingRuleAttributes, } from '@graphprotocol/indexer-common' import { parseIndexingRule } from '../rules' import groupBy from 'lodash.groupby' +import { IndexingRule } from '../schema/types.generated' export const fetchIndexingRules = async ( models: IndexerManagementModels, merged: boolean, protocolNetwork?: string, -): Promise => { +) => { // If unspecified, select indexing rules from all protocol networks const whereClause = protocolNetwork ? { protocolNetwork } : {} const rules = await models.IndexingRule.findAll({ @@ -22,6 +22,7 @@ export const fetchIndexingRules = async ( ['identifier', 'ASC'], ], }) + if (merged) { // Merge rules by protocol network return Object.entries(groupBy(rules, (rule) => rule.protocolNetwork)) @@ -30,11 +31,11 @@ export const fetchIndexingRules = async ( if (!global) { throw Error(`Could not find global rule for network '${protocolNetwork}'`) } - return rules.map((rule) => rule.mergeGlobal(global)) + return rules.map((rule) => rule.mergeToGraphQL(global)) }) .flat() } else { - return rules + return rules.map((rule) => rule.toGraphQL()) } } @@ -54,5 +55,5 @@ export const upsertIndexingRule = async ( }, ) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return updatedRule! + return updatedRule.toGraphQL()! } diff --git a/packages/indexer-common/src/indexer-management/schema.graphql b/packages/indexer-common/src/indexer-management/schema.graphql new file mode 100644 index 000000000..aaf968b7f --- /dev/null +++ b/packages/indexer-common/src/indexer-management/schema.graphql @@ -0,0 +1,410 @@ +scalar BigInt + +enum OrderDirection { + asc + desc +} + +enum IndexingDecisionBasis { + rules + never + always + offchain +} + +enum IdentifierType { + deployment + subgraph + group +} + +input AllocationFilter { + status: String + allocation: String + subgraphDeployment: String + protocolNetwork: String +} + +enum AllocationStatus { + Null # == indexer == address(0) + Active # == not Null && tokens > 0 # + Closed # == Active && closedAtEpoch != 0. Still can collect, while you are waiting to be finalized. a.k.a settling + Finalized # == Closing && closedAtEpoch + channelDisputeEpochs > now(). Note, the subgraph has no way to return this value. it is implied + Claimed # == not Null && tokens == 0 - i.e. finalized, and all tokens withdrawn +} + +type Allocation { + id: String! + indexer: String! + subgraphDeployment: String! + allocatedTokens: String! + createdAtEpoch: Int! + closedAtEpoch: Int + ageInEpochs: Int! + closeDeadlineEpoch: Int! + closeDeadlineBlocksRemaining: Int! + closeDeadlineTimeRemaining: Int! + indexingRewards: String! + queryFeesCollected: String! + signalledTokens: BigInt! + stakedTokens: BigInt! + status: AllocationStatus! + protocolNetwork: String! +} + +type CreateAllocationResult { + allocation: String! + deployment: String! + allocatedTokens: String! + protocolNetwork: String! +} + +type CloseAllocationResult { + allocation: String! + allocatedTokens: String! + indexingRewards: String! + receiptsWorthCollecting: Boolean! + protocolNetwork: String! +} + +type ReallocateAllocationResult { + closedAllocation: String! + indexingRewardsCollected: String! + receiptsWorthCollecting: Boolean! + createdAllocation: String! + createdAllocationStake: String! + protocolNetwork: String! +} + +enum ActionStatus { + queued + approved + pending + success + failed + canceled +} + +enum ActionType { + allocate + unallocate + reallocate +} + +type Action { + id: Int! + status: ActionStatus! + type: ActionType! + deploymentID: String + allocationID: String + amount: String + poi: String + force: Boolean + priority: Int! + source: String! + reason: String! + transaction: String + failureReason: String + createdAt: BigInt! + updatedAt: BigInt + protocolNetwork: String! +} + +input ActionInput { + status: ActionStatus! + type: ActionType! + deploymentID: String + allocationID: String + amount: String + poi: String + force: Boolean + source: String! + reason: String! + priority: Int! + protocolNetwork: String! +} + +input ActionUpdateInput { + id: Int + deploymentID: String + allocationID: String + amount: String + poi: String + force: Boolean + type: ActionType + status: ActionStatus + reason: String +} + +enum ActionParams { + id + status + type + deploymentID + allocationID + transaction + amount + poi + force + source + reason + priority + createdAt + updatedAt + protocolNetwork +} + +type ActionResult { + id: Int! + type: ActionType! + deploymentID: String + allocationID: String + amount: String + poi: String + force: Boolean + source: String! + reason: String! + status: String! + transaction: String + failureReason: String + priority: Int + protocolNetwork: String! +} + +input ActionFilter { + id: Int + protocolNetwork: String + type: ActionType + status: String + source: String + reason: String +} + +input POIDisputeIdentifier { + allocationID: String! + protocolNetwork: String! +} + +type POIDispute { + allocationID: String! + subgraphDeploymentID: String! + allocationIndexer: String! + allocationAmount: BigInt! + allocationProof: String! + closedEpoch: Int! + closedEpochStartBlockHash: String! + closedEpochStartBlockNumber: Int! + closedEpochReferenceProof: String + previousEpochStartBlockHash: String! + previousEpochStartBlockNumber: Int! + previousEpochReferenceProof: String + status: String! + protocolNetwork: String! +} + +input POIDisputeInput { + allocationID: String! + subgraphDeploymentID: String! + allocationIndexer: String! + allocationAmount: BigInt! + allocationProof: String! + closedEpoch: Int! + closedEpochStartBlockHash: String! + closedEpochStartBlockNumber: Int! + closedEpochReferenceProof: String + previousEpochStartBlockHash: String! + previousEpochStartBlockNumber: Int! + previousEpochReferenceProof: String + status: String! + protocolNetwork: String! +} + +type IndexingRule { + identifier: String! + identifierType: IdentifierType! + allocationAmount: BigInt + allocationLifetime: Int + autoRenewal: Boolean! + parallelAllocations: Int + maxAllocationPercentage: Float + minSignal: BigInt + maxSignal: BigInt + minStake: BigInt + minAverageQueryFees: BigInt + custom: String + decisionBasis: IndexingDecisionBasis! + requireSupported: Boolean! + safety: Boolean! + protocolNetwork: String! +} + +input IndexingRuleInput { + identifier: String! + identifierType: IdentifierType! + allocationAmount: BigInt + allocationLifetime: Int + autoRenewal: Boolean + parallelAllocations: Int + maxAllocationPercentage: Float + minSignal: BigInt + maxSignal: BigInt + minStake: BigInt + minAverageQueryFees: BigInt + custom: String + decisionBasis: IndexingDecisionBasis + requireSupported: Boolean + safety: Boolean + protocolNetwork: String! +} + +input IndexingRuleIdentifier { + identifier: String! + protocolNetwork: String! +} + +type GeoLocation { + latitude: String! + longitude: String! +} + +type IndexerRegistration { + url: String + protocolNetwork: String! + address: String + registered: Boolean! + location: GeoLocation +} + +type IndexingError { + handler: String + message: String! +} + +type BlockPointer { + number: Int! + hash: String! +} + +type ChainIndexingStatus { + network: String! + latestBlock: BlockPointer + chainHeadBlock: BlockPointer + earliestBlock: BlockPointer +} + +type IndexerDeployment { + subgraphDeployment: String! + synced: Boolean! + health: String! + fatalError: IndexingError + node: String + chains: [ChainIndexingStatus] +} + +type IndexerAllocation { + id: String! + allocatedTokens: BigInt! + createdAtEpoch: Int! + closedAtEpoch: Int + subgraphDeployment: String! + signalledTokens: BigInt! + stakedTokens: BigInt! +} + +type IndexerEndpointTest { + test: String! + error: String + possibleActions: [String]! +} + +type IndexerEndpoint { + url: String + healthy: Boolean! + protocolNetwork: String! + tests: [IndexerEndpointTest!]! +} + +type IndexerEndpoints { + service: IndexerEndpoint! + status: IndexerEndpoint! +} + +type CostModel { + deployment: String! + model: String + variables: String +} + +input CostModelInput { + deployment: String! + model: String + variables: String +} + +type Query { + indexingRule( + identifier: IndexingRuleIdentifier! + merged: Boolean! = false + ): IndexingRule + indexingRules(merged: Boolean! = false, protocolNetwork: String): [IndexingRule!]! + indexerRegistration(protocolNetwork: String!): IndexerRegistration! + indexerDeployments: [IndexerDeployment]! + indexerAllocations(protocolNetwork: String!): [IndexerAllocation]! + indexerEndpoints(protocolNetwork: String): [IndexerEndpoints!]! + + costModels(deployments: [String!]): [CostModel!]! + costModel(deployment: String!): CostModel + + dispute(identifier: POIDisputeIdentifier!): POIDispute + disputes(status: String!, minClosedEpoch: Int!, protocolNetwork: String): [POIDispute]! + + allocations(filter: AllocationFilter!): [Allocation!]! + + action(actionID: String!): Action + actions( + filter: ActionFilter + orderBy: ActionParams + orderDirection: OrderDirection + first: Int + ): [Action]! +} + +type Mutation { + setIndexingRule(rule: IndexingRuleInput!): IndexingRule! + deleteIndexingRule(identifier: IndexingRuleIdentifier!): Boolean! + deleteIndexingRules(identifiers: [IndexingRuleIdentifier!]!): Boolean! + + setCostModel(costModel: CostModelInput!): CostModel! + deleteCostModels(deployments: [String!]!): Int! + + storeDisputes(disputes: [POIDisputeInput!]!): [POIDispute!] + deleteDisputes(identifiers: [POIDisputeIdentifier!]!): Int! + + createAllocation( + deployment: String! + amount: String! + indexNode: String + protocolNetwork: String! + ): CreateAllocationResult! + closeAllocation( + allocation: String! + poi: String + force: Boolean + protocolNetwork: String! + ): CloseAllocationResult! + reallocateAllocation( + allocation: String! + poi: String + amount: String! + force: Boolean + protocolNetwork: String! + ): ReallocateAllocationResult! + submitCollectReceiptsJob(allocation: String!, protocolNetwork: String!): Boolean! + + updateActions(filter: ActionFilter!, action: ActionUpdateInput!): [Action]! + queueActions(actions: [ActionInput!]!): [Action]! + cancelActions(actionIDs: [String!]!): [Action]! + deleteActions(actionIDs: [String!]!): Int! + approveActions(actionIDs: [String!]!): [Action]! + executeApprovedActions: [ActionResult!]! +} diff --git a/packages/indexer-common/src/indexer-management/server.ts b/packages/indexer-common/src/indexer-management/server.ts index c5c6d028d..c34d57c33 100644 --- a/packages/indexer-common/src/indexer-management/server.ts +++ b/packages/indexer-common/src/indexer-management/server.ts @@ -5,12 +5,12 @@ import bodyParser from 'body-parser' import morgan from 'morgan' import { Logger } from '@graphprotocol/common-ts' -import { IndexerManagementClient } from './client' import http from 'http' +import { IndexerManagementYogaClient } from './yoga' export interface CreateIndexerManagementServerOptions { logger: Logger - client: IndexerManagementClient + client: IndexerManagementYogaClient port: number } @@ -41,17 +41,7 @@ export const createIndexerManagementServer = async ({ // GraphQL endpoint app.post('/', bodyParser.json(), async (req, res) => { - const { query, variables } = req.body - - const result = query.startsWith('mutation') - ? await client.mutation(query, variables).toPromise() - : await client.query(query, variables).toPromise() - - res.status(200).send({ - data: result.data, - errors: result.error ? result.error.graphQLErrors : null, - extensions: result.extensions, - }) + return client.yoga.handle(req, res) }) const server = app.listen(port, () => { diff --git a/packages/indexer-common/src/indexer-management/yoga.ts b/packages/indexer-common/src/indexer-management/yoga.ts new file mode 100644 index 000000000..8aa3d9115 --- /dev/null +++ b/packages/indexer-common/src/indexer-management/yoga.ts @@ -0,0 +1,79 @@ +import { createYoga, createSchema } from 'graphql-yoga' +import { typeDefs } from '../schema/typeDefs.generated' +import { resolvers } from '../schema/resolvers.generated' +import { IndexerManagementDefaults, IndexerManagementResolverContext } from './context' +import { Logger, WritableEventual, equal, mutable } from '@graphprotocol/common-ts' +import { ActionManager } from './actions' +import { Op, Sequelize } from 'sequelize' +import { IndexerManagementModels } from './models' +import { GraphNode } from '../graph-node' +import { MultiNetworks } from '../multi-networks' +import { Network } from '../network' + +interface IndexerManagementClientOptions { + logger: Logger + models: IndexerManagementModels + graphNode: GraphNode + multiNetworks: MultiNetworks | undefined + defaults: IndexerManagementDefaults +} + +export async function createIndexerManagementYogaClient( + options: IndexerManagementClientOptions, +) { + const { models, graphNode, logger, defaults, multiNetworks } = options + + const dai: WritableEventual = mutable() + + const actionManager = multiNetworks + ? await ActionManager.create(multiNetworks, logger, models, graphNode) + : undefined + + async function setDai(value: string): Promise { + // Get current value + const oldValue = dai.valueReady ? await dai.value() : undefined + + // Don't do anything if there is no change + if (equal(oldValue, value)) { + return + } + + // Notify others of the new value + dai.push(value) + + // Update DAI in all cost models + const update = `'${JSON.stringify({ DAI: value })}'::jsonb` + await models.CostModel.update( + { + // This merges DAI into the variables, overwriting existing values + variables: Sequelize.literal(`coalesce(variables, '{}'::jsonb) || ${update}`), + }, + { + // TODO: update to match all rows?? + where: { model: { [Op.not]: null } }, + }, + ) + } + + return { + setDai, + yoga: createYoga({ + graphqlEndpoint: '*', + schema: createSchema({ typeDefs, resolvers }), + maskedErrors: false, + context: { + models, + graphNode, + defaults, + logger: logger.child({ component: 'IndexerManagementClient' }), + dai, + multiNetworks, + actionManager, + }, + }), + } +} + +export type IndexerManagementYogaClient = Awaited< + ReturnType +> diff --git a/packages/indexer-common/src/operator.ts b/packages/indexer-common/src/operator.ts index 1d97904c4..4ef455ce7 100644 --- a/packages/indexer-common/src/operator.ts +++ b/packages/indexer-common/src/operator.ts @@ -1,27 +1,31 @@ import { - ActionFilter, ActionItem, ActionResult, - ActionStatus, - ActionType, Allocation, AllocationDecision, AllocationManagementMode, INDEXING_RULE_GLOBAL, IndexerErrorCode, - IndexerManagementClient, IndexingRuleAttributes, - SubgraphIdentifierType, indexerError, specification as spec, Action, POIDisputeAttributes, + GeneratedGraphQLTypes, + IndexerManagementYogaClient, } from '@graphprotocol/indexer-common' import { Logger, formatGRT } from '@graphprotocol/common-ts' import { BigNumber, utils } from 'ethers' import gql from 'graphql-tag' import pMap from 'p-map' -import { CombinedError } from '@urql/core' +import { + ActionFilter, + ActionStatus, + ActionType, + IdentifierType, +} from './schema/types.generated' +import { buildHTTPExecutor } from '@graphql-tools/executor-http' +import { isAsyncIterable } from 'graphql-yoga' const POI_DISPUTES_CONVERTERS_FROM_GRAPHQL: Record< keyof POIDisputeAttributes, @@ -66,12 +70,13 @@ const disputeFromGraphQL = ( // POI disputes. export class Operator { logger: Logger - indexerManagement: IndexerManagementClient + indexerManagement: IndexerManagementYogaClient specification: spec.NetworkSpecification + private executor: ReturnType constructor( logger: Logger, - indexerManagement: IndexerManagementClient, + indexerManagement: IndexerManagementYogaClient, specification: spec.NetworkSpecification, ) { this.logger = logger.child({ @@ -80,45 +85,51 @@ export class Operator { }) this.indexerManagement = indexerManagement this.specification = specification + this.executor = buildHTTPExecutor({ + fetch: this.indexerManagement.yoga.fetch, + }) } // -------------------------------------------------------------------------------- // * Indexing Rules // -------------------------------------------------------------------------------- // Retrieves the indexing rules from the indexer management API. - async indexingRules(merged: boolean): Promise { + async indexingRules(merged: boolean): Promise { try { this.logger.debug('Fetching indexing rules') - const result = await this.indexerManagement - .query( - gql` - query indexingRules($merged: Boolean!, $protocolNetwork: String) { - indexingRules(merged: $merged, protocolNetwork: $protocolNetwork) { - identifier - identifierType - allocationAmount - allocationLifetime - autoRenewal - parallelAllocations - maxAllocationPercentage - minSignal - maxSignal - minStake - minAverageQueryFees - custom - decisionBasis - requireSupported - protocolNetwork - } + const result = await this.executor({ + document: gql` + query indexingRules($merged: Boolean!, $protocolNetwork: String) { + indexingRules(merged: $merged, protocolNetwork: $protocolNetwork) { + identifier + identifierType + allocationAmount + allocationLifetime + autoRenewal + parallelAllocations + maxAllocationPercentage + minSignal + maxSignal + minStake + minAverageQueryFees + custom + decisionBasis + requireSupported + protocolNetwork } - `, - { merged, protocolNetwork: this.specification.networkIdentifier }, - ) - .toPromise() + } + `, + variables: { merged, protocolNetwork: this.specification.networkIdentifier }, + }) - if (result.error) { - throw result.error + if (isAsyncIterable(result)) { + throw Error('Result is an async iterable') } + + if (result.errors) { + throw result.errors + } + this.logger.trace('Fetched indexing rules', { count: result.data.indexingRules.length, rules: result.data.indexingRules.map((rule: IndexingRuleAttributes) => { @@ -144,30 +155,32 @@ export class Operator { protocolNetwork: this.specification.networkIdentifier, } try { - const globalRule = await this.indexerManagement - .query( - gql` - query indexingRule($identifier: IndexingRuleIdentifier!) { - indexingRule(identifier: $identifier, merged: false) { - identifier - identifierType - allocationAmount - decisionBasis - requireSupported - protocolNetwork - } + const globalRule = await this.executor({ + document: gql` + query indexingRule($identifier: IndexingRuleIdentifier!) { + indexingRule(identifier: $identifier, merged: false) { + identifier + identifierType + allocationAmount + decisionBasis + requireSupported + protocolNetwork } - `, - { identifier }, - ) - .toPromise() + } + `, + variables: { identifier }, + }) + + if (isAsyncIterable(globalRule)) { + throw Error('Result is an async iterable') + } if (!globalRule.data.indexingRule) { this.logger.info(`Creating default "global" indexing rule`) const defaults = { ...identifier, - identifierType: SubgraphIdentifierType.GROUP, + identifierType: IdentifierType.group, allocationAmount: this.specification.indexerOptions.defaultAllocationAmount.toString(), parallelAllocations: 1, @@ -176,36 +189,38 @@ export class Operator { safety: true, } - const defaultGlobalRule = await this.indexerManagement - .mutation( - gql` - mutation setIndexingRule($rule: IndexingRuleInput!) { - setIndexingRule(rule: $rule) { - identifier - identifierType - allocationAmount - allocationLifetime - autoRenewal - parallelAllocations - maxAllocationPercentage - minSignal - maxSignal - minStake - minAverageQueryFees - custom - decisionBasis - requireSupported - safety - protocolNetwork - } + const defaultGlobalRule = await this.executor({ + document: gql` + mutation setIndexingRule($rule: IndexingRuleInput!) { + setIndexingRule(rule: $rule) { + identifier + identifierType + allocationAmount + allocationLifetime + autoRenewal + parallelAllocations + maxAllocationPercentage + minSignal + maxSignal + minStake + minAverageQueryFees + custom + decisionBasis + requireSupported + safety + protocolNetwork } - `, - { rule: defaults }, - ) - .toPromise() + } + `, + variables: { rule: defaults }, + }) + + if (isAsyncIterable(defaultGlobalRule)) { + throw Error('Result is an async iterable') + } - if (defaultGlobalRule.error) { - throw defaultGlobalRule.error + if (defaultGlobalRule.errors) { + throw defaultGlobalRule.errors } this.logger.info(`Created default "global" indexing rule`, { @@ -226,48 +241,50 @@ export class Operator { // -------------------------------------------------------------------------------- async fetchActions(actionFilter: ActionFilter): Promise { - const result = await this.indexerManagement - .query( - gql` - query actions($filter: ActionFilter!) { - actions(filter: $filter) { - id - type - allocationID - deploymentID - amount - poi - force - source - reason - priority - transaction - status - failureReason - } + const result = await this.executor({ + document: gql` + query actions($filter: ActionFilter!) { + actions(filter: $filter) { + id + type + allocationID + deploymentID + amount + poi + force + source + reason + priority + transaction + status + failureReason } - `, - { filter: actionFilter }, - ) - .toPromise() + } + `, + variables: { filter: actionFilter }, + }) - if (result.error) { - throw result.error + if (isAsyncIterable(result)) { + throw Error('Result is an async iterable') + } + + if (result.errors) { + throw result.errors } return result.data.actions } async queueAction(action: ActionItem): Promise { - let status = ActionStatus.QUEUED + let status: ActionStatus = ActionStatus.queued switch (this.specification.indexerOptions.allocationManagementMode) { case AllocationManagementMode.MANUAL: throw Error(`Cannot queue actions when AllocationManagementMode = 'MANUAL'`) case AllocationManagementMode.AUTO: - status = ActionStatus.APPROVED + status = ActionStatus.approved break case AllocationManagementMode.OVERSIGHT: - status = ActionStatus.QUEUED + status = ActionStatus.queued } const actionInput = { @@ -282,42 +299,50 @@ export class Operator { this.logger.trace(`Queueing action input`, { actionInput, }) - const actionResult = await this.indexerManagement - .mutation( - gql` - mutation queueActions($actions: [ActionInput!]!) { - queueActions(actions: $actions) { - id - type - deploymentID - source - reason - priority - status - protocolNetwork - } + + const actionResult = await this.executor({ + document: gql` + mutation queueActions($actions: [ActionInput!]!) { + queueActions(actions: $actions) { + id + type + deploymentID + source + reason + priority + status + protocolNetwork } - `, - { actions: [actionInput] }, - ) - .toPromise() - - if (actionResult.error) { - if (actionResult.error instanceof CombinedError) { - if (actionResult.error.message.includes('Duplicate')) { - this.logger.warn( - `Action not queued: Already a queued action targeting ${actionInput.deploymentID} from another source`, - { action }, - ) - } else if (actionResult.error.message.includes('Recently executed')) { - this.logger.warn( - `Action not queued: A recently executed action was found targeting ${actionInput.deploymentID}`, - { action }, - ) } + `, + variables: { actions: [actionInput] }, + }) + + if (isAsyncIterable(actionResult)) { + throw Error('Result is an async iterable') + } + + if (actionResult.errors) { + if (actionResult.errors.filter((e) => e.message.includes('Duplicate')).length > 0) { + this.logger.warn( + `Action not queued: Already a queued action targeting ${actionInput.deploymentID} from another source`, + { action }, + ) + return [] + } + + if ( + actionResult.errors.filter((e) => e.message.includes('Recently executed')) + .length > 0 + ) { + this.logger.warn( + `Action not queued: A recently executed action was found targeting ${actionInput.deploymentID}`, + { action }, + ) return [] } - throw actionResult.error + + throw actionResult.errors } if (actionResult.data.queueActions.length > 0) { @@ -369,7 +394,7 @@ export class Operator { deploymentID: deploymentAllocationDecision.deployment.ipfsHash, amount: formatGRT(desiredAllocationAmount), }, - type: ActionType.ALLOCATE, + type: ActionType.allocate, reason: deploymentAllocationDecision.reasonString(), protocolNetwork: deploymentAllocationDecision.protocolNetwork, }) @@ -407,7 +432,7 @@ export class Operator { poi: undefined, force: false, }, - type: ActionType.UNALLOCATE, + type: ActionType.unallocate, reason: deploymentAllocationDecision.reasonString(), protocolNetwork: deploymentAllocationDecision.protocolNetwork, } as ActionItem) @@ -443,7 +468,7 @@ export class Operator { deploymentID: deploymentAllocationDecision.deployment.ipfsHash, amount: formatGRT(desiredAllocationAmount), }, - type: ActionType.REALLOCATE, + type: ActionType.reallocate, reason: `${deploymentAllocationDecision.reasonString()}:allocationExpiring`, // Need to update to include 'ExpiringSoon' protocolNetwork: deploymentAllocationDecision.protocolNetwork, }) @@ -472,34 +497,36 @@ export class Operator { disputes: POIDisputeAttributes[], ): Promise { try { - const result = await this.indexerManagement - .mutation( - gql` - mutation storeDisputes($disputes: [POIDisputeInput!]!) { - storeDisputes(disputes: $disputes) { - allocationID - subgraphDeploymentID - allocationIndexer - allocationAmount - allocationProof - closedEpoch - closedEpochStartBlockHash - closedEpochStartBlockNumber - closedEpochReferenceProof - previousEpochStartBlockHash - previousEpochStartBlockNumber - previousEpochReferenceProof - status - protocolNetwork - } + const result = await this.executor({ + document: gql` + mutation storeDisputes($disputes: [POIDisputeInput!]!) { + storeDisputes(disputes: $disputes) { + allocationID + subgraphDeploymentID + allocationIndexer + allocationAmount + allocationProof + closedEpoch + closedEpochStartBlockHash + closedEpochStartBlockNumber + closedEpochReferenceProof + previousEpochStartBlockHash + previousEpochStartBlockNumber + previousEpochReferenceProof + status + protocolNetwork } - `, - { disputes: disputes }, - ) - .toPromise() + } + `, + variables: { disputes: disputes }, + }) + + if (isAsyncIterable(result)) { + throw Error('Result is an async iterable') + } - if (result.error) { - throw result.error + if (result.errors) { + throw result.errors } return result.data.storeDisputes.map( @@ -523,46 +550,48 @@ export class Operator { protocolNetwork: string | undefined, ): Promise { try { - const result = await this.indexerManagement - .query( - gql` - query disputes( - $status: String! - $minClosedEpoch: Int! - $protocolNetwork: String! + const result = await this.executor({ + document: gql` + query disputes( + $status: String! + $minClosedEpoch: Int! + $protocolNetwork: String! + ) { + disputes( + status: $status + minClosedEpoch: $minClosedEpoch + protocolNetwork: $protocolNetwork ) { - disputes( - status: $status - minClosedEpoch: $minClosedEpoch - protocolNetwork: $protocolNetwork - ) { - allocationID - subgraphDeploymentID - allocationIndexer - allocationAmount - allocationProof - closedEpoch - closedEpochStartBlockHash - closedEpochStartBlockNumber - closedEpochReferenceProof - previousEpochStartBlockHash - previousEpochStartBlockNumber - previousEpochReferenceProof - status - protocolNetwork - } + allocationID + subgraphDeploymentID + allocationIndexer + allocationAmount + allocationProof + closedEpoch + closedEpochStartBlockHash + closedEpochStartBlockNumber + closedEpochReferenceProof + previousEpochStartBlockHash + previousEpochStartBlockNumber + previousEpochReferenceProof + status + protocolNetwork } - `, - { - status, - minClosedEpoch, - protocolNetwork, - }, - ) - .toPromise() + } + `, + variables: { + status, + minClosedEpoch, + protocolNetwork, + }, + }) + + if (isAsyncIterable(result)) { + throw Error('Result is an async iterable') + } - if (result.error) { - throw result.error + if (result.errors) { + throw result.errors } return result.data.disputes.map( diff --git a/packages/indexer-common/src/rules.ts b/packages/indexer-common/src/rules.ts index e03bfd40e..5140ca5ae 100644 --- a/packages/indexer-common/src/rules.ts +++ b/packages/indexer-common/src/rules.ts @@ -1,7 +1,8 @@ -import { IndexingDecisionBasis, IndexingRuleAttributes } from './indexer-management' +import { IndexingRuleAttributes } from './indexer-management' import { nullPassThrough, parseBoolean } from './utils' import { parseGRT } from '@graphprotocol/common-ts' import { validateNetworkIdentifier } from './parsers' +import { IndexingDecisionBasis } from './schema/types.generated' export const parseDecisionBasis = (s: string): IndexingDecisionBasis => { if (!['always', 'never', 'rules', 'offchain'].includes(s)) { diff --git a/packages/indexer-common/src/schema/.gitignore b/packages/indexer-common/src/schema/.gitignore new file mode 100644 index 000000000..c61f4a4a4 --- /dev/null +++ b/packages/indexer-common/src/schema/.gitignore @@ -0,0 +1 @@ +*.generated.ts diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Action.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Action.ts new file mode 100644 index 000000000..5c27ab6ea --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Action.ts @@ -0,0 +1,4 @@ +import type { ActionResolvers } from './../../types.generated' +export const Action: ActionResolvers = { + /* Implement Action resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/ActionResult.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/ActionResult.ts new file mode 100644 index 000000000..d762c6591 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/ActionResult.ts @@ -0,0 +1,4 @@ +import type { ActionResultResolvers } from './../../types.generated' +export const ActionResult: ActionResultResolvers = { + /* Implement ActionResult resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Allocation.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Allocation.ts new file mode 100644 index 000000000..9a602c8d0 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Allocation.ts @@ -0,0 +1,4 @@ +import type { AllocationResolvers } from './../../types.generated' +export const Allocation: AllocationResolvers = { + /* Implement Allocation resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/BigInt.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/BigInt.ts new file mode 100644 index 000000000..9bcc010bd --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/BigInt.ts @@ -0,0 +1,3 @@ +import { BigIntResolver } from 'graphql-scalars' + +export const BigInt = BigIntResolver diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/BlockPointer.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/BlockPointer.ts new file mode 100644 index 000000000..49e2ce4d3 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/BlockPointer.ts @@ -0,0 +1,4 @@ +import type { BlockPointerResolvers } from './../../types.generated' +export const BlockPointer: BlockPointerResolvers = { + /* Implement BlockPointer resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/ChainIndexingStatus.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/ChainIndexingStatus.ts new file mode 100644 index 000000000..9dfce06ea --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/ChainIndexingStatus.ts @@ -0,0 +1,4 @@ +import type { ChainIndexingStatusResolvers } from './../../types.generated' +export const ChainIndexingStatus: ChainIndexingStatusResolvers = { + /* Implement ChainIndexingStatus resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/CloseAllocationResult.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/CloseAllocationResult.ts new file mode 100644 index 000000000..38f028aaf --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/CloseAllocationResult.ts @@ -0,0 +1,4 @@ +import type { CloseAllocationResultResolvers } from './../../types.generated' +export const CloseAllocationResult: CloseAllocationResultResolvers = { + /* Implement CloseAllocationResult resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/CostModel.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/CostModel.ts new file mode 100644 index 000000000..826067081 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/CostModel.ts @@ -0,0 +1,4 @@ +import type { CostModelResolvers } from './../../types.generated' +export const CostModel: CostModelResolvers = { + /* Implement CostModel resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/CreateAllocationResult.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/CreateAllocationResult.ts new file mode 100644 index 000000000..3400c6f16 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/CreateAllocationResult.ts @@ -0,0 +1,4 @@ +import type { CreateAllocationResultResolvers } from './../../types.generated' +export const CreateAllocationResult: CreateAllocationResultResolvers = { + /* Implement CreateAllocationResult resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/GeoLocation.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/GeoLocation.ts new file mode 100644 index 000000000..1f58baee8 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/GeoLocation.ts @@ -0,0 +1,4 @@ +import type { GeoLocationResolvers } from './../../types.generated' +export const GeoLocation: GeoLocationResolvers = { + /* Implement GeoLocation resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerAllocation.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerAllocation.ts new file mode 100644 index 000000000..a6ac46472 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerAllocation.ts @@ -0,0 +1,4 @@ +import type { IndexerAllocationResolvers } from './../../types.generated' +export const IndexerAllocation: IndexerAllocationResolvers = { + /* Implement IndexerAllocation resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerDeployment.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerDeployment.ts new file mode 100644 index 000000000..9d426ff46 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerDeployment.ts @@ -0,0 +1,4 @@ +import type { IndexerDeploymentResolvers } from './../../types.generated' +export const IndexerDeployment: IndexerDeploymentResolvers = { + /* Implement IndexerDeployment resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpoint.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpoint.ts new file mode 100644 index 000000000..c9e2bb963 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpoint.ts @@ -0,0 +1,4 @@ +import type { IndexerEndpointResolvers } from './../../types.generated' +export const IndexerEndpoint: IndexerEndpointResolvers = { + /* Implement IndexerEndpoint resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpointTest.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpointTest.ts new file mode 100644 index 000000000..f33ac8f93 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpointTest.ts @@ -0,0 +1,4 @@ +import type { IndexerEndpointTestResolvers } from './../../types.generated' +export const IndexerEndpointTest: IndexerEndpointTestResolvers = { + /* Implement IndexerEndpointTest resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpoints.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpoints.ts new file mode 100644 index 000000000..df96b5391 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerEndpoints.ts @@ -0,0 +1,4 @@ +import type { IndexerEndpointsResolvers } from './../../types.generated' +export const IndexerEndpoints: IndexerEndpointsResolvers = { + /* Implement IndexerEndpoints resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerRegistration.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerRegistration.ts new file mode 100644 index 000000000..e4ede2e34 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexerRegistration.ts @@ -0,0 +1,4 @@ +import type { IndexerRegistrationResolvers } from './../../types.generated' +export const IndexerRegistration: IndexerRegistrationResolvers = { + /* Implement IndexerRegistration resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/IndexingError.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexingError.ts new file mode 100644 index 000000000..3a4916c17 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexingError.ts @@ -0,0 +1,4 @@ +import type { IndexingErrorResolvers } from './../../types.generated' +export const IndexingError: IndexingErrorResolvers = { + /* Implement IndexingError resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/IndexingRule.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexingRule.ts new file mode 100644 index 000000000..4ec62a436 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/IndexingRule.ts @@ -0,0 +1,4 @@ +import type { IndexingRuleResolvers } from './../../types.generated' +export const IndexingRule: IndexingRuleResolvers = { + /* Implement IndexingRule resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/approveActions.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/approveActions.ts new file mode 100644 index 000000000..bfd15e252 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/approveActions.ts @@ -0,0 +1,22 @@ +import { type MutationResolvers } from './../../../types.generated' + +// @ts-expect-error it be like that +export const approveActions: NonNullable = async ( + _parent, + { actionIDs }, + { logger, models }, +) => { + logger.debug(`Execute 'approveActions' mutation`, { + actionIDs, + }) + const [, updatedActions] = await models.Action.update( + { status: 'approved' }, + { where: { id: actionIDs }, returning: true }, + ) + + if (updatedActions.length === 0) { + throw Error(`Approve action failed: No action items found with id in [${actionIDs}]`) + } + + return updatedActions +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/cancelActions.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/cancelActions.ts new file mode 100644 index 000000000..2ea8eb60e --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/cancelActions.ts @@ -0,0 +1,22 @@ +import type { MutationResolvers } from './../../../types.generated' + +// @ts-expect-error need to fix +export const cancelActions: NonNullable = async ( + _parent, + { actionIDs }, + { logger, models }, +) => { + logger.debug(`Execute 'cancelActions' mutation`, { + actionIDs, + }) + const [, canceledActions] = await models.Action.update( + { status: 'canceled' }, + { where: { id: actionIDs }, returning: true }, + ) + + if (canceledActions.length === 0) { + throw Error(`Cancel action failed: No action items found with id in [${actionIDs}]`) + } + + return canceledActions +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/closeAllocation.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/closeAllocation.ts new file mode 100644 index 000000000..988bbe92d --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/closeAllocation.ts @@ -0,0 +1,156 @@ +import { extractNetwork } from '../utils' +import { + IdentifierType, + IndexingDecisionBasis, + type MutationResolvers, +} from './../../../types.generated' +import { IndexerErrorCode, indexerError } from '../../../../errors' +import { formatGRT } from '@graphprotocol/common-ts' + +export const closeAllocation: NonNullable = async ( + _parent, + { protocolNetwork, allocation, poi, force }, + { multiNetworks, logger, models }, +) => { + logger.debug('Execute closeAllocation() mutation', { + allocationID: allocation, + poi: poi || 'none provided', + }) + if (!multiNetworks) { + throw Error('IndexerManagementClient must be in `network` mode to fetch allocations') + } + const network = extractNetwork(protocolNetwork, multiNetworks) + const networkMonitor = network.networkMonitor + const contracts = network.contracts + const transactionManager = network.transactionManager + const receiptCollector = network.receiptCollector + + const allocationData = await networkMonitor.allocation(allocation) + + try { + poi = await networkMonitor.resolvePOI( + allocationData, + poi || undefined, + Boolean(force), + ) + + // Double-check whether the allocation is still active on chain, to + // avoid unnecessary transactions. + // Note: We're checking the allocation state here, which is defined as + // + // enum AllocationState { Null, Active, Closed, Finalized } + // + // in the contracts. + const state = await contracts.staking.getAllocationState(allocationData.id) + if (state !== 1) { + throw indexerError(IndexerErrorCode.IE065, 'Allocation has already been closed') + } + + logger.debug('Sending closeAllocation transaction') + const receipt = await transactionManager.executeTransaction( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + () => contracts.staking.estimateGas.closeAllocation(allocationData.id, poi!), + (gasLimit) => + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + contracts.staking.closeAllocation(allocationData.id, poi!, { + gasLimit, + }), + logger, + ) + + if (receipt === 'paused' || receipt === 'unauthorized') { + throw indexerError( + IndexerErrorCode.IE062, + `Allocation '${allocationData.id}' could not be closed: ${receipt}`, + ) + } + + const closeAllocationEventLogs = transactionManager.findEvent( + 'AllocationClosed', + contracts.staking.interface, + 'allocationID', + allocation, + receipt, + logger, + ) + + if (!closeAllocationEventLogs) { + throw indexerError( + IndexerErrorCode.IE015, + `Allocation close transaction was never successfully mined`, + ) + } + + const rewardsEventLogs = transactionManager.findEvent( + 'RewardsAssigned', + contracts.rewardsManager.interface, + 'allocationID', + allocation, + receipt, + logger, + ) + + const rewardsAssigned = rewardsEventLogs ? rewardsEventLogs.amount : 0 + + if (rewardsAssigned == 0) { + logger.warn('No rewards were distributed upon closing the allocation') + } + + logger.info(`Successfully closed allocation`, { + deployment: closeAllocationEventLogs.subgraphDeploymentID, + allocation: closeAllocationEventLogs.allocationID, + indexer: closeAllocationEventLogs.indexer, + amountGRT: formatGRT(closeAllocationEventLogs.tokens), + effectiveAllocation: closeAllocationEventLogs.effectiveAllocation.toString(), + poi: closeAllocationEventLogs.poi, + epoch: closeAllocationEventLogs.epoch.toString(), + transaction: receipt.transactionHash, + indexingRewards: rewardsAssigned, + }) + + logger.info('Identifying receipts worth collecting', { + allocation: closeAllocationEventLogs.allocationID, + }) + + // Collect query fees for this allocation + const isCollectingQueryFees = await receiptCollector.collectReceipts( + 0, + allocationData, + ) + + logger.debug( + `Updating indexing rules, so indexer-agent keeps the deployment synced but doesn't reallocate to it`, + ) + const offchainIndexingRule = { + protocolNetwork: network.specification.networkIdentifier, + identifier: allocationData.subgraphDeployment.id.ipfsHash, + identifierType: IdentifierType.deployment, + decisionBasis: IndexingDecisionBasis.offchain, + } + + await models.IndexingRule.upsert(offchainIndexingRule) + + // Since upsert succeeded, we _must_ have a rule + const updatedRule = await models.IndexingRule.findOne({ + where: { identifier: offchainIndexingRule.identifier }, + }) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + logger.info(`DecisionBasis.OFFCHAIN rule merged into indexing rules`, { + rule: updatedRule, + }) + + return { + actionID: 0, + type: 'unallocate', + transactionID: receipt.transactionHash, + allocation: closeAllocationEventLogs.allocationID, + allocatedTokens: formatGRT(closeAllocationEventLogs.tokens), + indexingRewards: formatGRT(rewardsAssigned), + receiptsWorthCollecting: isCollectingQueryFees, + protocolNetwork: network.specification.networkIdentifier, + } + } catch (error) { + logger.error(error.toString()) + throw error + } +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/createAllocation.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/createAllocation.ts new file mode 100644 index 000000000..cde0f8603 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/createAllocation.ts @@ -0,0 +1,239 @@ +import { extractNetwork } from '../utils' +import { + IdentifierType, + IndexingDecisionBasis, + type MutationResolvers, +} from './../../../types.generated' +import { SubgraphDeploymentID, formatGRT, parseGRT } from '@graphprotocol/common-ts' +import { AllocationStatus } from '../../../../allocations/types' +import { IndexerErrorCode, indexerError } from '../../../../errors' +import { allocationIdProof, uniqueAllocationID } from '../../../../allocations/keys' +import { utils } from 'ethers' + +export const createAllocation: NonNullable< + MutationResolvers['createAllocation'] +> = async ( + _parent, + { deployment, amount, protocolNetwork }, + { logger, multiNetworks, graphNode, models }, +) => { + logger.debug('Execute createAllocation() mutation', { + deployment, + amount, + protocolNetwork, + }) + if (!multiNetworks) { + throw Error('IndexerManagementClient must be in `network` mode to fetch allocations') + } + const network = extractNetwork(protocolNetwork, multiNetworks) + const networkMonitor = network.networkMonitor + const contracts = network.contracts + const transactionManager = network.transactionManager + const address = network.specification.indexerOptions.address + + const allocationAmount = parseGRT(amount) + const subgraphDeployment = new SubgraphDeploymentID(deployment) + + const activeAllocations = await networkMonitor.allocations(AllocationStatus.ACTIVE) + + const allocation = activeAllocations.find( + (allocation) => + allocation.subgraphDeployment.id.toString() === subgraphDeployment.toString(), + ) + if (allocation) { + logger.warn('Already allocated to deployment', { + deployment: allocation.subgraphDeployment.id.ipfsHash, + activeAllocation: allocation.id, + }) + throw indexerError( + IndexerErrorCode.IE060, + `Allocation failed. An active allocation already exists for deployment '${allocation.subgraphDeployment.id.ipfsHash}'`, + ) + } + + if (allocationAmount.lt('0')) { + logger.warn('Cannot allocate a negative amount of GRT', { + amount: formatGRT(allocationAmount), + }) + throw indexerError( + IndexerErrorCode.IE061, + `Invalid allocation amount provided (${amount.toString()}). Must use positive allocation amount`, + ) + } + + try { + const currentEpoch = await contracts.epochManager.currentEpoch() + + // Identify how many GRT the indexer has staked + const freeStake = await contracts.staking.getIndexerCapacity(address) + + // If there isn't enough left for allocating, abort + if (freeStake.lt(allocationAmount)) { + logger.error( + `Allocation of ${formatGRT( + allocationAmount, + )} GRT cancelled: indexer only has a free stake amount of ${formatGRT( + freeStake, + )} GRT`, + ) + throw indexerError( + IndexerErrorCode.IE013, + `Allocation of ${formatGRT( + allocationAmount, + )} GRT cancelled: indexer only has a free stake amount of ${formatGRT( + freeStake, + )} GRT`, + ) + } + + // Ensure subgraph is deployed before allocating + await graphNode.ensure( + `indexer-agent/${subgraphDeployment.ipfsHash.slice(-10)}`, + subgraphDeployment, + ) + + logger.debug('Obtain a unique Allocation ID') + + // Obtain a unique allocation ID + const { allocationSigner, allocationId } = uniqueAllocationID( + transactionManager.wallet.mnemonic.phrase, + currentEpoch.toNumber(), + subgraphDeployment, + activeAllocations.map((allocation) => allocation.id), + ) + + // Double-check whether the allocationID already exists on chain, to + // avoid unnecessary transactions. + // Note: We're checking the allocation state here, which is defined as + // + // enum AllocationState { Null, Active, Closed, Finalized } + // + // in the contracts. + const state = await contracts.staking.getAllocationState(allocationId) + if (state !== 0) { + logger.debug(`Skipping allocation as it already exists onchain`, { + indexer: address, + allocation: allocationId, + state, + }) + throw indexerError( + IndexerErrorCode.IE066, + `Allocation '${allocationId}' already exists onchain`, + ) + } + + logger.debug('Generating new allocation ID proof', { + newAllocationSigner: allocationSigner, + newAllocationID: allocationId, + indexerAddress: address, + }) + + const proof = await allocationIdProof(allocationSigner, address, allocationId) + + logger.debug('Successfully generated allocation ID proof', { + allocationIDProof: proof, + }) + + logger.debug(`Sending allocateFrom transaction`, { + indexer: address, + subgraphDeployment: subgraphDeployment.ipfsHash, + amount: formatGRT(allocationAmount), + allocation: allocationId, + proof, + protocolNetwork, + }) + + const receipt = await transactionManager.executeTransaction( + async () => + contracts.staking.estimateGas.allocateFrom( + address, + subgraphDeployment.bytes32, + allocationAmount, + allocationId, + utils.hexlify(Array(32).fill(0)), + proof, + ), + async (gasLimit) => + contracts.staking.allocateFrom( + address, + subgraphDeployment.bytes32, + allocationAmount, + allocationId, + utils.hexlify(Array(32).fill(0)), + proof, + { gasLimit }, + ), + logger.child({ action: 'allocate' }), + ) + + if (receipt === 'paused' || receipt === 'unauthorized') { + throw indexerError( + IndexerErrorCode.IE062, + `Allocation not created. ${ + receipt === 'paused' ? 'Network paused' : 'Operator not authorized' + }`, + ) + } + + const createAllocationEventLogs = network.transactionManager.findEvent( + 'AllocationCreated', + network.contracts.staking.interface, + 'subgraphDeploymentID', + subgraphDeployment.toString(), + receipt, + logger, + ) + + if (!createAllocationEventLogs) { + throw indexerError( + IndexerErrorCode.IE014, + `Allocation create transaction was never mined`, + ) + } + + logger.info(`Successfully allocated to subgraph deployment`, { + amountGRT: formatGRT(createAllocationEventLogs.tokens), + allocation: createAllocationEventLogs.allocationID, + epoch: createAllocationEventLogs.epoch.toString(), + transaction: receipt.transactionHash, + }) + + logger.debug( + `Updating indexing rules, so indexer-agent will now manage the active allocation`, + ) + const indexingRule = { + identifier: subgraphDeployment.ipfsHash, + allocationAmount: allocationAmount.toString(), + identifierType: IdentifierType.deployment, + decisionBasis: IndexingDecisionBasis.always, + protocolNetwork, + } + + await models.IndexingRule.upsert(indexingRule) + + // Since upsert succeeded, we _must_ have a rule + const updatedRule = await models.IndexingRule.findOne({ + where: { identifier: indexingRule.identifier }, + }) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + logger.debug(`DecisionBasis.ALWAYS rule merged into indexing rules`, { + rule: updatedRule, + }) + + return { + actionID: 0, + type: 'allocate', + transactionID: receipt.transactionHash, + deployment, + allocation: createAllocationEventLogs.allocationID, + allocatedTokens: formatGRT(allocationAmount.toString()), + protocolNetwork, + } + } catch (error) { + logger.error(`Failed to allocate`, { + amount: formatGRT(allocationAmount), + error, + }) + throw error + } +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteActions.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteActions.ts new file mode 100644 index 000000000..e3e434259 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteActions.ts @@ -0,0 +1,18 @@ +import type { MutationResolvers } from './../../../types.generated' + +export const deleteActions: NonNullable = async ( + _parent, + { actionIDs }, + { logger, models }, +) => { + logger.debug(`Execute 'deleteActions' mutation`, { + actionIDs, + }) + const numDeleted = await models.Action.destroy({ where: { id: actionIDs } }) + + if (numDeleted === 0) { + throw Error(`Delete action failed: No action items found with id in [${actionIDs}]`) + } + + return numDeleted +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteCostModels.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteCostModels.ts new file mode 100644 index 000000000..f948637e9 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteCostModels.ts @@ -0,0 +1,14 @@ +import type { MutationResolvers } from './../../../types.generated' + +export const deleteCostModels: NonNullable< + MutationResolvers['deleteCostModels'] +> = async (_parent, { deployments }, { models }) => { + return await models.CostModel.sequelize!.transaction(async (transaction) => { + return await models.CostModel.destroy({ + where: { + deployment: deployments, + }, + transaction, + }) + }) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteDisputes.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteDisputes.ts new file mode 100644 index 000000000..51485ea18 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteDisputes.ts @@ -0,0 +1,34 @@ +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import type { MutationResolvers } from './../../../types.generated' +import groupBy from 'lodash.groupby' + +export const deleteDisputes: NonNullable = async ( + _parent, + { identifiers }, + { models }, +) => { + let totalNumDeleted = 0 + + // Sanitize protocol network identifiers + for (const identifier of identifiers) { + if (!identifier.protocolNetwork) { + throw new Error(`Dispute is missing the attribute 'protocolNetwork'`) + } + identifier.protocolNetwork = validateNetworkIdentifier(identifier.protocolNetwork) + } + + // Batch by protocolNetwork + const batches = groupBy(identifiers, (x) => x.protocolNetwork) + + for (const protocolNetwork in batches) { + const batch = batches[protocolNetwork] + const numDeleted = await models.POIDispute.destroy({ + where: { + allocationID: batch.map((x) => x.allocationID), + }, + force: true, + }) + totalNumDeleted += numDeleted + } + return totalNumDeleted +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteIndexingRule.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteIndexingRule.ts new file mode 100644 index 000000000..d45459aaa --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteIndexingRule.ts @@ -0,0 +1,43 @@ +import { processIdentifier } from '../../../../subgraphs' +import type { MutationResolvers } from './../../../types.generated' +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import { resetGlobalRule } from '../utils' + +export const deleteIndexingRule: NonNullable< + MutationResolvers['deleteIndexingRule'] +> = async (_parent, { identifier: indexingRuleIdentifier }, { models, defaults }) => { + const [identifier] = await processIdentifier(indexingRuleIdentifier.identifier, { + all: false, + global: true, + }) + + // Sanitize protocol network identifier + const protocolNetwork = validateNetworkIdentifier( + indexingRuleIdentifier.protocolNetwork, + ) + + const validatedRuleIdentifier = { + protocolNetwork, + identifier, + } + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return models.IndexingRule.sequelize!.transaction(async (transaction) => { + const numDeleted = await models.IndexingRule.destroy({ + where: validatedRuleIdentifier, + transaction, + }) + + // Reset the global rule + if (validatedRuleIdentifier.identifier === 'global') { + await resetGlobalRule( + validatedRuleIdentifier, + defaults.globalIndexingRule, + models, + transaction, + ) + } + + return numDeleted > 0 + }) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteIndexingRules.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteIndexingRules.ts new file mode 100644 index 000000000..beeae8b86 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/deleteIndexingRules.ts @@ -0,0 +1,52 @@ +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import type { MutationResolvers } from './../../../types.generated' +import groupBy from 'lodash.groupby' +import { processIdentifier } from '../../../../subgraphs' +import { resetGlobalRule } from '../utils' + +export const deleteIndexingRules: NonNullable< + MutationResolvers['deleteIndexingRules'] +> = async (_parent, { identifiers: indexingRuleIdentifiers }, { models, defaults }) => { + let totalNumDeleted = 0 + + // Sanitize protocol network identifiers + for (const identifier of indexingRuleIdentifiers) { + identifier.protocolNetwork = validateNetworkIdentifier(identifier.protocolNetwork) + } + + // Batch deletions by the `IndexingRuleIdentifier.protocolNetwork` attribute . + const batches = groupBy(indexingRuleIdentifiers, (x) => x.protocolNetwork) + + for (const protocolNetwork in batches) { + const batch = batches[protocolNetwork] + const identifiers = await Promise.all( + batch.map( + async ({ identifier }) => + (await processIdentifier(identifier, { all: false, global: true }))[0], + ), + ) + // Execute deletion batch + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await models.IndexingRule.sequelize!.transaction(async (transaction) => { + const numDeleted = await models.IndexingRule.destroy({ + where: { + identifier: identifiers, + protocolNetwork: protocolNetwork, + }, + transaction, + }) + + if (identifiers.includes('global')) { + const globalIdentifier = { identifier: 'global', protocolNetwork } + await resetGlobalRule( + globalIdentifier, + defaults.globalIndexingRule, + models, + transaction, + ) + } + totalNumDeleted += numDeleted + }) + } + return totalNumDeleted > 0 +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/executeApprovedActions.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/executeApprovedActions.ts new file mode 100644 index 000000000..f23c26504 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/executeApprovedActions.ts @@ -0,0 +1,26 @@ +import type { MutationResolvers } from './../../../types.generated' + +export const executeApprovedActions: NonNullable< + MutationResolvers['executeApprovedActions'] +> = async (_parent, _arg, { logger: parentLogger, actionManager }) => { + const logger = parentLogger.child({ function: 'executeApprovedActions' }) + logger.trace(`Begin executing 'executeApprovedActions' mutation`) + if (!actionManager) { + throw Error('IndexerManagementClient must be in `network` mode to modify actions') + } + const result = await actionManager.multiNetworks.map(async (network) => { + logger.debug(`Execute 'executeApprovedActions' mutation`, { + protocolNetwork: network.specification.networkIdentifier, + }) + try { + return await actionManager.executeApprovedActions(network) + } catch (error) { + logger.error('Failed to execute approved actions for network', { + protocolNetwork: network.specification.networkIdentifier, + error, + }) + return [] + } + }) + return Object.values(result).flat() +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/queueActions.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/queueActions.ts new file mode 100644 index 000000000..be25ce041 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/queueActions.ts @@ -0,0 +1,242 @@ +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import { + ActionStatus, + type Action, + type ActionInput, + type MutationResolvers, +} from './../../../types.generated' +import groupBy from 'lodash.groupby' +import { validateActionInputs } from '../../../../actions' +import { ActionManager } from '../../../../indexer-management/actions' +import { Op, Transaction, literal } from 'sequelize' +import { Logger } from '@graphprotocol/common-ts' +import { IndexerManagementModels } from '@graphprotocol/indexer-common' + +/* Helper function to assess equality among a enqueued and a proposed actions */ +function compareActions(enqueued: Action, proposed: ActionInput): boolean { + // actions are not the same if they target different protocol networks + if (enqueued.protocolNetwork !== proposed.protocolNetwork) { + return false + } + + // actions are not the same if they target different deployments + if (enqueued.deploymentID !== proposed.deploymentID) { + return false + } + // actions are not the same if they have different types + if (enqueued.type !== proposed.type) { + return false + } + + // Different fields are used to assess equality depending on the action type + const amount = enqueued.amount === proposed.amount + const poi = enqueued.poi == proposed.poi + const force = enqueued.force == proposed.force + switch (proposed.type) { + case 'allocate': + return amount + case 'unallocate': + return poi && force + case 'reallocate': + return amount && poi && force + default: + return false + } +} + +// Perform insert, update, or no-op depending on existing queue data +// INSERT - No item in the queue yet targeting this deploymentID +// UPDATE - Already an item in the queue targeting the same deploymentID AND that item was added by the same 'source' +// NO-OP - Already an item in the queue targeting the same deploymentID BUT was added by a different source +// TODO: Use pending status for actions in process of execution, detect here and if duplicate pending found, NOOP +async function executeQueueOperation( + logger: Logger, + action: ActionInput, + actionsAwaitingExecution: Action[], + recentlyAttemptedActions: Action[], + models: IndexerManagementModels, + transaction: Transaction, +) { + // Check for previously failed conflicting actions + const conflictingActions = recentlyAttemptedActions.filter(function (recentAction) { + const areEqual = compareActions(recentAction, action) + const fromAgent = action.source === 'indexerAgent' + return areEqual && fromAgent + }) + if (conflictingActions.length > 0) { + const message = `Recently executed '${action.type}' action found in queue targeting '${action.deploymentID}', ignoring.` + logger.warn(message, { + recentlyAttemptedAction: conflictingActions, + proposedAction: action, + }) + throw Error(message) + } + + // Check for duplicated actions + const duplicateActions = actionsAwaitingExecution.filter( + (a) => + a.deploymentID === action.deploymentID && + a.protocolNetwork === action.protocolNetwork, + ) + if (duplicateActions.length === 0) { + logger.trace('Inserting Action in database', { action }) + const createdAction = await models.Action.create( + { + ...action, + // @ts-expect-error - at this point we have a deploymentID. With new TS upgrade the filter check will make it assert the type + deploymentID: action.deploymentID, + }, + { + validate: true, + returning: true, + transaction, + }, + ) + return [createdAction.toGraphQL()] + } else if (duplicateActions.length === 1) { + if ( + duplicateActions[0].source === action.source && + duplicateActions[0].status === action.status + ) { + // TODO: Log this only when update will actually change existing item + logger.trace( + `Action found in queue that effects the same deployment as proposed queue action, updating existing action`, + { + actionInQueue: duplicateActions, + proposedAction: action, + proposedSource: action.source, + actionSources: duplicateActions[0].source, + }, + ) + const [, updatedAction] = await models.Action.update( + { + ...action, + // @ts-expect-error - at this point we have a deploymentID. With new TS upgrade the filter check will make it assert the type + deploymentID: action.deploymentID, + }, + { + where: { id: duplicateActions[0].id }, + returning: true, + validate: true, + transaction, + }, + ) + return updatedAction.map((a) => a.toGraphQL()) + } else { + const message = + `Duplicate action found in queue that effects '${action.deploymentID}' but NOT overwritten because it has a different source and/or status. If you ` + + `would like to replace the item currently in the queue please cancel it and then queue the proposed action` + logger.warn(message, { + actionInQueue: duplicateActions, + proposedAction: action, + }) + throw Error(message) + } + } else { + throw Error( + `Uniqueness constraint broken: Multiple actions items targeting the same deployment found in queue (ActionStatus = queued). Something has gone wrong, please cleanup your 'Actions' table to continue`, + ) + } +} + +export const queueActions: NonNullable = async ( + _parent, + { actions }, + { logger, models, actionManager, multiNetworks }, +) => { + logger.debug(`Execute 'queueActions' mutation`, { + actions, + }) + + if (!actionManager || !multiNetworks) { + throw Error('IndexerManagementClient must be in `network` mode to modify actions') + } + + // Sanitize protocol network identifier + actions.forEach((action) => { + try { + action.protocolNetwork = validateNetworkIdentifier(action.protocolNetwork) + } catch (e) { + throw Error(`Invalid value for the field 'protocolNetwork'. ${e}`) + } + }) + + // Let Network Monitors validate actions based on their protocol networks + await multiNetworks.mapNetworkMapped( + groupBy(actions, (action) => action.protocolNetwork), + (network, actions) => validateActionInputs(actions, network.networkMonitor, logger), + ) + + const alreadyQueuedActions = await ActionManager.fetchActions( + models, + null, + { + status: ActionStatus.queued, + }, + null, + ) + const alreadyApprovedActions = await ActionManager.fetchActions( + models, + null, + { + status: ActionStatus.approved, + }, + null, + ) + const actionsAwaitingExecution = alreadyQueuedActions + .concat(alreadyApprovedActions) + .map((a) => a.toGraphQL()) + + // Fetch recently attempted actions + const last15Minutes = { + [Op.gte]: literal("NOW() - INTERVAL '15m'"), + } + + const recentlyFailedActions = await ActionManager.fetchActions( + models, + null, + { + status: ActionStatus.failed, + updatedAt: last15Minutes, + }, + null, + ) + + const recentlySuccessfulActions = await ActionManager.fetchActions( + models, + null, + { + status: ActionStatus.success, + updatedAt: last15Minutes, + }, + null, + ) + + logger.trace('Recently attempted actions', { + recentlySuccessfulActions, + recentlyFailedActions, + }) + + const recentlyAttemptedActions = recentlyFailedActions + .concat(recentlySuccessfulActions) + .map((a) => a.toGraphQL()) + + let results: Action[] = [] + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await models.Action.sequelize!.transaction(async (transaction) => { + for (const action of actions) { + const result = await executeQueueOperation( + logger, + action, + actionsAwaitingExecution, + recentlyAttemptedActions, + models, + transaction, + ) + results = results.concat(result) + } + }) + + return results +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/reallocateAllocation.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/reallocateAllocation.ts new file mode 100644 index 000000000..67081c60b --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/reallocateAllocation.ts @@ -0,0 +1,321 @@ +import { extractNetwork } from '../utils' +import { + IdentifierType, + IndexingDecisionBasis, + type MutationResolvers, +} from './../../../types.generated' +import { formatGRT, parseGRT, toAddress } from '@graphprotocol/common-ts' +import { AllocationStatus } from '../../../../allocations/types' +import { IndexerErrorCode, indexerError } from '../../../../errors' +import { BigNumber, utils } from 'ethers' +import { allocationIdProof, uniqueAllocationID } from '../../../../allocations/keys' + +export const reallocateAllocation: NonNullable< + MutationResolvers['reallocateAllocation'] +> = async ( + _parent, + { allocation, poi, amount, force, protocolNetwork }, + { logger, models, multiNetworks }, +) => { + logger = logger.child({ + component: 'reallocateAllocationResolver', + }) + + logger.info('Reallocating allocation', { + allocation: allocation, + poi: poi || 'none provided', + amount, + force, + }) + + if (!multiNetworks) { + throw Error('IndexerManagementClient must be in `network` mode to fetch allocations') + } + + // Obtain the Network object and its associated components and data + const network = extractNetwork(protocolNetwork, multiNetworks) + const networkMonitor = network.networkMonitor + const contracts = network.contracts + const transactionManager = network.transactionManager + const receiptCollector = network.receiptCollector + const address = network.specification.indexerOptions.address + + const allocationAmount = parseGRT(amount) + + const activeAllocations = await networkMonitor.allocations(AllocationStatus.ACTIVE) + + const allocationAddress = toAddress(allocation) + const allocationData = activeAllocations.find((allocation) => { + return allocation.id === allocationAddress + }) + + if (!allocationData) { + throw indexerError( + IndexerErrorCode.IE063, + `Reallocation failed: No active allocation with id '${allocation}' found`, + ) + } + + try { + // Ensure allocation is old enough to close + const currentEpoch = await contracts.epochManager.currentEpoch() + if (BigNumber.from(allocationData.createdAtEpoch).eq(currentEpoch)) { + throw indexerError( + IndexerErrorCode.IE064, + `Allocation '${ + allocationData.id + }' cannot be closed until epoch ${currentEpoch.add( + 1, + )}. (Allocations cannot be closed in the same epoch they were created)`, + ) + } + + logger.debug('Resolving POI') + const allocationPOI = await networkMonitor.resolvePOI( + allocationData, + poi || undefined, + Boolean(force), + ) + logger.debug('POI resolved', { + userProvidedPOI: poi, + poi: allocationPOI, + }) + + // Double-check whether the allocation is still active on chain, to + // avoid unnecessary transactions. + // Note: We're checking the allocation state here, which is defined as + // + // enum AllocationState { Null, Active, Closed, Finalized } + // + // in the contracts. + const state = await contracts.staking.getAllocationState(allocationData.id) + if (state !== 1) { + logger.warn(`Allocation has already been closed`) + throw indexerError(IndexerErrorCode.IE065, `Allocation has already been closed`) + } + + if (allocationAmount.lt('0')) { + logger.warn('Cannot reallocate a negative amount of GRT', { + amount: allocationAmount.toString(), + }) + throw indexerError( + IndexerErrorCode.IE061, + 'Cannot reallocate a negative amount of GRT', + ) + } + + logger.info(`Reallocate to subgraph deployment`, { + existingAllocationAmount: formatGRT(allocationData.allocatedTokens), + newAllocationAmount: formatGRT(allocationAmount), + epoch: currentEpoch.toString(), + }) + + // Identify how many GRT the indexer has staked + const freeStake = await contracts.staking.getIndexerCapacity(address) + + // When reallocating, we will first close the old allocation and free up the GRT in that allocation + // This GRT will be available in addition to freeStake for the new allocation + const postCloseFreeStake = freeStake.add(allocationData.allocatedTokens) + + // If there isn't enough left for allocating, abort + if (postCloseFreeStake.lt(allocationAmount)) { + throw indexerError( + IndexerErrorCode.IE013, + `Unable to allocate ${formatGRT( + allocationAmount, + )} GRT: indexer only has a free stake amount of ${formatGRT( + freeStake, + )} GRT, plus ${formatGRT( + allocationData.allocatedTokens, + )} GRT from the existing allocation`, + ) + } + + logger.debug('Generating a new unique Allocation ID') + const { allocationSigner, allocationId: newAllocationId } = uniqueAllocationID( + transactionManager.wallet.mnemonic.phrase, + currentEpoch.toNumber(), + allocationData.subgraphDeployment.id, + activeAllocations.map((allocation) => allocation.id), + ) + + logger.debug('New unique Allocation ID generated', { + newAllocationID: newAllocationId, + newAllocationSigner: allocationSigner, + }) + + // Double-check whether the allocationID already exists on chain, to + // avoid unnecessary transactions. + // Note: We're checking the allocation state here, which is defined as + // + // enum AllocationState { Null, Active, Closed, Finalized } + // + // in the contracts. + const newAllocationState = await contracts.staking.getAllocationState(newAllocationId) + if (newAllocationState !== 0) { + logger.warn(`Skipping Allocation as it already exists onchain`, { + indexer: address, + allocation: newAllocationId, + newAllocationState, + }) + throw indexerError(IndexerErrorCode.IE066, 'AllocationID already exists') + } + + logger.debug('Generating new allocation ID proof', { + newAllocationSigner: allocationSigner, + newAllocationID: newAllocationId, + indexerAddress: address, + }) + const proof = await allocationIdProof(allocationSigner, address, newAllocationId) + logger.debug('Successfully generated allocation ID proof', { + allocationIDProof: proof, + }) + + logger.info(`Sending close and allocate multicall transaction`, { + indexer: address, + amount: formatGRT(allocationAmount), + oldAllocation: allocationData.id, + newAllocation: newAllocationId, + newAllocationAmount: formatGRT(allocationAmount), + deployment: allocationData.subgraphDeployment.id.toString(), + poi: allocationPOI, + proof, + epoch: currentEpoch.toString(), + }) + + const callData = [ + await contracts.staking.populateTransaction.closeAllocation( + allocationData.id, + allocationPOI, + ), + await contracts.staking.populateTransaction.allocateFrom( + address, + allocationData.subgraphDeployment.id.bytes32, + allocationAmount, + newAllocationId, + utils.hexlify(Array(32).fill(0)), // metadata + proof, + ), + ].map((tx) => tx.data as string) + + const receipt = await transactionManager.executeTransaction( + async () => contracts.staking.estimateGas.multicall(callData), + async (gasLimit) => contracts.staking.multicall(callData, { gasLimit }), + logger.child({ + function: 'closeAndAllocate', + }), + ) + + if (receipt === 'paused' || receipt === 'unauthorized') { + throw indexerError( + IndexerErrorCode.IE062, + `Allocation '${newAllocationId}' could not be closed: ${receipt}`, + ) + } + + const createAllocationEventLogs = transactionManager.findEvent( + 'AllocationCreated', + contracts.staking.interface, + 'subgraphDeploymentID', + allocationData.subgraphDeployment.id.toString(), + receipt, + logger, + ) + + if (!createAllocationEventLogs) { + throw indexerError(IndexerErrorCode.IE014, `Allocation was never mined`) + } + + const closeAllocationEventLogs = transactionManager.findEvent( + 'AllocationClosed', + contracts.staking.interface, + 'allocationID', + allocation, + receipt, + logger, + ) + + if (!closeAllocationEventLogs) { + throw indexerError( + IndexerErrorCode.IE015, + `Allocation close transaction was never successfully mined`, + ) + } + + const rewardsEventLogs = transactionManager.findEvent( + 'RewardsAssigned', + contracts.rewardsManager.interface, + 'allocationID', + allocation, + receipt, + logger, + ) + + const rewardsAssigned = rewardsEventLogs ? rewardsEventLogs.amount : 0 + + if (rewardsAssigned == 0) { + logger.warn('No rewards were distributed upon closing the allocation') + } + + logger.info(`Successfully reallocated allocation`, { + deployment: createAllocationEventLogs.subgraphDeploymentID, + closedAllocation: closeAllocationEventLogs.allocationID, + closedAllocationStakeGRT: formatGRT(closeAllocationEventLogs.tokens), + closedAllocationPOI: closeAllocationEventLogs.poi, + closedAllocationEpoch: closeAllocationEventLogs.epoch.toString(), + indexingRewardsCollected: rewardsAssigned, + createdAllocation: createAllocationEventLogs.allocationID, + createdAllocationStakeGRT: formatGRT(createAllocationEventLogs.tokens), + indexer: createAllocationEventLogs.indexer, + epoch: createAllocationEventLogs.epoch.toString(), + transaction: receipt.transactionHash, + }) + + logger.info('Identifying receipts worth collecting', { + allocation: closeAllocationEventLogs.allocationID, + }) + + // Collect query fees for this allocation + const isCollectingQueryFees = await receiptCollector.collectReceipts( + 0, + allocationData, + ) + + logger.debug( + `Updating indexing rules, so indexer-agent will now manage the active allocation`, + ) + const indexingRule = { + identifier: allocationData.subgraphDeployment.id.ipfsHash, + allocationAmount: allocationAmount.toString(), + identifierType: IdentifierType.deployment, + decisionBasis: IndexingDecisionBasis.always, + protocolNetwork, + } + + await models.IndexingRule.upsert(indexingRule) + + // Since upsert succeeded, we _must_ have a rule + const updatedRule = await models.IndexingRule.findOne({ + where: { identifier: indexingRule.identifier }, + }) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + logger.debug(`DecisionBasis.ALWAYS rule merged into indexing rules`, { + rule: updatedRule, + }) + + return { + actionID: 0, + type: 'reallocate', + transactionID: receipt.transactionHash, + closedAllocation: closeAllocationEventLogs.allocationID, + indexingRewardsCollected: formatGRT(rewardsAssigned), + receiptsWorthCollecting: isCollectingQueryFees, + createdAllocation: createAllocationEventLogs.allocationID, + createdAllocationStake: formatGRT(createAllocationEventLogs.tokens), + protocolNetwork, + } + } catch (error) { + logger.error(error.toString()) + throw error + } +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/setCostModel.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/setCostModel.ts new file mode 100644 index 000000000..1a6d2fa8f --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/setCostModel.ts @@ -0,0 +1,91 @@ +import { + CostModelVariables, + parseGraphQLCostModel, +} from '../../../../indexer-management/models/cost-model' +import type { MutationResolvers } from './../../../types.generated' +import { compileAsync } from '@graphprotocol/cost-model' + +const setVariable = ( + vars: CostModelVariables | null, + name: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + value: any, +): CostModelVariables => { + if (vars === null) { + return { [name]: value } + } else { + try { + vars[name] = value + return vars + } catch (e) { + return vars + } + } +} + +export const setCostModel: NonNullable = async ( + _parent, + { costModel }, + { multiNetworks, models, dai }, +) => { + if (!multiNetworks) { + throw new Error('No network configuration available') + } + + if (Object.keys(multiNetworks.inner).length !== 1) { + throw Error('Must be in single network mode to set cost models') + } + + const network = Object.values(multiNetworks.inner)[0] + const injectDai = network.specification.dai.inject + + if (network.specification.networkIdentifier !== 'eip155:1' && injectDai) { + throw new Error( + `Can't set cost model: DAI injection enabled but not on Ethereum Mainnet`, + ) + } + + const update = parseGraphQLCostModel(costModel) + + // Validate cost model + try { + const modelForValidation = update.model || 'default => 1;' + const variablesForValidation = JSON.stringify(update.variables || {}) + await compileAsync(modelForValidation, variablesForValidation) + } catch (err) { + throw new Error(`Invalid cost model or variables: ${err.message}`) + } + + const [model] = await models.CostModel.findOrBuild({ + where: { deployment: update.deployment }, + }) + // logger.info('Fetched current model', { current: model, update }) + // model.set('deployment', update.deployment || model.deployment) + // // model.set('model', update.model || model.model) + // model.model = update.model || model.model + // logger.info('Merged models', { now: model }) + model.deployment = update.deployment || model.deployment + model.model = update.model || model.model + + // Update the model variables (fall back to current value if unchanged) + let variables = update.variables || model.variables + + if (injectDai) { + const oldDai = model.variables?.DAI + const newDai = update.variables?.DAI + + // Inject the latest DAI value if available + if (dai.valueReady) { + variables = setVariable(variables, 'DAI', await dai.value()) + } else if (newDai === undefined && oldDai !== undefined) { + // Otherwise preserve the old DAI value if there is one; + // this ensures it's never dropped + variables = setVariable(variables, 'DAI', oldDai) + } + } + + // Apply new variables + model.variables = variables + + return (await model.save()).toGraphQL() +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/setIndexingRule.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/setIndexingRule.ts new file mode 100644 index 000000000..cc9e44fc9 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/setIndexingRule.ts @@ -0,0 +1,44 @@ +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import type { MutationResolvers } from './../../../types.generated' +import { processIdentifier } from '../../../../subgraphs' + +export const setIndexingRule: NonNullable = async ( + _parent, + { rule }, + { models }, +) => { + if (!rule.identifier) { + throw Error('Cannot set indexingRule without identifier') + } + + if (!rule.protocolNetwork) { + throw Error("Cannot set an indexing rule without the field 'protocolNetwork'") + } else { + try { + rule.protocolNetwork = validateNetworkIdentifier(rule.protocolNetwork) + } catch (e) { + throw Error(`Invalid value for the field 'protocolNetwork'. ${e}`) + } + } + + const [identifier] = await processIdentifier(rule.identifier, { + all: false, + global: true, + }) + rule.identifier = identifier + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [updatedRule, _created] = await models.IndexingRule.upsert({ + ...rule, + allocationAmount: rule.allocationAmount?.toString() ?? null, + autoRenewal: rule.autoRenewal === null ? undefined : rule.autoRenewal, + minSignal: rule.minSignal?.toString(), + maxSignal: rule.maxSignal?.toString(), + minStake: rule.minStake?.toString(), + minAverageQueryFees: rule.minAverageQueryFees?.toString(), + decisionBasis: rule.decisionBasis === null ? undefined : rule.decisionBasis, + requireSupported: rule.requireSupported === null ? undefined : rule.requireSupported, + safety: rule.safety === null ? undefined : rule.safety, + }) + return updatedRule.toGraphQL() +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/storeDisputes.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/storeDisputes.ts new file mode 100644 index 000000000..939cf9a4d --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/storeDisputes.ts @@ -0,0 +1,34 @@ +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import type { MutationResolvers } from './../../../types.generated' + +export const storeDisputes: NonNullable = async ( + _parent, + { disputes }, + { models }, +) => { + // Sanitize protocol network identifiers + for (const dispute of disputes) { + if (!dispute.protocolNetwork) { + throw new Error(`Dispute is missing the attribute 'protocolNetwork'`) + } + dispute.protocolNetwork = validateNetworkIdentifier(dispute.protocolNetwork) + } + + const createdDisputes = await models.POIDispute.bulkCreate( + disputes.map((dispute) => ({ + ...dispute, + allocationAmount: dispute.allocationAmount.toString(), + })), + { + returning: true, + validate: true, + updateOnDuplicate: [ + 'closedEpochReferenceProof', + 'previousEpochReferenceProof', + 'status', + ], + conflictAttributes: ['allocationID', 'protocolNetwork'], + }, + ) + return createdDisputes.map((dispute) => dispute.toGraphQL()) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/submitCollectReceiptsJob.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/submitCollectReceiptsJob.ts new file mode 100644 index 000000000..c2d958ce1 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/submitCollectReceiptsJob.ts @@ -0,0 +1,39 @@ +import type { MutationResolvers } from './../../../types.generated' +import { extractNetwork } from '../utils' + +export const submitCollectReceiptsJob: NonNullable< + MutationResolvers['submitCollectReceiptsJob'] +> = async (_parent, { allocation, protocolNetwork }, { logger, multiNetworks }) => { + logger.debug('Execute collectAllocationReceipts() mutation', { + allocationID: allocation, + protocolNetwork, + }) + if (!multiNetworks) { + throw Error( + 'IndexerManagementClient must be in `network` mode to collect receipts for an allocation', + ) + } + const network = extractNetwork(protocolNetwork, multiNetworks) + const networkMonitor = network.networkMonitor + const receiptCollector = network.receiptCollector + + const allocationData = await networkMonitor.allocation(allocation) + + try { + logger.info('Identifying receipts worth collecting', { + allocation: allocation, + }) + + // Collect query fees for this allocation + const collecting = await receiptCollector.collectReceipts(0, allocationData) + + logger.info(`Submitted allocation receipt collection job for execution`, { + allocationID: allocation, + protocolNetwork: network.specification.networkIdentifier, + }) + return collecting + } catch (error) { + logger.error(error.toString()) + throw error + } +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/updateActions.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/updateActions.ts new file mode 100644 index 000000000..8779ad4c3 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Mutation/updateActions.ts @@ -0,0 +1,27 @@ +import { ActionManager } from '../../../../indexer-management/actions' +import type { MutationResolvers } from './../../../types.generated' + +export const updateActions: NonNullable = async ( + _parent, + { filter, action }, + { logger, models }, +) => { + logger.debug(`Execute 'updateActions' mutation`, { + filter, + action, + }) + + const results = await ActionManager.updateActions(models, action, filter) + + if (results[0] === 0) { + const msg = `Actions update failed: No action was matched by the filter, '${JSON.stringify( + filter, + )}'` + logger.debug(msg) + throw Error(msg) + } + logger.info(`'${results[0]}' actions updated`) + const response = results[1] + + return response.map((action) => action.toGraphQL()) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/POIDispute.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/POIDispute.ts new file mode 100644 index 000000000..7120915a1 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/POIDispute.ts @@ -0,0 +1,4 @@ +import type { POIDisputeResolvers } from './../../types.generated' +export const POIDispute: POIDisputeResolvers = { + /* Implement POIDispute resolver logic here */ +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/action.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/action.ts new file mode 100644 index 000000000..60e9669c1 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/action.ts @@ -0,0 +1,17 @@ +import type { QueryResolvers } from './../../../types.generated' + +export const action: NonNullable = async ( + _parent, + { actionID }, + { logger, models }, +) => { + logger.debug(`Execute 'action' query`, { + actionID, + }) + + const action = await models.Action.findOne({ + where: { id: actionID }, + }) + + return action?.toGraphQL() ?? null +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/actions.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/actions.ts new file mode 100644 index 000000000..5b93c38c5 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/actions.ts @@ -0,0 +1,28 @@ +import type { QueryResolvers } from './../../../types.generated' +import { actionFilterToWhereOptions } from '../../../../actions' +import { Order } from 'sequelize' + +export const actions: NonNullable = async ( + _parent, + { filter, orderBy, orderDirection, first }, + { logger, models }, +) => { + logger.debug(`Execute 'actions' query`, { + filter, + orderBy, + orderDirection, + first, + }) + + const orderObject: Order = orderBy + ? [[orderBy.toString(), orderDirection ?? 'desc']] + : [['id', 'desc']] + + const actions = await models.Action.findAll({ + where: actionFilterToWhereOptions(filter || {}), + order: orderObject, + limit: first || undefined, + }) + + return actions.map((action) => action.toGraphQL()) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/allocations.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/allocations.ts new file mode 100644 index 000000000..0b533a884 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/allocations.ts @@ -0,0 +1,279 @@ +import type { Allocation, QueryResolvers } from './../../../types.generated' +import { + Address, + Logger, + SubgraphDeploymentID, + toAddress, +} from '@graphprotocol/common-ts' +import { epochElapsedBlocks } from '../../../../indexer-management' +import { NetworkSubgraph } from '@graphprotocol/indexer-common' +import { BigNumber } from 'ethers' +import gql from 'graphql-tag' +import pMap from 'p-map' + +enum AllocationQuery { + all = 'all', + active = 'active', + closed = 'closed', + allocation = 'allocation', +} + +const ALLOCATION_QUERIES = { + [AllocationQuery.all]: gql` + query allocations($indexer: String!) { + allocations(where: { indexer: $indexer }, first: 1000) { + id + subgraphDeployment { + id + stakedTokens + signalledTokens + } + indexer { + id + } + allocatedTokens + createdAtEpoch + closedAtEpoch + indexingRewards + queryFeesCollected + status + } + } + `, + [AllocationQuery.active]: gql` + query allocations($indexer: String!) { + allocations(where: { indexer: $indexer, status: Active }, first: 1000) { + id + subgraphDeployment { + id + stakedTokens + signalledTokens + } + indexer { + id + } + allocatedTokens + createdAtEpoch + closedAtEpoch + indexingRewards + queryFeesCollected + status + } + } + `, + [AllocationQuery.closed]: gql` + query allocations($indexer: String!) { + allocations(where: { indexer: $indexer, status: Closed }, first: 1000) { + id + subgraphDeployment { + id + stakedTokens + signalledTokens + } + indexer { + id + } + allocatedTokens + createdAtEpoch + closedAtEpoch + indexingRewards + queryFeesCollected + status + } + } + `, + [AllocationQuery.allocation]: gql` + query allocations($allocation: String!) { + allocations(where: { id: $allocation }, first: 1000) { + id + subgraphDeployment { + id + stakedTokens + signalledTokens + } + indexer { + id + } + allocatedTokens + createdAtEpoch + closedAtEpoch + indexingRewards + queryFeesCollected + status + } + } + `, +} + +async function queryAllocations( + logger: Logger, + networkSubgraph: NetworkSubgraph, + variables: { + indexer: Address + allocation: Address | null + status: 'active' | 'closed' | null + }, + context: { + currentEpoch: number + currentEpochStartBlock: number + currentEpochElapsedBlocks: number + maxAllocationEpochs: number + blocksPerEpoch: number + avgBlockTime: number + protocolNetwork: string + }, +): Promise { + logger.trace('Query Allocations', { + variables, + context, + }) + + let filterType: AllocationQuery + let filterVars: object + if (variables.allocation) { + filterType = AllocationQuery.allocation + filterVars = { + allocation: variables.allocation.toLowerCase(), + } + } else if (variables.status == null && variables.allocation == null) { + filterType = AllocationQuery.all + filterVars = { + indexer: variables.indexer.toLowerCase(), + } + } else if (variables.status == 'active') { + filterType = AllocationQuery.active + filterVars = { + indexer: variables.indexer.toLowerCase(), + } + } else if (variables.status == 'closed') { + filterType = AllocationQuery.closed + filterVars = { + indexer: variables.indexer.toLowerCase(), + } + } else { + // Shouldn't ever get here + throw new Error( + `Unsupported combination of variables provided, variables: ${variables}`, + ) + } + + const result = await networkSubgraph.checkedQuery( + ALLOCATION_QUERIES[filterType], + filterVars, + ) + + if (result.data.allocations.length == 0) { + // TODO: Is 'Claimable' still the correct term here, after Exponential Rebates? + logger.info(`No 'Claimable' allocations found`) + return [] + } + + if (result.error) { + logger.warning('Query failed', { + error: result.error, + }) + throw result.error + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return pMap( + result.data.allocations, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async (allocation: any): Promise => { + const deadlineEpoch = allocation.createdAtEpoch + context.maxAllocationEpochs + const remainingBlocks = + // blocks remaining in current epoch + context.blocksPerEpoch - + context.currentEpochElapsedBlocks + + // blocks in the remaining epochs after this one + context.blocksPerEpoch * (deadlineEpoch - context.currentEpoch - 1) + return { + id: allocation.id, + indexer: allocation.indexer.id, + subgraphDeployment: new SubgraphDeploymentID(allocation.subgraphDeployment.id) + .ipfsHash, + signalledTokens: allocation.subgraphDeployment.signalledTokens, + stakedTokens: allocation.subgraphDeployment.stakedTokens, + allocatedTokens: BigNumber.from(allocation.allocatedTokens).toString(), + createdAtEpoch: allocation.createdAtEpoch, + closedAtEpoch: allocation.closedAtEpoch, + ageInEpochs: allocation.closedAtEpoch + ? allocation.closedAtEpoch - allocation.createdAtEpoch + : context.currentEpoch - allocation.createdAtEpoch, + closeDeadlineEpoch: allocation.createdAtEpoch + context.maxAllocationEpochs, + closeDeadlineBlocksRemaining: remainingBlocks, + closeDeadlineTimeRemaining: remainingBlocks * context.avgBlockTime, + indexingRewards: allocation.indexingRewards, + queryFeesCollected: allocation.queryFeesCollected, + status: allocation.status, + protocolNetwork: context.protocolNetwork, + } + }, + ) +} + +export const allocations: NonNullable = async ( + _parent, + { filter }, + { logger, multiNetworks }, +) => { + logger.debug('Execute allocations() query', { + filter, + }) + if (!multiNetworks) { + throw Error('IndexerManagementClient must be in `network` mode to fetch allocations') + } + + const allocationsByNetwork = await multiNetworks.map(async (network) => { + // Return early if a different protocol network is specifically requested + if ( + filter.protocolNetwork && + filter.protocolNetwork !== network.specification.networkIdentifier + ) { + return [] + } + + const { + networkMonitor, + networkSubgraph, + contracts, + specification: { + indexerOptions: { address }, + }, + } = network + + const [currentEpoch, maxAllocationEpochs, epochLength] = await Promise.all([ + networkMonitor.networkCurrentEpoch(), + contracts.staking.maxAllocationEpochs(), + contracts.epochManager.epochLength(), + ]) + + const allocation = filter.allocation + ? filter.allocation === 'all' + ? null + : toAddress(filter.allocation) + : null + + const variables = { + indexer: toAddress(address), + allocation, + // TODO: we need to update schema to switch away from using `status` as a string + status: filter.status as 'active' | 'closed', + } + + const context = { + currentEpoch: currentEpoch.epochNumber, + currentEpochStartBlock: currentEpoch.startBlockNumber, + currentEpochElapsedBlocks: epochElapsedBlocks(currentEpoch), + latestBlock: currentEpoch.latestBlock, + maxAllocationEpochs, + blocksPerEpoch: epochLength.toNumber(), + avgBlockTime: 13000, + protocolNetwork: network.specification.networkIdentifier, + } + + return queryAllocations(logger, networkSubgraph, variables, context) + }) + + return Object.values(allocationsByNetwork).flat() +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/costModel.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/costModel.ts new file mode 100644 index 000000000..68add89cd --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/costModel.ts @@ -0,0 +1,25 @@ +import { COST_MODEL_GLOBAL } from '../../../../indexer-management/models' +import type { QueryResolvers } from './../../../types.generated' + +export const costModel: NonNullable = async ( + _parent, + { deployment }, + { models }, +) => { + const model = await models.CostModel.findOne({ + where: { deployment }, + }) + + if (model) return model.toGraphQL() + + const globalModel = await models.CostModel.findOne({ + where: { deployment: COST_MODEL_GLOBAL }, + }) + + if (globalModel) { + globalModel.setDataValue('deployment', deployment) + return globalModel.toGraphQL() + } + + return null +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/costModels.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/costModels.ts new file mode 100644 index 000000000..b0b4bb5a3 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/costModels.ts @@ -0,0 +1,30 @@ +import { COST_MODEL_GLOBAL } from '../../../../indexer-management/models' +import type { QueryResolvers } from './../../../types.generated' + +export const costModels: NonNullable = async ( + _parent, + { deployments }, + { models }, +) => { + const costModels = await models.CostModel.findAll({ + where: deployments ? { deployment: deployments } : undefined, + order: [['deployment', 'ASC']], + }) + + const definedDeployments = new Set(costModels.map((model) => model.deployment)) + const undefinedDeployments = deployments?.filter((d) => !definedDeployments.has(d)) + + const globalModel = await models.CostModel.findOne({ + where: { deployment: COST_MODEL_GLOBAL }, + }) + + if (globalModel && undefinedDeployments) { + const mergedCostModels = undefinedDeployments.map((d) => { + globalModel.setDataValue('deployment', d) + return globalModel.toGraphQL() + }) + return costModels.map((model) => model.toGraphQL()).concat(mergedCostModels) + } + + return costModels.map((model) => model.toGraphQL()) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/dispute.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/dispute.ts new file mode 100644 index 000000000..3564ac82c --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/dispute.ts @@ -0,0 +1,13 @@ +import type { QueryResolvers } from './../../../types.generated' + +export const dispute: NonNullable = async ( + _parent, + { identifier }, + { models }, +) => { + const dispute = await models.POIDispute.findOne({ + where: { ...identifier }, + }) + + return dispute?.toGraphQL() || null +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/disputes.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/disputes.ts new file mode 100644 index 000000000..89d3b5cd4 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/disputes.ts @@ -0,0 +1,30 @@ +import { Op, WhereOptions } from 'sequelize' +import type { QueryResolvers } from './../../../types.generated' +import { validateNetworkIdentifier } from '../../../../parsers/validators' + +export const disputes: NonNullable = async ( + _parent, + { protocolNetwork: uncheckedProtocolNetwork, status, minClosedEpoch }, + { models }, +) => { + // Sanitize protocol network identifier + const protocolNetwork = uncheckedProtocolNetwork + ? validateNetworkIdentifier(uncheckedProtocolNetwork) + : undefined + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const sqlAndExpression: WhereOptions = [ + { status }, + { closedEpoch: { [Op.gte]: minClosedEpoch } }, + ] + + if (protocolNetwork) { + sqlAndExpression.push({ protocolNetwork }) + } + + const disputes = await models.POIDispute.findAll({ + where: { [Op.and]: sqlAndExpression }, + order: [['allocationAmount', 'DESC']], + }) + return disputes.map((dispute) => dispute.toGraphQL()) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerAllocations.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerAllocations.ts new file mode 100644 index 000000000..3de4b4635 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerAllocations.ts @@ -0,0 +1,61 @@ +import { extractNetwork } from '../utils' +import type { QueryResolvers } from './../../../types.generated' +import gql from 'graphql-tag' +import { SubgraphDeploymentID } from '@graphprotocol/common-ts' +import { IndexerErrorCode, indexerError } from '../../../../errors' + +export const indexerAllocations: NonNullable< + QueryResolvers['indexerAllocations'] +> = async (_parent, { protocolNetwork }, { multiNetworks, logger }) => { + if (!multiNetworks) { + throw Error( + 'IndexerManagementClient must be in `network` mode to fetch indexer allocations', + ) + } + + const network = extractNetwork(protocolNetwork, multiNetworks) + const address = network.specification.indexerOptions.address + + try { + const result = await network.networkSubgraph.checkedQuery( + gql` + query allocations($indexer: String!) { + allocations( + where: { indexer: $indexer, status: Active } + first: 1000 + orderDirection: desc + ) { + id + allocatedTokens + createdAtEpoch + closedAtEpoch + subgraphDeployment { + id + stakedTokens + signalledTokens + } + } + } + `, + { indexer: address.toLocaleLowerCase() }, + ) + if (result.error) { + throw result.error + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return result.data.allocations.map((allocation: any) => ({ + ...allocation, + subgraphDeployment: new SubgraphDeploymentID(allocation.subgraphDeployment.id) + .ipfsHash, + signalledTokens: allocation.subgraphDeployment.signalledTokens, + stakedTokens: allocation.subgraphDeployment.stakedTokens, + protocolNetwork: network.specification.networkIdentifier, + })) + } catch (error) { + const err = indexerError(IndexerErrorCode.IE010, error) + logger?.error(`Failed to query indexer allocations`, { + err, + }) + throw err + } +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerDeployments.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerDeployments.ts new file mode 100644 index 000000000..9fe7d652c --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerDeployments.ts @@ -0,0 +1,11 @@ +import type { QueryResolvers } from './../../../types.generated' + +export const indexerDeployments: NonNullable< + QueryResolvers['indexerDeployments'] +> = async (_parent, _arg, { graphNode }) => { + const result = await graphNode.indexingStatus([]) + return result.map((status) => ({ + ...status, + subgraphDeployment: status.subgraphDeployment.ipfsHash, + })) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerEndpoints.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerEndpoints.ts new file mode 100644 index 000000000..fc5781ae3 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerEndpoints.ts @@ -0,0 +1,197 @@ +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import type { QueryResolvers } from './../../../types.generated' +import { Network } from '../../../../network' + +const URL_VALIDATION_TEST = { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + test: (url: string) => `URL validation`, + run: async (url: string) => { + new URL(url) + }, + possibleActions: (url: string) => [`Make sure ${url} is a valid URL`], +} + +interface TestResult { + test: string + error: string | null + possibleActions: string[] +} + +interface Endpoint { + url: string | null + healthy: boolean + protocolNetwork: string + // eslint-disable-next-line @typescript-eslint/no-explicit-any + tests: any[] +} + +interface Endpoints { + service: Endpoint + status: Endpoint +} + +function defaultEndpoint(protocolNetwork: string): Endpoint { + return { + url: null as string | null, + healthy: false, + protocolNetwork, + tests: [] as TestResult[], + } +} +function defaultEndpoints(protocolNetwork: string): Endpoints { + return { + service: defaultEndpoint(protocolNetwork), + status: defaultEndpoint(protocolNetwork), + } +} + +const testURL = async ( + url: string, + tests: (typeof URL_VALIDATION_TEST)[], +): Promise<{ url: string; ok: boolean; tests: TestResult[] }> => { + const results: TestResult[] = [] + + for (const test of tests) { + const cmd = test.test(url) + + try { + await test.run(url) + + results.push({ + test: cmd, + error: null, + possibleActions: [], + }) + } catch (e) { + results.push({ + test: cmd, + error: e.message, + possibleActions: test.possibleActions(url), + }) + } + } + + return { url, tests: results, ok: !results.find((result) => result.error !== null) } +} + +async function endpointForNetwork(network: Network): Promise { + const contracts = network.contracts + const address = network.specification.indexerOptions.address + const endpoints = defaultEndpoints(network.specification.networkIdentifier) + const service = await contracts.serviceRegistry.services(address) + if (service) { + { + const { url, tests, ok } = await testURL(service.url, [ + URL_VALIDATION_TEST, + { + test: (url) => `http get ${url}`, + run: async (url) => { + const response = await fetch(url) + if (!response.ok) { + throw new Error( + `Returned status ${response.status}: ${ + response.body ? response.body.toString() : 'No data returned' + }`, + ) + } + }, + possibleActions: (url) => [ + `Make sure ${url} can be resolved and reached from this machine`, + `Make sure the port of ${url} is set up correctly`, + `Make sure the test command returns an HTTP status code < 400`, + ], + }, + ]) + + endpoints.service.url = url + endpoints.service.healthy = ok + endpoints.service.tests = tests + } + + { + const statusURL = endpoints.service.url.endsWith('/') + ? endpoints.service.url.substring(0, endpoints.service.url.length - 1) + '/status' + : endpoints.service.url + '/status' + + const { url, tests, ok } = await testURL(statusURL, [ + URL_VALIDATION_TEST, + { + test: (url) => `http post ${url} query="{ indexingStatuses { subgraph } }"`, + run: async (url) => { + const response = await fetch(url, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ query: '{ indexingStatuses { subgraph } }' }), + }) + if (!response.ok) { + throw new Error( + `Returned status ${response.status}: ${ + response.body ? response.body.toString() : 'No data returned' + }`, + ) + } + }, + possibleActions: (url) => [ + `Make sure ${url} can be reached from this machine`, + `Make sure the port of ${url} is set up correctly`, + `Make sure ${url} is the /status endpoint of indexer-service`, + `Make sure the test command returns an HTTP status code < 400`, + `Make sure the test command returns a valid GraphQL response`, + ], + }, + ]) + + endpoints.status.url = url + endpoints.status.healthy = ok + endpoints.status.tests = tests + } + } + return endpoints +} + +export const indexerEndpoints: NonNullable = async ( + _parent, + { protocolNetwork: unvalidatedProtocolNetwork }, + { multiNetworks, logger }, +) => { + if (!multiNetworks) { + throw Error( + 'IndexerManagementClient must be in `network` mode to fetch indexer endpoints', + ) + } + + const endpoints: Endpoints[] = [] + let networkIdentifier: string | null = null + + // Validate protocol network + try { + if (unvalidatedProtocolNetwork) { + networkIdentifier = validateNetworkIdentifier(unvalidatedProtocolNetwork) + } + } catch (parseError) { + throw new Error( + `Invalid protocol network identifier: '${unvalidatedProtocolNetwork}'. Error: ${parseError}`, + ) + } + + await multiNetworks.map(async (network) => { + // Skip if this query asks for another protocol network + if ( + networkIdentifier && + networkIdentifier !== network.specification.networkIdentifier + ) { + return + } + try { + const networkEndpoints = await endpointForNetwork(network) + endpoints.push(networkEndpoints) + } catch (err) { + // Ignore endpoints for this network + logger?.warn(`Failed to detect service endpoints for network`, { + err, + protocolNetwork: network.specification.networkIdentifier, + }) + } + }) + return endpoints +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerRegistration.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerRegistration.ts new file mode 100644 index 000000000..0fc3ea46d --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexerRegistration.ts @@ -0,0 +1,48 @@ +import { extractNetwork } from '../utils' +import geohash from 'ngeohash' +import type { QueryResolvers } from './../../../types.generated' + +export const indexerRegistration: NonNullable< + QueryResolvers['indexerRegistration'] +> = async ( + _parent, + { protocolNetwork: unvalidatedProtocolNetwork }, + { multiNetworks }, +) => { + if (!multiNetworks) { + throw Error( + 'IndexerManagementClient must be in `network` mode to fetch indexer registration information', + ) + } + + const network = extractNetwork(unvalidatedProtocolNetwork, multiNetworks) + const protocolNetwork = network.specification.networkIdentifier + const address = network.specification.indexerOptions.address + const contracts = network.contracts + const registered = await contracts.serviceRegistry.isRegistered(address) + + if (registered) { + const service = await contracts.serviceRegistry.services(address) + const location = geohash.decode(service.geohash) + return { + address, + protocolNetwork, + url: service.url, + location: { + latitude: location.latitude.toString(), + longitude: location.longitude.toString(), + }, + registered, + __typename: 'IndexerRegistration', + } + } + + return { + address, + url: null, + registered, + protocolNetwork, + location: null, + __typename: 'IndexerRegistration', + } +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexingRule.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexingRule.ts new file mode 100644 index 000000000..1ec7cc510 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexingRule.ts @@ -0,0 +1,33 @@ +import { processIdentifier } from '../../../../subgraphs' +import type { QueryResolvers } from './../../../types.generated' +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import { INDEXING_RULE_GLOBAL } from '../../../../indexer-management/models/indexing-rule' + +export const indexingRule: NonNullable = async ( + _parent, + { identifier: indexingRuleIdentifier, merged }, + { models }, +) => { + const [identifier] = await processIdentifier(indexingRuleIdentifier.identifier, { + all: false, + global: true, + }) + + // Sanitize protocol network identifier + const protocolNetwork = validateNetworkIdentifier( + indexingRuleIdentifier.protocolNetwork, + ) + + const rule = await models.IndexingRule.findOne({ + where: { identifier, protocolNetwork }, + }) + if (rule && merged) { + return rule.mergeToGraphQL( + await models.IndexingRule.findOne({ + where: { identifier: INDEXING_RULE_GLOBAL }, + }), + ) + } else { + return rule?.toGraphQL() || null + } +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexingRules.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexingRules.ts new file mode 100644 index 000000000..2f11e8f0e --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/Query/indexingRules.ts @@ -0,0 +1,15 @@ +import { validateNetworkIdentifier } from '../../../../parsers/validators' +import { fetchIndexingRules } from '../../../../indexer-management/rules' +import type { QueryResolvers } from './../../../types.generated' + +export const indexingRules: NonNullable = async ( + _parent, + { merged, protocolNetwork: uncheckedProtocolNetwork }, + { models }, +) => { + // Convert the input `protocolNetwork` value to a CAIP2-ID + const protocolNetwork = uncheckedProtocolNetwork + ? validateNetworkIdentifier(uncheckedProtocolNetwork) + : undefined + return fetchIndexingRules(models, merged, protocolNetwork) +} diff --git a/packages/indexer-common/src/schema/indexer-management/resolvers/ReallocateAllocationResult.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/ReallocateAllocationResult.ts new file mode 100644 index 000000000..5671e7f63 --- /dev/null +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/ReallocateAllocationResult.ts @@ -0,0 +1,4 @@ +import type { ReallocateAllocationResultResolvers } from './../../types.generated' +export const ReallocateAllocationResult: ReallocateAllocationResultResolvers = { + /* Implement ReallocateAllocationResult resolver logic here */ +} diff --git a/packages/indexer-common/src/indexer-management/resolvers/utils.ts b/packages/indexer-common/src/schema/indexer-management/resolvers/utils.ts similarity index 56% rename from packages/indexer-common/src/indexer-management/resolvers/utils.ts rename to packages/indexer-common/src/schema/indexer-management/resolvers/utils.ts index baa061fdf..f4c404b0e 100644 --- a/packages/indexer-common/src/indexer-management/resolvers/utils.ts +++ b/packages/indexer-common/src/schema/indexer-management/resolvers/utils.ts @@ -1,8 +1,12 @@ import { + IndexerManagementDefaults, + IndexerManagementModels, MultiNetworks, Network, validateNetworkIdentifier, } from '@graphprotocol/indexer-common' +import { IndexingRuleIdentifier } from '../../types.generated' +import { Transaction } from 'sequelize' export function extractNetwork( unvalidatedNetworkIdentifier: string, @@ -24,3 +28,19 @@ export function extractNetwork( } return network } + +export const resetGlobalRule = async ( + ruleIdentifier: IndexingRuleIdentifier, + defaults: IndexerManagementDefaults['globalIndexingRule'], + models: IndexerManagementModels, + transaction: Transaction, +) => { + await models.IndexingRule.upsert( + { + ...defaults, + ...ruleIdentifier, + allocationAmount: defaults.allocationAmount.toString(), + }, + { transaction }, + ) +} diff --git a/packages/indexer-common/src/subgraphs.ts b/packages/indexer-common/src/subgraphs.ts index 0854c670e..e3e95f5e0 100644 --- a/packages/indexer-common/src/subgraphs.ts +++ b/packages/indexer-common/src/subgraphs.ts @@ -2,26 +2,15 @@ import { base58 } from 'ethers/lib/utils' import { BigNumber, utils } from 'ethers' import { Logger, SubgraphDeploymentID } from '@graphprotocol/common-ts' import { SubgraphDeployment } from './types' -import { - INDEXING_RULE_GLOBAL, - IndexingDecisionBasis, - IndexingRuleAttributes, -} from './indexer-management' +import { INDEXING_RULE_GLOBAL } from './indexer-management' import { DocumentNode, print } from 'graphql' import gql from 'graphql-tag' import { QueryResult } from './network-subgraph' import { mergeSelectionSets, sleep } from './utils' +import { IdentifierType, IndexingRule } from './schema/types.generated' -export enum SubgraphIdentifierType { - DEPLOYMENT = 'deployment', - SUBGRAPH = 'subgraph', - GROUP = 'group', -} - -export async function validateSubgraphID( - s: string | undefined, -): Promise { - const type = SubgraphIdentifierType.SUBGRAPH +export async function validateSubgraphID(s: string | undefined): Promise { + const type = IdentifierType.subgraph // Case 1: undefined if (s === undefined) { throw new Error(`No subgraph ID provided. Must be a valid subgraph ID`) @@ -47,8 +36,8 @@ export async function validateSubgraphID( export async function validateDeploymentID( s: string | undefined, -): Promise { - const type = SubgraphIdentifierType.DEPLOYMENT +): Promise { + const type = IdentifierType.deployment // Case 1: undefined if (s === undefined) { throw new Error(`No deployment ID provided. Must be a valid deployment ID`) @@ -83,8 +72,8 @@ export async function validateDeploymentID( export async function validateSubgraphGroupID( s: string | undefined, { all, global }: { all?: boolean; global?: boolean }, -): Promise { - const type = SubgraphIdentifierType.GROUP +): Promise { + const type = IdentifierType.group // Case 1: undefined if (s === undefined) { throw new Error( @@ -110,8 +99,8 @@ export async function validateSubgraphGroupID( export async function processIdentifier( identifier: string, { all, global }: { all?: boolean; global?: boolean }, -): Promise<[string, SubgraphIdentifierType]> { - let type = SubgraphIdentifierType.GROUP +): Promise<[string, IdentifierType]> { + let type: IdentifierType = IdentifierType.group const validationActions = [ validateDeploymentID(identifier), validateSubgraphID(identifier), @@ -123,7 +112,7 @@ export async function processIdentifier( ) as PromiseRejectedResult[] const fulfilled = results.filter( (result) => result.status === 'fulfilled', - ) as PromiseFulfilledResult[] + ) as PromiseFulfilledResult[] if (rejected.length > 2 || fulfilled.length !== 1) { throw new Error( `Invalid subgraph identifier "${identifier}". Subgraph identifier should match 1 type of [deployment ID, subgraph ID, group identifier].`, @@ -132,7 +121,7 @@ export async function processIdentifier( type = fulfilled[0].value return [ - type == SubgraphIdentifierType.DEPLOYMENT + type == IdentifierType.deployment ? new SubgraphDeploymentID(identifier).ipfsHash : identifier, type, @@ -160,7 +149,7 @@ export enum ActivationCriteria { } interface RuleMatch { - rule: IndexingRuleAttributes | undefined + rule: IndexingRule | undefined activationCriteria: ActivationCriteria } @@ -172,7 +161,7 @@ export class AllocationDecision { constructor( deployment: SubgraphDeploymentID, - matchingRule: IndexingRuleAttributes | undefined, + matchingRule: IndexingRule | undefined, toAllocate: boolean, ruleActivator: ActivationCriteria, protocolNetwork: string, @@ -195,7 +184,7 @@ export class AllocationDecision { export function evaluateDeployments( logger: Logger, networkDeployments: SubgraphDeployment[], - rules: IndexingRuleAttributes[], + rules: IndexingRule[], ): AllocationDecision[] { return networkDeployments.map((deployment) => isDeploymentWorthAllocatingTowards(logger, deployment, rules), @@ -205,12 +194,12 @@ export function evaluateDeployments( export function isDeploymentWorthAllocatingTowards( logger: Logger, deployment: SubgraphDeployment, - rules: IndexingRuleAttributes[], + rules: IndexingRule[], ): AllocationDecision { const globalRule = rules.find((rule) => rule.identifier === INDEXING_RULE_GLOBAL) const deploymentRule = rules - .filter((rule) => rule.identifierType == SubgraphIdentifierType.DEPLOYMENT) + .filter((rule) => rule.identifierType == 'deployment') .find( (rule) => new SubgraphDeploymentID(rule.identifier).bytes32 === deployment.id.bytes32, @@ -256,7 +245,7 @@ export function isDeploymentWorthAllocatingTowards( deployment.protocolNetwork, ) - case IndexingDecisionBasis.ALWAYS: + case 'always': return new AllocationDecision( deployment.id, deploymentRule, @@ -264,7 +253,7 @@ export function isDeploymentWorthAllocatingTowards( ActivationCriteria.ALWAYS, deployment.protocolNetwork, ) - case IndexingDecisionBasis.NEVER: + case 'never': return new AllocationDecision( deployment.id, deploymentRule, @@ -272,7 +261,7 @@ export function isDeploymentWorthAllocatingTowards( ActivationCriteria.NEVER, deployment.protocolNetwork, ) - case IndexingDecisionBasis.OFFCHAIN: + case 'offchain': return new AllocationDecision( deployment.id, deploymentRule, @@ -280,7 +269,7 @@ export function isDeploymentWorthAllocatingTowards( ActivationCriteria.OFFCHAIN, deployment.protocolNetwork, ) - case IndexingDecisionBasis.RULES: { + case 'rules': { const stakedTokens = BigNumber.from(deployment.stakedTokens) const signalledTokens = BigNumber.from(deployment.signalledTokens) const avgQueryFees = BigNumber.from(deployment.queryFeesAmount) diff --git a/packages/indexer-common/src/types.ts b/packages/indexer-common/src/types.ts index cfd62747a..19f53ada6 100644 --- a/packages/indexer-common/src/types.ts +++ b/packages/indexer-common/src/types.ts @@ -1,5 +1,6 @@ import { SubgraphDeploymentID } from '@graphprotocol/common-ts' import { BigNumber, providers } from 'ethers' +export { OrderDirection } from './schema/types.generated' export enum AllocationManagementMode { AUTO = 'auto', @@ -12,11 +13,6 @@ export enum DeploymentManagementMode { MANUAL = 'manual', } -export enum OrderDirection { - ASC = 'asc', - DESC = 'desc', -} - export interface BlockPointer { number: number hash: string diff --git a/packages/indexer-service/package.json b/packages/indexer-service/package.json index f6ae9f4fa..77dc0a961 100644 --- a/packages/indexer-service/package.json +++ b/packages/indexer-service/package.json @@ -33,6 +33,7 @@ "dependencies": { "@google-cloud/profiler": "6.0.1", "@graphprotocol/common-ts": "2.0.9", + "@graphql-tools/executor-http": "^1.0.9", "@graphprotocol/indexer-common": "^0.21.4", "@graphprotocol/indexer-native": "0.21.4", "@graphql-tools/load": "8.0.0", diff --git a/packages/indexer-service/src/commands/start.ts b/packages/indexer-service/src/commands/start.ts index 147862be7..eeb296e04 100644 --- a/packages/indexer-service/src/commands/start.ts +++ b/packages/indexer-service/src/commands/start.ts @@ -17,7 +17,7 @@ import { toAddress, } from '@graphprotocol/common-ts' import { - createIndexerManagementClient, + createIndexerManagementYogaClient, defineIndexerManagementModels, defineQueryFeeModels, indexerError, @@ -479,7 +479,7 @@ export default { queryTimingLogs: argv.queryTimingLogs, }) - const indexerManagementClient = await createIndexerManagementClient({ + const indexerManagementClient = await createIndexerManagementYogaClient({ models, graphNode, logger, diff --git a/packages/indexer-service/src/server/cost.ts b/packages/indexer-service/src/server/cost.ts index 1b288733c..ef1e1a5d3 100644 --- a/packages/indexer-service/src/server/cost.ts +++ b/packages/indexer-service/src/server/cost.ts @@ -1,17 +1,21 @@ import { graphqlHTTP } from 'express-graphql' import { Request, Response } from 'express' import { makeExecutableSchema } from '@graphql-tools/schema' -import { IndexerManagementClient } from '@graphprotocol/indexer-common' import gql from 'graphql-tag' import { Metrics, SubgraphDeploymentID } from '@graphprotocol/common-ts' +import { + IndexerManagementYogaClient, + isAsyncIterable, +} from '@graphprotocol/indexer-common' +import { buildHTTPExecutor } from '@graphql-tools/executor-http' export interface GraphQLServerOptions { - indexerManagementClient: IndexerManagementClient + indexerManagementClient: IndexerManagementYogaClient metrics: Metrics } interface Context { - client: IndexerManagementClient + client: IndexerManagementYogaClient } interface CostModelsArgs { @@ -105,6 +109,10 @@ export const createCostServer = async ({ resolvers: { Query: { costModels: async (parent, args: CostModelsArgs, context: Context) => { + const executor = buildHTTPExecutor({ + fetch: context.client.yoga.fetch, + }) + resolverMetrics.costModelBatchQueries.inc() if (!args.deployments) { @@ -118,27 +126,29 @@ export const createCostServer = async ({ const stopTimer = resolverMetrics.costModelBatchQueryDuration.startTimer() try { - const result = await context.client - .query( - gql` - query costModels($deployments: [String!]) { - costModels(deployments: $deployments) { - deployment - model - variables - } + const result = await executor({ + document: gql` + query costModels($deployments: [String!]) { + costModels(deployments: $deployments) { + deployment + model + variables } - `, - { - deployments: args.deployments - ? args.deployments.map(s => new SubgraphDeploymentID(s).bytes32) - : null, - }, - ) - .toPromise() - - if (result.error) { - throw result.error + } + `, + variables: { + deployments: args.deployments + ? args.deployments.map(s => new SubgraphDeploymentID(s).bytes32) + : null, + }, + }) + + if (isAsyncIterable(result)) { + throw new Error('Expected a single result, but got an async iterable') + } + + if (result.errors) { + throw result.errors } return result.data.costModels @@ -152,6 +162,9 @@ export const createCostServer = async ({ costModel: async (parent, args: CostModelArgs, context: Context) => { const deployment = new SubgraphDeploymentID(args.deployment).bytes32 + const executor = buildHTTPExecutor({ + fetch: context.client.yoga.fetch, + }) if (!deployment) { resolverMetrics.invalidCostModelQueries.inc() @@ -164,23 +177,25 @@ export const createCostServer = async ({ deployment, }) try { - const result = await context.client - .query( - gql` - query costModel($deployment: String!) { - costModel(deployment: $deployment) { - deployment - model - variables - } + const result = await executor({ + document: gql` + query costModel($deployment: String!) { + costModel(deployment: $deployment) { + deployment + model + variables } - `, - { deployment }, - ) - .toPromise() + } + `, + variables: { deployment }, + }) + + if (isAsyncIterable(result)) { + throw new Error('Expected a single result, but got an async iterable') + } - if (result.error) { - throw result.error + if (result.errors) { + throw result.errors } return result.data.costModel diff --git a/packages/indexer-service/src/server/index.ts b/packages/indexer-service/src/server/index.ts index 68db157cd..3ea5bfb07 100644 --- a/packages/indexer-service/src/server/index.ts +++ b/packages/indexer-service/src/server/index.ts @@ -15,7 +15,7 @@ import { import { indexerError, IndexerErrorCode, - IndexerManagementClient, + IndexerManagementYogaClient, NetworkSubgraph, } from '@graphprotocol/indexer-common' import { createCostServer } from './cost' @@ -30,7 +30,7 @@ export interface ServerOptions { queryProcessor: QueryProcessor freeQueryAuthToken: string | undefined graphNodeStatusEndpoint: string - indexerManagementClient: IndexerManagementClient + indexerManagementClient: IndexerManagementYogaClient release: { version: string dependencies: { [key: string]: string } diff --git a/yarn.lock b/yarn.lock index 93ea0b242..fed107aaf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,13 +2,18 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" "@apollo/client@~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0": version "3.5.10" @@ -28,6 +33,29 @@ tslib "^2.3.0" zen-observable-ts "^1.2.0" +"@ardatan/relay-compiler@12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" + integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== + dependencies: + "@babel/core" "^7.14.0" + "@babel/generator" "^7.14.0" + "@babel/parser" "^7.14.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.4.0" + chalk "^4.0.0" + fb-watchman "^2.0.0" + fbjs "^3.0.0" + glob "^7.1.1" + immutable "~3.7.6" + invariant "^2.2.4" + nullthrows "^1.1.1" + relay-runtime "12.0.0" + signedsource "^1.0.0" + yargs "^15.3.1" + "@ardatan/sync-fetch@^0.0.1": version "0.0.1" resolved "https://registry.npmjs.org/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz" @@ -35,7 +63,7 @@ dependencies: node-fetch "^2.6.1" -"@babel/code-frame@^7.0.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -43,51 +71,94 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== +"@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.24.2" - picocolors "^1.0.0" + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" -"@babel/compat-data@^7.23.5": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== +"@babel/compat-data@^7.22.9": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz" + integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.20" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.20" + "@babel/types" "^7.22.19" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/core@^7.14.0", "@babel/core@^7.22.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== +"@babel/generator@^7.14.0", "@babel/generator@^7.18.13", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/generator@^7.22.15", "@babel/generator@^7.7.2": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz" + integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== dependencies: - "@babel/types" "^7.24.5" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" + "@babel/types" "^7.22.15" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.23.6": +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== @@ -98,11 +169,45 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6": + version "7.23.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz#25d55fafbaea31fd0e723820bb6cc3df72edf7ea" + integrity sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" @@ -113,76 +218,120 @@ "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.22.20", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: - "@babel/types" "^7.24.0" + "@babel/types" "^7.22.5" -"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-replace-supers@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" -"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== -"@babel/helper-validator-identifier@^7.22.20": +"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== +"@babel/helpers@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz" + integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" "@babel/highlight@^7.22.13": version "7.22.20" @@ -193,199 +342,486 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" - picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": + version "7.22.16" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz" + integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== + +"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== "@babel/parser@^7.20.15": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz#084564e0f3cc21ea6c70c44cff984a1c0509729a" + integrity sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.23.3": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" - integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5" + integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" + integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz#cfa7ca159cc3306fab526fc67091556b51af26ff" + integrity sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.23.3" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e" + integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== dependencies: "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== +"@babel/plugin-transform-object-super@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" + integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/types" "^7.23.4" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/runtime@^7.0.0": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/traverse@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== +"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== +"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.20": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz" + integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.16" + "@babel/types" "^7.22.19" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.3.3": + version "7.22.19" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz" + integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.19" + to-fast-properties "^2.0.0" + +"@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9": + version "7.23.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@cspotcode/source-map-consumer@0.8.0": version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + resolved "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz" integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== "@cspotcode/source-map-support@0.7.0": version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz" integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== dependencies: "@cspotcode/source-map-consumer" "0.8.0" +"@eddeee888/gcg-server-config@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@eddeee888/gcg-server-config/-/gcg-server-config-0.1.0.tgz#5afc5c7ad277b186909d9e994cc8bd95bc069cce" + integrity sha512-ZM4Cfem3FWelpz5sdCfJ+fZTCyY1WDdcT6K5GZ/UZpr7JjMApSMKnf+o9VMT2T+BB91Hffr0AH8W4oLEWUEWuw== + dependencies: + "@graphql-codegen/typescript" "^4.0.0" + "@graphql-codegen/typescript-resolvers" "^4.0.0" + +"@eddeee888/gcg-typescript-resolver-files@^0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@eddeee888/gcg-typescript-resolver-files/-/gcg-typescript-resolver-files-0.7.2.tgz#4c46039a4878cfb458eabd4208f26799995325bf" + integrity sha512-9LBkn6pGtXSQmH9rLoF/CkUUlsNwX4A539pRolr/yS++arGN871IptmZ89ezM4iGbbW/OPwp+Zp7AmNTgBExmA== + dependencies: + "@eddeee888/gcg-server-config" "0.1.0" + "@graphql-codegen/add" "^5.0.0" + "@graphql-codegen/plugin-helpers" "^5.0.0" + "@graphql-codegen/typescript" "^4.0.0" + "@graphql-codegen/typescript-resolvers" "^4.0.0" + ts-morph "^19.0.0" + tslib "^2.3.0" + +"@envelop/core@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@envelop/core/-/core-5.0.0.tgz#131616ad9685599e501b14fdf1a983cfd3b72020" + integrity sha512-aJdnH/ptv+cvwfvciCBe7TSvccBwo9g0S5f6u35TBVzRVqIGkK03lFlIL+x1cnfZgN9EfR2b1PH2galrT1CdCQ== + dependencies: + "@envelop/types" "5.0.0" + tslib "^2.5.0" + +"@envelop/types@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@envelop/types/-/types-5.0.0.tgz#3ae59b50ec31d4bdcc7bd0b47e9c8cf2ac44b0ff" + integrity sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA== + dependencies: + tslib "^2.5.0" + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.8.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz" + integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== -"@eslint/eslintrc@^2.1.2", "@eslint/eslintrc@^2.1.4": +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -400,12 +836,12 @@ "@eslint/js@8.49.0": version "8.49.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz" integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== "@eslint/js@8.55.0": version "8.55.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.55.0.tgz#b721d52060f369aa259cf97392403cb9ce892ec6" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz" integrity sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA== "@ethereumjs/rlp@^4.0.1": @@ -930,7 +1366,7 @@ "@graphprotocol/cost-model@0.1.18": version "0.1.18" - resolved "https://registry.yarnpkg.com/@graphprotocol/cost-model/-/cost-model-0.1.18.tgz#703b4557ff77fc4d6d3857ac8b830862c95b24fe" + resolved "https://registry.npmjs.org/@graphprotocol/cost-model/-/cost-model-0.1.18.tgz" integrity sha512-OZGQwUi5+YQM/mT/Zei09P5S28YYbP+YDFI8sZnJmqp6OrDTxD3f6L9E6upcxzqRxgXqewJC3JBwSC1D0wMs4g== dependencies: "@mapbox/node-pre-gyp" "1.0.11" @@ -946,6 +1382,187 @@ split2 "^3.1.1" through2 "^3.0.1" +"@graphql-codegen/add@^5.0.0", "@graphql-codegen/add@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-5.0.2.tgz#71b3ae0465a4537172dddb84531b6967ca5545f2" + integrity sha512-ouBkSvMFUhda5VoKumo/ZvsZM9P5ZTyDsI8LW18VxSNWOjrTeLXBWHG8Gfaai0HwhflPtCYVABbriEcOmrRShQ== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + tslib "~2.6.0" + +"@graphql-codegen/cli@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-5.0.2.tgz#07ff691c16da4c3dcc0e1995d3231530379ab317" + integrity sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw== + dependencies: + "@babel/generator" "^7.18.13" + "@babel/template" "^7.18.10" + "@babel/types" "^7.18.13" + "@graphql-codegen/client-preset" "^4.2.2" + "@graphql-codegen/core" "^4.0.2" + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-tools/apollo-engine-loader" "^8.0.0" + "@graphql-tools/code-file-loader" "^8.0.0" + "@graphql-tools/git-loader" "^8.0.0" + "@graphql-tools/github-loader" "^8.0.0" + "@graphql-tools/graphql-file-loader" "^8.0.0" + "@graphql-tools/json-file-loader" "^8.0.0" + "@graphql-tools/load" "^8.0.0" + "@graphql-tools/prisma-loader" "^8.0.0" + "@graphql-tools/url-loader" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + "@whatwg-node/fetch" "^0.8.0" + chalk "^4.1.0" + cosmiconfig "^8.1.3" + debounce "^1.2.0" + detect-indent "^6.0.0" + graphql-config "^5.0.2" + inquirer "^8.0.0" + is-glob "^4.0.1" + jiti "^1.17.1" + json-to-pretty-yaml "^1.2.2" + listr2 "^4.0.5" + log-symbols "^4.0.0" + micromatch "^4.0.5" + shell-quote "^1.7.3" + string-env-interpolation "^1.0.1" + ts-log "^2.2.3" + tslib "^2.4.0" + yaml "^2.3.1" + yargs "^17.0.0" + +"@graphql-codegen/client-preset@^4.2.2": + version "4.2.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.2.3.tgz#5ccb357aad8b35e2745ebe25f7bb9fbd9d919202" + integrity sha512-ygfIKMtjoPY4iISYfNpvuVvV2e6BYAzHnC+MfDul7kZwY1pvv0P+IhezOaTHOheoTiah1BA7USFEOE5Nzp3Gdw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + "@graphql-codegen/add" "^5.0.2" + "@graphql-codegen/gql-tag-operations" "4.0.5" + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/typed-document-node" "^5.0.5" + "@graphql-codegen/typescript" "^4.0.5" + "@graphql-codegen/typescript-operations" "^4.1.3" + "@graphql-codegen/visitor-plugin-common" "^5.0.0" + "@graphql-tools/documents" "^1.0.0" + "@graphql-tools/utils" "^10.0.0" + "@graphql-typed-document-node/core" "3.2.0" + tslib "~2.6.0" + +"@graphql-codegen/core@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-4.0.2.tgz#7e6ec266276f54bbf02f60599d9e518f4a59d85e" + integrity sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "~2.6.0" + +"@graphql-codegen/gql-tag-operations@4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.5.tgz#7b1cbfbea0775bf5eb53c97e3a3fa4c28778a01a" + integrity sha512-FDiL1/fdP60Y10yQD+SsYoaApGLoirF4ATfi4eFklXu7GGosJzZBxni2D3+f99Qxd0iK368O3Dtbe38Z+Vd8Vg== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/visitor-plugin-common" "5.0.0" + "@graphql-tools/utils" "^10.0.0" + auto-bind "~4.0.0" + tslib "~2.6.0" + +"@graphql-codegen/plugin-helpers@^5.0.0", "@graphql-codegen/plugin-helpers@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.3.tgz#7027b9d911d7cb594663590fcf5d63e9cf7ec2ff" + integrity sha512-yZ1rpULIWKBZqCDlvGIJRSyj1B2utkEdGmXZTBT/GVayP4hyRYlkd36AJV/LfEsVD8dnsKL5rLz2VTYmRNlJ5Q== + dependencies: + "@graphql-tools/utils" "^10.0.0" + change-case-all "1.0.15" + common-tags "1.8.2" + import-from "4.0.0" + lodash "~4.17.0" + tslib "~2.6.0" + +"@graphql-codegen/schema-ast@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-4.0.2.tgz#aeaa104e4555cca73a058f0a9350b4b0e290b377" + integrity sha512-5mVAOQQK3Oz7EtMl/l3vOQdc2aYClUzVDHHkMvZlunc+KlGgl81j8TLa+X7ANIllqU4fUEsQU3lJmk4hXP6K7Q== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-tools/utils" "^10.0.0" + tslib "~2.6.0" + +"@graphql-codegen/typed-document-node@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.5.tgz#a7674dcde8713a12611a76e28a4918116a427fb5" + integrity sha512-1bWoHYL8673zqq/yyp3L93JKTYrDNLymvibaldWn90PASI770gJ4fzH71RhkGaJDq0F43wmQk0sjz3s/RoKsLA== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/visitor-plugin-common" "5.0.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + tslib "~2.6.0" + +"@graphql-codegen/typescript-operations@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.1.3.tgz#730ba21fb0f20f451e090983512c0b4153ec0acb" + integrity sha512-Goga2ISgicr/PLgK2NH5kwyQFctoGKpV+nv4Dr9II0xjHuuNvC6cqA66y/p8zKx6eS9p2GV87/IafqxV8r6K5Q== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/typescript" "^4.0.5" + "@graphql-codegen/visitor-plugin-common" "5.0.0" + auto-bind "~4.0.0" + tslib "~2.6.0" + +"@graphql-codegen/typescript-resolvers@^4.0.0": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-resolvers/-/typescript-resolvers-4.0.5.tgz#9d60b7f3b7123ed93ece94ffacaab49c10f7ea7b" + integrity sha512-So6UvQRpOvyZz3YkGANY7+QqNj90LeSkV81Feak8x+JdBzrtzNUoPbxnVNCTOw2v7sbv8w18JZKs+++WVV5Ptg== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/typescript" "^4.0.5" + "@graphql-codegen/visitor-plugin-common" "5.0.0" + "@graphql-tools/utils" "^10.0.0" + auto-bind "~4.0.0" + tslib "~2.6.0" + +"@graphql-codegen/typescript@^4.0.0", "@graphql-codegen/typescript@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.5.tgz#dc9849a8c8a8d0bbcf9f7cb2af8ee77943e00874" + integrity sha512-PCS6LovGhyNfnmZ2AJ8rN5wGUhysWNsFwCPrZccuwBVCCvcet8/GNKStY5cHiDqG0B5Q+6g8OXVbffhxkkytLA== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-codegen/schema-ast" "^4.0.2" + "@graphql-codegen/visitor-plugin-common" "5.0.0" + auto-bind "~4.0.0" + tslib "~2.6.0" + +"@graphql-codegen/visitor-plugin-common@5.0.0", "@graphql-codegen/visitor-plugin-common@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.0.0.tgz#23258c52277a8be206c2d69aadf9738dd780f1c0" + integrity sha512-qQOZZZ2MxmBEyd0Lm3lVh7zgauLXVBsg3ToucQJHmbk2WUxLMOcaf/+BOBIkrDjvWA8L+JU6COUT6uZc57DBcw== + dependencies: + "@graphql-codegen/plugin-helpers" "^5.0.3" + "@graphql-tools/optimize" "^2.0.0" + "@graphql-tools/relay-operation-optimizer" "^7.0.0" + "@graphql-tools/utils" "^10.0.0" + auto-bind "~4.0.0" + change-case-all "1.0.15" + dependency-graph "^0.11.0" + graphql-tag "^2.11.0" + parse-filepath "^1.0.2" + tslib "~2.6.0" + +"@graphql-tools/apollo-engine-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.0.tgz#ac1f351cbe41508411784f25757f5557b0f27489" + integrity sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/utils" "^10.0.0" + "@whatwg-node/fetch" "^0.9.0" + tslib "^2.4.0" + "@graphql-tools/batch-execute@^9.0.1": version "9.0.2" resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.2.tgz" @@ -956,6 +1573,17 @@ tslib "^2.4.0" value-or-promise "^1.0.12" +"@graphql-tools/code-file-loader@^8.0.0": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-8.1.1.tgz#517c37d4f8a20b2c6558b10cbe9a6f9bcfe98918" + integrity sha512-q4KN25EPSUztc8rA8YUU3ufh721Yk12xXDbtUA+YstczWS7a1RJlghYMFEfR1HsHSYbF7cUqkbnTKSGM3o52bQ== + dependencies: + "@graphql-tools/graphql-tag-pluck" "8.3.0" + "@graphql-tools/utils" "^10.0.13" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + "@graphql-tools/delegate@^10.0.0", "@graphql-tools/delegate@^10.0.3": version "10.0.3" resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.3.tgz" @@ -968,6 +1596,14 @@ dataloader "^2.2.2" tslib "^2.5.0" +"@graphql-tools/documents@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/documents/-/documents-1.0.0.tgz#e3ed97197cc22ec830ca227fd7d17e86d8424bdf" + integrity sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg== + dependencies: + lodash.sortby "^4.7.0" + tslib "^2.4.0" + "@graphql-tools/executor-graphql-ws@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.0.tgz" @@ -993,27 +1629,121 @@ tslib "^2.4.0" value-or-promise "^1.0.12" +"@graphql-tools/executor-http@^1.0.5": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.0.8.tgz#01e01915634acb65385a6cc0c60f0acdd5989026" + integrity sha512-tBHT4aRkMCeyo+tcfEz7znqdd4QqoYF9vY1YTSo2+FV00usBB+R1YL3YaINBQNVkSVpZ41elffoF/fjI+QE8ZQ== + dependencies: + "@graphql-tools/utils" "^10.0.2" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/fetch" "^0.9.0" + extract-files "^11.0.0" + meros "^1.2.1" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/executor-http@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.0.9.tgz#87ca8b99a32241eb0cc30a9c500d2672e92d58b7" + integrity sha512-+NXaZd2MWbbrWHqU4EhXcrDbogeiCDmEbrAN+rMn4Nu2okDjn2MTFDbTIab87oEubQCH4Te1wDkWPKrzXup7+Q== + dependencies: + "@graphql-tools/utils" "^10.0.13" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/fetch" "^0.9.0" + extract-files "^11.0.0" + meros "^1.2.1" + tslib "^2.4.0" + value-or-promise "^1.0.12" + "@graphql-tools/executor-legacy-ws@^1.0.0": version "1.0.3" resolved "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.3.tgz" integrity sha512-rr3IDeO9Dh+8u8KIro++5kzJJYPHkcrIAWzqXtN663nhInC85iW7Ko91yOYwf7ovBci/7s+4Rqe4ZRyca1LGjQ== dependencies: "@graphql-tools/utils" "^10.0.0" - "@types/ws" "^8.0.0" - isomorphic-ws "5.0.0" + "@types/ws" "^8.0.0" + isomorphic-ws "5.0.0" + tslib "^2.4.0" + ws "8.14.1" + +"@graphql-tools/executor@^1.0.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.0.tgz" + integrity sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg== + dependencies: + "@graphql-tools/utils" "^10.0.0" + "@graphql-typed-document-node/core" "3.2.0" + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/git-loader@^8.0.0": + version "8.0.5" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-8.0.5.tgz#77f9c2a35fdb3a403d33660ed11702720d4b016e" + integrity sha512-P97/1mhruDiA6D5WUmx3n/aeGPLWj2+4dpzDOxFGGU+z9NcI/JdygMkeFpGZNHeJfw+kHfxgPcMPnxHcyhAoVA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "8.3.0" + "@graphql-tools/utils" "^10.0.13" + is-glob "4.0.3" + micromatch "^4.0.4" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/github-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-8.0.0.tgz#683195800618364701cfea9bc6f88674486f053b" + integrity sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/executor-http" "^1.0.0" + "@graphql-tools/graphql-tag-pluck" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + "@whatwg-node/fetch" "^0.9.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/graphql-file-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.0.tgz#a2026405bce86d974000455647511bf65df4f211" + integrity sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg== + dependencies: + "@graphql-tools/import" "7.0.0" + "@graphql-tools/utils" "^10.0.0" + globby "^11.0.3" + tslib "^2.4.0" + unixify "^1.0.0" + +"@graphql-tools/graphql-tag-pluck@8.3.0", "@graphql-tools/graphql-tag-pluck@^8.0.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.0.tgz#11bb8c627253137b39b34fb765cd6ebe506388b9" + integrity sha512-gNqukC+s7iHC7vQZmx1SEJQmLnOguBq+aqE2zV2+o1hxkExvKqyFli1SY/9gmukFIKpKutCIj+8yLOM+jARutw== + dependencies: + "@babel/core" "^7.22.9" + "@babel/parser" "^7.16.8" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@graphql-tools/utils" "^10.0.13" + tslib "^2.4.0" + +"@graphql-tools/import@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-7.0.0.tgz#a6a91a90a707d5f46bad0fd3fde2f407b548b2be" + integrity sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw== + dependencies: + "@graphql-tools/utils" "^10.0.0" + resolve-from "5.0.0" tslib "^2.4.0" - ws "8.14.1" -"@graphql-tools/executor@^1.0.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.0.tgz" - integrity sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg== +"@graphql-tools/json-file-loader@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-8.0.0.tgz#9b1b62902f766ef3f1c9cd1c192813ea4f48109c" + integrity sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg== dependencies: "@graphql-tools/utils" "^10.0.0" - "@graphql-typed-document-node/core" "3.2.0" - "@repeaterjs/repeater" "^3.0.4" + globby "^11.0.3" tslib "^2.4.0" - value-or-promise "^1.0.12" + unixify "^1.0.0" "@graphql-tools/load@8.0.0": version "8.0.0" @@ -1025,6 +1755,16 @@ p-limit "3.1.0" tslib "^2.4.0" +"@graphql-tools/load@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-8.0.1.tgz#498f2230448601cb87894b8a93df7867daef69ea" + integrity sha512-qSMsKngJhDqRbuWyo3NvakEFqFL6+eSjy8ooJ1o5qYD26N7dqXkKzIMycQsX7rBK19hOuINAUSaRcVWH6hTccw== + dependencies: + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.11" + p-limit "3.1.0" + tslib "^2.4.0" + "@graphql-tools/merge@8.2.8": version "8.2.8" resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.8.tgz" @@ -1041,6 +1781,46 @@ "@graphql-tools/utils" "^10.0.0" tslib "^2.4.0" +"@graphql-tools/optimize@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-2.0.0.tgz#7a9779d180824511248a50c5a241eff6e7a2d906" + integrity sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg== + dependencies: + tslib "^2.4.0" + +"@graphql-tools/prisma-loader@^8.0.0": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-8.0.2.tgz#3a7126ec2389a7aa7846bd0e441629ac5a1934fc" + integrity sha512-8d28bIB0bZ9Bj0UOz9sHagVPW+6AHeqvGljjERtwCnWl8OCQw2c2pNboYXISLYUG5ub76r4lDciLLTU+Ks7Q0w== + dependencies: + "@graphql-tools/url-loader" "^8.0.0" + "@graphql-tools/utils" "^10.0.8" + "@types/js-yaml" "^4.0.0" + "@types/json-stable-stringify" "^1.0.32" + "@whatwg-node/fetch" "^0.9.0" + chalk "^4.1.0" + debug "^4.3.1" + dotenv "^16.0.0" + graphql-request "^6.0.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + jose "^5.0.0" + js-yaml "^4.0.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.20" + scuid "^1.1.0" + tslib "^2.4.0" + yaml-ast-parser "^0.0.43" + +"@graphql-tools/relay-operation-optimizer@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.0.tgz#24367666af87bc5a81748de5e8e9b3c523fd4207" + integrity sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw== + dependencies: + "@ardatan/relay-compiler" "12.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + "@graphql-tools/schema@8.3.8": version "8.3.8" resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.8.tgz" @@ -1080,6 +1860,25 @@ value-or-promise "^1.0.11" ws "^8.12.0" +"@graphql-tools/url-loader@^8.0.0": + version "8.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-8.0.1.tgz#91247247d253c538c4c28376ca74d944fa8cfb82" + integrity sha512-B2k8KQEkEQmfV1zhurT5GLoXo8jbXP+YQHUayhCSxKYlRV7j/1Fhp1b21PDM8LXIDGlDRXaZ0FbWKOs7eYXDuQ== + dependencies: + "@ardatan/sync-fetch" "^0.0.1" + "@graphql-tools/delegate" "^10.0.0" + "@graphql-tools/executor-graphql-ws" "^1.0.0" + "@graphql-tools/executor-http" "^1.0.5" + "@graphql-tools/executor-legacy-ws" "^1.0.0" + "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/wrap" "^10.0.0" + "@types/ws" "^8.0.0" + "@whatwg-node/fetch" "^0.9.0" + isomorphic-ws "^5.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.11" + ws "^8.12.0" + "@graphql-tools/utils@8.6.7": version "8.6.7" resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.6.7.tgz" @@ -1096,6 +1895,16 @@ dset "^3.1.2" tslib "^2.4.0" +"@graphql-tools/utils@^10.0.11", "@graphql-tools/utils@^10.0.13", "@graphql-tools/utils@^10.0.8": + version "10.0.13" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.13.tgz#d0ab7a4dd02a8405f5ef62dd140b7579ba69f8cb" + integrity sha512-fMILwGr5Dm2zefNItjQ6C2rauigklv69LIwppccICuGTnGaOp3DspLt/6Lxj72cbg5d9z60Sr+Egco3CJKLsNg== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + cross-inspect "1.0.0" + dset "^3.1.2" + tslib "^2.4.0" + "@graphql-tools/wrap@10.0.1", "@graphql-tools/wrap@^10.0.0": version "10.0.1" resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.1.tgz" @@ -1107,11 +1916,36 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.0.0", "@graphql-typed-document-node/core@^3.1.1": +"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.0.0", "@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": version "3.2.0" resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== +"@graphql-yoga/logger@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@graphql-yoga/logger/-/logger-2.0.0.tgz#51c91cf07fc42b0d100d887315a20a4c9cac342e" + integrity sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA== + dependencies: + tslib "^2.5.2" + +"@graphql-yoga/subscription@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@graphql-yoga/subscription/-/subscription-5.0.0.tgz#c0aedd3f7c0c0564a2fe687e9f45c16f70bdffc5" + integrity sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw== + dependencies: + "@graphql-yoga/typed-event-target" "^3.0.0" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/events" "^0.1.0" + tslib "^2.5.2" + +"@graphql-yoga/typed-event-target@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@graphql-yoga/typed-event-target/-/typed-event-target-3.0.0.tgz#57dc42e052d8294555d26ee61854d72a0236fee0" + integrity sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg== + dependencies: + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.5.2" + "@grpc/grpc-js@~1.8.0": version "1.8.22" resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.8.22.tgz#847930c9af46e14df05b57fc12325db140ceff1d" @@ -1130,24 +1964,38 @@ protobufjs "^7.2.4" yargs "^17.7.2" -"@humanwhocodes/config-array@^0.11.11", "@humanwhocodes/config-array@^0.11.13": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== + dependencies: + "@humanwhocodes/object-schema" "^2.0.1" + debug "^4.1.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" @@ -1178,7 +2026,7 @@ "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -1187,14 +2035,14 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": +"@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz" integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: "@jest/types" "^29.6.3" @@ -1206,7 +2054,7 @@ "@jest/core@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz" integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: "@jest/console" "^29.7.0" @@ -1240,7 +2088,7 @@ "@jest/environment@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: "@jest/fake-timers" "^29.7.0" @@ -1250,14 +2098,14 @@ "@jest/expect-utils@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" "@jest/expect@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz" integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: expect "^29.7.0" @@ -1265,7 +2113,7 @@ "@jest/fake-timers@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" @@ -1277,7 +2125,7 @@ "@jest/globals@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz" integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: "@jest/environment" "^29.7.0" @@ -1287,7 +2135,7 @@ "@jest/reporters@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz" integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -1317,14 +2165,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" @@ -1333,7 +2181,7 @@ "@jest/test-result@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz" integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: "@jest/console" "^29.7.0" @@ -1343,7 +2191,7 @@ "@jest/test-sequencer@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: "@jest/test-result" "^29.7.0" @@ -1353,7 +2201,7 @@ "@jest/transform@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" @@ -1374,7 +2222,7 @@ "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -1384,34 +2232,34 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: - "@jridgewell/set-array" "^1.2.1" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1423,6 +2271,11 @@ dependencies: lodash "^4.17.21" +"@kamilkisiela/fast-url-parser@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@kamilkisiela/fast-url-parser/-/fast-url-parser-1.1.4.tgz#9d68877a489107411b953c54ea65d0658b515809" + integrity sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew== + "@lerna/add@6.1.0": version "6.1.0" resolved "https://registry.npmjs.org/@lerna/add/-/add-6.1.0.tgz" @@ -2610,6 +3463,33 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" +"@peculiar/asn1-schema@^2.3.8": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz#04b38832a814e25731232dd5be883460a156da3b" + integrity sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.5" + tslib "^2.6.2" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.5.tgz#424bed6b0d133b772f5cbffd143d0468a90f40a0" + integrity sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw== + dependencies: + "@peculiar/asn1-schema" "^2.3.8" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.5" + tslib "^2.6.2" + webcrypto-core "^1.7.8" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" @@ -2784,19 +3664,19 @@ "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" @@ -2874,7 +3754,7 @@ "@thi.ng/heaps@1.2.38": version "1.2.38" - resolved "https://registry.npmjs.org/@thi.ng/heaps/-/heaps-1.2.38.tgz" + resolved "https://registry.npmjs.org/@thi.ng/heaps/-/heaps-1.2.38.tgz#c5027c02bedb41644fc71d109cd16a878a48ad0b" integrity sha512-lWDQsGmt6YuHgmog4wpSKa7wqawt0JVyCREWc/J2bA9vcg/cYfljda2teVTA3rTUhKWs/S2htorN8On7+Rxt5A== dependencies: "@thi.ng/api" "^7.1.4" @@ -2938,29 +3818,39 @@ resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@ts-morph/common@~0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.20.0.tgz#3f161996b085ba4519731e4d24c35f6cba5b80af" + integrity sha512-7uKjByfbPpwuzkstL3L5MQyuXPSKdoNG93Fmi2JoDcTf3pEP731JdRFAduRVkOs8oqxPsXKA+ScrWkdQ8t/I+Q== + dependencies: + fast-glob "^3.2.12" + minimatch "^7.4.3" + mkdirp "^2.1.6" + path-browserify "^1.0.1" + "@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@typechain/ethers-v5@^11.1.2": version "11.1.2" - resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-11.1.2.tgz" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-11.1.2.tgz#82510c1744f37a2f906b9e0532ac18c0b74ffe69" integrity sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ== dependencies: lodash "^4.17.15" @@ -2972,9 +3862,9 @@ integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== "@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + version "7.20.2" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz" + integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -2983,38 +3873,30 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" - integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== + version "7.6.5" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz" + integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== + version "7.4.2" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz" + integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.2" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz" + integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== dependencies: "@babel/types" "^7.20.7" -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/body-parser@1.19.3": +"@types/body-parser@*", "@types/body-parser@1.19.3": version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz" integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== dependencies: "@types/connect" "*" @@ -3022,7 +3904,7 @@ "@types/bs58@4.0.1": version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/bs58/-/bs58-4.0.1.tgz#3d51222aab067786d3bc3740a84a7f5a0effaa37" + resolved "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.1.tgz" integrity sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA== dependencies: base-x "^3.0.6" @@ -3032,14 +3914,7 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/connect@^3.4.33": +"@types/connect@*", "@types/connect@^3.4.33": version "3.4.36" resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz" integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== @@ -3051,14 +3926,14 @@ resolved "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.3.tgz" integrity sha512-B6Mzad6H4RugduMX84ehFVvGM/JRAd9lZQk4a6dztB4+zcIUehIjKrbWH/nHO2+0wwx05rgyqjXBvOjAv0uL6A== -"@types/cookiejar@^2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.5.tgz#14a3e83fa641beb169a2dd8422d91c3c345a9a78" - integrity sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q== +"@types/cookiejar@*": + version "2.1.2" + resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz" + integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== "@types/cors@2.8.14": version "2.8.14" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz" integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== dependencies: "@types/node" "*" @@ -3070,17 +3945,7 @@ dependencies: "@types/ms" "*" -"@types/express-serve-static-core@^4.17.33": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" - integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^4.17.9": +"@types/express-serve-static-core@^4.17.33", "@types/express-serve-static-core@^4.17.9": version "4.17.36" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz" integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== @@ -3092,7 +3957,7 @@ "@types/express@4.17.17": version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== dependencies: "@types/body-parser" "*" @@ -3109,58 +3974,68 @@ "@types/node" "*" "@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + version "4.1.6" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== dependencies: "@types/node" "*" "@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + version "2.0.2" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz" + integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== "@types/isomorphic-fetch@0.0.35": version "0.0.35" - resolved "https://registry.yarnpkg.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.35.tgz#c1c0d402daac324582b6186b91f8905340ea3361" + resolved "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.35.tgz" integrity sha512-DaZNUvLDCAnCTjgwxgiL1eQdxIKEpNLOlTNtAgnZc50bG2copGhRrFN9/PxPBuJe+tZVLCbQ7ls0xveXVRPkvw== "@types/isomorphic-fetch@0.0.36": version "0.0.36" - resolved "https://registry.yarnpkg.com/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.36.tgz#3a6d8f63974baf26b10fd1314db910633108a769" + resolved "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.36.tgz" integrity sha512-ulw4d+vW1HKn4oErSmNN2HYEcHGq0N1C5exlrMM0CRqX1UUpFhGb5lwiom5j9KN3LBJJDLRmYIZz1ghm7FIzZw== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@29.5.4": version "29.5.4" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.4.tgz#9d0a16edaa009a71e6a71a999acd582514dab566" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.4.tgz" integrity sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A== dependencies: expect "^29.0.0" pretty-format "^29.0.0" +"@types/js-yaml@^4.0.0": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" + integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== + "@types/json-schema@^7.0.12": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + version "7.0.13" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + +"@types/json-stable-stringify@^1.0.32": + version "1.0.36" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.36.tgz#fe6c6001a69ff8160a772da08779448a333c7ddd" + integrity sha512-b7bq23s4fgBB76n34m2b3RBf6M369B0Z9uRR8aHTMd8kZISRkmDEpPD8hhpYvDFzr3bJCPES96cm3Q6qRNDbQw== "@types/linkify-it@^5": version "5.0.0" @@ -3175,15 +4050,15 @@ "@types/lodash" "*" "@types/lodash.countby@^4.6.7": - version "4.6.9" - resolved "https://registry.yarnpkg.com/@types/lodash.countby/-/lodash.countby-4.6.9.tgz#ca7821679cffa3b7b8ae9b7efe4d596901b90230" - integrity sha512-9KPA3nQsnAeaaIHKEPBucaUnII51lKfh89dCQh00Nq+Rk+gifnsqGEhluidGrcukjhP8NRYJ3EEqw2zHBsJtJA== + version "4.6.7" + resolved "https://registry.npmjs.org/@types/lodash.countby/-/lodash.countby-4.6.7.tgz" + integrity sha512-RkkfnOXscBXuRc9Iay+tMHtaztdRCtU7doEwi5yLEV/7UHRyy5yS+ppZCzFl06s6lWt6fcHKAN8F6kyes6js5g== dependencies: "@types/lodash" "*" "@types/lodash.groupby@^4.6.7": version "4.6.9" - resolved "https://registry.yarnpkg.com/@types/lodash.groupby/-/lodash.groupby-4.6.9.tgz#ea1aa9da1038ca50894d1fe1a3b5dabdf865d99c" + resolved "https://registry.npmjs.org/@types/lodash.groupby/-/lodash.groupby-4.6.9.tgz#ea1aa9da1038ca50894d1fe1a3b5dabdf865d99c" integrity sha512-z2xtCX2ko7GrqORnnYea4+ksT7jZNAvaOcLd6mP9M7J09RHvJs06W8BGdQQAX8ARef09VQLdeRilSOcfHlDQJQ== dependencies: "@types/lodash" "*" @@ -3197,15 +4072,15 @@ "@types/lodash.isequal@4.5.6": version "4.5.6" - resolved "https://registry.yarnpkg.com/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz#ff42a1b8e20caa59a97e446a77dc57db923bc02b" + resolved "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz" integrity sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg== dependencies: "@types/lodash" "*" "@types/lodash.mapvalues@^4.6.7": - version "4.6.9" - resolved "https://registry.yarnpkg.com/@types/lodash.mapvalues/-/lodash.mapvalues-4.6.9.tgz#1edb4b1d299db332166b474221b06058b34030a7" - integrity sha512-NyAIgUrI+nnr3VoJbiAlUfqBT2M/65mOCm+LerHgYE7lEyxXUAalZiMIL37GBnfg0QOMMBEPW4osdiMjsoEA4g== + version "4.6.7" + resolved "https://registry.npmjs.org/@types/lodash.mapvalues/-/lodash.mapvalues-4.6.7.tgz" + integrity sha512-yGTo9zD60Iw1Q+YBvx4Ad7RDj5rA6EpvYTpVPVsfe6pwHcwDcGChSqL1n2sPBMbCeHJ3R5kcaqpkdlrFe/y4Vg== dependencies: "@types/lodash" "*" @@ -3217,9 +4092,9 @@ "@types/lodash" "*" "@types/lodash.zip@^4.2.7": - version "4.2.9" - resolved "https://registry.yarnpkg.com/@types/lodash.zip/-/lodash.zip-4.2.9.tgz#1c10d42c73c99917a45b62cd25053214ab55ffcb" - integrity sha512-cJvqtEzLgHUPF6H6v7K6Q/yIc1DAYpsUkHD1Q7bUOAcCE0b7drzoUMi/Toj0MjQI3WeM6rI6v295mkenAQ+R7A== + version "4.2.7" + resolved "https://registry.npmjs.org/@types/lodash.zip/-/lodash.zip-4.2.7.tgz" + integrity sha512-wRtK2bZ0HYXkJkeldrD35qOquGn5GOmp8+o886N18Aqw2DGFLP7JCTEb00j3xQZ+PCMTyfMS2OMbLUwah+bcyg== dependencies: "@types/lodash" "*" @@ -3246,10 +4121,10 @@ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== -"@types/methods@^1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@types/methods/-/methods-1.1.4.tgz#d3b7ac30ac47c91054ea951ce9eed07b1051e547" - integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== +"@types/mime@*": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/mime@^1": version "1.3.2" @@ -3273,7 +4148,7 @@ "@types/morgan@1.9.5": version "1.9.5" - resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.5.tgz#dda7388af1e67863f9fa4496d6d63f6f53334306" + resolved "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.5.tgz" integrity sha512-5TgfIWm0lcTGnbCZExwc19dCOMOMmAiiBZQj8Ko3NRxsVDgRxf+AEGRQTqNVA5Yh2xfdWp4clbAEMbYP+jkOqg== dependencies: "@types/node" "*" @@ -3285,7 +4160,7 @@ "@types/ngeohash@0.6.4": version "0.6.4" - resolved "https://registry.yarnpkg.com/@types/ngeohash/-/ngeohash-0.6.4.tgz#a1ba2c25c4d1ef71f067de247a61490019ea0757" + resolved "https://registry.npmjs.org/@types/ngeohash/-/ngeohash-0.6.4.tgz" integrity sha512-rr20mmx41OkWx4q5du2dv2sESR/6xH2tzScUQXwO8SiaQWa6PYTuan1nqBtA76FR9qkVfZY7nwQwZNC9StX/Ww== "@types/node@*", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0": @@ -3295,7 +4170,7 @@ "@types/node@20.6.1": version "20.6.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.1.tgz#8b589bba9b2af0128796461a0979764562687e6f" + resolved "https://registry.npmjs.org/@types/node/-/node-20.6.1.tgz" integrity sha512-4LcJvuXQlv4lTHnxwyHQZ3uR9Zw2j7m1C9DfuwoTFQQP4Pmu04O6IfLYgMmHoOCt0nosItLLZAH+sOrRE0Bo8g== "@types/node@^12.12.54": @@ -3314,13 +4189,13 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/parsimmon@^1.10.6": - version "1.10.9" - resolved "https://registry.yarnpkg.com/@types/parsimmon/-/parsimmon-1.10.9.tgz#14e60db223c1d213fea0e15985d480b5cfe1789a" - integrity sha512-O2M2x1w+m7gWLen8i5DOy6tWRnbRcsW6Pke3j3HAsJUrPb4g0MgjksIUm2aqUtCYxy7Qjr3CzjjwQBzhiGn46A== + version "1.10.6" + resolved "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.6.tgz" + integrity sha512-FwAQwMRbkhx0J6YELkwIpciVzCcgEqXEbIrIn3a2P5d3kGEHQ3wVhlN3YdVepYP+bZzCYO6OjmD4o9TGOZ40rA== "@types/prettier@^2.1.1": version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@*": @@ -3356,16 +4231,11 @@ "@types/glob" "*" "@types/node" "*" -"@types/semver@^7.0.0": +"@types/semver@^7.0.0", "@types/semver@^7.5.0": version "7.5.2" resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz" integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== -"@types/semver@^7.5.0": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - "@types/send@*": version "0.17.1" resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz" @@ -3375,31 +4245,30 @@ "@types/node" "*" "@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + version "1.15.2" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== dependencies: "@types/http-errors" "*" + "@types/mime" "*" "@types/node" "*" - "@types/send" "*" "@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/superagent@*": - version "8.1.7" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-8.1.7.tgz#1153819ed4db34427409a1cc58f3e2f13eeec862" - integrity sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww== + version "4.1.18" + resolved "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.18.tgz" + integrity sha512-LOWgpacIV8GHhrsQU+QMZuomfqXiqzz3ILLkCtKx3Us6AmomFViuzKT9D693QTKgyut2oCytMG8/efOop+DB+w== dependencies: - "@types/cookiejar" "^2.1.5" - "@types/methods" "^1.1.4" + "@types/cookiejar" "*" "@types/node" "*" "@types/supertest@2.0.12": version "2.0.12" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" + resolved "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz" integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== dependencies: "@types/superagent" "*" @@ -3434,27 +4303,27 @@ "@types/node" "*" "@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@17.0.10": version "17.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz" integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.24" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@6.13.2": version "6.13.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz#2e03506c5362a65e43cb132c37c9ce2d3cb51470" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz" integrity sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ== dependencies: "@eslint-community/regexpp" "^4.5.1" @@ -3471,7 +4340,7 @@ "@typescript-eslint/eslint-plugin@6.7.0": version "6.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz#ed2a38867190f8a688af85ad7c8a74670b8b3675" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz" integrity sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag== dependencies: "@eslint-community/regexpp" "^4.5.1" @@ -3488,7 +4357,7 @@ "@typescript-eslint/parser@6.13.2": version "6.13.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.13.2.tgz#390b79cc9a57a5f904d197a201cc4b6bc4f9afb9" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.13.2.tgz" integrity sha512-MUkcC+7Wt/QOGeVlM8aGGJZy1XV5YKjTpq9jK6r6/iLsGXhBVaGP5N0UYvFsu9BFlSpwY9kMretzdBH01rkRXg== dependencies: "@typescript-eslint/scope-manager" "6.13.2" @@ -3499,7 +4368,7 @@ "@typescript-eslint/parser@6.7.0": version "6.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.7.0.tgz#332fe9c7ecf6783d3250b4c8a960bd4af0995807" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.0.tgz" integrity sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng== dependencies: "@typescript-eslint/scope-manager" "6.7.0" @@ -3510,7 +4379,7 @@ "@typescript-eslint/scope-manager@6.13.2": version "6.13.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz#5fa4e4adace028dafac212c770640b94e7b61052" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz" integrity sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA== dependencies: "@typescript-eslint/types" "6.13.2" @@ -3518,7 +4387,7 @@ "@typescript-eslint/scope-manager@6.7.0": version "6.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz#6b3c22187976e2bf5ed0dc0d9095f1f2cbd1d106" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz" integrity sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA== dependencies: "@typescript-eslint/types" "6.7.0" @@ -3526,7 +4395,7 @@ "@typescript-eslint/type-utils@6.13.2": version "6.13.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz#ebec2da14a6bb7122e0fd31eea72a382c39c6102" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz" integrity sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw== dependencies: "@typescript-eslint/typescript-estree" "6.13.2" @@ -3536,7 +4405,7 @@ "@typescript-eslint/type-utils@6.7.0": version "6.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz#21a013d4c7f96255f5e64ac59fb41301d1e052ba" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz" integrity sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg== dependencies: "@typescript-eslint/typescript-estree" "6.7.0" @@ -3546,17 +4415,17 @@ "@typescript-eslint/types@6.13.2": version "6.13.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.13.2.tgz#c044aac24c2f6cefb8e921e397acad5417dd0ae6" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz" integrity sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg== "@typescript-eslint/types@6.7.0": version "6.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.7.0.tgz#8de8ba9cafadc38e89003fe303e219c9250089ae" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz" integrity sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q== "@typescript-eslint/typescript-estree@6.13.2": version "6.13.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz#ae556ee154c1acf025b48d37c3ef95a1d55da258" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz" integrity sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w== dependencies: "@typescript-eslint/types" "6.13.2" @@ -3569,7 +4438,7 @@ "@typescript-eslint/typescript-estree@6.7.0": version "6.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz#20ce2801733bd46f02cc0f141f5b63fbbf2afb63" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz" integrity sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ== dependencies: "@typescript-eslint/types" "6.7.0" @@ -3582,7 +4451,7 @@ "@typescript-eslint/utils@6.13.2": version "6.13.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.13.2.tgz#8eb89e53adc6d703a879b131e528807245486f89" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz" integrity sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" @@ -3595,7 +4464,7 @@ "@typescript-eslint/utils@6.7.0": version "6.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.7.0.tgz#61b6f1f1b82ad529abfcee074d21764e880886fb" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.0.tgz" integrity sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" @@ -3608,7 +4477,7 @@ "@typescript-eslint/visitor-keys@6.13.2": version "6.13.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz#e0a4a80cf842bb08e6127b903284166ac4a5594c" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz" integrity sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw== dependencies: "@typescript-eslint/types" "6.13.2" @@ -3616,7 +4485,7 @@ "@typescript-eslint/visitor-keys@6.7.0": version "6.7.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz#34140ac76dfb6316d17012e4469acf3366ad3f44" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz" integrity sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ== dependencies: "@typescript-eslint/types" "6.7.0" @@ -3624,7 +4493,7 @@ "@ungap/structured-clone@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== "@uniswap/sdk@3.0.3": @@ -3661,11 +4530,27 @@ "@urql/core" ">=2.3.6" wonka "^4.0.14" +"@whatwg-node/events@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.3.tgz#13a65dd4f5893f55280f766e29ae48074927acad" + integrity sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA== + "@whatwg-node/events@^0.1.0": version "0.1.1" resolved "https://registry.npmjs.org/@whatwg-node/events/-/events-0.1.1.tgz" integrity sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w== +"@whatwg-node/fetch@^0.8.0": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.8.tgz#48c6ad0c6b7951a73e812f09dd22d75e9fa18cae" + integrity sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + "@whatwg-node/node-fetch" "^0.3.6" + busboy "^1.6.0" + urlpattern-polyfill "^8.0.0" + web-streams-polyfill "^3.2.1" + "@whatwg-node/fetch@^0.9.0": version "0.9.13" resolved "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.9.13.tgz" @@ -3674,6 +4559,25 @@ "@whatwg-node/node-fetch" "^0.4.17" urlpattern-polyfill "^9.0.0" +"@whatwg-node/fetch@^0.9.10", "@whatwg-node/fetch@^0.9.7": + version "0.9.16" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.9.16.tgz#c833eb714f41f5d2caf1a345bed7a05f56db7b16" + integrity sha512-mqasZiUNquRe3ea9+aCAuo81BR6vq5opUKprPilIHTnrg8a21Z1T1OrI+KiMFX8OmwO5HUJe/vro47lpj2JPWQ== + dependencies: + "@whatwg-node/node-fetch" "^0.5.5" + urlpattern-polyfill "^10.0.0" + +"@whatwg-node/node-fetch@^0.3.6": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz#e28816955f359916e2d830b68a64493124faa6d0" + integrity sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA== + dependencies: + "@whatwg-node/events" "^0.0.3" + busboy "^1.6.0" + fast-querystring "^1.1.1" + fast-url-parser "^1.1.3" + tslib "^2.3.1" + "@whatwg-node/node-fetch@^0.4.17": version "0.4.19" resolved "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.4.19.tgz" @@ -3685,6 +4589,25 @@ fast-url-parser "^1.1.3" tslib "^2.3.1" +"@whatwg-node/node-fetch@^0.5.5": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.5.6.tgz#3ec2044ff66dd78134492b5f2f841bedf1cc73c9" + integrity sha512-cmAsGMHoI0S3AHi3CmD3ma1Q234ZI2JNmXyDyM9rLtbXejBKxU3ZWdhS+mzRIAyUxZCMGlFW1tHmROv0MDdxpw== + dependencies: + "@kamilkisiela/fast-url-parser" "^1.1.4" + "@whatwg-node/events" "^0.1.0" + busboy "^1.6.0" + fast-querystring "^1.1.1" + tslib "^2.3.1" + +"@whatwg-node/server@^0.9.1": + version "0.9.25" + resolved "https://registry.yarnpkg.com/@whatwg-node/server/-/server-0.9.25.tgz#23c136ddcb7e5517120bb953ce4d3bac5b96be56" + integrity sha512-DlPqPPcfyzh4/9Lz1fl4c5bZsGp/1wCh7B+cK8FE1bWoW7tlZkVguvGn/XnYPKthGzEIwo/fLdHwevH44z+eeg== + dependencies: + "@whatwg-node/fetch" "^0.9.10" + tslib "^2.3.1" + "@wry/context@^0.6.0": version "0.6.1" resolved "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz" @@ -3755,7 +4678,7 @@ abbrev@1, abbrev@^1.0.0: abitype@^0.10.3: version "0.10.3" - resolved "https://registry.npmjs.org/abitype/-/abitype-0.10.3.tgz" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.10.3.tgz#27ce7a7cdb9a80ccd732a3f3cf1ce6ff05266fce" integrity sha512-tRN+7XIa7J9xugdbRzFv/95ka5ivR/sRe01eiWvM0HWWjHuigSZEACgKa0sj4wGuekTDtghCx+5Izk/cOi78pQ== abort-controller@^3.0.0: @@ -3780,18 +4703,18 @@ accepts@^1.3.7, accepts@~1.3.8: acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== acorn@^8.4.1, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== add-stream@^1.0.0: version "1.0.0" @@ -3810,10 +4733,10 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agent-base@^7.0.2: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== dependencies: debug "^4.3.4" @@ -3862,7 +4785,7 @@ ansi-colors@^4.1.1: resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -3871,7 +4794,7 @@ ansi-escapes@^4.2.1: ansi-regex@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== ansi-regex@^3.0.0: @@ -3891,7 +4814,7 @@ ansi-regex@^6.0.1: ansi-styles@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== ansi-styles@^3.2.1: @@ -3910,7 +4833,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.1.0: @@ -3920,7 +4843,7 @@ ansi-styles@^6.1.0: anymatch@^1.3.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz" integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== dependencies: micromatch "^2.1.5" @@ -3928,7 +4851,7 @@ anymatch@^1.3.0: anymatch@^3.0.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -4012,7 +4935,7 @@ are-we-there-yet@^3.0.0: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7, argparse@~1.0.9: @@ -4029,34 +4952,34 @@ argparse@^2.0.1: arr-diff@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz" integrity sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA== dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== array-back@^4.0.1, array-back@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== array-differ@^3.0.0: @@ -4081,12 +5004,12 @@ array-union@^2.1.0: array-unique@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg== array-unique@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== arrify@^1.0.1: @@ -4099,11 +5022,20 @@ arrify@^2.0.0, arrify@^2.0.1: resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0: +asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" @@ -4111,7 +5043,7 @@ assert-plus@^1.0.0: assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== astral-regex@^2.0.0: @@ -4121,7 +5053,7 @@ astral-regex@^2.0.0: async-each@^1.0.0: version "1.0.6" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" + resolved "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz" integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== async@^3.2.3: @@ -4141,7 +5073,7 @@ at-least-node@^1.0.0: atob@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== atomic-sleep@^1.0.0: @@ -4149,6 +5081,11 @@ atomic-sleep@^1.0.0: resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== +auto-bind@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + avvio@^7.1.2: version "7.2.5" resolved "https://registry.npmjs.org/avvio/-/avvio-7.2.5.tgz" @@ -4193,7 +5130,7 @@ axios@^1.0.0: babel-cli@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + resolved "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz" integrity sha512-wau+BDtQfuSBGQ9PzzFL3REvR9Sxnd4LKwtcHAiPjhugA7K/80vpHXafj+O5bAqJOuSefjOx5ZJnNSR2J1Qw6Q== dependencies: babel-core "^6.26.0" @@ -4215,7 +5152,7 @@ babel-cli@^6.26.0: babel-code-frame@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g== dependencies: chalk "^1.1.3" @@ -4224,7 +5161,7 @@ babel-code-frame@^6.26.0: babel-core@^6.26.0: version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz" integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: babel-code-frame "^6.26.0" @@ -4249,7 +5186,7 @@ babel-core@^6.26.0: babel-generator@^6.26.0: version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz" integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" @@ -4263,7 +5200,7 @@ babel-generator@^6.26.0: babel-helpers@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + resolved "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz" integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ== dependencies: babel-runtime "^6.22.0" @@ -4271,7 +5208,7 @@ babel-helpers@^6.24.1: babel-jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: "@jest/transform" "^29.7.0" @@ -4284,14 +5221,14 @@ babel-jest@^29.7.0: babel-messages@^6.23.0: version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz" integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w== dependencies: babel-runtime "^6.22.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -4302,7 +5239,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" @@ -4310,9 +5247,14 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + babel-polyfill@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + resolved "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz" integrity sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ== dependencies: babel-runtime "^6.26.0" @@ -4321,7 +5263,7 @@ babel-polyfill@^6.26.0: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -4337,9 +5279,42 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + babel-preset-jest@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: babel-plugin-jest-hoist "^29.6.3" @@ -4347,7 +5322,7 @@ babel-preset-jest@^29.6.3: babel-register@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + resolved "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz" integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A== dependencies: babel-core "^6.26.0" @@ -4360,7 +5335,7 @@ babel-register@^6.26.0: babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== dependencies: core-js "^2.4.0" @@ -4368,7 +5343,7 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz" integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg== dependencies: babel-runtime "^6.26.0" @@ -4379,7 +5354,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babel-traverse@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz" integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA== dependencies: babel-code-frame "^6.26.0" @@ -4394,7 +5369,7 @@ babel-traverse@^6.26.0: babel-types@^6.26.0: version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g== dependencies: babel-runtime "^6.26.0" @@ -4404,7 +5379,7 @@ babel-types@^6.26.0: babylon@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== balanced-match@^1.0.0: @@ -4414,7 +5389,7 @@ balanced-match@^1.0.0: base-x@^3.0.6: version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" @@ -4431,7 +5406,7 @@ base64-js@^1.3.0, base64-js@^1.3.1: base@^0.11.1: version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" @@ -4483,7 +5458,7 @@ bin-links@^3.0.0: binary-extensions@^1.0.0: version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== bindings@^1.2.1, bindings@^1.5.0: @@ -4580,7 +5555,7 @@ brace-expansion@^2.0.1: braces@^1.8.2: version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + resolved "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz" integrity sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw== dependencies: expand-range "^1.8.1" @@ -4589,7 +5564,7 @@ braces@^1.8.2: braces@^2.3.1: version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" @@ -4615,6 +5590,16 @@ brorand@^1.1.0: resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + browserslist@^4.22.2: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" @@ -4627,7 +5612,7 @@ browserslist@^4.22.2: bs-logger@0.x: version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" @@ -4641,7 +5626,7 @@ bs58@5.0.0: bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" @@ -4747,7 +5732,7 @@ cacache@^17.0.0: cache-base@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" @@ -4768,7 +5753,7 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" -call-bind@^1.0.7: +call-bind@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -4784,6 +5769,14 @@ callsites@^3.0.0: resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" @@ -4800,13 +5793,27 @@ camelcase@^5.0.0, camelcase@^5.3.1: camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +caniuse-lite@^1.0.30001517: + version "1.0.30001538" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz" + integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== + caniuse-lite@^1.0.30001587: - version "1.0.30001616" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz#4342712750d35f71ebba9fcac65e2cf8870013c3" - integrity sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw== + version "1.0.30001588" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz#07f16b65a7f95dba82377096923947fb25bce6e3" + integrity sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ== + +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" cargo-cp-artifact@0.1.8: version "0.1.8" @@ -4830,7 +5837,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== dependencies: ansi-styles "^2.2.1" @@ -4856,9 +5863,43 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case-all@1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.15.tgz#de29393167fc101d646cd76b0ef23e27d09756ad" + integrity sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ== + dependencies: + change-case "^4.1.2" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lower-case "^2.0.2" + lower-case-first "^2.0.2" + sponge-case "^1.0.1" + swap-case "^2.0.2" + title-case "^3.0.3" + upper-case "^2.0.2" + upper-case-first "^2.0.2" + +change-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== chardet@^0.7.0: @@ -4868,7 +5909,7 @@ chardet@^0.7.0: chokidar@^1.6.1: version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz" integrity sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg== dependencies: anymatch "^1.3.0" @@ -4893,18 +5934,18 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + version "3.8.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== cjs-module-lexer@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.2.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== class-utils@^0.3.5: version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" @@ -4944,11 +5985,28 @@ cli-table3@~0.5.0: optionalDependencies: colors "^1.1.2" +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" @@ -4990,17 +6048,22 @@ cmd-shim@^5.0.0: co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== +code-block-writer@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-12.0.0.tgz#4dd58946eb4234105aff7f0035977b2afdc2a770" + integrity sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w== + collect-v8-coverage@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== dependencies: map-visit "^1.0.0" @@ -5035,6 +6098,11 @@ color-support@^1.1.2, color-support@^1.1.3: resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + colors@^1.1.2, colors@^1.3.3: version "1.4.0" resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" @@ -5062,7 +6130,7 @@ combined-stream@^1.0.6, combined-stream@^1.0.8: command-line-args@^5.1.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== dependencies: array-back "^3.1.0" @@ -5072,7 +6140,7 @@ command-line-args@^5.1.1: command-line-usage@^6.1.0: version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -5095,6 +6163,11 @@ common-ancestor-path@^1.0.1: resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz" integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== +common-tags@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" @@ -5104,9 +6177,9 @@ compare-func@^2.0.0: dot-prop "^5.1.0" component-emitter@^1.2.1, component-emitter@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + version "1.3.0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== concat-map@0.0.1: version "0.0.1" @@ -5148,6 +6221,15 @@ console-table-printer@^2.11.1: dependencies: simple-wcswidth "^1.0.1" +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" @@ -5242,14 +6324,14 @@ conventional-recommended-bump@^6.1.0: meow "^8.0.0" q "^1.5.1" -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.5.0, convert-source-map@^1.5.1, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: @@ -5269,17 +6351,17 @@ cookie@^0.4.1: cookiejar@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz" integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== copy-descriptor@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-util-is@1.0.2, core-util-is@~1.0.0: @@ -5317,9 +6399,19 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.1.0, cosmiconfig@^8.1.3: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + create-jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== dependencies: "@jest/types" "^29.6.3" @@ -5332,7 +6424,7 @@ create-jest@^29.7.0: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@4.0.0: @@ -5342,6 +6434,20 @@ cross-fetch@4.0.0: dependencies: node-fetch "^2.6.12" +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +cross-inspect@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cross-inspect/-/cross-inspect-1.0.0.tgz#5fda1af759a148594d2d58394a9e21364f6849af" + integrity sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ== + dependencies: + tslib "^2.4.0" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" @@ -5371,6 +6477,11 @@ dateformat@^3.0.0: resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +debounce@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -5410,7 +6521,7 @@ decimal.js-light@^2.5.0: decode-uri-component@^0.2.0: version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== dedent@^0.7.0: @@ -5419,18 +6530,18 @@ dedent@^0.7.0: integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + version "1.5.1" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== deep-extend@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: @@ -5445,7 +6556,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.1.4: +define-data-property@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -5461,21 +6572,21 @@ define-lazy-prop@^2.0.0: define-property@^0.2.5: version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" @@ -5506,6 +6617,11 @@ depd@~1.1.2: resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +dependency-graph@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" + integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== + deprecation@^2.0.0, deprecation@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz" @@ -5518,7 +6634,7 @@ destroy@1.2.0: detect-indent@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz" integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A== dependencies: repeating "^2.0.0" @@ -5540,7 +6656,7 @@ detect-libc@^2.0.0: detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== dezalgo@^1.0.0, dezalgo@^1.0.4: @@ -5553,12 +6669,12 @@ dezalgo@^1.0.0, dezalgo@^1.0.4: diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dir-glob@^3.0.1: @@ -5570,7 +6686,7 @@ dir-glob@^3.0.1: doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" @@ -5580,6 +6696,14 @@ dom-walk@^0.1.0: resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" @@ -5594,6 +6718,11 @@ dot-prop@^6.0.0, dot-prop@^6.0.1: dependencies: is-obj "^2.0.0" +dotenv@^16.0.0: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + dotenv@~10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" @@ -5604,6 +6733,11 @@ dottie@^2.0.6: resolved "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz" integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== +dset@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.3.tgz#c194147f159841148e8e34ca41f638556d9542d2" + integrity sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ== + dset@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/dset/-/dset-3.1.2.tgz" @@ -5653,10 +6787,15 @@ ejs@^3.1.7: dependencies: jake "^10.8.5" +electron-to-chromium@^1.4.477: + version "1.4.523" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz" + integrity sha512-9AreocSUWnzNtvLcbpng6N+GkXnCcBR80IQkxRC9Dfdyg4gaWNUPBujAHUpKkiUkoSoR9UlhA4zD/IgBklmhzg== + electron-to-chromium@^1.4.668: - version "1.4.758" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.758.tgz#f39e530cae2ca4329a0f0e1840629d8d1da73156" - integrity sha512-/o9x6TCdrYZBMdGeTifAP3wlF/gVT+TtWJe3BSmtNh92Mw81U9hrYwW9OAGUh+sEOX/yz5e34sksqRruZbjYrw== + version "1.4.677" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.677.tgz#49ee77713516740bdde32ac2d1443c444f0dafe7" + integrity sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q== elliptic@6.5.4: version "6.5.4" @@ -5678,7 +6817,7 @@ emittery@^0.10.0: emittery@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: @@ -5785,11 +6924,6 @@ escalade@^3.1.1: resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" @@ -5802,12 +6936,12 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^1.13.0: @@ -5824,22 +6958,22 @@ escodegen@^1.13.0: eslint-config-prettier@8.5.0: version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== eslint-config-prettier@9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-config-prettier@^8.5.0: version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -5847,12 +6981,12 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@8.49.0: version "8.49.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz" integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -5895,7 +7029,7 @@ eslint@8.49.0: eslint@8.55.0: version "8.55.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.55.0.tgz#078cb7b847d66f2c254ea1794fa395bf8e7e03f8" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz" integrity sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -5939,7 +7073,7 @@ eslint@8.55.0: espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -5953,14 +7087,14 @@ esprima@^4.0.0, esprima@^4.0.1: esquery@^1.4.2: version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" @@ -5972,12 +7106,12 @@ estraverse@^4.2.0: estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== etag@~1.8.1: @@ -6112,19 +7246,19 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expand-brackets@^0.1.4: version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz" integrity sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA== dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== dependencies: debug "^2.3.3" @@ -6137,14 +7271,14 @@ expand-brackets@^2.1.4: expand-range@^1.8.1: version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + resolved "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz" integrity sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA== dependencies: fill-range "^2.1.0" expect@^29.0.0, expect@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: "@jest/expect-utils" "^29.7.0" @@ -6212,14 +7346,14 @@ express@4.18.2: extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" @@ -6241,14 +7375,14 @@ external-editor@^3.0.3: extglob@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + resolved "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz" integrity sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg== dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" @@ -6296,6 +7430,17 @@ fast-glob@3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.12: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.9: version "3.3.1" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" @@ -6324,7 +7469,7 @@ fast-json-stringify@^2.5.2: fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-querystring@^1.1.1: @@ -6396,11 +7541,29 @@ fastq@^1.6.0, fastq@^1.6.1: fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" + integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== + dependencies: + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^1.0.35" + figures@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" @@ -6410,7 +7573,7 @@ figures@3.2.0, figures@^3.0.0: file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" @@ -6429,12 +7592,12 @@ filelist@^1.0.4: filename-regex@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + resolved "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz" integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ== fill-range@^2.1.0: version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz" integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" @@ -6445,7 +7608,7 @@ fill-range@^2.1.0: fill-range@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== dependencies: extend-shallow "^2.0.1" @@ -6485,7 +7648,7 @@ find-my-way@^4.1.0: find-replace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== dependencies: array-back "^3.0.1" @@ -6507,7 +7670,7 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -6519,11 +7682,11 @@ findit2@^2.2.3: integrity sha512-lg/Moejf4qXovVutL0Lz4IsaPoNYMuxt4PA0nGqFxnJ1CTTGGlEO2wKgoDpwknhvZ8k4Q2F+eesgkLbG2Mxfog== flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + version "3.1.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.2.9" + flatted "^3.2.7" keyv "^4.5.3" rimraf "^3.0.2" @@ -6537,10 +7700,10 @@ flatstr@^1.0.12: resolved "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz" integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +flatted@^3.2.7: + version "3.2.9" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: version "1.15.2" @@ -6549,12 +7712,12 @@ follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== for-own@^0.1.4: version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + resolved "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz" integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== dependencies: for-in "^1.0.1" @@ -6587,7 +7750,7 @@ form-data@^4.0.0: formidable@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.2.tgz#fa973a2bec150e4ce7cac15589d7a25fc30ebd89" + resolved "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz" integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== dependencies: dezalgo "^1.0.4" @@ -6602,7 +7765,7 @@ forwarded@0.2.0: fragment-cache@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== dependencies: map-cache "^0.2.2" @@ -6628,7 +7791,7 @@ fs-extra@^11.1.0: fs-extra@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -6677,7 +7840,7 @@ fs-minipass@^3.0.0: fs-readdir-recursive@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== fs.realpath@^1.0.0: @@ -6687,7 +7850,7 @@ fs.realpath@^1.0.0: fsevents@^1.0.0: version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz" integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" @@ -6695,7 +7858,7 @@ fsevents@^1.0.0: fsevents@^2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1, function-bind@^1.1.2: @@ -6790,10 +7953,10 @@ gcp-metadata@^6.0.0, gcp-metadata@^6.1.0: gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -6808,7 +7971,7 @@ get-intrinsic@^1.0.2: has-proto "^1.0.1" has-symbols "^1.0.3" -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -6821,7 +7984,7 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-pkg-repo@^4.0.0: @@ -6853,7 +8016,7 @@ get-stream@^6.0.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== git-raw-commits@^2.0.8: @@ -6907,7 +8070,7 @@ gitconfiglocal@^1.0.0: glob-base@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + resolved "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz" integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA== dependencies: glob-parent "^2.0.0" @@ -6915,7 +8078,7 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz" integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w== dependencies: is-glob "^2.0.0" @@ -6929,7 +8092,7 @@ glob-parent@^5.1.1, glob-parent@^5.1.2: glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" @@ -6948,7 +8111,7 @@ glob@7.1.4: glob@7.1.7: version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" @@ -6969,7 +8132,7 @@ glob@^10.2.2: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7002,22 +8165,22 @@ global@4.4.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + version "13.21.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" globals@^9.18.0: version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== -globby@^11.0.2, globby@^11.1.0: +globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -7135,10 +8298,42 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.4 graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -graphql-tag@2.12.6, graphql-tag@^2.12.3: +graphql-config@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-5.0.3.tgz#d9aa2954cf47a927f9cb83cdc4e42ae55d0b321e" + integrity sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ== + dependencies: + "@graphql-tools/graphql-file-loader" "^8.0.0" + "@graphql-tools/json-file-loader" "^8.0.0" + "@graphql-tools/load" "^8.0.0" + "@graphql-tools/merge" "^9.0.0" + "@graphql-tools/url-loader" "^8.0.0" + "@graphql-tools/utils" "^10.0.0" + cosmiconfig "^8.1.0" + jiti "^1.18.2" + minimatch "^4.2.3" + string-env-interpolation "^1.0.1" + tslib "^2.4.0" + +graphql-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + +graphql-scalars@^1.22.5: + version "1.22.5" + resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.22.5.tgz#f7aceacf0efd2f38d53635c69895e3c67c04bd37" + integrity sha512-Mw7uaqRscjdaXmxlHbt3sYGLU8o1hfFvTvN2VRrYEJyEPy6zGIbaFyJ4PPyt9H6GRHp01MQwS6HqXroRYHyGOg== + dependencies: + tslib "^2.5.0" + +graphql-tag@2.12.6, graphql-tag@^2.11.0, graphql-tag@^2.12.3: version "2.12.6" resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== @@ -7160,6 +8355,23 @@ graphql-ws@^5.14.0: resolved "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.14.0.tgz" integrity sha512-itrUTQZP/TgswR4GSSYuwWUzrE/w5GhbwM2GX3ic2U7aw33jgEsayfIlvaj7/GcIvZgNMzsPTrE5hqPuFUiE5g== +graphql-yoga@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/graphql-yoga/-/graphql-yoga-5.1.1.tgz#e47f48217a4c7907290fdf164d9a4c7edb50e30b" + integrity sha512-oak5nVKTHpqJgpA1aT3cJPOlCidrW7l6nbc5L6w07VdFul16ielGI2ZnQDAXO+qQih09/4WspD5x0SsSZH+hkg== + dependencies: + "@envelop/core" "^5.0.0" + "@graphql-tools/executor" "^1.0.0" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + "@graphql-yoga/logger" "^2.0.0" + "@graphql-yoga/subscription" "^5.0.0" + "@whatwg-node/fetch" "^0.9.7" + "@whatwg-node/server" "^0.9.1" + dset "^3.1.1" + lru-cache "^10.0.0" + tslib "^2.5.2" + graphql@16.8.0: version "16.8.0" resolved "https://registry.npmjs.org/graphql/-/graphql-16.8.0.tgz" @@ -7201,7 +8413,7 @@ hard-rejection@^2.1.0: has-ansi@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== dependencies: ansi-regex "^2.0.0" @@ -7216,7 +8428,7 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== @@ -7240,7 +8452,7 @@ has-unicode@^2.0.1: has-value@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== dependencies: get-value "^2.0.3" @@ -7249,7 +8461,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== dependencies: get-value "^2.0.6" @@ -7258,12 +8470,12 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== has-values@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== dependencies: is-number "^3.0.0" @@ -7285,12 +8497,20 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: minimalistic-assert "^1.0.1" hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + version "2.0.0" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: function-bind "^1.1.2" +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + helmet@7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/helmet/-/helmet-7.0.0.tgz" @@ -7298,7 +8518,7 @@ helmet@7.0.0: hexoid@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" + resolved "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz" integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== hmac-drbg@^1.0.1: @@ -7319,7 +8539,7 @@ hoist-non-react-statics@^3.3.2: home-or-tmp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + resolved "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz" integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg== dependencies: os-homedir "^1.0.0" @@ -7358,7 +8578,7 @@ html-entities@^2.5.2: html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: @@ -7397,6 +8617,14 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" @@ -7405,6 +8633,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + dependencies: + agent-base "^7.0.2" + debug "4" + https-proxy-agent@^7.0.1: version "7.0.5" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" @@ -7456,17 +8692,17 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" -ignore@^5.0.4, ignore@^5.2.0: +ignore@^5.0.4, ignore@^5.2.0, ignore@^5.2.4: version "5.2.4" resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw== -import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -7474,6 +8710,11 @@ import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" + integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== + import-local@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" @@ -7533,7 +8774,7 @@ init-package-json@^3.0.2: validate-npm-package-license "^3.0.4" validate-npm-package-name "^4.0.0" -inquirer@^8.2.4: +inquirer@^8.0.0, inquirer@^8.2.4: version "8.2.6" resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz" integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== @@ -7554,9 +8795,9 @@ inquirer@^8.2.4: through "^2.3.6" wrap-ansi "^6.0.1" -invariant@^2.2.2: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" @@ -7571,9 +8812,17 @@ ipaddr.js@1.9.1: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + is-accessor-descriptor@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz" integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== dependencies: hasown "^2.0.0" @@ -7585,14 +8834,14 @@ is-arrayish@^0.2.1: is-binary-path@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-ci@^2.0.0: @@ -7611,14 +8860,14 @@ is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: is-data-descriptor@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz" integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== dependencies: hasown "^2.0.0" is-descriptor@^0.1.0: version "0.1.7" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz" integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== dependencies: is-accessor-descriptor "^1.0.1" @@ -7626,7 +8875,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz" integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== dependencies: is-accessor-descriptor "^1.0.1" @@ -7639,31 +8888,31 @@ is-docker@^2.0.0, is-docker@^2.1.1: is-dotfile@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + resolved "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz" integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg== is-equal-shallow@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + resolved "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" integrity sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA== dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== is-extglob@^2.1.1: @@ -7673,7 +8922,7 @@ is-extglob@^2.1.1: is-finite@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fullwidth-code-point@^2.0.0: @@ -7688,23 +8937,23 @@ is-fullwidth-code-point@^3.0.0: is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== - dependencies: - is-extglob "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: +is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== + dependencies: + is-extglob "^1.0.0" + is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" @@ -7720,23 +8969,30 @@ is-lambda@^1.0.1: resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" + integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== + dependencies: + tslib "^2.0.3" + is-number@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + resolved "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" integrity sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg== dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + resolved "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== is-number@^7.0.0: @@ -7751,7 +9007,7 @@ is-obj@^2.0.0: is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: @@ -7778,14 +9034,21 @@ is-plain-object@^5.0.0: is-posix-bracket@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + resolved "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" integrity sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ== is-primitive@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + resolved "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" integrity sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q== +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + is-ssh@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz" @@ -7815,14 +9078,28 @@ is-typedarray@^1.0.0: resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-windows@^1.0.2: +is-upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" + integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== + dependencies: + tslib "^2.0.3" + +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^2.2.0: @@ -7837,6 +9114,11 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -7844,7 +9126,7 @@ isexe@^2.0.0: isobject@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== dependencies: isarray "1.0.0" @@ -7873,13 +9155,13 @@ isomorphic-ws@^4.0.1: integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -7889,19 +9171,19 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-instrument@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" - integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== + version "6.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz" + integrity sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw== dependencies: - "@babel/core" "^7.23.9" - "@babel/parser" "^7.23.9" - "@istanbuljs/schema" "^0.1.3" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" istanbul-lib-coverage "^3.2.0" semver "^7.5.4" istanbul-lib-report@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -7910,7 +9192,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -7918,9 +9200,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + version "3.1.6" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -7967,7 +9249,7 @@ jayson@3.6.6: jest-changed-files@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz" integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" @@ -7976,7 +9258,7 @@ jest-changed-files@^29.7.0: jest-circus@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz" integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: "@jest/environment" "^29.7.0" @@ -8002,7 +9284,7 @@ jest-circus@^29.7.0: jest-cli@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz" integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: "@jest/core" "^29.7.0" @@ -8019,7 +9301,7 @@ jest-cli@^29.7.0: jest-config@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz" integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" @@ -8047,7 +9329,7 @@ jest-config@^29.7.0: jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" @@ -8057,14 +9339,14 @@ jest-diff@^29.7.0: jest-docblock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" jest-each@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz" integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: "@jest/types" "^29.6.3" @@ -8075,7 +9357,7 @@ jest-each@^29.7.0: jest-environment-node@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: "@jest/environment" "^29.7.0" @@ -8087,12 +9369,12 @@ jest-environment-node@^29.7.0: jest-get-type@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz" integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" @@ -8111,7 +9393,7 @@ jest-haste-map@^29.7.0: jest-leak-detector@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: jest-get-type "^29.6.3" @@ -8119,7 +9401,7 @@ jest-leak-detector@^29.7.0: jest-matcher-utils@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" @@ -8129,7 +9411,7 @@ jest-matcher-utils@^29.7.0: jest-message-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" @@ -8144,7 +9426,7 @@ jest-message-util@^29.7.0: jest-mock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" @@ -8153,17 +9435,17 @@ jest-mock@^29.7.0: jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== jest-resolve-dependencies@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: jest-regex-util "^29.6.3" @@ -8171,7 +9453,7 @@ jest-resolve-dependencies@^29.7.0: jest-resolve@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" @@ -8186,7 +9468,7 @@ jest-resolve@^29.7.0: jest-runner@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz" integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: "@jest/console" "^29.7.0" @@ -8213,7 +9495,7 @@ jest-runner@^29.7.0: jest-runtime@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz" integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: "@jest/environment" "^29.7.0" @@ -8241,7 +9523,7 @@ jest-runtime@^29.7.0: jest-snapshot@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz" integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" @@ -8267,7 +9549,7 @@ jest-snapshot@^29.7.0: jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -8279,7 +9561,7 @@ jest-util@^29.0.0, jest-util@^29.7.0: jest-validate@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: "@jest/types" "^29.6.3" @@ -8291,7 +9573,7 @@ jest-validate@^29.7.0: jest-watcher@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz" integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: "@jest/test-result" "^29.7.0" @@ -8305,7 +9587,7 @@ jest-watcher@^29.7.0: jest-worker@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -8315,7 +9597,7 @@ jest-worker@^29.7.0: jest@<30.0.0-0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: "@jest/core" "^29.7.0" @@ -8323,6 +9605,16 @@ jest@<30.0.0-0: import-local "^3.0.2" jest-cli "^29.7.0" +jiti@^1.17.1, jiti@^1.18.2: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + +jose@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/jose/-/jose-5.2.2.tgz#b91170e9ba6dbe609b0c0a86568f9a1fbe4335c0" + integrity sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg== + js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" @@ -8335,10 +9627,10 @@ js-sha3@0.8.0, js-sha3@^0.8.0: js-tokens@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg== -js-yaml@4.1.0, js-yaml@^4.1.0: +js-yaml@4.1.0, js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -8388,12 +9680,12 @@ jsdoc@^4.0.0: jsesc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz" integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA== jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-bigint@^1.0.0: @@ -8405,7 +9697,7 @@ json-bigint@^1.0.0: json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-better-errors@^1.0.1: @@ -8430,9 +9722,19 @@ json-schema-traverse@^1.0.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" + integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== + dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz" @@ -8443,9 +9745,17 @@ json-stringify-safe@^5.0.1: resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== +json-to-pretty-yaml@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" + integrity sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A== + dependencies: + remedial "^1.0.7" + remove-trailing-spaces "^1.0.6" + json5@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== json5@^2.2.2, json5@^2.2.3: @@ -8460,7 +9770,7 @@ jsonc-parser@3.2.0: jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" @@ -8474,6 +9784,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" @@ -8507,22 +9822,22 @@ jws@^4.0.0: safe-buffer "^5.0.1" keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + version "4.5.3" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== dependencies: json-buffer "3.0.1" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== dependencies: is-buffer "^1.1.5" @@ -8541,7 +9856,7 @@ klaw@^3.0.0: kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== lerna@6.1.0: @@ -8575,12 +9890,12 @@ lerna@6.1.0: leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -8642,6 +9957,20 @@ linkify-it@^5.0.0: dependencies: uc.micro "^2.0.0" +listr2@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" + integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.5" + through "^2.3.8" + wrap-ansi "^7.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" @@ -8679,7 +10008,7 @@ locate-path@^5.0.0: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" @@ -8731,12 +10060,12 @@ lodash.mapvalues@^4.6.0: lodash.memoize@4.x: version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.pad@^4.5.1: @@ -8814,7 +10143,7 @@ lodash.zip@^4.2.0: resolved "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz" integrity sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg== -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@~4.17.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8826,7 +10155,7 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -log-symbols@^4.1.0: +log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -8834,6 +10163,16 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + long@^5.0.0: version "5.2.3" resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" @@ -8846,9 +10185,28 @@ loose-envify@^1.0.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lower-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" + integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== + dependencies: + tslib "^2.0.3" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== + lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" @@ -8892,14 +10250,14 @@ make-dir@^3.0.0, make-dir@^3.1.0: make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" make-error@1.x, make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== make-fetch-happen@^10.0.6: @@ -8947,14 +10305,14 @@ make-fetch-happen@^11.0.3: makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" -map-cache@^0.2.2: +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== map-obj@^1.0.0: @@ -8969,7 +10327,7 @@ map-obj@^4.0.0: map-visit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== dependencies: object-visit "^1.0.0" @@ -8998,7 +10356,7 @@ marked@^4.0.10: math-random@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + resolved "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz" integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== mdurl@^2.0.0: @@ -9071,7 +10429,7 @@ micro-ftch@^0.3.1: micromatch@^2.1.5: version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz" integrity sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA== dependencies: arr-diff "^2.0.0" @@ -9090,7 +10448,7 @@ micromatch@^2.1.5: micromatch@^3.1.10: version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" @@ -9107,7 +10465,7 @@ micromatch@^3.1.10: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.4: +micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -9134,7 +10492,7 @@ mime@1.6.0: mime@2.6.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mimic-fn@^2.1.0: @@ -9183,6 +10541,13 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatc dependencies: brace-expansion "^1.1.7" +minimatch@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.3.tgz#b4dcece1d674dee104bb0fb833ebb85a78cbbca6" + integrity sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.0.1: version "5.1.6" resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" @@ -9190,6 +10555,13 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^7.4.3: + version "7.4.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.6.tgz#845d6f254d8f4a5e4fd6baf44d5f10c8448365fb" + integrity sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== + dependencies: + brace-expansion "^2.0.1" + minimatch@^9.0.1: version "9.0.3" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" @@ -9296,7 +10668,7 @@ minizlib@^2.1.1, minizlib@^2.1.2: mixin-deep@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" @@ -9313,7 +10685,7 @@ mkdirp-infer-owner@^2.0.0: mkdirp@^0.5.1: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" @@ -9323,6 +10695,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mkdirp@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" + integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== + modify-values@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz" @@ -9394,9 +10771,9 @@ mute-stream@0.0.8, mute-stream@~0.0.4: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: - version "2.19.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0" - integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw== + version "2.18.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== nan@^2.17.0: version "2.20.0" @@ -9405,7 +10782,7 @@ nan@^2.17.0: nanomatch@^1.2.9: version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" @@ -9422,7 +10799,7 @@ nanomatch@^1.2.9: natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== negotiator@0.6.3, negotiator@^0.6.3: @@ -9440,9 +10817,17 @@ ngeohash@0.6.3: resolved "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz" integrity sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + nock@13.3.3: version "13.3.3" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.3.3.tgz#179759c07d3f88ad3e794ace885629c1adfd3fe7" + resolved "https://registry.npmjs.org/nock/-/nock-13.3.3.tgz" integrity sha512-z+KUlILy9SK/RjpeXDiDUEAq4T94ADPHE3qaRkf66mpEhzc/ytOMm3Bwdrbq6k1tMWkbdujiKim3G2tfQARuJw== dependencies: debug "^4.1.0" @@ -9491,7 +10876,7 @@ node-gyp@^9.0.0: node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-pre-gyp-github@1.4.4: @@ -9502,6 +10887,11 @@ node-pre-gyp-github@1.4.4: "@octokit/rest" "18.12.0" commander "7.2.0" +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + node-releases@^2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" @@ -9551,16 +10941,16 @@ normalize-package-data@^4.0.0: semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== dependencies: remove-trailing-separator "^1.0.1" normalize-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-bundled@^1.1.1: @@ -9673,6 +11063,11 @@ npmlog@^6.0.0, npmlog@^6.0.2: gauge "^4.0.3" set-blocking "^2.0.0" +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" @@ -9739,7 +11134,7 @@ object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: object-copy@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== dependencies: copy-descriptor "^0.1.0" @@ -9751,26 +11146,26 @@ object-hash@^3.0.0: resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-visit@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + resolved "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz" integrity sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA== dependencies: for-own "^0.1.4" @@ -9778,7 +11173,7 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== dependencies: isobject "^3.0.1" @@ -9851,16 +11246,16 @@ optionator@^0.8.1: word-wrap "~1.2.3" optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.5" ora@^4.0.0: version "4.1.1" @@ -9893,7 +11288,7 @@ ora@^5.4.1: os-homedir@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: @@ -9903,7 +11298,7 @@ os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: output-file-sync@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + resolved "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz" integrity sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg== dependencies: graceful-fs "^4.1.4" @@ -9964,7 +11359,7 @@ p-locate@^4.1.0: p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" @@ -10073,6 +11468,14 @@ pacote@^13.0.3, pacote@^13.6.1: ssri "^9.0.0" tar "^6.1.11" +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" @@ -10094,9 +11497,18 @@ parse-duration@^1.0.0: resolved "https://registry.npmjs.org/parse-duration/-/parse-duration-1.1.0.tgz" integrity sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ== +parse-filepath@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + parse-glob@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + resolved "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz" integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA== dependencies: glob-base "^0.3.0" @@ -10151,11 +11563,32 @@ parsimmon@^1.18.1: resolved "https://registry.npmjs.org/parsimmon/-/parsimmon-1.18.1.tgz" integrity sha512-u7p959wLfGAhJpSDJVYXoyMCXWYwHia78HhRBWqk7AIbxdmlrfdp5wX0l3xv/iTSH5HvhN9K7o26hwwpgS5Nmw== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + pascalcase@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" @@ -10181,6 +11614,18 @@ path-parse@^1.0.7: resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== + dependencies: + path-root-regex "^0.1.0" + path-scurry@^1.10.1: version "1.10.1" resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz" @@ -10273,7 +11718,7 @@ pgpass@1.x: picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: @@ -10374,7 +11819,7 @@ pino@^7.0.0: pirates@^4.0.4: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: @@ -10391,7 +11836,7 @@ pluralize@^8.0.0: posix-character-classes@^0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== postgres-array@~2.0.0: @@ -10433,7 +11878,7 @@ pprof@4.0.0: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: @@ -10443,22 +11888,22 @@ prelude-ls@~1.1.2: preserve@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + resolved "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz" integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ== prettier@3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz" integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== prettier@^2.3.1: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -10474,7 +11919,7 @@ pretty-ms@^7.0.0: private@^0.1.8: version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== proc-log@^2.0.0, proc-log@^2.0.1: @@ -10527,9 +11972,16 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -10553,7 +12005,7 @@ prop-types@^15.7.2: propagate@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" + resolved "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz" integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== proto-list@~1.2.1: @@ -10702,9 +12154,21 @@ punycode@2.3.1, punycode@^1.3.2, punycode@^2.1.0: integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + version "6.0.3" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz" + integrity sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w== + +pvtsutils@^1.3.2, pvtsutils@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" + integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== + dependencies: + tslib "^2.6.1" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== q@^1.5.1: version "1.5.1" @@ -10719,11 +12183,11 @@ qs@6.11.0: side-channel "^1.0.4" qs@^6.11.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" - integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== + version "6.11.2" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: - side-channel "^1.0.6" + side-channel "^1.0.4" queue-microtask@^1.1.2, queue-microtask@^1.2.2: version "1.2.3" @@ -10754,7 +12218,7 @@ ramdasauce@^2.1.0: randomatic@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + resolved "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz" integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: is-number "^4.0.0" @@ -10799,9 +12263,9 @@ react-is@^16.13.1, react-is@^16.7.0: integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== read-cmd-shim@^3.0.0: version "3.0.1" @@ -10903,7 +12367,7 @@ readdir-scoped-modules@^1.1.0: readdirp@^2.0.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: graceful-fs "^4.1.11" @@ -10925,52 +12389,76 @@ redent@^3.0.0: reduce-flatten@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== regenerator-runtime@^0.10.5: version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" integrity sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w== regenerator-runtime@^0.11.0: version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regex-cache@^0.4.2: version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + resolved "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" +relay-runtime@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" + integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^3.0.0" + invariant "^2.2.4" + +remedial@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" + integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== + remove-trailing-separator@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== +remove-trailing-spaces@^1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" + integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== + repeat-element@^1.1.2: version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== repeating@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A== dependencies: is-finite "^1.0.0" @@ -10985,6 +12473,11 @@ require-from-string@^2.0.2: resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requizzle@^0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c" @@ -10999,27 +12492,27 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-url@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve.exports@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.10.0: +resolve@^1.10.0, resolve@^1.20.0: version "1.22.6" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz" integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== @@ -11028,15 +12521,6 @@ resolve@^1.10.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.20.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" @@ -11047,7 +12531,7 @@ restore-cursor@^3.1.0: ret@~0.1.10: version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== ret@~0.2.0: @@ -11097,6 +12581,11 @@ rfdc@^1.1.4, rfdc@^1.2.0: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rfdc@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== + rimraf@^2.6.3: version "2.7.1" resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" @@ -11156,7 +12645,7 @@ safe-regex2@^2.0.0: safe-regex@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== dependencies: ret "~0.1.10" @@ -11176,6 +12665,11 @@ scrypt-js@3.0.1: resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +scuid@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" + integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== + secure-json-parse@^2.0.0: version "2.7.0" resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz" @@ -11191,7 +12685,7 @@ semver-store@^0.3.0: resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.5.4, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: +semver@7.5.4, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -11208,11 +12702,6 @@ semver@^7.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== -semver@^7.3.8, semver@^7.5.3: - version "7.6.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.1.tgz#60bfe090bf907a25aa8119a72b9f90ef7ca281b2" - integrity sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA== - send@0.18.0: version "0.18.0" resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" @@ -11232,6 +12721,15 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + sequelize-pool@^7.1.0: version "7.1.0" resolved "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz" @@ -11280,20 +12778,20 @@ set-cookie-parser@^2.4.1: integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" + integrity sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g== dependencies: - define-data-property "^1.1.4" + define-data-property "^1.1.2" es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.4" + get-intrinsic "^1.2.3" gopd "^1.0.1" - has-property-descriptors "^1.0.2" + has-property-descriptors "^1.0.1" set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" @@ -11301,6 +12799,11 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" @@ -11325,6 +12828,11 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" @@ -11334,16 +12842,6 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" @@ -11354,6 +12852,11 @@ signal-exit@^4.0.1: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww== + simple-wcswidth@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz" @@ -11361,12 +12864,12 @@ simple-wcswidth@^1.0.1: sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz" integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== slash@^3.0.0: @@ -11374,6 +12877,15 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" @@ -11388,9 +12900,17 @@ smart-buffer@^4.2.0: resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + snapdragon-node@^2.0.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" @@ -11399,14 +12919,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" @@ -11466,7 +12986,7 @@ sort-keys@^4.0.0: source-map-resolve@^0.5.0: version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== dependencies: atob "^2.1.2" @@ -11477,7 +12997,7 @@ source-map-resolve@^0.5.0: source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -11485,19 +13005,19 @@ source-map-support@0.5.13: source-map-support@^0.4.15: version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz" integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" source-map-url@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: @@ -11540,7 +13060,7 @@ spdx-license-ids@^3.0.0: split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" @@ -11564,6 +13084,13 @@ split@^1.0.0, split@^1.0.1: dependencies: through "2" +sponge-case@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" + integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== + dependencies: + tslib "^2.0.3" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" @@ -11585,14 +13112,14 @@ ssri@^9.0.0, ssri@^9.0.1: stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== dependencies: define-property "^0.2.5" @@ -11630,14 +13157,19 @@ string-argv@~0.3.1: resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== +string-env-interpolation@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" + integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== + string-format@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -11706,7 +13238,7 @@ string_decoder@~1.1.1: strip-ansi@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" @@ -11763,7 +13295,7 @@ strip-indent@^3.0.0: strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strong-log-transformer@^2.1.0: @@ -11782,7 +13314,7 @@ stubs@^3.0.0: superagent@^8.0.5: version "8.1.2" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.1.2.tgz#03cb7da3ec8b32472c9d20f6c2a57c7f3765f30b" + resolved "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz" integrity sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA== dependencies: component-emitter "^1.3.0" @@ -11798,7 +13330,7 @@ superagent@^8.0.5: supertest@6.3.3: version "6.3.3" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.3.3.tgz#42f4da199fee656106fd422c094cf6c9578141db" + resolved "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz" integrity sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA== dependencies: methods "^1.1.2" @@ -11806,7 +13338,7 @@ supertest@6.3.3: supports-color@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== supports-color@^5.3.0: @@ -11825,7 +13357,7 @@ supports-color@^7.1.0: supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" @@ -11835,6 +13367,13 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swap-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" + integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== + dependencies: + tslib "^2.0.3" + symbol-observable@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" @@ -11842,7 +13381,7 @@ symbol-observable@^4.0.0: table-layout@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: array-back "^4.0.1" @@ -11920,7 +13459,7 @@ temp-dir@^1.0.0: test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -11934,7 +13473,7 @@ text-extensions@^1.0.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thread-stream@^0.13.0: @@ -11974,7 +13513,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -11994,6 +13533,13 @@ tiny-warning@^1.0.3: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +title-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" + integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== + dependencies: + tslib "^2.0.3" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" @@ -12015,29 +13561,29 @@ tmp@~0.2.1: tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-object-path@^0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== dependencies: is-number "^3.0.0" @@ -12052,7 +13598,7 @@ to-regex-range@^5.0.1: to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" @@ -12109,17 +13655,17 @@ trim-newlines@^3.0.0: trim-right@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw== ts-api-utils@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + version "1.0.3" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== ts-command-line-args@^2.2.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== dependencies: chalk "^4.1.0" @@ -12134,7 +13680,7 @@ ts-custom-error@^3.3.1: ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== ts-invariant@^0.4.0: @@ -12153,7 +13699,7 @@ ts-invariant@^0.9.4: ts-jest@29.1.1: version "29.1.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz" integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== dependencies: bs-logger "0.x" @@ -12165,9 +13711,22 @@ ts-jest@29.1.1: semver "^7.5.3" yargs-parser "^21.0.1" +ts-log@^2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.5.tgz#aef3252f1143d11047e2cb6f7cfaac7408d96623" + integrity sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA== + +ts-morph@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-19.0.0.tgz#43e95fb0156c3fe3c77c814ac26b7d0be2f93169" + integrity sha512-D6qcpiJdn46tUqV45vr5UGM2dnIEuTGNxVhg0sk5NX11orcouwj6i1bMqZIz2mZTZB1Hcgy7C3oEVhAT+f6mbQ== + dependencies: + "@ts-morph/common" "~0.20.0" + code-block-writer "^12.0.0" + ts-node@10.7.0: version "10.7.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz" integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== dependencies: "@cspotcode/source-map-support" "0.7.0" @@ -12198,7 +13757,7 @@ tslib@^1.10.0, tslib@^1.9.3: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.5.2, tslib@^2.6.1, tslib@^2.6.2, tslib@~2.6.0: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -12210,7 +13769,7 @@ tslib@~2.3.0: type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" @@ -12224,7 +13783,7 @@ type-check@~0.3.2: type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.18.0: @@ -12234,7 +13793,7 @@ type-fest@^0.18.0: type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: @@ -12272,7 +13831,7 @@ type-is@~1.6.18: typechain@8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.0.0.tgz#a5dbe754717a7e16247df52b5285903de600e8ff" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.0.0.tgz" integrity sha512-rqDfDYc9voVAhmfVfAwzg3VYFvhvs5ck1X9T/iWkX745Cul4t+V/smjnyqrbDzWDbzD93xfld1epg7Y/uFAesQ== dependencies: "@types/prettier" "^2.1.1" @@ -12300,7 +13859,7 @@ typedarray@^0.0.6: typescript@5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== "typescript@^3 || ^4": @@ -12310,14 +13869,19 @@ typescript@5.2.2: typical@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== typical@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== +ua-parser-js@^1.0.35: + version "1.0.37" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" + integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== + uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" @@ -12346,6 +13910,11 @@ umzug@3.0.0: type-fest "^2.0.0" verror "^1.10.0" +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== + underscore@^1.13.1, underscore@~1.13.2: version "1.13.6" resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz" @@ -12353,7 +13922,7 @@ underscore@^1.13.1, underscore@~1.13.2: union-value@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" @@ -12396,7 +13965,7 @@ universal-user-agent@^6.0.0: universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: @@ -12404,6 +13973,13 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +unixify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== + dependencies: + normalize-path "^2.1.1" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" @@ -12411,7 +13987,7 @@ unpipe@1.0.0, unpipe@~1.0.0: unset-value@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== dependencies: has-value "^0.3.1" @@ -12422,14 +13998,36 @@ upath@^2.0.1: resolved "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + update-browserslist-db@^1.0.13: - version "1.0.15" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" - integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: - escalade "^3.1.2" + escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + uri-js@4.2.2, uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" @@ -12439,9 +14037,19 @@ uri-js@4.2.2, uri-js@^4.2.2: urix@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== +urlpattern-polyfill@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== + +urlpattern-polyfill@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" + integrity sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ== + urlpattern-polyfill@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz" @@ -12449,12 +14057,12 @@ urlpattern-polyfill@^9.0.0: use@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== user-home@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + resolved "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" integrity sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ== utf8@3.0.0: @@ -12489,7 +14097,7 @@ uuid@^9.0.0: v8-compile-cache-lib@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@2.3.0: @@ -12498,17 +14106,17 @@ v8-compile-cache@2.3.0: integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + version "9.1.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" + convert-source-map "^1.6.0" v8flags@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + resolved "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz" integrity sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA== dependencies: user-home "^1.1.1" @@ -12571,7 +14179,7 @@ walk-up-path@^1.0.0: walker@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" @@ -12583,6 +14191,11 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-streams-polyfill@^3.2.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + web3-utils@^1.3.4: version "1.10.2" resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz" @@ -12597,6 +14210,17 @@ web3-utils@^1.3.4: randombytes "^2.1.0" utf8 "3.0.0" +webcrypto-core@^1.7.8: + version "1.7.8" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.8.tgz#056918036e846c72cfebbb04052e283f57f1114a" + integrity sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg== + dependencies: + "@peculiar/asn1-schema" "^2.3.8" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.5" + tslib "^2.6.2" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" @@ -12629,6 +14253,11 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + which@^2.0.0, which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -12655,7 +14284,7 @@ wonka@^4.0.14: resolved "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz" integrity sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg== -word-wrap@^1.2.5, word-wrap@~1.2.3: +word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== @@ -12667,7 +14296,7 @@ wordwrap@^1.0.0: wordwrapjs@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== dependencies: reduce-flatten "^2.0.0" @@ -12682,7 +14311,7 @@ wordwrapjs@^4.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^6.0.1: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -12804,6 +14433,11 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" @@ -12811,7 +14445,7 @@ y18n@^5.0.5: yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: @@ -12819,6 +14453,11 @@ yallist@^4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml-ast-parser@^0.0.43: + version "0.0.43" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" + integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== + yaml@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" @@ -12834,6 +14473,11 @@ yaml@^2.0.0-10: resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz" integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== +yaml@^2.3.1: + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" @@ -12852,6 +14496,14 @@ yargs-parser@^16.1.0: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" @@ -12870,6 +14522,23 @@ yargs@17.4.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yargs@^16.2.0: version "16.2.0" resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" @@ -12883,7 +14552,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: +yargs@^17.0.0, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -12898,7 +14567,7 @@ yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: