diff options
| author | netop://ウィビ <paul@webb.page> | 2026-10-21 16:47:38 -0700 |
|---|---|---|
| committer | netop://ウィビ <paul@webb.page> | 2026-10-21 16:47:38 -0700 |
| commit | 389ad1349c4ff245a3466a2e361c1cd1dd11d2ba (patch) | |
| tree | 0ad0638f60ab0a77c7a095e96b472312ab39f83b /vendor/deps.d.ts | |
| parent | bbcbb02ef64d094f0f13de22ae135eeba1ff4c5d (diff) | |
| download | gq-primary.tar.gz gq-primary.zip | |
- inlined vendored dependencies from npm
- makes this module work in Ende
Diffstat (limited to '')
| -rw-r--r-- | vendor/deps.d.ts | 14536 |
1 files changed, 14536 insertions, 0 deletions
diff --git a/vendor/deps.d.ts b/vendor/deps.d.ts new file mode 100644 index 0000000..ca493ce --- /dev/null +++ b/vendor/deps.d.ts @@ -0,0 +1,14536 @@ +// Generated by dts-bundle-generator v9.5.1 + +/** @category Version */ +/** A string containing the version of the GraphQL.js library */ +export declare const version: string; +/** An object containing the components of the GraphQL.js version string */ +export declare const versionInfo: Readonly<{ + major: number; + minor: number; + patch: number; + preReleaseTag: string | null; +}>; +/** @category Development Mode */ +/** + * Enables GraphQL.js development mode checks for this module instance. + * + * Production entry points leave development mode disabled by default. Call this + * before constructing schemas or executing requests when additional development + * diagnostics should run. + * @example + * ```ts + * import { enableDevMode, isDevModeEnabled } from 'graphql/devMode'; + * + * isDevModeEnabled(); // => false + * enableDevMode(); + * isDevModeEnabled(); // => true + * ``` + */ +export declare function enableDevMode(): void; +/** + * Returns whether GraphQL.js development mode has been enabled for this module + * instance. + * @returns True when development mode is enabled. + * @example + * ```ts + * import { enableDevMode, isDevModeEnabled } from 'graphql/devMode'; + * + * enableDevMode(); + * + * isDevModeEnabled(); // => true + * ``` + */ +export declare function isDevModeEnabled(): boolean; +type Maybe<T> = null | undefined | T; +interface ObjMap<T> { + [key: string]: T; +} +interface ReadOnlyObjMap<T> { + readonly [key: string]: T; +} +declare const NAME = "Name"; +type NAME = typeof NAME; +declare const DOCUMENT = "Document"; +type DOCUMENT = typeof DOCUMENT; +declare const OPERATION_DEFINITION = "OperationDefinition"; +type OPERATION_DEFINITION = typeof OPERATION_DEFINITION; +declare const VARIABLE_DEFINITION = "VariableDefinition"; +type VARIABLE_DEFINITION = typeof VARIABLE_DEFINITION; +declare const SELECTION_SET = "SelectionSet"; +type SELECTION_SET = typeof SELECTION_SET; +declare const FIELD = "Field"; +type FIELD = typeof FIELD; +declare const ARGUMENT = "Argument"; +type ARGUMENT = typeof ARGUMENT; +declare const FRAGMENT_ARGUMENT = "FragmentArgument"; +type FRAGMENT_ARGUMENT = typeof FRAGMENT_ARGUMENT; +declare const FRAGMENT_SPREAD = "FragmentSpread"; +type FRAGMENT_SPREAD = typeof FRAGMENT_SPREAD; +declare const INLINE_FRAGMENT = "InlineFragment"; +type INLINE_FRAGMENT = typeof INLINE_FRAGMENT; +declare const FRAGMENT_DEFINITION = "FragmentDefinition"; +type FRAGMENT_DEFINITION = typeof FRAGMENT_DEFINITION; +declare const VARIABLE = "Variable"; +type VARIABLE = typeof VARIABLE; +declare const INT = "IntValue"; +type INT = typeof INT; +declare const FLOAT = "FloatValue"; +type FLOAT = typeof FLOAT; +declare const STRING = "StringValue"; +type STRING = typeof STRING; +declare const BOOLEAN = "BooleanValue"; +type BOOLEAN = typeof BOOLEAN; +declare const NULL = "NullValue"; +type NULL = typeof NULL; +declare const ENUM = "EnumValue"; +type ENUM = typeof ENUM; +declare const LIST = "ListValue"; +type LIST = typeof LIST; +declare const OBJECT = "ObjectValue"; +type OBJECT = typeof OBJECT; +declare const OBJECT_FIELD = "ObjectField"; +type OBJECT_FIELD = typeof OBJECT_FIELD; +declare const DIRECTIVE = "Directive"; +type DIRECTIVE = typeof DIRECTIVE; +declare const NAMED_TYPE = "NamedType"; +type NAMED_TYPE = typeof NAMED_TYPE; +declare const LIST_TYPE = "ListType"; +type LIST_TYPE = typeof LIST_TYPE; +declare const NON_NULL_TYPE = "NonNullType"; +type NON_NULL_TYPE = typeof NON_NULL_TYPE; +declare const SCHEMA_DEFINITION = "SchemaDefinition"; +type SCHEMA_DEFINITION = typeof SCHEMA_DEFINITION; +declare const OPERATION_TYPE_DEFINITION = "OperationTypeDefinition"; +type OPERATION_TYPE_DEFINITION = typeof OPERATION_TYPE_DEFINITION; +declare const SCALAR_TYPE_DEFINITION = "ScalarTypeDefinition"; +type SCALAR_TYPE_DEFINITION = typeof SCALAR_TYPE_DEFINITION; +declare const OBJECT_TYPE_DEFINITION = "ObjectTypeDefinition"; +type OBJECT_TYPE_DEFINITION = typeof OBJECT_TYPE_DEFINITION; +declare const FIELD_DEFINITION = "FieldDefinition"; +type FIELD_DEFINITION = typeof FIELD_DEFINITION; +declare const INPUT_VALUE_DEFINITION = "InputValueDefinition"; +type INPUT_VALUE_DEFINITION = typeof INPUT_VALUE_DEFINITION; +declare const INTERFACE_TYPE_DEFINITION = "InterfaceTypeDefinition"; +type INTERFACE_TYPE_DEFINITION = typeof INTERFACE_TYPE_DEFINITION; +declare const UNION_TYPE_DEFINITION = "UnionTypeDefinition"; +type UNION_TYPE_DEFINITION = typeof UNION_TYPE_DEFINITION; +declare const ENUM_TYPE_DEFINITION = "EnumTypeDefinition"; +declare const ENUM_VALUE_DEFINITION = "EnumValueDefinition"; +type ENUM_VALUE_DEFINITION = typeof ENUM_VALUE_DEFINITION; +declare const INPUT_OBJECT_TYPE_DEFINITION = "InputObjectTypeDefinition"; +type INPUT_OBJECT_TYPE_DEFINITION = typeof INPUT_OBJECT_TYPE_DEFINITION; +declare const DIRECTIVE_DEFINITION = "DirectiveDefinition"; +type DIRECTIVE_DEFINITION = typeof DIRECTIVE_DEFINITION; +declare const SCHEMA_EXTENSION = "SchemaExtension"; +type SCHEMA_EXTENSION = typeof SCHEMA_EXTENSION; +declare const DIRECTIVE_EXTENSION = "DirectiveExtension"; +type DIRECTIVE_EXTENSION = typeof DIRECTIVE_EXTENSION; +declare const SCALAR_TYPE_EXTENSION = "ScalarTypeExtension"; +type SCALAR_TYPE_EXTENSION = typeof SCALAR_TYPE_EXTENSION; +declare const OBJECT_TYPE_EXTENSION = "ObjectTypeExtension"; +type OBJECT_TYPE_EXTENSION = typeof OBJECT_TYPE_EXTENSION; +declare const INTERFACE_TYPE_EXTENSION = "InterfaceTypeExtension"; +type INTERFACE_TYPE_EXTENSION = typeof INTERFACE_TYPE_EXTENSION; +declare const UNION_TYPE_EXTENSION = "UnionTypeExtension"; +type UNION_TYPE_EXTENSION = typeof UNION_TYPE_EXTENSION; +declare const ENUM_TYPE_EXTENSION = "EnumTypeExtension"; +type ENUM_TYPE_EXTENSION = typeof ENUM_TYPE_EXTENSION; +declare const INPUT_OBJECT_TYPE_EXTENSION = "InputObjectTypeExtension"; +type INPUT_OBJECT_TYPE_EXTENSION = typeof INPUT_OBJECT_TYPE_EXTENSION; +declare const TYPE_COORDINATE = "TypeCoordinate"; +type TYPE_COORDINATE = typeof TYPE_COORDINATE; +declare const MEMBER_COORDINATE = "MemberCoordinate"; +type MEMBER_COORDINATE = typeof MEMBER_COORDINATE; +declare const ARGUMENT_COORDINATE = "ArgumentCoordinate"; +type ARGUMENT_COORDINATE = typeof ARGUMENT_COORDINATE; +declare const DIRECTIVE_COORDINATE = "DirectiveCoordinate"; +type DIRECTIVE_COORDINATE = typeof DIRECTIVE_COORDINATE; +declare const DIRECTIVE_ARGUMENT_COORDINATE = "DirectiveArgumentCoordinate"; +type DIRECTIVE_ARGUMENT_COORDINATE = typeof DIRECTIVE_ARGUMENT_COORDINATE; +type KindTypeMap = typeof Kind; +interface Location { + line: number; + column: number; +} +/** + * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are + * optional, but they are useful for clients who store GraphQL documents in source files. + * For example, if the GraphQL input starts at line 40 in a file named `Foo.graphql`, it might + * be useful for `name` to be `"Foo.graphql"` and location to be `{ line: 40, column: 1 }`. + * The `line` and `column` properties in `locationOffset` are 1-indexed. + */ +export declare class Source { + /** The GraphQL source text. */ + body: string; + /** Name used in diagnostics for this source, such as a file path or request name. */ + name: string; + /** One-indexed line and column where this source begins. */ + locationOffset: Location; + /** + * Creates a Source instance. + * @param body - The GraphQL source text. + * @param name - Name used in diagnostics for this source. + * @param locationOffset - One-indexed line and column where this source begins. + * @example + * ```ts + * import { Source } from 'graphql/language'; + * + * const source = new Source('type Query { greeting: String }', 'schema.graphql', { + * line: 10, + * column: 1, + * }); + * + * source.body; // => 'type Query { greeting: String }' + * source.name; // => 'schema.graphql' + * source.locationOffset; // => { line: 10, column: 1 } + * ``` + */ + constructor(body: string, name?: string, locationOffset?: Location); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; +} +/** @category Lexing */ +/** + * An exported enum describing the different kinds of tokens that the + * lexer emits. + */ +export declare const TokenKind: { + readonly SOF: "<SOF>"; + readonly EOF: "<EOF>"; + readonly BANG: "!"; + readonly DOLLAR: "$"; + readonly AMP: "&"; + readonly PAREN_L: "("; + readonly PAREN_R: ")"; + readonly DOT: "."; + readonly SPREAD: "..."; + readonly COLON: ":"; + readonly EQUALS: "="; + readonly AT: "@"; + readonly BRACKET_L: "["; + readonly BRACKET_R: "]"; + readonly BRACE_L: "{"; + readonly PIPE: "|"; + readonly BRACE_R: "}"; + readonly NAME: "Name"; + readonly INT: "Int"; + readonly FLOAT: "Float"; + readonly STRING: "String"; + readonly BLOCK_STRING: "BlockString"; + readonly COMMENT: "Comment"; +}; +/** + * An exported enum describing the different kinds of tokens that the + * lexer emits. + */ +export type TokenKind = (typeof TokenKind)[keyof typeof TokenKind]; +/** + * Contains a range of UTF-8 character offsets and token references that + * identify the region of the source from which the AST derived. + */ +declare class Location$1 { + /** The character offset at which this Node begins. */ + readonly start: number; + /** The character offset at which this Node ends. */ + readonly end: number; + /** The Token at which this Node begins. */ + readonly startToken: Token; + /** The Token at which this Node ends. */ + readonly endToken: Token; + /** The Source document the AST represents. */ + readonly source: Source; + /** + * Creates a Location instance. + * @param startToken - The start token. + * @param endToken - The end token. + * @param source - Source document used to derive error locations. + * @example + * ```ts + * import { Location, Source, Token, TokenKind } from 'graphql/language'; + * + * const source = new Source('{ hello }'); + * const startToken = new Token(TokenKind.BRACE_L, 0, 1, 1, 1); + * const endToken = new Token(TokenKind.BRACE_R, 8, 9, 1, 9); + * const location = new Location(startToken, endToken, source); + * + * location.start; // => 0 + * location.end; // => 9 + * location.source.body; // => '{ hello }' + * ``` + */ + constructor(startToken: Token, endToken: Token, source: Source); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns a JSON representation of this location. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * + * const document = parse('{ hello }'); + * const location = document.loc?.toJSON(); + * + * location; // => { start: 0, end: 9 } + * ``` + */ + toJSON(): { + start: number; + end: number; + }; +} +/** + * Represents a range of characters represented by a lexical token + * within a Source. + */ +export declare class Token { + /** The kind of Token. */ + readonly kind: TokenKind; + /** The character offset at which this Node begins. */ + readonly start: number; + /** The character offset at which this Node ends. */ + readonly end: number; + /** The 1-indexed line number on which this Token appears. */ + readonly line: number; + /** The 1-indexed column number at which this Token begins. */ + readonly column: number; + /** + * For non-punctuation tokens, represents the interpreted value of the token. + * + * Note: is undefined for punctuation tokens, but typed as string for + * convenience in the parser. + */ + readonly value: string; + /** + * Tokens exist as nodes in a double-linked-list amongst all tokens + * including ignored tokens. <SOF> is always the first node and <EOF> + * the last. + */ + readonly prev: Token | null; + /** Next token in the token stream, including ignored tokens. */ + readonly next: Token | null; + /** + * Creates a Token instance. + * @param kind - Token kind produced by lexical analysis. + * @param start - Character offset where this token begins. + * @param end - Character offset where this token ends. + * @param line - One-indexed line number where this token begins. + * @param column - One-indexed column number where this token begins. + * @param value - Interpreted value for non-punctuation tokens. + * @example + * ```ts + * import { Token, TokenKind } from 'graphql/language'; + * + * const token = new Token(TokenKind.NAME, 2, 7, 1, 3, 'hello'); + * + * token.kind; // => TokenKind.NAME + * token.value; // => 'hello' + * token.toJSON(); // => { kind: 'Name', value: 'hello', line: 1, column: 3 } + * ``` + */ + constructor(kind: TokenKind, start: number, end: number, line: number, column: number, value?: string); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns a JSON representation of this token. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { Lexer, Source } from 'graphql/language'; + * + * const lexer = new Lexer(new Source('{ hello }')); + * const token = lexer.advance().toJSON(); + * + * token; // => { kind: '{', value: undefined, line: 1, column: 1 } + * ``` + */ + toJSON(): { + kind: TokenKind; + value?: string; + line: number; + column: number; + }; +} +/** The list of all possible AST node types. */ +export type ASTNode = NameNode | DocumentNode | OperationDefinitionNode | VariableDefinitionNode | VariableNode | SelectionSetNode | FieldNode | ArgumentNode | FragmentArgumentNode | FragmentSpreadNode | InlineFragmentNode | FragmentDefinitionNode | IntValueNode | FloatValueNode | StringValueNode | BooleanValueNode | NullValueNode | EnumValueNode | ListValueNode | ObjectValueNode | ObjectFieldNode | DirectiveNode | NamedTypeNode | ListTypeNode | NonNullTypeNode | SchemaDefinitionNode | OperationTypeDefinitionNode | ScalarTypeDefinitionNode | ObjectTypeDefinitionNode | FieldDefinitionNode | InputValueDefinitionNode | InterfaceTypeDefinitionNode | UnionTypeDefinitionNode | EnumTypeDefinitionNode | EnumValueDefinitionNode | InputObjectTypeDefinitionNode | DirectiveDefinitionNode | SchemaExtensionNode | ScalarTypeExtensionNode | ObjectTypeExtensionNode | InterfaceTypeExtensionNode | UnionTypeExtensionNode | EnumTypeExtensionNode | InputObjectTypeExtensionNode | DirectiveExtensionNode | TypeCoordinateNode | MemberCoordinateNode | ArgumentCoordinateNode | DirectiveCoordinateNode | DirectiveArgumentCoordinateNode; +/** Utility type listing all nodes indexed by their kind. */ +export type ASTKindToNode = { + [NodeT in ASTNode as NodeT["kind"]]: NodeT; +}; +/** An identifier in a GraphQL document. */ +export interface NameNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["NAME"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Parsed value represented by this node. */ + readonly value: string; +} +/** The root AST node for a parsed GraphQL document. */ +export interface DocumentNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["DOCUMENT"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Top-level executable and type-system definitions in this document. */ + readonly definitions: ReadonlyArray<DefinitionNode>; + /** The number of lexical tokens parsed for this document, if token counting was enabled. */ + readonly tokenCount?: number | undefined; +} +/** Any top-level definition that may appear in a GraphQL document. */ +export type DefinitionNode = ExecutableDefinitionNode | TypeSystemDefinitionNode | TypeSystemExtensionNode; +/** Any executable definition that may appear in an operation document. */ +export type ExecutableDefinitionNode = OperationDefinitionNode | FragmentDefinitionNode; +/** A query, mutation, or subscription operation definition. */ +export interface OperationDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["OPERATION_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** The operation selected for execution. */ + readonly operation: OperationTypeNode; + /** Name node identifying this AST node. */ + readonly name?: NameNode | undefined; + /** Variable definitions declared by this operation or fragment. */ + readonly variableDefinitions?: ReadonlyArray<VariableDefinitionNode> | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<DirectiveNode> | undefined; + /** Selections made by this operation, field, or fragment. */ + readonly selectionSet: SelectionSetNode; +} +/** + * A narrowed OperationDefinitionNode for subscription operations. + * Subscription operations go through a distinct execution pipeline + * (source event stream + per-event execution), so narrowing the operation + * type allows functions in that pipeline to accept only valid input. + */ +export interface SubscriptionOperationDefinitionNode extends OperationDefinitionNode { + /** Subscription operation kind for this definition. */ + readonly operation: (typeof OperationTypeNode)["SUBSCRIPTION"]; +} +/** + * The operation types supported by GraphQL executable definitions. + * @category Kinds + */ +export declare const OperationTypeNode: { + readonly QUERY: "query"; + readonly MUTATION: "mutation"; + readonly SUBSCRIPTION: "subscription"; +}; +/** + * The operation types supported by GraphQL executable definitions. + * @category Kinds + */ +export type OperationTypeNode = (typeof OperationTypeNode)[keyof typeof OperationTypeNode]; +/** A variable declaration in an operation or experimental fragment definition. */ +export interface VariableDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["VARIABLE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** The variable being defined or referenced. */ + readonly variable: VariableNode; + /** The GraphQL type reference or runtime type for this element. */ + readonly type: TypeNode; + /** Default value used when no explicit value is supplied. */ + readonly defaultValue?: ConstValueNode | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; +} +/** A variable reference, such as `$id`. */ +export interface VariableNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["VARIABLE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; +} +/** A set of fields and fragments selected from an object, interface, or union. */ +export interface SelectionSetNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + kind: KindTypeMap["SELECTION_SET"]; + /** The source location for this AST node, if location tracking was enabled. */ + loc?: Location$1 | undefined; + /** Fields and fragments contained in this selection set. */ + selections: ReadonlyArray<SelectionNode>; +} +/** Any selection that may appear inside a selection set. */ +export type SelectionNode = FieldNode | FragmentSpreadNode | InlineFragmentNode; +/** A field selected in an executable GraphQL document. */ +export interface FieldNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["FIELD"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The response-key alias for this field, if one was supplied. */ + readonly alias?: NameNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Arguments supplied to this field, directive, or coordinate. */ + readonly arguments?: ReadonlyArray<ArgumentNode> | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<DirectiveNode> | undefined; + /** Selections made by this operation, field, or fragment. */ + readonly selectionSet?: SelectionSetNode | undefined; +} +/** An argument supplied to a field or directive. */ +export interface ArgumentNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["ARGUMENT"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Parsed value represented by this node. */ + readonly value: ValueNode; +} +/** An argument node whose value is guaranteed to be constant. */ +export interface ConstArgumentNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["ARGUMENT"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Parsed value represented by this node. */ + readonly value: ConstValueNode; +} +/** Variable definition declared by a fragment argument. */ +export interface FragmentArgumentNode { + /** AST node kind for a fragment argument. */ + readonly kind: KindTypeMap["FRAGMENT_ARGUMENT"]; + /** Source location for this fragment argument. */ + readonly loc?: Location$1 | undefined; + /** Variable name declared by this fragment argument. */ + readonly name: NameNode; + /** Default value literal for this fragment argument, if provided. */ + readonly value: ValueNode; +} +/** A named fragment spread, such as `...userFields`. */ +export interface FragmentSpreadNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["FRAGMENT_SPREAD"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Argument values supplied to the referenced fragment. */ + readonly arguments?: ReadonlyArray<FragmentArgumentNode> | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<DirectiveNode> | undefined; +} +/** An inline fragment spread with an optional type condition. */ +export interface InlineFragmentNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["INLINE_FRAGMENT"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The type condition that limits where this fragment applies. */ + readonly typeCondition?: NamedTypeNode | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<DirectiveNode> | undefined; + /** Selections made by this operation, field, or fragment. */ + readonly selectionSet: SelectionSetNode; +} +/** A reusable fragment definition declared in an executable document. */ +export interface FragmentDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["FRAGMENT_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Experimental variable definitions declared by this fragment definition. */ + readonly variableDefinitions?: ReadonlyArray<VariableDefinitionNode> | undefined; + /** The type condition that limits where this fragment applies. */ + readonly typeCondition: NamedTypeNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<DirectiveNode> | undefined; + /** Selections made by this operation, field, or fragment. */ + readonly selectionSet: SelectionSetNode; +} +/** Any value literal that may appear in an executable GraphQL document. */ +export type ValueNode = VariableNode | IntValueNode | FloatValueNode | StringValueNode | BooleanValueNode | NullValueNode | EnumValueNode | ListValueNode | ObjectValueNode; +/** Any value literal that is guaranteed not to contain a variable reference. */ +export type ConstValueNode = IntValueNode | FloatValueNode | StringValueNode | BooleanValueNode | NullValueNode | EnumValueNode | ConstListValueNode | ConstObjectValueNode; +/** An integer value literal. */ +export interface IntValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["INT"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Parsed value represented by this node. */ + readonly value: string; +} +/** A floating-point value literal. */ +export interface FloatValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["FLOAT"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Parsed value represented by this node. */ + readonly value: string; +} +/** A string value literal. */ +export interface StringValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["STRING"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Parsed value represented by this node. */ + readonly value: string; + /** Whether this string was parsed from block string syntax. */ + readonly block?: boolean | undefined; +} +/** A boolean value literal. */ +export interface BooleanValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["BOOLEAN"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Parsed value represented by this node. */ + readonly value: boolean; +} +/** A null value literal. */ +export interface NullValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["NULL"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; +} +/** An enum value literal. */ +export interface EnumValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["ENUM"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Parsed value represented by this node. */ + readonly value: string; +} +/** A list value literal. */ +export interface ListValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["LIST"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Values contained in this enum, list, or input-object definition. */ + readonly values: ReadonlyArray<ValueNode>; +} +/** A list value literal whose elements are all constant values. */ +export interface ConstListValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["LIST"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Values contained in this enum, list, or input-object definition. */ + readonly values: ReadonlyArray<ConstValueNode>; +} +/** An input object value literal. */ +export interface ObjectValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["OBJECT"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields: ReadonlyArray<ObjectFieldNode>; +} +/** An input object value literal whose fields are all constant values. */ +export interface ConstObjectValueNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["OBJECT"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields: ReadonlyArray<ConstObjectFieldNode>; +} +/** A field inside an input object value literal. */ +export interface ObjectFieldNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["OBJECT_FIELD"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Parsed value represented by this node. */ + readonly value: ValueNode; +} +/** A field inside a constant input object value literal. */ +export interface ConstObjectFieldNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["OBJECT_FIELD"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Parsed value represented by this node. */ + readonly value: ConstValueNode; +} +/** A directive applied to an executable or type-system location. */ +export interface DirectiveNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["DIRECTIVE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Arguments supplied to this field, directive, or coordinate. */ + readonly arguments?: ReadonlyArray<ArgumentNode> | undefined; +} +/** A directive whose arguments are all constant values. */ +export interface ConstDirectiveNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["DIRECTIVE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Arguments supplied to this field, directive, or coordinate. */ + readonly arguments?: ReadonlyArray<ConstArgumentNode> | undefined; +} +/** Any GraphQL type reference AST node. */ +export type TypeNode = NamedTypeNode | ListTypeNode | NonNullTypeNode; +/** A named type reference. */ +export interface NamedTypeNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["NAMED_TYPE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; +} +/** A list type reference. */ +export interface ListTypeNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["LIST_TYPE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The GraphQL type reference or runtime type for this element. */ + readonly type: TypeNode; +} +/** A non-null type reference. */ +export interface NonNullTypeNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["NON_NULL_TYPE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The GraphQL type reference or runtime type for this element. */ + readonly type: NamedTypeNode | ListTypeNode; +} +/** Any type-system definition that may appear in a schema document. */ +export type TypeSystemDefinitionNode = SchemaDefinitionNode | TypeDefinitionNode | DirectiveDefinitionNode; +/** A schema definition in a type-system document. */ +export interface SchemaDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["SCHEMA_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Root operation types declared by this schema definition or extension. */ + readonly operationTypes: ReadonlyArray<OperationTypeDefinitionNode>; +} +/** A root operation type declaration inside a schema definition or extension. */ +export interface OperationTypeDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["OPERATION_TYPE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The operation selected for execution. */ + readonly operation: OperationTypeNode; + /** The GraphQL type reference or runtime type for this element. */ + readonly type: NamedTypeNode; +} +/** Any named type definition that may appear in a schema document. */ +export type TypeDefinitionNode = ScalarTypeDefinitionNode | ObjectTypeDefinitionNode | InterfaceTypeDefinitionNode | UnionTypeDefinitionNode | EnumTypeDefinitionNode | InputObjectTypeDefinitionNode; +/** A scalar type definition in a type-system document. */ +export interface ScalarTypeDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["SCALAR_TYPE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; +} +/** An object type definition in a type-system document. */ +export interface ObjectTypeDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["OBJECT_TYPE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Interfaces implemented by this object or interface type. */ + readonly interfaces?: ReadonlyArray<NamedTypeNode> | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields?: ReadonlyArray<FieldDefinitionNode> | undefined; +} +/** A field definition declared by an object or interface type. */ +export interface FieldDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["FIELD_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Arguments supplied to this field, directive, or coordinate. */ + readonly arguments?: ReadonlyArray<InputValueDefinitionNode> | undefined; + /** The GraphQL type reference or runtime type for this element. */ + readonly type: TypeNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; +} +/** An argument or input-field definition. */ +export interface InputValueDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["INPUT_VALUE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** The GraphQL type reference or runtime type for this element. */ + readonly type: TypeNode; + /** Default value used when no explicit value is supplied. */ + readonly defaultValue?: ConstValueNode | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; +} +/** An interface type definition in a type-system document. */ +export interface InterfaceTypeDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["INTERFACE_TYPE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Interfaces implemented by this object or interface type. */ + readonly interfaces?: ReadonlyArray<NamedTypeNode> | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields?: ReadonlyArray<FieldDefinitionNode> | undefined; +} +/** A union type definition in a type-system document. */ +export interface UnionTypeDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["UNION_TYPE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Object types that belong to this union type. */ + readonly types?: ReadonlyArray<NamedTypeNode> | undefined; +} +/** An enum type definition in a type-system document. */ +export interface EnumTypeDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["ENUM_TYPE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Values contained in this enum, list, or input-object definition. */ + readonly values?: ReadonlyArray<EnumValueDefinitionNode> | undefined; +} +/** An enum value definition. */ +export interface EnumValueDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["ENUM_VALUE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; +} +/** An input object type definition in a type-system document. */ +export interface InputObjectTypeDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["INPUT_OBJECT_TYPE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields?: ReadonlyArray<InputValueDefinitionNode> | undefined; +} +/** A directive definition in a type-system document. */ +export interface DirectiveDefinitionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["DIRECTIVE_DEFINITION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** The optional GraphQL description associated with this definition. */ + readonly description?: StringValueNode | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Arguments supplied to this field, directive, or coordinate. */ + readonly arguments?: ReadonlyArray<InputValueDefinitionNode> | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Whether this directive may appear more than once at the same location. */ + readonly repeatable: boolean; + /** Locations where this directive may be applied. */ + readonly locations: ReadonlyArray<NameNode>; +} +/** Any type-system extension that may appear in a schema extension document. */ +export type TypeSystemExtensionNode = SchemaExtensionNode | TypeExtensionNode | DirectiveExtensionNode; +/** A schema extension in a type-system document. */ +export interface SchemaExtensionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["SCHEMA_EXTENSION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Root operation types declared by this schema definition or extension. */ + readonly operationTypes?: ReadonlyArray<OperationTypeDefinitionNode> | undefined; +} +/** Any named type extension that may appear in a schema extension document. */ +export type TypeExtensionNode = ScalarTypeExtensionNode | ObjectTypeExtensionNode | InterfaceTypeExtensionNode | UnionTypeExtensionNode | EnumTypeExtensionNode | InputObjectTypeExtensionNode; +/** A scalar type extension. */ +export interface ScalarTypeExtensionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["SCALAR_TYPE_EXTENSION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; +} +/** An object type extension. */ +export interface ObjectTypeExtensionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["OBJECT_TYPE_EXTENSION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Interfaces implemented by this object or interface type. */ + readonly interfaces?: ReadonlyArray<NamedTypeNode> | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields?: ReadonlyArray<FieldDefinitionNode> | undefined; +} +/** An interface type extension. */ +export interface InterfaceTypeExtensionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["INTERFACE_TYPE_EXTENSION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Interfaces implemented by this object or interface type. */ + readonly interfaces?: ReadonlyArray<NamedTypeNode> | undefined; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields?: ReadonlyArray<FieldDefinitionNode> | undefined; +} +/** A union type extension. */ +export interface UnionTypeExtensionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["UNION_TYPE_EXTENSION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Object types that belong to this union type. */ + readonly types?: ReadonlyArray<NamedTypeNode> | undefined; +} +/** An enum type extension. */ +export interface EnumTypeExtensionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["ENUM_TYPE_EXTENSION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Values contained in this enum, list, or input-object definition. */ + readonly values?: ReadonlyArray<EnumValueDefinitionNode> | undefined; +} +/** An input object type extension. */ +export interface InputObjectTypeExtensionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["INPUT_OBJECT_TYPE_EXTENSION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields?: ReadonlyArray<InputValueDefinitionNode> | undefined; +} +/** A directive extension. */ +export interface DirectiveExtensionNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["DIRECTIVE_EXTENSION"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1 | undefined; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** Directives available in this schema or applied to this AST node. */ + readonly directives?: ReadonlyArray<ConstDirectiveNode> | undefined; +} +/** Any AST node representing a GraphQL schema coordinate. */ +export type SchemaCoordinateNode = TypeCoordinateNode | MemberCoordinateNode | ArgumentCoordinateNode | DirectiveCoordinateNode | DirectiveArgumentCoordinateNode; +/** A schema coordinate that refers to a named type. */ +export interface TypeCoordinateNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["TYPE_COORDINATE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1; + /** Name node identifying this AST node. */ + readonly name: NameNode; +} +/** A schema coordinate that refers to a member of a named type. */ +export interface MemberCoordinateNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["MEMBER_COORDINATE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** The member name referenced by this schema coordinate. */ + readonly memberName: NameNode; +} +/** A schema coordinate that refers to a field or directive argument. */ +export interface ArgumentCoordinateNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["ARGUMENT_COORDINATE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** The field name referenced by this schema coordinate. */ + readonly fieldName: NameNode; + /** The argument name referenced by this schema coordinate. */ + readonly argumentName: NameNode; +} +/** A schema coordinate that refers to a directive. */ +export interface DirectiveCoordinateNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["DIRECTIVE_COORDINATE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1; + /** Name node identifying this AST node. */ + readonly name: NameNode; +} +/** A schema coordinate that refers to a directive argument. */ +export interface DirectiveArgumentCoordinateNode { + /** The discriminator identifying the concrete AST or introspection kind. */ + readonly kind: KindTypeMap["DIRECTIVE_ARGUMENT_COORDINATE"]; + /** The source location for this AST node, if location tracking was enabled. */ + readonly loc?: Location$1; + /** Name node identifying this AST node. */ + readonly name: NameNode; + /** The argument name referenced by this schema coordinate. */ + readonly argumentName: NameNode; +} +/** Represents a location in a Source. */ +export interface SourceLocation { + /** One-indexed line number in the source document. */ + readonly line: number; + /** One-indexed column number in the source document. */ + readonly column: number; +} +/** + * Takes a Source and a UTF-8 character offset, and returns the corresponding + * line and column as a SourceLocation. + * @param source - The source document that contains the position. + * @param position - The UTF-8 character offset in the source body. + * @returns The 1-indexed line and column for the given source position. + * @example + * ```ts + * import { Source, getLocation } from 'graphql/language'; + * + * const source = new Source('type Query { hello: String }'); + * const location = getLocation(source, 13); + * + * location; // => { line: 1, column: 14 } + * ``` + */ +export declare function getLocation(source: Source, position: number): SourceLocation; +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLErrorExtensions { + [attributeName: string]: unknown; +} +/** + * Custom formatted extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLFormattedErrorExtensions { + [attributeName: string]: unknown; +} +/** Options used to construct a GraphQLError. */ +export interface GraphQLErrorOptions { + /** AST node or nodes associated with this error. */ + nodes?: ReadonlyArray<ASTNode> | ASTNode | null | undefined; + /** Source document used to derive error locations. */ + source?: Maybe<Source>; + /** Character offsets in the source document associated with this error. */ + positions?: Maybe<ReadonlyArray<number>>; + /** Response path where this error occurred during execution. */ + path?: Maybe<ReadonlyArray<string | number>>; + /** + * Original error that caused this GraphQLError, if one exists. + * Deprecated in favor of `cause` to better align with JavaScript standards. + * @deprecated Prefer `cause` instead. + */ + originalError?: Maybe<Error & { + readonly extensions?: unknown; + }>; + /** Cause of this GraphQLError, if one exists. */ + cause?: unknown; + /** Extension fields to include in the formatted result. */ + extensions?: Maybe<GraphQLErrorExtensions>; +} +/** + * A GraphQLError describes an Error found during the parse, validate, or + * execute phases of performing a GraphQL operation. In addition to a message + * and stack trace, it also includes information about the locations in a + * GraphQL document and/or execution result that correspond to the Error. + */ +export declare class GraphQLError extends Error { + /** + * An array of `{ line, column }` locations within the source GraphQL document + * which correspond to this error. + * + * Errors during validation often contain multiple locations, for example to + * point out two things with the same name. Errors during execution include a + * single location, the field which produced the error. + * + * Enumerable, and appears in the result of JSON.stringify(). + */ + readonly locations: ReadonlyArray<SourceLocation> | undefined; + /** + * An array describing the JSON-path into the execution response which + * corresponds to this error. Only included for errors during execution. + * + * Enumerable, and appears in the result of JSON.stringify(). + */ + readonly path: ReadonlyArray<string | number> | undefined; + /** An array of GraphQL AST Nodes corresponding to this error. */ + readonly nodes: ReadonlyArray<ASTNode> | undefined; + /** + * The source GraphQL document for the first location of this error. + * + * Note that if this Error represents more than one node, the source may not + * represent nodes after the first node. + */ + readonly source: Source | undefined; + /** + * An array of character offsets within the source GraphQL document + * which correspond to this error. + */ + readonly positions: ReadonlyArray<number> | undefined; + /** + * Original error that caused this GraphQLError, if one exists. + * Deprecated in favor of `cause` to better align with JavaScript standards. + * @deprecated Use `cause` instead. + */ + readonly originalError: Error | undefined; + /** Extension fields to add to the formatted error. */ + readonly extensions: GraphQLErrorExtensions; + /** + * Creates a GraphQLError instance. + * @param message - Human-readable error message. + * @param options - Error metadata such as source locations, response path, cause, original error, and extensions. + * @example + * ```ts + * // Create an error from AST nodes and response metadata. + * import { parse } from 'graphql/language'; + * import { GraphQLError } from 'graphql/error'; + * + * const document = parse('{ greeting }'); + * const fieldNode = document.definitions[0].selectionSet.selections[0]; + * const error = new GraphQLError('Cannot query this field.', { + * nodes: fieldNode, + * path: ['greeting'], + * extensions: { code: 'FORBIDDEN' }, + * }); + * + * error.message; // => 'Cannot query this field.' + * error.locations; // => [{ line: 1, column: 3 }] + * error.path; // => ['greeting'] + * error.extensions; // => { code: 'FORBIDDEN' } + * ``` + * @example + * ```ts + * // This variant derives locations from source positions and preserves the cause. + * import { Source } from 'graphql/language'; + * import { GraphQLError } from 'graphql/error'; + * + * const source = new Source('{ greeting }'); + * const cause = new Error('Database unavailable.'); + * const error = new GraphQLError('Resolver failed.', { + * source, + * positions: [2], + * path: ['greeting'], + * cause, + * }); + * + * error.locations; // => [{ line: 1, column: 3 }] + * error.path; // => ['greeting'] + * error.cause; // => cause + * ``` + */ + constructor(message: string, options?: GraphQLErrorOptions); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns this error as a human-readable message with source locations. + * @returns The formatted error string. + * @example + * ```ts + * import { Source } from 'graphql/language'; + * import { GraphQLError } from 'graphql/error'; + * + * const error = new GraphQLError('Cannot query field "name".', { + * source: new Source('{ name }'), + * positions: [2], + * }); + * + * error.toString(); // => 'Cannot query field "name".\n\nGraphQL request:1:3\n1 | { name }\n | ^' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { GraphQLError } from 'graphql/error'; + * + * const error = new GraphQLError('Resolver failed.', { + * path: ['viewer', 'name'], + * extensions: { code: 'INTERNAL' }, + * }); + * + * error.toJSON(); // => { message: 'Resolver failed.', path: ['viewer', 'name'], extensions: { code: 'INTERNAL' } } + * ``` + */ + toJSON(): GraphQLFormattedError; +} +/** See: https://spec.graphql.org/draft/#sec-Errors */ +export interface GraphQLFormattedError { + /** + * A short, human-readable summary of the problem that **SHOULD NOT** change + * from occurrence to occurrence of the problem, except for purposes of + * localization. + */ + readonly message: string; + /** + * If an error can be associated to a particular point in the requested + * GraphQL document, it should contain a list of locations. + */ + readonly locations?: ReadonlyArray<SourceLocation>; + /** + * If an error can be associated to a particular field in the GraphQL result, + * it _must_ contain an entry with the key `path` that details the path of + * the response field which experienced the error. This allows clients to + * identify whether a null result is intentional or caused by a runtime error. + */ + readonly path?: ReadonlyArray<string | number>; + /** + * Reserved for implementors to extend the protocol however they see fit, + * and hence there are no additional restrictions on its contents. + */ + readonly extensions?: GraphQLFormattedErrorExtensions; +} +/** Represents a linked response path from a field back to the root response. */ +interface Path { + /** The previous segment in the linked response path, or undefined at the root. */ + readonly prev: Path | undefined; + /** The field name or list index for this response path segment. */ + readonly key: string | number; + /** The runtime object type name associated with this path segment, if known. */ + readonly typename: string | undefined; +} +/** + * Given a Path, return an Array of the path keys. + * @param path - The linked response path to flatten. + * @returns An array of response path keys from root to leaf. + * @example + * ```ts + * import { pathToArray } from 'graphql/jsutils/Path'; + * + * const path = { + * prev: { + * prev: { + * prev: undefined, + * key: 'viewer', + * typename: 'Query', + * }, + * key: 'friends', + * typename: 'User', + * }, + * key: 0, + * typename: undefined, + * }; + * + * pathToArray(path); // => ['viewer', 'friends', 0] + * pathToArray(undefined); // => [] + * ``` + */ +declare function pathToArray(path: Maybe<Readonly<Path>>): Array<string | number>; +type PromiseOrValue<T> = Promise<T> | T; +/** @category Kinds */ +/** The set of allowed directive location values. */ +export declare const DirectiveLocation: { + /** Directive location for query operations. */ + readonly QUERY: "QUERY"; + /** Directive location for mutation operations. */ + readonly MUTATION: "MUTATION"; + /** Directive location for subscription operations. */ + readonly SUBSCRIPTION: "SUBSCRIPTION"; + /** Directive location for field selections. */ + readonly FIELD: "FIELD"; + /** Directive location for fragment definitions. */ + readonly FRAGMENT_DEFINITION: "FRAGMENT_DEFINITION"; + /** Directive location for fragment spreads. */ + readonly FRAGMENT_SPREAD: "FRAGMENT_SPREAD"; + /** Directive location for inline fragments. */ + readonly INLINE_FRAGMENT: "INLINE_FRAGMENT"; + /** Directive location for variable definitions. */ + readonly VARIABLE_DEFINITION: "VARIABLE_DEFINITION"; + /** Directive location for fragment variable definitions. */ + readonly FRAGMENT_VARIABLE_DEFINITION: "FRAGMENT_VARIABLE_DEFINITION"; + /** Directive location for schema definitions and extensions. */ + readonly SCHEMA: "SCHEMA"; + /** Directive location for scalar type definitions and extensions. */ + readonly SCALAR: "SCALAR"; + /** Directive location for object type definitions and extensions. */ + readonly OBJECT: "OBJECT"; + /** Directive location for field definitions. */ + readonly FIELD_DEFINITION: "FIELD_DEFINITION"; + /** Directive location for argument definitions. */ + readonly ARGUMENT_DEFINITION: "ARGUMENT_DEFINITION"; + /** Directive location for interface type definitions and extensions. */ + readonly INTERFACE: "INTERFACE"; + /** Directive location for union type definitions and extensions. */ + readonly UNION: "UNION"; + /** Directive location for enum type definitions and extensions. */ + readonly ENUM: "ENUM"; + /** Directive location for enum value definitions. */ + readonly ENUM_VALUE: "ENUM_VALUE"; + /** Directive location for input object type definitions and extensions. */ + readonly INPUT_OBJECT: "INPUT_OBJECT"; + /** Directive location for input object field definitions. */ + readonly INPUT_FIELD_DEFINITION: "INPUT_FIELD_DEFINITION"; + /** Directive location for directive definitions and extensions. */ + readonly DIRECTIVE_DEFINITION: "DIRECTIVE_DEFINITION"; +}; +/** The set of allowed directive location values. */ +export type DirectiveLocation = (typeof DirectiveLocation)[keyof typeof DirectiveLocation]; +/** + * Test if the given value is a GraphQL directive. + * @param directive - Value to inspect. + * @returns True when the value is a GraphQLDirective. + * @example + * ```ts + * import { DirectiveLocation } from 'graphql/language'; + * import { GraphQLDirective, GraphQLString, isDirective } from 'graphql/type'; + * + * const upper = new GraphQLDirective({ + * name: 'upper', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * }); + * + * isDirective(upper); // => true + * isDirective(GraphQLString); // => false + * ``` + */ +export declare function isDirective(directive: unknown): directive is GraphQLDirective; +/** + * Returns the value as a GraphQLDirective, or throws if it is not a directive. + * @param directive - Value to inspect. + * @returns The value typed as a GraphQLDirective. + * @example + * ```ts + * import { DirectiveLocation } from 'graphql/language'; + * import { assertDirective, GraphQLDirective, GraphQLString } from 'graphql/type'; + * + * const upper = new GraphQLDirective({ + * name: 'upper', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * }); + * + * assertDirective(upper); // => upper + * assertDirective(GraphQLString); // throws an error + * ``` + */ +export declare function assertDirective(directive: unknown): GraphQLDirective; +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLDirectiveExtensions { + [attributeName: string | symbol]: unknown; +} +/** + * Directives are used by the GraphQL runtime as a way of modifying execution + * behavior. Type system creators will usually not create these directly. + */ +export declare class GraphQLDirective implements GraphQLSchemaElement { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** Locations where this directive may be applied. */ + locations: ReadonlyArray<DirectiveLocation>; + /** Arguments accepted by this field or directive. */ + args: ReadonlyArray<GraphQLArgument>; + /** Whether this directive may appear more than once at the same location. */ + isRepeatable: boolean; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLDirectiveExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<DirectiveDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes: ReadonlyArray<DirectiveExtensionNode>; + /** + * Creates a GraphQLDirective instance. + * @param config - Configuration describing this object. + * @example + * ```ts + * import { DirectiveLocation, parse } from 'graphql/language'; + * import { + * GraphQLBoolean, + * GraphQLDirective, + * GraphQLInt, + * GraphQLNonNull, + * } from 'graphql/type'; + * + * const document = parse(` + * directive @cacheControl(maxAge: Int) repeatable on FIELD_DEFINITION + * extend directive @cacheControl(maxAge: Int) on FIELD_DEFINITION + * `); + * const definition = document.definitions[0]; + * + * const cacheControl = new GraphQLDirective({ + * name: 'cacheControl', + * description: 'Controls HTTP cache hints for a field.', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * args: { + * inheritMaxAge: { + * description: 'Inherit the parent cache hint.', + * type: new GraphQLNonNull(GraphQLBoolean), + * default: { value: false }, + * deprecationReason: 'Use maxAge instead.', + * extensions: { scope: 'cache' }, + * }, + * maxAge: { + * type: GraphQLInt, + * astNode: definition.arguments[0], + * }, + * }, + * isRepeatable: true, + * deprecationReason: 'Use @cache instead.', + * extensions: { scope: 'cache' }, + * astNode: definition, + * extensionASTNodes: [document.definitions[1]], + * }); + * + * cacheControl.name; // => 'cacheControl' + * cacheControl.description; // => 'Controls HTTP cache hints for a field.' + * cacheControl.args[0].name; // => 'inheritMaxAge' + * cacheControl.args[0].default.value; // => false + * cacheControl.isRepeatable; // => true + * cacheControl.extensions; // => { scope: 'cache' } + * ``` + */ + constructor(config: Readonly<GraphQLDirectiveConfig>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns a normalized configuration object for this object. + * @returns A configuration object that can be used to recreate this object. + * @example + * ```ts + * import { DirectiveLocation } from 'graphql/language'; + * import { GraphQLDirective, GraphQLString } from 'graphql/type'; + * + * const tag = new GraphQLDirective({ + * name: 'tag', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * args: { + * name: { type: GraphQLString }, + * }, + * }); + * + * const config = tag.toConfig(); + * const tagCopy = new GraphQLDirective(config); + * + * config.args.name.type; // => GraphQLString + * tagCopy.args[0].name; // => 'name' + * ``` + */ + toConfig(): GraphQLDirectiveNormalizedConfig; + /** + * Returns the schema coordinate identifying this directive. + * @returns The directive schema coordinate. + * @example + * ```ts + * import { DirectiveLocation } from 'graphql/language'; + * import { GraphQLDirective } from 'graphql/type'; + * + * const tag = new GraphQLDirective({ + * name: 'tag', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * }); + * + * tag.toString(); // => '@tag' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { DirectiveLocation } from 'graphql/language'; + * import { GraphQLDirective } from 'graphql/type'; + * + * const tag = new GraphQLDirective({ + * name: 'tag', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * }); + * + * tag.toJSON(); // => '@tag' + * JSON.stringify({ directive: tag }); // => '{"directive":"@tag"}' + * ``` + */ + toJSON(): string; +} +/** Configuration used to construct a GraphQLDirective. */ +export interface GraphQLDirectiveConfig { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** Locations where this directive may be applied. */ + locations: ReadonlyArray<DirectiveLocation>; + /** Arguments accepted by this field or directive. */ + args?: Maybe<ObjMap<GraphQLArgumentConfig>>; + /** Whether this directive may appear more than once at the same location. */ + isRepeatable?: Maybe<boolean>; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason?: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLDirectiveExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<DirectiveDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes?: Maybe<ReadonlyArray<DirectiveExtensionNode>>; +} +interface GraphQLDirectiveNormalizedConfig extends GraphQLDirectiveConfig { + args: GraphQLFieldNormalizedConfigArgumentMap; + isRepeatable: boolean; + extensions: Readonly<GraphQLDirectiveExtensions>; + extensionASTNodes: ReadonlyArray<DirectiveExtensionNode>; +} +/** Used to conditionally include fields or fragments. */ +export declare const GraphQLIncludeDirective: GraphQLDirective; +/** Used to conditionally skip (exclude) fields or fragments. */ +export declare const GraphQLSkipDirective: GraphQLDirective; +/** + * Experimental directive used to conditionally defer fragments. + * + * This directive is exported for schemas that explicitly opt in to incremental + * delivery. It is not included in `specifiedDirectives`. + */ +export declare const GraphQLDeferDirective: GraphQLDirective; +/** + * Experimental directive used to conditionally stream list fields. + * + * This directive is exported for schemas that explicitly opt in to incremental + * delivery. It is not included in `specifiedDirectives`. + */ +export declare const GraphQLStreamDirective: GraphQLDirective; +/** Constant string used for default reason for a deprecation. */ +export declare const DEFAULT_DEPRECATION_REASON = "No longer supported"; +/** + * Used to declare element of a GraphQL schema as deprecated. + * + * The `reason` argument is non-null and defaults to + * `DEFAULT_DEPRECATION_REASON`. + */ +export declare const GraphQLDeprecatedDirective: GraphQLDirective; +/** Used to provide a URL for specifying the behavior of custom scalar definitions. */ +export declare const GraphQLSpecifiedByDirective: GraphQLDirective; +/** Used to indicate an Input Object is a OneOf Input Object. */ +export declare const GraphQLOneOfDirective: GraphQLDirective; +/** + * Full list of stable directives specified by GraphQL.js. + * + * Experimental `@defer` and `@stream` are exported separately and are not + * included in this list. + */ +export declare const specifiedDirectives: ReadonlyArray<GraphQLDirective>; +/** + * Returns true when the directive is one of the directives specified by GraphQL. + * @param directive - Directive to inspect. + * @returns True when the directive is specified by GraphQL. + * @example + * ```ts + * import { + * GraphQLDirective, + * GraphQLIncludeDirective, + * isSpecifiedDirective, + * } from 'graphql/type'; + * import { DirectiveLocation } from 'graphql/language'; + * + * const customDirective = new GraphQLDirective({ + * name: 'auth', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * }); + * + * isSpecifiedDirective(GraphQLIncludeDirective); // => true + * isSpecifiedDirective(customDirective); // => false + * ``` + */ +export declare function isSpecifiedDirective(directive: GraphQLDirective): boolean; +/** + * Maximum possible Int value as per GraphQL Spec (32-bit signed integer). + * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe up-to 2^53 - 1 + */ +export declare const GRAPHQL_MAX_INT = 2147483647; +/** + * Minimum possible Int value as per GraphQL Spec (32-bit signed integer). + * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe starting at -(2^53 - 1) + */ +export declare const GRAPHQL_MIN_INT = -2147483648; +/** The built-in `Int` scalar type. */ +export declare const GraphQLInt: GraphQLScalarType<number>; +/** The built-in `Float` scalar type. */ +export declare const GraphQLFloat: GraphQLScalarType<number>; +/** The built-in `String` scalar type. */ +export declare const GraphQLString: GraphQLScalarType<string>; +/** The built-in `Boolean` scalar type. */ +export declare const GraphQLBoolean: GraphQLScalarType<boolean>; +/** The built-in `ID` scalar type. */ +export declare const GraphQLID: GraphQLScalarType<string>; +/** All built-in scalar types defined by the GraphQL specification. */ +export declare const specifiedScalarTypes: ReadonlyArray<GraphQLScalarType>; +/** + * Returns true when the scalar type is one of the scalars specified by GraphQL. + * @param type - The GraphQL type to inspect. + * @returns True when the scalar type is one of the scalars specified by GraphQL. + * @example + * ```ts + * import { + * GraphQLScalarType, + * GraphQLString, + * isSpecifiedScalarType, + * } from 'graphql/type'; + * + * const DateTime = new GraphQLScalarType({ + * name: 'DateTime', + * }); + * + * isSpecifiedScalarType(GraphQLString); // => true + * isSpecifiedScalarType(DateTime); // => false + * ``` + */ +export declare function isSpecifiedScalarType(type: GraphQLNamedType): boolean; +/** The introspection type describing a GraphQL schema. */ +export declare const __Schema: GraphQLObjectType; +/** The introspection type describing a GraphQL directive. */ +export declare const __Directive: GraphQLObjectType; +/** The introspection enum describing directive locations. */ +export declare const __DirectiveLocation: GraphQLEnumType; +/** The introspection type describing GraphQL types. */ +export declare const __Type: GraphQLObjectType; +/** The introspection type describing object and interface fields. */ +export declare const __Field: GraphQLObjectType; +/** The introspection type describing arguments and input fields. */ +export declare const __InputValue: GraphQLObjectType; +/** The introspection type describing enum values. */ +export declare const __EnumValue: GraphQLObjectType; +/** + * The introspection enum describing the different kinds of GraphQL types. + * @category Introspection + */ +export declare const TypeKind: { + readonly SCALAR: "SCALAR"; + readonly OBJECT: "OBJECT"; + readonly INTERFACE: "INTERFACE"; + readonly UNION: "UNION"; + readonly ENUM: "ENUM"; + readonly INPUT_OBJECT: "INPUT_OBJECT"; + readonly LIST: "LIST"; + readonly NON_NULL: "NON_NULL"; +}; +/** + * The introspection enum describing the different kinds of GraphQL types. + * @category Introspection + */ +export type TypeKind = (typeof TypeKind)[keyof typeof TypeKind]; +/** The introspection enum describing GraphQL type kinds. */ +export declare const __TypeKind: GraphQLEnumType; +/** + * Note that these are GraphQLField and not GraphQLFieldConfig, + * so the format for args is different. + */ +export declare const SchemaMetaFieldDef: GraphQLField<unknown, unknown>; +/** The `__type` meta field definition used by introspection. */ +export declare const TypeMetaFieldDef: GraphQLField<unknown, unknown>; +/** The `__typename` meta field definition used by execution and introspection. */ +export declare const TypeNameMetaFieldDef: GraphQLField<unknown, unknown>; +/** All introspection types defined by the GraphQL specification. */ +export declare const introspectionTypes: ReadonlyArray<GraphQLNamedType>; +/** + * Returns true when the type is one of the built-in introspection types. + * @param type - The GraphQL type to inspect. + * @returns True when the type is one of the built-in introspection types. + * @example + * ```ts + * import { GraphQLString, isIntrospectionType, __Type } from 'graphql/type'; + * + * isIntrospectionType(__Type); // => true + * isIntrospectionType(GraphQLString); // => false + * ``` + */ +export declare function isIntrospectionType(type: GraphQLNamedType): boolean; +/** + * Implements the "Type Validation" sub-sections of the specification's + * "Type System" section. + * + * Validation runs synchronously, returning an array of encountered errors, or + * an empty array if no errors were encountered and the Schema is valid. + * @param schema - GraphQL schema to use. + * @returns Schema validation errors, or an empty array when the schema is valid. + * @example + * ```ts + * import { validateSchema } from 'graphql/type'; + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * const errors = validateSchema(schema); + * + * errors; // => [] + * ``` + */ +export declare function validateSchema(schema: GraphQLSchema): ReadonlyArray<GraphQLError>; +/** + * Utility function which asserts a schema is valid by throwing an error if + * it is invalid. + * @param schema - GraphQL schema to use. + * @example + * ```ts + * import { assertValidSchema } from 'graphql/type'; + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * assertValidSchema(schema); // does not throw + * ``` + */ +export declare function assertValidSchema(schema: GraphQLSchema): void; +/** @category Names */ +/** + * Upholds the spec rules about naming. + * @param name - The GraphQL name to validate. + * @returns The validated GraphQL name. + * @example + * ```ts + * import { assertName } from 'graphql/type'; + * + * assertName('User'); // => 'User' + * assertName('123User'); // throws an error + * ``` + */ +export declare function assertName(name: string): string; +/** + * Upholds the spec rules about naming enum values. + * @param name - The GraphQL name to validate. + * @returns The validated GraphQL name. + * @example + * ```ts + * import { assertEnumValueName } from 'graphql/type'; + * + * assertEnumValueName('ACTIVE'); // => 'ACTIVE' + * assertEnumValueName('true'); // throws an error + * ``` + */ +export declare function assertEnumValueName(name: string): string; +interface GraphQLVariableSignature { + name: string; + type: GraphQLInputType; + defaultValue?: never; + default: { + literal: ConstValueNode; + } | undefined; +} +interface FragmentVariableValues { + readonly sources: ReadOnlyObjMap<FragmentVariableValueSource>; + readonly coerced: ReadOnlyObjMap<unknown>; +} +interface FragmentVariableValueSource { + readonly signature: GraphQLVariableSignature; + readonly value?: ValueNode; + readonly fragmentVariableValues?: FragmentVariableValues; +} +interface FragmentDetails { + definition: FragmentDefinitionNode; + variableSignatures?: ObjMap<GraphQLVariableSignature> | undefined; +} +/** + * Coerced variable values prepared for execution. + * + * The `coerced` map contains runtime values keyed by variable name. The + * `sources` map records whether each value came from request input, an operation + * default, or a fragment-variable default so utilities can preserve defaults + * when replacing variables in literals. + */ +export interface VariableValues { + /** Source metadata for each variable value keyed by variable name. */ + readonly sources: ReadOnlyObjMap<VariableValueSource>; + /** Coerced runtime variable values keyed by variable name. */ + readonly coerced: ReadOnlyObjMap<unknown>; +} +interface VariableValueSource { + readonly signature: GraphQLVariableSignature; + readonly value?: unknown; +} +type VariableValuesOrErrors = { + variableValues: VariableValues; + errors?: never; +} | { + errors: ReadonlyArray<GraphQLError>; + variableValues?: never; +}; +/** + * Prepares an object map of variableValues of the correct type based on the + * provided variable definitions and arbitrary input. If the input cannot be + * parsed to match the variable definitions, GraphQLError values are returned. + * + * Note: Returned maps use null prototypes to avoid collisions with + * Object prototype properties. + * @param schema - GraphQL schema to use. + * @param varDefNodes - The variable definition AST nodes to coerce. + * @param inputs - The runtime variable values keyed by variable name. + * @param options - Optional configuration for this operation. + * @param [options.maxErrors] - Maximum number of coercion errors to report. + * @param [options.hideSuggestions] - Whether suggestion text should be omitted + * from errors. + * @returns Coerced variable values with source metadata, or request errors. + * @example + * ```ts + * // Coerce provided variables and apply operation defaults. + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { getVariableValues } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * reviews(stars: Int!, limit: Int = 10): [String] + * } + * `); + * const document = parse(` + * query ($stars: Int!, $limit: Int = 10) { + * reviews(stars: $stars, limit: $limit) + * } + * `); + * const operation = document.definitions[0]; + * + * const result = getVariableValues(schema, operation.variableDefinitions, { + * stars: '5', + * }); + * + * assert('variableValues' in result); + * + * result.variableValues.coerced; // => { stars: 5, limit: 10 } + * ``` + * @example + * ```ts + * // This variant uses maxErrors to cap reported coercion errors. + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { getVariableValues } from 'graphql/execution'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Query { + * review(input: ReviewInput!): String + * } + * `); + * const document = parse(` + * query ($first: ReviewInput!, $second: ReviewInput!) { + * first: review(input: $first) + * second: review(input: $second) + * } + * `); + * const operation = document.definitions[0]; + * + * const result = getVariableValues( + * schema, + * operation.variableDefinitions, + * { first: { stars: 'bad' }, second: { stars: 'also bad' } }, + * { maxErrors: 1 }, + * ); + * + * assert('errors' in result); + * + * result.errors.length; // => 2 + * result.errors[1].message; // matches /error limit reached/ + * ``` + */ +export declare function getVariableValues(schema: GraphQLSchema, varDefNodes: ReadonlyArray<VariableDefinitionNode>, inputs: { + readonly [variable: string]: unknown; +}, options?: { + maxErrors?: number; + hideSuggestions?: boolean; +}): VariableValuesOrErrors; +/** + * Prepares an object map of argument values given a list of argument + * definitions and list of argument AST nodes. + * + * Note: Returned value uses a null prototype to avoid collisions with + * JavaScript's own property names. + * @param def - Field or directive definition that declares the arguments. + * @param node - Field or directive AST node supplying argument literals. + * @param variableValues - Operation variable values returned by getVariableValues. + * @param fragmentVariableValues - Fragment variable values for the current fragment scope. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @returns A map of coerced argument values. + * @example + * ```ts + * // Read literal argument values and defaults. + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { getArgumentValues } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * reviews(stars: Int!, limit: Int = 10): [String] + * } + * `); + * const fieldDef = schema.getQueryType().getFields().reviews; + * const document = parse('{ reviews(stars: 5) }'); + * const fieldNode = document.definitions[0].selectionSet.selections[0]; + * + * getArgumentValues(fieldDef, fieldNode); // => { stars: 5, limit: 10 } + * ``` + * @example + * ```ts + * // This variant resolves argument values from operation variables. + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { getArgumentValues, getVariableValues } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * reviews(stars: Int!): [String] + * } + * `); + * const fieldDef = schema.getQueryType().getFields().reviews; + * const document = parse('query ($stars: Int!) { reviews(stars: $stars) }'); + * const operation = document.definitions[0]; + * const fieldNode = document.definitions[0].selectionSet.selections[0]; + * const variables = getVariableValues(schema, operation.variableDefinitions, { + * stars: '5', + * }); + * + * assert('variableValues' in variables); + * + * getArgumentValues(fieldDef, fieldNode, variables.variableValues); // => { stars: 5 } + * getArgumentValues(fieldDef, fieldNode); // throws an error + * ``` + */ +export declare function getArgumentValues(def: GraphQLField<unknown, unknown> | GraphQLDirective, node: FieldNode | DirectiveNode, variableValues?: Maybe<VariableValues>, fragmentVariableValues?: Maybe<FragmentVariableValues>, hideSuggestions?: Maybe<boolean>): ObjMap<unknown>; +/** + * Prepares an object map of argument values given a directive definition + * and a AST node which may contain directives. Optionally also accepts a map + * of variable values. + * + * If the directive does not exist on the node, returns undefined. + * + * Note: Returned value uses a null prototype to avoid collisions with + * JavaScript's own property names. + * @param directiveDef - Directive definition to read argument definitions from. + * @param node - AST node that may contain directives. + * @param node.directives - The directives on the AST node. + * @param variableValues - Operation variable values returned by getVariableValues. + * @param fragmentVariableValues - Fragment variable values for the current fragment scope. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @returns A map of coerced directive argument values, or undefined when absent. + * @example + * ```ts + * // Read literal directive arguments from a node. + * import { parse } from 'graphql/language'; + * import { GraphQLSkipDirective } from 'graphql/type'; + * import { getDirectiveValues } from 'graphql/execution'; + * + * const document = parse('{ name @skip(if: true) }'); + * const fieldNode = document.definitions[0].selectionSet.selections[0]; + * + * getDirectiveValues(GraphQLSkipDirective, fieldNode); // => { if: true } + * ``` + * @example + * ```ts + * // This variant resolves directive arguments from variables and handles absent directives. + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { GraphQLIncludeDirective } from 'graphql/type'; + * import { buildSchema } from 'graphql/utilities'; + * import { getDirectiveValues, getVariableValues } from 'graphql/execution'; + * + * const schema = buildSchema('type Query { name: String }'); + * const document = parse( + * 'query ($includeName: Boolean!) { name @include(if: $includeName) }', + * ); + * const operation = document.definitions[0]; + * const fieldNode = document.definitions[0].selectionSet.selections[0]; + * const variables = getVariableValues(schema, operation.variableDefinitions, { + * includeName: false, + * }); + * + * assert('variableValues' in variables); + * + * getDirectiveValues( + * GraphQLIncludeDirective, + * fieldNode, + * variables.variableValues, + * ); // => { if: false } + * getDirectiveValues(GraphQLIncludeDirective, { directives: [] }); // => undefined + * ``` + */ +export declare function getDirectiveValues(directiveDef: GraphQLDirective, node: { + readonly directives?: ReadonlyArray<DirectiveNode> | undefined; +}, variableValues?: Maybe<VariableValues>, fragmentVariableValues?: Maybe<FragmentVariableValues>, hideSuggestions?: Maybe<boolean>): undefined | ObjMap<unknown>; +/** These are all of the possible kinds of types. */ +export type GraphQLType = GraphQLNamedType | GraphQLWrappingType; +/** + * Returns true when the value is any GraphQL type. + * @param type - The GraphQL type to inspect. + * @returns True when the value is any GraphQL type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { GraphQLList, GraphQLString, isType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * isType(GraphQLString); // => true + * isType(new GraphQLList(GraphQLString)); // => true + * isType(schema.getType('Query')); // => true + * isType('String'); // => false + * ``` + */ +export declare function isType(type: unknown): type is GraphQLType; +/** + * Returns the value as a GraphQL type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQL type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const queryType = assertType(schema.getType('Query')); + * + * queryType.toString(); // => 'Query' + * assertType('Query'); // throws an error + * ``` + */ +export declare function assertType(type: unknown): GraphQLType; +/** + * There are predicates for each kind of GraphQL type. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQLScalarType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isScalarType } from 'graphql/type'; + * + * const schema = buildSchema(` + * scalar DateTime + * + * type Query { + * createdAt: DateTime + * } + * `); + * + * isScalarType(schema.getType('DateTime')); // => true + * isScalarType(schema.getType('Query')); // => false + * ``` + */ +export declare function isScalarType(type: unknown): type is GraphQLScalarType; +/** + * Returns the value as a GraphQLScalarType, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQLScalarType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertScalarType } from 'graphql/type'; + * + * const schema = buildSchema(` + * scalar DateTime + * + * type Query { + * createdAt: DateTime + * } + * `); + * + * const dateTimeType = assertScalarType(schema.getType('DateTime')); + * + * dateTimeType.name; // => 'DateTime' + * assertScalarType(schema.getType('Query')); // throws an error + * ``` + */ +export declare function assertScalarType(type: unknown): GraphQLScalarType; +/** + * Returns true when the value is a GraphQLObjectType. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQLObjectType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type User { + * name: String + * } + * + * type Query { + * user: User + * } + * `); + * + * isObjectType(schema.getType('User')); // => true + * isObjectType(schema.getType('ReviewInput')); // => false + * ``` + */ +export declare function isObjectType(type: unknown): type is GraphQLObjectType; +/** + * Returns the value as a GraphQLObjectType, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQLObjectType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type User { + * name: String + * } + * + * type Query { + * user: User + * } + * `); + * + * const userType = assertObjectType(schema.getType('User')); + * + * Object.keys(userType.getFields()); // => ['name'] + * assertObjectType(schema.getType('ReviewInput')); // throws an error + * ``` + */ +export declare function assertObjectType(type: unknown): GraphQLObjectType; +/** + * Returns true when the value is a resolved GraphQL field definition. + * @param field - Value to inspect. + * @returns True when the value is a GraphQLField. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isField } from 'graphql/type'; + * + * const schema = buildSchema('type Query { greeting: String }'); + * const field = schema.getQueryType().getFields().greeting; + * + * isField(field); // => true + * isField(schema.getQueryType()); // => false + * ``` + */ +export declare function isField(field: unknown): field is GraphQLField; +/** + * Returns the value as a GraphQLField, or throws if it is not one. + * @param field - Value to inspect. + * @returns The value typed as a GraphQLField. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertField } from 'graphql/type'; + * + * const schema = buildSchema('type Query { greeting: String }'); + * const field = assertField(schema.getQueryType().getFields().greeting); + * + * field.name; // => 'greeting' + * assertField(schema.getQueryType()); // throws an error + * ``` + */ +export declare function assertField(field: unknown): GraphQLField; +/** + * Returns true when the value is a resolved GraphQL argument definition. + * @param arg - Value to inspect. + * @returns True when the value is a GraphQLArgument. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isArgument } from 'graphql/type'; + * + * const schema = buildSchema('type Query { greeting(name: String): String }'); + * const arg = schema.getQueryType().getFields().greeting.args[0]; + * + * isArgument(arg); // => true + * isArgument(schema.getQueryType()); // => false + * ``` + */ +export declare function isArgument(arg: unknown): arg is GraphQLArgument; +/** + * Returns the value as a GraphQLArgument, or throws if it is not one. + * @param arg - Value to inspect. + * @returns The value typed as a GraphQLArgument. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertArgument } from 'graphql/type'; + * + * const schema = buildSchema('type Query { greeting(name: String): String }'); + * const arg = assertArgument(schema.getQueryType().getFields().greeting.args[0]); + * + * arg.name; // => 'name' + * assertArgument(schema.getQueryType()); // throws an error + * ``` + */ +export declare function assertArgument(arg: unknown): GraphQLArgument; +/** + * Returns true when the value is a GraphQLInterfaceType. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQLInterfaceType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isInterfaceType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Query { + * node: Node + * } + * `); + * + * isInterfaceType(schema.getType('Node')); // => true + * isInterfaceType(schema.getType('User')); // => false + * ``` + */ +export declare function isInterfaceType(type: unknown): type is GraphQLInterfaceType; +/** + * Returns the value as a GraphQLInterfaceType, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQLInterfaceType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInterfaceType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Query { + * node: Node + * } + * `); + * + * const nodeType = assertInterfaceType(schema.getType('Node')); + * + * nodeType.name; // => 'Node' + * assertInterfaceType(schema.getType('User')); // throws an error + * ``` + */ +export declare function assertInterfaceType(type: unknown): GraphQLInterfaceType; +/** + * Returns true when the value is a GraphQLUnionType. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQLUnionType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isUnionType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Photo { + * url: String! + * } + * + * type Video { + * url: String! + * } + * + * union Media = Photo | Video + * + * type Query { + * media: [Media] + * } + * `); + * + * isUnionType(schema.getType('Media')); // => true + * isUnionType(schema.getType('Photo')); // => false + * ``` + */ +export declare function isUnionType(type: unknown): type is GraphQLUnionType; +/** + * Returns the value as a GraphQLUnionType, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQLUnionType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertUnionType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Photo { + * url: String! + * } + * + * type Video { + * url: String! + * } + * + * union Media = Photo | Video + * + * type Query { + * media: [Media] + * } + * `); + * + * const mediaType = assertUnionType(schema.getType('Media')); + * + * mediaType.getTypes().map((type) => type.name); // => ['Photo', 'Video'] + * assertUnionType(schema.getType('Photo')); // throws an error + * ``` + */ +export declare function assertUnionType(type: unknown): GraphQLUnionType; +/** + * Returns true when the value is a GraphQLEnumType. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQLEnumType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isEnumType } from 'graphql/type'; + * + * const schema = buildSchema(` + * enum Episode { + * NEW_HOPE + * EMPIRE + * } + * + * type Query { + * favoriteEpisode: Episode + * } + * `); + * + * isEnumType(schema.getType('Episode')); // => true + * isEnumType(schema.getType('Query')); // => false + * ``` + */ +export declare function isEnumType(type: unknown): type is GraphQLEnumType; +/** + * Returns the value as a GraphQLEnumType, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQLEnumType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertEnumType } from 'graphql/type'; + * + * const schema = buildSchema(` + * enum Episode { + * NEW_HOPE + * EMPIRE + * } + * + * type Query { + * favoriteEpisode: Episode + * } + * `); + * + * const episodeType = assertEnumType(schema.getType('Episode')); + * + * episodeType.getValues().map((value) => value.name); // => ['NEW_HOPE', 'EMPIRE'] + * assertEnumType(schema.getType('Query')); // throws an error + * ``` + */ +export declare function assertEnumType(type: unknown): GraphQLEnumType; +/** + * Returns true when the value is a resolved GraphQL enum value definition. + * @param value - Value to inspect. + * @returns True when the value is a GraphQLEnumValue. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertEnumType, isEnumValue } from 'graphql/type'; + * + * const schema = buildSchema( + * 'enum Episode { NEW_HOPE } type Query { episode: Episode }', + * ); + * const enumValue = assertEnumType(schema.getType('Episode')).getValues()[0]; + * + * isEnumValue(enumValue); // => true + * isEnumValue(schema.getType('Episode')); // => false + * ``` + */ +export declare function isEnumValue(value: unknown): value is GraphQLEnumValue; +/** + * Returns the value as a GraphQLEnumValue, or throws if it is not one. + * @param value - Value to inspect. + * @returns The value typed as a GraphQLEnumValue. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertEnumType, assertEnumValue } from 'graphql/type'; + * + * const schema = buildSchema( + * 'enum Episode { NEW_HOPE } type Query { episode: Episode }', + * ); + * const enumValue = assertEnumValue( + * assertEnumType(schema.getType('Episode')).getValues()[0], + * ); + * + * enumValue.name; // => 'NEW_HOPE' + * assertEnumValue(schema.getType('Episode')); // throws an error + * ``` + */ +export declare function assertEnumValue(value: unknown): GraphQLEnumValue; +/** + * Returns true when the value is a GraphQLInputObjectType. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQLInputObjectType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isInputObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Review { + * stars: Int! + * } + * + * type Query { + * review(input: ReviewInput): Review + * } + * `); + * + * isInputObjectType(schema.getType('ReviewInput')); // => true + * isInputObjectType(schema.getType('Review')); // => false + * ``` + */ +export declare function isInputObjectType(type: unknown): type is GraphQLInputObjectType; +/** + * Returns the value as a GraphQLInputObjectType, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQLInputObjectType. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInputObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Review { + * stars: Int! + * } + * + * type Query { + * review(input: ReviewInput): Review + * } + * `); + * + * const inputType = assertInputObjectType(schema.getType('ReviewInput')); + * + * Object.keys(inputType.getFields()); // => ['stars'] + * assertInputObjectType(schema.getType('Review')); // throws an error + * ``` + */ +export declare function assertInputObjectType(type: unknown): GraphQLInputObjectType; +/** + * Returns true when the value is a resolved GraphQL input field definition. + * @param field - Value to inspect. + * @returns True when the value is a GraphQLInputField. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInputObjectType, isInputField } from 'graphql/type'; + * + * const schema = buildSchema( + * 'input ReviewInput { stars: Int } type Query { ok: Boolean }', + * ); + * const inputField = assertInputObjectType( + * schema.getType('ReviewInput'), + * ).getFields().stars; + * + * isInputField(inputField); // => true + * isInputField(schema.getQueryType()); // => false + * ``` + */ +export declare function isInputField(field: unknown): field is GraphQLInputField; +/** + * Returns the value as a GraphQLInputField, or throws if it is not one. + * @param field - Value to inspect. + * @returns The value typed as a GraphQLInputField. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInputField, assertInputObjectType } from 'graphql/type'; + * + * const schema = buildSchema( + * 'input ReviewInput { stars: Int } type Query { ok: Boolean }', + * ); + * const inputField = assertInputField( + * assertInputObjectType(schema.getType('ReviewInput')).getFields().stars, + * ); + * + * inputField.name; // => 'stars' + * assertInputField(schema.getQueryType()); // throws an error + * ``` + */ +export declare function assertInputField(field: unknown): GraphQLInputField; +/** + * Returns true when the value is a GraphQLList. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQLList. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { GraphQLList, GraphQLString, isListType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * tags: [String!]! + * } + * `); + * + * const tagsField = schema.getQueryType()?.getFields().tags; + * + * isListType(new GraphQLList(GraphQLString)); // => true + * isListType(GraphQLString); // => false + * isListType(tagsField?.type); // => false + * ``` + */ +export declare function isListType(type: GraphQLInputType): type is GraphQLList<GraphQLInputType>; +/** + * Returns true when the output type is a GraphQLList. + * @param type - The GraphQL output type to inspect. + * @returns True when the output type is a list type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { getNullableType, isListType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * tags: [String!]! + * } + * `); + * + * const tagsField = schema.getQueryType()?.getFields().tags; + * const nullableTagsType = getNullableType(tagsField?.type); + * + * isListType(nullableTagsType); // => true + * ``` + */ +export declare function isListType(type: GraphQLOutputType): type is GraphQLList<GraphQLOutputType>; +/** + * Returns true when the value is a GraphQLList. + * @param type - The value to inspect. + * @returns True when the value is a list type. + * @example + * ```ts + * import { isListType } from 'graphql/type'; + * + * isListType('[String]'); // => false + * isListType(null); // => false + * ``` + */ +export declare function isListType(type: unknown): type is GraphQLList<GraphQLType>; +/** + * Returns the value as a GraphQLList, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQLList. + * @example + * ```ts + * import { GraphQLList, GraphQLString, assertListType } from 'graphql/type'; + * + * const listType = assertListType(new GraphQLList(GraphQLString)); + * + * listType.ofType; // => GraphQLString + * assertListType(GraphQLString); // throws an error + * ``` + */ +export declare function assertListType(type: unknown): GraphQLList<GraphQLType>; +/** + * Returns true when the value is a GraphQLNonNull. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQLNonNull. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { GraphQLNonNull, GraphQLString, isNonNullType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * name: String! + * nickname: String + * } + * `); + * + * const fields = schema.getQueryType()?.getFields(); + * + * isNonNullType(new GraphQLNonNull(GraphQLString)); // => true + * isNonNullType(fields?.name.type); // => true + * isNonNullType(fields?.nickname.type); // => false + * ``` + */ +export declare function isNonNullType(type: GraphQLInputType): type is GraphQLNonNull<GraphQLNullableInputType>; +/** + * Returns true when the output type is a GraphQLNonNull. + * @param type - The GraphQL output type to inspect. + * @returns True when the output type is a non-null type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isNonNullType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * name: String! + * nickname: String + * } + * `); + * + * const fields = schema.getQueryType()?.getFields(); + * + * isNonNullType(fields?.name.type); // => true + * isNonNullType(fields?.nickname.type); // => false + * ``` + */ +export declare function isNonNullType(type: GraphQLOutputType): type is GraphQLNonNull<GraphQLNullableOutputType>; +/** + * Returns true when the value is a GraphQLNonNull. + * @param type - The value to inspect. + * @returns True when the value is a non-null type. + * @example + * ```ts + * import { isNonNullType } from 'graphql/type'; + * + * isNonNullType('String!'); // => false + * isNonNullType(null); // => false + * ``` + */ +export declare function isNonNullType(type: unknown): type is GraphQLNonNull<GraphQLNullableType>; +/** + * Returns the value as a GraphQLNonNull, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQLNonNull. + * @example + * ```ts + * import { GraphQLNonNull, GraphQLString, assertNonNullType } from 'graphql/type'; + * + * const nonNullType = assertNonNullType(new GraphQLNonNull(GraphQLString)); + * + * nonNullType.ofType; // => GraphQLString + * assertNonNullType(GraphQLString); // throws an error + * ``` + */ +export declare function assertNonNullType(type: unknown): GraphQLNonNull<GraphQLNullableType>; +/** These types may be used as input types for arguments and directives. */ +export type GraphQLNullableInputType = GraphQLNamedInputType | GraphQLList<GraphQLInputType>; +/** These types may be used as input types for arguments and directives. */ +export type GraphQLInputType = GraphQLNullableInputType | GraphQLNonNull<GraphQLNullableInputType>; +/** + * Returns true when the value can be used as a GraphQL input type. + * @param type - The GraphQL type to inspect. + * @returns True when the value can be used as a GraphQL input type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isInputType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Review { + * stars: Int! + * } + * + * type Query { + * review(input: ReviewInput): Review + * } + * `); + * + * isInputType(schema.getType('ReviewInput')); // => true + * isInputType(schema.getType('Review')); // => false + * ``` + */ +export declare function isInputType(type: unknown): type is GraphQLInputType; +/** + * Returns the value as a GraphQL input type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQL input type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInputType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Review { + * stars: Int! + * } + * + * type Query { + * review(input: ReviewInput): Review + * } + * `); + * + * const inputType = assertInputType(schema.getType('ReviewInput')); + * + * inputType.toString(); // => 'ReviewInput' + * assertInputType(schema.getType('Review')); // throws an error + * ``` + */ +export declare function assertInputType(type: unknown): GraphQLInputType; +/** These types may be used as output types as the result of fields. */ +export type GraphQLNullableOutputType = GraphQLNamedOutputType | GraphQLList<GraphQLOutputType>; +/** These types may be used as output types as the result of fields. */ +export type GraphQLOutputType = GraphQLNullableOutputType | GraphQLNonNull<GraphQLNullableOutputType>; +/** + * Returns true when the value can be used as a GraphQL output type. + * @param type - The GraphQL type to inspect. + * @returns True when the value can be used as a GraphQL output type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isOutputType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Review { + * stars: Int! + * } + * + * type Query { + * review(input: ReviewInput): Review + * } + * `); + * + * isOutputType(schema.getType('Review')); // => true + * isOutputType(schema.getType('ReviewInput')); // => false + * ``` + */ +export declare function isOutputType(type: unknown): type is GraphQLOutputType; +/** + * Returns the value as a GraphQL output type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQL output type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertOutputType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Review { + * stars: Int! + * } + * + * type Query { + * review(input: ReviewInput): Review + * } + * `); + * + * const outputType = assertOutputType(schema.getType('Review')); + * + * outputType.toString(); // => 'Review' + * assertOutputType(schema.getType('ReviewInput')); // throws an error + * ``` + */ +export declare function assertOutputType(type: unknown): GraphQLOutputType; +/** These types may describe types which may be leaf values. */ +export type GraphQLLeafType = GraphQLScalarType | GraphQLEnumType; +/** + * Returns true when the value is a GraphQL scalar or enum type. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQL scalar or enum type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isLeafType } from 'graphql/type'; + * + * const schema = buildSchema(` + * enum Episode { + * NEW_HOPE + * } + * + * type Review { + * stars: Int! + * } + * + * type Query { + * episode: Episode + * review: Review + * } + * `); + * + * isLeafType(schema.getType('Episode')); // => true + * isLeafType(schema.getType('String')); // => true + * isLeafType(schema.getType('Review')); // => false + * ``` + */ +export declare function isLeafType(type: unknown): type is GraphQLLeafType; +/** + * Returns the value as a GraphQL leaf type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQL leaf type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertLeafType } from 'graphql/type'; + * + * const schema = buildSchema(` + * enum Episode { + * NEW_HOPE + * } + * + * type Review { + * stars: Int! + * } + * + * type Query { + * episode: Episode + * review: Review + * } + * `); + * + * const episodeType = assertLeafType(schema.getType('Episode')); + * + * episodeType.toString(); // => 'Episode' + * assertLeafType(schema.getType('Review')); // throws an error + * ``` + */ +export declare function assertLeafType(type: unknown): GraphQLLeafType; +/** These types may describe the parent context of a selection set. */ +export type GraphQLCompositeType = GraphQLObjectType | GraphQLInterfaceType | GraphQLUnionType; +/** + * Returns true when the value is a GraphQL object, interface, or union type. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQL object, interface, or union type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isCompositeType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * union SearchResult = User + * + * type Query { + * node: Node + * search: [SearchResult] + * } + * `); + * + * isCompositeType(schema.getType('User')); // => true + * isCompositeType(schema.getType('Node')); // => true + * isCompositeType(schema.getType('SearchResult')); // => true + * isCompositeType(schema.getType('String')); // => false + * ``` + */ +export declare function isCompositeType(type: unknown): type is GraphQLCompositeType; +/** + * Returns the value as a GraphQL composite type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQL composite type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertCompositeType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Query { + * node: Node + * } + * `); + * + * const userType = assertCompositeType(schema.getType('User')); + * + * userType.toString(); // => 'User' + * assertCompositeType(schema.getType('String')); // throws an error + * ``` + */ +export declare function assertCompositeType(type: unknown): GraphQLCompositeType; +/** These types may describe the parent context of a selection set. */ +export type GraphQLAbstractType = GraphQLInterfaceType | GraphQLUnionType; +/** + * Returns true when the value is a GraphQL interface or union type. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQL interface or union type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { isAbstractType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * union SearchResult = User + * + * type Query { + * node: Node + * search: [SearchResult] + * } + * `); + * + * isAbstractType(schema.getType('Node')); // => true + * isAbstractType(schema.getType('SearchResult')); // => true + * isAbstractType(schema.getType('User')); // => false + * ``` + */ +export declare function isAbstractType(type: unknown): type is GraphQLAbstractType; +/** + * Returns the value as a GraphQL abstract type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQL abstract type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertAbstractType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Query { + * node: Node + * } + * `); + * + * const nodeType = assertAbstractType(schema.getType('Node')); + * + * nodeType.toString(); // => 'Node' + * assertAbstractType(schema.getType('User')); // throws an error + * ``` + */ +export declare function assertAbstractType(type: unknown): GraphQLAbstractType; +/** + * List Type Wrapper + * + * A list is a wrapping type which points to another type. + * Lists are often created within the context of defining the fields of + * an object type. + * @typeParam T - The GraphQL type wrapped by this list type. + * @example + * ```ts + * const PersonType = new GraphQLObjectType({ + * name: 'Person', + * fields: () => ({ + * parents: { type: new GraphQLList(PersonType) }, + * children: { type: new GraphQLList(PersonType) }, + * }), + * }); + * ``` + */ +export declare class GraphQLList<T extends GraphQLType> implements GraphQLSchemaElement { + /** The type wrapped by this list or non-null type. */ + readonly ofType: T; + private readonly __GraphQLListTypeBrand; + /** + * Creates a GraphQLList instance. + * @param ofType - The type to wrap. + * @example + * ```ts + * import { GraphQLList, GraphQLString } from 'graphql/type'; + * + * const stringList = new GraphQLList(GraphQLString); + * + * stringList.ofType; // => GraphQLString + * String(stringList); // => '[String]' + * ``` + */ + constructor(ofType: T); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns this wrapping type as a GraphQL type-reference string. + * @returns The GraphQL type-reference string. + * @example + * ```ts + * import { GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql/type'; + * + * const stringList = new GraphQLList(GraphQLString); + * const requiredStringList = new GraphQLList(new GraphQLNonNull(GraphQLString)); + * + * stringList.toString(); // => '[String]' + * requiredStringList.toString(); // => '[String!]' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { GraphQLList, GraphQLString } from 'graphql/type'; + * + * const stringList = new GraphQLList(GraphQLString); + * + * stringList.toJSON(); // => '[String]' + * JSON.stringify({ type: stringList }); // => '{"type":"[String]"}' + * ``` + */ + toJSON(): string; +} +/** + * Non-Null Type Wrapper + * + * A non-null is a wrapping type which points to another type. + * Non-null types enforce that their values are never null and can ensure + * an error is raised if this ever occurs during a request. It is useful for + * fields which you can make a strong guarantee on non-nullability, for example + * usually the id field of a database row will never be null. + * @typeParam T - The nullable GraphQL type wrapped by this non-null type. + * @example + * ```ts + * const RowType = new GraphQLObjectType({ + * name: 'Row', + * fields: () => ({ + * id: { type: new GraphQLNonNull(GraphQLString) }, + * }), + * }); + * ``` + * + * Note: the enforcement of non-nullability occurs within the executor. + */ +export declare class GraphQLNonNull<T extends GraphQLNullableType> implements GraphQLSchemaElement { + /** The type wrapped by this list or non-null type. */ + readonly ofType: T; + private readonly __GraphQLNonNullTypeBrand; + /** + * Creates a GraphQLNonNull instance. + * @param ofType - The type to wrap. + * @example + * ```ts + * import { GraphQLNonNull, GraphQLString } from 'graphql/type'; + * + * const requiredString = new GraphQLNonNull(GraphQLString); + * + * requiredString.ofType; // => GraphQLString + * String(requiredString); // => 'String!' + * ``` + */ + constructor(ofType: T); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns this wrapping type as a GraphQL type-reference string. + * @returns The GraphQL type-reference string. + * @example + * ```ts + * import { GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql/type'; + * + * const requiredString = new GraphQLNonNull(GraphQLString); + * const requiredStringList = new GraphQLNonNull(new GraphQLList(GraphQLString)); + * + * requiredString.toString(); // => 'String!' + * requiredStringList.toString(); // => '[String]!' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { GraphQLNonNull, GraphQLString } from 'graphql/type'; + * + * const requiredString = new GraphQLNonNull(GraphQLString); + * + * requiredString.toJSON(); // => 'String!' + * JSON.stringify({ type: requiredString }); // => '{"type":"String!"}' + * ``` + */ + toJSON(): string; +} +/** These types wrap and modify other types */ +export type GraphQLWrappingType = GraphQLList<GraphQLType> | GraphQLNonNull<GraphQLNullableType>; +/** + * Returns true when the value is a GraphQL list or non-null wrapper type. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQL list or non-null wrapper type. + * @example + * ```ts + * import { + * GraphQLList, + * GraphQLNonNull, + * GraphQLString, + * isWrappingType, + * } from 'graphql/type'; + * + * isWrappingType(new GraphQLList(GraphQLString)); // => true + * isWrappingType(new GraphQLNonNull(GraphQLString)); // => true + * isWrappingType(GraphQLString); // => false + * ``` + */ +export declare function isWrappingType(type: unknown): type is GraphQLWrappingType; +/** + * Returns the value as a GraphQL wrapping type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQL wrapping type. + * @example + * ```ts + * import { GraphQLList, GraphQLString, assertWrappingType } from 'graphql/type'; + * + * const wrappingType = assertWrappingType(new GraphQLList(GraphQLString)); + * + * wrappingType.toString(); // => '[String]' + * assertWrappingType(GraphQLString); // throws an error + * ``` + */ +export declare function assertWrappingType(type: unknown): GraphQLWrappingType; +/** These types can all accept null as a value. */ +export type GraphQLNullableType = GraphQLNamedType | GraphQLList<GraphQLType>; +/** + * Returns true when the value is a GraphQL type that can accept null. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQL type that can accept null. + * @example + * ```ts + * import { GraphQLNonNull, GraphQLString, isNullableType } from 'graphql/type'; + * + * isNullableType(GraphQLString); // => true + * isNullableType(new GraphQLNonNull(GraphQLString)); // => false + * isNullableType(null); // => false + * ``` + */ +export declare function isNullableType(type: unknown): type is GraphQLNullableType; +/** + * Returns the value as a nullable GraphQL type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a nullable GraphQL type. + * @example + * ```ts + * import { + * GraphQLNonNull, + * GraphQLString, + * assertNullableType, + * } from 'graphql/type'; + * + * const nullableType = assertNullableType(GraphQLString); + * + * nullableType; // => GraphQLString + * assertNullableType(new GraphQLNonNull(GraphQLString)); // throws an error + * ``` + */ +export declare function assertNullableType(type: unknown): GraphQLNullableType; +/** + * Returns the nullable type. + * @param type - The GraphQL type to inspect. + * @returns The nullable type after removing one non-null wrapper, if present. + * @example + * ```ts + * import { getNullableType } from 'graphql/type'; + * + * getNullableType(null); // => undefined + * getNullableType(undefined); // => undefined + * ``` + */ +export declare function getNullableType(type: undefined | null): void; +/** + * Returns the nullable type after removing one non-null wrapper. + * @param type - A nullable type or non-null wrapper. + * @returns The nullable type after removing one non-null wrapper, if present. + * @typeParam T - The nullable GraphQL type returned after removing one non-null wrapper. + * @example + * ```ts + * import { + * GraphQLList, + * GraphQLNonNull, + * GraphQLString, + * getNullableType, + * } from 'graphql/type'; + * + * const requiredString = new GraphQLNonNull(GraphQLString); + * const stringList = new GraphQLList(GraphQLString); + * + * getNullableType(requiredString); // => GraphQLString + * getNullableType(stringList); // => stringList + * ``` + */ +export declare function getNullableType<T extends GraphQLNullableType>(type: T | GraphQLNonNull<T>): T; +/** + * Returns the nullable type after removing one non-null wrapper. + * @param type - The GraphQL type to inspect. + * @returns The nullable type after removing one non-null wrapper, if present. + * @example + * ```ts + * import { + * GraphQLList, + * GraphQLNonNull, + * GraphQLString, + * getNullableType, + * } from 'graphql/type'; + * + * const requiredStringList = new GraphQLNonNull(new GraphQLList(GraphQLString)); + * + * getNullableType(requiredStringList).toString(); // => '[String]' + * getNullableType(GraphQLString); // => GraphQLString + * ``` + */ +export declare function getNullableType(type: Maybe<GraphQLType>): GraphQLNullableType | undefined; +/** These named types do not include modifiers like List or NonNull. */ +export type GraphQLNamedType = GraphQLNamedInputType | GraphQLNamedOutputType; +/** A named GraphQL type that can be used as an input type. */ +export type GraphQLNamedInputType = GraphQLScalarType | GraphQLEnumType | GraphQLInputObjectType; +/** A named GraphQL type that can be used as an output type. */ +export type GraphQLNamedOutputType = GraphQLScalarType | GraphQLObjectType | GraphQLInterfaceType | GraphQLUnionType | GraphQLEnumType; +/** + * Returns true when the value is a GraphQL named type. + * @param type - The GraphQL type to inspect. + * @returns True when the value is a GraphQL named type. + * @example + * ```ts + * import { GraphQLList, GraphQLString, isNamedType } from 'graphql/type'; + * + * isNamedType(GraphQLString); // => true + * isNamedType(new GraphQLList(GraphQLString)); // => false + * isNamedType(null); // => false + * ``` + */ +export declare function isNamedType(type: unknown): type is GraphQLNamedType; +/** + * Returns the value as a GraphQL named type, or throws if it is not one. + * @param type - The GraphQL type to inspect. + * @returns The value typed as a GraphQL named type. + * @example + * ```ts + * import { GraphQLList, GraphQLString, assertNamedType } from 'graphql/type'; + * + * const namedType = assertNamedType(GraphQLString); + * + * namedType.name; // => 'String' + * assertNamedType(new GraphQLList(GraphQLString)); // throws an error + * ``` + */ +export declare function assertNamedType(type: unknown): GraphQLNamedType; +/** + * Returns the named type. + * @param type - The GraphQL type to inspect. + * @returns The named type after unwrapping all list and non-null wrappers. + * @example + * ```ts + * import { getNamedType } from 'graphql/type'; + * + * getNamedType(null); // => undefined + * getNamedType(undefined); // => undefined + * ``` + */ +export declare function getNamedType(type: undefined | null): void; +/** + * Returns the named input type after unwrapping all list and non-null wrappers. + * @param type - The GraphQL input type to inspect. + * @returns The named input type after unwrapping all wrappers. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { getNamedType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Query { + * review(input: [ReviewInput!]!): Boolean + * } + * `); + * + * const inputArg = schema.getQueryType()?.getFields().review.args[0]; + * + * getNamedType(inputArg?.type).toString(); // => 'ReviewInput' + * ``` + */ +export declare function getNamedType(type: GraphQLInputType): GraphQLNamedInputType; +/** + * Returns the named output type after unwrapping all list and non-null wrappers. + * @param type - The GraphQL output type to inspect. + * @returns The named output type after unwrapping all wrappers. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { getNamedType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type User { + * name: String + * } + * + * type Query { + * users: [User!]! + * } + * `); + * + * const usersField = schema.getQueryType()?.getFields().users; + * + * getNamedType(usersField?.type).toString(); // => 'User' + * ``` + */ +export declare function getNamedType(type: GraphQLOutputType): GraphQLNamedOutputType; +/** + * Returns the named type after unwrapping all list and non-null wrappers. + * @param type - The GraphQL type to inspect. + * @returns The named type after unwrapping all wrappers. + * @example + * ```ts + * import { + * GraphQLList, + * GraphQLNonNull, + * GraphQLString, + * getNamedType, + * } from 'graphql/type'; + * + * const nestedType = new GraphQLNonNull( + * new GraphQLList(new GraphQLNonNull(GraphQLString)), + * ); + * + * getNamedType(nestedType); // => GraphQLString + * ``` + */ +export declare function getNamedType(type: GraphQLType): GraphQLNamedType; +/** + * Returns the named type after unwrapping all list and non-null wrappers. + * @param type - The GraphQL type to inspect. + * @returns The named type after unwrapping all wrappers, or undefined for nullish input. + * @example + * ```ts + * import { GraphQLList, GraphQLString, getNamedType } from 'graphql/type'; + * + * getNamedType(new GraphQLList(GraphQLString)); // => GraphQLString + * getNamedType(undefined); // => undefined + * ``` + */ +export declare function getNamedType(type: Maybe<GraphQLType>): GraphQLNamedType | undefined; +interface GraphQLSchemaElement { + toString: () => string; + toJSON: () => string; +} +/** + * Used while defining GraphQL types to allow for circular references in + * otherwise immutable type definitions. + * @typeParam T - The element type returned by the thunk or array. + */ +export type ThunkReadonlyArray<T> = (() => ReadonlyArray<T>) | ReadonlyArray<T>; +/** + * A thunk that resolves to an object map. + * @typeParam T - Value type stored in the object map. + */ +export type ThunkObjMap<T> = (() => ObjMap<T>) | ObjMap<T>; +/** + * Resolves a thunked readonly array. + * @param thunk - The thunk or value to resolve. + * @returns The resolved readonly array. + * @typeParam T - The element type resolved from the thunk or array. + * @example + * ```ts + * import { GraphQLString, resolveReadonlyArrayThunk } from 'graphql/type'; + * + * const lazyFields = resolveReadonlyArrayThunk(() => [GraphQLString]); + * const fields = resolveReadonlyArrayThunk([GraphQLString]); + * + * lazyFields; // => [GraphQLString] + * fields; // => [GraphQLString] + * ``` + */ +export declare function resolveReadonlyArrayThunk<T>(thunk: ThunkReadonlyArray<T>): ReadonlyArray<T>; +/** + * Resolves a thunked object map. + * @param thunk - The thunk or value to resolve. + * @returns The resolved object map. + * @typeParam T - The object-map value type resolved from the thunk or map. + * @example + * ```ts + * import { GraphQLString, resolveObjMapThunk } from 'graphql/type'; + * + * const lazyFields = resolveObjMapThunk(() => ({ name: GraphQLString })); + * const fields = resolveObjMapThunk({ name: GraphQLString }); + * + * lazyFields.name; // => GraphQLString + * fields.name; // => GraphQLString + * ``` + */ +export declare function resolveObjMapThunk<T>(thunk: ThunkObjMap<T>): ObjMap<T>; +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLScalarTypeExtensions { + [attributeName: string | symbol]: unknown; +} +/** + * Scalar Type Definition + * + * Scalar types define the leaf values of a GraphQL response and the input + * values accepted by arguments and input object fields. A scalar type has a + * name and coercion functions that validate and convert runtime values and + * GraphQL literals. + * + * If a type's coerceOutputValue function returns `null` or does not return a + * value (i.e. it returns `undefined`) then an error will be raised and a + * `null` value will be returned in the response. Prefer validating inputs + * before execution so clients receive input diagnostics before result coercion + * fails. + * Custom scalar behavior is defined via the following functions: + * + * - coerceOutputValue(value): Implements "Result Coercion". Given an internal value, + * produces an external value valid for this type. Returns undefined or + * throws an error to indicate invalid values. + * + * - coerceInputValue(value): Implements "Input Coercion" for values. Given an + * external value (for example, variable values), produces an internal value + * valid for this type. Returns undefined or throws an error to indicate + * invalid values. + * + * - coerceInputLiteral(ast): Implements "Input Coercion" for constant literals. + * Given a GraphQL literal (AST) (for example, an argument value), produces + * an internal value valid for this type. Returns undefined or throws an + * error to indicate invalid values. + * + * - valueToLiteral(value): Converts an external value to a GraphQL + * literal (AST). Returns undefined or throws an error to indicate + * invalid values. + * + * Deprecated, to be removed in v18: + * + * - serialize(value): Implements "Result Coercion". Renamed to + * `coerceOutputValue()`. + * + * - parseValue(value): Implements "Input Coercion" for values. Renamed to + * `coerceInputValue()`. + * + * - parseLiteral(ast): Implements "Input Coercion" for literals including + * non-specified replacement of variables embedded within complex scalars. + * Replaced by the combination of the `replaceVariables()` utility and the + * `coerceInputLiteral()` method. + * @typeParam TInternal - Internal runtime representation for this scalar. + * @typeParam TExternal - External representation accepted from or returned to callers. + * @example + * ```ts + * import { GraphQLScalarType, Kind } from 'graphql'; + * + * const ensureOdd = (value) => { + * if (!Number.isFinite(value)) { + * throw new Error( + * `Scalar "Odd" cannot represent "${value}" since it is not a finite number.`, + * ); + * } + * + * if (value % 2 === 0) { + * throw new Error( + * `Scalar "Odd" cannot represent "${value}" since it is even.`, + * ); + * } + * + * return value; + * }; + * + * const OddType = new GraphQLScalarType({ + * name: 'Odd', + * coerceOutputValue: (value) => { + * return ensureOdd(value); + * }, + * coerceInputValue: (value) => { + * return ensureOdd(value); + * }, + * valueToLiteral: (value) => { + * return { kind: Kind.INT, value: String(ensureOdd(value)) }; + * }, + * }); + * ``` + */ +export declare class GraphQLScalarType<TInternal = unknown, TExternal = TInternal> implements GraphQLSchemaElement { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** URL identifying the behavior specified for this custom scalar. */ + specifiedByURL: Maybe<string>; + /** + * Deprecated legacy serializer used to convert internal values for response + * output. Use `coerceOutputValue()` instead. + * @deprecated use `coerceOutputValue()` instead, `serialize()` will be removed in v18 + */ + serialize: GraphQLScalarSerializer<TExternal>; + /** + * Deprecated legacy parser used to convert externally provided input values. + * Use `coerceInputValue()` instead. + * @deprecated use `coerceInputValue()` instead, `parseValue()` will be removed in v18 + */ + parseValue: GraphQLScalarValueParser<TInternal>; + /** + * Deprecated legacy parser used to convert externally provided input + * literals. Use `replaceVariables()` and `coerceInputLiteral()` instead. + * @deprecated use `replaceVariables()` and `coerceInputLiteral()` instead, `parseLiteral()` will be removed in v18 + */ + parseLiteral: GraphQLScalarLiteralParser<TInternal>; + /** Coercer used to convert internal scalar values for response output. */ + coerceOutputValue: GraphQLScalarOutputValueCoercer<TExternal>; + /** Coercer used to convert externally provided scalar input values. */ + coerceInputValue: GraphQLScalarInputValueCoercer<TInternal>; + /** Coercer used to convert GraphQL scalar input literals. */ + coerceInputLiteral: GraphQLScalarInputLiteralCoercer<TInternal> | undefined; + /** Converter used to produce GraphQL literals from runtime input values. */ + valueToLiteral: GraphQLScalarValueToLiteral | undefined; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLScalarTypeExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<ScalarTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes: ReadonlyArray<ScalarTypeExtensionNode>; + /** + * Creates a GraphQLScalarType instance. + * @param config - Configuration describing this object. + * @example + * ```ts + * import { Kind, parse } from 'graphql/language'; + * import { GraphQLScalarType } from 'graphql/type'; + * + * const document = parse(` + * "Odd integer values." + * scalar Odd @specifiedBy(url: "https://example.com/odd") + * + * extend scalar Odd @specifiedBy(url: "https://example.com/odd-v2") + * `); + * + * const Odd = new GraphQLScalarType({ + * name: 'Odd', + * description: 'Odd integer values.', + * specifiedByURL: 'https://example.com/odd', + * coerceOutputValue: (value) => { + * if (typeof value !== 'number' || value % 2 === 0) { + * throw new TypeError('Odd can only produce odd numbers.'); + * } + * return value; + * }, + * coerceInputValue: (value) => { + * if (typeof value !== 'number' || value % 2 === 0) { + * throw new TypeError('Odd can only accept odd numbers.'); + * } + * return value; + * }, + * coerceInputLiteral: (ast) => { + * if (ast.kind !== Kind.INT) { + * throw new TypeError('Odd can only accept integer literals.'); + * } + * const value = Number(ast.value); + * if (value % 2 === 0) { + * throw new TypeError('Odd can only accept odd integer literals.'); + * } + * return value; + * }, + * valueToLiteral: (value) => { + * return { kind: Kind.INT, value: String(ensureOdd(value)) }; + * }, + * extensions: { numeric: true }, + * astNode: document.definitions[0], + * extensionASTNodes: [document.definitions[1]], + * }); + * + * Odd.description; // => 'Odd integer values.' + * Odd.specifiedByURL; // => 'https://example.com/odd' + * Odd.coerceOutputValue(3); // => 3 + * Odd.coerceInputValue(5); // => 5 + * Odd.extensions; // => { numeric: true } + * ``` + */ + constructor(config: Readonly<GraphQLScalarTypeConfig<TInternal, TExternal>>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns a normalized configuration object for this object. + * @returns A configuration object that can be used to recreate this object. + * @example + * ```ts + * import { GraphQLScalarType } from 'graphql/type'; + * + * const Url = new GraphQLScalarType({ + * name: 'Url', + * description: 'An absolute URL string.', + * specifiedByURL: 'https://url.spec.whatwg.org/', + * }); + * + * const config = Url.toConfig(); + * const UrlCopy = new GraphQLScalarType(config); + * + * config.name; // => 'Url' + * config.specifiedByURL; // => 'https://url.spec.whatwg.org/' + * UrlCopy.name; // => Url.name + * ``` + */ + toConfig(): GraphQLScalarTypeNormalizedConfig<TInternal, TExternal>; + /** + * Returns the schema coordinate identifying this scalar type. + * @returns The schema coordinate for this scalar type. + * @example + * ```ts + * import { GraphQLScalarType } from 'graphql/type'; + * + * const DateTime = new GraphQLScalarType({ name: 'DateTime' }); + * + * DateTime.toString(); // => 'DateTime' + * String(DateTime); // => 'DateTime' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { GraphQLScalarType } from 'graphql/type'; + * + * const DateTime = new GraphQLScalarType({ name: 'DateTime' }); + * + * DateTime.toJSON(); // => 'DateTime' + * JSON.stringify({ type: DateTime }); // => '{"type":"DateTime"}' + * ``` + */ + toJSON(): string; +} +/** + * Deprecated function type that serializes a runtime value as a scalar output + * value. Use `GraphQLScalarOutputValueCoercer` instead. + * @typeParam TExternal - External representation accepted from or returned to callers. + * @deprecated Use GraphQLScalarOutputValueCoercer instead. Will be removed in v18. + */ +export type GraphQLScalarSerializer<TExternal> = (outputValue: unknown) => TExternal; +/** + * Function used to coerce internal scalar values for response output. + * @typeParam TExternal - External representation accepted from or returned to callers. + */ +export type GraphQLScalarOutputValueCoercer<TExternal> = (outputValue: unknown) => TExternal; +/** + * Deprecated function type that parses a runtime input value as a scalar input + * value. Use `GraphQLScalarInputValueCoercer` instead. + * @typeParam TInternal - Internal runtime representation for this scalar. + * @deprecated Use GraphQLScalarInputValueCoercer instead. Will be removed in v18. + */ +export type GraphQLScalarValueParser<TInternal> = (inputValue: unknown) => TInternal; +/** + * Function used to coerce externally provided scalar input values. + * @typeParam TInternal - Internal runtime representation for this scalar. + */ +export type GraphQLScalarInputValueCoercer<TInternal> = (inputValue: unknown) => TInternal; +/** + * Deprecated function type that parses a GraphQL value literal as a scalar + * input value. Use `GraphQLScalarInputLiteralCoercer` instead. + * @typeParam TInternal - Internal runtime representation for this scalar. + * @deprecated Use GraphQLScalarInputLiteralCoercer instead. Will be removed in v18. + */ +export type GraphQLScalarLiteralParser<TInternal> = (valueNode: ValueNode, variables: Maybe<ObjMap<unknown>>) => Maybe<TInternal>; +/** + * Function used to coerce GraphQL scalar input literals. + * @typeParam TInternal - Internal runtime representation for this scalar. + */ +export type GraphQLScalarInputLiteralCoercer<TInternal> = (valueNode: ConstValueNode) => Maybe<TInternal>; +type GraphQLScalarValueToLiteral = (inputValue: unknown) => ConstValueNode | undefined; +/** + * Configuration used to construct a GraphQLScalarType. + * @typeParam TInternal - Internal runtime representation for this scalar. + * @typeParam TExternal - External representation accepted from or returned to callers. + */ +export interface GraphQLScalarTypeConfig<TInternal, TExternal> { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** URL identifying the behavior specified for this custom scalar. */ + specifiedByURL?: Maybe<string>; + /** + * Deprecated legacy serializer used to convert internal values for response + * output. Use `coerceOutputValue()` instead. + * @deprecated use `coerceOutputValue()` instead, `serialize()` will be removed in v18 + */ + serialize?: GraphQLScalarSerializer<TExternal> | undefined; + /** + * Deprecated legacy parser used to convert externally provided input values. + * Use `coerceInputValue()` instead. + * @deprecated use `coerceInputValue()` instead, `parseValue()` will be removed in v18 + */ + parseValue?: GraphQLScalarValueParser<TInternal> | undefined; + /** + * Deprecated legacy parser used to convert externally provided input + * literals. Use `replaceVariables()` and `coerceInputLiteral()` instead. + * @deprecated use `replaceVariables()` and `coerceInputLiteral()` instead, `parseLiteral()` will be removed in v18 + */ + parseLiteral?: GraphQLScalarLiteralParser<TInternal> | undefined; + /** Coerces an internal value to include in a response. */ + coerceOutputValue?: GraphQLScalarOutputValueCoercer<TExternal> | undefined; + /** Coerces an externally provided value to use as an input. */ + coerceInputValue?: GraphQLScalarInputValueCoercer<TInternal> | undefined; + /** Coerces an externally provided const literal value to use as an input. */ + coerceInputLiteral?: GraphQLScalarInputLiteralCoercer<TInternal> | undefined; + /** Translates an externally provided value to a literal (AST). */ + valueToLiteral?: GraphQLScalarValueToLiteral | undefined; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLScalarTypeExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<ScalarTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes?: Maybe<ReadonlyArray<ScalarTypeExtensionNode>>; +} +interface GraphQLScalarTypeNormalizedConfig<TInternal, TExternal> extends GraphQLScalarTypeConfig<TInternal, TExternal> { + serialize: GraphQLScalarSerializer<TExternal>; + parseValue: GraphQLScalarValueParser<TInternal>; + parseLiteral: GraphQLScalarLiteralParser<TInternal>; + coerceOutputValue: GraphQLScalarOutputValueCoercer<TExternal>; + coerceInputValue: GraphQLScalarInputValueCoercer<TInternal>; + coerceInputLiteral: GraphQLScalarInputLiteralCoercer<TInternal> | undefined; + extensions: Readonly<GraphQLScalarTypeExtensions>; + extensionASTNodes: ReadonlyArray<ScalarTypeExtensionNode>; +} +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + * We've provided these template arguments because this is an open type and + * you may find them useful. + * @typeParam _TSource - Reserved source type parameter for extension typing. + * @typeParam _TContext - Reserved context type parameter for extension typing. + */ +export interface GraphQLObjectTypeExtensions<_TSource = any, _TContext = any> { + [attributeName: string | symbol]: unknown; +} +/** + * Object Type Definition + * + * Almost all of the GraphQL types you define will be object types. Object types + * have a name, but most importantly describe their fields. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + * @typeParam TAbstract - Runtime value type used for abstract type resolution. + * @example + * ```ts + * const AddressType = new GraphQLObjectType({ + * name: 'Address', + * fields: { + * street: { type: GraphQLString }, + * number: { type: GraphQLInt }, + * formatted: { + * type: GraphQLString, + * resolve: (obj) => { + * return obj.number + ' ' + obj.street; + * }, + * }, + * }, + * }); + * ``` + * @example + * When two types need to refer to each other, or a type needs to refer to + * itself in a field, you can use a function expression (aka a closure or a + * thunk) to supply the fields lazily. + * + * ```ts + * const PersonType = new GraphQLObjectType({ + * name: 'Person', + * fields: () => ({ + * name: { type: GraphQLString }, + * bestFriend: { type: PersonType }, + * }), + * }); + * ``` + */ +export declare class GraphQLObjectType<TSource = any, TContext = any, TAbstract = any> implements GraphQLSchemaElement { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** Predicate used to determine whether a runtime value belongs to this object type. */ + isTypeOf: Maybe<GraphQLIsTypeOfFn<TAbstract, TContext>>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLObjectTypeExtensions<TSource, TContext>>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<ObjectTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes: ReadonlyArray<ObjectTypeExtensionNode>; + private _fields; + private _interfaces; + /** + * Creates a GraphQLObjectType instance. + * @param config - Configuration describing this object. + * @example + * ```ts + * // Configure an object type with interfaces, fields, arguments, and metadata. + * import { parse } from 'graphql/language'; + * import { + * GraphQLID, + * GraphQLInterfaceType, + * GraphQLNonNull, + * GraphQLObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const document = parse(` + * type User implements Node { + * id: ID! + * name(format: String = "short"): String + * } + * + * extend type User { + * displayName: String + * } + * `); + * const definition = document.definitions[0]; + * const nameField = definition.fields[1]; + * const formatArg = nameField.arguments[0]; + * + * const Node = new GraphQLInterfaceType({ + * name: 'Node', + * fields: { + * id: { type: new GraphQLNonNull(GraphQLID) }, + * }, + * }); + * + * const User = new GraphQLObjectType({ + * name: 'User', + * description: 'A registered user.', + * interfaces: [Node], + * fields: { + * id: { type: new GraphQLNonNull(GraphQLID) }, + * name: { + * description: 'The formatted user name.', + * type: GraphQLString, + * args: { + * format: { + * description: 'Controls the name format.', + * type: GraphQLString, + * default: { value: 'short' }, + * deprecationReason: 'Use locale instead.', + * extensions: { public: true }, + * astNode: formatArg, + * }, + * }, + * resolve: (user, { format }) => { + * return format === 'long' ? user.fullName : user.name; + * }, + * deprecationReason: 'Use displayName.', + * extensions: { cacheSeconds: 60 }, + * astNode: nameField, + * }, + * }, + * isTypeOf: (value) => { + * return typeof value === 'object' && value != null && 'id' in value; + * }, + * extensions: { entity: 'User' }, + * astNode: definition, + * extensionASTNodes: [document.definitions[1]], + * }); + * + * User.name; // => 'User' + * User.getInterfaces(); // => [Node] + * Object.keys(User.getFields()); // => ['id', 'name'] + * User.getFields().name.args[0].default.value; // => 'short' + * User.extensions; // => { entity: 'User' } + * ``` + * @example + * ```ts + * // This variant configures a subscription field with subscribe and resolve functions. + * import { GraphQLObjectType, GraphQLString } from 'graphql/type'; + * + * const Subscription = new GraphQLObjectType({ + * name: 'Subscription', + * fields: { + * greeting: { + * type: GraphQLString, + * subscribe: async function* () { + * yield { greeting: 'Hello!' }; + * }, + * resolve: (event) => { + * return event.greeting; + * }, + * }, + * }, + * }); + * + * typeof Subscription.getFields().greeting.subscribe; // => 'function' + * ``` + */ + constructor(config: Readonly<GraphQLObjectTypeConfig<TSource, TContext, TAbstract>>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns the fields defined by this type. + * @returns The fields keyed by field name. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type User { + * id: ID! + * name: String + * } + * + * type Query { + * viewer: User + * } + * `); + * + * const User = assertObjectType(schema.getType('User')); + * const fields = User.getFields(); + * + * Object.keys(fields); // => ['id', 'name'] + * String(fields.id.type); // => 'ID!' + * ``` + */ + getFields(): GraphQLFieldMap<TSource, TContext>; + /** + * Returns the interfaces implemented by this type. + * @returns The implemented interfaces. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Query { + * viewer: User + * } + * `); + * + * const User = assertObjectType(schema.getType('User')); + * + * User.getInterfaces().map((type) => type.name); // => ['Node'] + * ``` + */ + getInterfaces(): ReadonlyArray<GraphQLInterfaceType>; + /** + * Returns a normalized configuration object for this object. + * @returns A configuration object that can be used to recreate this object. + * @example + * ```ts + * import { GraphQLObjectType, GraphQLString } from 'graphql/type'; + * + * const User = new GraphQLObjectType({ + * name: 'User', + * fields: { + * name: { type: GraphQLString }, + * }, + * }); + * + * const config = User.toConfig(); + * const UserCopy = new GraphQLObjectType(config); + * + * config.fields.name.type; // => GraphQLString + * UserCopy.getFields().name.type; // => GraphQLString + * ``` + */ + toConfig(): GraphQLObjectTypeNormalizedConfig<TSource, TContext, TAbstract>; + /** + * Returns the schema coordinate identifying this object type. + * @returns The schema coordinate for this object type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type User { + * name: String + * } + * + * type Query { + * viewer: User + * } + * `); + * + * const User = assertObjectType(schema.getType('User')); + * + * User.toString(); // => 'User' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { GraphQLObjectType, GraphQLString } from 'graphql/type'; + * + * const User = new GraphQLObjectType({ + * name: 'User', + * fields: { name: { type: GraphQLString } }, + * }); + * + * User.toJSON(); // => 'User' + * JSON.stringify({ type: User }); // => '{"type":"User"}' + * ``` + */ + toJSON(): string; +} +/** + * Configuration used to construct a GraphQLObjectType. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + * @typeParam TAbstract - Runtime value type used for abstract type resolution. + */ +export interface GraphQLObjectTypeConfig<TSource, TContext, TAbstract = unknown> { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** Interfaces implemented by this object or interface type. */ + interfaces?: ThunkReadonlyArray<GraphQLInterfaceType> | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + fields: ThunkObjMap<GraphQLFieldConfig<TSource, TContext>>; + /** Predicate used to determine whether a runtime value belongs to this object type. */ + isTypeOf?: Maybe<GraphQLIsTypeOfFn<TAbstract, TContext>>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLObjectTypeExtensions<TSource, TContext>>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<ObjectTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes?: Maybe<ReadonlyArray<ObjectTypeExtensionNode>>; +} +interface GraphQLObjectTypeNormalizedConfig<TSource, TContext, TAbstract = unknown> extends GraphQLObjectTypeConfig<TSource, TContext, TAbstract> { + interfaces: ReadonlyArray<GraphQLInterfaceType>; + fields: GraphQLFieldNormalizedConfigMap<TSource, TContext>; + extensions: Readonly<GraphQLObjectTypeExtensions<TSource, TContext>>; + extensionASTNodes: ReadonlyArray<ObjectTypeExtensionNode>; +} +/** + * Resolves the concrete object type for an abstract GraphQL type. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + */ +export type GraphQLTypeResolver<TSource, TContext> = (value: TSource, context: TContext, info: GraphQLResolveInfo, abstractType: GraphQLAbstractType) => PromiseOrValue<string | undefined>; +/** + * Checks whether a runtime value belongs to a GraphQL object type. + * @typeParam TAbstract - Runtime value type used for abstract type resolution. + * @typeParam TContext - Context object type passed to resolvers. + */ +export type GraphQLIsTypeOfFn<TAbstract, TContext> = (value: TAbstract, context: TContext, info: GraphQLResolveInfo) => PromiseOrValue<boolean>; +/** + * Resolves the runtime value for a GraphQL field. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + * @typeParam TArgs - Argument object type passed to resolvers. + * @typeParam TResult - Result value type. + */ +export type GraphQLFieldResolver<TSource, TContext, TArgs = any, TResult = unknown> = (source: TSource, args: TArgs, context: TContext, info: GraphQLResolveInfo) => TResult; +/** Utilities available from resolver info for tracking asynchronous work. */ +export interface GraphQLResolveInfoHelpers { + /** + * Promise.all wrapper that allows rejected branches to be tracked + * as execution async work. + * + * Intended use: return or await this promise from resolver work. + * Un-awaited async side effects are an anti-pattern: + * + * const { promiseAll } = info.getAsyncHelpers(); + * promiseAll([someAsyncWork(), someOtherAsyncWork()]).catch(() => undefined); + * + * In that anti-pattern, tracking starts only after rejection (on a + * later microtask), so this work is not guaranteed to delay + * `hooks.asyncWorkFinished`. + * + * Use `track(...)` for un-awaited async side effects: + * + * const { track } = info.getAsyncHelpers(); + * track([ + * someAsyncWork().catch(() => undefined), + * someOtherAsyncWork().catch(() => undefined) + * ]); + */ + readonly promiseAll: <T>(values: ReadonlyArray<PromiseLike<T> | T>) => Promise<Array<T>>; + /** Tracks asynchronous work that should delay execution completion hooks. */ + readonly track: (maybePromises: ReadonlyArray<unknown>) => void; +} +/** Information about the currently executing GraphQL field. */ +export interface GraphQLResolveInfo { + /** The field name referenced by this schema coordinate. */ + readonly fieldName: string; + /** AST field nodes that contributed to the current field execution. */ + readonly fieldNodes: ReadonlyArray<FieldNode>; + /** GraphQL output type declared for the current field. */ + readonly returnType: GraphQLOutputType; + /** Object type that owns the current field. */ + readonly parentType: GraphQLObjectType; + /** Response path where this error occurred during execution. */ + readonly path: Path; + /** The schema used for validation or execution. */ + readonly schema: GraphQLSchema; + /** Fragment definitions in the operation document keyed by fragment name. */ + readonly fragments: ObjMap<FragmentDefinitionNode>; + /** Initial root value passed to the operation. */ + readonly rootValue: unknown; + /** The operation selected for execution. */ + readonly operation: OperationDefinitionNode; + /** + * Coerced variable values and source metadata for this operation. Resolver + * code that needs runtime variable values should read `variableValues.coerced`. + */ + readonly variableValues: VariableValues; + /** Returns the AbortSignal supplied for this execution, if any. */ + readonly getAbortSignal: () => AbortSignal | undefined; + /** Returns helper functions for tracking asynchronous resolver work. */ + readonly getAsyncHelpers: () => GraphQLResolveInfoHelpers; +} +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + * We've provided these template arguments because this is an open type and + * you may find them useful. + * @typeParam _TSource - Reserved source type parameter for extension typing. + * @typeParam _TContext - Reserved context type parameter for extension typing. + * @typeParam _TArgs - Reserved argument type parameter for extension typing. + */ +export interface GraphQLFieldExtensions<_TSource, _TContext, _TArgs = any> { + [attributeName: string | symbol]: unknown; +} +/** + * Configuration used to define a GraphQL field. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + * @typeParam TArgs - Argument object type passed to resolvers. + */ +export interface GraphQLFieldConfig<TSource, TContext, TArgs = any> { + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** The GraphQL type reference or runtime type for this element. */ + type: GraphQLOutputType; + /** Arguments accepted by this field or directive. */ + args?: GraphQLFieldConfigArgumentMap | undefined; + /** Resolver function used to produce this field value. */ + resolve?: GraphQLFieldResolver<TSource, TContext, TArgs> | undefined; + /** Resolver function used to create a subscription event stream for this field. */ + subscribe?: GraphQLFieldResolver<TSource, TContext, TArgs> | undefined; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason?: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLFieldExtensions<TSource, TContext, TArgs>>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<FieldDefinitionNode>; +} +interface GraphQLFieldNormalizedConfig<TSource, TContext, TArgs = any> extends GraphQLFieldConfig<TSource, TContext, TArgs> { + args: GraphQLFieldNormalizedConfigArgumentMap; + extensions: Readonly<GraphQLFieldExtensions<TSource, TContext, TArgs>>; +} +/** A map of argument names to argument configuration objects. */ +export type GraphQLFieldConfigArgumentMap = ObjMap<GraphQLArgumentConfig>; +type GraphQLFieldNormalizedConfigArgumentMap = ObjMap<GraphQLArgumentNormalizedConfig>; +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLArgumentExtensions { + [attributeName: string | symbol]: unknown; +} +/** Configuration used to define a GraphQL argument. */ +export interface GraphQLArgumentConfig { + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** The GraphQL type reference or runtime type for this element. */ + type: GraphQLInputType; + /** + * Deprecated legacy default value for this argument. Use `default` instead. + * @deprecated use `default` instead, `defaultValue` will be removed in v18 + */ + defaultValue?: unknown; + /** Default value represented as either a runtime value or a GraphQL literal. */ + default?: GraphQLDefaultInput | undefined; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason?: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLArgumentExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<InputValueDefinitionNode>; +} +interface GraphQLArgumentNormalizedConfig extends GraphQLArgumentConfig { + default: GraphQLDefaultInput | undefined; + extensions: Readonly<GraphQLArgumentExtensions>; +} +/** + * A map of field names to field configuration objects. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + */ +export type GraphQLFieldConfigMap<TSource, TContext> = ObjMap<GraphQLFieldConfig<TSource, TContext>>; +type GraphQLFieldNormalizedConfigMap<TSource, TContext> = ObjMap<GraphQLFieldNormalizedConfig<TSource, TContext>>; +/** + * A resolved GraphQL field definition. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + * @typeParam TArgs - Argument object type passed to resolvers. + */ +export declare class GraphQLField<TSource = any, TContext = any, TArgs = any> implements GraphQLSchemaElement { + /** Object or interface type that owns this field, if known. */ + parentType: GraphQLObjectType<TSource, TContext> | GraphQLInterfaceType<TSource, TContext> | undefined; + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** The GraphQL type reference or runtime type for this element. */ + type: GraphQLOutputType; + /** Arguments accepted by this field or directive. */ + args: ReadonlyArray<GraphQLArgument>; + /** Resolver function used to produce this field value. */ + resolve?: GraphQLFieldResolver<TSource, TContext, TArgs> | undefined; + /** Resolver function used to create a subscription event stream for this field. */ + subscribe?: GraphQLFieldResolver<TSource, TContext, TArgs> | undefined; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLFieldExtensions<TSource, TContext, TArgs>>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<FieldDefinitionNode>; + /** + * Creates a resolved GraphQL field definition. + * @param parentType - Object or interface type that owns this field, if known. + * @param name - Field name. + * @param config - Field configuration. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { GraphQLField, GraphQLObjectType, GraphQLString } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const document = parse('type Query { greeting: String }'); + * const fieldNode = document.definitions[0].fields[0]; + * const field = new GraphQLField(Query, 'greeting', { + * description: 'Greeting text.', + * type: GraphQLString, + * args: { + * name: { type: GraphQLString, default: { value: 'world' } }, + * }, + * resolve: (_source, { name }) => `Hello, ${name}!`, + * subscribe: async function* () { + * yield { greeting: 'Hello!' }; + * }, + * deprecationReason: 'Use hello.', + * extensions: { cacheSeconds: 60 }, + * astNode: fieldNode, + * }); + * + * field.parentType; // => Query + * field.name; // => 'greeting' + * field.args[0].default.value; // => 'world' + * typeof field.subscribe; // => 'function' + * field.deprecationReason; // => 'Use hello.' + * field.astNode; // => fieldNode + * ``` + */ + constructor(parentType: GraphQLObjectType<TSource, TContext> | GraphQLInterfaceType<TSource, TContext> | undefined, name: string, config: GraphQLFieldConfig<TSource, TContext, TArgs>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns a normalized configuration object for this field. + * @returns A configuration object that can be used to recreate this field. + * @example + * ```ts + * import { GraphQLField, GraphQLObjectType, GraphQLString } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const field = new GraphQLField(Query, 'greeting', { + * type: GraphQLString, + * extensions: { cacheSeconds: 60 }, + * }); + * + * field.toConfig().type; // => GraphQLString + * field.toConfig().extensions; // => { cacheSeconds: 60 } + * ``` + */ + toConfig(): GraphQLFieldNormalizedConfig<TSource, TContext, TArgs>; + /** + * Returns this field as a schema coordinate string. + * @returns The field coordinate. + * @example + * ```ts + * import { GraphQLField, GraphQLObjectType, GraphQLString } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const field = new GraphQLField(Query, 'greeting', { type: GraphQLString }); + * + * field.toString(); // => 'Query.greeting' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The field coordinate. + * @example + * ```ts + * import { GraphQLField, GraphQLObjectType, GraphQLString } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const field = new GraphQLField(Query, 'greeting', { type: GraphQLString }); + * + * JSON.stringify(field); // => '"Query.greeting"' + * ``` + */ + toJSON(): string; +} +/** A resolved GraphQL argument definition. */ +export declare class GraphQLArgument implements GraphQLSchemaElement { + /** Field or directive that owns this argument. */ + parent: GraphQLField | GraphQLDirective; + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** The GraphQL type reference or runtime type for this element. */ + type: GraphQLInputType; + /** + * Deprecated legacy default value used when no explicit value is supplied. + * Use `default` instead. + * @deprecated use `default` instead, `defaultValue` will be removed in v18 + */ + defaultValue: unknown; + /** Default value represented as either a runtime value or a GraphQL literal. */ + default: GraphQLDefaultInput | undefined; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLArgumentExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<InputValueDefinitionNode>; + /** + * Creates a resolved GraphQL argument definition. + * @param parent - Field or directive that owns this argument. + * @param name - Argument name. + * @param config - Argument configuration. + * @example + * ```ts + * import { + * GraphQLArgument, + * GraphQLField, + * GraphQLObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const field = new GraphQLField(Query, 'greeting', { type: GraphQLString }); + * const arg = new GraphQLArgument(field, 'name', { + * type: GraphQLString, + * default: { value: 'world' }, + * }); + * + * arg.parent; // => field + * arg.name; // => 'name' + * arg.default.value; // => 'world' + * ``` + */ + constructor(parent: GraphQLField | GraphQLDirective, name: string, config: GraphQLArgumentConfig); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns a normalized configuration object for this argument. + * @returns A configuration object that can be used to recreate this argument. + * @example + * ```ts + * import { + * GraphQLArgument, + * GraphQLField, + * GraphQLObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const field = new GraphQLField(Query, 'greeting', { type: GraphQLString }); + * const arg = new GraphQLArgument(field, 'name', { + * type: GraphQLString, + * default: { value: 'world' }, + * }); + * + * arg.toConfig().default.value; // => 'world' + * ``` + */ + toConfig(): GraphQLArgumentNormalizedConfig; + /** + * Returns this argument as a schema coordinate string. + * @returns The argument coordinate. + * @example + * ```ts + * import { + * GraphQLArgument, + * GraphQLField, + * GraphQLObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const field = new GraphQLField(Query, 'greeting', { type: GraphQLString }); + * const arg = new GraphQLArgument(field, 'name', { type: GraphQLString }); + * + * arg.toString(); // => 'Query.greeting(name:)' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The argument coordinate. + * @example + * ```ts + * import { + * GraphQLArgument, + * GraphQLField, + * GraphQLObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const field = new GraphQLField(Query, 'greeting', { type: GraphQLString }); + * const arg = new GraphQLArgument(field, 'name', { type: GraphQLString }); + * + * JSON.stringify(arg); // => '"Query.greeting(name:)"' + * ``` + */ + toJSON(): string; +} +/** + * Returns true when the argument is non-null and has no default value. + * @param arg - The argument definition to inspect. + * @returns True when the argument is non-null and has no default value. + * @example + * ```ts + * import { + * GraphQLArgument, + * GraphQLField, + * GraphQLInt, + * GraphQLNonNull, + * GraphQLObjectType, + * GraphQLString, + * isRequiredArgument, + * } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ name: 'Query', fields: {} }); + * const field = new GraphQLField(Query, 'reviews', { type: GraphQLString }); + * const requiredArgument = new GraphQLArgument(field, 'id', { + * type: new GraphQLNonNull(GraphQLInt), + * }); + * const optionalArgument = new GraphQLArgument(field, 'name', { + * type: GraphQLString, + * }); + * const argumentWithDefault = new GraphQLArgument(field, 'limit', { + * type: new GraphQLNonNull(GraphQLInt), + * default: { value: 10 }, + * }); + * + * isRequiredArgument(requiredArgument); // => true + * isRequiredArgument(optionalArgument); // => false + * isRequiredArgument(argumentWithDefault); // => false + * ``` + */ +export declare function isRequiredArgument(arg: GraphQLArgument | GraphQLVariableSignature): boolean; +/** + * A map of field names to resolved field definitions. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + */ +export type GraphQLFieldMap<TSource, TContext> = ObjMap<GraphQLField<TSource, TContext>>; +/** Default input represented as either a runtime value or a GraphQL literal. */ +export type GraphQLDefaultInput = { + /** Runtime default value. */ + value: unknown; + /** GraphQL literal default value is not provided in this variant. */ + literal?: never; +} | { + /** GraphQL literal default value. */ + literal: ConstValueNode; + /** Runtime default value is not provided in this variant. */ + value?: never; +}; +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLInterfaceTypeExtensions { + [attributeName: string | symbol]: unknown; +} +/** + * Interface Type Definition + * + * When a field can return one of a heterogeneous set of types, a Interface type + * is used to describe what types are possible, what fields are in common across + * all types, as well as a function to determine which type is actually used + * when the field is resolved. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + * @example + * ```ts + * const EntityType = new GraphQLInterfaceType({ + * name: 'Entity', + * fields: { + * name: { type: GraphQLString }, + * }, + * }); + * ``` + */ +export declare class GraphQLInterfaceType<TSource = any, TContext = any> implements GraphQLSchemaElement { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** Function that resolves the concrete object type for this abstract type. */ + resolveType: Maybe<GraphQLTypeResolver<TSource, TContext>>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLInterfaceTypeExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<InterfaceTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes: ReadonlyArray<InterfaceTypeExtensionNode>; + private _fields; + private _interfaces; + /** + * Creates a GraphQLInterfaceType instance. + * @param config - Configuration describing this object. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { GraphQLID, GraphQLInterfaceType, GraphQLNonNull } from 'graphql/type'; + * + * const document = parse(` + * interface Node { + * id: ID! + * } + * + * interface Resource implements Node { + * id: ID! + * } + * + * extend interface Resource { + * url: String + * } + * `); + * + * const Node = new GraphQLInterfaceType({ + * name: 'Node', + * fields: { + * id: { type: new GraphQLNonNull(GraphQLID) }, + * }, + * }); + * + * const Resource = new GraphQLInterfaceType({ + * name: 'Resource', + * description: 'An addressable resource.', + * interfaces: [Node], + * fields: { + * id: { type: new GraphQLNonNull(GraphQLID) }, + * }, + * resolveType: (value) => { + * return typeof value === 'object' && value != null && 'url' in value + * ? 'WebPage' + * : null; + * }, + * extensions: { abstract: true }, + * astNode: document.definitions[1], + * extensionASTNodes: [document.definitions[2]], + * }); + * + * Resource.name; // => 'Resource' + * Resource.getInterfaces(); // => [Node] + * Object.keys(Resource.getFields()); // => ['id'] + * Resource.extensions; // => { abstract: true } + * ``` + */ + constructor(config: Readonly<GraphQLInterfaceTypeConfig<TSource, TContext>>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns the fields defined by this type. + * @returns The fields keyed by field name. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInterfaceType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Query { + * node: Node + * } + * `); + * + * const Node = assertInterfaceType(schema.getType('Node')); + * const fields = Node.getFields(); + * + * Object.keys(fields); // => ['id'] + * String(fields.id.type); // => 'ID!' + * ``` + */ + getFields(): GraphQLFieldMap<TSource, TContext>; + /** + * Returns the interfaces implemented by this type. + * @returns The implemented interfaces. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInterfaceType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Resource { + * url: String! + * } + * + * interface Image implements Resource { + * url: String! + * width: Int + * } + * + * type Photo implements Resource & Image { + * url: String! + * width: Int + * } + * + * type Query { + * image: Image + * } + * `); + * + * const Image = assertInterfaceType(schema.getType('Image')); + * + * Image.getInterfaces().map((type) => type.name); // => ['Resource'] + * ``` + */ + getInterfaces(): ReadonlyArray<GraphQLInterfaceType>; + /** + * Returns a normalized configuration object for this object. + * @returns A configuration object that can be used to recreate this object. + * @example + * ```ts + * import { GraphQLID, GraphQLInterfaceType, GraphQLNonNull } from 'graphql/type'; + * + * const Node = new GraphQLInterfaceType({ + * name: 'Node', + * fields: { + * id: { type: new GraphQLNonNull(GraphQLID) }, + * }, + * }); + * + * const config = Node.toConfig(); + * const NodeCopy = new GraphQLInterfaceType(config); + * + * String(config.fields.id.type); // => 'ID!' + * String(NodeCopy.getFields().id.type); // => 'ID!' + * ``` + */ + toConfig(): GraphQLInterfaceTypeNormalizedConfig<TSource, TContext>; + /** + * Returns the schema coordinate identifying this interface type. + * @returns The schema coordinate for this interface type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInterfaceType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Query { + * node: Node + * } + * `); + * + * const Node = assertInterfaceType(schema.getType('Node')); + * + * Node.toString(); // => 'Node' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { GraphQLInterfaceType, GraphQLString } from 'graphql/type'; + * + * const Named = new GraphQLInterfaceType({ + * name: 'Named', + * fields: { name: { type: GraphQLString } }, + * }); + * + * Named.toJSON(); // => 'Named' + * JSON.stringify({ type: Named }); // => '{"type":"Named"}' + * ``` + */ + toJSON(): string; +} +/** + * Configuration used to construct a GraphQLInterfaceType. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + */ +export interface GraphQLInterfaceTypeConfig<TSource, TContext> { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** Interfaces implemented by this object or interface type. */ + interfaces?: ThunkReadonlyArray<GraphQLInterfaceType> | undefined; + /** Fields declared by this object, interface, input object, or literal. */ + fields: ThunkObjMap<GraphQLFieldConfig<TSource, TContext>>; + /** + * Optionally provide a custom type resolver function. If one is not provided, + * the default implementation will call `isTypeOf` on each implementing + * Object type. + */ + resolveType?: Maybe<GraphQLTypeResolver<TSource, TContext>>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLInterfaceTypeExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<InterfaceTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes?: Maybe<ReadonlyArray<InterfaceTypeExtensionNode>>; +} +interface GraphQLInterfaceTypeNormalizedConfig<TSource, TContext> extends GraphQLInterfaceTypeConfig<TSource, TContext> { + interfaces: ReadonlyArray<GraphQLInterfaceType>; + fields: GraphQLFieldNormalizedConfigMap<TSource, TContext>; + extensions: Readonly<GraphQLInterfaceTypeExtensions>; + extensionASTNodes: ReadonlyArray<InterfaceTypeExtensionNode>; +} +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLUnionTypeExtensions { + [attributeName: string | symbol]: unknown; +} +/** + * Union Type Definition + * + * When a field can return one of a heterogeneous set of types, a Union type + * is used to describe what types are possible as well as providing a function + * to determine which type is actually used when the field is resolved. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + * @example + * ```ts + * const PetType = new GraphQLUnionType({ + * name: 'Pet', + * types: [DogType, CatType], + * resolveType: (value) => { + * if (value instanceof Dog) { + * return DogType; + * } + * if (value instanceof Cat) { + * return CatType; + * } + * }, + * }); + * ``` + */ +export declare class GraphQLUnionType<TSource = any, TContext = any> implements GraphQLSchemaElement { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** Function that resolves the concrete object type for this abstract type. */ + resolveType: Maybe<GraphQLTypeResolver<TSource, TContext>>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLUnionTypeExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<UnionTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes: ReadonlyArray<UnionTypeExtensionNode>; + private _types; + /** + * Creates a GraphQLUnionType instance. + * @param config - Configuration describing this object. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { + * GraphQLObjectType, + * GraphQLString, + * GraphQLUnionType, + * } from 'graphql/type'; + * + * const document = parse(` + * union Media = Photo | Video + * + * extend union Media = Audio + * `); + * + * const Photo = new GraphQLObjectType({ + * name: 'Photo', + * fields: { url: { type: GraphQLString } }, + * }); + * const Video = new GraphQLObjectType({ + * name: 'Video', + * fields: { url: { type: GraphQLString } }, + * }); + * + * const Media = new GraphQLUnionType({ + * name: 'Media', + * description: 'Media that can appear in a search result.', + * types: [Photo, Video], + * resolveType: (value) => { + * return typeof value === 'object' && value != null && 'duration' in value + * ? 'Video' + * : 'Photo'; + * }, + * extensions: { searchable: true }, + * astNode: document.definitions[0], + * extensionASTNodes: [document.definitions[1]], + * }); + * + * Media.description; // => 'Media that can appear in a search result.' + * Media.getTypes().map((type) => type.name); // => ['Photo', 'Video'] + * Media.extensions; // => { searchable: true } + * ``` + */ + constructor(config: Readonly<GraphQLUnionTypeConfig<TSource, TContext>>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns the object types included in this union. + * @returns The union member object types. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertUnionType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Photo { + * url: String! + * } + * + * type Video { + * url: String! + * } + * + * union Media = Photo | Video + * + * type Query { + * media: [Media] + * } + * `); + * + * const Media = assertUnionType(schema.getType('Media')); + * + * Media.getTypes().map((type) => type.name); // => ['Photo', 'Video'] + * ``` + */ + getTypes(): ReadonlyArray<GraphQLObjectType>; + /** + * Returns a normalized configuration object for this object. + * @returns A configuration object that can be used to recreate this object. + * @example + * ```ts + * import { + * GraphQLObjectType, + * GraphQLString, + * GraphQLUnionType, + * } from 'graphql/type'; + * + * const Photo = new GraphQLObjectType({ + * name: 'Photo', + * fields: { url: { type: GraphQLString } }, + * }); + * const Video = new GraphQLObjectType({ + * name: 'Video', + * fields: { url: { type: GraphQLString } }, + * }); + * const Media = new GraphQLUnionType({ + * name: 'Media', + * types: [Photo, Video], + * }); + * + * const config = Media.toConfig(); + * const MediaCopy = new GraphQLUnionType(config); + * + * MediaCopy.getTypes().map((type) => type.name); // => ['Photo', 'Video'] + * ``` + */ + toConfig(): GraphQLUnionTypeNormalizedConfig<TSource, TContext>; + /** + * Returns the schema coordinate identifying this union type. + * @returns The schema coordinate for this union type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertUnionType } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Photo { + * url: String! + * } + * + * union SearchResult = Photo + * + * type Query { + * search: [SearchResult] + * } + * `); + * + * const SearchResult = assertUnionType(schema.getType('SearchResult')); + * + * SearchResult.toString(); // => 'SearchResult' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { + * GraphQLObjectType, + * GraphQLString, + * GraphQLUnionType, + * } from 'graphql/type'; + * + * const Photo = new GraphQLObjectType({ + * name: 'Photo', + * fields: { url: { type: GraphQLString } }, + * }); + * const SearchResult = new GraphQLUnionType({ + * name: 'SearchResult', + * types: [Photo], + * }); + * + * SearchResult.toJSON(); // => 'SearchResult' + * JSON.stringify({ type: SearchResult }); // => '{"type":"SearchResult"}' + * ``` + */ + toJSON(): string; +} +/** + * Configuration used to construct a GraphQLUnionType. + * @typeParam TSource - Source object type passed to resolvers. + * @typeParam TContext - Context object type passed to resolvers. + */ +export interface GraphQLUnionTypeConfig<TSource, TContext> { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** Object types that belong to this union type. */ + types: ThunkReadonlyArray<GraphQLObjectType>; + /** + * Optionally provide a custom type resolver function. If one is not provided, + * the default implementation will call `isTypeOf` on each implementing + * Object type. + */ + resolveType?: Maybe<GraphQLTypeResolver<TSource, TContext>>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLUnionTypeExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<UnionTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes?: Maybe<ReadonlyArray<UnionTypeExtensionNode>>; +} +interface GraphQLUnionTypeNormalizedConfig<TSource, TContext> extends GraphQLUnionTypeConfig<TSource, TContext> { + types: ReadonlyArray<GraphQLObjectType>; + extensions: Readonly<GraphQLUnionTypeExtensions>; + extensionASTNodes: ReadonlyArray<UnionTypeExtensionNode>; +} +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLEnumTypeExtensions { + [attributeName: string | symbol]: unknown; +} +/** + * Enum Type Definition + * + * Enum types define leaf values whose serialized form is one of a fixed set + * of GraphQL enum names. Internally, enum values can map to any runtime value, + * often integers. + * @example + * ```ts + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGBType = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * RGBType.getValue('GREEN')?.value; // => 1 + * ``` + * + * Note: If a value is not provided in a definition, the name of the enum value + * will be used as its internal value. + */ +export declare class GraphQLEnumType /* <T> *//* <T> */ implements GraphQLSchemaElement { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLEnumTypeExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<EnumTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes: ReadonlyArray<EnumTypeExtensionNode>; + private _values; + private _valueLookup; + private _nameLookup; + /** + * Creates a GraphQLEnumType instance. + * @param config - Configuration describing this object. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { GraphQLEnumType } from 'graphql/type'; + * + * const document = parse(` + * enum Episode { + * NEW_HOPE + * EMPIRE + * JEDI + * } + * + * extend enum Episode { + * FORCE_AWAKENS + * } + * `); + * const definition = document.definitions[0]; + * + * const Episode = new GraphQLEnumType({ + * name: 'Episode', + * description: 'A Star Wars film episode.', + * values: { + * NEW_HOPE: { + * value: 4, + * description: 'Released in 1977.', + * extensions: { trilogy: 'original' }, + * astNode: definition.values[0], + * }, + * EMPIRE: { value: 5, astNode: definition.values[1] }, + * JEDI: { + * value: 6, + * deprecationReason: 'Use RETURN_OF_THE_JEDI.', + * astNode: definition.values[2], + * }, + * }, + * extensions: { catalog: 'films' }, + * astNode: definition, + * extensionASTNodes: [document.definitions[1]], + * }); + * + * Episode.description; // => 'A Star Wars film episode.' + * Episode.coerceOutputValue(5); // => 'EMPIRE' + * Episode.coerceInputValue('JEDI'); // => 6 + * Episode.getValue('JEDI').deprecationReason; // => 'Use RETURN_OF_THE_JEDI.' + * Episode.extensions; // => { catalog: 'films' } + * ``` + */ + constructor(config: Readonly<GraphQLEnumTypeConfig>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns the values defined by this enum type. + * @returns Enum value definitions in schema order. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertEnumType } from 'graphql/type'; + * + * const schema = buildSchema(` + * enum Episode { + * NEW_HOPE + * EMPIRE + * JEDI + * } + * + * type Query { + * episode: Episode + * } + * `); + * + * const Episode = assertEnumType(schema.getType('Episode')); + * + * Episode.getValues().map((value) => value.name); // => ['NEW_HOPE', 'EMPIRE', 'JEDI'] + * ``` + */ + getValues(): ReadonlyArray<GraphQLEnumValue>; + /** + * Returns the enum value definition for a value name. + * @param name - The GraphQL name to look up. + * @returns The matching enum value definition, if it exists. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertEnumType } from 'graphql/type'; + * + * const schema = buildSchema(` + * enum Episode { + * NEW_HOPE + * EMPIRE + * } + * + * type Query { + * episode: Episode + * } + * `); + * + * const Episode = assertEnumType(schema.getType('Episode')); + * + * Episode.getValue('EMPIRE')?.name; // => 'EMPIRE' + * Episode.getValue('JEDI'); // => undefined + * ``` + */ + getValue(name: string): Maybe<GraphQLEnumValue>; + /** + * Serializes a runtime enum value as a GraphQL enum name. + * @param outputValue - Runtime enum value to serialize. + * @returns The GraphQL enum name for the runtime value. + * + * This deprecated method delegates to `coerceOutputValue()`; call + * `coerceOutputValue()` directly instead. + * @example + * ```ts + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGB = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * RGB.serialize(1); // => 'GREEN' + * RGB.serialize(3); // throws an error + * ``` + * @deprecated use `coerceOutputValue()` instead, `serialize()` will be removed in v18 + */ + serialize(outputValue: unknown): Maybe<string>; + /** + * Coerces a runtime enum value to a GraphQL enum name. + * @param outputValue - Runtime enum value to coerce. + * @returns The GraphQL enum name for the runtime value. + * @example + * ```ts + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGB = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * RGB.coerceOutputValue(1); // => 'GREEN' + * RGB.coerceOutputValue(3); // throws an error + * ``` + */ + coerceOutputValue(outputValue: unknown): Maybe<string>; + /** + * Deprecated legacy enum parser for externally provided input values. Use + * `coerceInputValue()` instead. + * @param inputValue - External enum name to parse. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @returns The internal runtime value for the enum name. + * @example + * ```ts + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGB = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * RGB.parseValue('BLUE'); // => 2 + * RGB.parseValue('PURPLE', true); // throws an error + * ``` + * @deprecated use `coerceInputValue()` instead, `parseValue()` will be removed in v18 + */ + parseValue(inputValue: unknown, hideSuggestions?: Maybe<boolean>): Maybe<any>; + /** + * Coerces an external enum name to its internal runtime value. + * @param inputValue - External enum name to coerce. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @returns The internal runtime value for the enum name. + * @example + * ```ts + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGB = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * RGB.coerceInputValue('BLUE'); // => 2 + * RGB.coerceInputValue('PURPLE'); // throws an error + * RGB.coerceInputValue(2); // throws an error + * ``` + */ + coerceInputValue(inputValue: unknown, hideSuggestions?: Maybe<boolean>): Maybe<any>; + /** + * Deprecated legacy enum parser for externally provided input literals. Use + * `coerceInputLiteral()` instead. + * @param valueNode - Enum value AST node to parse. + * @param _variables - Deprecated variable values parameter that is no longer used. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @returns The internal runtime value for the enum literal. + * @example + * ```ts + * import { parseValue } from 'graphql/language'; + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGB = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * RGB.parseLiteral(parseValue('RED')); // => 0 + * RGB.parseLiteral(parseValue('"RED"')); // throws an error + * ``` + * @deprecated use `coerceInputLiteral()` instead, `parseLiteral()` will be removed in v18 + */ + parseLiteral(valueNode: ValueNode, _variables: Maybe<ObjMap<unknown>>, hideSuggestions?: Maybe<boolean>): Maybe<any>; + /** + * Coerces an enum value AST node to its internal runtime value. + * @param valueNode - Enum value AST node to coerce. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @returns The internal runtime value for the enum literal. + * @example + * ```ts + * import { parseConstValue } from 'graphql/language'; + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGB = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * RGB.coerceInputLiteral(parseConstValue('RED')); // => 0 + * RGB.coerceInputLiteral(parseConstValue('"RED"'), true); // throws an error + * ``` + */ + coerceInputLiteral(valueNode: ConstValueNode, hideSuggestions?: Maybe<boolean>): Maybe<any>; + /** + * Converts a runtime enum value to a GraphQL enum value AST node. + * @param value - Runtime enum value to convert. + * @returns Enum value AST node, or undefined if the value is invalid. + * @example + * ```ts + * import { print } from 'graphql/language'; + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGB = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * print(RGB.valueToLiteral(2)); // => 'BLUE' + * RGB.valueToLiteral(3); // => undefined + * ``` + */ + valueToLiteral(value: unknown): ConstValueNode | undefined; + /** + * Returns a normalized configuration object for this object. + * @returns A configuration object that can be used to recreate this object. + * @example + * ```ts + * import { GraphQLEnumType } from 'graphql/type'; + * + * const RGB = new GraphQLEnumType({ + * name: 'RGB', + * values: { + * RED: { value: 0 }, + * GREEN: { value: 1 }, + * BLUE: { value: 2 }, + * }, + * }); + * + * const config = RGB.toConfig(); + * const RGBCopy = new GraphQLEnumType(config); + * + * config.values.GREEN.value; // => 1 + * RGBCopy.coerceOutputValue(2); // => 'BLUE' + * ``` + */ + toConfig(): GraphQLEnumTypeNormalizedConfig; + /** + * Returns the schema coordinate identifying this enum type. + * @returns The schema coordinate for this enum type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertEnumType } from 'graphql/type'; + * + * const schema = buildSchema(` + * enum Episode { + * NEW_HOPE + * } + * + * type Query { + * episode: Episode + * } + * `); + * + * const Episode = assertEnumType(schema.getType('Episode')); + * + * Episode.toString(); // => 'Episode' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { GraphQLEnumType } from 'graphql/type'; + * + * const Episode = new GraphQLEnumType({ + * name: 'Episode', + * values: { + * NEW_HOPE: {}, + * }, + * }); + * + * Episode.toJSON(); // => 'Episode' + * JSON.stringify({ type: Episode }); // => '{"type":"Episode"}' + * ``` + */ + toJSON(): string; +} +/** Configuration used to construct a GraphQLEnumType. */ +export interface GraphQLEnumTypeConfig { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** Values contained in this enum, list, or input-object definition. */ + values: ThunkObjMap<GraphQLEnumValueConfig>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLEnumTypeExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<EnumTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes?: Maybe<ReadonlyArray<EnumTypeExtensionNode>>; +} +interface GraphQLEnumTypeNormalizedConfig extends GraphQLEnumTypeConfig { + values: GraphQLEnumValueNormalizedConfigMap; + extensions: Readonly<GraphQLEnumTypeExtensions>; + extensionASTNodes: ReadonlyArray<EnumTypeExtensionNode>; +} +/** A map of enum value names to enum value configuration objects. */ +export type GraphQLEnumValueConfigMap = ObjMap<GraphQLEnumValueConfig>; +type GraphQLEnumValueNormalizedConfigMap = ObjMap<GraphQLEnumValueNormalizedConfig>; +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLEnumValueExtensions { + [attributeName: string | symbol]: unknown; +} +/** Configuration used to define a GraphQL enum value. */ +export interface GraphQLEnumValueConfig { + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** Parsed value represented by this node. */ + value?: any; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason?: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLEnumValueExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<EnumValueDefinitionNode>; +} +interface GraphQLEnumValueNormalizedConfig extends GraphQLEnumValueConfig { + extensions: Readonly<GraphQLEnumValueExtensions>; +} +/** A resolved GraphQL enum value definition. */ +export declare class GraphQLEnumValue implements GraphQLSchemaElement { + /** Enum type that owns this enum value. */ + parentEnum: GraphQLEnumType; + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** Parsed value represented by this node. */ + value: any; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLEnumValueExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<EnumValueDefinitionNode>; + /** + * Creates a resolved GraphQL enum value definition. + * @param parentEnum - Enum type that owns this enum value. + * @param name - Enum value name. + * @param config - Enum value configuration. + * @example + * ```ts + * import { GraphQLEnumType, GraphQLEnumValue } from 'graphql/type'; + * + * const Episode = new GraphQLEnumType({ + * name: 'Episode', + * values: { NEW_HOPE: { value: 4 } }, + * }); + * const enumValue = new GraphQLEnumValue(Episode, 'EMPIRE', { + * value: 5, + * description: 'Released in 1980.', + * }); + * + * enumValue.parentEnum; // => Episode + * enumValue.name; // => 'EMPIRE' + * enumValue.value; // => 5 + * ``` + */ + constructor(parentEnum: GraphQLEnumType, name: string, config: GraphQLEnumValueConfig); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns a normalized configuration object for this enum value. + * @returns A configuration object that can be used to recreate this enum value. + * @example + * ```ts + * import { GraphQLEnumType, GraphQLEnumValue } from 'graphql/type'; + * + * const Episode = new GraphQLEnumType({ + * name: 'Episode', + * values: { NEW_HOPE: { value: 4 } }, + * }); + * const enumValue = new GraphQLEnumValue(Episode, 'EMPIRE', { + * value: 5, + * extensions: { trilogy: 'original' }, + * }); + * + * enumValue.toConfig(); // => { description: undefined, value: 5, deprecationReason: undefined, extensions: { trilogy: 'original' }, astNode: undefined } + * ``` + */ + toConfig(): GraphQLEnumValueNormalizedConfig; + /** + * Returns this enum value as a schema coordinate string. + * @returns Enum value coordinate. + * @example + * ```ts + * import { GraphQLEnumType, GraphQLEnumValue } from 'graphql/type'; + * + * const Episode = new GraphQLEnumType({ + * name: 'Episode', + * values: { NEW_HOPE: { value: 4 } }, + * }); + * const enumValue = new GraphQLEnumValue(Episode, 'EMPIRE', { value: 5 }); + * + * enumValue.toString(); // => 'Episode.EMPIRE' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns Enum value coordinate. + * @example + * ```ts + * import { GraphQLEnumType, GraphQLEnumValue } from 'graphql/type'; + * + * const Episode = new GraphQLEnumType({ + * name: 'Episode', + * values: { NEW_HOPE: { value: 4 } }, + * }); + * const enumValue = new GraphQLEnumValue(Episode, 'EMPIRE', { value: 5 }); + * + * JSON.stringify(enumValue); // => '"Episode.EMPIRE"' + * ``` + */ + toJSON(): string; +} +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLInputObjectTypeExtensions { + [attributeName: string | symbol]: unknown; +} +/** + * Input Object Type Definition + * + * An input object defines a structured collection of fields which may be + * supplied to a field argument. + * + * Using `NonNull` will ensure that a value must be provided by the query + * @example + * ```ts + * const GeoPoint = new GraphQLInputObjectType({ + * name: 'GeoPoint', + * fields: { + * lat: { type: new GraphQLNonNull(GraphQLFloat) }, + * lon: { type: new GraphQLNonNull(GraphQLFloat) }, + * alt: { type: GraphQLFloat, default: { value: 0 } }, + * }, + * }); + * ``` + */ +export declare class GraphQLInputObjectType implements GraphQLSchemaElement { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLInputObjectTypeExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<InputObjectTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes: ReadonlyArray<InputObjectTypeExtensionNode>; + /** Whether this input object uses the experimental OneOf input object semantics. */ + isOneOf: boolean; + private _fields; + /** + * Creates a GraphQLInputObjectType instance. + * @param config - Configuration describing this object. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { + * GraphQLID, + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLNonNull, + * GraphQLString, + * } from 'graphql/type'; + * + * const document = parse(` + * input ReviewInput { + * stars: Int! + * commentary: String + * } + * + * extend input ReviewInput { + * body: String + * } + * `); + * const definition = document.definitions[0]; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * description: 'Input collected when reviewing a product.', + * fields: { + * stars: { + * description: 'Star rating from one to five.', + * type: new GraphQLNonNull(GraphQLInt), + * extensions: { min: 1, max: 5 }, + * astNode: definition.fields[0], + * }, + * commentary: { + * type: GraphQLString, + * default: { value: '' }, + * deprecationReason: 'Use body.', + * astNode: definition.fields[1], + * }, + * }, + * extensions: { form: 'review' }, + * astNode: definition, + * extensionASTNodes: [document.definitions[1]], + * isOneOf: false, + * }); + * const SearchBy = new GraphQLInputObjectType({ + * name: 'SearchBy', + * fields: { + * id: { type: GraphQLID }, + * slug: { type: GraphQLString }, + * }, + * isOneOf: true, + * }); + * + * const fields = ReviewInput.getFields(); + * + * ReviewInput.description; // => 'Input collected when reviewing a product.' + * String(fields.stars.type); // => 'Int!' + * fields.stars.extensions; // => { min: 1, max: 5 } + * fields.commentary.default.value; // => '' + * fields.commentary.deprecationReason; // => 'Use body.' + * ReviewInput.isOneOf; // => false + * SearchBy.isOneOf; // => true + * ``` + */ + constructor(config: Readonly<GraphQLInputObjectTypeConfig>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns the fields defined by this type. + * @returns The fields keyed by field name. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInputObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * commentary: String = "" + * } + * + * type Query { + * reviews(filter: ReviewInput): [String] + * } + * `); + * + * const ReviewInput = assertInputObjectType(schema.getType('ReviewInput')); + * const fields = ReviewInput.getFields(); + * + * Object.keys(fields); // => ['stars', 'commentary'] + * fields.commentary.default; // => { literal: { kind: 'StringValue', value: '' } } + * ``` + */ + getFields(): GraphQLInputFieldMap; + /** + * Returns a normalized configuration object for this object. + * @returns A configuration object that can be used to recreate this object. + * @example + * ```ts + * import { + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLNonNull, + * } from 'graphql/type'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * stars: { type: new GraphQLNonNull(GraphQLInt) }, + * }, + * }); + * + * const config = ReviewInput.toConfig(); + * const ReviewInputCopy = new GraphQLInputObjectType(config); + * + * String(config.fields.stars.type); // => 'Int!' + * String(ReviewInputCopy.getFields().stars.type); // => 'Int!' + * ``` + */ + toConfig(): GraphQLInputObjectTypeNormalizedConfig; + /** + * Returns the schema coordinate identifying this input object type. + * @returns The schema coordinate for this input object type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInputObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * input ReviewInput { + * stars: Int! + * } + * + * type Query { + * reviews(filter: ReviewInput): [String] + * } + * `); + * + * const ReviewInput = assertInputObjectType(schema.getType('ReviewInput')); + * + * ReviewInput.toString(); // => 'ReviewInput' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The JSON-serializable representation. + * @example + * ```ts + * import { GraphQLInputObjectType, GraphQLString } from 'graphql/type'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * commentary: { type: GraphQLString }, + * }, + * }); + * + * ReviewInput.toJSON(); // => 'ReviewInput' + * JSON.stringify({ type: ReviewInput }); // => '{"type":"ReviewInput"}' + * ``` + */ + toJSON(): string; +} +/** Configuration used to construct a GraphQLInputObjectType. */ +export interface GraphQLInputObjectTypeConfig { + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** Fields declared by this object, interface, input object, or literal. */ + fields: ThunkObjMap<GraphQLInputFieldConfig>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLInputObjectTypeExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<InputObjectTypeDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes?: Maybe<ReadonlyArray<InputObjectTypeExtensionNode>>; + /** Whether this input object uses the experimental OneOf input object semantics. */ + isOneOf?: boolean; +} +interface GraphQLInputObjectTypeNormalizedConfig extends GraphQLInputObjectTypeConfig { + fields: GraphQLInputFieldNormalizedConfigMap; + extensions: Readonly<GraphQLInputObjectTypeExtensions>; + extensionASTNodes: ReadonlyArray<InputObjectTypeExtensionNode>; +} +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLInputFieldExtensions { + [attributeName: string | symbol]: unknown; +} +/** Configuration used to define a GraphQL input field. */ +export interface GraphQLInputFieldConfig { + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** The GraphQL type reference or runtime type for this element. */ + type: GraphQLInputType; + /** + * Deprecated legacy default value for this input field. Use `default` + * instead. + * @deprecated use `default` instead, `defaultValue` will be removed in v18 + */ + defaultValue?: unknown; + /** Default value represented as either a runtime value or a GraphQL literal. */ + default?: GraphQLDefaultInput | undefined; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason?: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLInputFieldExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<InputValueDefinitionNode>; +} +/** A map of input field names to input field configuration objects. */ +export type GraphQLInputFieldConfigMap = ObjMap<GraphQLInputFieldConfig>; +interface GraphQLInputFieldNormalizedConfig extends GraphQLInputFieldConfig { + default: GraphQLDefaultInput | undefined; + extensions: Readonly<GraphQLInputFieldExtensions>; +} +type GraphQLInputFieldNormalizedConfigMap = ObjMap<GraphQLInputFieldNormalizedConfig>; +/** A resolved GraphQL input field definition. */ +export declare class GraphQLInputField implements GraphQLSchemaElement { + /** Input object type that owns this input field. */ + parentType: GraphQLInputObjectType; + /** The GraphQL name for this schema element. */ + name: string; + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** The GraphQL type reference or runtime type for this element. */ + type: GraphQLInputType; + /** + * Deprecated legacy default value used when no explicit value is supplied. + * Use `default` instead. + * @deprecated use `default` instead, `defaultValue` will be removed in v18 + */ + defaultValue: unknown; + /** Default value represented as either a runtime value or a GraphQL literal. */ + default: GraphQLDefaultInput | undefined; + /** Reason this element is deprecated, if one was provided. */ + deprecationReason: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLInputFieldExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<InputValueDefinitionNode>; + /** + * Creates a resolved GraphQL input field definition. + * @param parentType - Input object type that owns this field. + * @param name - Input field name. + * @param config - Input field configuration. + * @example + * ```ts + * import { + * GraphQLInputField, + * GraphQLInputObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: {}, + * }); + * const field = new GraphQLInputField(ReviewInput, 'commentary', { + * type: GraphQLString, + * default: { value: '' }, + * }); + * + * field.parentType; // => ReviewInput + * field.name; // => 'commentary' + * field.default.value; // => '' + * ``` + */ + constructor(parentType: GraphQLInputObjectType, name: string, config: GraphQLInputFieldConfig); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns a normalized configuration object for this input field. + * @returns A configuration object that can be used to recreate this input field. + * @example + * ```ts + * import { + * GraphQLInputField, + * GraphQLInputObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: {}, + * }); + * const field = new GraphQLInputField(ReviewInput, 'commentary', { + * type: GraphQLString, + * extensions: { form: 'review' }, + * }); + * + * field.toConfig().extensions; // => { form: 'review' } + * ``` + */ + toConfig(): GraphQLInputFieldNormalizedConfig; + /** + * Returns this input field as a schema coordinate string. + * @returns The input field coordinate. + * @example + * ```ts + * import { + * GraphQLInputField, + * GraphQLInputObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: {}, + * }); + * const field = new GraphQLInputField(ReviewInput, 'commentary', { + * type: GraphQLString, + * }); + * + * field.toString(); // => 'ReviewInput.commentary' + * ``` + */ + toString(): string; + /** + * Returns the JSON representation used when this object is serialized. + * @returns The input field coordinate. + * @example + * ```ts + * import { + * GraphQLInputField, + * GraphQLInputObjectType, + * GraphQLString, + * } from 'graphql/type'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: {}, + * }); + * const field = new GraphQLInputField(ReviewInput, 'commentary', { + * type: GraphQLString, + * }); + * + * JSON.stringify(field); // => '"ReviewInput.commentary"' + * ``` + */ + toJSON(): string; +} +/** + * Returns true when the input field is non-null and has no default value. + * @param field - The input field definition to inspect. + * @returns True when the input field is non-null and has no default value. + * @example + * ```ts + * import { + * GraphQLInputField, + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLNonNull, + * GraphQLString, + * isRequiredInputField, + * } from 'graphql/type'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: {}, + * }); + * const requiredField = new GraphQLInputField(ReviewInput, 'id', { + * type: new GraphQLNonNull(GraphQLInt), + * }); + * const optionalField = new GraphQLInputField(ReviewInput, 'name', { + * type: GraphQLString, + * }); + * const fieldWithDefault = new GraphQLInputField(ReviewInput, 'limit', { + * type: new GraphQLNonNull(GraphQLInt), + * default: { value: 10 }, + * }); + * + * isRequiredInputField(requiredField); // => true + * isRequiredInputField(optionalField); // => false + * isRequiredInputField(fieldWithDefault); // => false + * ``` + */ +export declare function isRequiredInputField(field: GraphQLInputField): boolean; +/** A map of input field names to resolved input field definitions. */ +export type GraphQLInputFieldMap = ObjMap<GraphQLInputField>; +/** + * Test if the given value is a GraphQL schema. + * @param schema - Value to inspect. + * @returns True when the value is a GraphQLSchema. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { GraphQLString, isSchema } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * + * isSchema(schema); // => true + * isSchema(GraphQLString); // => false + * ``` + */ +export declare function isSchema(schema: unknown): schema is GraphQLSchema; +/** + * Returns the value as a GraphQLSchema, or throws if it is not a schema. + * @param schema - GraphQL schema to use. + * @returns The value typed as a GraphQLSchema. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertSchema, GraphQLString } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * + * assertSchema(schema); // => schema + * assertSchema(GraphQLString); // throws an error + * ``` + */ +export declare function assertSchema(schema: unknown): GraphQLSchema; +/** + * Custom extensions + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ +export interface GraphQLSchemaExtensions { + [attributeName: string | symbol]: unknown; +} +/** + * Schema Definition + * + * A Schema is created by supplying the root types of each type of operation, + * query and mutation (optional). A schema definition is then supplied to the + * validator and executor. + * @example + * ```ts + * const MyAppQueryRootType = new GraphQLObjectType({ + * name: 'Query', + * fields: { + * greeting: { type: GraphQLString }, + * }, + * }); + * + * const MyAppMutationRootType = new GraphQLObjectType({ + * name: 'Mutation', + * fields: { + * setGreeting: { type: GraphQLString }, + * }, + * }); + * + * const MyAppSchema = new GraphQLSchema({ + * query: MyAppQueryRootType, + * mutation: MyAppMutationRootType, + * }); + * ``` + * @example + * When the schema is constructed, by default only the types that are reachable + * by traversing the root types are included, other types must be explicitly + * referenced. + * + * ```ts + * const characterInterface = new GraphQLInterfaceType({ + * name: 'Character', + * fields: { + * name: { type: GraphQLString }, + * }, + * }); + * + * const humanType = new GraphQLObjectType({ + * name: 'Human', + * interfaces: [characterInterface], + * fields: { + * name: { type: GraphQLString }, + * }, + * }); + * + * const droidType = new GraphQLObjectType({ + * name: 'Droid', + * interfaces: [characterInterface], + * fields: { + * name: { type: GraphQLString }, + * }, + * }); + * + * const schema = new GraphQLSchema({ + * query: new GraphQLObjectType({ + * name: 'Query', + * fields: { + * hero: { type: characterInterface }, + * }, + * }), + * // Since this schema references only the `Character` interface it's + * // necessary to explicitly list the types that implement it if + * // you want them to be included in the final schema. + * types: [humanType, droidType], + * }); + * ``` + * @example + * If an array of `directives` are provided to GraphQLSchema, that will be the + * exact list of directives represented and allowed. If `directives` is not + * provided then a default set of the specified directives (e.g. `@include` and + * `@skip`) will be used. If you wish to provide *additional* directives to + * these specified directives, you must explicitly declare them. + * + * ```ts + * const MyAppSchema = new GraphQLSchema({ + * query: MyAppQueryRootType, + * directives: specifiedDirectives.concat([myCustomDirective]), + * }); + * ``` + */ +export declare class GraphQLSchema { + /** Human-readable description for this schema element, if provided. */ + description: Maybe<string>; + /** Custom extension fields reserved for users. */ + extensions: Readonly<GraphQLSchemaExtensions>; + /** AST node from which this schema element was built, if available. */ + astNode: Maybe<SchemaDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes: ReadonlyArray<SchemaExtensionNode>; + /** Whether this schema instance skips validation checks. */ + assumeValid: boolean; + private _queryType; + private _mutationType; + private _subscriptionType; + private _directives; + private _typeMap; + private _subTypeMap; + private _implementationsMap; + /** + * Creates a GraphQLSchema instance. + * @param config - Configuration describing this object. + * @example + * ```ts + * // Create a schema with the required query root. + * import { GraphQLObjectType, GraphQLSchema, GraphQLString } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ + * name: 'Query', + * fields: { + * greeting: { + * type: GraphQLString, + * resolve: () => 'Hello', + * }, + * }, + * }); + * + * const schema = new GraphQLSchema({ + * description: 'The application schema.', + * query: Query, + * }); + * + * schema.getQueryType(); // => Query + * schema.description; // => 'The application schema.' + * ``` + * @example + * ```ts + * // This variant configures every schema option, including directives and extensions. + * import { DirectiveLocation, parse } from 'graphql/language'; + * import { + * GraphQLBoolean, + * GraphQLDirective, + * GraphQLObjectType, + * GraphQLSchema, + * GraphQLString, + * } from 'graphql/type'; + * + * const Query = new GraphQLObjectType({ + * name: 'Query', + * fields: { greeting: { type: GraphQLString } }, + * }); + * const Mutation = new GraphQLObjectType({ + * name: 'Mutation', + * fields: { setGreeting: { type: GraphQLString } }, + * }); + * const Subscription = new GraphQLObjectType({ + * name: 'Subscription', + * fields: { greetingChanged: { type: GraphQLString } }, + * }); + * const AuditEvent = new GraphQLObjectType({ + * name: 'AuditEvent', + * fields: { message: { type: GraphQLString } }, + * }); + * const authDirective = new GraphQLDirective({ + * name: 'auth', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * args: { required: { type: GraphQLBoolean } }, + * }); + * const schemaDocument = parse(` + * schema { + * query: Query + * mutation: Mutation + * subscription: Subscription + * } + * + * extend schema @auth + * `); + * + * const schema = new GraphQLSchema({ + * description: 'Operations exposed by the application.', + * query: Query, + * mutation: Mutation, + * subscription: Subscription, + * types: [AuditEvent], + * directives: [authDirective], + * extensions: { owner: 'platform' }, + * astNode: schemaDocument.definitions[0], + * extensionASTNodes: [schemaDocument.definitions[1]], + * assumeValid: true, + * }); + * + * schema.getMutationType(); // => Mutation + * schema.getSubscriptionType(); // => Subscription + * schema.getType('AuditEvent'); // => AuditEvent + * schema.getDirective('auth'); // => authDirective + * schema.extensions; // => { owner: 'platform' } + * ``` + */ + constructor(config: Readonly<GraphQLSchemaConfig>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns the root object type for query operations. + * @returns The query root type, if this schema defines one. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * + * schema.getQueryType()?.name; // => 'Query' + * ``` + */ + getQueryType(): Maybe<GraphQLObjectType>; + /** + * Returns the root object type for mutation operations. + * @returns The mutation root type, if this schema defines one. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * + * type Mutation { + * setGreeting(value: String!): String + * } + * `); + * + * schema.getMutationType()?.name; // => 'Mutation' + * ``` + */ + getMutationType(): Maybe<GraphQLObjectType>; + /** + * Returns the root object type for subscription operations. + * @returns The subscription root type, if this schema defines one. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * + * type Subscription { + * greetings: String + * } + * `); + * + * schema.getSubscriptionType()?.name; // => 'Subscription' + * ``` + */ + getSubscriptionType(): Maybe<GraphQLObjectType>; + /** + * Returns the root object type for the requested operation kind. + * @param operation - Operation kind to resolve. + * @returns The root object type for the operation kind, if this schema defines one. + * @example + * ```ts + * import { OperationTypeNode } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * + * type Mutation { + * setGreeting(value: String!): String + * } + * `); + * + * schema.getRootType(OperationTypeNode.QUERY)?.name; // => 'Query' + * schema.getRootType(OperationTypeNode.MUTATION)?.name; // => 'Mutation' + * schema.getRootType(OperationTypeNode.SUBSCRIPTION); // => undefined + * ``` + */ + getRootType(operation: OperationTypeNode): Maybe<GraphQLObjectType>; + /** + * Returns all named types known to this schema. + * @returns A map of schema types keyed by type name. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type User { + * name: String + * } + * + * type Query { + * viewer: User + * } + * `); + * + * const typeMap = schema.getTypeMap(); + * + * typeMap.User.name; // => 'User' + * typeMap.Query.name; // => 'Query' + * typeMap.String.name; // => 'String' + * ``` + */ + getTypeMap(): TypeMap; + /** + * Returns the named type with the provided name. + * @param name - The GraphQL name to look up. + * @returns The named schema type, if one exists. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type User { + * name: String + * } + * + * type Query { + * viewer: User + * } + * `); + * + * schema.getType('User')?.toString(); // => 'User' + * schema.getType('Missing'); // => undefined + * ``` + */ + getType(name: string): GraphQLNamedType | undefined; + /** + * Returns object types that may be returned for an abstract type. + * @param abstractType - Interface or union type to inspect. + * @returns Object types that may satisfy the abstract type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInterfaceType, assertUnionType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Organization implements Node { + * id: ID! + * } + * + * union SearchResult = User | Organization + * + * type Query { + * node: Node + * search: [SearchResult] + * } + * `); + * + * const Node = assertInterfaceType(schema.getType('Node')); + * const SearchResult = assertUnionType(schema.getType('SearchResult')); + * + * schema.getPossibleTypes(Node).map((type) => type.name); // => ['User', 'Organization'] + * schema.getPossibleTypes(SearchResult).map((type) => type.name); // => ['User', 'Organization'] + * ``` + */ + getPossibleTypes(abstractType: GraphQLAbstractType): ReadonlyArray<GraphQLObjectType>; + /** + * Returns objects and interfaces that implement an interface type. + * @param interfaceType - Interface type to inspect. + * @returns Object and interface implementations of the interface. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInterfaceType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Resource { + * url: String! + * } + * + * interface Image implements Resource { + * url: String! + * width: Int + * } + * + * type Photo implements Resource & Image { + * url: String! + * width: Int + * } + * + * type Query { + * resource: Resource + * } + * `); + * + * const Resource = assertInterfaceType(schema.getType('Resource')); + * const implementations = schema.getImplementations(Resource); + * + * implementations.interfaces.map((type) => type.name); // => ['Image'] + * implementations.objects.map((type) => type.name); // => ['Photo'] + * ``` + */ + getImplementations(interfaceType: GraphQLInterfaceType): { + objects: ReadonlyArray<GraphQLObjectType>; + interfaces: ReadonlyArray<GraphQLInterfaceType>; + }; + /** + * Returns whether one type is a possible runtime subtype of an abstract type. + * @param abstractType - Interface or union type to inspect. + * @param maybeSubType - Object or interface type to test as a possible subtype. + * @returns True when the subtype may satisfy the abstract type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertInterfaceType, assertObjectType } from 'graphql/type'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Review { + * body: String + * } + * + * type Query { + * node: Node + * review: Review + * } + * `); + * + * const Node = assertInterfaceType(schema.getType('Node')); + * const User = assertObjectType(schema.getType('User')); + * const Review = assertObjectType(schema.getType('Review')); + * + * schema.isSubType(Node, User); // => true + * schema.isSubType(Node, Review); // => false + * ``` + */ + isSubType(abstractType: GraphQLAbstractType, maybeSubType: GraphQLObjectType | GraphQLInterfaceType): boolean; + /** + * Returns directives available in this schema. + * @returns Directives available in this schema. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * directive @upper on FIELD_DEFINITION + * + * type Query { + * greeting: String @upper + * } + * `); + * + * schema.getDirectives().map((directive) => directive.name); // => ['include', 'skip', 'deprecated', 'specifiedBy', 'oneOf', 'upper'] + * ``` + */ + getDirectives(): ReadonlyArray<GraphQLDirective>; + /** + * Returns the current directive definition. + * @param name - The GraphQL name to look up. + * @returns The current directive definition, if known. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * directive @upper on FIELD_DEFINITION + * + * type Query { + * greeting: String @upper + * } + * `); + * + * schema.getDirective('upper')?.name; // => 'upper' + * schema.getDirective('missing'); // => undefined + * ``` + */ + getDirective(name: string): Maybe<GraphQLDirective>; + /** + * This method looks up the field on the given type definition. + * It has special casing for the three introspection fields, `__schema`, + * `__type` and `__typename`. + * + * `__typename` is special because it can always be queried as a field, even + * in situations where no other fields are allowed, like on a Union. + * + * `__schema` and `__type` could get automatically added to the query type, + * but that would require mutating type definitions, which would cause issues. + * @param parentType - Composite type to look up the field on. + * @param fieldName - Field name to look up. + * @returns The field definition, including supported introspection fields. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const queryType = schema.getQueryType(); + * + * schema.getField(queryType, 'greeting')?.name; // => 'greeting' + * schema.getField(queryType, '__typename')?.name; // => '__typename' + * schema.getField(queryType, 'missing'); // => undefined + * ``` + */ + getField(parentType: GraphQLCompositeType, fieldName: string): GraphQLField<unknown, unknown> | undefined; + /** + * Returns a normalized configuration object for this object. + * + * The returned config preserves the original `assumeValid` flag so the schema + * can be recreated with the same validation behavior. + * @returns A configuration object that can be used to recreate this object. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { GraphQLSchema } from 'graphql/type'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * + * const config = schema.toConfig(); + * const schemaCopy = new GraphQLSchema(config); + * + * config.query?.name; // => 'Query' + * schemaCopy.getQueryType()?.name; // => 'Query' + * ``` + */ + toConfig(): GraphQLSchemaNormalizedConfig; +} +type TypeMap = ObjMap<GraphQLNamedType>; +interface GraphQLSchemaValidationOptions { + /** + * When building a schema from a GraphQL service's introspection result, it + * might be safe to assume the schema is valid. Set to true to assume the + * produced schema is valid. + * + * Default: false + * + * @internal + */ + assumeValid?: boolean | undefined; +} +/** Configuration used to construct a GraphQLSchema. */ +export interface GraphQLSchemaConfig extends GraphQLSchemaValidationOptions { + /** Human-readable description for this schema element, if provided. */ + description?: Maybe<string>; + /** Root object type for query operations. */ + query?: Maybe<GraphQLObjectType>; + /** Root object type for mutation operations. */ + mutation?: Maybe<GraphQLObjectType>; + /** Root object type for subscription operations. */ + subscription?: Maybe<GraphQLObjectType>; + /** Object types that belong to this union type. */ + types?: Maybe<ReadonlyArray<GraphQLNamedType>>; + /** Directives available in this schema or applied to this AST node. */ + directives?: Maybe<ReadonlyArray<GraphQLDirective>>; + /** Custom extension fields reserved for users. */ + extensions?: Maybe<Readonly<GraphQLSchemaExtensions>>; + /** AST node from which this schema element was built, if available. */ + astNode?: Maybe<SchemaDefinitionNode>; + /** AST extension nodes applied to this schema element. */ + extensionASTNodes?: Maybe<ReadonlyArray<SchemaExtensionNode>>; +} +interface GraphQLSchemaNormalizedConfig extends GraphQLSchemaConfig { + description: Maybe<string>; + types: ReadonlyArray<GraphQLNamedType>; + directives: ReadonlyArray<GraphQLDirective>; + extensions: Readonly<GraphQLSchemaExtensions>; + extensionASTNodes: ReadonlyArray<SchemaExtensionNode>; + assumeValid: boolean; +} +/** + * Error thrown when GraphQL execution is aborted. + * @typeParam TResult - Result value type. + */ +export declare class AbortedGraphQLExecutionError<TResult> extends Error { + /** Partial execution result available when execution was aborted. */ + readonly abortedResult: PromiseOrValue<TResult>; + /** + * Creates an error for an aborted GraphQL execution. + * @param reason - Abort reason used as the error cause. + * @param result - Partial execution result available when execution stopped. + * @example + * ```ts + * import { AbortedGraphQLExecutionError } from 'graphql/execution'; + * + * const cause = new Error('Request cancelled.'); + * const partialResult = { data: { viewer: null } }; + * const error = new AbortedGraphQLExecutionError(cause, partialResult); + * + * error.message; // => 'Request cancelled.' + * error.cause; // => cause + * error.abortedResult; // => partialResult + * ``` + */ + constructor(reason: unknown, result: PromiseOrValue<TResult>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; +} +/** Arguments accepted by execute and executeSync. */ +export interface ExecutionArgs { + /** The schema used for validation or execution. */ + schema: GraphQLSchema; + /** The parsed GraphQL document to execute. */ + document: DocumentNode; + /** Initial root value passed to the operation. */ + rootValue?: unknown; + /** Application context value passed to every resolver. */ + contextValue?: unknown; + /** Runtime variable values keyed by variable name. */ + variableValues?: Maybe<{ + readonly [variable: string]: unknown; + }>; + /** Name of the operation to execute when the document contains multiple operations. */ + operationName?: Maybe<string>; + /** Resolver used when a field does not define its own resolver. */ + fieldResolver?: Maybe<GraphQLFieldResolver<any, any>>; + /** Resolver used when an abstract type does not define its own resolver. */ + typeResolver?: Maybe<GraphQLTypeResolver<any, any>>; + /** Resolver used for the root subscription field. */ + subscribeFieldResolver?: Maybe<GraphQLFieldResolver<any, any>>; + /** Whether suggestion text should be omitted from request errors. */ + hideSuggestions?: Maybe<boolean>; + /** AbortSignal used to cancel execution. */ + abortSignal?: Maybe<AbortSignal>; + /** Whether incremental execution may begin eligible work early. */ + enableEarlyExecution?: Maybe<boolean>; + /** Execution hooks invoked during this operation. */ + hooks?: Maybe<ExecutionHooks>; + /** Additional execution options. */ + options?: { + /** + * Set the maximum number of errors allowed for coercing (defaults to 50). + * + * @internal + */ + maxCoercionErrors?: number; + }; +} +/** + * Data that must be available at all points during query execution. + * + * Namely, schema of the type system that is currently executing, + * and the fragments defined in the query document + */ +export interface ValidatedExecutionArgs { + /** Schema used for execution. */ + schema: GraphQLSchema; + /** Parsed GraphQL document being executed. */ + document: DocumentNode; + /** Fragment definitions keyed by fragment name. */ + fragmentDefinitions: ObjMap<FragmentDefinitionNode>; + /** Fragment details keyed by fragment name. */ + fragments: ObjMap<FragmentDetails>; + /** Root value passed to the operation. */ + rootValue: unknown; + /** Application context value passed to every resolver. */ + contextValue: unknown; + /** Operation definition selected for execution. */ + operation: OperationDefinitionNode; + /** Operation variable values with source metadata and coerced runtime values. */ + variableValues: VariableValues; + /** Raw variable values provided by the caller before coercion. */ + rawVariableValues: Maybe<{ + readonly [variable: string]: unknown; + }>; + /** Resolver used for fields without an explicit resolver. */ + fieldResolver: GraphQLFieldResolver<any, any>; + /** Resolver used for abstract types without an explicit type resolver. */ + typeResolver: GraphQLTypeResolver<any, any>; + /** Resolver used for subscription fields without an explicit subscribe resolver. */ + subscribeFieldResolver: GraphQLFieldResolver<any, any>; + /** Whether suggestion text should be omitted from execution errors. */ + hideSuggestions: boolean; + /** Whether execution should use error propagation. */ + errorPropagation: boolean; + /** External signal that may abort execution. */ + externalAbortSignal: AbortSignal | undefined; + /** Whether incremental execution may begin eligible work early. */ + enableEarlyExecution: boolean; + /** Execution hooks supplied by the caller. */ + hooks: ExecutionHooks | undefined; +} +/** Validated execution arguments for a subscription operation. */ +export interface ValidatedSubscriptionArgs extends ValidatedExecutionArgs { + /** Subscription operation definition selected for execution. */ + operation: SubscriptionOperationDefinitionNode; +} +/** Information passed to hooks after asynchronous execution work has finished. */ +export interface AsyncWorkFinishedInfo { + /** Validated execution arguments for the operation that finished async work. */ + validatedExecutionArgs: ValidatedExecutionArgs; +} +/** Optional hooks invoked during GraphQL execution. */ +export interface ExecutionHooks { + /** Called after all tracked asynchronous execution work has settled. */ + asyncWorkFinished?: (info: AsyncWorkFinishedInfo) => void; +} +/** + * Represents the response produced by executing a GraphQL operation. + * @typeParam TData - Shape of the execution data payload. + * @typeParam TExtensions - Shape of the extensions payload. + */ +export interface ExecutionResult<TData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> { + /** Errors raised while parsing, validating, or executing the operation. */ + errors?: ReadonlyArray<GraphQLError>; + /** Data returned by execution, or null when execution could not produce data. */ + data?: TData | null; + /** Additional non-standard metadata included in the execution result. */ + extensions?: TExtensions; +} +/** + * A JSON-serializable GraphQL execution result. + * @typeParam TData - Shape of the formatted data payload. + * @typeParam TExtensions - Shape of the formatted extensions payload. + */ +export interface FormattedExecutionResult<TData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> { + /** Errors raised while parsing, validating, or executing the operation. */ + errors?: ReadonlyArray<GraphQLFormattedError>; + /** Data returned by execution, or null when execution could not produce data. */ + data?: TData | null; + /** Additional non-standard metadata included in the formatted result. */ + extensions?: TExtensions; +} +/** + * Results for an operation that produced incremental payloads. + * @typeParam TInitialData - Shape of the initial result data payload. + * @typeParam TDeferredData - Shape of deferred fragment data payloads. + * @typeParam TStreamItem - Shape of streamed list items. + * @typeParam TExtensions - Shape of extensions payloads. + */ +export interface ExperimentalIncrementalExecutionResults<TInitialData = ObjMap<unknown>, TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Initial execution result delivered before subsequent incremental payloads. */ + initialResult: InitialIncrementalExecutionResult<TInitialData, TExtensions>; + /** Async stream of incremental payloads delivered after the initial result. */ + subsequentResults: AsyncGenerator<SubsequentIncrementalExecutionResult<TDeferredData, TStreamItem, TExtensions>, void, void>; +} +/** + * JSON-serializable form of incremental execution results. + * @typeParam TInitial - Shape of the formatted initial result data payload. + * @typeParam TDeferredData - Shape of formatted deferred fragment data payloads. + * @typeParam TStreamItem - Shape of formatted streamed list items. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export interface FormattedExperimentalIncrementalExecutionResults<TInitial = ObjMap<unknown>, TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Formatted initial execution result. */ + initialResult: FormattedInitialIncrementalExecutionResult<TInitial, TExtensions>; + /** Async stream of formatted incremental payloads. */ + subsequentResults: AsyncGenerator<FormattedSubsequentIncrementalExecutionResult<TDeferredData, TStreamItem, TExtensions>, void, void>; +} +/** + * Initial execution result for an operation that produced incremental payloads. + * @typeParam TData - Shape of the initial data payload. + * @typeParam TExtensions - Shape of the extensions payload. + */ +export interface InitialIncrementalExecutionResult<TData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> extends ExecutionResult<TData, TExtensions> { + /** Data produced by the initial execution payload. */ + data: TData; + /** Incremental payloads that are still pending after the initial result. */ + pending: ReadonlyArray<PendingResult>; + /** Indicates that subsequent incremental payloads will follow. */ + hasNext: true; + /** Additional non-standard metadata included in the initial result. */ + extensions?: TExtensions; +} +/** + * JSON-serializable form of an initial incremental execution result. + * @typeParam TInitialData - Shape of the formatted initial data payload. + * @typeParam TExtensions - Shape of the formatted extensions payload. + */ +export interface FormattedInitialIncrementalExecutionResult<TInitialData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> extends FormattedExecutionResult<TInitialData, TExtensions> { + /** Formatted data produced by the initial execution payload. */ + data: TInitialData; + /** Formatted list of incremental payloads still pending after the initial result. */ + pending: ReadonlyArray<PendingResult>; + /** Indicates whether subsequent incremental payloads will follow. */ + hasNext: boolean; + /** Additional non-standard metadata included in the formatted initial result. */ + extensions?: TExtensions; +} +/** + * Subsequent payload produced by incremental execution. + * @typeParam TDeferredData - Shape of deferred fragment data payloads. + * @typeParam TStreamItem - Shape of streamed list items. + * @typeParam TExtensions - Shape of the extensions payload. + */ +export interface SubsequentIncrementalExecutionResult<TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Incremental payloads that became pending with this response. */ + pending?: ReadonlyArray<PendingResult>; + /** Deferred or streamed payloads delivered by this response. */ + incremental?: ReadonlyArray<IncrementalResult<TDeferredData, TStreamItem, TExtensions>>; + /** Incremental payloads that completed with this response. */ + completed?: ReadonlyArray<CompletedResult>; + /** Indicates whether more incremental payloads will follow. */ + hasNext: boolean; + /** Additional non-standard metadata included in this payload. */ + extensions?: TExtensions; +} +/** + * JSON-serializable form of a subsequent incremental execution payload. + * @typeParam TDeferredData - Shape of formatted deferred fragment data payloads. + * @typeParam TStreamItem - Shape of formatted streamed list items. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export interface FormattedSubsequentIncrementalExecutionResult<TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Indicates whether more incremental payloads will follow. */ + hasNext: boolean; + /** Formatted incremental payloads that became pending with this response. */ + pending?: ReadonlyArray<PendingResult>; + /** Formatted deferred or streamed payloads delivered by this response. */ + incremental?: ReadonlyArray<FormattedIncrementalResult<TDeferredData, TStreamItem, TExtensions>>; + /** Formatted incremental payloads that completed with this response. */ + completed?: ReadonlyArray<FormattedCompletedResult>; + /** Additional non-standard metadata included in this formatted payload. */ + extensions?: TExtensions; +} +/** + * Incremental payload produced by a deferred fragment. + * @typeParam TDeferredData - Shape of deferred fragment data. + * @typeParam TExtensions - Shape of extensions payloads. + */ +export interface IncrementalDeferResult<TDeferredData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> { + /** Identifier matching this payload to a pending deferred fragment. */ + id: string; + /** Path from the deferred fragment location to this payload. */ + subPath?: ReadonlyArray<string | number>; + /** Errors raised while executing the deferred fragment. */ + errors?: ReadonlyArray<GraphQLError>; + /** Data produced by the deferred fragment. */ + data: TDeferredData; + /** Additional non-standard metadata included in this payload. */ + extensions?: TExtensions; +} +/** + * JSON-serializable form of a deferred fragment payload. + * @typeParam TDeferredData - Shape of formatted deferred fragment data. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export interface FormattedIncrementalDeferResult<TDeferredData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> { + /** Formatted errors raised while executing the deferred fragment. */ + errors?: ReadonlyArray<GraphQLFormattedError>; + /** Formatted data produced by the deferred fragment. */ + data: TDeferredData; + /** Identifier matching this payload to a pending deferred fragment. */ + id: string; + /** Path from the deferred fragment location to this payload. */ + subPath?: ReadonlyArray<string | number>; + /** Additional non-standard metadata included in this formatted payload. */ + extensions?: TExtensions; +} +/** + * Incremental payload produced by a streamed list field. + * @typeParam TStreamItem - Shape of streamed list items. + * @typeParam TExtensions - Shape of extensions payloads. + */ +export interface IncrementalStreamResult<TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Identifier matching this payload to a pending stream. */ + id: string; + /** Path from the streamed field location to these items. */ + subPath?: ReadonlyArray<string | number>; + /** Errors raised while producing streamed items. */ + errors?: ReadonlyArray<GraphQLError>; + /** Streamed list items delivered by this payload. */ + items: ReadonlyArray<TStreamItem>; + /** Additional non-standard metadata included in this payload. */ + extensions?: TExtensions; +} +/** + * JSON-serializable form of a streamed list payload. + * @typeParam TStreamItem - Shape of formatted streamed list items. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export interface FormattedIncrementalStreamResult<TStreamItem = Array<unknown>, TExtensions = ObjMap<unknown>> { + /** Formatted errors raised while producing streamed items. */ + errors?: ReadonlyArray<GraphQLFormattedError>; + /** Formatted streamed list items delivered by this payload. */ + items: ReadonlyArray<TStreamItem>; + /** Identifier matching this payload to a pending stream. */ + id: string; + /** Path from the streamed field location to these items. */ + subPath?: ReadonlyArray<string | number>; + /** Additional non-standard metadata included in this formatted payload. */ + extensions?: TExtensions; +} +/** + * Deferred fragment or streamed list payload produced by incremental execution. + * @typeParam TDeferredData - Shape of deferred fragment data. + * @typeParam TStreamItem - Shape of streamed list items. + * @typeParam TExtensions - Shape of extensions payloads. + */ +export type IncrementalResult<TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> = IncrementalDeferResult<TDeferredData, TExtensions> | IncrementalStreamResult<TStreamItem, TExtensions>; +/** + * JSON-serializable deferred fragment or streamed list payload. + * @typeParam TDeferredData - Shape of formatted deferred fragment data. + * @typeParam TStreamItem - Shape of formatted streamed list items. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export type FormattedIncrementalResult<TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> = FormattedIncrementalDeferResult<TDeferredData, TExtensions> | FormattedIncrementalStreamResult<TStreamItem, TExtensions>; +interface PendingResult { + id: string; + path: ReadonlyArray<string | number>; + label?: string; +} +interface CompletedResult { + id: string; + errors?: ReadonlyArray<GraphQLError>; +} +interface FormattedCompletedResult { + id: string; + errors?: ReadonlyArray<GraphQLFormattedError>; +} +interface MinimalChannel<TMessage = unknown> { + readonly hasSubscribers?: boolean; + publish: (message: TMessage) => void; + runStores: <T, ContextType extends object>(context: ContextType, fn: (this: ContextType, ...args: Array<unknown>) => T, thisArg?: unknown, ...args: Array<unknown>) => T; +} +interface MinimalTracingChannel<TContext = unknown> { + readonly hasSubscribers: boolean | undefined; + readonly start: MinimalChannel<TContext>; + readonly end: MinimalChannel<TContext>; + readonly asyncStart: MinimalChannel<TContext>; + readonly asyncEnd: MinimalChannel<TContext>; + readonly error: MinimalChannel<TContext>; + traceSync: <T>(fn: (...args: Array<unknown>) => T, context: TContext extends object ? TContext : object, thisArg?: unknown, ...args: Array<unknown>) => T; +} +/** Context published on the sync-only `graphql:parse` channel. */ +export interface GraphQLParseContext { + /** Source text or source object passed to the parser. */ + source: string | Source; + /** Error thrown while parsing, when parsing fails. */ + error?: unknown; + /** Parsed document, when parsing succeeds. */ + result?: DocumentNode; +} +/** Context published on the sync-only `graphql:validate` channel. */ +export interface GraphQLValidateContext { + /** Schema used for validation. */ + schema: GraphQLSchema; + /** Parsed document being validated. */ + document: DocumentNode; + /** Error thrown while validating, when validation fails abruptly. */ + error?: unknown; + /** Validation errors returned by validation. */ + result?: ReadonlyArray<GraphQLError>; +} +/** + * Context published on `graphql:execute`. + * + * Returned results may contain GraphQL errors collected during execution. + */ +export interface GraphQLExecuteContext { + /** Schema used for execution. */ + schema: GraphQLSchema; + /** Parsed document being executed. */ + document: DocumentNode; + /** Raw variable values provided by the caller before coercion. */ + rawVariableValues: Maybe<{ + readonly [variable: string]: unknown; + }>; + /** Selected operation name, if one is available. */ + operationName: string | undefined; + /** Selected operation type, if one is available. */ + operationType: OperationTypeNode | undefined; + /** Error thrown or rejected while executing, when execution fails abruptly. */ + error?: unknown; + /** Execution result returned by execution, including GraphQL errors. */ + result?: ExecutionResult | ExperimentalIncrementalExecutionResults; +} +/** + * Context published on `graphql:execute:rootSelectionSet`. + * + * Returned results may contain GraphQL errors collected during execution. + */ +export interface GraphQLExecuteRootSelectionSetContext { + /** Schema used for execution. */ + schema: GraphQLSchema; + /** Parsed document being executed. */ + document: DocumentNode; + /** Operation definition selected for execution. */ + operation: OperationDefinitionNode; + /** Raw variable values provided by the caller before coercion. */ + rawVariableValues: Maybe<{ + readonly [variable: string]: unknown; + }>; + /** Selected operation name, if one is available. */ + operationName: string | undefined; + /** Selected operation type. */ + operationType: OperationTypeNode; + /** Error thrown or rejected while executing the root selection set. */ + error?: unknown; + /** + * Execution result returned from the root selection set, including GraphQL + * errors. + */ + result?: ExecutionResult | ExperimentalIncrementalExecutionResults; +} +/** + * Context published on `graphql:execute:variableCoercion`. + * + * Coercion runs synchronously while execution arguments are validated, so only + * the `start`/`end` (and, on an abrupt throw, `error`) lifecycle fires. + * Ordinary variable coercion failures are returned on `result.errors`; when + * execution is invoked through APIs such as `execute()` or `subscribe()`, they + * surface as GraphQL result errors rather than as the tracing `error` + * lifecycle event. + */ +export interface GraphQLExecuteVariableCoercionContext { + /** Schema used for variable coercion. */ + schema: GraphQLSchema; + /** Parsed document being executed. */ + document: DocumentNode; + /** Operation definition whose variables are being coerced. */ + operation: OperationDefinitionNode; + /** Raw variable values provided by the caller before coercion. */ + rawVariableValues: Maybe<{ + readonly [variable: string]: unknown; + }>; + /** Selected operation name, if one is available. */ + operationName: string | undefined; + /** Selected operation type. */ + operationType: OperationTypeNode; + /** Error thrown while coercing variables, when coercion fails abruptly. */ + error?: unknown; + /** Coerced variable values or coercion errors returned by coercion. */ + result?: { + variableValues: VariableValues; + } | { + errors: ReadonlyArray<GraphQLError>; + }; +} +/** + * Context published on `graphql:subscribe`. + * + * Subscription source resolver errors and invalid source stream results are + * returned on `result` as ExecutionResult errors; they do not publish the + * `error` lifecycle event unless subscription setup fails abruptly before + * GraphQL can form a result. + */ +export interface GraphQLSubscribeContext { + /** Schema used for subscription execution. */ + schema: GraphQLSchema; + /** Parsed subscription document. */ + document: DocumentNode; + /** Raw variable values provided by the caller before coercion. */ + rawVariableValues: Maybe<{ + readonly [variable: string]: unknown; + }>; + /** Selected operation name, if one is available. */ + operationName: string | undefined; + /** Selected operation type, if one is available. */ + operationType: OperationTypeNode | undefined; + /** Error thrown or rejected while subscribing, when setup fails abruptly. */ + error?: unknown; + /** + * Subscription response stream, or an ExecutionResult containing GraphQL + * errors. + */ + result?: AsyncGenerator<ExecutionResult, void, void> | ExecutionResult; +} +/** + * Context published on `graphql:resolve`. + * + * Resolver throws and rejections publish the `error` lifecycle event here. + * The same failure may also be formatted into the enclosing execution or + * subscription result. + */ +export interface GraphQLResolveContext { + /** Field name being resolved. */ + fieldName: string; + /** Response alias for the field being resolved. */ + alias: string; + /** Parent type name for the field being resolved. */ + parentType: string; + /** Return type string for the field being resolved. */ + fieldType: string; + /** Argument values passed to the resolver. */ + args: ObjMap<unknown>; + /** Whether the field is using the default resolver. */ + isDefaultResolver: boolean; + /** Response path for the field being resolved. */ + fieldPath: string; + /** Error thrown or rejected by the resolver, when resolution fails. */ + error?: unknown; + /** Value returned by the resolver, when resolution succeeds. */ + result?: unknown; +} +/** Mapping from tracing channel name to the context type published on it. */ +export interface GraphQLChannelContextByName { + /** Context published on `graphql:parse`. */ + "graphql:parse": GraphQLParseContext; + /** Context published on `graphql:validate`. */ + "graphql:validate": GraphQLValidateContext; + /** Context published on `graphql:execute`. */ + "graphql:execute": GraphQLExecuteContext; + /** Context published on `graphql:execute:variableCoercion`. */ + "graphql:execute:variableCoercion": GraphQLExecuteVariableCoercionContext; + /** Context published on `graphql:execute:rootSelectionSet`. */ + "graphql:execute:rootSelectionSet": GraphQLExecuteRootSelectionSetContext; + /** Context published on `graphql:subscribe`. */ + "graphql:subscribe": GraphQLSubscribeContext; + /** Context published on `graphql:resolve`. */ + "graphql:resolve": GraphQLResolveContext; +} +/** + * The collection of tracing channels GraphQL.js emits on. Application + * performance monitoring (APM) tools subscribe to these by name on their own + * `node:diagnostics_channel` import; both paths land on the same channel + * instance because `tracingChannel(name)` is cached by name. + */ +export interface GraphQLChannels { + /** Tracing channel for `graphql:execute`. */ + execute: MinimalTracingChannel<GraphQLExecuteContext>; + /** Tracing channel for `graphql:execute:variableCoercion`. */ + executeVariableCoercion: MinimalTracingChannel<GraphQLExecuteVariableCoercionContext>; + /** Tracing channel for `graphql:execute:rootSelectionSet`. */ + executeRootSelectionSet: MinimalTracingChannel<GraphQLExecuteRootSelectionSetContext>; + /** Tracing channel for `graphql:parse`. */ + parse: MinimalTracingChannel<GraphQLParseContext>; + /** Tracing channel for `graphql:validate`. */ + validate: MinimalTracingChannel<GraphQLValidateContext>; + /** Tracing channel for `graphql:resolve`. */ + resolve: MinimalTracingChannel<GraphQLResolveContext>; + /** Tracing channel for `graphql:subscribe`. */ + subscribe: MinimalTracingChannel<GraphQLSubscribeContext>; +} +interface LexerInterface { + source: Source; + lastToken: Token; + token: Token; + line: number; + lineStart: number; + advance: () => Token; + lookahead: () => Token; +} +/** + * Given a Source object, creates a Lexer for that source. + * A Lexer is a stateful stream generator in that every time + * it is advanced, it returns the next token in the Source. Assuming the + * source lexes, the final Token emitted by the lexer will be of kind + * EOF, after which the lexer will repeatedly return the same EOF token + * whenever called. + */ +export declare class Lexer implements LexerInterface { + /** Source document used to derive error locations. */ + source: Source; + /** Most recent non-ignored token returned by the lexer. */ + lastToken: Token; + /** Current non-ignored token at the lexer cursor. */ + token: Token; + /** The (1-indexed) line containing the current token. */ + line: number; + /** Character offset where the current line starts. */ + lineStart: number; + /** + * Creates a Lexer instance. + * @param source - Source document used to derive error locations. + * @example + * ```ts + * import { Lexer, Source, TokenKind } from 'graphql/language'; + * + * const lexer = new Lexer(new Source('{ hello }')); + * + * lexer.token.kind; // => TokenKind.SOF + * lexer.advance().kind; // => TokenKind.BRACE_L + * lexer.advance().value; // => 'hello' + * lexer.advance().kind; // => TokenKind.BRACE_R + * ``` + */ + constructor(source: Source); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Advances the token stream to the next non-ignored token. + * @returns The next non-ignored token. + * @example + * ```ts + * import { Lexer, Source } from 'graphql/language'; + * + * const lexer = new Lexer(new Source('{ hello }')); + * const token = lexer.advance(); + * + * token.kind; // => '{' + * lexer.token; // => token + * ``` + */ + advance(): Token; + /** + * Looks ahead and returns the next non-ignored token, but does not change + * the state of Lexer. + * @returns The next non-ignored token without advancing the lexer. + * @example + * ```ts + * import { Lexer, Source } from 'graphql/language'; + * + * const lexer = new Lexer(new Source('{ hello }')); + * const token = lexer.lookahead(); + * + * token.kind; // => '{' + * lexer.token.kind; // => '<SOF>' + * ``` + */ + lookahead(): Token; +} +/** Configuration options to control parser behavior */ +export interface ParseOptions { + /** + * By default, the parser creates AST nodes that know the location + * in the source that they correspond to. This configuration flag + * disables that behavior for performance or testing. + */ + noLocation?: boolean | undefined; + /** + * Parser CPU and memory usage is linear to the number of tokens in a document + * however in extreme cases it becomes quadratic due to memory exhaustion. + * Parsing happens before validation so even invalid queries can burn lots of + * CPU time and memory. + * To prevent this you can set a maximum number of tokens allowed within a document. + */ + maxTokens?: number | undefined; + /** + * EXPERIMENTAL: + * + * If enabled, the parser will understand and parse fragment variable definitions + * and arguments on fragment spreads. Fragment variable definitions will be represented + * in the `variableDefinitions` field of the FragmentDefinitionNode. + * Fragment spread arguments will be represented in the `arguments` field of FragmentSpreadNode. + * @example + * ```graphql prettier-ignore + * { + * t { ...A(var: true) } + * } + * fragment A($var: Boolean = false) on T { + * ...B(x: $var) + * } + * ``` + */ + experimentalFragmentArguments?: boolean | undefined; + /** + * Internal parser hook for GraphQL.js entry points that need to parse a + * restricted grammar with an alternate lexer. + * @internal + */ + lexer?: LexerInterface | undefined; +} +/** + * Given a GraphQL source, parses it into a Document. + * Throws GraphQLError if a syntax error is encountered. + * @param source - A GraphQL source string or source object. + * @param options - Optional parser configuration. + * @returns The parsed GraphQL document AST. + * @example + * ```ts + * // Parse a GraphQL document with the default parser options. + * import { parse } from 'graphql/language'; + * + * const document = parse('{ hero { name } }'); + * + * document.kind; // => 'Document' + * ``` + * @example + * ```ts + * // This variant enables parser options and provides an explicit lexer. + * import { Lexer, Source, parse } from 'graphql/language'; + * + * const document = parse( + * ` + * { + * t { ...A(var: true) } + * } + * fragment A($var: Boolean = false) on T { + * name + * } + * `, + * { + * experimentalFragmentArguments: true, + * maxTokens: 80, + * noLocation: true, + * }, + * ); + * const directiveDocument = parse('directive @foo @bar on FIELD'); + * const source = new Source('{ hero }'); + * const lexerDocument = parse(source, { lexer: new Lexer(source) }); + * + * document.definitions[0].kind; // => 'OperationDefinition' + * document.definitions[1].kind; // => 'FragmentDefinition' + * document.loc; // => undefined + * directiveDocument.definitions[0].kind; // => 'DirectiveDefinition' + * lexerDocument.definitions[0].kind; // => 'OperationDefinition' + * ``` + */ +export declare function parse(source: string | Source, options?: ParseOptions): DocumentNode; +/** + * Given a string containing a GraphQL value (ex. `[42]`), parse the AST for + * that value. + * Throws GraphQLError if a syntax error is encountered. + * + * This is useful within tools that operate upon GraphQL Values directly and + * in isolation of complete GraphQL documents. + * + * Consider providing the results to the utility function: valueFromAST(). + * @param source - A GraphQL source string or source object containing a value. + * @param options - Optional parser configuration. + * @returns The parsed GraphQL value AST. + * @example + * ```ts + * import { parseValue } from 'graphql/language'; + * + * const value = parseValue('[42]'); + * + * value.kind; // => 'ListValue' + * ``` + */ +export declare function parseValue(source: string | Source, options?: ParseOptions): ValueNode; +/** + * Similar to parseValue(), but raises a parse error if it encounters a + * variable. The return type will be a constant value. + * @param source - A GraphQL source string or source object containing a constant value. + * @param options - Optional parser configuration. + * @returns The parsed GraphQL constant value AST. + * @example + * ```ts + * import { parseConstValue } from 'graphql/language'; + * + * const value = parseConstValue('{ enabled: true }'); + * + * value.kind; // => 'ObjectValue' + * parseConstValue('$variable'); // throws an error + * ``` + */ +export declare function parseConstValue(source: string | Source, options?: ParseOptions): ConstValueNode; +/** + * Given a string containing a GraphQL Type (ex. `[Int!]`), parse the AST for + * that type. + * Throws GraphQLError if a syntax error is encountered. + * + * This is useful within tools that operate upon GraphQL Types directly and + * in isolation of complete GraphQL documents. + * + * Consider providing the results to the utility function: typeFromAST(). + * @param source - A GraphQL source string or source object containing a type reference. + * @param options - Optional parser configuration. + * @returns The parsed GraphQL type AST. + * @example + * ```ts + * import { parseType } from 'graphql/language'; + * + * const type = parseType('[String!]'); + * + * type.kind; // => 'ListType' + * ``` + */ +export declare function parseType(source: string | Source, options?: ParseOptions): TypeNode; +/** + * Given a string containing a GraphQL Schema Coordinate (ex. `Type.field`), + * parse the AST for that schema coordinate. + * Throws GraphQLError if a syntax error is encountered. + * + * Consider providing the results to the utility function: + * resolveASTSchemaCoordinate(). Or calling resolveSchemaCoordinate() directly + * with an unparsed source. + * @param source - A GraphQL source string or source object containing a schema coordinate. + * @returns The parsed GraphQL schema coordinate AST. + * @example + * ```ts + * import { parseSchemaCoordinate } from 'graphql/language'; + * + * const coordinate = parseSchemaCoordinate('Query.hero'); + * + * coordinate.kind; // => 'MemberCoordinate' + * ``` + */ +export declare function parseSchemaCoordinate(source: string | Source): SchemaCoordinateNode; +/** The set of allowed kind values for AST nodes. */ +export type Kind = (typeof Kind)[keyof typeof Kind]; +/** A visitor defines the callbacks called during AST traversal. */ +export type ASTVisitor = EnterLeaveVisitor<ASTNode> | KindVisitor; +type KindVisitor = { + readonly [NodeT in ASTNode as NodeT["kind"]]?: ASTVisitFn<NodeT> | EnterLeaveVisitor<NodeT>; +}; +interface EnterLeaveVisitor<TVisitedNode extends ASTNode> { + readonly enter?: ASTVisitFn<TVisitedNode> | undefined; + readonly leave?: ASTVisitFn<TVisitedNode> | undefined; +} +/** + * A visitor is composed of visit functions called for each node during traversal. + * @typeParam TVisitedNode - AST node type handled by this visitor function. + */ +export type ASTVisitFn<TVisitedNode extends ASTNode> = ( +/** Current node being visited. */ +node: TVisitedNode, +/** Index or key for this node within the parent node or array. */ +key: string | number | undefined, +/** Parent immediately above this node, which may be an array. */ +parent: ASTNode | ReadonlyArray<ASTNode> | undefined, +/** Key path from the root node to this node. */ +path: ReadonlyArray<string | number>, +/** + * All nodes and arrays visited before reaching this node's parent. + * These correspond to array indices in `path`. + * Note: ancestors includes arrays that contain the visited node's parent. + */ +ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>) => any; +type ASTReducer<R> = { + readonly [NodeT in ASTNode as NodeT["kind"]]?: { + readonly enter?: ASTVisitFn<NodeT>; + readonly leave: ASTReducerFn<NodeT, R>; + }; +}; +type ASTReducerFn<TReducedNode extends ASTNode, R> = ( +/** + * Current node being visited. + * @internal + */ +node: { + [K in keyof TReducedNode]: ReducedField<TReducedNode[K], R>; +}, +/** + * Index or key for this node within the parent node or array. + * @internal + */ +key: string | number | undefined, +/** + * Parent immediately above this node, which may be an array. + * @internal + */ +parent: ASTNode | ReadonlyArray<ASTNode> | undefined, +/** + * Key path from the root node to this node. + * @internal + */ +path: ReadonlyArray<string | number>, +/** + * All nodes and arrays visited before reaching this node's parent. + * These correspond to array indices in `path`. + * Note: ancestors includes arrays that contain the visited node's parent. + * @internal + */ +ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>) => R; +type ReducedField<T, R> = T extends ASTNode ? R : T extends ReadonlyArray<ASTNode> ? ReadonlyArray<R> : T; +/** A visitor key map describes the traversable child properties for each node kind. */ +export type ASTVisitorKeyMap = { + [NodeT in ASTNode as NodeT["kind"]]?: ReadonlyArray<keyof NodeT>; +}; +/** A value that can be returned from a visitor function to stop traversal. */ +export declare const BREAK: unknown; +/** + * visit() will walk through an AST using a depth-first traversal, calling + * the visitor's enter function at each node in the traversal, and calling the + * leave function after visiting that node and all of its child nodes. + * + * By returning different values from the enter and leave functions, the + * behavior of the visitor can be altered, including skipping over a sub-tree of + * the AST (by returning false), editing the AST by returning a value or null + * to remove the value, or to stop the whole traversal by returning BREAK. + * + * When using visit() to edit an AST, the original AST will not be modified, and + * a new version of the AST with the changes applied will be returned from the + * visit function. + * @param root - The AST node at which to start traversal. + * @param visitor - The visitor or reducer functions to call while traversing. + * @param visitorKeys - Optional map of child keys to visit for each AST node kind. + * @returns The original AST, an edited AST, or a reduced value depending on the visitor. + * @typeParam N - The root AST node type returned when visiting without reducing. + * @example + * ```ts + * // Return values control traversal: undefined makes no change, false skips + * // a subtree, BREAK stops traversal, null removes a node, and any other + * // value replaces the current node. + * import { Kind, parse, print, visit } from 'graphql/language'; + * + * const document = parse('{ hero { name } }'); + * const editedAST = visit(document, { + * Field: (node) => { + * if (node.name.value === 'hero') { + * return { + * ...node, + * name: { kind: Kind.NAME, value: 'human' }, + * }; + * } + * }, + * }); + * + * print(editedAST); // => '{\n human {\n name\n }\n}' + * ``` + * @example + * ```ts + * // A named visitor function runs when entering nodes of that kind. + * import { parse, visit } from 'graphql/language'; + * + * const document = parse('{ hero { name } }'); + * const fieldNames = []; + * + * visit(document, { + * Field: (node) => { + * fieldNames.push(node.name.value); + * }, + * }); + * + * fieldNames; // => ['hero', 'name'] + * ``` + * @example + * ```ts + * // A named visitor object can provide separate enter and leave handlers for + * // nodes of that kind. + * import { parse, visit } from 'graphql/language'; + * + * const document = parse('{ hero { name } }'); + * const events = []; + * + * visit(document, { + * Field: { + * enter: (node) => { + * events.push(`enter:${node.name.value}`); + * }, + * leave: (node) => { + * events.push(`leave:${node.name.value}`); + * }, + * }, + * }); + * + * events; // => ['enter:hero', 'enter:name', 'leave:name', 'leave:hero'] + * ``` + * @example + * ```ts + * // Generic enter and leave handlers run for every node. + * import { parse, visit } from 'graphql/language'; + * + * const document = parse('{ hero { name } }'); + * let enterCount = 0; + * let leaveCount = 0; + * + * visit(document, { + * enter: (node) => { + * enterCount += 1; + * }, + * leave: (node) => { + * leaveCount += 1; + * }, + * }); + * + * enterCount; // => leaveCount + * enterCount > 0; // => true + * ``` + */ +export declare function visit<N extends ASTNode>(root: N, visitor: ASTVisitor, visitorKeys?: ASTVisitorKeyMap): N; +/** + * Traverses an AST with reducer callbacks and returns the reduced value. + * @param root - The AST node where traversal starts. + * @param visitor - Reducer callbacks to invoke during traversal. + * @param visitorKeys - Optional mapping of child keys for each AST node kind. + * @returns The value produced by the reducer visitor. + * @typeParam R - The value produced by reducer visitor callbacks. + * @example + * ```ts + * // A reducer visitor returns values from leave handlers to build a reduced + * // result instead of returning an edited AST. + * import { parse, visit } from 'graphql/language'; + * + * const document = parse('{ hero { name } }'); + * const printed = visit(document, { + * Name: { + * leave: (node) => { + * return node.value; + * }, + * }, + * Field: { + * leave: (node) => { + * return node.selectionSet == null + * ? node.name + * : `${node.name} { ${node.selectionSet} }`; + * }, + * }, + * SelectionSet: { + * leave: (node) => { + * return node.selections.join(' '); + * }, + * }, + * OperationDefinition: { + * leave: (node) => { + * return node.selectionSet; + * }, + * }, + * Document: { + * leave: (node) => { + * return node.definitions.join('\n'); + * }, + * }, + * }); + * + * printed; // => 'hero { name }' + * ``` + */ +export declare function visit<R>(root: ASTNode, visitor: ASTReducer<R>, visitorKeys?: ASTVisitorKeyMap): R; +/** + * Creates a new visitor instance which delegates to many visitors to run in + * parallel. Each visitor will be visited for each node before moving on. + * + * If a prior visitor edits a node, no following visitors will see that node. + * @param visitors - The visitors to merge into one parallel visitor. + * @returns A visitor that delegates traversal to each provided visitor. + * @example + * ```ts + * import { parse, visit, visitInParallel } from 'graphql/language'; + * + * const document = parse('{ hero { name } }'); + * const events = []; + * + * visit( + * document, + * visitInParallel([ + * { + * Field: (node) => { + * events.push(`field:${node.name.value}`); + * }, + * }, + * { + * Name: (node) => { + * events.push(`name:${node.value}`); + * }, + * }, + * ]), + * ); + * + * events; // => ['field:hero', 'name:hero', 'field:name', 'name:name'] + * ``` + */ +export declare function visitInParallel(visitors: ReadonlyArray<ASTVisitor>): ASTVisitor; +/** + * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind. + * @param visitor - The visitor object to inspect. + * @param kind - The AST node kind to resolve handlers for. + * @returns The enter and leave handlers that apply for the given node kind. + * @example + * ```ts + * import { Kind, getEnterLeaveForKind } from 'graphql/language'; + * + * const handlers = getEnterLeaveForKind({ Field: () => {} }, Kind.FIELD); + * + * typeof handlers.enter; // => 'function' + * handlers.leave; // => undefined + * ``` + */ +export declare function getEnterLeaveForKind(visitor: ASTVisitor, kind: Kind): EnterLeaveVisitor<ASTNode>; +interface FragmentSignature { + readonly definition: FragmentDefinitionNode; + readonly variableDefinitions: Map<string, VariableDefinitionNode>; +} +/** + * TypeInfo is a utility class which, given a GraphQL schema, can keep track + * of the current field and type definitions at any point in a GraphQL document + * AST during a recursive descent by calling `enter(node)` and `leave(node)`. + */ +export declare class TypeInfo { + private _schema; + private _typeStack; + private _parentTypeStack; + private _inputTypeStack; + private _fieldDefStack; + private _defaultValueStack; + private _directive; + private _argument; + private _enumValue; + private _fragmentSignaturesByName; + private _fragmentSignature; + private _fragmentArgument; + /** + * Creates a TypeInfo instance. + * @param schema - Schema used for type lookups. + * @param initialType - Optional type to use at the start of traversal. + * @param fragmentSignatures - Fragment signatures available during traversal. + * @example + * ```ts + * // Track field types during a visitWithTypeInfo traversal. + * import { parse, visit } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const typeInfo = new TypeInfo(schema); + * const seenTypes = []; + * + * visit( + * parse('{ greeting }'), + * visitWithTypeInfo(typeInfo, { + * Field: () => { + * seenTypes.push(String(typeInfo.getType())); + * }, + * }), + * ); + * + * seenTypes; // => ['String'] + * ``` + * @example + * ```ts + * // This variant starts from an initial type and supplies fragment signatures. + * import { Kind, parse } from 'graphql/language'; + * import { buildSchema, TypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting(name: String): String + * } + * `); + * const fragmentDocument = parse( + * 'fragment GreetingFields($name: String) on Query { greeting(name: $name) }', + * { experimentalFragmentArguments: true }, + * ); + * const fragmentDefinition = fragmentDocument.definitions[0]; + * const variableDefinition = fragmentDefinition.variableDefinitions[0]; + * const typeInfo = new TypeInfo(schema, schema.getQueryType(), (name) => + * name === 'GreetingFields' + * ? { + * definition: fragmentDefinition, + * variableDefinitions: new Map([['name', variableDefinition]]), + * } + * : undefined, + * ); + * + * typeInfo.enter({ + * kind: Kind.SELECTION_SET, + * selections: [], + * }); + * typeInfo.enter({ + * kind: Kind.FRAGMENT_SPREAD, + * name: { kind: Kind.NAME, value: 'GreetingFields' }, + * arguments: [], + * directives: [], + * }); + * + * String(typeInfo.getParentType()); // => 'Query' + * typeInfo.getFragmentSignature()?.definition.name.value; // => 'GreetingFields' + * ``` + */ + constructor(schema: GraphQLSchema, + /** + * Initial type may be provided in rare cases to facilitate traversals + * beginning somewhere other than documents. + */ + initialType?: Maybe<GraphQLType>, fragmentSignatures?: Maybe<(fragmentName: string) => Maybe<FragmentSignature>>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns the current output type at this point in traversal. + * @returns The current output type, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * viewer: User + * } + * + * type User { + * name: String + * } + * `); + * const typeInfo = new TypeInfo(schema); + * const fieldTypes = {}; + * + * visit( + * parse('{ viewer { name } }'), + * visitWithTypeInfo(typeInfo, { + * Field: (node) => { + * fieldTypes[node.name.value] = String(typeInfo.getType()); + * }, + * }), + * ); + * + * fieldTypes; // => { viewer: 'User', name: 'String' } + * ``` + */ + getType(): Maybe<GraphQLOutputType>; + /** + * Returns the current parent composite type. + * @returns The current parent composite type, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * viewer: User + * } + * + * type User { + * name: String + * } + * `); + * const typeInfo = new TypeInfo(schema); + * const parentTypes = {}; + * + * visit( + * parse('{ viewer { name } }'), + * visitWithTypeInfo(typeInfo, { + * Field: (node) => { + * parentTypes[node.name.value] = String(typeInfo.getParentType()); + * }, + * }), + * ); + * + * parentTypes; // => { viewer: 'Query', name: 'User' } + * ``` + */ + getParentType(): Maybe<GraphQLCompositeType>; + /** + * Returns the current input type at this point in traversal. + * @returns The current input type, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * reviews(stars: Int!, sort: Sort = NEWEST): [String] + * } + * + * enum Sort { + * NEWEST + * OLDEST + * } + * `); + * const typeInfo = new TypeInfo(schema); + * const inputTypes = {}; + * + * visit( + * parse('{ reviews(stars: 5, sort: OLDEST) }'), + * visitWithTypeInfo(typeInfo, { + * Argument: (node) => { + * inputTypes[node.name.value] = String(typeInfo.getInputType()); + * }, + * }), + * ); + * + * inputTypes; // => { stars: 'Int!', sort: 'Sort' } + * ``` + */ + getInputType(): Maybe<GraphQLInputType>; + /** + * Returns the parent input type for the current input position. + * @returns The parent input type, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * input ReviewFilter { + * stars: Int! + * } + * + * type Query { + * reviews(filter: ReviewFilter): [String] + * } + * `); + * const typeInfo = new TypeInfo(schema); + * const parentInputTypes = {}; + * + * visit( + * parse('{ reviews(filter: { stars: 5 }) }'), + * visitWithTypeInfo(typeInfo, { + * ObjectField: (node) => { + * parentInputTypes[node.name.value] = String(typeInfo.getParentInputType()); + * }, + * }), + * ); + * + * parentInputTypes; // => { stars: 'ReviewFilter' } + * ``` + */ + getParentInputType(): Maybe<GraphQLInputType>; + /** + * Returns the current field definition. + * @returns The current field definition, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const typeInfo = new TypeInfo(schema); + * let fieldName; + * + * visit( + * parse('{ greeting }'), + * visitWithTypeInfo(typeInfo, { + * Field: () => { + * fieldName = typeInfo.getFieldDef()?.name; + * }, + * }), + * ); + * + * fieldName; // => 'greeting' + * ``` + */ + getFieldDef(): Maybe<GraphQLField<unknown, unknown>>; + /** + * Returns the default input representation for the current input position. + * @returns The current default input, if one is available. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * reviews(limit: Int = 10): [String] + * } + * `); + * const typeInfo = new TypeInfo(schema); + * let defaultLimit; + * + * visit( + * parse('{ reviews(limit: 5) }'), + * visitWithTypeInfo(typeInfo, { + * Argument: () => { + * defaultLimit = typeInfo.getDefaultValue(); + * }, + * }), + * ); + * + * defaultLimit; // => { literal: { kind: 'IntValue', value: '10' } } + * ``` + */ + getDefaultValue(): unknown; + /** + * Returns the current directive definition. + * @returns The current directive definition, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const typeInfo = new TypeInfo(schema); + * let directiveName; + * + * visit( + * parse('{ greeting @include(if: true) }'), + * visitWithTypeInfo(typeInfo, { + * Directive: () => { + * directiveName = typeInfo.getDirective()?.name; + * }, + * }), + * ); + * + * directiveName; // => 'include' + * ``` + */ + getDirective(): Maybe<GraphQLDirective>; + /** + * Returns the current argument definition. + * @returns The current argument definition, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * reviews(limit: Int = 10): [String] + * } + * `); + * const typeInfo = new TypeInfo(schema); + * let argumentName; + * + * visit( + * parse('{ reviews(limit: 5) }'), + * visitWithTypeInfo(typeInfo, { + * Argument: () => { + * argumentName = typeInfo.getArgument()?.name; + * }, + * }), + * ); + * + * argumentName; // => 'limit' + * ``` + */ + getArgument(): Maybe<GraphQLArgument>; + /** + * Returns the current fragment signature. + * @returns The fragment signature for the current fragment definition. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse( + * ` + * { + * ...GreetingFields + * } + * + * fragment GreetingFields on Query { + * greeting + * } + * `, + * { experimentalFragmentArguments: true }, + * ); + * const typeInfo = new TypeInfo(schema); + * let fragmentName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * FragmentSpread: () => { + * fragmentName = typeInfo.getFragmentSignature()?.definition.name.value; + * }, + * }), + * ); + * + * fragmentName; // => 'GreetingFields' + * ``` + */ + getFragmentSignature(): Maybe<FragmentSignature>; + /** + * Returns the function used to look up fragment signatures by name. + * @returns A function that maps fragment names to fragment signatures. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse( + * ` + * { + * ...GreetingFields + * } + * + * fragment GreetingFields on Query { + * greeting + * } + * `, + * { experimentalFragmentArguments: true }, + * ); + * const typeInfo = new TypeInfo(schema); + * let fragmentName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * Document: () => { + * const getFragmentSignature = typeInfo.getFragmentSignatureByName(); + * fragmentName = + * getFragmentSignature('GreetingFields')?.definition.name.value; + * }, + * }), + * ); + * + * fragmentName; // => 'GreetingFields' + * ``` + */ + getFragmentSignatureByName(): (fragmentName: string) => Maybe<FragmentSignature>; + /** + * Returns the current fragment argument definition. + * @returns The variable definition for the current fragment argument. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting(name: String): String + * } + * `); + * const document = parse( + * ` + * { + * ...GreetingFields(name: "Ada") + * } + * + * fragment GreetingFields($name: String) on Query { + * greeting(name: $name) + * } + * `, + * { experimentalFragmentArguments: true }, + * ); + * const typeInfo = new TypeInfo(schema); + * let argumentName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * FragmentArgument: () => { + * argumentName = typeInfo.getFragmentArgument()?.variable.name.value; + * }, + * }), + * ); + * + * argumentName; // => 'name' + * ``` + */ + getFragmentArgument(): Maybe<VariableDefinitionNode>; + /** + * Returns the current enum value definition. + * @returns The current enum value definition, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * enum Sort { + * NEWEST + * OLDEST + * } + * + * type Query { + * reviews(sort: Sort = NEWEST): [String] + * } + * `); + * const typeInfo = new TypeInfo(schema); + * let enumValueName; + * + * visit( + * parse('{ reviews(sort: OLDEST) }'), + * visitWithTypeInfo(typeInfo, { + * EnumValue: () => { + * enumValueName = typeInfo.getEnumValue()?.name; + * }, + * }), + * ); + * + * enumValueName; // => 'OLDEST' + * ``` + */ + getEnumValue(): Maybe<GraphQLEnumValue>; + /** + * Updates this TypeInfo instance for an entered AST node. + * @param node - AST node being entered. + * @returns Nothing. + * @example + * ```ts + * import { Kind, parse } from 'graphql/language'; + * import { buildSchema, TypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse('{ greeting }'); + * const operation = document.definitions[0]; + * const selectionSet = operation.selectionSet; + * const field = selectionSet.selections[0]; + * const typeInfo = new TypeInfo(schema); + * + * typeInfo.enter(operation); + * typeInfo.enter(selectionSet); + * typeInfo.enter(field); + * + * field.kind; // => Kind.FIELD + * typeInfo.getParentType()?.name; // => 'Query' + * String(typeInfo.getType()); // => 'String' + * ``` + */ + enter(node: ASTNode): void; + /** + * Updates this TypeInfo instance for a left AST node. + * @param node - AST node being entered. + * @returns Nothing. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema, TypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse('{ greeting }'); + * const operation = document.definitions[0]; + * const selectionSet = operation.selectionSet; + * const field = selectionSet.selections[0]; + * const typeInfo = new TypeInfo(schema); + * + * typeInfo.enter(operation); + * typeInfo.enter(selectionSet); + * typeInfo.enter(field); + * String(typeInfo.getType()); // => 'String' + * + * typeInfo.leave(field); + * typeInfo.getType(); // => undefined + * ``` + */ + leave(node: ASTNode): void; +} +/** + * Creates a new visitor instance which maintains a provided TypeInfo instance + * along with visiting visitor. + * @param typeInfo - TypeInfo instance to update during traversal. + * @param visitor - Visitor callbacks to wrap with TypeInfo updates. + * @returns A visitor that keeps TypeInfo in sync while delegating callbacks. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const typeInfo = new TypeInfo(schema); + * const fields = []; + * + * visit( + * parse('{ greeting }'), + * visitWithTypeInfo(typeInfo, { + * Field: (node) => { + * fields.push({ + * name: node.name.value, + * parentType: String(typeInfo.getParentType()), + * type: String(typeInfo.getType()), + * }); + * }, + * }), + * ); + * + * fields; // => [{ name: 'greeting', parentType: 'Query', type: 'String' }] + * ``` + */ +export declare function visitWithTypeInfo(typeInfo: TypeInfo, visitor: ASTVisitor): ASTVisitor; +type NodeWithSelectionSet = OperationDefinitionNode | FragmentDefinitionNode; +interface VariableUsage { + readonly node: VariableNode; + readonly type: Maybe<GraphQLInputType>; + readonly parentType: Maybe<GraphQLInputType>; + readonly defaultValue: unknown; + readonly fragmentVariableDefinition: Maybe<VariableDefinitionNode>; +} +declare class ASTValidationContext { + private _ast; + private _onError; + private _fragments; + private _fragmentSpreads; + private _recursivelyReferencedFragments; + constructor(ast: DocumentNode, onError: (error: GraphQLError) => void); + get [Symbol.toStringTag](): string; + reportError(error: GraphQLError): void; + getDocument(): DocumentNode; + getFragment(name: string): Maybe<FragmentDefinitionNode>; + getFragmentSpreads(node: SelectionSetNode): ReadonlyArray<FragmentSpreadNode>; + getRecursivelyReferencedFragments(operation: OperationDefinitionNode): ReadonlyArray<FragmentDefinitionNode>; +} +declare class SDLValidationContext extends ASTValidationContext { + private _schema; + constructor(ast: DocumentNode, schema: Maybe<GraphQLSchema>, onError: (error: GraphQLError) => void); + get hideSuggestions(): boolean; + get [Symbol.toStringTag](): string; + getSchema(): Maybe<GraphQLSchema>; +} +/** Validation context passed to query validation rules. */ +export declare class ValidationContext extends ASTValidationContext { + private _schema; + private _typeInfo; + private _variableUsages; + private _recursiveVariableUsages; + private _hideSuggestions; + /** + * Creates a ValidationContext instance. + * @param schema - Schema used to validate the document. + * @param ast - Document AST being validated. + * @param typeInfo - TypeInfo instance used to track traversal state. + * @param onError - Callback invoked for each validation error. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { GraphQLError } from 'graphql/error'; + * import { buildSchema, TypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse('{ greeting }'); + * const errors = []; + * const context = new ValidationContext( + * schema, + * document, + * new TypeInfo(schema), + * (error) => errors.push(error), + * ); + * + * context.reportError(new GraphQLError('Example validation error.')); + * + * context.getSchema(); // => schema + * errors[0].message; // => 'Example validation error.' + * ``` + */ + constructor(schema: GraphQLSchema, ast: DocumentNode, typeInfo: TypeInfo, onError: (error: GraphQLError) => void, hideSuggestions?: Maybe<boolean>); + /** + * Returns the value used by `Object.prototype.toString`. + * @returns The built-in string tag for this object. + */ + get [Symbol.toStringTag](): string; + /** + * Returns whether validation error suggestions are hidden. + * @returns True when suggestion text should be omitted from errors. + */ + get hideSuggestions(): boolean; + /** + * Returns the schema being used by this validation context. + * @returns The schema being validated against. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema, TypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const context = new ValidationContext( + * schema, + * parse('{ greeting }'), + * new TypeInfo(schema), + * () => {}, + * ); + * + * context.getSchema().getQueryType()?.name; // => 'Query' + * ``` + */ + getSchema(): GraphQLSchema; + /** + * Returns variable usages found directly within this node. + * @param node - The AST node to inspect or visit. + * @returns Variable usages found directly within this node. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema, TypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting(name: String): String + * } + * `); + * const document = parse('query ($name: String) { greeting(name: $name) }'); + * const operation = document.definitions[0]; + * const context = new ValidationContext( + * schema, + * document, + * new TypeInfo(schema), + * () => {}, + * ); + * + * const usages = context.getVariableUsages(operation); + * + * usages[0].node.name.value; // => 'name' + * String(usages[0].type); // => 'String' + * ``` + */ + getVariableUsages(node: NodeWithSelectionSet): ReadonlyArray<VariableUsage>; + /** + * Returns variable usages for an operation, including variables used by referenced fragments. + * @param operation - Operation definition to inspect. + * @returns Variable usages reachable from the operation. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema, TypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * viewer: User + * } + * + * type User { + * name(prefix: String): String + * } + * `); + * const document = parse(` + * query ($prefix: String) { + * viewer { + * ...UserName + * } + * } + * + * fragment UserName on User { + * name(prefix: $prefix) + * } + * `); + * const operation = document.definitions[0]; + * const context = new ValidationContext( + * schema, + * document, + * new TypeInfo(schema), + * () => {}, + * ); + * + * const usages = context.getRecursiveVariableUsages(operation); + * + * usages.map((usage) => usage.node.name.value); // => ['prefix'] + * ``` + */ + getRecursiveVariableUsages(operation: OperationDefinitionNode): ReadonlyArray<VariableUsage>; + /** + * Returns the current output type at this point in traversal. + * @returns The current output type, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse('{ greeting }'); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let typeName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * Field: () => { + * typeName = String(context.getType()); + * }, + * }), + * ); + * + * typeName; // => 'String' + * ``` + */ + getType(): Maybe<GraphQLOutputType>; + /** + * Returns the current parent composite type. + * @returns The current parent composite type, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse('{ greeting }'); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let parentTypeName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * Field: () => { + * parentTypeName = context.getParentType()?.name; + * }, + * }), + * ); + * + * parentTypeName; // => 'Query' + * ``` + */ + getParentType(): Maybe<GraphQLCompositeType>; + /** + * Returns the current input type at this point in traversal. + * @returns The current input type, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * reviews(limit: Int): [String] + * } + * `); + * const document = parse('{ reviews(limit: 5) }'); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let inputTypeName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * Argument: () => { + * inputTypeName = String(context.getInputType()); + * }, + * }), + * ); + * + * inputTypeName; // => 'Int' + * ``` + */ + getInputType(): Maybe<GraphQLInputType>; + /** + * Returns the parent input type for the current input position. + * @returns The parent input type, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * input ReviewFilter { + * stars: Int + * } + * + * type Query { + * reviews(filter: ReviewFilter): [String] + * } + * `); + * const document = parse('{ reviews(filter: { stars: 5 }) }'); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let parentInputTypeName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * ObjectField: () => { + * parentInputTypeName = String(context.getParentInputType()); + * }, + * }), + * ); + * + * parentInputTypeName; // => 'ReviewFilter' + * ``` + */ + getParentInputType(): Maybe<GraphQLInputType>; + /** + * Returns the current field definition. + * @returns The current field definition, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse('{ greeting }'); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let fieldName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * Field: () => { + * fieldName = context.getFieldDef()?.name; + * }, + * }), + * ); + * + * fieldName; // => 'greeting' + * ``` + */ + getFieldDef(): Maybe<GraphQLField<unknown, unknown>>; + /** + * Returns the current directive definition. + * @returns The current directive definition, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse('{ greeting @include(if: true) }'); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let directiveName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * Directive: () => { + * directiveName = context.getDirective()?.name; + * }, + * }), + * ); + * + * directiveName; // => 'include' + * ``` + */ + getDirective(): Maybe<GraphQLDirective>; + /** + * Returns the current argument definition. + * @returns The current argument definition, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * reviews(limit: Int): [String] + * } + * `); + * const document = parse('{ reviews(limit: 5) }'); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let argumentName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * Argument: () => { + * argumentName = context.getArgument()?.name; + * }, + * }), + * ); + * + * argumentName; // => 'limit' + * ``` + */ + getArgument(): Maybe<GraphQLArgument>; + /** + * Returns the fragment signature at the current traversal position. + * @returns The current fragment signature, if one is active. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse( + * ` + * { + * ...GreetingFields + * } + * + * fragment GreetingFields on Query { + * greeting + * } + * `, + * { experimentalFragmentArguments: true }, + * ); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let fragmentName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * FragmentSpread: () => { + * fragmentName = context.getFragmentSignature()?.definition.name.value; + * }, + * }), + * ); + * + * fragmentName; // => 'GreetingFields' + * ``` + */ + getFragmentSignature(): Maybe<FragmentSignature>; + /** + * Returns the function used to look up fragment signatures by name. + * @returns A function that maps fragment names to fragment signatures. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse( + * ` + * { + * ...GreetingFields + * } + * + * fragment GreetingFields on Query { + * greeting + * } + * `, + * { experimentalFragmentArguments: true }, + * ); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let fragmentName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * Document: () => { + * const getFragmentSignature = context.getFragmentSignatureByName(); + * fragmentName = + * getFragmentSignature('GreetingFields')?.definition.name.value; + * }, + * }), + * ); + * + * fragmentName; // => 'GreetingFields' + * ``` + */ + getFragmentSignatureByName(): (fragmentName: string) => Maybe<FragmentSignature>; + /** + * Returns the current enum value definition. + * @returns The current enum value definition, if known. + * @example + * ```ts + * import { parse, visit } from 'graphql/language'; + * import { buildSchema, TypeInfo, visitWithTypeInfo } from 'graphql/utilities'; + * import { ValidationContext } from 'graphql/validation'; + * + * const schema = buildSchema(` + * enum Sort { + * NEWEST + * OLDEST + * } + * + * type Query { + * reviews(sort: Sort): [String] + * } + * `); + * const document = parse('{ reviews(sort: OLDEST) }'); + * const typeInfo = new TypeInfo(schema); + * const context = new ValidationContext(schema, document, typeInfo, () => {}); + * let enumValueName; + * + * visit( + * document, + * visitWithTypeInfo(typeInfo, { + * EnumValue: () => { + * enumValueName = context.getEnumValue()?.name; + * }, + * }), + * ); + * + * enumValueName; // => 'OLDEST' + * ``` + */ + getEnumValue(): Maybe<GraphQLEnumValue>; +} +/** A function that creates an AST visitor for validating a GraphQL document. */ +export type ValidationRule = (context: ValidationContext) => ASTVisitor; +/** + * Options used when validating a GraphQL document. + * @category Validation + */ +export interface ValidationOptions { + /** Maximum number of validation errors before validation stops. */ + maxErrors?: number; + /** Whether suggestion text should be omitted from validation errors. */ + hideSuggestions?: Maybe<boolean>; +} +/** + * Implements the "Validation" section of the spec. + * + * Validation runs synchronously, returning an array of encountered errors, or + * an empty array if no errors were encountered and the document is valid. + * + * A list of specific validation rules may be provided. If not provided, the + * default list of rules defined by the GraphQL specification will be used. + * + * Each validation rule is a function that returns a visitor + * (see the language/visitor API). Visitor methods are expected to return + * GraphQLErrors, or Arrays of GraphQLErrors when invalid. + * + * Validate will stop validation after a `maxErrors` limit has been reached. + * Attackers can send pathologically invalid queries to induce a DoS attack, + * so `maxErrors` defaults to 100 errors. + * @param schema - Schema to validate against. + * @param documentAST - Document AST to validate. + * @param rules - Validation rules to apply. + * @param options - Validation options, including error limits and suggestions. + * @returns Validation errors, or an empty array when the document is valid. + * @example + * ```ts + * // Validate with the default specified rules. + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { validate } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * fullName: String + * } + * `); + * + * validate(schema, parse('{ greeting }')); // => [] + * + * const errors = validate(schema, parse('{ missing }')); + * errors[0].message; // => 'Cannot query field "missing" on type "Query".' + * ``` + * @example + * ```ts + * // This variant uses a custom rule list and validation options. + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { FieldsOnCorrectTypeRule, validate } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const document = parse('{ missingOne missingTwo }'); + * + * const errors = validate(schema, document, [FieldsOnCorrectTypeRule], { + * maxErrors: 1, + * }); + * + * errors.length; // => 2 + * errors[1].message; // => 'Too many validation errors, error limit reached. Validation aborted.' + * + * const hiddenSuggestionErrors = validate( + * schema, + * parse('{ name }'), + * [FieldsOnCorrectTypeRule], + * { hideSuggestions: true }, + * ); + * + * hiddenSuggestionErrors[0].message; // => 'Cannot query field "name" on type "Query".' + * ``` + */ +export declare function validate(schema: GraphQLSchema, documentAST: DocumentNode, rules?: ReadonlyArray<ValidationRule>, options?: ValidationOptions): ReadonlyArray<GraphQLError>; +/** Function used to execute a validated root selection set for a subscription event. */ +export type RootSelectionSetExecutor = (validatedExecutionArgs: ValidatedSubscriptionArgs) => PromiseOrValue<ExecutionResult>; +/** + * Implements the "Executing requests" section of the GraphQL specification. + * + * Returns either a synchronous ExecutionResult (if all encountered resolvers + * are synchronous), or a Promise of an ExecutionResult that will eventually be + * resolved and never rejected. + * + * If the schema is invalid, an error will be thrown immediately. GraphQL + * request errors, including missing operations and variable coercion errors, + * are returned in an errors-only ExecutionResult. + * + * Field errors are collected into the response instead of rejecting the + * returned promise. Only the field that produced the error and its descendants + * are omitted; sibling fields continue to execute. Errors from fields of + * non-null type may propagate to the nearest nullable parent, which can be the + * entire response data. + * + * This function does not support incremental delivery (`@defer` and `@stream`). + * Use `experimentalExecuteIncrementally` to execute operations with + * incremental delivery enabled. + * @param args - The arguments used to perform the operation. + * @returns A completed execution result, or a promise resolving to one when execution is asynchronous. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { execute } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * greeting(name: String!): String + * } + * `); + * + * const result = await execute({ + * schema, + * document: parse('query ($name: String!) { greeting(name: $name) }'), + * rootValue: { + * greeting: ({ name }) => `Hello, ${name}!`, + * }, + * variableValues: { name: 'Ada' }, + * }); + * + * result; // => { data: { greeting: 'Hello, Ada!' } } + * ``` + */ +export declare function execute(args: ExecutionArgs): PromiseOrValue<ExecutionResult>; +/** + * Implements the "Executing requests" section of the GraphQL specification, + * including `@defer` and `@stream` as proposed in + * https://github.com/graphql/graphql-spec/pull/742 + * + * This function returns either a single ExecutionResult, or an + * ExperimentalIncrementalExecutionResults object containing an `initialResult` + * and a stream of `subsequentResults`. + * + * If the schema is invalid, an error will be thrown immediately. GraphQL + * request errors, including missing operations and variable coercion errors, + * are returned in an errors-only ExecutionResult. + * @param args - Execution arguments for the GraphQL operation. + * @returns A single execution result or incremental execution results. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { experimentalExecuteIncrementally } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * + * const result = await experimentalExecuteIncrementally({ + * schema, + * document: parse('{ greeting }'), + * rootValue: { greeting: 'Hello' }, + * }); + * + * result; // => { data: { greeting: 'Hello' } } + * ``` + * @category Incremental Execution + */ +export declare function experimentalExecuteIncrementally(args: ExecutionArgs): PromiseOrValue<ExecutionResult | ExperimentalIncrementalExecutionResults>; +/** + * Implements the "Executing operations" section of the spec. + * + * Returns either a synchronous ExecutionResult, or a Promise for an + * ExecutionResult, described by the "Response" section of the GraphQL + * specification. + * + * If errors are encountered while executing a GraphQL field, only that field + * and its descendants will be omitted, and sibling fields will still be + * executed. These field errors are collected into the returned result instead + * of being thrown or rejecting the returned promise. + * + * Errors from sub-fields of a NonNull type may propagate to the top level, at + * which point we still collect the error and null the parent field, which in + * this case is the entire response. + * @param validatedExecutionArgs - Validated execution arguments. + * @returns Execution result for the operation root selection set. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * executeRootSelectionSet, + * validateExecutionArgs, + * } from 'graphql/execution'; + * + * const schema = buildSchema('type Query { greeting: String }'); + * const validatedArgs = validateExecutionArgs({ + * schema, + * document: parse('{ greeting }'), + * rootValue: { greeting: 'Hello' }, + * }); + * + * assert('schema' in validatedArgs); + * + * const result = await executeRootSelectionSet(validatedArgs); + * result; // => { data: { greeting: 'Hello' } } + * ``` + */ +export declare function executeRootSelectionSet(validatedExecutionArgs: ValidatedExecutionArgs): PromiseOrValue<ExecutionResult>; +/** + * Executes the operation root selection set with incremental delivery enabled. + * @param validatedExecutionArgs - Validated execution arguments. + * @returns A single execution result or incremental execution results. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * experimentalExecuteRootSelectionSet, + * validateExecutionArgs, + * } from 'graphql/execution'; + * + * const schema = buildSchema('type Query { greeting: String }'); + * const validatedArgs = validateExecutionArgs({ + * schema, + * document: parse('{ greeting }'), + * rootValue: { greeting: 'Hello' }, + * }); + * + * assert('schema' in validatedArgs); + * + * const result = await experimentalExecuteRootSelectionSet(validatedArgs); + * result; // => { data: { greeting: 'Hello' } } + * ``` + * @category Incremental Execution + */ +export declare function experimentalExecuteRootSelectionSet(validatedExecutionArgs: ValidatedExecutionArgs): PromiseOrValue<ExecutionResult | ExperimentalIncrementalExecutionResults>; +/** + * Also implements the "Executing requests" section of the GraphQL specification. + * However, it guarantees to complete synchronously (or throw an error) assuming + * that all field resolvers are also synchronous. + * @param args - The arguments used to perform the operation. + * @returns Completed execution output for a synchronous operation. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { executeSync } from 'graphql/execution'; + * + * const schema = buildSchema('type Query { greeting: String }'); + * + * const result = executeSync({ + * schema, + * document: parse('{ greeting }'), + * rootValue: { greeting: 'Hello' }, + * }); + * + * result; // => { data: { greeting: 'Hello' } } + * ``` + */ +export declare function executeSync(args: ExecutionArgs): ExecutionResult; +/** + * Executes a subscription operation once for a single source event. + * + * Field errors are collected into the returned result instead of being thrown + * or rejecting the returned promise. + * @param validatedExecutionArgs - Validated subscription execution arguments. + * @returns Execution result for the subscription event. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * executeSubscriptionEvent, + * validateSubscriptionArgs, + * } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * noop: String + * } + * + * type Subscription { + * greeting: String + * } + * `); + * const validatedArgs = validateSubscriptionArgs({ + * schema, + * document: parse('subscription { greeting }'), + * rootValue: { greeting: 'Hello' }, + * }); + * + * assert('schema' in validatedArgs); + * + * const result = await executeSubscriptionEvent(validatedArgs); + * result; // => { data: { greeting: 'Hello' } } + * ``` + */ +export declare function executeSubscriptionEvent(validatedExecutionArgs: ValidatedSubscriptionArgs): PromiseOrValue<ExecutionResult>; +/** + * Implements the "Subscribe" algorithm described in the GraphQL specification. + * + * Returns either an AsyncGenerator (if successful), an ExecutionResult (error), + * or a Promise for one of those results. The call will throw immediately if + * the schema is invalid or the selected operation is not a subscription. + * + * GraphQL request errors, including missing operations and variable coercion + * errors, return or resolve to a GraphQL Response (ExecutionResult) with + * descriptive errors and no data. + * + * If the source stream could not be created due to faulty subscription resolver + * logic, a non-async-iterable resolver result, or a system error, the + * function will return or resolve to a single ExecutionResult containing + * `errors` and no `data`. + * + * If the operation succeeded, the function returns or resolves to an + * AsyncGenerator, which yields a stream of ExecutionResults representing the + * response stream. + * + * This function does not support incremental delivery (`@defer` and `@stream`). + * If an operation which would defer or stream data is executed with this + * function, a field error will be raised at the location of the `@defer` or + * `@stream` directive. + * + * Accepts an object with named arguments. + * @param args - Execution arguments for the subscription operation. + * @returns A response stream for a valid subscription, or an execution result containing errors. + * @example + * ```ts + * // Use a same-named rootValue function to provide the source event stream. + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { subscribe } from 'graphql/execution'; + * + * async function* greetings() { + * yield { greeting: 'Hello' }; + * yield { greeting: 'Bonjour' }; + * } + * + * const schema = buildSchema(` + * type Query { + * noop: String + * } + * + * type Subscription { + * greeting: String + * } + * `); + * + * const result = await subscribe({ + * schema, + * document: parse('subscription { greeting }'), + * rootValue: { greeting: () => greetings() }, + * }); + * + * assert('next' in result); + * + * const firstPayload = await result.next(); + * firstPayload.value; // => { data: { greeting: 'Hello' } } + * ``` + * @example + * ```ts + * // This variant supplies events through a custom subscribeFieldResolver. + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { subscribe } from 'graphql/execution'; + * + * async function* defaultGreetings() { + * yield { greeting: 'Hello' }; + * } + * + * async function* frenchGreetings() { + * yield { greeting: 'Bonjour' }; + * } + * + * const schema = buildSchema(` + * type Query { + * noop: String + * } + * + * type Subscription { + * greeting(locale: String): String + * } + * `); + * + * const result = await subscribe({ + * schema, + * document: parse( + * 'subscription Greeting($locale: String) { greeting(locale: $locale) }', + * ), + * rootValue: { + * greeting: (args, contextValue) => { + * const locale = args.locale ?? contextValue.defaultLocale; + * return locale === 'fr' ? frenchGreetings() : defaultGreetings(); + * }, + * }, + * contextValue: { defaultLocale: 'fr' }, + * variableValues: { locale: 'fr' }, + * operationName: 'Greeting', + * subscribeFieldResolver: (rootValue, args, contextValue, info) => { + * args.locale; // => 'fr' + * return rootValue[info.fieldName](args, contextValue); + * }, + * }); + * + * assert('next' in result); + * + * const firstPayload = await result.next(); + * firstPayload.value; // => { data: { greeting: 'Bonjour' } } + * ``` + */ +export declare function subscribe(args: ExecutionArgs): PromiseOrValue<AsyncGenerator<ExecutionResult, void, void> | ExecutionResult>; +/** + * Implements the "CreateSourceEventStream" algorithm described in the + * GraphQL specification, resolving the subscription source event stream for a + * previously validated subscription request. + * + * Returns either an AsyncIterable (if successful), an ExecutionResult (error), + * or a Promise for one of those results. The call will throw immediately if + * it is not passed validated execution arguments. + * + * If the validated arguments do not result in a compliant subscription, a + * GraphQL Response (ExecutionResult) with descriptive errors and no data will + * be returned. + * + * If the source stream could not be created due to faulty subscription + * resolver logic or a system error, the function will return or + * resolve to a single ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the function returns or resolves to the + * AsyncIterable for the event stream returned by the resolver. + * + * A Source Event Stream represents a sequence of events, each of which triggers + * a GraphQL execution for that event. + * + * This may be useful when hosting the stateful subscription service in a + * different process or machine than the stateless GraphQL execution engine, + * or otherwise separating these two steps. For more on this, see the + * "Supporting Subscriptions at Scale" information in the GraphQL specification. + * @param validatedExecutionArgs - Validated subscription execution arguments. + * @returns A source event stream, or an execution result containing errors. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * createSourceEventStream, + * validateSubscriptionArgs, + * } from 'graphql/execution'; + * + * async function* greetings() { + * yield { greeting: 'Hello' }; + * } + * + * const schema = buildSchema(` + * type Query { + * noop: String + * } + * + * type Subscription { + * greeting: String + * } + * `); + * const validatedArgs = validateSubscriptionArgs({ + * schema, + * document: parse('subscription { greeting }'), + * rootValue: { greeting: () => greetings() }, + * }); + * + * assert('schema' in validatedArgs); + * + * const stream = await createSourceEventStream(validatedArgs); + * Symbol.asyncIterator in stream; // => true + * ``` + */ +export declare function createSourceEventStream(validatedExecutionArgs: ValidatedSubscriptionArgs): PromiseOrValue<AsyncIterable<unknown> | ExecutionResult>; +/** + * Validates the arguments passed to execute, subscribe, and their lower-level + * helpers. + * + * Throws if the schema is invalid. GraphQL request errors, including variable + * coercion errors, are returned as a GraphQLError array. + * @param args - Execution arguments to validate. + * @returns Validated execution arguments, or validation errors. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { validateExecutionArgs } from 'graphql/execution'; + * + * const schema = buildSchema(` + * interface Named { + * name: String! + * } + * + * type User implements Named { + * name: String! + * } + * + * type Query { + * viewer: Named + * } + * `); + * const abortController = new AbortController(); + * const validatedArgs = validateExecutionArgs({ + * schema, + * document: parse('query Viewer { viewer { __typename name } }'), + * rootValue: { viewer: { kind: 'user', name: 'Ada' } }, + * contextValue: { locale: 'en' }, + * operationName: 'Viewer', + * fieldResolver: (source, _args, contextValue, info) => { + * contextValue.locale; // => 'en' + * return source[info.fieldName]; + * }, + * typeResolver: (value) => { + * return value.kind === 'user' ? 'User' : undefined; + * }, + * hideSuggestions: true, + * abortSignal: abortController.signal, + * enableEarlyExecution: true, + * hooks: { + * asyncWorkFinished: () => {}, + * }, + * options: { maxCoercionErrors: 1 }, + * }); + * + * assert('operation' in validatedArgs); + * + * validatedArgs.operation.name?.value; // => 'Viewer' + * validatedArgs.hideSuggestions; // => true + * ``` + */ +export declare function validateExecutionArgs(args: ExecutionArgs): ReadonlyArray<GraphQLError> | ValidatedExecutionArgs; +/** + * Validates execution arguments for a subscription operation. + * + * Throws if the schema is invalid or the selected operation is not a + * subscription. GraphQL request errors, including variable coercion errors, are + * returned as a GraphQLError array. + * @param args - Execution arguments to validate. + * @returns Validated subscription execution arguments, or validation errors. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { validateSubscriptionArgs } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * noop: String + * } + * + * type Subscription { + * greeting: String + * } + * `); + * const validatedArgs = validateSubscriptionArgs({ + * schema, + * document: parse('subscription { greeting }'), + * }); + * + * assert('operation' in validatedArgs); + * + * validatedArgs.operation.operation; // => 'subscription' + * ``` + */ +export declare function validateSubscriptionArgs(args: ExecutionArgs): ReadonlyArray<GraphQLError> | ValidatedSubscriptionArgs; +/** + * If a resolveType function is not given, then a default resolve behavior is + * used which attempts two strategies: + * + * First, See if the provided value has a `__typename` field defined, if so, use + * that value as name of the resolved type. + * + * Otherwise, test each possible type for the abstract type by calling + * isTypeOf for the object being coerced, returning the first type that matches. + */ +export declare const defaultTypeResolver: GraphQLTypeResolver<unknown, unknown>; +/** + * If a resolve function is not given, then a default resolve behavior is used + * which takes the property of the source object of the same name as the field + * and returns it as the result, or if it's a function, returns the result + * of calling that function while passing along args and context value. + */ +export declare const defaultFieldResolver: GraphQLFieldResolver<unknown, unknown>; +/** + * Implements the "MapSourceToResponseEvent" algorithm described in the + * GraphQL specification, mapping each event from a subscription source event + * stream to an ExecutionResult in the response stream. + * @param validatedExecutionArgs - Validated subscription execution arguments. + * @param sourceEventStream - Source event stream returned by the subscription resolver. + * @param rootSelectionSetExecutor - Function used to execute each source event. + * @returns A response stream of execution results. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * mapSourceToResponseEvent, + * validateSubscriptionArgs, + * } from 'graphql/execution'; + * + * async function* events() { + * yield { greeting: 'Hello' }; + * } + * + * const schema = buildSchema(` + * type Query { + * noop: String + * } + * + * type Subscription { + * greeting: String + * } + * `); + * const validatedArgs = validateSubscriptionArgs({ + * schema, + * document: parse('subscription { greeting }'), + * }); + * + * assert('schema' in validatedArgs); + * + * const responseStream = mapSourceToResponseEvent(validatedArgs, events()); + * const firstPayload = await responseStream.next(); + * + * firstPayload.value; // => { data: { greeting: 'Hello' } } + * ``` + */ +export declare function mapSourceToResponseEvent(validatedExecutionArgs: ValidatedSubscriptionArgs, sourceEventStream: AsyncIterable<unknown>, rootSelectionSetExecutor?: RootSelectionSetExecutor): AsyncGenerator<ExecutionResult, void, void>; +/** Function used by a GraphQL harness to parse GraphQL source text. */ +export type GraphQLParseFn = (...args: Parameters<typeof parse>) => PromiseOrValue<ReturnType<typeof parse>>; +/** Function used by a GraphQL harness to validate a parsed document. */ +export type GraphQLValidateFn = (...args: Parameters<typeof validate>) => PromiseOrValue<ReturnType<typeof validate>>; +/** Function used by a GraphQL harness to execute a valid operation. */ +export type GraphQLExecuteFn = (...args: Parameters<typeof execute>) => ReturnType<typeof execute>; +/** Function used by a GraphQL harness to create a subscription response stream. */ +export type GraphQLSubscribeFn = (...args: Parameters<typeof subscribe>) => ReturnType<typeof subscribe>; +/** + * Overrides for the parse, validate, execute, and subscribe stages used by the + * high-level `graphql` and `graphqlSync` request pipeline. + */ +export interface GraphQLHarness { + /** Parses GraphQL source text into a document AST. */ + parse: GraphQLParseFn; + /** Validates a document AST against a schema. */ + validate: GraphQLValidateFn; + /** Executes a valid operation. */ + execute: GraphQLExecuteFn; + /** Creates a response stream for a subscription operation. */ + subscribe: GraphQLSubscribeFn; +} +/** + * Default harness backed by GraphQL.js parse, validate, execute, and subscribe + * implementations. + */ +export declare const defaultHarness: GraphQLHarness; +/** + * Describes the input object accepted by `graphql` and `graphqlSync`. + * + * These arguments describe the full parse, validate, and execute lifecycle for + * a GraphQL request. They include parser options, validation options, execution + * options, and an optional harness for replacing pipeline stages. + * + * `graphql` and `graphqlSync` do not support incremental delivery (`@defer` and + * `@stream`); use `experimentalExecuteIncrementally` after parsing and + * validating when incremental delivery is required. + */ +export interface GraphQLArgs extends ParseOptions, ValidationOptions, Omit<ExecutionArgs, "document"> { + /** + * Custom parse, validate, execute, and subscribe functions for this request + * pipeline. + */ + harness?: GraphQLHarness | undefined; + /** + * A GraphQL language-formatted string or source object representing the + * requested operation. + */ + source: string | Source; + /** Validation rules to use instead of the specified rules. */ + rules?: ReadonlyArray<ValidationRule> | undefined; +} +/** + * Parses, validates, and executes a GraphQL document against a schema. + * + * This is the primary entry point for fulfilling GraphQL operations. Use this + * when you want a single-call request lifecycle that returns a promise in all + * cases. + * + * More sophisticated GraphQL servers, such as those which persist queries, may + * wish to separate the validation and execution phases to a static-time tooling + * step and a server runtime step. + * @param args - Request execution arguments, including schema and source. + * @returns A promise that resolves to an execution result or validation errors. + * @example + * ```ts + * // Execute a complete asynchronous request with variables. + * import { graphql, buildSchema } from 'graphql'; + * + * const schema = buildSchema(` + * type Query { + * greeting(name: String!): String + * } + * `); + * + * const result = await graphql({ + * schema, + * source: 'query SayHello($name: String!) { greeting(name: $name) }', + * rootValue: { + * greeting: ({ name }) => `Hello, ${name}!`, + * }, + * variableValues: { name: 'Ada' }, + * operationName: 'SayHello', + * }); + * + * result; // => { data: { greeting: 'Hello, Ada!' } } + * ``` + * @example + * ```ts + * // This variant supplies context plus custom field and type resolvers. + * import { graphql, buildSchema } from 'graphql'; + * + * const schema = buildSchema(` + * interface Named { + * name: String! + * } + * + * type User implements Named { + * name: String! + * } + * + * type Query { + * viewer: Named + * } + * `); + * + * const result = await graphql({ + * schema, + * source: '{ viewer { __typename name } }', + * rootValue: { viewer: { kind: 'user', name: 'Ada' } }, + * contextValue: { locale: 'en' }, + * fieldResolver: (source, _args, context, info) => { + * context.locale; // => 'en' + * return source[info.fieldName]; + * }, + * typeResolver: (value) => { + * return value.kind === 'user' ? 'User' : undefined; + * }, + * }); + * + * result; // => { data: { viewer: { __typename: 'User', name: 'Ada' } } } + * ``` + * @example + * ```ts + * // This variant customizes the request pipeline with a harness. + * import { buildSchema, defaultHarness, graphql } from 'graphql'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const stages = []; + * const abortController = new AbortController(); + * const harness = { + * parse: (...args) => { + * stages.push('parse'); + * return defaultHarness.parse(...args); + * }, + * validate: (...args) => { + * stages.push('validate'); + * return defaultHarness.validate(...args); + * }, + * execute: (...args) => { + * stages.push('execute'); + * return defaultHarness.execute(...args); + * }, + * subscribe: (...args) => { + * stages.push('subscribe'); + * return defaultHarness.subscribe(...args); + * }, + * }; + * + * const result = await graphql({ + * schema, + * source: '{ greeting }', + * rootValue: { greeting: 'Hello' }, + * rules: [], + * maxErrors: 25, + * hideSuggestions: true, + * noLocation: true, + * abortSignal: abortController.signal, + * harness, + * }); + * + * result; // => { data: { greeting: 'Hello' } } + * stages; // => ['parse', 'validate', 'execute'] + * ``` + * @category Request Pipeline + */ +export declare function graphql(args: GraphQLArgs): Promise<ExecutionResult>; +/** + * Parses, validates, and executes a GraphQL document synchronously. + * + * This function guarantees that execution completes synchronously, or throws an + * error, assuming that all field resolvers are also synchronous. It throws when + * any resolver returns a promise. + * @param args - Request execution arguments, including schema and source. + * @returns Completed execution output, or request errors if parsing or + * validation fails. + * @example + * ```ts + * // Execute a complete synchronous request with variables. + * import { graphqlSync, buildSchema } from 'graphql'; + * + * const schema = buildSchema(` + * type Query { + * greeting(name: String!): String + * } + * `); + * + * const result = graphqlSync({ + * schema, + * source: 'query SayHello($name: String!) { greeting(name: $name) }', + * rootValue: { + * greeting: ({ name }) => `Hello, ${name}!`, + * }, + * variableValues: { name: 'Ada' }, + * operationName: 'SayHello', + * }); + * + * result; // => { data: { greeting: 'Hello, Ada!' } } + * ``` + * @example + * ```ts + * // This variant uses a synchronous custom field resolver and context. + * import { graphqlSync, buildSchema } from 'graphql'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * + * const result = graphqlSync({ + * schema, + * source: '{ greeting }', + * fieldResolver: (_source, _args, contextValue) => { + * return contextValue.defaultGreeting; + * }, + * contextValue: { defaultGreeting: 'Hello' }, + * }); + * + * result; // => { data: { greeting: 'Hello' } } + * ``` + * @category Request Pipeline + */ +export declare function graphqlSync(args: GraphQLArgs): ExecutionResult; +/** + * Render a helpful description of the location in the GraphQL Source document. + * @param location - The AST location to print. + * @returns A formatted source excerpt with line and column information. + * @example + * ```ts + * import { parse, printLocation } from 'graphql/language'; + * + * const document = parse('type Query { hello: String }'); + * const location = document.definitions[0].loc; + * + * if (location) { + * const printed = printLocation(location); + * + * printed; // => 'GraphQL request:1:1\n1 | type Query { hello: String }\n | ^' + * } + * ``` + */ +export declare function printLocation(location: Location$1): string; +/** + * Render a helpful description of the location in the GraphQL Source document. + * @param source - The source document that contains the location. + * @param sourceLocation - The 1-indexed line and column to print. + * @returns A formatted source excerpt with line and column information. + * @example + * ```ts + * import { Source, printSourceLocation } from 'graphql/language'; + * + * const source = new Source('type Query { hello: String }'); + * const printed = printSourceLocation(source, { line: 1, column: 14 }); + * + * printed; // => 'GraphQL request:1:14\n1 | type Query { hello: String }\n | ^' + * ``` + */ +export declare function printSourceLocation(source: Source, sourceLocation: SourceLocation): string; +/** + * Converts an AST into a string, using one set of reasonable + * formatting rules. + * @param ast - The GraphQL AST node to print. + * @returns A stable string representation of the AST. + * @example + * ```ts + * import { parse, print } from 'graphql'; + * + * const ast = parse('{ hero { name } }'); + * const text = print(ast); + * + * text; // => '{\n hero {\n name\n }\n}' + * ``` + */ +export declare function print(ast: ASTNode): string; +/** + * Returns true when the AST node is a definition node. + * @param node - The AST node to test. + * @returns True when the AST node is a definition node. + * @example + * ```ts + * import { parse, isDefinitionNode } from 'graphql/language'; + * + * const document = parse('{ hello }'); + * + * isDefinitionNode(document.definitions[0]); // => true + * isDefinitionNode(document); // => false + * ``` + */ +export declare function isDefinitionNode(node: ASTNode): node is DefinitionNode; +/** + * Returns true when the AST node is an executable definition node. + * @param node - The AST node to test. + * @returns True when the AST node is an executable definition node. + * @example + * ```ts + * import { parse, isExecutableDefinitionNode } from 'graphql/language'; + * + * const query = parse('{ hello }'); + * const schema = parse('type Query { hello: String }'); + * + * isExecutableDefinitionNode(query.definitions[0]); // => true + * isExecutableDefinitionNode(schema.definitions[0]); // => false + * ``` + */ +export declare function isExecutableDefinitionNode(node: ASTNode): node is ExecutableDefinitionNode; +/** + * A type predicate for SubscriptionOperationDefinitionNode. + * Useful anywhere that must distinguish subscription operations from + * queries and mutations, such as the subscription execution pipeline + * which routes events through a different code path. + * @param node - Operation definition node to test. + * @returns True when the operation definition is a subscription. + * @example + * ```ts + * import { parse, isSubscriptionOperationDefinitionNode } from 'graphql/language'; + * + * const subscription = parse('subscription { greeting }').definitions[0]; + * const query = parse('{ greeting }').definitions[0]; + * + * isSubscriptionOperationDefinitionNode(subscription); // => true + * isSubscriptionOperationDefinitionNode(query); // => false + * ``` + */ +export declare function isSubscriptionOperationDefinitionNode(node: OperationDefinitionNode): node is SubscriptionOperationDefinitionNode; +/** + * Returns true when the AST node is a selection node. + * @param node - The AST node to test. + * @returns True when the AST node is a selection node. + * @example + * ```ts + * import { Kind, isSelectionNode } from 'graphql/language'; + * + * const field = { kind: Kind.FIELD, name: { kind: Kind.NAME, value: 'hello' } }; + * const document = { kind: Kind.DOCUMENT, definitions: [] }; + * + * isSelectionNode(field); // => true + * isSelectionNode(document); // => false + * ``` + */ +export declare function isSelectionNode(node: ASTNode): node is SelectionNode; +/** + * Returns true when the AST node is a value node. + * @param node - The AST node to test. + * @returns True when the AST node is a value node. + * @example + * ```ts + * import { parseType, parseValue, isValueNode } from 'graphql/language'; + * + * const value = parseValue('[42]'); + * const type = parseType('[String!]'); + * + * isValueNode(value); // => true + * isValueNode(type); // => false + * ``` + */ +export declare function isValueNode(node: ASTNode): node is ValueNode; +/** + * Returns true when the AST node is a constant value node. + * @param node - The AST node to test. + * @returns True when the AST node is a constant value node. + * @example + * ```ts + * import { + * parseConstValue, + * parseValue, + * isConstValueNode, + * } from 'graphql/language'; + * + * const value = parseConstValue('[42]'); + * const variable = parseValue('$id'); + * + * isConstValueNode(value); // => true + * isConstValueNode(variable); // => false + * ``` + */ +export declare function isConstValueNode(node: ASTNode): node is ConstValueNode; +/** + * Returns true when the AST node is a type node. + * @param node - The AST node to test. + * @returns True when the AST node is a type node. + * @example + * ```ts + * import { parseType, parseValue, isTypeNode } from 'graphql/language'; + * + * const type = parseType('[String!]'); + * const value = parseValue('[42]'); + * + * isTypeNode(type); // => true + * isTypeNode(value); // => false + * ``` + */ +export declare function isTypeNode(node: ASTNode): node is TypeNode; +/** + * Returns true when the AST node is a type system definition node. + * @param node - The AST node to test. + * @returns True when the AST node is a type system definition node. + * @example + * ```ts + * import { parse, isTypeSystemDefinitionNode } from 'graphql/language'; + * + * const schema = parse('type Query { hello: String }'); + * const query = parse('{ hello }'); + * + * isTypeSystemDefinitionNode(schema.definitions[0]); // => true + * isTypeSystemDefinitionNode(query.definitions[0]); // => false + * ``` + */ +export declare function isTypeSystemDefinitionNode(node: ASTNode): node is TypeSystemDefinitionNode; +/** + * Returns true when the AST node is a type definition node. + * @param node - The AST node to test. + * @returns True when the AST node is a type definition node. + * @example + * ```ts + * import { parse, isTypeDefinitionNode } from 'graphql/language'; + * + * const typeDefinition = parse('type Query { hello: String }'); + * const directiveDefinition = parse('directive @cache on FIELD'); + * + * isTypeDefinitionNode(typeDefinition.definitions[0]); // => true + * isTypeDefinitionNode(directiveDefinition.definitions[0]); // => false + * ``` + */ +export declare function isTypeDefinitionNode(node: ASTNode): node is TypeDefinitionNode; +/** + * Returns true when the AST node is a type system extension node. + * @param node - The AST node to test. + * @returns True when the AST node is a type system extension node. + * @example + * ```ts + * import { parse, isTypeSystemExtensionNode } from 'graphql/language'; + * + * const extension = parse('extend type Query { hello: String }'); + * const definition = parse('type Query { hello: String }'); + * + * isTypeSystemExtensionNode(extension.definitions[0]); // => true + * isTypeSystemExtensionNode(definition.definitions[0]); // => false + * ``` + */ +export declare function isTypeSystemExtensionNode(node: ASTNode): node is TypeSystemExtensionNode; +/** + * Returns true when the AST node is a type extension node. + * @param node - The AST node to test. + * @returns True when the AST node is a type extension node. + * @example + * ```ts + * import { parse, isTypeExtensionNode } from 'graphql/language'; + * + * const extension = parse('extend type Query { hello: String }'); + * const schemaExtension = parse('extend schema { query: Query }'); + * + * isTypeExtensionNode(extension.definitions[0]); // => true + * isTypeExtensionNode(schemaExtension.definitions[0]); // => false + * ``` + */ +export declare function isTypeExtensionNode(node: ASTNode): node is TypeExtensionNode; +/** + * Returns true when the AST node is a schema coordinate node. + * @param node - The AST node to test. + * @returns True when the AST node is a schema coordinate node. + * @example + * ```ts + * import { + * parse, + * parseSchemaCoordinate, + * isSchemaCoordinateNode, + * } from 'graphql/language'; + * + * const coordinate = parseSchemaCoordinate('Query.hero'); + * const document = parse('{ hero }'); + * + * isSchemaCoordinateNode(coordinate); // => true + * isSchemaCoordinateNode(document); // => false + * ``` + */ +export declare function isSchemaCoordinateNode(node: ASTNode): node is SchemaCoordinateNode; +/** + * Results for an operation that produced legacy incremental payloads. + * @typeParam TInitialData - Shape of the initial result data payload. + * @typeParam TDeferredData - Shape of deferred fragment data payloads. + * @typeParam TStreamItem - Shape of streamed list items. + * @typeParam TExtensions - Shape of extensions payloads. + */ +export interface LegacyExperimentalIncrementalExecutionResults<TInitialData = ObjMap<unknown>, TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Initial execution result delivered before subsequent legacy incremental payloads. */ + initialResult: LegacyInitialIncrementalExecutionResult<TInitialData, TExtensions>; + /** Async stream of legacy incremental payloads delivered after the initial result. */ + subsequentResults: AsyncGenerator<LegacySubsequentIncrementalExecutionResult<TDeferredData, TStreamItem, TExtensions>, void, void>; +} +/** + * Initial execution result for an operation that produced legacy incremental payloads. + * + * Unlike `InitialIncrementalExecutionResult`, the legacy initial result does + * not include a `pending` list. Subsequent payloads identify their location + * directly with `path` and optional `label` fields. + * @typeParam TInitialData - Shape of the initial data payload. + * @typeParam TExtensions - Shape of the extensions payload. + */ +export interface LegacyInitialIncrementalExecutionResult<TInitialData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> extends ExecutionResult<TInitialData, TExtensions> { + /** Data produced by the initial execution payload. */ + data: TInitialData; + /** Indicates that subsequent legacy incremental payloads will follow. */ + hasNext: true; + /** Additional non-standard metadata included in the initial result. */ + extensions?: TExtensions; +} +/** + * Subsequent payload produced by legacy incremental execution. + * + * Legacy subsequent payloads may contain deferred fragment data, streamed list + * items, or only `hasNext: false` to complete the response stream. + * @typeParam TDeferredData - Shape of deferred fragment data payloads. + * @typeParam TStreamItem - Shape of streamed list items. + * @typeParam TExtensions - Shape of the extensions payload. + */ +export interface LegacySubsequentIncrementalExecutionResult<TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Deferred or streamed payloads delivered by this response. */ + incremental?: ReadonlyArray<LegacyIncrementalResult<TDeferredData, TStreamItem, TExtensions>>; + /** Indicates whether more legacy incremental payloads will follow. */ + hasNext: boolean; + /** Additional non-standard metadata included in this payload. */ + extensions?: TExtensions; +} +/** + * Deferred fragment or streamed list payload produced by legacy incremental execution. + * @typeParam TDeferredData - Shape of deferred fragment data. + * @typeParam TStreamItem - Shape of streamed list items. + * @typeParam TExtensions - Shape of extensions payloads. + */ +export type LegacyIncrementalResult<TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> = LegacyIncrementalDeferResult<TDeferredData, TExtensions> | LegacyIncrementalStreamResult<TStreamItem, TExtensions>; +/** + * Legacy incremental payload produced by a deferred fragment. + * + * The payload location is identified directly by `path` and optional `label` + * instead of by an `id` from a pending entry. + * @typeParam TDeferredData - Shape of deferred fragment data. + * @typeParam TExtensions - Shape of extensions payloads. + */ +export interface LegacyIncrementalDeferResult<TDeferredData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> extends ExecutionResult<TDeferredData, TExtensions> { + /** Response path to the deferred fragment payload. */ + path: ReadonlyArray<string | number>; + /** Label from the `@defer` directive. */ + label?: string; +} +/** + * Legacy incremental payload produced by a streamed list field. + * @typeParam TStreamItem - Shape of streamed list items. + * @typeParam TExtensions - Shape of extensions payloads. + */ +export interface LegacyIncrementalStreamResult<TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Errors raised while producing streamed items. */ + errors?: ReadonlyArray<GraphQLError>; + /** Streamed list items delivered by this payload. */ + items: ReadonlyArray<TStreamItem> | null; + /** Response path to the first streamed list item in this payload. */ + path: ReadonlyArray<string | number>; + /** Label from the `@stream` directive. */ + label?: string; + /** Additional non-standard metadata included in this payload. */ + extensions?: TExtensions; +} +/** + * JSON-serializable form of legacy incremental execution results. + * @typeParam TInitialData - Shape of the formatted initial result data payload. + * @typeParam TDeferredData - Shape of formatted deferred fragment data payloads. + * @typeParam TStreamItem - Shape of formatted streamed list items. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export interface FormattedLegacyExperimentalIncrementalExecutionResults<TInitialData = ObjMap<unknown>, TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Formatted initial execution result. */ + initialResult: FormattedLegacyInitialIncrementalExecutionResult<TInitialData, TExtensions>; + /** Async stream of formatted legacy incremental payloads. */ + subsequentResults: AsyncGenerator<FormattedLegacySubsequentIncrementalExecutionResult<TDeferredData, TStreamItem, TExtensions>, void, void>; +} +/** + * JSON-serializable form of a legacy initial incremental execution result. + * @typeParam TInitialData - Shape of the formatted initial data payload. + * @typeParam TExtensions - Shape of the formatted extensions payload. + */ +export interface FormattedLegacyInitialIncrementalExecutionResult<TInitialData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> extends FormattedExecutionResult<TInitialData, TExtensions> { + /** Formatted data produced by the initial execution payload. */ + data: TInitialData; + /** Indicates that subsequent legacy incremental payloads will follow. */ + hasNext: true; + /** Additional non-standard metadata included in the formatted initial result. */ + extensions?: TExtensions; +} +/** + * JSON-serializable form of a legacy subsequent incremental execution payload. + * @typeParam TDeferredData - Shape of formatted deferred fragment data payloads. + * @typeParam TStreamItem - Shape of formatted streamed list items. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export interface FormattedLegacySubsequentIncrementalExecutionResult<TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Formatted deferred or streamed payloads delivered by this response. */ + incremental?: ReadonlyArray<FormattedLegacyIncrementalResult<TDeferredData, TStreamItem, TExtensions>>; + /** Indicates whether more legacy incremental payloads will follow. */ + hasNext: boolean; + /** Additional non-standard metadata included in this formatted payload. */ + extensions?: TExtensions; +} +/** + * JSON-serializable deferred fragment or streamed list payload produced by + * legacy incremental execution. + * @typeParam TDeferredData - Shape of formatted deferred fragment data. + * @typeParam TStreamItem - Shape of formatted streamed list items. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export type FormattedLegacyIncrementalResult<TDeferredData = ObjMap<unknown>, TStreamItem = unknown, TExtensions = ObjMap<unknown>> = FormattedLegacyIncrementalDeferResult<TDeferredData, TExtensions> | FormattedLegacyIncrementalStreamResult<TStreamItem, TExtensions>; +/** + * JSON-serializable form of a legacy deferred fragment payload. + * @typeParam TDeferredData - Shape of formatted deferred fragment data. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export interface FormattedLegacyIncrementalDeferResult<TDeferredData = ObjMap<unknown>, TExtensions = ObjMap<unknown>> extends FormattedExecutionResult<TDeferredData, TExtensions> { + /** Response path to the formatted deferred fragment payload. */ + path: ReadonlyArray<string | number>; + /** Label from the `@defer` directive. */ + label?: string; +} +/** + * JSON-serializable form of a legacy streamed list payload. + * @typeParam TStreamItem - Shape of formatted streamed list items. + * @typeParam TExtensions - Shape of formatted extensions payloads. + */ +export interface FormattedLegacyIncrementalStreamResult<TStreamItem = unknown, TExtensions = ObjMap<unknown>> { + /** Formatted errors raised while producing streamed items. */ + errors?: ReadonlyArray<GraphQLFormattedError>; + /** Formatted streamed list items delivered by this payload. */ + items: ReadonlyArray<TStreamItem> | null; + /** Response path to the first streamed list item in this formatted payload. */ + path: ReadonlyArray<string | number>; + /** Label from the `@stream` directive. */ + label?: string; + /** Additional non-standard metadata included in this formatted payload. */ + extensions?: TExtensions; +} +/** + * Executes a GraphQL operation with support for `@defer` and `@stream` using + * the legacy incremental delivery payload format. + * + * Prefer `experimentalExecuteIncrementally` for the current incremental + * delivery format. In the legacy format, each subsequent incremental payload + * identifies its location with `path` and optional `label` fields. The current + * format instead tracks pending work by `id` and reports completion through + * `completed` entries. + * @param args - Execution arguments for the GraphQL operation. + * @returns A single execution result or legacy incremental execution results. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { legacyExecuteIncrementally } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * hero: Hero + * } + * + * type Hero { + * id: ID! + * name: String! + * } + * `); + * + * const result = await legacyExecuteIncrementally({ + * schema, + * document: parse('{ hero { id ... @defer(label: "HeroName") { name } } }'), + * rootValue: { hero: { id: '1', name: 'Luke' } }, + * }); + * + * assert('initialResult' in result); + * + * result.initialResult; // => { data: { hero: { id: '1' } }, hasNext: true } + * + * const deferred = await result.subsequentResults.next(); + * deferred.value; // => { incremental: [ { data: { name: 'Luke' }, path: ['hero'], label: 'HeroName' } ], hasNext: false } + * ``` + * @example + * Compare the legacy payload format with the current incremental delivery + * format returned by `experimentalExecuteIncrementally`. + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * experimentalExecuteIncrementally, + * legacyExecuteIncrementally, + * } from 'graphql/execution'; + * + * const schema = buildSchema(` + * type Query { + * hero: Hero + * } + * + * type Hero { + * id: ID! + * name: String! + * } + * `); + * const document = parse('{ hero { id ... @defer { name } } }'); + * const rootValue = { hero: { id: '1', name: 'Luke' } }; + * + * const experimental = await experimentalExecuteIncrementally({ + * schema, + * document, + * rootValue, + * }); + * const legacy = await legacyExecuteIncrementally({ + * schema, + * document, + * rootValue, + * }); + * + * assert('initialResult' in experimental); + * assert('initialResult' in legacy); + * + * experimental.initialResult; // => { data: { hero: { id: '1' } }, pending: [ { id: '0', path: ['hero'] } ], hasNext: true } + * legacy.initialResult; // => { data: { hero: { id: '1' } }, hasNext: true } + * + * const experimentalDeferred = await experimental.subsequentResults.next(); + * experimentalDeferred.value; // => { incremental: [{ data: { name: 'Luke' }, id: '0' }], completed: [{ id: '0' }], hasNext: false } + * + * const legacyDeferred = await legacy.subsequentResults.next(); + * legacyDeferred.value; // => { incremental: [ { data: { name: 'Luke' }, path: ['hero'] } ], hasNext: false } + * ``` + * @example + * Compare streamed list payloads in the legacy and current incremental + * delivery formats. + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * experimentalExecuteIncrementally, + * legacyExecuteIncrementally, + * } from 'graphql/execution'; + * + * const schema = buildSchema('type Query { colors: [String] }'); + * const document = parse('{ colors @stream(initialCount: 1) }'); + * const rootValue = { colors: ['red', 'green', 'blue'] }; + * + * const experimental = await experimentalExecuteIncrementally({ + * schema, + * document, + * rootValue, + * }); + * const legacy = await legacyExecuteIncrementally({ + * schema, + * document, + * rootValue, + * }); + * + * assert('initialResult' in experimental); + * assert('initialResult' in legacy); + * + * experimental.initialResult; // => { data: { colors: ['red'] }, pending: [ { id: '0', path: ['colors'] } ], hasNext: true } + * legacy.initialResult; // => { data: { colors: ['red'] }, hasNext: true } + * + * const experimentalStream = await experimental.subsequentResults.next(); + * experimentalStream.value; // => { incremental: [ { items: ['green', 'blue'], id: '0' } ], completed: [{ id: '0' }], hasNext: false } + * + * const legacyStream = await legacy.subsequentResults.next(); + * legacyStream.value; // => { incremental: [ { items: ['green', 'blue'], path: ['colors', 1] } ], hasNext: false } + * ``` + */ +export declare function legacyExecuteIncrementally(args: ExecutionArgs): PromiseOrValue<ExecutionResult | LegacyExperimentalIncrementalExecutionResults>; +/** + * Executes a validated operation root selection set with support for `@defer` + * and `@stream` using the legacy incremental delivery payload format. + * @param validatedExecutionArgs - Validated execution arguments. + * @returns A single execution result or legacy incremental execution results. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * legacyExecuteRootSelectionSet, + * validateExecutionArgs, + * } from 'graphql/execution'; + * + * const schema = buildSchema('type Query { greeting: String }'); + * const validatedArgs = validateExecutionArgs({ + * schema, + * document: parse('{ greeting }'), + * rootValue: { greeting: 'Hello' }, + * }); + * + * assert('schema' in validatedArgs); + * + * const result = await legacyExecuteRootSelectionSet(validatedArgs); + * result; // => { data: { greeting: 'Hello' } } + * ``` + */ +export declare function legacyExecuteRootSelectionSet(validatedExecutionArgs: ValidatedExecutionArgs): PromiseOrValue<ExecutionResult | LegacyExperimentalIncrementalExecutionResults>; +/** + * Technically these aren't part of the spec but they are strongly encouraged + * validation rules. + */ +export declare const recommendedRules: ReadonlyArray<ValidationRule>; +/** + * This set includes all validation rules defined by the GraphQL spec. + * + * The order of the rules in this list has been adjusted to lead to the + * most clear output when encountering multiple validation errors. + */ +export declare const specifiedRules: ReadonlyArray<ValidationRule>; +/** + * Defer and stream directive labels are unique + * + * A GraphQL document is only valid if defer and stream directives' label argument is static and unique. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { validate, DeferStreamDirectiveLabelRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * friends: [String] + * } + * `); + * const invalidDocument = parse(` + * { + * friends @stream(label: "friends") + * other: friends @stream(label: "friends") + * } + * `); + * const validDocument = parse(` + * { + * friends @stream(label: "friends") + * other: friends @stream(label: "otherFriends") + * } + * `); + * + * validate(schema, invalidDocument, [DeferStreamDirectiveLabelRule]).length; // => 1 + * validate(schema, validDocument, [DeferStreamDirectiveLabelRule]); // => [] + * ``` + */ +export declare function DeferStreamDirectiveLabelRule(context: ValidationContext): ASTVisitor; +/** + * Defer and stream directives are used on valid root field + * + * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * validate, + * DeferStreamDirectiveOnRootFieldRule, + * } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * message: String + * } + * + * type Mutation { + * updateMessage: String + * } + * `); + * const invalidDocument = parse(` + * mutation { ... @defer { updateMessage } } + * `); + * const validDocument = parse(` + * { ... @defer { message } } + * `); + * + * validate(schema, invalidDocument, [DeferStreamDirectiveOnRootFieldRule]).length; // => 1 + * validate(schema, validDocument, [DeferStreamDirectiveOnRootFieldRule]); // => [] + * ``` + */ +export declare function DeferStreamDirectiveOnRootFieldRule(context: ValidationContext): ASTVisitor; +/** + * Defer And Stream Directives Are Used On Valid Operations + * + * A GraphQL document is only valid if defer and stream directives are not used on root mutation or subscription types. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { + * validate, + * DeferStreamDirectiveOnValidOperationsRule, + * } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * message: Message + * } + * + * type Subscription { + * message: Message + * } + * + * type Message { + * body: String + * } + * `); + * const invalidDocument = parse(` + * subscription { + * message { + * ...MessageBody @defer + * } + * } + * + * fragment MessageBody on Message { + * body + * } + * `); + * const validDocument = parse(` + * subscription { + * message { + * ...MessageBody @defer(if: false) + * } + * } + * + * fragment MessageBody on Message { + * body + * } + * `); + * + * validate(schema, invalidDocument, [DeferStreamDirectiveOnValidOperationsRule]) + * .length; // => 1 + * validate(schema, validDocument, [DeferStreamDirectiveOnValidOperationsRule]); // => [] + * ``` + */ +export declare function DeferStreamDirectiveOnValidOperationsRule(context: ValidationContext): ASTVisitor; +/** + * Executable definitions + * + * A GraphQL document is only valid for execution if all definitions are either + * operation or fragment definitions. + * + * See https://spec.graphql.org/draft/#sec-Executable-Definitions + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { ExecutableDefinitionsRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * type Extra { field: String } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * ExecutableDefinitionsRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { name } + * `); + * const validErrors = validate(schema, validDocument, [ + * ExecutableDefinitionsRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function ExecutableDefinitionsRule(context: ASTValidationContext): ASTVisitor; +/** + * Fields on correct type + * + * A GraphQL document is only valid if all fields selected are defined by the + * parent type, or are an allowed meta field such as __typename. + * + * See https://spec.graphql.org/draft/#sec-Field-Selections + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { FieldsOnCorrectTypeRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * { missing } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * FieldsOnCorrectTypeRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { name } + * `); + * const validErrors = validate(schema, validDocument, [FieldsOnCorrectTypeRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function FieldsOnCorrectTypeRule(context: ValidationContext): ASTVisitor; +/** + * Fragments on composite type + * + * Fragments use a type condition to determine if they apply, since fragments + * can only be spread into a composite type (object, interface, or union), the + * type condition must also be a composite type. + * + * See https://spec.graphql.org/draft/#sec-Fragments-On-Composite-Types + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { FragmentsOnCompositeTypesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * fragment Bad on String { length } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * FragmentsOnCompositeTypesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * fragment Good on Query { name } + * `); + * const validErrors = validate(schema, validDocument, [ + * FragmentsOnCompositeTypesRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function FragmentsOnCompositeTypesRule(context: ValidationContext): ASTVisitor; +/** + * Known argument names + * + * A GraphQL field is only valid if all supplied arguments are defined by + * that field. + * + * See https://spec.graphql.org/draft/#sec-Argument-Names + * See https://spec.graphql.org/draft/#sec-Directives-Are-In-Valid-Locations + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { KnownArgumentNamesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * field(arg: String): String + * } + * `); + * + * const invalidDocument = parse(` + * { field(unknown: "1") } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * KnownArgumentNamesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { field(arg: "1") } + * `); + * const validErrors = validate(schema, validDocument, [KnownArgumentNamesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function KnownArgumentNamesRule(context: ValidationContext): ASTVisitor; +/** + * Known directives + * + * A GraphQL document is only valid if all `@directives` are known by the + * schema and legally positioned. + * + * See https://spec.graphql.org/draft/#sec-Directives-Are-Defined + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { KnownDirectivesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * { name @unknown } + * `); + * const invalidErrors = validate(schema, invalidDocument, [KnownDirectivesRule]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { name @include(if: true) } + * `); + * const validErrors = validate(schema, validDocument, [KnownDirectivesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function KnownDirectivesRule(context: ValidationContext | SDLValidationContext): ASTVisitor; +/** + * Known fragment names + * + * A GraphQL document is only valid if all `...Fragment` fragment spreads refer + * to fragments defined in the same document. + * + * See https://spec.graphql.org/draft/#sec-Fragment-spread-target-defined + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { KnownFragmentNamesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * { ...Missing } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * KnownFragmentNamesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * fragment NameFields on Query { name } query { ...NameFields } + * `); + * const validErrors = validate(schema, validDocument, [KnownFragmentNamesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function KnownFragmentNamesRule(context: ValidationContext): ASTVisitor; +/** + * Known Operation Types + * + * A GraphQL document is only valid if when it contains an operation, + * the root type for the operation exists within the schema. + * + * See https://spec.graphql.org/draft/#sec-Operation-Type-Existence + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { validate, KnownOperationTypesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const invalidDocument = parse('mutation { greeting }'); + * const validDocument = parse('{ greeting }'); + * + * validate(schema, invalidDocument, [KnownOperationTypesRule])[0].message; // => 'The mutation operation is not supported by the schema.' + * validate(schema, validDocument, [KnownOperationTypesRule]); // => [] + * ``` + */ +export declare function KnownOperationTypesRule(context: ValidationContext): ASTVisitor; +/** + * Known type names + * + * A GraphQL document is only valid if referenced types (specifically + * variable definitions and fragment conditions) are defined by the type schema. + * + * See https://spec.graphql.org/draft/#sec-Fragment-Spread-Type-Existence + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { KnownTypeNamesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * fragment Bad on Missing { name } + * `); + * const invalidErrors = validate(schema, invalidDocument, [KnownTypeNamesRule]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * fragment Good on Query { name } + * `); + * const validErrors = validate(schema, validDocument, [KnownTypeNamesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function KnownTypeNamesRule(context: ValidationContext | SDLValidationContext): ASTVisitor; +/** + * Lone anonymous operation + * + * A GraphQL document is only valid if when it contains an anonymous operation + * (the query short-hand) that it contains only that one operation definition. + * + * See https://spec.graphql.org/draft/#sec-Lone-Anonymous-Operation + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { LoneAnonymousOperationRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * query { name } query Other { name } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * LoneAnonymousOperationRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { name } + * `); + * const validErrors = validate(schema, validDocument, [ + * LoneAnonymousOperationRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function LoneAnonymousOperationRule(context: ASTValidationContext): ASTVisitor; +/** + * No fragment cycles + * + * The graph of fragment spreads must not form any cycles including spreading itself. + * Otherwise an operation could infinitely spread or infinitely execute on cycles in the underlying data. + * + * See https://spec.graphql.org/draft/#sec-Fragment-spreads-must-not-form-cycles + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { NoFragmentCyclesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * fragment A on Query { ...B } fragment B on Query { ...A } query { ...A } + * `); + * const invalidErrors = validate(schema, invalidDocument, [NoFragmentCyclesRule]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * fragment A on Query { name } query { ...A } + * `); + * const validErrors = validate(schema, validDocument, [NoFragmentCyclesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function NoFragmentCyclesRule(context: ASTValidationContext): ASTVisitor; +/** + * No undefined variables + * + * A GraphQL operation is only valid if all variables encountered, both directly + * and via fragment spreads, are defined by that operation. + * + * See https://spec.graphql.org/draft/#sec-All-Variable-Uses-Defined + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { NoUndefinedVariablesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * field(arg: ID): String + * } + * `); + * + * const invalidDocument = parse(` + * query ($id: ID) { field(arg: $missing) } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * NoUndefinedVariablesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * query ($id: ID) { field(arg: $id) } + * `); + * const validErrors = validate(schema, validDocument, [NoUndefinedVariablesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function NoUndefinedVariablesRule(context: ValidationContext): ASTVisitor; +/** + * No unused fragments + * + * A GraphQL document is only valid if all fragment definitions are spread + * within operations, or spread within other fragments spread within operations. + * + * See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-Used + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { NoUnusedFragmentsRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * fragment Unused on Query { name } query { name } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * NoUnusedFragmentsRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * fragment Used on Query { name } query { ...Used } + * `); + * const validErrors = validate(schema, validDocument, [NoUnusedFragmentsRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function NoUnusedFragmentsRule(context: ASTValidationContext): ASTVisitor; +/** + * No unused variables + * + * A GraphQL operation is only valid if all variables defined by an operation + * are used, either directly or within a spread fragment. + * + * See https://spec.graphql.org/draft/#sec-All-Variables-Used + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { NoUnusedVariablesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * field(arg: ID): String + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * query ($id: ID) { name } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * NoUnusedVariablesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * query ($id: ID) { field(arg: $id) } + * `); + * const validErrors = validate(schema, validDocument, [NoUnusedVariablesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function NoUnusedVariablesRule(context: ValidationContext): ASTVisitor; +/** + * Overlapping fields can be merged + * + * A selection set is only valid if all fields (including spreading any + * fragments) either correspond to distinct response names or can be merged + * without ambiguity. + * + * See https://spec.graphql.org/draft/#sec-Field-Selection-Merging + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { OverlappingFieldsCanBeMergedRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * dog: Dog + * } + * + * type Dog { + * name: String + * barkVolume: Int + * } + * `); + * + * const invalidDocument = parse(` + * { dog { value: barkVolume value: name } } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * OverlappingFieldsCanBeMergedRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { dog { barkVolume name } } + * `); + * const validErrors = validate(schema, validDocument, [ + * OverlappingFieldsCanBeMergedRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function OverlappingFieldsCanBeMergedRule(context: ValidationContext): ASTVisitor; +/** + * Possible fragment spread + * + * A fragment spread is only valid if the type condition could ever possibly + * be true: if there is a non-empty intersection of the possible parent types, + * and possible types which pass the type condition. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { PossibleFragmentSpreadsRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * dog: Dog + * } + * + * type Dog { + * barkVolume: Int + * } + * + * type Cat { + * meowVolume: Int + * } + * `); + * + * const invalidDocument = parse(` + * { dog { ... on Cat { meowVolume } } } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * PossibleFragmentSpreadsRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { dog { ... on Dog { barkVolume } } } + * `); + * const validErrors = validate(schema, validDocument, [ + * PossibleFragmentSpreadsRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function PossibleFragmentSpreadsRule(context: ValidationContext): ASTVisitor; +/** + * Provided required arguments + * + * A field or directive is only valid if all required (non-null without a + * default value) field arguments have been provided. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { ProvidedRequiredArgumentsRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * field(required: String!): String + * } + * `); + * + * const invalidDocument = parse(` + * { field } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * ProvidedRequiredArgumentsRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { field(required: "x") } + * `); + * const validErrors = validate(schema, validDocument, [ + * ProvidedRequiredArgumentsRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function ProvidedRequiredArgumentsRule(context: ValidationContext): ASTVisitor; +/** + * Scalar leafs + * + * A GraphQL document is valid only if all leaf fields (fields without + * sub selections) are of scalar or enum types. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { ScalarLeafsRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * { name { length } } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ScalarLeafsRule]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { name } + * `); + * const validErrors = validate(schema, validDocument, [ScalarLeafsRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function ScalarLeafsRule(context: ValidationContext): ASTVisitor; +/** + * Subscriptions must only include a non-introspection field. + * + * A GraphQL subscription is valid only if it contains a single root field and + * that root field is not an introspection field. + * + * See https://spec.graphql.org/draft/#sec-Single-root-field + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { SingleFieldSubscriptionsRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * + * type Subscription { + * a: String + * b: String + * } + * `); + * + * const invalidDocument = parse(` + * subscription { a b } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * SingleFieldSubscriptionsRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * subscription { a } + * `); + * const validErrors = validate(schema, validDocument, [ + * SingleFieldSubscriptionsRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function SingleFieldSubscriptionsRule(context: ValidationContext): ASTVisitor; +/** + * Stream directives are used on list fields + * + * A GraphQL document is only valid if stream directives are used on list fields. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { buildSchema } from 'graphql/utilities'; + * import { validate, StreamDirectiveOnListFieldRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * friends: [String] + * } + * `); + * const invalidDocument = parse('{ name @stream(initialCount: 0) }'); + * const validDocument = parse('{ friends @stream(initialCount: 0) }'); + * + * validate(schema, invalidDocument, [StreamDirectiveOnListFieldRule]).length; // => 1 + * validate(schema, validDocument, [StreamDirectiveOnListFieldRule]); // => [] + * ``` + */ +export declare function StreamDirectiveOnListFieldRule(context: ValidationContext): ASTVisitor; +/** + * Unique argument names + * + * A GraphQL field or directive is only valid if all supplied arguments are + * uniquely named. + * + * See https://spec.graphql.org/draft/#sec-Argument-Names + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { UniqueArgumentNamesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * field(arg: String): String + * } + * `); + * + * const invalidDocument = parse(` + * { field(arg: "1", arg: "2") } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * UniqueArgumentNamesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { field(arg: "1") } + * `); + * const validErrors = validate(schema, validDocument, [UniqueArgumentNamesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function UniqueArgumentNamesRule(context: ASTValidationContext): ASTVisitor; +/** + * Unique directive names per location + * + * A GraphQL document is only valid if all non-repeatable directives at + * a given location are uniquely named. + * + * See https://spec.graphql.org/draft/#sec-Directives-Are-Unique-Per-Location + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { UniqueDirectivesPerLocationRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * { name @include(if: true) @include(if: false) } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * UniqueDirectivesPerLocationRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { name @include(if: true) } + * `); + * const validErrors = validate(schema, validDocument, [ + * UniqueDirectivesPerLocationRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function UniqueDirectivesPerLocationRule(context: ValidationContext | SDLValidationContext): ASTVisitor; +/** + * Unique fragment names + * + * A GraphQL document is only valid if all defined fragments have unique names. + * + * See https://spec.graphql.org/draft/#sec-Fragment-Name-Uniqueness + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { UniqueFragmentNamesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * fragment A on Query { name } fragment A on Query { name } query { ...A } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * UniqueFragmentNamesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * fragment A on Query { name } query { ...A } + * `); + * const validErrors = validate(schema, validDocument, [UniqueFragmentNamesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function UniqueFragmentNamesRule(context: ASTValidationContext): ASTVisitor; +/** + * Unique input field names + * + * A GraphQL input object value is only valid if all supplied fields are + * uniquely named. + * + * See https://spec.graphql.org/draft/#sec-Input-Object-Field-Uniqueness + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { UniqueInputFieldNamesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * input Filter { + * name: String + * } + * + * type Query { + * search(filter: Filter): String + * } + * `); + * + * const invalidDocument = parse(` + * { search(filter: { name: "a", name: "b" }) } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * UniqueInputFieldNamesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { search(filter: { name: "a" }) } + * `); + * const validErrors = validate(schema, validDocument, [ + * UniqueInputFieldNamesRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function UniqueInputFieldNamesRule(context: ASTValidationContext): ASTVisitor; +/** + * Unique operation names + * + * A GraphQL document is only valid if all defined operations have unique names. + * + * See https://spec.graphql.org/draft/#sec-Operation-Name-Uniqueness + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { UniqueOperationNamesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * query Same { name } query Same { name } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * UniqueOperationNamesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * query One { name } query Two { name } + * `); + * const validErrors = validate(schema, validDocument, [UniqueOperationNamesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function UniqueOperationNamesRule(context: ASTValidationContext): ASTVisitor; +/** + * Unique variable names + * + * A GraphQL operation is only valid if all its variables are uniquely named. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { UniqueVariableNamesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * field(arg: ID): String + * } + * `); + * + * const invalidDocument = parse(` + * query ($id: ID, $id: ID) { field(arg: $id) } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * UniqueVariableNamesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * query ($id: ID) { field(arg: $id) } + * `); + * const validErrors = validate(schema, validDocument, [UniqueVariableNamesRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function UniqueVariableNamesRule(context: ASTValidationContext): ASTVisitor; +/** + * Value literals of correct type + * + * A GraphQL document is only valid if all value literals are of the type + * expected at their position. + * + * See https://spec.graphql.org/draft/#sec-Values-of-Correct-Type + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { ValuesOfCorrectTypeRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * count(limit: Int): Int + * } + * `); + * + * const invalidDocument = parse(` + * { count(limit: "many") } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * ValuesOfCorrectTypeRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { count(limit: 1) } + * `); + * const validErrors = validate(schema, validDocument, [ValuesOfCorrectTypeRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function ValuesOfCorrectTypeRule(context: ValidationContext): ASTVisitor; +/** + * Variables are input types + * + * A GraphQL operation is only valid if all the variables it defines are of + * input types (scalar, enum, or input object). + * + * See https://spec.graphql.org/draft/#sec-Variables-Are-Input-Types + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { VariablesAreInputTypesRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * field(arg: ID): String + * } + * + * type User { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * query ($user: User) { field(arg: "1") } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * VariablesAreInputTypesRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * query ($id: ID) { field(arg: $id) } + * `); + * const validErrors = validate(schema, validDocument, [ + * VariablesAreInputTypesRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function VariablesAreInputTypesRule(context: ValidationContext): ASTVisitor; +/** + * Variables in allowed position + * + * Variable usages must be compatible with the arguments they are passed to. + * + * See https://spec.graphql.org/draft/#sec-All-Variable-Usages-are-Allowed + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { VariablesInAllowedPositionRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * field(arg: ID!): String + * } + * `); + * + * const invalidDocument = parse(` + * query ($id: String) { field(arg: $id) } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * VariablesInAllowedPositionRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * query ($id: ID!) { field(arg: $id) } + * `); + * const validErrors = validate(schema, validDocument, [ + * VariablesInAllowedPositionRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function VariablesInAllowedPositionRule(context: ValidationContext): ASTVisitor; +/** + * Implements the max introspection depth validation rule. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { MaxIntrospectionDepthRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * { __schema { types { fields { type { fields { type { fields { name } } } } } } } } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * MaxIntrospectionDepthRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { __schema { queryType { name } } } + * `); + * const validErrors = validate(schema, validDocument, [ + * MaxIntrospectionDepthRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function MaxIntrospectionDepthRule(context: ASTValidationContext): ASTVisitor; +/** + * Lone Schema definition + * + * A GraphQL document is only valid if it contains only one schema definition. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema } from 'graphql'; + * import { LoneSchemaDefinitionRule } from 'graphql/validation'; + * + * const invalidSDL = ` + * schema { query: Query } schema { query: Query } type Query { name: String } + * `; + * + * LoneSchemaDefinitionRule.name; // => 'LoneSchemaDefinitionRule' + * buildSchema(invalidSDL); // throws an error + * + * const validSDL = ` + * schema { query: Query } type Query { name: String } + * `; + * + * buildSchema(validSDL); // does not throw + * ``` + */ +export declare function LoneSchemaDefinitionRule(context: SDLValidationContext): ASTVisitor; +/** + * Unique operation types + * + * A GraphQL document is only valid if it has only one type per operation. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema } from 'graphql'; + * import { UniqueOperationTypesRule } from 'graphql/validation'; + * + * const invalidSDL = ` + * schema { query: Query query: Other } type Query { name: String } type Other { name: String } + * `; + * + * UniqueOperationTypesRule.name; // => 'UniqueOperationTypesRule' + * buildSchema(invalidSDL); // throws an error + * + * const validSDL = ` + * schema { query: Query } type Query { name: String } + * `; + * + * buildSchema(validSDL); // does not throw + * ``` + */ +export declare function UniqueOperationTypesRule(context: SDLValidationContext): ASTVisitor; +/** + * Unique type names + * + * A GraphQL document is only valid if all defined types have unique names. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema } from 'graphql'; + * import { UniqueTypeNamesRule } from 'graphql/validation'; + * + * const invalidSDL = ` + * type Query { name: String } type Query { other: String } + * `; + * + * UniqueTypeNamesRule.name; // => 'UniqueTypeNamesRule' + * buildSchema(invalidSDL); // throws an error + * + * const validSDL = ` + * type Query { name: String } type Other { name: String } + * `; + * + * buildSchema(validSDL); // does not throw + * ``` + */ +export declare function UniqueTypeNamesRule(context: SDLValidationContext): ASTVisitor; +/** + * Unique enum value names + * + * A GraphQL enum type is only valid if all its values are uniquely named. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema } from 'graphql'; + * import { UniqueEnumValueNamesRule } from 'graphql/validation'; + * + * const invalidSDL = ` + * enum Status { ACTIVE ACTIVE } type Query { status: Status } + * `; + * + * UniqueEnumValueNamesRule.name; // => 'UniqueEnumValueNamesRule' + * buildSchema(invalidSDL); // throws an error + * + * const validSDL = ` + * enum Status { ACTIVE INACTIVE } type Query { status: Status } + * `; + * + * buildSchema(validSDL); // does not throw + * ``` + */ +export declare function UniqueEnumValueNamesRule(context: SDLValidationContext): ASTVisitor; +/** + * Unique field definition names + * + * A GraphQL complex type is only valid if all its fields are uniquely named. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema } from 'graphql'; + * import { UniqueFieldDefinitionNamesRule } from 'graphql/validation'; + * + * const invalidSDL = ` + * type Query { name: String name: String } + * `; + * + * UniqueFieldDefinitionNamesRule.name; // => 'UniqueFieldDefinitionNamesRule' + * buildSchema(invalidSDL); // throws an error + * + * const validSDL = ` + * type Query { name: String other: String } + * `; + * + * buildSchema(validSDL); // does not throw + * ``` + */ +export declare function UniqueFieldDefinitionNamesRule(context: SDLValidationContext): ASTVisitor; +/** + * Unique argument definition names + * + * A GraphQL Object or Interface type is only valid if all its fields have uniquely named arguments. + * A GraphQL Directive is only valid if all its arguments are uniquely named. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema } from 'graphql'; + * import { UniqueArgumentDefinitionNamesRule } from 'graphql/validation'; + * + * const invalidSDL = ` + * type Query { field(arg: String, arg: Int): String } + * `; + * + * UniqueArgumentDefinitionNamesRule.name; // => 'UniqueArgumentDefinitionNamesRule' + * buildSchema(invalidSDL); // throws an error + * + * const validSDL = ` + * type Query { field(arg: String): String } + * `; + * + * buildSchema(validSDL); // does not throw + * ``` + */ +export declare function UniqueArgumentDefinitionNamesRule(context: SDLValidationContext): ASTVisitor; +/** + * Unique directive names + * + * A GraphQL document is only valid if all defined directives have unique names. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema } from 'graphql'; + * import { UniqueDirectiveNamesRule } from 'graphql/validation'; + * + * const invalidSDL = ` + * directive @tag on FIELD directive @tag on QUERY type Query { name: String } + * `; + * + * UniqueDirectiveNamesRule.name; // => 'UniqueDirectiveNamesRule' + * buildSchema(invalidSDL); // throws an error + * + * const validSDL = ` + * directive @tag on FIELD type Query { name: String } + * `; + * + * buildSchema(validSDL); // does not throw + * ``` + */ +export declare function UniqueDirectiveNamesRule(context: SDLValidationContext): ASTVisitor; +/** + * Possible type extension + * + * A type extension is only valid if the type is defined and has the same kind. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema } from 'graphql'; + * import { PossibleTypeExtensionsRule } from 'graphql/validation'; + * + * const invalidSDL = ` + * extend type Missing { name: String } type Query { name: String } + * `; + * + * PossibleTypeExtensionsRule.name; // => 'PossibleTypeExtensionsRule' + * buildSchema(invalidSDL); // throws an error + * + * const validSDL = ` + * type Query { name: String } extend type Query { other: String } + * `; + * + * buildSchema(validSDL); // does not throw + * ``` + */ +export declare function PossibleTypeExtensionsRule(context: SDLValidationContext): ASTVisitor; +/** + * No deprecated + * + * A GraphQL document is only valid if all selected fields and all used enum values have not been + * deprecated. + * + * Note: This rule is optional and is not part of the Validation section of the GraphQL + * Specification. The main purpose of this rule is detection of deprecated usages and not + * necessarily to forbid their use when querying a service. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { + * GraphQLObjectType, + * GraphQLSchema, + * GraphQLString, + * parse, + * validate, + * } from 'graphql'; + * import { NoDeprecatedCustomRule } from 'graphql/validation'; + * + * const schema = new GraphQLSchema({ + * query: new GraphQLObjectType({ + * name: 'Query', + * fields: { + * name: { type: GraphQLString }, + * oldName: { + * type: GraphQLString, + * deprecationReason: 'Use name instead.', + * }, + * }, + * }), + * }); + * + * const invalidDocument = parse(` + * { oldName } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * NoDeprecatedCustomRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { name } + * `); + * const validErrors = validate(schema, validDocument, [NoDeprecatedCustomRule]); + * + * validErrors; // => [] + * ``` + */ +export declare function NoDeprecatedCustomRule(context: ValidationContext): ASTVisitor; +/** + * Prohibit introspection queries + * + * A GraphQL document is only valid if all fields selected are not fields that + * return an introspection type. + * + * Note: This rule is optional and is not part of the Validation section of the + * GraphQL Specification. This rule effectively disables introspection, which + * does not reflect best practices and should only be done if absolutely necessary. + * @param context - The validation context used while checking the document. + * @returns A visitor that reports validation errors for this rule. + * @example + * ```ts + * import { buildSchema, parse, validate } from 'graphql'; + * import { NoSchemaIntrospectionCustomRule } from 'graphql/validation'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * const invalidDocument = parse(` + * { __schema { queryType { name } } } + * `); + * const invalidErrors = validate(schema, invalidDocument, [ + * NoSchemaIntrospectionCustomRule, + * ]); + * + * invalidErrors.length; // => 1 + * + * const validDocument = parse(` + * { name } + * `); + * const validErrors = validate(schema, validDocument, [ + * NoSchemaIntrospectionCustomRule, + * ]); + * + * validErrors; // => [] + * ``` + */ +export declare function NoSchemaIntrospectionCustomRule(context: ValidationContext): ASTVisitor; +/** + * Produces a GraphQLError representing a syntax error, containing useful + * descriptive information about the syntax error's position in the source. + * @param source - The GraphQL source containing the syntax error. + * @param position - Character offset where the syntax error was encountered. + * @param description - Human-readable description of the syntax error. + * @returns A GraphQLError located at the syntax error position. + * @example + * ```ts + * import { Source } from 'graphql/language'; + * import { syntaxError } from 'graphql/error'; + * + * const error = syntaxError(new Source('query {'), 7, 'Expected Name'); + * + * error.message; // => 'Syntax Error: Expected Name' + * error.locations; // => [{ line: 1, column: 8 }] + * ``` + */ +export declare function syntaxError(source: Source, position: number, description: string): GraphQLError; +/** + * Given an arbitrary value, presumably thrown while attempting to execute a + * GraphQL operation, produce a new GraphQLError aware of the location in the + * document responsible for the original Error. + * @param rawOriginalError - The original error value to wrap. + * @param nodes - The AST nodes associated with the error. + * @param path - The response path associated with the error. + * @returns The GraphQL error. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { locatedError } from 'graphql/error'; + * + * const document = parse('{ viewer { name } }'); + * const fieldNode = document.definitions[0].selectionSet.selections[0]; + * const error = locatedError(new Error('Resolver failed'), fieldNode, ['viewer']); + * + * error.message; // => 'Resolver failed' + * error.locations; // => [{ line: 1, column: 3 }] + * error.path; // => ['viewer'] + * ``` + */ +export declare function locatedError(rawOriginalError: unknown, nodes: ASTNode | ReadonlyArray<ASTNode> | undefined | null, path?: Maybe<ReadonlyArray<string | number>>): GraphQLError; +/** Options controlling which fields are included in the introspection query. */ +export interface IntrospectionOptions { + /** + * Whether to include descriptions in the introspection result. + * Default: true + */ + descriptions?: boolean; + /** + * Whether to include `specifiedByURL` in the introspection result. + * Default: false + */ + specifiedByUrl?: boolean; + /** + * Whether to include `isRepeatable` flag on directives. + * Default: false + */ + directiveIsRepeatable?: boolean; + /** + * Whether to include `description` field on schema. + * Default: false + */ + schemaDescription?: boolean; + /** + * Whether target GraphQL server support deprecation of input values. + * Default: false + */ + inputValueDeprecation?: boolean; + /** + * Whether target GraphQL server supports deprecation of directives. + * Default: false + */ + experimentalDirectiveDeprecation?: boolean; + /** + * Whether target GraphQL server supports `@oneOf` input objects. + * Default: false + */ + oneOf?: boolean; + /** + * How deep to recurse into nested types, larger values will result in more + * accurate results, but have a higher load on the server. + * Some servers might restrict the maximum query depth or complexity. + * If that's the case, try decreasing this value. + * + * Default: 9 + */ + typeDepth?: number; +} +/** + * Produce the GraphQL query recommended for a full schema introspection. + * Accepts optional IntrospectionOptions. + * @param options - Optional configuration for this operation. + * @returns The resolved introspection query. + * @example + * ```ts + * // Generate the default introspection query. + * import { getIntrospectionQuery } from 'graphql/utilities'; + * + * const query = getIntrospectionQuery(); + * + * query; // matches /__schema/ + * query; // matches /description/ + * query; // does not match /specifiedByURL/ + * ``` + * @example + * ```ts + * // This variant customizes optional introspection fields and nesting depth. + * import { getIntrospectionQuery } from 'graphql/utilities'; + * + * const query = getIntrospectionQuery({ + * descriptions: false, + * specifiedByUrl: true, + * directiveIsRepeatable: true, + * schemaDescription: true, + * inputValueDeprecation: true, + * experimentalDirectiveDeprecation: true, + * oneOf: true, + * typeDepth: 3, + * }); + * + * query; // does not match /description/ + * query; // matches /specifiedByURL/ + * query; // matches /isRepeatable/ + * query; // matches /includeDeprecated: true/ + * query; // matches /isOneOf/ + * (query.match(/ofType/g)?.length ?? 0) > 0; // => true + * ``` + */ +export declare function getIntrospectionQuery(options?: IntrospectionOptions): string; +/** The result shape returned by a full introspection query. */ +export interface IntrospectionQuery { + /** The schema. */ + readonly __schema: IntrospectionSchema; +} +/** The introspection representation of a GraphQL schema. */ +export interface IntrospectionSchema { + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** The root object type used for query operations. */ + readonly queryType: IntrospectionNamedTypeRef<IntrospectionObjectType>; + /** The root object type used for mutation operations, if supported. */ + readonly mutationType: Maybe<IntrospectionNamedTypeRef<IntrospectionObjectType>>; + /** The root object type used for subscription operations, if supported. */ + readonly subscriptionType: Maybe<IntrospectionNamedTypeRef<IntrospectionObjectType>>; + /** Object types that belong to this union type. */ + readonly types: ReadonlyArray<IntrospectionType>; + /** Directives available in this schema or applied to this AST node. */ + readonly directives: ReadonlyArray<IntrospectionDirective>; +} +/** Any introspection representation of a GraphQL type. */ +export type IntrospectionType = IntrospectionScalarType | IntrospectionObjectType | IntrospectionInterfaceType | IntrospectionUnionType | IntrospectionEnumType | IntrospectionInputObjectType; +/** An introspection type that can appear in output position. */ +export type IntrospectionOutputType = IntrospectionScalarType | IntrospectionObjectType | IntrospectionInterfaceType | IntrospectionUnionType | IntrospectionEnumType; +/** An introspection type that can appear in input position. */ +export type IntrospectionInputType = IntrospectionScalarType | IntrospectionEnumType | IntrospectionInputObjectType; +/** The introspection representation of a scalar type. */ +export interface IntrospectionScalarType { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: typeof TypeKind.SCALAR; + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** URL identifying the behavior specified for this custom scalar. */ + readonly specifiedByURL?: Maybe<string>; +} +/** The introspection representation of an object type. */ +export interface IntrospectionObjectType { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: typeof TypeKind.OBJECT; + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields: ReadonlyArray<IntrospectionField>; + /** Interfaces implemented by this object or interface type. */ + readonly interfaces: ReadonlyArray<IntrospectionNamedTypeRef<IntrospectionInterfaceType>>; +} +/** The introspection representation of an interface type. */ +export interface IntrospectionInterfaceType { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: typeof TypeKind.INTERFACE; + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** Fields declared by this object, interface, input object, or literal. */ + readonly fields: ReadonlyArray<IntrospectionField>; + /** Interfaces implemented by this object or interface type. */ + readonly interfaces: ReadonlyArray<IntrospectionNamedTypeRef<IntrospectionInterfaceType>>; + /** Object types that may be returned for this abstract type. */ + readonly possibleTypes: ReadonlyArray<IntrospectionNamedTypeRef<IntrospectionObjectType>>; +} +/** The introspection representation of a union type. */ +export interface IntrospectionUnionType { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: typeof TypeKind.UNION; + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** Object types that may be returned for this abstract type. */ + readonly possibleTypes: ReadonlyArray<IntrospectionNamedTypeRef<IntrospectionObjectType>>; +} +/** The introspection representation of an enum type. */ +export interface IntrospectionEnumType { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: typeof TypeKind.ENUM; + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** Values declared by this enum type. */ + readonly enumValues: ReadonlyArray<IntrospectionEnumValue>; +} +/** The introspection representation of an input object type. */ +export interface IntrospectionInputObjectType { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: typeof TypeKind.INPUT_OBJECT; + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** Input fields declared by this input object type. */ + readonly inputFields: ReadonlyArray<IntrospectionInputValue>; + /** Whether this input object uses the experimental OneOf input object semantics. */ + readonly isOneOf: boolean; +} +/** + * The introspection representation of a list type reference. + * @typeParam T - The introspection type reference wrapped by this list type reference. + */ +export interface IntrospectionListTypeRef<T extends IntrospectionTypeRef = IntrospectionTypeRef> { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: typeof TypeKind.LIST; + /** The type wrapped by this list or non-null type. */ + readonly ofType: T; +} +/** + * The introspection representation of a non-null type reference. + * @typeParam T - The introspection type reference wrapped by this non-null type reference. + */ +export interface IntrospectionNonNullTypeRef<T extends IntrospectionTypeRef = IntrospectionTypeRef> { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: typeof TypeKind.NON_NULL; + /** The type wrapped by this list or non-null type. */ + readonly ofType: T; +} +/** Any introspection representation of a type reference. */ +export type IntrospectionTypeRef = IntrospectionNamedTypeRef | IntrospectionListTypeRef | IntrospectionNonNullTypeRef<IntrospectionNamedTypeRef | IntrospectionListTypeRef>; +/** An introspection type reference that can appear in output position. */ +export type IntrospectionOutputTypeRef = IntrospectionNamedTypeRef<IntrospectionOutputType> | IntrospectionListTypeRef<IntrospectionOutputTypeRef> | IntrospectionNonNullTypeRef<IntrospectionNamedTypeRef<IntrospectionOutputType> | IntrospectionListTypeRef<IntrospectionOutputTypeRef>>; +/** An introspection type reference that can appear in input position. */ +export type IntrospectionInputTypeRef = IntrospectionNamedTypeRef<IntrospectionInputType> | IntrospectionListTypeRef<IntrospectionInputTypeRef> | IntrospectionNonNullTypeRef<IntrospectionNamedTypeRef<IntrospectionInputType> | IntrospectionListTypeRef<IntrospectionInputTypeRef>>; +/** + * The introspection representation of a named type reference. + * @typeParam T - The introspection type represented by this named type reference. + */ +export interface IntrospectionNamedTypeRef<T extends IntrospectionType = IntrospectionType> { + /** The introspection kind discriminator for this type reference or type. */ + readonly kind: T["kind"]; + /** The GraphQL name for this schema element. */ + readonly name: string; +} +/** The introspection representation of a field. */ +export interface IntrospectionField { + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** Arguments accepted by this field or directive. */ + readonly args: ReadonlyArray<IntrospectionInputValue>; + /** The GraphQL type reference or runtime type for this element. */ + readonly type: IntrospectionOutputTypeRef; + /** Whether this field, argument, enum value, or input value is deprecated. */ + readonly isDeprecated: boolean; + /** Reason this element is deprecated, if one was provided. */ + readonly deprecationReason: Maybe<string>; +} +/** The introspection representation of an argument or input field. */ +export interface IntrospectionInputValue { + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** The GraphQL type reference or runtime type for this element. */ + readonly type: IntrospectionInputTypeRef; + /** Default value used when no explicit value is supplied. */ + readonly defaultValue: Maybe<string>; + /** Whether this field, argument, enum value, or input value is deprecated. */ + readonly isDeprecated?: boolean; + /** Reason this element is deprecated, if one was provided. */ + readonly deprecationReason?: Maybe<string>; +} +/** The introspection representation of an enum value. */ +export interface IntrospectionEnumValue { + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** Whether this field, argument, enum value, or input value is deprecated. */ + readonly isDeprecated: boolean; + /** Reason this element is deprecated, if one was provided. */ + readonly deprecationReason: Maybe<string>; +} +/** The introspection representation of a directive. */ +export interface IntrospectionDirective { + /** The GraphQL name for this schema element. */ + readonly name: string; + /** Human-readable description for this schema element, if provided. */ + readonly description?: Maybe<string>; + /** Whether this directive may appear more than once at the same location. */ + readonly isRepeatable?: boolean; + /** Whether this field, argument, enum value, or input value is deprecated. */ + readonly isDeprecated?: boolean; + /** Reason this element is deprecated, if one was provided. */ + readonly deprecationReason?: Maybe<string>; + /** Locations where this directive may be applied. */ + readonly locations: ReadonlyArray<DirectiveLocation>; + /** Arguments accepted by this field or directive. */ + readonly args: ReadonlyArray<IntrospectionInputValue>; +} +/** + * Returns an operation AST given a document AST and optionally an operation + * name. If a name is not provided, an operation is only returned if only one is + * provided in the document. + * @param documentAST - The parsed GraphQL document AST. + * @param operationName - The optional operation name to select. + * @returns The resolved operation ast. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { getOperationAST } from 'graphql/utilities'; + * + * const document = parse('query GetName { name }'); + * const operation = getOperationAST(document, 'GetName'); + * + * operation.name.value; // => 'GetName' + * getOperationAST(document, 'Missing'); // => undefined + * ``` + */ +export declare function getOperationAST(documentAST: DocumentNode, operationName?: Maybe<string>): Maybe<OperationDefinitionNode>; +/** + * Build an IntrospectionQuery from a GraphQLSchema + * + * IntrospectionQuery is useful for utilities that care about type and field + * relationships, but do not need to traverse through those relationships. + * + * This is the inverse of buildClientSchema. The primary use case is outside + * of the server context, for instance when doing schema comparisons. + * @param schema - GraphQL schema to use. + * @param options - Optional configuration for this operation. + * @returns Introspection result data for the schema. + * @example + * ```ts + * // Include schema metadata using the default introspection options. + * import { buildSchema, introspectionFromSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * scalar Url @specifiedBy(url: "https://url.spec.whatwg.org/") + * + * type Query { + * homepage: Url + * } + * `); + * + * const introspection = introspectionFromSchema(schema); + * const urlType = introspection.__schema.types.find( + * (type) => type.name === 'Url', + * ); + * + * urlType.specifiedByURL; // => 'https://url.spec.whatwg.org/' + * ``` + * @example + * ```ts + * // This variant disables optional introspection metadata. + * import { buildSchema, introspectionFromSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * scalar Url @specifiedBy(url: "https://url.spec.whatwg.org/") + * + * type Query { + * homepage: Url + * } + * `); + * + * const introspection = introspectionFromSchema(schema, { + * descriptions: false, + * specifiedByUrl: false, + * directiveIsRepeatable: false, + * schemaDescription: false, + * inputValueDeprecation: false, + * experimentalDirectiveDeprecation: false, + * oneOf: false, + * }); + * const urlType = introspection.__schema.types.find( + * (type) => type.name === 'Url', + * ); + * const deprecatedDirective = introspection.__schema.directives.find( + * (directive) => directive.name === 'deprecated', + * ); + * + * urlType.specifiedByURL; // => undefined + * urlType.description; // => undefined + * introspection.__schema.description; // => undefined + * deprecatedDirective.isRepeatable; // => undefined + * ``` + */ +export declare function introspectionFromSchema(schema: GraphQLSchema, options?: IntrospectionOptions): IntrospectionQuery; +/** + * Build a GraphQLSchema for use by client tools. + * + * Given the result of a client running the introspection query, creates and + * returns a GraphQLSchema instance which can be then used with all graphql-js + * tools, but cannot be used to execute a query, as introspection does not + * represent the "resolver", "parse" or "serialize" functions or any other + * server-internal mechanisms. + * + * This function expects a complete introspection result. Don't forget to check + * the "errors" field of a server response before calling this function. + * @param introspection - Introspection result data to build from. + * @param options - Optional configuration for this operation. + * @returns The client schema represented by the introspection result. + * @example + * ```ts + * import { + * buildClientSchema, + * introspectionFromSchema, + * buildSchema, + * } from 'graphql/utilities'; + * + * const schema = buildSchema('type Query { hello: String }'); + * const clientSchema = buildClientSchema(introspectionFromSchema(schema), { + * assumeValid: true, + * }); + * + * clientSchema.getQueryType().name; // => 'Query' + * ``` + */ +export declare function buildClientSchema(introspection: IntrospectionQuery, options?: GraphQLSchemaValidationOptions): GraphQLSchema; +/** Options used when building a schema from SDL or a parsed SDL document. */ +export interface BuildSchemaOptions extends GraphQLSchemaValidationOptions { + /** + * Set to true to assume the SDL is valid. + * + * Default: false + */ + assumeValidSDL?: boolean | undefined; +} +/** + * Builds a GraphQLSchema from a parsed schema definition language document. + * + * If no schema definition is provided, then it will look for types named Query, + * Mutation and Subscription. + * + * The resulting schema has no resolver functions, so execution will use the + * default field resolver. + * @param documentAST - The parsed GraphQL document AST. + * @param options - Optional configuration for this operation. + * @returns The schema built from the provided SDL document. + * @example + * ```ts + * // Build a schema from a valid parsed SDL document. + * import { parse } from 'graphql/language'; + * import { buildASTSchema } from 'graphql/utilities'; + * + * const document = parse('type Query { hello: String }'); + * const schema = buildASTSchema(document); + * + * schema.getQueryType().name; // => 'Query' + * ``` + * @example + * ```ts + * // This variant uses validation options when the SDL references unknown types. + * import { parse } from 'graphql/language'; + * import { buildASTSchema } from 'graphql/utilities'; + * + * const document = parse('type Query { broken: MissingType }'); + * + * buildASTSchema(document); // throws an error + * buildASTSchema(document, { + * assumeValid: true, + * assumeValidSDL: true, + * }); // does not throw + * ``` + */ +export declare function buildASTSchema(documentAST: DocumentNode, options?: BuildSchemaOptions): GraphQLSchema; +/** + * Builds a GraphQLSchema directly from a schema definition language source. + * @param source - The GraphQL source text or source object. + * @param options - Optional configuration for this operation. + * @returns The schema built from the provided SDL document. + * @example + * ```ts + * // Build a schema from SDL source using the default options. + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema('type Query { hello: String }'); + * + * schema.getQueryType().name; // => 'Query' + * ``` + * @example + * ```ts + * // This variant enables parser options and omits source locations. + * import { buildSchema } from 'graphql/utilities'; + * + * const schema = buildSchema( + * 'directive @tag on FIELD_DEFINITION\n' + + * 'directive @compose @tag on FIELD_DEFINITION', + * { + * experimentalFragmentArguments: true, + * noLocation: true, + * }, + * ); + * + * const directive = schema.getDirective('compose'); + * + * directive.name; // => 'compose' + * directive.astNode.loc; // => undefined + * ``` + */ +export declare function buildSchema(source: string | Source, options?: BuildSchemaOptions & ParseOptions): GraphQLSchema; +interface Options extends GraphQLSchemaValidationOptions { + /** + * Set to true to assume the SDL is valid. + * + * Default: false + * + * @internal + */ + assumeValidSDL?: boolean | undefined; +} +/** + * Produces a new schema given an existing schema and a document which may + * contain GraphQL type extensions and definitions. The original schema will + * remain unaltered. + * + * Because a schema represents a graph of references, a schema cannot be + * extended without effectively making an entire copy. We do not know until it's + * too late if subgraphs remain unchanged. + * + * This algorithm copies the provided schema, applying extensions while + * producing the copy. The original schema remains unaltered. + * @param schema - GraphQL schema to use. + * @param documentAST - The parsed GraphQL document AST. + * @param options - Optional configuration for this operation. + * @returns A new schema with the extensions and definitions applied. + * @example + * ```ts + * // Extend a schema with new fields and types. + * import { parse } from 'graphql/language'; + * import { buildSchema, extendSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const extensionAST = parse(` + * extend type Query { + * farewell: String + * } + * + * type Review { + * body: String + * } + * `); + * + * const extendedSchema = extendSchema(schema, extensionAST); + * + * schema.getType('Review'); // => undefined + * extendedSchema.getType('Review')?.name; // => 'Review' + * Object.keys(extendedSchema.getQueryType().getFields()); // => ['greeting', 'farewell'] + * ``` + * @example + * ```ts + * // This variant bypasses validation for an otherwise invalid extension. + * import { parse } from 'graphql/language'; + * import { buildSchema, extendSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const invalidExtension = parse(` + * extend type Missing { + * field: String + * } + * `); + * + * extendSchema(schema, invalidExtension); // throws an error + * extendSchema(schema, invalidExtension, { + * assumeValid: true, + * assumeValidSDL: true, + * }); // does not throw + * ``` + */ +export declare function extendSchema(schema: GraphQLSchema, documentAST: DocumentNode, options?: Options): GraphQLSchema; +/** + * Sort GraphQLSchema. + * + * This function returns a sorted copy of the given GraphQLSchema. + * @param schema - GraphQL schema to use. + * @returns A copy of the schema with types, fields, arguments, and values sorted lexicographically. + * @example + * ```ts + * import { + * buildSchema, + * lexicographicSortSchema, + * printSchema, + * } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * zebra: String + * apple: String + * } + * + * enum Episode { + * JEDI + * NEW_HOPE + * EMPIRE + * } + * `); + * + * const sortedSchema = lexicographicSortSchema(schema); + * + * printSchema(sortedSchema); + * // => + * // enum Episode { + * // EMPIRE + * // JEDI + * // NEW_HOPE + * // } + * // + * // type Query { + * // apple: String + * // zebra: String + * // } + * ``` + */ +export declare function lexicographicSortSchema(schema: GraphQLSchema): GraphQLSchema; +/** + * Prints the schema. + * @param schema - GraphQL schema to use. + * @returns The printed string representation. + * @example + * ```ts + * import { buildSchema, printSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * directive @upper on FIELD_DEFINITION + * + * type Query { + * greeting: String @upper + * } + * `); + * + * printSchema(schema); // => ['directive @upper on FIELD_DEFINITION', '', 'type Query {', ' greeting: String', '}'].join('\n') + * ``` + */ +export declare function printSchema(schema: GraphQLSchema): string; +/** + * Prints the introspection schema. + * @param schema - GraphQL schema to use. + * @returns The printed string representation. + * @example + * ```ts + * import { buildSchema, printIntrospectionSchema } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * + * const printed = printIntrospectionSchema(schema); + * + * printed; // matches /type __Schema/ + * printed; // matches /enum __TypeKind/ + * printed; // does not match /type Query/ + * ``` + */ +export declare function printIntrospectionSchema(schema: GraphQLSchema): string; +/** + * Prints the type. + * @param type - The GraphQL type to inspect. + * @returns The printed string representation. + * @example + * ```ts + * import { buildSchema, printType } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type User { + * id: ID! + * name: String + * } + * + * type Query { + * viewer: User + * } + * `); + * + * printType(schema.getType('User')); // => ['type User {', ' id: ID!', ' name: String', '}'].join('\n') + * ``` + */ +export declare function printType(type: GraphQLNamedType): string; +/** + * Prints a directive definition in GraphQL SDL. + * @param directive - Directive to print. + * @returns SDL string for the directive definition. + * @example + * ```ts + * import { + * DirectiveLocation, + * GraphQLDirective, + * GraphQLString, + * } from 'graphql/type'; + * import { printDirective } from 'graphql/utilities'; + * + * const authDirective = new GraphQLDirective({ + * name: 'auth', + * description: 'Requires authorization.', + * locations: [DirectiveLocation.FIELD_DEFINITION], + * args: { + * scope: { type: GraphQLString }, + * }, + * }); + * + * printDirective(authDirective); // => '"""Requires authorization."""\ndirective @auth(scope: String) on FIELD_DEFINITION' + * ``` + */ +export declare function printDirective(directive: GraphQLDirective): string; +/** + * Given a Schema and an AST node describing a type, return a GraphQLType + * definition which applies to that type. For example, if provided the parsed + * AST node for `[User]`, a GraphQLList instance will be returned, containing + * the type called "User" found in the schema. If a type called "User" is not + * found in the schema, then undefined will be returned. + * @param schema - GraphQL schema to use. + * @param typeNode - The GraphQL type AST node to resolve. + * @returns The GraphQL type referenced by the AST node, or undefined if it cannot be resolved. + * @example + * ```ts + * import { parseType } from 'graphql/language'; + * import { buildSchema, typeFromAST } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * name: String + * } + * `); + * + * typeFromAST(schema, parseType('String'))?.toString(); // => 'String' + * typeFromAST(schema, parseType('Missing')); // => undefined + * ``` + */ +export declare function typeFromAST(schema: GraphQLSchema, typeNode: NamedTypeNode): GraphQLNamedType | undefined; +/** + * Resolves a list type AST node against a schema. + * @param schema - GraphQL schema to use. + * @param typeNode - The list type AST node to resolve. + * @returns The GraphQL list type referenced by the AST node, or undefined if + * it cannot be resolved. + * @example + * ```ts + * import { parseType } from 'graphql/language'; + * import { buildSchema, typeFromAST } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * tags: [String] + * } + * `); + * + * typeFromAST(schema, parseType('[String]'))?.toString(); // => '[String]' + * typeFromAST(schema, parseType('[Missing]')); // => undefined + * ``` + */ +export declare function typeFromAST(schema: GraphQLSchema, typeNode: ListTypeNode): GraphQLList<any> | undefined; +/** + * Resolves a non-null type AST node against a schema. + * @param schema - GraphQL schema to use. + * @param typeNode - The non-null type AST node to resolve. + * @returns The GraphQL non-null type referenced by the AST node, or undefined + * if it cannot be resolved. + * @example + * ```ts + * import { parseType } from 'graphql/language'; + * import { buildSchema, typeFromAST } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * name: String! + * } + * `); + * + * typeFromAST(schema, parseType('String!'))?.toString(); // => 'String!' + * typeFromAST(schema, parseType('[String!]!'))?.toString(); // => '[String!]!' + * ``` + */ +export declare function typeFromAST(schema: GraphQLSchema, typeNode: NonNullTypeNode): GraphQLNonNull<any> | undefined; +/** + * Resolves a type AST node against a schema. + * @param schema - GraphQL schema to use. + * @param typeNode - The GraphQL type AST node to resolve. + * @returns The GraphQL type referenced by the AST node, or undefined if it + * cannot be resolved. + * @example + * ```ts + * import { parseType } from 'graphql/language'; + * import { buildSchema, typeFromAST } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type User { + * name: String + * } + * + * type Query { + * users: [User!]! + * } + * `); + * + * typeFromAST(schema, parseType('User'))?.toString(); // => 'User' + * typeFromAST(schema, parseType('[User!]!'))?.toString(); // => '[User!]!' + * typeFromAST(schema, parseType('Missing')); // => undefined + * ``` + */ +export declare function typeFromAST(schema: GraphQLSchema, typeNode: TypeNode): GraphQLType | undefined; +/** + * Produces a JavaScript value given a GraphQL Value AST. + * + * A GraphQL type must be provided, which will be used to interpret different + * GraphQL Value literals. + * + * Returns `undefined` when the value could not be validly coerced according to + * the provided type. + * + * This deprecated function will be removed in v18. Use `coerceInputLiteral()` + * instead. + * + * | GraphQL Value | JSON Value | + * | -------------------- | ------------- | + * | Input Object | Object | + * | List | Array | + * | Boolean | Boolean | + * | String | String | + * | Int / Float | Number | + * | Enum Value | Unknown | + * | NullValue | null | + * @param valueNode - GraphQL value AST node to convert. + * @param type - The GraphQL type to inspect. + * @param variables - Optional runtime variable values keyed by variable name. + * @returns The coerced JavaScript value, or undefined if the AST value cannot be coerced to the type. + * @example + * ```ts + * // Coerce literal values without variables. + * import { parseValue } from 'graphql/language'; + * import { + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLList, + * GraphQLNonNull, + * GraphQLString, + * } from 'graphql/type'; + * import { valueFromAST } from 'graphql/utilities'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * stars: { type: new GraphQLNonNull(GraphQLInt) }, + * tags: { type: new GraphQLList(GraphQLString) }, + * }, + * }); + * + * valueFromAST(parseValue('{ stars: 5, tags: ["featured"] }'), ReviewInput); // => { stars: 5, tags: ['featured'] } + * valueFromAST(parseValue('{ stars: "bad" }'), ReviewInput); // => undefined + * ``` + * @example + * ```ts + * // This variant resolves variable references from runtime values. + * import { parseValue } from 'graphql/language'; + * import { GraphQLInt } from 'graphql/type'; + * import { valueFromAST } from 'graphql/utilities'; + * + * valueFromAST(parseValue('$stars'), GraphQLInt, { stars: 5 }); // => 5 + * valueFromAST(parseValue('$stars'), GraphQLInt, {}); // => undefined + * ``` + * @deprecated use `coerceInputLiteral()` instead - will be removed in v18 + */ +export declare function valueFromAST(valueNode: Maybe<ValueNode>, type: GraphQLInputType, variables?: Maybe<ObjMap<unknown>>): unknown; +/** + * Produces a JavaScript value given a GraphQL Value AST. + * + * Because no GraphQL type is provided, the returned JavaScript value reflects + * the provided GraphQL value AST. + * + * | GraphQL Value | JavaScript Value | + * | -------------------- | ---------------- | + * | Input Object | Object | + * | List | Array | + * | Boolean | Boolean | + * | String / Enum | String | + * | Int / Float | Number | + * | Null | null | + * @param valueNode - GraphQL value AST node to convert. + * @param variables - Optional runtime variable values keyed by variable name. + * @returns JavaScript value represented by the GraphQL value AST. + * @example + * ```ts + * import { parseValue } from 'graphql/language'; + * import { valueFromASTUntyped } from 'graphql/utilities'; + * + * const value = valueFromASTUntyped(parseValue('[1, 2, 3]')); + * + * value; // => [1, 2, 3] + * valueFromASTUntyped(parseValue('$name'), { name: 'Ada' }); // => 'Ada' + * ``` + */ +export declare function valueFromASTUntyped(valueNode: ValueNode, variables?: Maybe<ObjMap<unknown>>): unknown; +/** + * Produces a GraphQL Value AST given a JavaScript object. + * Function will match JavaScript/JSON values to GraphQL AST schema format + * by using suggested GraphQLInputType. + * + * A GraphQL type must be provided, which will be used to interpret different + * JavaScript values. + * + * This deprecated function will be removed in v18. Use `valueToLiteral()` + * instead, and take care to operate on external values. + * + * | JSON Value | GraphQL Value | + * | ------------- | -------------------- | + * | Object | Input Object | + * | Array | List | + * | Boolean | Boolean | + * | String | String / Enum Value | + * | Number | Int / Float | + * | BigInt | Int | + * | Unknown | Enum Value | + * | null | NullValue | + * @param value - Runtime value to convert. + * @param type - The GraphQL type to inspect. + * @returns A GraphQL value AST for the provided JavaScript value, or null when no literal can represent it. + * @example + * ```ts + * import { print } from 'graphql/language'; + * import { + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLList, + * GraphQLNonNull, + * GraphQLString, + * } from 'graphql/type'; + * import { astFromValue } from 'graphql/utilities'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * stars: { type: new GraphQLNonNull(GraphQLInt) }, + * tags: { type: new GraphQLList(GraphQLString) }, + * }, + * }); + * + * const valueNode = astFromValue( + * { stars: 5, tags: ['featured', 'verified'] }, + * ReviewInput, + * ); + * + * print(valueNode); // => '{ stars: 5, tags: ["featured", "verified"] }' + * astFromValue(undefined, GraphQLString); // => null + * astFromValue(null, new GraphQLNonNull(GraphQLString)); // => null + * ``` + * @deprecated use `valueToLiteral()` instead with care to operate on external values - `astFromValue()` will be removed in v18 + */ +export declare function astFromValue(value: unknown, type: GraphQLInputType): Maybe<ConstValueNode>; +/** + * Replaces any Variables found within an AST Value literal with literals + * supplied from a map of variable values, or removed if no variable replacement + * exists, returning a constant value. + * + * Used primarily to ensure only complete constant values are used during input + * coercion of custom scalars which accept complex literals. + * @param valueNode - Value AST node in which variables should be replaced. + * @param variableValues - Operation variable values returned by getVariableValues. + * @param fragmentVariableValues - Fragment variable values for the current fragment scope. + * @returns A constant value AST with variables replaced. + * @example + * ```ts + * import assert from 'node:assert'; + * import { parse, parseValue, print } from 'graphql/language'; + * import { getVariableValues } from 'graphql/execution'; + * import { buildSchema, replaceVariables } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * review(stars: Int = 5): String + * } + * `); + * const document = parse('query ($stars: Int = 5) { review(stars: $stars) }'); + * const operation = document.definitions[0]; + * const result = getVariableValues(schema, operation.variableDefinitions, { + * stars: 4, + * }); + * + * assert('variableValues' in result); + * + * const literal = replaceVariables( + * parseValue('{ stars: $stars, comment: $missing }'), + * result.variableValues, + * ); + * + * print(literal); // => '{ stars: 4 }' + * ``` + */ +export declare function replaceVariables(valueNode: ValueNode, variableValues?: Maybe<VariableValues>, fragmentVariableValues?: Maybe<FragmentVariableValues>): ConstValueNode; +/** + * Produces a GraphQL Value AST given a JavaScript value and a GraphQL type. + * + * Scalar types are converted by calling the `valueToLiteral` method on that + * type, otherwise the default scalar `valueToLiteral` method is used, defined + * below. + * + * Provided value is a non-coerced "input" value. This function does not + * perform any coercion, however it does perform validation. Provided values + * which are invalid for the given type will result in an `undefined` return + * value. + * @param value - JavaScript value to convert. + * @param type - GraphQL input type to convert the value against. + * @returns A GraphQL value AST, or undefined if the value is invalid. + * @example + * ```ts + * import { print } from 'graphql/language'; + * import { + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLList, + * GraphQLNonNull, + * GraphQLString, + * } from 'graphql/type'; + * import { valueToLiteral } from 'graphql/utilities'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * stars: { type: new GraphQLNonNull(GraphQLInt) }, + * tags: { type: new GraphQLList(GraphQLString) }, + * }, + * }); + * + * const literal = valueToLiteral({ stars: 5, tags: ['featured'] }, ReviewInput); + * + * print(literal); // => '{ stars: 5, tags: ["featured"] }' + * valueToLiteral({ tags: ['missing stars'] }, ReviewInput); // => undefined + * ``` + */ +export declare function valueToLiteral(value: unknown, type: GraphQLInputType): ConstValueNode | undefined; +/** + * Coerces a JavaScript value given a GraphQL Input Type. + * + * Returns `undefined` when the value could not be validly coerced according to + * the provided type. Use `validateInputValue` when coercion diagnostics + * are needed. + * @param inputValue - JavaScript value to coerce. + * @param type - GraphQL input type to coerce the value against. + * @returns Coerced value, or undefined if coercion fails. + * @example + * ```ts + * // Coerce runtime input values, returning undefined when coercion fails. + * import { + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLList, + * GraphQLNonNull, + * GraphQLString, + * } from 'graphql/type'; + * import { coerceInputValue } from 'graphql/utilities'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * stars: { type: new GraphQLNonNull(GraphQLInt) }, + * tags: { type: new GraphQLList(GraphQLString) }, + * }, + * }); + * + * coerceInputValue({ stars: '5', tags: ['featured'] }, ReviewInput); // => { stars: 5, tags: ['featured'] } + * coerceInputValue({ stars: 'bad' }, ReviewInput); // => undefined + * ``` + */ +export declare function coerceInputValue(inputValue: unknown, type: GraphQLInputType): unknown; +/** + * Produces a coerced "internal" JavaScript value given a GraphQL Value AST. + * + * Returns `undefined` when the value could not be validly coerced according to + * the provided type. + * @param valueNode - GraphQL value AST node to coerce. + * @param type - GraphQL input type to coerce the literal against. + * @param variableValues - Operation variable values returned by getVariableValues. + * @param fragmentVariableValues - Fragment variable values for the current fragment scope. + * @returns Coerced value, or undefined if coercion fails. + * @example + * ```ts + * // Coerce literal input values without variables. + * import { parseValue } from 'graphql/language'; + * import { + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLNonNull, + * GraphQLString, + * } from 'graphql/type'; + * import { coerceInputLiteral } from 'graphql/utilities'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * stars: { type: new GraphQLNonNull(GraphQLInt) }, + * comment: { type: GraphQLString }, + * }, + * }); + * + * coerceInputLiteral( + * parseValue('{ stars: 5, comment: "Loved it" }'), + * ReviewInput, + * ); // => { stars: 5, comment: 'Loved it' } + * coerceInputLiteral(parseValue('{ comment: "Missing" }'), ReviewInput); // => undefined + * ``` + * @example + * ```ts + * // This variant resolves variable references using VariableValues from getVariableValues(). + * import assert from 'node:assert'; + * import { parse, parseValue } from 'graphql/language'; + * import { GraphQLInt } from 'graphql/type'; + * import { getVariableValues } from 'graphql/execution'; + * import { buildSchema, coerceInputLiteral } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * review(stars: Int): String + * } + * `); + * const document = parse('query ($stars: Int = 5) { review(stars: $stars) }'); + * const operation = document.definitions[0]; + * const result = getVariableValues(schema, operation.variableDefinitions, { + * stars: '4', + * }); + * + * assert('variableValues' in result); + * + * coerceInputLiteral(parseValue('$stars'), GraphQLInt, result.variableValues); // => 4 + * ``` + */ +export declare function coerceInputLiteral(valueNode: ValueNode, type: GraphQLInputType, variableValues?: Maybe<VariableValues>, fragmentVariableValues?: Maybe<FragmentVariableValues>): unknown; +/** + * Validate that the provided input value is allowed for this type, collecting + * all errors via a callback function. + * @param inputValue - JavaScript value to validate. + * @param type - GraphQL input type to validate the value against. + * @param onError - Callback invoked for each validation error and path. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @returns Nothing. + * @example + * ```ts + * // Collect validation errors with their input paths. + * import { + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLNonNull, + * } from 'graphql/type'; + * import { validateInputValue } from 'graphql/utilities'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * stars: { type: new GraphQLNonNull(GraphQLInt) }, + * }, + * }); + * const errors = []; + * + * validateInputValue({ stars: 'bad' }, ReviewInput, (error, path) => { + * errors.push({ message: error.message, path }); + * }); + * + * errors; // => [ { message: 'Expected value of type "Int", found: "bad".', path: ['stars'] } ] + * ``` + * @example + * ```ts + * // This variant hides suggestion text for unknown input fields. + * import { GraphQLInputObjectType, GraphQLString } from 'graphql/type'; + * import { validateInputValue } from 'graphql/utilities'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * comment: { type: GraphQLString }, + * }, + * }); + * const errors = []; + * + * validateInputValue( + * { rating: 'extra field' }, + * ReviewInput, + * (error) => { + * errors.push(error.message); + * }, + * true, + * ); + * + * errors; // => ['Expected value of type "ReviewInput" not to include unknown field "rating", found: { rating: "extra field" }.'] + * ``` + */ +export declare function validateInputValue(inputValue: unknown, type: GraphQLInputType, onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void, hideSuggestions?: Maybe<boolean>): void; +/** + * Validate that the provided input literal is allowed for this type, collecting + * all errors via a callback function. + * + * If variable values are not provided, the literal is validated statically + * (not assuming that those variables are missing runtime values). + * @param valueNode - GraphQL value AST node to validate. + * @param type - GraphQL input type to validate the literal against. + * @param onError - Callback invoked for each validation error and path. + * @param variables - Operation variable values returned by getVariableValues. + * @param fragmentVariableValues - Fragment variable values for the current fragment scope. + * @param hideSuggestions - Whether suggestion text should be omitted from errors. + * @returns Nothing. + * @example + * ```ts + * // Validate literal input values and collect literal paths. + * import { parseValue } from 'graphql/language'; + * import { + * GraphQLInputObjectType, + * GraphQLInt, + * GraphQLNonNull, + * } from 'graphql/type'; + * import { validateInputLiteral } from 'graphql/utilities'; + * + * const ReviewInput = new GraphQLInputObjectType({ + * name: 'ReviewInput', + * fields: { + * stars: { type: new GraphQLNonNull(GraphQLInt) }, + * }, + * }); + * const errors = []; + * + * validateInputLiteral( + * parseValue('{ stars: "bad" }'), + * ReviewInput, + * (error, path) => { + * errors.push({ message: error.message, path }); + * }, + * ); + * + * errors; // => [ { message: 'Expected value of type "Int", found: "bad".', path: ['stars'] } ] + * ``` + * @example + * ```ts + * // This variant resolves variable references using VariableValues from getVariableValues(). + * import assert from 'node:assert'; + * import { parse, parseValue } from 'graphql/language'; + * import { GraphQLInt } from 'graphql/type'; + * import { getVariableValues } from 'graphql/execution'; + * import { buildSchema, validateInputLiteral } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * review(stars: Int): String + * } + * `); + * const document = parse('query ($stars: Int = 5) { review(stars: $stars) }'); + * const operation = document.definitions[0]; + * const result = getVariableValues(schema, operation.variableDefinitions, { + * stars: '4', + * }); + * + * assert('variableValues' in result); + * + * const errors = []; + * validateInputLiteral( + * parseValue('$stars'), + * GraphQLInt, + * (error) => errors.push(error.message), + * result.variableValues, + * undefined, + * true, + * ); + * + * errors; // => [] + * ``` + */ +export declare function validateInputLiteral(valueNode: ValueNode, type: GraphQLInputType, onError: (error: GraphQLError, path: ReadonlyArray<string | number>) => void, variables?: Maybe<VariableValues>, fragmentVariableValues?: Maybe<FragmentVariableValues>, hideSuggestions?: Maybe<boolean>): void; +/** + * Provided a collection of ASTs, presumably each from different files, + * concatenate the ASTs together into batched AST, useful for validating many + * GraphQL source files which together represent one conceptual application. + * @param documents - Document ASTs to concatenate. + * @returns A document AST containing all definitions from the provided documents. + * @example + * ```ts + * import { parse } from 'graphql/language'; + * import { concatAST } from 'graphql/utilities'; + * + * const document = concatAST([ + * parse('type Query { a: String }'), + * parse('type User { id: ID }'), + * ]); + * + * document.definitions.length; // => 2 + * ``` + */ +export declare function concatAST(documents: ReadonlyArray<DocumentNode>): DocumentNode; +/** + * separateOperations accepts a single AST document which may contain many + * operations and fragments and returns a collection of AST documents each of + * which contains a single operation as well the fragment definitions it + * refers to. + * @param documentAST - The parsed GraphQL document AST. + * @returns A map of operation names to documents containing each operation and its referenced fragments. + * @example + * ```ts + * import { parse, print } from 'graphql/language'; + * import { separateOperations } from 'graphql/utilities'; + * + * const document = parse(` + * query GetUser { + * viewer { + * ...UserFields + * } + * } + * + * query GetStatus { + * status + * } + * + * fragment UserFields on User { + * id + * } + * `); + * + * const separated = separateOperations(document); + * + * Object.keys(separated); // => ['GetUser', 'GetStatus'] + * print(separated.GetUser); // matches /fragment UserFields/ + * print(separated.GetStatus); // does not match /fragment UserFields/ + * ``` + */ +export declare function separateOperations(documentAST: DocumentNode): ObjMap<DocumentNode>; +/** + * Strips characters that are not significant to the validity or execution + * of a GraphQL document: + * - UnicodeBOM + * - WhiteSpace + * - LineTerminator + * - Comment + * - Comma + * - BlockString indentation + * + * Note: It is required to have a delimiter character between neighboring + * non-punctuator tokens and this function always uses single space as delimiter. + * + * It is guaranteed that both input and output documents if parsed would result + * in the exact same AST except for nodes location. + * + * Warning: It is guaranteed that this function will always produce stable results. + * However, it's not guaranteed that it will stay the same between different + * releases due to bugfixes or changes in the GraphQL specification. + * @param source - The GraphQL source text or source object. + * @returns A semantically equivalent GraphQL source string without ignored characters. + * @example Query source + * ```graphql + * query SomeQuery($foo: String!, $bar: String) { + * someField(foo: $foo, bar: $bar) { + * a + * b { + * c + * d + * } + * } + * } + * ``` + * + * Becomes: + * + * ```graphql prettier-ignore + * query SomeQuery($foo:String!$bar:String){someField(foo:$foo bar:$bar){a b{c d}}} + * ``` + * @example SDL source + * ```graphql + * """ + * Type description + * """ + * type Foo { + * """ + * Field description + * """ + * bar: String + * } + * ``` + * + * Becomes: + * + * ```graphql prettier-ignore + * """Type description""" type Foo{"""Field description""" bar:String} + * ``` + * @example + * ```ts + * import { stripIgnoredCharacters } from 'graphql/utilities'; + * + * const source = stripIgnoredCharacters('query Example { name }'); + * + * source; // => 'query Example{name}' + * ``` + */ +export declare function stripIgnoredCharacters(source: string | Source): string; +/** + * Provided two types, return true if the types are equal (invariant). + * @param typeA - The first GraphQL type to compare. + * @param typeB - The second GraphQL type to compare. + * @returns True when both types are equal. + * @example + * ```ts + * import { GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql/type'; + * import { isEqualType } from 'graphql/utilities'; + * + * isEqualType(GraphQLString, GraphQLString); // => true + * isEqualType(new GraphQLList(GraphQLString), new GraphQLList(GraphQLString)); // => true + * isEqualType(new GraphQLNonNull(GraphQLString), GraphQLString); // => false + * ``` + */ +export declare function isEqualType(typeA: GraphQLType, typeB: GraphQLType): boolean; +/** + * Provided a type and a super type, return true if the first type is either + * equal or a subset of the second super type (covariant). + * @param schema - GraphQL schema to use. + * @param maybeSubType - The possible subtype to compare. + * @param superType - The possible supertype to compare. + * @returns True when `maybeSubType` is equal to or a subtype of `superType`. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { + * GraphQLNonNull, + * assertInterfaceType, + * assertObjectType, + * } from 'graphql/type'; + * import { isTypeSubTypeOf } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * interface Node { + * id: ID! + * } + * + * type User implements Node { + * id: ID! + * } + * + * type Query { + * node: Node + * } + * `); + * const Node = assertInterfaceType(schema.getType('Node')); + * const User = assertObjectType(schema.getType('User')); + * + * isTypeSubTypeOf(schema, User, Node); // => true + * isTypeSubTypeOf(schema, new GraphQLNonNull(User), Node); // => true + * isTypeSubTypeOf(schema, Node, User); // => false + * ``` + */ +export declare function isTypeSubTypeOf(schema: GraphQLSchema, maybeSubType: GraphQLType, superType: GraphQLType): boolean; +/** + * Provided two composite types, determine if they "overlap". Two composite + * types overlap when the Sets of possible concrete types for each intersect. + * + * This is often used to determine if a fragment of a given type could possibly + * be visited in a context of another type. + * + * This function is commutative. + * @param schema - GraphQL schema to use. + * @param typeA - The first GraphQL type to compare. + * @param typeB - The second GraphQL type to compare. + * @returns True when the two composite types can apply to at least one common object type. + * @example + * ```ts + * import { buildSchema } from 'graphql/utilities'; + * import { assertObjectType, assertUnionType } from 'graphql/type'; + * import { doTypesOverlap } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Photo { + * url: String! + * } + * + * type Video { + * url: String! + * } + * + * union Media = Photo | Video + * union StillImage = Photo + * + * type Query { + * media: [Media] + * } + * `); + * const Media = assertUnionType(schema.getType('Media')); + * const StillImage = assertUnionType(schema.getType('StillImage')); + * const Video = assertObjectType(schema.getType('Video')); + * + * doTypesOverlap(schema, Media, StillImage); // => true + * doTypesOverlap(schema, StillImage, Video); // => false + * ``` + */ +export declare function doTypesOverlap(schema: GraphQLSchema, typeA: GraphQLCompositeType, typeB: GraphQLCompositeType): boolean; +/** Categories of schema changes that may break existing operations. */ +export declare const BreakingChangeType: { + readonly TYPE_REMOVED: "TYPE_REMOVED"; + readonly TYPE_CHANGED_KIND: "TYPE_CHANGED_KIND"; + readonly TYPE_REMOVED_FROM_UNION: "TYPE_REMOVED_FROM_UNION"; + readonly VALUE_REMOVED_FROM_ENUM: "VALUE_REMOVED_FROM_ENUM"; + readonly REQUIRED_INPUT_FIELD_ADDED: "REQUIRED_INPUT_FIELD_ADDED"; + readonly IMPLEMENTED_INTERFACE_REMOVED: "IMPLEMENTED_INTERFACE_REMOVED"; + readonly FIELD_REMOVED: "FIELD_REMOVED"; + readonly FIELD_CHANGED_KIND: "FIELD_CHANGED_KIND"; + readonly REQUIRED_ARG_ADDED: "REQUIRED_ARG_ADDED"; + readonly ARG_REMOVED: "ARG_REMOVED"; + readonly ARG_CHANGED_KIND: "ARG_CHANGED_KIND"; + readonly DIRECTIVE_REMOVED: "DIRECTIVE_REMOVED"; + readonly DIRECTIVE_ARG_REMOVED: "DIRECTIVE_ARG_REMOVED"; + readonly REQUIRED_DIRECTIVE_ARG_ADDED: "REQUIRED_DIRECTIVE_ARG_ADDED"; + readonly DIRECTIVE_REPEATABLE_REMOVED: "DIRECTIVE_REPEATABLE_REMOVED"; + readonly DIRECTIVE_LOCATION_REMOVED: "DIRECTIVE_LOCATION_REMOVED"; +}; +/** Categories of schema changes that may break existing operations. */ +export type BreakingChangeType = (typeof BreakingChangeType)[keyof typeof BreakingChangeType]; +/** Categories of schema changes that may be dangerous for existing operations. */ +export declare const DangerousChangeType: { + readonly VALUE_ADDED_TO_ENUM: "VALUE_ADDED_TO_ENUM"; + readonly TYPE_ADDED_TO_UNION: "TYPE_ADDED_TO_UNION"; + readonly OPTIONAL_INPUT_FIELD_ADDED: "OPTIONAL_INPUT_FIELD_ADDED"; + readonly OPTIONAL_ARG_ADDED: "OPTIONAL_ARG_ADDED"; + readonly IMPLEMENTED_INTERFACE_ADDED: "IMPLEMENTED_INTERFACE_ADDED"; + readonly ARG_DEFAULT_VALUE_CHANGE: "ARG_DEFAULT_VALUE_CHANGE"; + readonly INPUT_FIELD_DEFAULT_VALUE_CHANGE: "INPUT_FIELD_DEFAULT_VALUE_CHANGE"; +}; +/** Categories of schema changes that may be dangerous for existing operations. */ +export type DangerousChangeType = (typeof DangerousChangeType)[keyof typeof DangerousChangeType]; +/** Categories of schema changes that are considered safe for existing operations. */ +export declare const SafeChangeType: { + readonly DESCRIPTION_CHANGED: "DESCRIPTION_CHANGED"; + readonly TYPE_ADDED: "TYPE_ADDED"; + readonly OPTIONAL_INPUT_FIELD_ADDED: "OPTIONAL_INPUT_FIELD_ADDED"; + readonly OPTIONAL_ARG_ADDED: "OPTIONAL_ARG_ADDED"; + readonly DIRECTIVE_ADDED: "DIRECTIVE_ADDED"; + readonly FIELD_ADDED: "FIELD_ADDED"; + readonly DIRECTIVE_REPEATABLE_ADDED: "DIRECTIVE_REPEATABLE_ADDED"; + readonly DIRECTIVE_LOCATION_ADDED: "DIRECTIVE_LOCATION_ADDED"; + readonly OPTIONAL_DIRECTIVE_ARG_ADDED: "OPTIONAL_DIRECTIVE_ARG_ADDED"; + readonly FIELD_CHANGED_KIND_SAFE: "FIELD_CHANGED_KIND_SAFE"; + readonly ARG_CHANGED_KIND_SAFE: "ARG_CHANGED_KIND_SAFE"; + readonly ARG_DEFAULT_VALUE_ADDED: "ARG_DEFAULT_VALUE_ADDED"; + readonly INPUT_FIELD_DEFAULT_VALUE_ADDED: "INPUT_FIELD_DEFAULT_VALUE_ADDED"; +}; +/** Categories of schema changes that are considered safe for existing operations. */ +export type SafeChangeType = (typeof SafeChangeType)[keyof typeof SafeChangeType]; +/** Description of a schema change that may break existing operations. */ +export interface BreakingChange { + /** Specific kind of breaking schema change. */ + type: BreakingChangeType; + /** Human-readable description of the breaking schema change. */ + description: string; +} +/** Description of a schema change that may be dangerous for existing operations. */ +export interface DangerousChange { + /** Specific kind of dangerous schema change. */ + type: DangerousChangeType; + /** Human-readable description of the dangerous schema change. */ + description: string; +} +/** Description of a schema change that is considered safe for existing operations. */ +export interface SafeChange { + /** Specific kind of safe schema change. */ + type: SafeChangeType; + /** Human-readable description of the safe schema change. */ + description: string; +} +/** Any schema change detected between two schemas. */ +export type SchemaChange = SafeChange | DangerousChange | BreakingChange; +/** + * Given two schemas, returns an Array containing descriptions of all the types + * of breaking changes covered by the other functions down below. This + * deprecated wrapper will be removed in v18; use `findSchemaChanges()` instead + * and filter for breaking changes. + * @param oldSchema - Schema before the change. + * @param newSchema - Schema after the change. + * @returns Breaking changes between the two schemas. + * @example + * ```ts + * import { buildSchema, findBreakingChanges } from 'graphql/utilities'; + * + * const oldSchema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const newSchema = buildSchema(` + * type Query { + * hello: String + * } + * `); + * + * const changes = findBreakingChanges(oldSchema, newSchema); + * + * changes.map((change) => change.type); // => ['FIELD_REMOVED'] + * ``` + * @deprecated Please use `findSchemaChanges` instead. Will be removed in v18. + */ +export declare function findBreakingChanges(oldSchema: GraphQLSchema, newSchema: GraphQLSchema): Array<BreakingChange>; +/** + * Given two schemas, returns an Array containing descriptions of all the types + * of potentially dangerous changes covered by the other functions down below. + * This deprecated wrapper will be removed in v18; use `findSchemaChanges()` + * instead and filter for dangerous changes. + * @param oldSchema - Schema before the change. + * @param newSchema - Schema after the change. + * @returns Dangerous changes between the two schemas. + * @example + * ```ts + * import { buildSchema, findDangerousChanges } from 'graphql/utilities'; + * + * const oldSchema = buildSchema(` + * enum Episode { + * NEW_HOPE + * } + * + * type Query { + * episode: Episode + * } + * `); + * const newSchema = buildSchema(` + * enum Episode { + * NEW_HOPE + * EMPIRE + * } + * + * type Query { + * episode: Episode + * } + * `); + * + * const changes = findDangerousChanges(oldSchema, newSchema); + * + * changes.map((change) => change.type); // => ['VALUE_ADDED_TO_ENUM'] + * ``` + * @deprecated Please use `findSchemaChanges` instead. Will be removed in v18. + */ +export declare function findDangerousChanges(oldSchema: GraphQLSchema, newSchema: GraphQLSchema): Array<DangerousChange>; +/** + * Finds all schema changes between two schemas. + * @param oldSchema - Schema before the change. + * @param newSchema - Schema after the change. + * @returns Safe, dangerous, and breaking changes between the two schemas. + * @example + * ```ts + * import { buildSchema, findSchemaChanges } from 'graphql/utilities'; + * + * const oldSchema = buildSchema(` + * type Query { + * greeting: String + * } + * `); + * const newSchema = buildSchema(` + * type Query { + * greeting(name: String): String + * farewell: String + * } + * `); + * + * const changes = findSchemaChanges(oldSchema, newSchema); + * + * changes.map((change) => change.type); // => ['OPTIONAL_ARG_ADDED', 'FIELD_ADDED'] + * ``` + */ +export declare function findSchemaChanges(oldSchema: GraphQLSchema, newSchema: GraphQLSchema): Array<SchemaChange>; +/** + * Wrapper type that contains DocumentNode and types that can be deduced from it. + * @typeParam TResponseData - Typed GraphQL response data shape. + * @typeParam TRequestVariables - Typed GraphQL request variables shape. + */ +export interface TypedQueryDocumentNode<TResponseData = { + [key: string]: any; +}, TRequestVariables = { + [key: string]: any; +}> extends DocumentNode { + /** Top-level executable and type-system definitions in this document. */ + readonly definitions: ReadonlyArray<ExecutableDefinitionNode>; + /** + * This type is used to ensure that the variables you pass in to the query are assignable to Variables + * and that the Result is assignable to whatever you pass your result to. The method is never actually + * implemented, but the type is valid because we list it as optional + */ + __ensureTypesOfVariablesAndResultMatching?: (variables: TRequestVariables) => TResponseData; +} +interface ResolvedNamedType { + readonly kind: "NamedType"; + readonly type: GraphQLNamedType; +} +interface ResolvedField { + readonly kind: "Field"; + readonly type: GraphQLObjectType | GraphQLInterfaceType; + readonly field: GraphQLField<unknown, unknown>; +} +interface ResolvedInputField { + readonly kind: "InputField"; + readonly type: GraphQLInputObjectType; + readonly inputField: GraphQLInputField; +} +interface ResolvedEnumValue { + readonly kind: "EnumValue"; + readonly type: GraphQLEnumType; + readonly enumValue: GraphQLEnumValue; +} +interface ResolvedFieldArgument { + readonly kind: "FieldArgument"; + readonly type: GraphQLObjectType | GraphQLInterfaceType; + readonly field: GraphQLField<unknown, unknown>; + readonly fieldArgument: GraphQLArgument; +} +interface ResolvedDirective { + readonly kind: "Directive"; + readonly directive: GraphQLDirective; +} +interface ResolvedDirectiveArgument { + readonly kind: "DirectiveArgument"; + readonly directive: GraphQLDirective; + readonly directiveArgument: GraphQLArgument; +} +/** A schema element resolved from a schema coordinate. */ +export type ResolvedSchemaElement = ResolvedNamedType | ResolvedField | ResolvedInputField | ResolvedEnumValue | ResolvedFieldArgument | ResolvedDirective | ResolvedDirectiveArgument; +/** + * A schema coordinate is resolved in the context of a GraphQL schema to + * uniquely identify a schema element. It returns undefined if the schema + * coordinate does not resolve to a schema element, meta-field, or introspection + * schema element. It will throw if the containing schema element (if + * applicable) does not exist. + * + * https://spec.graphql.org/draft/#sec-Schema-Coordinates.Semantics + * @param schema - GraphQL schema to use. + * @param schemaCoordinate - The schema coordinate to resolve. + * @returns The schema element identified by the coordinate, or undefined if none exists. + * @example + * ```ts + * import { buildSchema, resolveSchemaCoordinate } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * directive @tag(name: String!) on FIELD_DEFINITION + * + * input ReviewInput { + * stars: Int! + * } + * + * enum Episode { + * NEW_HOPE + * } + * + * type Query { + * reviews(input: ReviewInput): [String] @tag(name: "reviews") + * } + * `); + * + * resolveSchemaCoordinate(schema, 'Query').kind; // => 'NamedType' + * resolveSchemaCoordinate(schema, 'Query.reviews').kind; // => 'Field' + * resolveSchemaCoordinate(schema, 'Query.reviews(input:)').kind; // => 'FieldArgument' + * resolveSchemaCoordinate(schema, 'ReviewInput.stars').kind; // => 'InputField' + * resolveSchemaCoordinate(schema, 'Episode.NEW_HOPE').kind; // => 'EnumValue' + * resolveSchemaCoordinate(schema, '@tag').kind; // => 'Directive' + * resolveSchemaCoordinate(schema, '@tag(name:)').kind; // => 'DirectiveArgument' + * resolveSchemaCoordinate(schema, 'Query.missing'); // => undefined + * ``` + */ +export declare function resolveSchemaCoordinate(schema: GraphQLSchema, schemaCoordinate: string | Source): ResolvedSchemaElement | undefined; +/** + * Resolves schema coordinate from a parsed SchemaCoordinate node. + * @param schema - GraphQL schema to use. + * @param schemaCoordinate - The schema coordinate to resolve. + * @returns The schema element identified by the parsed coordinate, or undefined if none exists. + * @example + * ```ts + * import { parseSchemaCoordinate } from 'graphql/language'; + * import { buildSchema, resolveASTSchemaCoordinate } from 'graphql/utilities'; + * + * const schema = buildSchema(` + * type Query { + * greeting(name: String): String + * } + * `); + * const coordinate = parseSchemaCoordinate('Query.greeting(name:)'); + * const resolved = resolveASTSchemaCoordinate(schema, coordinate); + * + * resolved.kind; // => 'FieldArgument' + * resolved.field.name; // => 'greeting' + * resolved.fieldArgument.name; // => 'name' + * ``` + */ +export declare function resolveASTSchemaCoordinate(schema: GraphQLSchema, schemaCoordinate: SchemaCoordinateNode): ResolvedSchemaElement | undefined; +type ExtensionsObject = Record<string | symbol, any>; +type ObjectTypeExtensions = { + type: "object"; + fields: Record<string, { + extensions: ExtensionsObject; + arguments: Record<string, ExtensionsObject>; + }>; +}; +type InputTypeExtensions = { + type: "input"; + fields: Record<string, { + extensions: ExtensionsObject; + }>; +}; +type InterfaceTypeExtensions = { + type: "interface"; + fields: Record<string, { + extensions: ExtensionsObject; + arguments: Record<string, ExtensionsObject>; + }>; +}; +type UnionTypeExtensions = { + type: "union"; +}; +type ScalarTypeExtensions = { + type: "scalar"; +}; +type EnumTypeExtensions = { + type: "enum"; + values: Record<string, ExtensionsObject>; +}; +type PossibleTypeExtensions = InputTypeExtensions | InterfaceTypeExtensions | ObjectTypeExtensions | UnionTypeExtensions | ScalarTypeExtensions | EnumTypeExtensions; +type SchemaExtensions = { + schemaExtensions: ExtensionsObject; + types: Record<string, { + extensions: ExtensionsObject; + } & PossibleTypeExtensions>; +}; +interface GraphQLResolveInfo$1 extends GraphQLResolveInfo { + signal?: AbortSignal; + /** Returns the AbortSignal supplied for this execution, if any. */ + readonly getAbortSignal: () => AbortSignal | undefined; + /** Returns helper functions for tracking asynchronous resolver work. */ + readonly getAsyncHelpers: () => GraphQLResolveInfoHelpers$1; +} +interface GraphQLResolveInfoHelpers$1 { + /** + * Promise.all wrapper that allows rejected branches to be tracked + * as execution async work. + * + * Intended use: return or await this promise from resolver work. + * Un-awaited async side effects are an anti-pattern: + * + * const { promiseAll } = info.getAsyncHelpers(); + * promiseAll([someAsyncWork(), someOtherAsyncWork()]).catch(() => undefined); + * + * In that anti-pattern, tracking starts only after rejection (on a + * later microtask), so this work is not guaranteed to delay + * `hooks.asyncWorkFinished`. + * + * Use `track(...)` for un-awaited async side effects: + * + * const { track } = info.getAsyncHelpers(); + * track([ + * someAsyncWork().catch(() => undefined), + * someOtherAsyncWork().catch(() => undefined) + * ]); + */ + readonly promiseAll: <T>(values: ReadonlyArray<PromiseLike<T> | T>) => Promise<Array<T>>; + /** Tracks asynchronous work that should delay execution completion hooks. */ + readonly track: (maybePromises: ReadonlyArray<unknown>) => void; +} +interface GraphQLParseOptions { + noLocation?: boolean; + allowLegacySDLEmptyFields?: boolean; + allowLegacySDLImplementsInterfaces?: boolean; + experimentalFragmentVariables?: boolean; + /** + * Set to `true` in order to convert all GraphQL comments (marked with # sign) to descriptions (""") + * GraphQL has built-in support for transforming descriptions to comments (with `print`), but not while + * parsing. Turning the flag on will support the other way as well (`parse`) + */ + commentDescriptions?: boolean; +} +type ValidatorBehavior = "error" | "warn" | "ignore"; +interface IResolverValidationOptions { + /** + * Enable to require a resolver to be defined for any field that has + * arguments. Defaults to `ignore`. + */ + requireResolversForArgs?: ValidatorBehavior; + /** + * Enable to require a resolver to be defined for any field which has + * a return type that isn't a scalar. Defaults to `ignore`. + */ + requireResolversForNonScalar?: ValidatorBehavior; + /** + * Enable to require a resolver for be defined for all fields defined + * in the schema. Defaults to `ignore`. + */ + requireResolversForAllFields?: ValidatorBehavior; + /** + * Enable to require a `resolveType()` for Interface and Union types. + * Defaults to `ignore`. + */ + requireResolversForResolveType?: ValidatorBehavior; + /** + * Enable to require all defined resolvers to match fields that + * actually exist in the schema. Defaults to `error` to catch common errors. + */ + requireResolversToMatchSchema?: ValidatorBehavior; +} +type IScalarTypeResolver = GraphQLScalarType & { + __name?: string; + __description?: string; + __serialize?: GraphQLScalarSerializer<any>; + __parseValue?: GraphQLScalarValueParser<any>; + __parseLiteral?: GraphQLScalarLiteralParser<any>; + __extensions?: ExtensionsObject; + __astNode?: ScalarTypeDefinitionNode; + __extensionASTNodes?: Array<ScalarTypeExtensionNode>; +}; +type IEnumTypeResolver = Record<string, any> & { + __name?: string; + __description?: string; + __extensions?: ExtensionsObject; + __astNode?: EnumTypeDefinitionNode; + __extensionASTNodes?: Array<EnumTypeExtensionNode>; +}; +interface IFieldResolverOptions<TSource = any, TContext = any, TArgs = any> { + name?: string; + description?: string; + type?: GraphQLOutputType; + args?: Array<GraphQLArgument>; + resolve?: IFieldResolver<TSource, TContext, TArgs>; + subscribe?: IFieldResolver<TSource, TContext, TArgs>; + isDeprecated?: boolean; + deprecationReason?: string; + extensions?: ExtensionsObject; + astNode?: FieldDefinitionNode; +} +type IFieldResolver<TSource, TContext, TArgs = Record<string, any>, TReturn = any> = (source: TSource, args: TArgs, context: TContext, info: GraphQLResolveInfo$1) => TReturn; +type TypeSource = string | Source | DocumentNode | GraphQLSchema | DefinitionNode | Array<TypeSource> | (() => TypeSource); +type IObjectTypeResolver<TSource = any, TContext = any, TArgs = any> = { + [key: string]: IFieldResolver<TSource, TContext, TArgs> | IFieldResolverOptions<TSource, TContext>; +} & { + __name?: string; + __description?: string; + __isTypeOf?: GraphQLIsTypeOfFn<TSource, TContext>; + __extensions?: ExtensionsObject; + __astNode?: ObjectTypeDefinitionNode; + __extensionASTNodes?: ObjectTypeExtensionNode; +}; +type IInterfaceTypeResolver<TSource = any, TContext = any, TArgs = any> = { + [key: string]: IFieldResolver<TSource, TContext, TArgs> | IFieldResolverOptions<TSource, TContext>; +} & { + __name?: string; + __description?: string; + __resolveType?: GraphQLTypeResolver<any, any>; + __extensions?: ExtensionsObject; + __astNode?: InterfaceTypeDefinitionNode; + __extensionASTNodes?: Array<InterfaceTypeExtensionNode>; +}; +type IUnionTypeResolver = { + __name?: string; + __description?: string; + __resolveType?: GraphQLTypeResolver<any, any>; + __extensions?: ExtensionsObject; + __astNode?: UnionTypeDefinitionNode; + __extensionASTNodes?: Array<UnionTypeExtensionNode>; +}; +type IInputObjectTypeResolver = { + __name?: string; + __description?: string; + __extensions?: ExtensionsObject; + __astNode?: InputObjectTypeDefinitionNode; + __extensionASTNodes?: Array<InputObjectTypeExtensionNode>; +}; +type ISchemaLevelResolver<TSource, TContext, TArgs = Record<string, any>, TReturn = any> = IFieldResolver<TSource, TContext, TArgs, TReturn>; +type IResolvers<TSource = any, TContext = any, TArgs = Record<string, any>, TReturn = any> = Record<string, ISchemaLevelResolver<TSource, TContext, TArgs, TReturn> | IObjectTypeResolver<TSource, TContext> | IInterfaceTypeResolver<TSource, TContext> | IUnionTypeResolver | IScalarTypeResolver | IEnumTypeResolver | IInputObjectTypeResolver>; +export interface GraphQLError { + /** + * An optional schema coordinate (e.g. "MyType.myField") associated with this error. + */ + readonly coordinate?: string; +} +interface IExecutableSchemaDefinition<TContext = any> extends BuildSchemaOptions, GraphQLParseOptions { + /** + * The type definitions used to create the schema + */ + typeDefs: TypeSource; + /** + * Object describing the field resolvers for the provided type definitions + */ + resolvers?: IResolvers<any, TContext> | Array<IResolvers<any, TContext>>; + /** + * Additional options for validating the provided resolvers + */ + resolverValidationOptions?: IResolverValidationOptions; + /** + * GraphQL object types that implement interfaces will inherit any missing + * resolvers from their interface types defined in the `resolvers` object + */ + inheritResolversFromInterfaces?: boolean; + /** + * Do not create a schema again and use the one from `buildASTSchema` + */ + updateResolversInPlace?: boolean; + /** + * Schema extensions + */ + schemaExtensions?: SchemaExtensions | Array<SchemaExtensions>; + /** + * Default field resolver + */ + defaultFieldResolver?: GraphQLFieldResolver<any, TContext>; +} +/** + * Builds a schema from the provided type definitions and resolvers. + * + * The type definitions are written using Schema Definition Language (SDL). They + * can be provided as a string, a `DocumentNode`, a function, or an array of any + * of these. If a function is provided, it will be passed no arguments and + * should return an array of strings or `DocumentNode`s. + * + * Note: You can use GraphQL magic comment provide additional syntax + * highlighting in your editor (with the appropriate editor plugin). + * + * ```js + * const typeDefs = /* GraphQL *\/ ` + * type Query { + * posts: [Post] + * author(id: Int!): Author + * } + * `; + * ``` + * + * The `resolvers` object should be a map of type names to nested object, which + * themselves map the type's fields to their appropriate resolvers. + * See the [Resolvers](/docs/resolvers) section of the documentation for more details. + * + * ```js + * const resolvers = { + * Query: { + * posts: (obj, args, ctx, info) => getAllPosts(), + * author: (obj, args, ctx, info) => getAuthorById(args.id) + * } + * }; + * ``` + * + * Once you've defined both the `typeDefs` and `resolvers`, you can create your + * schema: + * + * ```js + * const schema = makeExecutableSchema({ + * typeDefs, + * resolvers, + * }) + * ``` + */ +export declare function makeExecutableSchema<TContext = any>({ typeDefs, resolvers, resolverValidationOptions, inheritResolversFromInterfaces, updateResolversInPlace, schemaExtensions, defaultFieldResolver, ...otherOptions }: IExecutableSchemaDefinition<TContext>): GraphQLSchema; +type ID = string; +declare enum MessageType { + ConnectionInit = "connection_init",// Client -> Server + ConnectionAck = "connection_ack",// Server -> Client + Ping = "ping",// bidirectional + Pong = "pong",/// bidirectional + Subscribe = "subscribe",// Client -> Server + Next = "next",// Server -> Client + Error = "error",// Server -> Client + Complete = "complete" +} +interface ConnectionInitMessage { + readonly type: MessageType.ConnectionInit; + readonly payload?: Record<string, unknown>; +} +interface PingMessage { + readonly type: MessageType.Ping; + readonly payload?: Record<string, unknown>; +} +interface PongMessage { + readonly type: MessageType.Pong; + readonly payload?: Record<string, unknown>; +} +interface SubscribePayload { + readonly operationName?: string | null | undefined; + readonly query: string; + readonly variables?: Record<string, unknown> | null | undefined; + readonly extensions?: Record<string, unknown> | null | undefined; +} +interface ExecutionResult$1<Data = Record<string, unknown>, Extensions = Record<string, unknown>> { + errors?: ReadonlyArray<GraphQLError> | undefined; + data?: Data | null | undefined; + hasNext?: boolean | undefined; + extensions?: Extensions | undefined; +} +type JSONMessageReviver = (this: any, key: string, value: any) => any; +type JSONMessageReplacer = (this: any, key: string, value: any) => any; +type OperationResult = Promise<AsyncGenerator<ExecutionResult$1> | AsyncIterable<ExecutionResult$1> | ExecutionResult$1> | AsyncGenerator<ExecutionResult$1> | AsyncIterable<ExecutionResult$1> | ExecutionResult$1; +type GraphQLExecutionContextValue = object | symbol | number | string | boolean | undefined | null; +/** @category Server */ +export interface ServerOptions<P extends ConnectionInitMessage["payload"] = ConnectionInitMessage["payload"], E = unknown> { + /** + * The GraphQL schema on which the operations + * will be executed and validated against. + * + * If a function is provided, it will be called on + * every subscription request allowing you to manipulate + * schema dynamically. + * + * If the schema is left undefined, you're trusted to + * provide one in the returned `ExecutionArgs` from the + * `onSubscribe` callback. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + */ + schema?: undefined | GraphQLSchema | ((ctx: Context<P, E>, id: string, payload: SubscribePayload, args: Omit<ExecutionArgs, "schema">) => Promise<GraphQLSchema> | GraphQLSchema); + /** + * A value which is provided to every resolver and holds + * important contextual information like the currently + * logged in user, or access to a database. + * + * If you return from `onSubscribe`, and the returned value is + * missing the `contextValue` field, this context will be used + * instead. + * + * If you use the function signature, the final execution arguments + * will be passed in (also the returned value from `onSubscribe`). + * Since the context is injected on every subscribe, the `SubscribeMessage` + * with the regular `Context` will be passed in through the arguments too. + * + * Note that the context function is invoked on each operation only once. + * Meaning, for subscriptions, only at the point of initialising the subscription; + * not on every subscription event emission. Read more about the context lifecycle + * in subscriptions here: https://github.com/graphql/graphql-js/issues/894. + */ + context?: undefined | GraphQLExecutionContextValue | ((ctx: Context<P, E>, id: string, payload: SubscribePayload, args: ExecutionArgs) => Promise<GraphQLExecutionContextValue> | GraphQLExecutionContextValue); + /** + * The GraphQL root fields or resolvers to go + * alongside the schema. Learn more about them + * here: https://graphql.org/learn/execution/#root-fields-resolvers. + * + * If you return from `onSubscribe`, and the returned value is + * missing the `rootValue` field, the relevant operation root + * will be used instead. + */ + roots?: undefined | { + [operation in OperationTypeNode]?: Record<string, NonNullable<ExecutionArgs["rootValue"]>>; + }; + /** + * A custom GraphQL parse function allowing you to apply your own + * parsing logic. + * + * Will not be used when implementing a custom `onSubscribe`. + * + * Throwing an error from within this function will close the socket + * with the `Error` message in the close event reason. + */ + parse?: undefined | typeof parse; + /** + * A custom GraphQL validate function allowing you to apply your + * own validation rules. + * + * Returned, non-empty, array of `GraphQLError`s will be communicated + * to the client through the `ErrorMessage`. Use an empty array if the + * document is valid and no errors have been encountered. + * + * Will not be used when implementing a custom `onSubscribe`. + * + * Throwing an error from within this function will close the socket + * with the `Error` message in the close event reason. + */ + validate?: undefined | typeof validate; + /** + * Is the `execute` function from GraphQL which is + * used to execute the query and mutation operations. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + */ + execute?: undefined | ((args: ExecutionArgs) => OperationResult); + /** + * Is the `subscribe` function from GraphQL which is + * used to execute the subscription operation. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + */ + subscribe?: undefined | ((args: ExecutionArgs) => OperationResult); + /** + * The amount of time for which the server will wait + * for `ConnectionInit` message. + * + * Set the value to `Infinity`, `''`, `0`, `null` or `undefined` to skip waiting. + * + * If the wait timeout has passed and the client + * has not sent the `ConnectionInit` message, + * the server will terminate the socket by + * dispatching a close event `4408: Connection initialisation timeout` + * + * @default 3_000 // 3 seconds + */ + connectionInitWaitTimeout?: undefined | number; + /** + * Is the connection callback called when the + * client requests the connection initialisation + * through the message `ConnectionInit`. + * + * The message payload (`connectionParams` from the + * client) is present in the `Context.connectionParams`. + * + * - Returning `true` or nothing from the callback will + * allow the client to connect. + * + * - Returning `false` from the callback will + * terminate the socket by dispatching the + * close event `4403: Forbidden`. + * + * - Returning a `Record` from the callback will + * allow the client to connect and pass the returned + * value to the client through the optional `payload` + * field in the `ConnectionAck` message. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + */ + onConnect?: undefined | ((ctx: Context<P, E>) => Promise<Record<string, unknown> | boolean | void> | Record<string, unknown> | boolean | void); + /** + * Called when the client disconnects for whatever reason after + * he successfully went through the connection initialisation phase. + * Provides the close event too. Beware that this callback happens + * AFTER all subscriptions have been gracefully completed and BEFORE + * the `onClose` callback. + * + * If you are interested in tracking the subscriptions completions, + * consider using the `onComplete` callback. + * + * This callback will be called EXCLUSIVELY if the client connection + * is acknowledged. Meaning, `onConnect` will be called before the `onDisconnect`. + * + * For tracking socket closures at any point in time, regardless + * of the connection state - consider using the `onClose` callback. + */ + onDisconnect?: undefined | ((ctx: Context<P, E>, code?: number, reason?: string) => Promise<void> | void); + /** + * Called when the client sends a {@link MessageType.Ping} message, at any + * point after the connection is opened - before or after the connection + * initialisation phase. + * + * If the client sent the ping with a payload, it will be passed through the + * second argument. The first argument provides the {@link Context} of the + * connection. + * + * If this callback is implemented, the server will still automatically reply + * to the ping with a pong, right after the callback resolves. Use the + * low-level `onPing` listener on the websocket itself for full control over + * the response - implementing that listener disables the automatic pong. + */ + onPing?: undefined | ((ctx: Context<P, E>, payload: PingMessage["payload"]) => Promise<void> | void); + /** + * Called when the client sends a {@link MessageType.Pong} message, at any + * point after the connection is opened - before or after the connection + * initialisation phase. + * + * If the client sent the pong with a payload, it will be passed through the + * second argument. The first argument provides the {@link Context} of the + * connection. + */ + onPong?: undefined | ((ctx: Context<P, E>, payload: PongMessage["payload"]) => Promise<void> | void); + /** + * Called when the socket closes for whatever reason, at any + * point in time. Provides the close event too. Beware + * that this callback happens AFTER all subscriptions have + * been gracefully completed and AFTER the `onDisconnect` callback. + * + * If you are interested in tracking the subscriptions completions, + * consider using the `onComplete` callback. + * + * In comparison to `onDisconnect`, this callback will ALWAYS + * be called, regardless if the user successfully went through + * the connection initialisation or not. `onConnect` might not + * called before the `onClose`. + */ + onClose?: undefined | ((ctx: Context<P, E>, code?: number, reason?: string) => Promise<void> | void); + /** + * The subscribe callback executed right after + * acknowledging the request before any payload + * processing has been performed. + * + * If you return `ExecutionArgs` from the callback, + * it will be used instead of trying to build one + * internally. In this case, you are responsible + * for providing a ready set of arguments which will + * be directly plugged in the operation execution. + * + * Omitting the fields `contextValue` or `rootValue` + * from the returned value will have the provided server + * options fill in the gaps. + * + * To report GraphQL errors simply return an array + * of them from the callback, they will be reported + * to the client through the error message. + * + * Useful for preparing the execution arguments + * following a custom logic. A typical use case are + * persisted queries, you can identify the query from + * the subscribe message and create the GraphQL operation + * execution args which are then returned by the function. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + */ + onSubscribe?: undefined | ((ctx: Context<P, E>, id: string, payload: SubscribePayload) => Promise<ExecutionArgs | readonly GraphQLError[] | void> | ExecutionArgs | readonly GraphQLError[] | void); + /** + * Executed after the operation call resolves. For streaming + * operations, triggering this callback does not necessarily + * mean that there is already a result available - it means + * that the subscription process for the stream has resolved + * and that the client is now subscribed. + * + * The `OperationResult` argument is the result of operation + * execution. It can be an iterator or already a value. + * + * If you want the single result and the events from a streaming + * operation, use the `onNext` callback. + * + * Use this callback to listen for subscribe operation and + * execution result manipulation. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + */ + onOperation?: undefined | ((ctx: Context<P, E>, id: string, payload: SubscribePayload, args: ExecutionArgs, result: OperationResult) => Promise<OperationResult | void> | OperationResult | void); + /** + * Executed after an error occurred right before it + * has been dispatched to the client. + * + * Use this callback to format the outgoing GraphQL + * errors before they reach the client. + * + * Returned result will be injected in the error message payload. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + */ + onError?: undefined | ((ctx: Context<P, E>, id: string, payload: SubscribePayload, errors: readonly GraphQLError[]) => Promise<readonly GraphQLFormattedError[] | void> | readonly GraphQLFormattedError[] | void); + /** + * Executed after an operation has emitted a result right before + * that result has been sent to the client. Results from both + * single value and streaming operations will appear in this callback. + * + * Use this callback if you want to format the execution result + * before it reaches the client. + * + * Returned result will be injected in the next message payload. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + */ + onNext?: undefined | ((ctx: Context<P, E>, id: string, payload: SubscribePayload, args: ExecutionArgs, result: ExecutionResult$1) => Promise<FormattedExecutionResult | void> | FormattedExecutionResult | void); + /** + * The complete callback is executed after the + * operation has completed right before sending + * the complete message to the client. + * + * Throwing an error from within this function will + * close the socket with the `Error` message + * in the close event reason. + * + * Since the library makes sure to complete streaming + * operations even after an abrupt closure, this callback + * will still be called. + */ + onComplete?: undefined | ((ctx: Context<P, E>, id: string, payload: SubscribePayload) => Promise<void> | void); + /** + * An optional override for the JSON.parse function used to hydrate + * incoming messages to this server. Useful for parsing custom datatypes + * out of the incoming JSON. + */ + jsonMessageReviver?: undefined | JSONMessageReviver; + /** + * An optional override for the JSON.stringify function used to serialize + * outgoing messages to from server. Useful for serializing custom + * datatypes out to the client. + */ + jsonMessageReplacer?: undefined | JSONMessageReplacer; +} +interface Server<E = undefined> { + /** + * New socket has been established. The lib will validate + * the protocol and use the socket accordingly. Returned promise + * will resolve after the socket closes. + * + * The second argument will be passed in the `extra` field + * of the `Context`. You may pass the initial request or the + * original WebSocket, if you need it down the road. + * + * Returns a function that should be called when the same socket + * has been closed, for whatever reason. The close code and reason + * must be passed for reporting to the `onDisconnect` callback. Returned + * promise will resolve once the internal cleanup is complete. + */ + opened(socket: WebSocket$1, ctxExtra: E): (code?: number, reason?: string) => Promise<void>; +} +interface WebSocket$1 { + /** + * The subprotocol of the WebSocket. Will be used + * to validate against the supported ones. + */ + readonly protocol: string; + /** + * Sends a message through the socket. Will always + * provide a `string` message. + * + * Please take care that the send is ready. Meaning, + * only provide a truly OPEN socket through the `opened` + * method of the `Server`. + * + * The returned promise is used to control the flow of data + * (like handling backpressure). + */ + send(data: string): Promise<void> | void; + /** + * Closes the socket gracefully. Will always provide + * the appropriate code and close reason. `onDisconnect` + * callback will be called. + * + * The returned promise is used to control the graceful + * closure. + */ + close(code?: number, reason?: string): Promise<void> | void; + /** + * Called when message is received. The library requires the data + * to be a `string`. + * + * All operations requested from the client will block the promise until + * completed, this means that the callback will not resolve until all + * subscription events have been emitted (or until the client has completed + * the stream), or until the query/mutation resolves. + * + * Exceptions raised during any phase of operation processing will + * reject the callback's promise, catch them and communicate them + * to your clients however you wish. + */ + onMessage(cb: (data: string) => Promise<void>): void; + /** + * Implement a listener for the `PingMessage` sent from the client to the server. + * If the client sent the ping with a payload, it will be passed through the + * first argument. + * + * If this listener is implemented, the server will NOT automatically reply + * to any pings from the client. Implementing it makes it your responsibility + * to decide how and when to respond. + */ + onPing?(payload: PingMessage["payload"]): Promise<void> | void; + /** + * Implement a listener for the `PongMessage` sent from the client to the server. + * If the client sent the pong with a payload, it will be passed through the + * first argument. + */ + onPong?(payload: PongMessage["payload"]): Promise<void> | void; +} +interface Context<P extends ConnectionInitMessage["payload"] = ConnectionInitMessage["payload"], E = unknown> { + /** + * Indicates that the `ConnectionInit` message + * has been received by the server. If this is + * `true`, the client wont be kicked off after + * the wait timeout has passed. + */ + readonly connectionInitReceived: boolean; + /** + * Indicates that the connection was acknowledged + * by having dispatched the `ConnectionAck` message + * to the related client. + */ + readonly acknowledged: boolean; + /** The parameters passed during the connection initialisation. */ + readonly connectionParams?: Readonly<P>; + /** + * Holds the active subscriptions for this context. **All operations** + * that are taking place are aggregated here. The user is _subscribed_ + * to an operation when waiting for result(s). + * + * If the subscription behind an ID is an `AsyncIterator` - the operation + * is streaming; on the contrary, if the subscription is `null` - it is simply + * a reservation, meaning - the operation resolves to a single result or is still + * pending/being prepared. + */ + readonly subscriptions: Record<ID, AsyncGenerator<unknown> | AsyncIterable<unknown> | null>; + /** + * An extra field where you can store your own context values + * to pass between callbacks. + */ + extra: E; +} +/** + * Makes a Protocol compliant WebSocket GraphQL server. The server + * is actually an API which is to be used with your favourite WebSocket + * server library! + * + * Read more about the [GraphQL over WebSocket Protocol](https://github.com/graphql/graphql-over-http/blob/main/rfcs/GraphQLOverWebSocket.md). + * + * @category Server + */ +export declare function makeServer<P extends ConnectionInitMessage["payload"] = ConnectionInitMessage["payload"], E = unknown>(options: ServerOptions<P, E>): Server<E>; + +declare namespace Kind { + export { ARGUMENT, ARGUMENT_COORDINATE, BOOLEAN, DIRECTIVE, DIRECTIVE_ARGUMENT_COORDINATE, DIRECTIVE_COORDINATE, DIRECTIVE_DEFINITION, DIRECTIVE_EXTENSION, DOCUMENT, ENUM, ENUM_TYPE_DEFINITION, ENUM_TYPE_EXTENSION, ENUM_VALUE_DEFINITION, FIELD, FIELD_DEFINITION, FLOAT, FRAGMENT_ARGUMENT, FRAGMENT_DEFINITION, FRAGMENT_SPREAD, INLINE_FRAGMENT, INPUT_OBJECT_TYPE_DEFINITION, INPUT_OBJECT_TYPE_EXTENSION, INPUT_VALUE_DEFINITION, INT, INTERFACE_TYPE_DEFINITION, INTERFACE_TYPE_EXTENSION, LIST, LIST_TYPE, MEMBER_COORDINATE, NAME, NAMED_TYPE, NON_NULL_TYPE, NULL, OBJECT, OBJECT_FIELD, OBJECT_TYPE_DEFINITION, OBJECT_TYPE_EXTENSION, OPERATION_DEFINITION, OPERATION_TYPE_DEFINITION, SCALAR_TYPE_DEFINITION, SCALAR_TYPE_EXTENSION, SCHEMA_DEFINITION, SCHEMA_EXTENSION, SELECTION_SET, STRING, TYPE_COORDINATE, UNION_TYPE_DEFINITION, UNION_TYPE_EXTENSION, VARIABLE, VARIABLE_DEFINITION }; +} + +export { + Location$1 as Location, + Path as ResponsePath, + pathToArray as responsePathAsArray, +}; + +export {}; |