import { isObjectLike } from '../jsutils/isObjectLike' ; import type { Maybe } from '../jsutils/Maybe' ; import type { ASTNode , Location } from '../language/ast' ; import type { SourceLocation } from '../language/location' ; import { getLocation } from '../language/location' ; import { printLocation , printSourceLocation } from '../language/printLocation' ; import type { Source } from '../language/source' ; remarks export interface GraphQLErrorExtensions { [ attributeName ] : unknown ; } /**
 * 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 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 ; /**
     * The original error thrown from a field resolver during execution.
     */ readonly originalError : Error | undefined ; /**
     * Extension fields to add to the formatted error.
     */ readonly extensions : GraphQLErrorExtensions ; constructor ( message , nodes ? , source ? , positions ? , path ? , originalError ? , extensions ? ) { super ( message ) ; this . name = 'GraphQLError' ; this . path = path ?? undefined ; this . originalError = originalError ?? undefined ; this . nodes = undefinedIfEmpty ( Array . isArray ( nodes ) ? nodes : nodes ? [ nodes ] : undefined ) ; const nodeLocations = undefinedIfEmpty ( this . nodes ?. map ( ( node ) => node . loc ) . filter ( ( loc ) : loc is Location => loc != null ) ) ; this . source = source ?? nodeLocations ?. [ 0 ] ?. source ; this . positions = positions ?? nodeLocations ?. map ( ( loc ) => loc . start ) ; this . locations = positions && source ? positions . map ( ( pos ) => getLocation ( source , pos ) ) : nodeLocations ?. map ( ( loc ) => getLocation ( loc . source , loc . start ) ) ; const originalExtensions = isObjectLike ( originalError ?. extensions ) ? originalError ?. extensions : undefined ; this . extensions = extensions ?? originalExtensions ?? Object . create ( null ) ; Object . defineProperties ( this , { message : { writable : true , enumerable : true , } , name : { enumerable : false } , nodes : { enumerable : false } , source : { enumerable : false } , positions : { enumerable : false } , originalError : { enumerable : false } , } ) ; if ( originalError ?. stack ) { Object . defineProperty ( this , 'stack' , { value : originalError . stack , writable : true , configurable : true , } ) ; } else if ( Error . captureStackTrace ) { Error . captureStackTrace ( this , GraphQLError ) ; } else { Object . defineProperty ( this , 'stack' , { value : Error ( ) . stack , writable : true , configurable : true , } ) ; } } get [ Symbol . toStringTag ] ( ) : string { return 'GraphQLError' ; } toString ( ) { let output = this . message ; if ( this . nodes ) { for ( const node of this . nodes ) { if ( node . loc ) { output += '\n\n' + printLocation ( node . loc ) ; } } } else if ( this . source && this . locations ) { for ( const location of this . locations ) { output += '\n\n' + printSourceLocation ( this . source , location ) ; } } return output ; } toJSON ( ) { type WritableFormattedError = { - readonly [ P in keyof GraphQLFormattedError ] : GraphQLFormattedError [ P ] ; } ; const formattedError = { message : this . message , } ; if ( this . locations != null ) { formattedError . locations = this . locations ; } if ( this . path != null ) { formattedError . path = this . path ; } if ( this . extensions != null && Object . keys ( this . extensions ) . length > 0 ) { formattedError . extensions = this . extensions ; } return formattedError ; } } function undefinedIfEmpty < T > ( array ) { return array === undefined || array . length === 0 ? undefined : array ; } /**
 * 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 ? : { [ key ] : unknown ; } ; } deprecated export function printError ( error ) { return error . toString ( ) ; } deprecated export function formatError ( error ) { return error . toJSON ( ) ; }