Mirror: The spec-compliant minimum of client-side GraphQL.
1import { Maybe, Extensions, Source } from './types';
2import { ASTNode } from './ast';
3
4export class GraphQLError extends Error {
5 readonly locations: ReadonlyArray<any> | undefined;
6 readonly path: ReadonlyArray<string | number> | undefined;
7 readonly nodes: ReadonlyArray<any> | undefined;
8 readonly source: Source | undefined;
9 readonly positions: ReadonlyArray<number> | undefined;
10 readonly originalError: Error | undefined;
11 readonly extensions: Extensions;
12
13 constructor(
14 message: string,
15 nodes?: ReadonlyArray<ASTNode> | ASTNode | null,
16 source?: Maybe<Source>,
17 positions?: Maybe<ReadonlyArray<number>>,
18 path?: Maybe<ReadonlyArray<string | number>>,
19 originalError?: Maybe<Error>,
20 extensions?: Maybe<Extensions>
21 ) {
22 super(message);
23
24 this.name = 'GraphQLError';
25 this.message = message;
26
27 if (path) this.path = path;
28 if (nodes) this.nodes = (Array.isArray(nodes) ? nodes : [nodes]) as ASTNode[];
29 if (source) this.source = source;
30 if (positions) this.positions = positions;
31 if (originalError) this.originalError = originalError;
32
33 let _extensions = extensions;
34 if (!_extensions && originalError) {
35 const originalExtensions = (originalError as any).extensions;
36 if (originalExtensions && typeof originalExtensions === 'object') {
37 _extensions = originalExtensions;
38 }
39 }
40
41 this.extensions = _extensions || {};
42 }
43
44 toJSON(): any {
45 return { ...this };
46 }
47
48 toString() {
49 return this.message;
50 }
51
52 get [Symbol.toStringTag]() {
53 return 'GraphQLError';
54 }
55}