GQty
GQty is a fundamentally new approach to a GraphQL client. It makes using your API enjoyable, by generating queries at runtime based upon the data your app consumes.
Installation
sh
$ npm i @garph/gqty$ npm i @garph/gqtysh
$ pnpm add @garph/gqty$ pnpm add @garph/gqtysh
$ yarn add @garph/gqty$ yarn add @garph/gqtysh
$ bun i @garph/gqty$ bun i @garph/gqtyInitialization
Example Schema:
ts
import { g, buildSchema } from 'garph'
export const queryType = g.type('Query', {
greet: g.string()
.args({
name: g.string().optional().default('Max'),
})
.description('Greets a person')
})
const schema = buildSchema({ g })import { g, buildSchema } from 'garph'
export const queryType = g.type('Query', {
greet: g.string()
.args({
name: g.string().optional().default('Max'),
})
.description('Greets a person')
})
const schema = buildSchema({ g })Initializing the client:
ts
import { InferClient, createClient } from '@garph/gqty'
import { createScalarsEnumsHash, createGeneratedSchema } from '@garph/gqty/dist/utils'
import { schema, queryType } from './schema.ts'
type ClientTypes = InferClient<{ query: typeof queryType }>
export const { useQuery, ... } = createClient<ClientTypes>({
generatedSchema: createGeneratedSchema(schema),
scalarsEnumsHash: createScalarsEnumsHash(schema),
url: 'http://localhost:4000/graphql'
})
// Needed for the babel plugin
export { schema as compiledSchema }import { InferClient, createClient } from '@garph/gqty'
import { createScalarsEnumsHash, createGeneratedSchema } from '@garph/gqty/dist/utils'
import { schema, queryType } from './schema.ts'
type ClientTypes = InferClient<{ query: typeof queryType }>
export const { useQuery, ... } = createClient<ClientTypes>({
generatedSchema: createGeneratedSchema(schema),
scalarsEnumsHash: createScalarsEnumsHash(schema),
url: 'http://localhost:4000/graphql'
})
// Needed for the babel plugin
export { schema as compiledSchema }Adding subscriptions support
npm i graphql-ssenpm i graphql-ssets
import { createClient as createSubscriptionsClient } from 'graphql-sse'
export const { useSubscription, ... } = createClient<ClientTypes>({
generatedSchema: createGeneratedSchema(schema),
scalarsEnumsHash: createScalarsEnumsHash(schema),
url: 'http://localhost:4000/graphql',
subscriptionClient: createSubscriptionsClient({
url: 'http://localhost:4000/api/graphql/stream'
})
})import { createClient as createSubscriptionsClient } from 'graphql-sse'
export const { useSubscription, ... } = createClient<ClientTypes>({
generatedSchema: createGeneratedSchema(schema),
scalarsEnumsHash: createScalarsEnumsHash(schema),
url: 'http://localhost:4000/graphql',
subscriptionClient: createSubscriptionsClient({
url: 'http://localhost:4000/api/graphql/stream'
})
})Babel Plugin
In production, you might want to use the babel plugin in order to replace the runtime dependencies (such as generatedSchema, scalarsEnumsHash) in your client config with statically-generated artefacts.
json
{
"plugins": [["@garph/gqty/dist/plugin", {
"clientConfig": "./utils/client.ts"
}]]
}{
"plugins": [["@garph/gqty/dist/plugin", {
"clientConfig": "./utils/client.ts"
}]]
}Usage
Core Client
Example:
ts
import { resolved, query } from './client'
resolved(() => {
return query.greet({ name: 'Mish' })
})
.then(data => {
console.log(data)
})import { resolved, query } from './client'
resolved(() => {
return query.greet({ name: 'Mish' })
})
.then(data => {
console.log(data)
})React
Example:
tsx
import { useQuery } from './client'
export default function Example() {
const query = useQuery()
return <p>{ query.greet({ name: 'Mish' }) }</p>
}import { useQuery } from './client'
export default function Example() {
const query = useQuery()
return <p>{ query.greet({ name: 'Mish' }) }</p>
}