diff --git a/.changeset/true-walls-design.md b/.changeset/true-walls-design.md new file mode 100644 index 0000000..dc983a2 --- /dev/null +++ b/.changeset/true-walls-design.md @@ -0,0 +1,5 @@ +--- +'@0no-co/graphql.web': patch +--- + +Fix regression on using `Kind` without `graphql` types resolving diff --git a/src/kind.d.ts b/src/kind.d.ts index 3f9a228..eadc6da 100644 --- a/src/kind.d.ts +++ b/src/kind.d.ts @@ -1,11 +1,76 @@ import type * as GraphQL from 'graphql'; -type GraphQLKind< - Key extends string, - Fallback extends string, -> = Key extends keyof typeof GraphQL.Kind ? (typeof GraphQL.Kind)[Key] : Fallback; +// When `graphql` isn't installed, `typeof GraphQL.Kind` resolves to `any`. That would make +// `keyof typeof GraphQL.Kind` match every `Key` and collapse `GraphQLKind` and the `Kind` value +// itself to `any`, breaking discriminated unions on AST `kind` fields. `IsGraphQLAny` detects that +// case so we fall back to the literal string kinds instead. +type IsGraphQLAny = 0 extends 1 & typeof GraphQL.Kind ? true : false; -export declare const Kind: typeof GraphQL.Kind & { +type GraphQLKind = IsGraphQLAny extends true + ? Fallback + : Key extends keyof typeof GraphQL.Kind + ? (typeof GraphQL.Kind)[Key] + : Fallback; + +export declare const Kind: (IsGraphQLAny extends true ? {} : typeof GraphQL.Kind) & { + readonly NAME: GraphQLKind<'NAME', 'Name'>; + readonly DOCUMENT: GraphQLKind<'DOCUMENT', 'Document'>; + readonly OPERATION_DEFINITION: GraphQLKind<'OPERATION_DEFINITION', 'OperationDefinition'>; + readonly VARIABLE_DEFINITION: GraphQLKind<'VARIABLE_DEFINITION', 'VariableDefinition'>; + readonly SELECTION_SET: GraphQLKind<'SELECTION_SET', 'SelectionSet'>; + readonly FIELD: GraphQLKind<'FIELD', 'Field'>; + readonly ARGUMENT: GraphQLKind<'ARGUMENT', 'Argument'>; + readonly FRAGMENT_SPREAD: GraphQLKind<'FRAGMENT_SPREAD', 'FragmentSpread'>; + readonly INLINE_FRAGMENT: GraphQLKind<'INLINE_FRAGMENT', 'InlineFragment'>; + readonly FRAGMENT_DEFINITION: GraphQLKind<'FRAGMENT_DEFINITION', 'FragmentDefinition'>; + readonly VARIABLE: GraphQLKind<'VARIABLE', 'Variable'>; + readonly INT: GraphQLKind<'INT', 'IntValue'>; + readonly FLOAT: GraphQLKind<'FLOAT', 'FloatValue'>; + readonly STRING: GraphQLKind<'STRING', 'StringValue'>; + readonly BOOLEAN: GraphQLKind<'BOOLEAN', 'BooleanValue'>; + readonly NULL: GraphQLKind<'NULL', 'NullValue'>; + readonly ENUM: GraphQLKind<'ENUM', 'EnumValue'>; + readonly LIST: GraphQLKind<'LIST', 'ListValue'>; + readonly OBJECT: GraphQLKind<'OBJECT', 'ObjectValue'>; + readonly OBJECT_FIELD: GraphQLKind<'OBJECT_FIELD', 'ObjectField'>; + readonly DIRECTIVE: GraphQLKind<'DIRECTIVE', 'Directive'>; + readonly NAMED_TYPE: GraphQLKind<'NAMED_TYPE', 'NamedType'>; + readonly LIST_TYPE: GraphQLKind<'LIST_TYPE', 'ListType'>; + readonly NON_NULL_TYPE: GraphQLKind<'NON_NULL_TYPE', 'NonNullType'>; + readonly SCHEMA_DEFINITION: GraphQLKind<'SCHEMA_DEFINITION', 'SchemaDefinition'>; + readonly OPERATION_TYPE_DEFINITION: GraphQLKind< + 'OPERATION_TYPE_DEFINITION', + 'OperationTypeDefinition' + >; + readonly SCALAR_TYPE_DEFINITION: GraphQLKind<'SCALAR_TYPE_DEFINITION', 'ScalarTypeDefinition'>; + readonly OBJECT_TYPE_DEFINITION: GraphQLKind<'OBJECT_TYPE_DEFINITION', 'ObjectTypeDefinition'>; + readonly FIELD_DEFINITION: GraphQLKind<'FIELD_DEFINITION', 'FieldDefinition'>; + readonly INPUT_VALUE_DEFINITION: GraphQLKind<'INPUT_VALUE_DEFINITION', 'InputValueDefinition'>; + readonly INTERFACE_TYPE_DEFINITION: GraphQLKind< + 'INTERFACE_TYPE_DEFINITION', + 'InterfaceTypeDefinition' + >; + readonly UNION_TYPE_DEFINITION: GraphQLKind<'UNION_TYPE_DEFINITION', 'UnionTypeDefinition'>; + readonly ENUM_TYPE_DEFINITION: GraphQLKind<'ENUM_TYPE_DEFINITION', 'EnumTypeDefinition'>; + readonly ENUM_VALUE_DEFINITION: GraphQLKind<'ENUM_VALUE_DEFINITION', 'EnumValueDefinition'>; + readonly INPUT_OBJECT_TYPE_DEFINITION: GraphQLKind< + 'INPUT_OBJECT_TYPE_DEFINITION', + 'InputObjectTypeDefinition' + >; + readonly DIRECTIVE_DEFINITION: GraphQLKind<'DIRECTIVE_DEFINITION', 'DirectiveDefinition'>; + readonly SCHEMA_EXTENSION: GraphQLKind<'SCHEMA_EXTENSION', 'SchemaExtension'>; + readonly SCALAR_TYPE_EXTENSION: GraphQLKind<'SCALAR_TYPE_EXTENSION', 'ScalarTypeExtension'>; + readonly OBJECT_TYPE_EXTENSION: GraphQLKind<'OBJECT_TYPE_EXTENSION', 'ObjectTypeExtension'>; + readonly INTERFACE_TYPE_EXTENSION: GraphQLKind< + 'INTERFACE_TYPE_EXTENSION', + 'InterfaceTypeExtension' + >; + readonly UNION_TYPE_EXTENSION: GraphQLKind<'UNION_TYPE_EXTENSION', 'UnionTypeExtension'>; + readonly ENUM_TYPE_EXTENSION: GraphQLKind<'ENUM_TYPE_EXTENSION', 'EnumTypeExtension'>; + readonly INPUT_OBJECT_TYPE_EXTENSION: GraphQLKind< + 'INPUT_OBJECT_TYPE_EXTENSION', + 'InputObjectTypeExtension' + >; /** Coordinates */ readonly TYPE_COORDINATE: GraphQLKind<'TYPE_COORDINATE', 'TypeCoordinate'>; readonly MEMBER_COORDINATE: GraphQLKind<'MEMBER_COORDINATE', 'MemberCoordinate'>;