Skip to content

Commit

Permalink
Reimplement attachDirectiveResolvers using SchemaDirectiveVisitor.vis…
Browse files Browse the repository at this point in the history
…itSchema.
  • Loading branch information
benjamn committed Mar 14, 2018
1 parent f8a8dcc commit 99ad072
Showing 1 changed file with 12 additions and 18 deletions.
30 changes: 12 additions & 18 deletions src/schemaGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {
parse,
print,
DefinitionNode,
DirectiveNode,
defaultFieldResolver,
buildASTSchema,
extendSchema,
Expand All @@ -27,7 +26,7 @@ import {
GraphQLInterfaceType,
GraphQLFieldMap,
} from 'graphql';
import { getArgumentValues } from 'graphql/execution/values';

import {
IExecutableSchemaDefinition,
ILogger,
Expand Down Expand Up @@ -681,28 +680,21 @@ function attachDirectiveResolvers(
`Expected directiveResolvers to be of type object, got ${typeof directiveResolvers}`,
);
}

if (Array.isArray(directiveResolvers)) {
throw new Error(
'Expected directiveResolvers to be of type object, got Array',
);
}
forEachField(schema, (field: GraphQLField<any, any>) => {
const directives = field.astNode.directives;
directives.forEach((directive: DirectiveNode) => {
const directiveName = directive.name.value;
const resolver = directiveResolvers[directiveName];

if (resolver) {
const originalResolver = field.resolve || defaultFieldResolver;
const Directive = schema.getDirective(directiveName);
if (typeof Directive === 'undefined') {
throw new Error(
`Directive @${directiveName} is undefined. ` +
'Please define in schema before using',
);
}
const directiveArgs = getArgumentValues(Directive, directive);
const directiveClasses = Object.create(null);

Object.keys(directiveResolvers).forEach(directiveName => {
directiveClasses[directiveName] = class extends SchemaDirectiveVisitor {
public visitFieldDefinition(field: GraphQLField<any, any>) {
const resolver = directiveResolvers[directiveName];
const originalResolver = field.resolve || defaultFieldResolver;
const directiveArgs = this.args;
field.resolve = (...args: any[]) => {
const [source, , context, info] = args;
return resolver(
Expand All @@ -714,8 +706,10 @@ function attachDirectiveResolvers(
);
};
}
});
};
});

SchemaDirectiveVisitor.visitSchema(schema, directiveClasses);
}

export {
Expand Down

0 comments on commit 99ad072

Please sign in to comment.