graphql / graphql-js

A reference implementation of GraphQL for JavaScript
http://graphql.org/graphql-js/
MIT License
20.02k stars 2.02k forks source link

The result of `getIntrospectionQuery` does not match `IntrospectionQuery` type #3409

Open Woodz opened 2 years ago

Woodz commented 2 years ago

getIntrospectionQuery only requests the name field from the root queryType object (https://github.com/graphql/graphql-js/blob/6e48d16f92b9a6df8638b1486354c6be2537033b/src/utilities/getIntrospectionQuery.ts)

queryType { name }

yet the IntrospectionQuery datatype defines queryType as IntrospectionNamedTypeRef (https://github.com/graphql/graphql-js/blob/main/src/utilities/getIntrospectionQuery.ts#L167) which requires kind as well

export interface IntrospectionNamedTypeRef<
  T extends IntrospectionType = IntrospectionType,
> {
  readonly kind: T['kind'];
  readonly name: string;
}

This means that copying the result of the querying a GQL API with the introspection query as JSON and trying to assign to IntrospectionQuery will fail with:

The types of '__schema.queryType' are incompatible between these types. Property 'kind' is missing in type '{ name: string; }' but required in type 'IntrospectionNamedTypeRef'.

sibo2000 commented 2 years ago

Bumping this.

conatus commented 2 years ago

Still seeing this issue. At the moment, chucking in a @ts-ignore but would be nice to have a firmer fix.

Exact same situation, passing an introspection in JSON into buildClientSchema. Using the very latest graphql at 16.4.0.

import * as introspectionResult from "../../../graphql.schema.json";

const schema = buildClientSchema(introspectionResult);

Produces the following error:

Argument of type '{ __schema: { queryType: { name: string; }; mutationType: { name: string; }; subscriptionType: null; types: ({ kind: string; name: string; description: string; fields: null; inputFields: null; interfaces: null; enumValues: null; possibleTypes: null; } | ... 9 more ... | { ...; })[]; directives: ({ ...; } | { ...; })...' is not assignable to parameter of type 'IntrospectionQuery'.
  The types of '__schema.queryType' are incompatible between these types.
    Property 'kind' is missing in type '{ name: string; }' but required in type 'IntrospectionNamedTypeRef<IntrospectionObjectType>'

Other issues downstream in users of this library:

conatus commented 2 years ago

Wondered if making kind option would be enough, and it creates further problems upstream.

export interface IntrospectionNamedTypeRef<
  T extends IntrospectionType = IntrospectionType,
> {
  readonly kind?: T['kind'];
  readonly name: string;
}
yaacovCR commented 2 years ago

@IvanGoncharov is it simply a matter of fixing getIntrospectionQuery to include kind as hinted at above?

yaacovCR commented 2 years ago

Or is that silly because the kind is obvious for root types? And we need a new introspection type for root types?