From d3971b525849dd8c294c1d88f821d2614929383d Mon Sep 17 00:00:00 2001 From: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Date: Mon, 4 Oct 2021 11:04:06 +0530 Subject: [PATCH] Generate GQL client (#259) * Add GQL client generation * Add subscription, events, eventsInRange in client gen * Add mutation in client gen and return event tx info from indexer * Capitalize class names for storage-mode entities --- packages/codegen/package.json | 1 + packages/codegen/src/client.ts | 79 ++++++++++++++++ packages/codegen/src/database.ts | 11 ++- packages/codegen/src/entity.ts | 8 +- packages/codegen/src/generate-code.ts | 7 +- packages/codegen/src/resolvers.ts | 4 +- packages/codegen/src/schema.ts | 4 +- .../src/templates/client-template.handlebars | 70 ++++++++++++++ .../templates/database-template.handlebars | 13 +-- .../src/templates/fill-template.handlebars | 8 +- .../src/templates/indexer-template.handlebars | 33 ++++++- .../templates/job-runner-template.handlebars | 8 +- .../src/templates/server-template.handlebars | 8 +- packages/codegen/src/types/common/main.d.ts | 1 + packages/codegen/src/visitor.ts | 20 +++- .../ipld-eth-client/src/graphql-client.ts | 6 ++ yarn.lock | 93 ++++++++++++++++++- 17 files changed, 352 insertions(+), 22 deletions(-) create mode 100644 packages/codegen/src/client.ts create mode 100644 packages/codegen/src/templates/client-template.handlebars diff --git a/packages/codegen/package.json b/packages/codegen/package.json index 6c925ec8..19e757c5 100644 --- a/packages/codegen/package.json +++ b/packages/codegen/package.json @@ -21,6 +21,7 @@ "dependencies": { "@poanet/solidity-flattener": "https://github.com/vulcanize/solidity-flattener.git", "@solidity-parser/parser": "^0.13.2", + "gql-generator": "https://github.com/vulcanize/gql-generator.git", "graphql": "^15.5.0", "graphql-compose": "^9.0.3", "handlebars": "^4.7.7", diff --git a/packages/codegen/src/client.ts b/packages/codegen/src/client.ts new file mode 100644 index 00000000..0f4e5e0b --- /dev/null +++ b/packages/codegen/src/client.ts @@ -0,0 +1,79 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import fs from 'fs'; +import path from 'path'; +import assert from 'assert'; +import Handlebars from 'handlebars'; +import { Writable } from 'stream'; +import _ from 'lodash'; +import { gqlGenerate } from 'gql-generator'; + +import { getTsForSol } from './utils/type-mappings'; +import { Param } from './utils/types'; + +const TEMPLATE_FILE = './templates/client-template.handlebars'; + +export class Client { + _queries: Array; + _templateString: string; + + constructor () { + this._queries = []; + this._templateString = fs.readFileSync(path.resolve(__dirname, TEMPLATE_FILE)).toString(); + } + + /** + * Stores the query to be passed to the template. + * @param mode Code generation mode. + * @param name Name of the query. + * @param params Parameters to the query. + * @param returnType Return type for the query. + */ + addQuery (name: string, params: Array, returnType: string): void { + // Check if the query is already added. + if (this._queries.some(query => query.name === name)) { + return; + } + + const queryObject = { + name, + params: _.cloneDeep(params), + returnType + }; + + queryObject.params = queryObject.params.map((param) => { + const tsParamType = getTsForSol(param.type); + assert(tsParamType); + param.type = tsParamType; + return param; + }); + + const tsReturnType = getTsForSol(returnType); + assert(tsReturnType); + queryObject.returnType = tsReturnType; + + this._queries.push(queryObject); + } + + /** + * Writes the client file generated from a template to a stream and export quries. + * @param outStream A writable output stream to write the client file to. + * @param schemaContent Content of the schema for generating the queries, mutations and subscriptions. + * @param gqlDir Directory to store the generated gql queries, mutations and subscriptions. + */ + exportClient (outStream: Writable, schemaContent: string, gqlDir: string): void { + this._exportGql(schemaContent, gqlDir); + + const template = Handlebars.compile(this._templateString); + const client = template({ + queries: this._queries + }); + outStream.write(client); + } + + _exportGql (schemaContent: string, gqlDir: string): void { + gqlGenerate(schemaContent, gqlDir); + } +} diff --git a/packages/codegen/src/database.ts b/packages/codegen/src/database.ts index 65740deb..08f4970c 100644 --- a/packages/codegen/src/database.ts +++ b/packages/codegen/src/database.ts @@ -36,11 +36,18 @@ export class Database { } const queryObject = { - name: name, + name, + entityName: '', params: _.cloneDeep(params), - returnType: returnType + returnType }; + // eth_call mode: Capitalize first letter of entity name (balanceOf -> BalanceOf). + // storage mode: Capiltalize second letter of entity name (_balances -> _Balances). + queryObject.entityName = (name.charAt(0) === '_') + ? `_${name.charAt(1).toUpperCase()}${name.slice(2)}` + : `${name.charAt(0).toUpperCase()}${name.slice(1)}`; + queryObject.params = queryObject.params.map((param) => { const tsParamType = getTsForSol(param.type); assert(tsParamType); diff --git a/packages/codegen/src/entity.ts b/packages/codegen/src/entity.ts index 5b7f3b4b..4b91a764 100644 --- a/packages/codegen/src/entity.ts +++ b/packages/codegen/src/entity.ts @@ -38,12 +38,18 @@ export class Entity { const entityObject: any = { // Capitalize the first letter of name. - className: `${name.charAt(0).toUpperCase()}${name.slice(1)}`, + className: '', indexOn: [], columns: [], imports: [] }; + // eth_call mode: Capitalize first letter of entity name (balanceOf -> BalanceOf). + // storage mode: Capiltalize second letter of entity name (_balances -> _Balances). + entityObject.className = (name.charAt(0) === '_') + ? `_${name.charAt(1).toUpperCase()}${name.slice(2)}` + : `${name.charAt(0).toUpperCase()}${name.slice(1)}`; + entityObject.imports.push( { toImport: new Set(['Entity', 'PrimaryGeneratedColumn', 'Column', 'Index']), diff --git a/packages/codegen/src/generate-code.ts b/packages/codegen/src/generate-code.ts index adf400d5..b3fed713 100644 --- a/packages/codegen/src/generate-code.ts +++ b/packages/codegen/src/generate-code.ts @@ -136,7 +136,7 @@ function generateWatcher (data: string, visitor: Visitor, argv: any) { let outStream = outputDir ? fs.createWriteStream(path.join(outputDir, 'src/schema.gql')) : process.stdout; - visitor.exportSchema(outStream); + const schemaContent = visitor.exportSchema(outStream); outStream = outputDir ? fs.createWriteStream(path.join(outputDir, 'src/resolvers.ts')) @@ -234,6 +234,11 @@ function generateWatcher (data: string, visitor: Visitor, argv: any) { ignoreOutStream = process.stdout; } exportLint(rcOutStream, ignoreOutStream); + + outStream = outputDir + ? fs.createWriteStream(path.join(outputDir, 'src/client.ts')) + : process.stdout; + visitor.exportClient(outStream, schemaContent, path.join(outputDir, 'src/gql')); } main().catch(err => { diff --git a/packages/codegen/src/resolvers.ts b/packages/codegen/src/resolvers.ts index e3dba792..5c2092c8 100644 --- a/packages/codegen/src/resolvers.ts +++ b/packages/codegen/src/resolvers.ts @@ -36,9 +36,9 @@ export class Resolvers { } const queryObject = { - name: name, + name, params: _.cloneDeep(params), - returnType: returnType + returnType }; queryObject.params = queryObject.params.map((param) => { diff --git a/packages/codegen/src/schema.ts b/packages/codegen/src/schema.ts index 06063102..5e75cfb2 100644 --- a/packages/codegen/src/schema.ts +++ b/packages/codegen/src/schema.ts @@ -104,10 +104,12 @@ export class Schema { * Writes schema to a stream. * @param outStream A writable output stream to write the schema to. */ - exportSchema (outStream: Writable): void { + exportSchema (outStream: Writable): string { // Get schema as a string from GraphQLSchema. const schemaString = printSchema(this.buildSchema()); outStream.write(schemaString); + + return schemaString; } /** diff --git a/packages/codegen/src/templates/client-template.handlebars b/packages/codegen/src/templates/client-template.handlebars new file mode 100644 index 00000000..172e75e0 --- /dev/null +++ b/packages/codegen/src/templates/client-template.handlebars @@ -0,0 +1,70 @@ +// +// Copyright 2021 Vulcanize, Inc. +// + +import { gql } from '@apollo/client/core'; + +import { GraphQLClient, GraphQLConfig } from '@vulcanize/ipld-eth-client'; + +import { queries, mutations, subscriptions } from './gql'; + +export class Client { + _config: GraphQLConfig; + _client: GraphQLClient; + + constructor (config: GraphQLConfig) { + this._config = config; + + this._client = new GraphQLClient(config); + } + + {{#each queries as | query |}} + // eslint-disable-next-line camelcase + async get{{capitalize query.name tillIndex=1}} (blockHash: string, contractAddress: string + {{~#each query.params}}, {{this.name}}: {{this.type~}} {{/each}}): Promise { + const { {{query.name}} } = await this._client.query( + gql(queries.{{query.name}}), + { blockHash, contractAddress + {{~#each query.params}}, {{this.name~}} {{/each}} } + ); + + return {{query.name}}; + } + + {{/each}} + async getEvents (blockHash: string, contractAddress: string, name: string): Promise { + const { events } = await this._client.query( + gql(queries.events), + { blockHash, contractAddress, name } + ); + + return events; + } + + async getEventsInRange (fromBlockNumber: number, toBlockNumber: number): Promise { + const { eventsInRange } = await this._client.query( + gql(queries.eventsInRange), + { fromBlockNumber, toBlockNumber } + ); + + return eventsInRange; + } + + async watchContract (contractAddress: string, startingBlock?: number): Promise { + const { watchContract } = await this._client.mutate( + gql(mutations.watchContract), + { contractAddress, startingBlock } + ); + + return watchContract; + } + + async watchEvents (onNext: (value: any) => void): Promise { + return this._client.subscribe( + gql(subscriptions.onEvent), + ({ data }) => { + onNext(data.onEvent); + } + ); + } +} diff --git a/packages/codegen/src/templates/database-template.handlebars b/packages/codegen/src/templates/database-template.handlebars index 4f36f5d8..31e5f2da 100644 --- a/packages/codegen/src/templates/database-template.handlebars +++ b/packages/codegen/src/templates/database-template.handlebars @@ -12,8 +12,9 @@ import { Contract } from './entity/Contract'; import { Event } from './entity/Event'; import { SyncStatus } from './entity/SyncStatus'; import { BlockProgress } from './entity/BlockProgress'; + {{#each queries as | query |}} -import { {{capitalize query.name tillIndex=1}} } from './entity/{{capitalize query.name tillIndex=1}}'; +import { {{query.entityName}} } from './entity/{{query.entityName}}'; {{/each}} export class Database { @@ -50,8 +51,8 @@ export class Database { {{/if}} async get{{capitalize query.name tillIndex=1}} ({ blockHash, contractAddress {{~#each query.params}}, {{this.name~}} {{/each}} }: { blockHash: string, contractAddress: string - {{~#each query.params}}, {{this.name~}}: {{this.type~}} {{/each}} }): Promise<{{capitalize query.name tillIndex=1}} | undefined> { - return this._conn.getRepository({{capitalize query.name tillIndex=1}}) + {{~#each query.params}}, {{this.name~}}: {{this.type~}} {{/each}} }): Promise<{{query.entityName}} | undefined> { + return this._conn.getRepository({{query.entityName}}) .findOne({ blockHash, contractAddress{{#if query.params.length}},{{/if}} @@ -69,8 +70,8 @@ export class Database { // eslint-disable-next-line @typescript-eslint/ban-types {{/if}} async save{{capitalize query.name tillIndex=1}} ({ blockHash, contractAddress - {{~#each query.params}}, {{this.name~}} {{/each}}, value, proof }: DeepPartial<{{capitalize query.name tillIndex=1}}>): Promise<{{capitalize query.name tillIndex=1}}> { - const repo = this._conn.getRepository({{capitalize query.name tillIndex=1}}); + {{~#each query.params}}, {{this.name~}} {{/each}}, value, proof }: DeepPartial<{{query.entityName}}>): Promise<{{query.entityName}}> { + const repo = this._conn.getRepository({{query.entityName}}); const entity = repo.create({ blockHash, contractAddress {{~#each query.params}}, {{this.name~}} {{/each}}, value, proof }); return repo.save(entity); @@ -194,7 +195,7 @@ export class Database { _setPropColMaps (): void { {{#each queries as | query |}} - this._propColMaps.{{capitalize query.name tillIndex=1}} = this._getPropertyColumnMapForEntity('{{capitalize query.name tillIndex=1}}'); + this._propColMaps.{{query.entityName}} = this._getPropertyColumnMapForEntity('{{query.entityName}}'); {{/each}} } } diff --git a/packages/codegen/src/templates/fill-template.handlebars b/packages/codegen/src/templates/fill-template.handlebars index ea43e1ca..b5855137 100644 --- a/packages/codegen/src/templates/fill-template.handlebars +++ b/packages/codegen/src/templates/fill-template.handlebars @@ -59,18 +59,24 @@ export const main = async (): Promise => { assert(gqlPostgraphileEndpoint, 'Missing upstream ethServer.gqlPostgraphileEndpoint'); const cache = await getCache(cacheConfig); + const ethClient = new EthClient({ gqlEndpoint: gqlPostgraphileEndpoint, gqlSubscriptionEndpoint: gqlPostgraphileEndpoint, cache }); + const postgraphileClient = new EthClient({ + gqlEndpoint: gqlPostgraphileEndpoint, + cache + }); + const ethProvider = getDefaultProvider(rpcProviderEndpoint); // Note: In-memory pubsub works fine for now, as each watcher is a single process anyway. // Later: https://www.apollographql.com/docs/apollo-server/data/subscriptions/#production-pubsub-libraries const pubsub = new PubSub(); - const indexer = new Indexer(db, ethClient, ethProvider); + const indexer = new Indexer(db, ethClient, postgraphileClient, ethProvider); const { dbConnectionString, maxCompletionLagInSecs } = jobQueueConfig; assert(dbConnectionString, 'Missing job queue db connection string'); diff --git a/packages/codegen/src/templates/indexer-template.handlebars b/packages/codegen/src/templates/indexer-template.handlebars index eb4f9f61..6eeedb20 100644 --- a/packages/codegen/src/templates/indexer-template.handlebars +++ b/packages/codegen/src/templates/indexer-template.handlebars @@ -37,6 +37,9 @@ export type ResultEvent = { }; tx: { hash: string; + from: string; + to: string; + index: number; }; contract: string; @@ -51,19 +54,21 @@ export class Indexer { _db: Database _ethClient: EthClient _ethProvider: BaseProvider + _postgraphileClient: EthClient; _baseIndexer: BaseIndexer _abi: JsonFragment[] _storageLayout: StorageLayout _contract: ethers.utils.Interface - constructor (db: Database, ethClient: EthClient, ethProvider: BaseProvider) { + constructor (db: Database, ethClient: EthClient, postgraphileClient: EthClient, ethProvider: BaseProvider) { assert(db); assert(ethClient); this._db = db; this._ethClient = ethClient; this._ethProvider = ethProvider; + this._postgraphileClient = postgraphileClient; this._baseIndexer = new BaseIndexer(this._db, this._ethClient); const { abi, storageLayout } = artifacts; @@ -80,6 +85,7 @@ export class Indexer { getResultEvent (event: Event): ResultEvent { const block = event.block; const eventFields = JSONbig.parse(event.eventInfo); + const { tx } = JSON.parse(event.extraInfo); return { block: { @@ -90,7 +96,10 @@ export class Indexer { }, tx: { - hash: event.txHash + hash: event.txHash, + from: tx.src, + to: tx.dst, + index: tx.index }, contract: event.contract, @@ -282,6 +291,23 @@ export class Indexer { assert(blockHash); let { block, logs } = await this._ethClient.getLogs({ blockHash }); + const { + allEthHeaderCids: { + nodes: [ + { + ethTransactionCidsByHeaderId: { + nodes: transactions + } + } + ] + } + } = await this._postgraphileClient.getBlockWithTransactions({ blockHash }); + + const transactionMap = transactions.reduce((acc: {[key: string]: any}, transaction: {[key: string]: any}) => { + acc[transaction.txHash] = transaction; + return acc; + }, {}); + const dbEvents: Array> = []; for (let li = 0; li < logs.length; li++) { @@ -305,7 +331,8 @@ export class Indexer { if (status) { let eventName = UNKNOWN_EVENT_NAME; let eventInfo = {}; - const extraInfo = { topics, data }; + const tx = transactionMap[txHash]; + const extraInfo = { topics, data, tx }; const contract = ethers.utils.getAddress(address); const watchedContract = await this.isWatchedContract(contract); diff --git a/packages/codegen/src/templates/job-runner-template.handlebars b/packages/codegen/src/templates/job-runner-template.handlebars index 5f101336..c1f6c804 100644 --- a/packages/codegen/src/templates/job-runner-template.handlebars +++ b/packages/codegen/src/templates/job-runner-template.handlebars @@ -94,14 +94,20 @@ export const main = async (): Promise => { assert(gqlPostgraphileEndpoint, 'Missing upstream ethServer.gqlPostgraphileEndpoint'); const cache = await getCache(cacheConfig); + const ethClient = new EthClient({ gqlEndpoint: gqlApiEndpoint, gqlSubscriptionEndpoint: gqlPostgraphileEndpoint, cache }); + const postgraphileClient = new EthClient({ + gqlEndpoint: gqlPostgraphileEndpoint, + cache + }); + const ethProvider = getDefaultProvider(rpcProviderEndpoint); - const indexer = new Indexer(db, ethClient, ethProvider); + const indexer = new Indexer(db, ethClient, postgraphileClient, ethProvider); assert(jobQueueConfig, 'Missing job queue config'); diff --git a/packages/codegen/src/templates/server-template.handlebars b/packages/codegen/src/templates/server-template.handlebars index c4fb0a24..ed588f74 100644 --- a/packages/codegen/src/templates/server-template.handlebars +++ b/packages/codegen/src/templates/server-template.handlebars @@ -56,15 +56,21 @@ export const main = async (): Promise => { assert(gqlPostgraphileEndpoint, 'Missing upstream ethServer.gqlPostgraphileEndpoint'); const cache = await getCache(cacheConfig); + const ethClient = new EthClient({ gqlEndpoint: gqlApiEndpoint, gqlSubscriptionEndpoint: gqlPostgraphileEndpoint, cache }); + const postgraphileClient = new EthClient({ + gqlEndpoint: gqlPostgraphileEndpoint, + cache + }); + const ethProvider = getDefaultProvider(rpcProviderEndpoint); - const indexer = new Indexer(db, ethClient, ethProvider); + const indexer = new Indexer(db, ethClient, postgraphileClient, ethProvider); // Note: In-memory pubsub works fine for now, as each watcher is a single process anyway. // Later: https://www.apollographql.com/docs/apollo-server/data/subscriptions/#production-pubsub-libraries diff --git a/packages/codegen/src/types/common/main.d.ts b/packages/codegen/src/types/common/main.d.ts index deba863f..4b5ce0a7 100644 --- a/packages/codegen/src/types/common/main.d.ts +++ b/packages/codegen/src/types/common/main.d.ts @@ -4,3 +4,4 @@ declare module '@poanet/solidity-flattener'; declare module 'solc'; +declare module 'gql-generator'; diff --git a/packages/codegen/src/visitor.ts b/packages/codegen/src/visitor.ts index 5bae0a00..15d1146d 100644 --- a/packages/codegen/src/visitor.ts +++ b/packages/codegen/src/visitor.ts @@ -11,6 +11,7 @@ import { Entity } from './entity'; import { Indexer } from './indexer'; import { Resolvers } from './resolvers'; import { Schema } from './schema'; +import { Client } from './client'; export class Visitor { _schema: Schema; @@ -18,6 +19,7 @@ export class Visitor { _indexer: Indexer; _entity: Entity; _database: Database; + _client: Client; constructor () { this._schema = new Schema(); @@ -25,6 +27,7 @@ export class Visitor { this._indexer = new Indexer(); this._entity = new Entity(); this._database = new Database(); + this._client = new Client(); } /** @@ -46,6 +49,7 @@ export class Visitor { this._indexer.addQuery(MODE_ETH_CALL, name, params, returnType); this._entity.addQuery(name, params, returnType); this._database.addQuery(name, params, returnType); + this._client.addQuery(name, params, returnType); } } @@ -78,6 +82,7 @@ export class Visitor { this._indexer.addQuery(MODE_STORAGE, name, params, returnType); this._entity.addQuery(name, params, returnType); this._database.addQuery(name, params, returnType); + this._client.addQuery(name, params, returnType); } /** @@ -97,9 +102,10 @@ export class Visitor { /** * Writes schema to a stream. * @param outStream A writable output stream to write the schema to. + * @returns The schema string. */ - exportSchema (outStream: Writable): void { - this._schema.exportSchema(outStream); + exportSchema (outStream: Writable): string { + return this._schema.exportSchema(outStream); } /** @@ -134,4 +140,14 @@ export class Visitor { exportDatabase (outStream: Writable): void { this._database.exportDatabase(outStream); } + + /** + * Writes the client file generated from a template to a stream and export quries. + * @param outStream A writable output stream to write the client file to. + * @param schemaContent Content of the schema for generating the queries, mutations and subscriptions. + * @param gqlDir Directory to store the generated gql queries, mutations and subscriptions. + */ + exportClient (outStream: Writable, schemaContent: string, gqlDir: string): void { + this._client.exportClient(outStream, schemaContent, gqlDir); + } } diff --git a/packages/ipld-eth-client/src/graphql-client.ts b/packages/ipld-eth-client/src/graphql-client.ts index 8a72e61f..0fa807e8 100644 --- a/packages/ipld-eth-client/src/graphql-client.ts +++ b/packages/ipld-eth-client/src/graphql-client.ts @@ -112,4 +112,10 @@ export class GraphQLClient { return result; } + + async mutate (mutation: DocumentNode | TypedDocumentNode, variables: { [key: string]: any }): Promise { + const { data: result } = await this._client.mutate({ mutation, variables }); + + return result; + } } diff --git a/yarn.lock b/yarn.lock index 969d8573..14fb058c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3364,11 +3364,23 @@ array-includes@^3.1.3: get-intrinsic "^1.1.1" is-string "^1.0.5" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -4865,7 +4877,7 @@ commander@3.0.2, commander@^3.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^2.20.3: +commander@^2.15.1, commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -5468,6 +5480,18 @@ defined@~1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= + dependencies: + globby "^6.1.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + p-map "^1.1.1" + pify "^3.0.0" + rimraf "^2.2.8" + delay@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" @@ -7389,6 +7413,18 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d" @@ -7440,6 +7476,17 @@ globby@^11.0.1, globby@^11.0.2: merge2 "^1.3.0" slash "^3.0.0" +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + got@9.6.0, got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -7477,6 +7524,14 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" +"gql-generator@https://github.com/vulcanize/gql-generator.git": + version "1.0.13" + resolved "https://github.com/vulcanize/gql-generator.git#0b818b1d41bd383c860d1c88082b7b1f5831c272" + dependencies: + commander "^2.15.1" + del "^3.0.0" + graphql "^0.13.2" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -7556,6 +7611,13 @@ graphql-type-json@0.3.2: resolved "https://registry.yarnpkg.com/graphql-type-json/-/graphql-type-json-0.3.2.tgz#f53a851dbfe07bd1c8157d24150064baab41e115" integrity sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg== +graphql@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270" + integrity sha512-QZ5BL8ZO/B20VA8APauGBg3GyEgZ19eduvpLWoq5x7gMmWnHoy8rlQWPLmWgFvo1yNgjSEFMesmS4R6pPr7xog== + dependencies: + iterall "^1.2.1" + graphql@^14.0.2: version "14.7.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72" @@ -8372,6 +8434,25 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + is-path-inside@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -10637,6 +10718,11 @@ p-map-series@^2.1.0: resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -10902,6 +10988,11 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"