Búsqueda de sitios web

¿Cómo crear un SDK tipado de GraphQL a partir de un objeto de esquema de TypeScript?


Tengo una API GraphQL de código primero en la cual el GraphQLSchema se crea de la siguiente manera:

import { GraphQLSchema } from 'graphql';
import { mutationType } from './mutation';
import { queryType } from './query';

const schema = new GraphQLSchema({
  query: queryType,
  mutation: mutationType,
});

export { schema };

Sé cómo generar un esquema escrito en Lenguaje de Definición de Esquemas (SDL) con printSchema(schema).

Ahora necesito un SDK para proporcionar a los clientes de mi API. Mi problema es que no puedo encontrar ninguna biblioteca para generar un SDK tipado a partir del esquema.

Las bibliotecas que encuentro como graphql-request, urql o apollo-client te obligan a escribir toda la consulta sin ningún tipo de verificación de sintaxis.

import { gql, GraphQLClient } from 'graphql-request'

const query = gql`               //
  {                              //
    Movie(title: "Inception") {  // I can write whatever I want
      releaseDate                // here and no transpilation
      actors {                   // errors will appear.
        name                     // I have no autocompletion
      }                          // whatsoever.
    }                            //
  }                              //
`
const client = new GraphQLClient('https://api.graph.cool/simple/v1/movies', { headers: {} })
client.request(query, variables).then((data) => console.log(data))

Quiero poder hacer algo como const client=new GraphQLClient(endpoint, schema, options);. Y luego usarlo así await client.movie(title)({releaseDate: true, actors: {name: true}});. No necesariamente con esa sintaxis, pero espero que esto dé a entender la idea. Si escribo rleaseDate solo quiero una línea roja debajo en mi IDE y un error de transpilación si ejecuto tsc.

He encontrado graphql-code-generator y veo que puede generar diferentes cosas usando el esquema generado con printSchema(schema). Pero para el plugin typescript-graphql-request que puede generar el SDK que quiero, parece que necesitaría escribir un archivo operation.graphql yo mismo, lo cual es lo primero que quiero evitar. La API, como dije, es code-first y todo está en el esquema del que hablo al inicio. No quiero una segunda fuente de verdad en ese archivo operation.graphql.

¿Existe lo que quiero?

Respuesta #1

¡Está bien! Así que encontré lo que estaba buscando: graphql-zeus

El comando zeus [ruta al archivo SDL] --typescript --node genera un SDK que puedo proporcionar a los clientes que usarán la API, y ellos pueden usar el SDK de la siguiente manera:

import { Chain } from "[SDK generated]";

Chain(`example.com/graphql`, {
  headers: {
    'Authorization': 'Bearer 00112233445566778899',
    'Content-Type': 'application/json',
  },
})('mutation')({
    createUser: [{
      username: newUsername,
      biography: newBio,
      picture: newPicture,
    },
  { id: true, username: true }]
})
  .catch(error => {
     // Do something
});

Y mutation, la operación createUser y sus parámetros están tipados. Esto significa que obtendré errores de transpilación y el IDE me dirá qué puedo escribir en cada campo.

Artículos relacionados