UNPKG

@gqlts/cli

Version:

Generate a client sdk from your GraphQl API

63 lines (54 loc) 1.96 kB
import { ExecutionResult, buildClientSchema, getIntrospectionQuery } from 'graphql'; import { GraphQLSchemaValidationOptions } from 'graphql/type/schema'; import fetch from 'isomorphic-unfetch'; import qs from 'qs'; export interface SchemaFetcher { (query: string, fetchImpl: typeof fetch, qsImpl: typeof qs): Promise<ExecutionResult>; } export async function fetchSchema({ endpoint, usePost = false, headers, options, }: { endpoint: string; usePost: boolean; headers?: Record<string, string>; options?: GraphQLSchemaValidationOptions; }) { const response = await fetch( usePost ? endpoint : `${endpoint}?${qs.stringify({ query: getIntrospectionQuery() })}`, usePost ? { method: usePost ? 'POST' : 'GET', body: JSON.stringify({ query: getIntrospectionQuery() }), headers: { ...headers, 'Content-Type': 'application/json' }, } : { headers, }, ); if (!response.ok) { throw new Error('introspection query was not successful, ' + response.statusText); } const result = await response.json().catch((e) => { const contentType = response.headers.get('Content-Type'); console.log(`content type is ${contentType}`); throw new Error( `endpoint '${endpoint}' did not return valid json, check that your endpoint points to a valid graphql api`, ); }); if (!result.data) { throw new Error('introspection request did not receive a valid response'); } // console.log(result.data) // console.log(JSON.stringify(result.data, null, 4)) return buildClientSchema(result.data, options); } export async function customFetchSchema(fetcher: SchemaFetcher, options?: GraphQLSchemaValidationOptions) { const result = await fetcher(getIntrospectionQuery(), fetch, qs); if (!result.data) { throw new Error('introspection request did not receive a valid response'); } return buildClientSchema(result.data as any, options); }