Skip to content

Commit 670dc7b

Browse files
committed
Allow GraphQLError to be extended with known extensions
1 parent 6808b16 commit 670dc7b

File tree

2 files changed

+25
-24
lines changed

2 files changed

+25
-24
lines changed

src/error/GraphQLError.ts

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,29 +33,29 @@ export interface GraphQLFormattedErrorExtensions {
3333
[attributeName: string]: unknown;
3434
}
3535

36-
export interface GraphQLErrorOptions {
36+
export interface GraphQLErrorOptions<TErrorExtensions = GraphQLErrorExtensions> {
3737
nodes?: ReadonlyArray<ASTNode> | ASTNode | null;
3838
source?: Maybe<Source>;
3939
positions?: Maybe<ReadonlyArray<number>>;
4040
path?: Maybe<ReadonlyArray<string | number>>;
4141
originalError?: Maybe<Error & { readonly extensions?: unknown }>;
42-
extensions?: Maybe<GraphQLErrorExtensions>;
42+
extensions?: Maybe<TErrorExtensions>;
4343
}
4444

45-
type BackwardsCompatibleArgs =
46-
| [options?: GraphQLErrorOptions]
45+
type BackwardsCompatibleArgs<TErrorExtensions = GraphQLErrorExtensions> =
46+
| [options?: GraphQLErrorOptions<TErrorExtensions>]
4747
| [
48-
nodes?: GraphQLErrorOptions['nodes'],
49-
source?: GraphQLErrorOptions['source'],
50-
positions?: GraphQLErrorOptions['positions'],
51-
path?: GraphQLErrorOptions['path'],
52-
originalError?: GraphQLErrorOptions['originalError'],
53-
extensions?: GraphQLErrorOptions['extensions'],
48+
nodes?: GraphQLErrorOptions<TErrorExtensions>['nodes'],
49+
source?: GraphQLErrorOptions<TErrorExtensions>['source'],
50+
positions?: GraphQLErrorOptions<TErrorExtensions>['positions'],
51+
path?: GraphQLErrorOptions<TErrorExtensions>['path'],
52+
originalError?: GraphQLErrorOptions<TErrorExtensions>['originalError'],
53+
extensions?: GraphQLErrorOptions<TErrorExtensions>['extensions'],
5454
];
5555

56-
function toNormalizedOptions(
57-
args: BackwardsCompatibleArgs,
58-
): GraphQLErrorOptions {
56+
function toNormalizedOptions<TErrorExtensions = GraphQLErrorExtensions>(
57+
args: BackwardsCompatibleArgs<TErrorExtensions>,
58+
): GraphQLErrorOptions<TErrorExtensions> {
5959
const firstArg = args[0];
6060
if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) {
6161
return {
@@ -76,7 +76,7 @@ function toNormalizedOptions(
7676
* and stack trace, it also includes information about the locations in a
7777
* GraphQL document and/or execution result that correspond to the Error.
7878
*/
79-
export class GraphQLError extends Error {
79+
export class GraphQLError<TErrorExtensions = GraphQLErrorExtensions> extends Error {
8080
/**
8181
* An array of `{ line, column }` locations within the source GraphQL document
8282
* which correspond to this error.
@@ -124,9 +124,9 @@ export class GraphQLError extends Error {
124124
/**
125125
* Extension fields to add to the formatted error.
126126
*/
127-
readonly extensions: GraphQLErrorExtensions;
127+
readonly extensions: TErrorExtensions;
128128

129-
constructor(message: string, options?: GraphQLErrorOptions);
129+
constructor(message: string, options?: GraphQLErrorOptions<TErrorExtensions>);
130130
/**
131131
* @deprecated Please use the `GraphQLErrorOptions` constructor overload instead.
132132
*/
@@ -137,11 +137,11 @@ export class GraphQLError extends Error {
137137
positions?: Maybe<ReadonlyArray<number>>,
138138
path?: Maybe<ReadonlyArray<string | number>>,
139139
originalError?: Maybe<Error & { readonly extensions?: unknown }>,
140-
extensions?: Maybe<GraphQLErrorExtensions>,
140+
extensions?: Maybe<TErrorExtensions>,
141141
);
142-
constructor(message: string, ...rawArgs: BackwardsCompatibleArgs) {
142+
constructor(message: string, ...rawArgs: BackwardsCompatibleArgs<TErrorExtensions>) {
143143
const { nodes, source, positions, path, originalError, extensions } =
144-
toNormalizedOptions(rawArgs);
144+
toNormalizedOptions<TErrorExtensions>(rawArgs);
145145
super(message);
146146

147147
this.name = 'GraphQLError';
@@ -231,9 +231,9 @@ export class GraphQLError extends Error {
231231
return output;
232232
}
233233

234-
toJSON(): GraphQLFormattedError {
234+
toJSON(): GraphQLFormattedError<TErrorExtensions> {
235235
type WritableFormattedError = {
236-
-readonly [P in keyof GraphQLFormattedError]: GraphQLFormattedError[P];
236+
-readonly [P in keyof GraphQLFormattedError<TErrorExtensions>]: GraphQLFormattedError<TErrorExtensions>[P];
237237
};
238238

239239
const formattedError: WritableFormattedError = {
@@ -265,7 +265,7 @@ function undefinedIfEmpty<T>(
265265
/**
266266
* See: https://spec.graphql.org/draft/#sec-Errors
267267
*/
268-
export interface GraphQLFormattedError {
268+
export interface GraphQLFormattedError<TErrorExtensions = GraphQLFormattedErrorExtensions> {
269269
/**
270270
* A short, human-readable summary of the problem that **SHOULD NOT** change
271271
* from occurrence to occurrence of the problem, except for purposes of
@@ -288,7 +288,7 @@ export interface GraphQLFormattedError {
288288
* Reserved for implementors to extend the protocol however they see fit,
289289
* and hence there are no additional restrictions on its contents.
290290
*/
291-
readonly extensions?: GraphQLFormattedErrorExtensions;
291+
readonly extensions?: TErrorExtensions;
292292
}
293293

294294
/**

src/execution/execute.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,9 @@ export interface ExecutionContext {
127127
export interface ExecutionResult<
128128
TData = ObjMap<unknown>,
129129
TExtensions = ObjMap<unknown>,
130+
TErrorExtensions = ObjMap<unknown>,
130131
> {
131-
errors?: ReadonlyArray<GraphQLError>;
132+
errors?: ReadonlyArray<GraphQLError<TErrorExtensions>>;
132133
data?: TData | null;
133134
extensions?: TExtensions;
134135
}

0 commit comments

Comments
 (0)