/
locatedError.ts
41 lines (35 loc) · 1.36 KB
/
locatedError.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import { inspect } from '../jsutils/inspect';
import type { Maybe } from '../jsutils/Maybe';
import type { ASTNode } from '../language/ast';
import { GraphQLError } from './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.
*/
export function locatedError(
rawOriginalError: unknown,
nodes: ASTNode | ReadonlyArray<ASTNode> | undefined | null,
path?: Maybe<ReadonlyArray<string | number>>,
): GraphQLError {
// Sometimes a non-error is thrown, wrap it as an Error instance to ensure a consistent Error interface.
const originalError: Error | GraphQLError =
rawOriginalError instanceof Error
? rawOriginalError
: new Error('Unexpected error value: ' + inspect(rawOriginalError));
// Note: this uses a brand-check to support GraphQL errors originating from other contexts.
if (isLocatedGraphQLError(originalError)) {
return originalError;
}
return new GraphQLError(
originalError.message,
(originalError as GraphQLError).nodes ?? nodes,
(originalError as GraphQLError).source,
(originalError as GraphQLError).positions,
path,
originalError,
);
}
function isLocatedGraphQLError(error: any): error is GraphQLError {
return Array.isArray(error.path);
}