graphql-js icon indicating copy to clipboard operation
graphql-js copied to clipboard

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

Open Woodz opened this issue 2 years ago • 5 comments

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<IntrospectionObjectType>'.

Woodz avatar Dec 06 '21 11:12 Woodz

Bumping this.

sibo2000 avatar Dec 16 '21 15:12 sibo2000

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:

  • https://github.com/apollographql/apollo-tooling/issues/1491
  • https://github.com/DefinitelyTyped/DefinitelyTyped/issues/34649 - this contains an incorrect fix, as it is still broken in the latest version.

conatus avatar Apr 26 '22 14:04 conatus

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;
}

conatus avatar Apr 26 '22 14:04 conatus

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

yaacovCR avatar May 22 '22 19:05 yaacovCR

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

yaacovCR avatar May 25 '22 08:05 yaacovCR