Skip to content

Commit

Permalink
feat: allow providing an object to the GraphQLError constructor (#3454)
Browse files Browse the repository at this point in the history
  • Loading branch information
n1ru4l committed Jan 20, 2022
1 parent 5caff03 commit a91fdc6
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
44 changes: 43 additions & 1 deletion src/error/GraphQLError.ts
Expand Up @@ -20,6 +20,41 @@ export interface GraphQLErrorExtensions {
[attributeName: string]: unknown;
}

export interface GraphQLErrorArgs {
nodes?: ReadonlyArray<ASTNode> | ASTNode | null;
source?: Maybe<Source>;
positions?: Maybe<ReadonlyArray<number>>;
path?: Maybe<ReadonlyArray<string | number>>;
originalError?: Maybe<Error & { readonly extensions?: unknown }>;
extensions?: Maybe<GraphQLErrorExtensions>;
}

type BackwardsCompatibleArgs =
| [args?: GraphQLErrorArgs]
| [
nodes?: GraphQLErrorArgs['nodes'],
source?: GraphQLErrorArgs['source'],
positions?: GraphQLErrorArgs['positions'],
path?: GraphQLErrorArgs['path'],
originalError?: GraphQLErrorArgs['originalError'],
extensions?: GraphQLErrorArgs['extensions'],
];

function toNormalizedArgs(args: BackwardsCompatibleArgs): GraphQLErrorArgs {
const firstArg = args[0];
if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) {
return {
nodes: firstArg,
source: args[1],
positions: args[2],
path: args[3],
originalError: args[4],
extensions: args[5],
};
}
return firstArg;
}

/**
* A GraphQLError describes an Error found during the parse, validate, or
* execute phases of performing a GraphQL operation. In addition to a message
Expand Down Expand Up @@ -76,6 +111,9 @@ export class GraphQLError extends Error {
*/
readonly extensions: GraphQLErrorExtensions;

/**
* @deprecated Please use the `GraphQLErrorArgs` constructor overload instead.
*/
constructor(
message: string,
nodes?: ReadonlyArray<ASTNode> | ASTNode | null,
Expand All @@ -84,7 +122,11 @@ export class GraphQLError extends Error {
path?: Maybe<ReadonlyArray<string | number>>,
originalError?: Maybe<Error & { readonly extensions?: unknown }>,
extensions?: Maybe<GraphQLErrorExtensions>,
) {
);
constructor(message: string, args?: GraphQLErrorArgs);
constructor(message: string, ...rawArgs: BackwardsCompatibleArgs) {
const { nodes, source, positions, path, originalError, extensions } =
toNormalizedArgs(rawArgs);
super(message);

this.name = 'GraphQLError';
Expand Down
18 changes: 18 additions & 0 deletions src/error/__tests__/GraphQLError-test.ts
Expand Up @@ -353,4 +353,22 @@ describe('toJSON', () => {
extensions: { foo: 'bar' },
});
});

it('can be created with the alternative object argument', () => {
const error = new GraphQLError('msg', {
nodes: [operationNode],
source,
positions: [6],
path: ['path', 2, 'a'],
originalError: new Error('I like turtles'),
extensions: { hee: 'I like turtles' },
});

expect(error.toJSON()).to.deep.equal({
message: 'msg',
locations: [{ column: 5, line: 2 }],
path: ['path', 2, 'a'],
extensions: { hee: 'I like turtles' },
});
});
});

0 comments on commit a91fdc6

Please sign in to comment.