import { ASTNode, GraphQLError, GraphQLFormattedError, Source, SourceLocation, } from 'graphql'; declare module 'graphql' { export interface GraphQLErrorExtensions { exception?: { code?: string; stacktrace?: ReadonlyArray; }; } } export class BaseGraphQLError extends Error implements GraphQLError { public extensions: Record; override readonly name!: string; readonly locations: ReadonlyArray | undefined; readonly path: ReadonlyArray | undefined; readonly source: Source | undefined; readonly positions: ReadonlyArray | undefined; readonly nodes: ReadonlyArray | undefined; public originalError: Error | undefined; [key: string]: any; constructor( message: string, code?: string, extensions?: Record, ) { super(message); // if no name provided, use the default. defineProperty ensures that it stays non-enumerable if (!this.name) { Object.defineProperty(this, 'name', { value: 'ApolloError' }); } if (extensions?.extensions) { throw Error( 'Pass extensions directly as the third argument of the ApolloError constructor: `new ' + 'ApolloError(message, code, {myExt: value})`, not `new ApolloError(message, code, ' + '{extensions: {myExt: value}})`', ); } this.extensions = { ...extensions, code }; } toJSON(): GraphQLFormattedError { return toGraphQLError(this).toJSON(); } override toString(): string { return toGraphQLError(this).toString(); } get [Symbol.toStringTag](): string { return this.name; } } function toGraphQLError(error: BaseGraphQLError): GraphQLError { return new GraphQLError(error.message, { nodes: error.nodes, source: error.source, positions: error.positions, path: error.path, originalError: error.originalError, extensions: error.extensions, }); } export class SyntaxError extends BaseGraphQLError { constructor(message: string) { super(message, 'GRAPHQL_PARSE_FAILED'); Object.defineProperty(this, 'name', { value: 'SyntaxError' }); } } export class ValidationError extends BaseGraphQLError { constructor(message: string) { super(message, 'GRAPHQL_VALIDATION_FAILED'); Object.defineProperty(this, 'name', { value: 'ValidationError' }); } } export class AuthenticationError extends BaseGraphQLError { constructor(message: string, extensions?: Record) { super(message, 'UNAUTHENTICATED', extensions); Object.defineProperty(this, 'name', { value: 'AuthenticationError' }); } } export class ForbiddenError extends BaseGraphQLError { constructor(message: string, extensions?: Record) { super(message, 'FORBIDDEN', extensions); Object.defineProperty(this, 'name', { value: 'ForbiddenError' }); } } export class PersistedQueryNotFoundError extends BaseGraphQLError { constructor() { super('PersistedQueryNotFound', 'PERSISTED_QUERY_NOT_FOUND'); Object.defineProperty(this, 'name', { value: 'PersistedQueryNotFoundError', }); } } export class PersistedQueryNotSupportedError extends BaseGraphQLError { constructor() { super('PersistedQueryNotSupported', 'PERSISTED_QUERY_NOT_SUPPORTED'); Object.defineProperty(this, 'name', { value: 'PersistedQueryNotSupportedError', }); } } export class UserInputError extends BaseGraphQLError { constructor(message: string, extensions?: Record) { super(message, 'BAD_USER_INPUT', extensions); Object.defineProperty(this, 'name', { value: 'UserInputError' }); } } export class NotFoundError extends BaseGraphQLError { constructor(message: string, extensions?: Record) { super(message, 'NOT_FOUND', extensions); Object.defineProperty(this, 'name', { value: 'NotFoundError' }); } } export class MethodNotAllowedError extends BaseGraphQLError { constructor(message: string, extensions?: Record) { super(message, 'METHOD_NOT_ALLOWED', extensions); Object.defineProperty(this, 'name', { value: 'MethodNotAllowedError' }); } } export class ConflictError extends BaseGraphQLError { constructor(message: string, extensions?: Record) { super(message, 'CONFLICT', extensions); Object.defineProperty(this, 'name', { value: 'ConflictError' }); } } export class TimeoutError extends BaseGraphQLError { constructor(message: string, extensions?: Record) { super(message, 'TIMEOUT', extensions); Object.defineProperty(this, 'name', { value: 'TimeoutError' }); } }