-
Notifications
You must be signed in to change notification settings - Fork 846
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor(experimental): graphql: enable schema extending
- Loading branch information
1 parent
ec860f6
commit b9bdb88
Showing
5 changed files
with
208 additions
and
18 deletions.
There are no files selected for viewing
127 changes: 127 additions & 0 deletions
127
packages/rpc-graphql/src/__tests__/customization-test.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
import { | ||
GetAccountInfoApi, | ||
GetBlockApi, | ||
GetMultipleAccountsApi, | ||
GetProgramAccountsApi, | ||
GetTransactionApi, | ||
Rpc, | ||
} from '@solana/rpc'; | ||
|
||
import { createRpcGraphQL, resolveAccount } from '../index'; | ||
import { createLocalhostSolanaRpc } from './__setup__'; | ||
|
||
type GraphQLCompliantRpc = Rpc< | ||
GetAccountInfoApi & GetBlockApi & GetMultipleAccountsApi & GetProgramAccountsApi & GetTransactionApi | ||
>; | ||
|
||
describe('schema customization', () => { | ||
let rpc: GraphQLCompliantRpc; | ||
beforeEach(() => { | ||
rpc = createLocalhostSolanaRpc(); | ||
}); | ||
|
||
it('query with types', async () => { | ||
expect.assertions(1); | ||
|
||
const masterEditionAddress = 'B2Srva38aD8bWpjghkU7jKFUqT1Y4KB2ejAnsJbP2ibA'; | ||
|
||
// Define custom type definitions for the GraphQL schema. | ||
const customTypeDefs = /* GraphQL */ ` | ||
# A Solana Master Edition NFT. | ||
type NftMasterEdition { | ||
address: Address | ||
metadata: Account | ||
mint: Account | ||
} | ||
# Query to retrieve a Solana Master Edition NFT. | ||
type Query { | ||
masterEdition(address: Address!): NftMasterEdition | ||
} | ||
`; | ||
|
||
// Define custom resolvers for the GraphQL schema. | ||
const customResolvers = { | ||
// Resolver for the custom `NftMasterEdition` type. | ||
NftMasterEdition: { | ||
metadata: resolveAccount('metadata'), | ||
mint: resolveAccount('mint'), | ||
}, | ||
}; | ||
|
||
// Define custom queries for the GraphQL schema. | ||
const customQueries = { | ||
// Query to retrieve a Solana Master Edition NFT. | ||
masterEdition: () => { | ||
return { | ||
// Arbitrary address. | ||
address: masterEditionAddress, | ||
// See scripts/fixtures/gpa1.json. | ||
metadata: 'CcYNb7WqpjaMrNr7B1mapaNfWctZRH7LyAjWRLBGt1Fk', | ||
// See scripts/fixtures/spl-token-mint-account.json. | ||
mint: 'Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr', | ||
}; | ||
}, | ||
}; | ||
|
||
// Create the RPC-GraphQL client with the custom type definitions and | ||
// resolvers. | ||
const rpcGraphQL = createRpcGraphQL(rpc, { | ||
queries: customQueries, | ||
resolvers: customResolvers, | ||
typeDefs: customTypeDefs, | ||
}); | ||
|
||
// Create a test query for the custom `masterEdition` query. | ||
const source = /* GraphQL */ ` | ||
query ($masterEditionAddress: Address!) { | ||
masterEdition(address: $masterEditionAddress) { | ||
address | ||
metadata { | ||
address | ||
lamports | ||
} | ||
mint { | ||
address | ||
lamports | ||
ownerProgram { | ||
address | ||
} | ||
... on MintAccount { | ||
decimals | ||
supply | ||
} | ||
} | ||
} | ||
} | ||
`; | ||
|
||
// Execute the test query. | ||
const result = await rpcGraphQL.query(source, { | ||
masterEditionAddress, | ||
}); | ||
|
||
// Assert the custom type definitions and resolvers were accepted and | ||
// the query was successful. | ||
expect(result).toMatchObject({ | ||
data: { | ||
masterEdition: { | ||
address: masterEditionAddress, | ||
metadata: { | ||
address: 'CcYNb7WqpjaMrNr7B1mapaNfWctZRH7LyAjWRLBGt1Fk', | ||
lamports: expect.any(BigInt), | ||
}, | ||
mint: { | ||
address: 'Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr', | ||
decimals: expect.any(Number), | ||
lamports: expect.any(BigInt), | ||
ownerProgram: { | ||
address: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', | ||
}, | ||
supply: expect.any(String), | ||
}, | ||
}, | ||
}, | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,25 @@ | ||
import type { makeExecutableSchema } from '@graphql-tools/schema'; | ||
|
||
import { accountTypeDefs } from './account'; | ||
import { blockTypeDefs } from './block'; | ||
import { instructionTypeDefs } from './instruction'; | ||
import { rootTypeDefs } from './root'; | ||
import { transactionTypeDefs } from './transaction'; | ||
import { typeTypeDefs } from './types'; | ||
|
||
export function createSolanaGraphQLTypeDefs() { | ||
return [accountTypeDefs, blockTypeDefs, instructionTypeDefs, rootTypeDefs, typeTypeDefs, transactionTypeDefs]; | ||
type TypeDefs = Parameters<typeof makeExecutableSchema>[0]['typeDefs']; | ||
|
||
export function createSolanaGraphQLTypeDefs({ typeDefs }: { typeDefs?: TypeDefs }): TypeDefs { | ||
const schemaTypeDefs = [ | ||
accountTypeDefs, | ||
blockTypeDefs, | ||
instructionTypeDefs, | ||
rootTypeDefs, | ||
typeTypeDefs, | ||
transactionTypeDefs, | ||
] as TypeDefs[]; | ||
if (typeDefs) { | ||
schemaTypeDefs.push(typeDefs); | ||
} | ||
return schemaTypeDefs; | ||
} |