@@ -15,6 +15,11 @@ import {
1515 GraphQLEnumValueConfigMap ,
1616 GraphQLUnionType ,
1717 GraphQLTypeResolver ,
18+ GraphQLDirective ,
19+ DirectiveNode ,
20+ ObjectTypeDefinitionNode ,
21+ FieldDefinitionNode ,
22+ ArgumentNode ,
1823} from "graphql" ;
1924import { withFilter , ResolverFn } from "graphql-subscriptions" ;
2025
@@ -43,6 +48,10 @@ import {
4348import { ResolverFilterData , ResolverTopicData , TypeResolver } from "../interfaces" ;
4449import { getFieldMetadataFromInputType , getFieldMetadataFromObjectType } from "./utils" ;
4550import { ensureInstalledCorrectGraphQLPackage } from "../utils/graphql-version" ;
51+ import {
52+ DirectiveClassMetadata ,
53+ DirectiveFieldMetadata ,
54+ } from "../metadata/definitions/directive-metadata" ;
4655
4756interface AbstractInfo {
4857 isAbstract : boolean ;
@@ -73,6 +82,7 @@ export interface SchemaGeneratorOptions extends BuildContextOptions {
7382 * Disable checking on build the correctness of a schema
7483 */
7584 skipCheck ?: boolean ;
85+ directives ?: GraphQLDirective [ ] ;
7686}
7787
7888export abstract class SchemaGenerator {
@@ -104,6 +114,7 @@ export abstract class SchemaGenerator {
104114 mutation : this . buildRootMutationType ( ) ,
105115 subscription : this . buildRootSubscriptionType ( ) ,
106116 types : this . buildOtherTypes ( ) ,
117+ directives : options . directives ,
107118 } ) ;
108119
109120 BuildContext . reset ( ) ;
@@ -255,12 +266,66 @@ export abstract class SchemaGenerator {
255266 return superClassTypeInfo ? superClassTypeInfo . type : undefined ;
256267 } ;
257268 const interfaceClasses = objectType . interfaceClasses || [ ] ;
269+
270+ const classDirectiveAstNodes = (
271+ name : string ,
272+ classMetas ?: DirectiveClassMetadata [ ] ,
273+ ) : ObjectTypeDefinitionNode | undefined => {
274+ if ( ! classMetas || ! classMetas . length ) {
275+ return ;
276+ }
277+
278+ const directives : DirectiveNode [ ] = classMetas . map ( meta =>
279+ this . createDirective ( meta . name , meta . args ) ,
280+ ) ;
281+
282+ return {
283+ kind : "ObjectTypeDefinition" ,
284+ name : {
285+ kind : "Name" ,
286+ value : name ,
287+ } ,
288+ interfaces : [ ] ,
289+ directives,
290+ } ;
291+ } ;
292+
293+ const fieldDirectiveAstNodes = (
294+ name : string ,
295+ fieldMetas ?: DirectiveFieldMetadata [ ] ,
296+ ) : FieldDefinitionNode | undefined => {
297+ if ( ! fieldMetas || ! fieldMetas . length ) {
298+ return ;
299+ }
300+
301+ const directives : DirectiveNode [ ] = fieldMetas . map ( meta =>
302+ this . createDirective ( meta . name , meta . args ) ,
303+ ) ;
304+
305+ return {
306+ kind : "FieldDefinition" ,
307+ type : {
308+ kind : "NamedType" ,
309+ name : {
310+ kind : "Name" ,
311+ value : name ,
312+ } ,
313+ } ,
314+ name : {
315+ kind : "Name" ,
316+ value : name ,
317+ } ,
318+ directives,
319+ } ;
320+ } ;
321+
258322 return {
259323 target : objectType . target ,
260324 isAbstract : objectType . isAbstract || false ,
261325 type : new GraphQLObjectType ( {
262326 name : objectType . name ,
263327 description : objectType . description ,
328+ astNode : classDirectiveAstNodes ( objectType . name , objectType . directives ) ,
264329 interfaces : ( ) => {
265330 let interfaces = interfaceClasses . map < GraphQLInterfaceType > (
266331 interfaceClass =>
@@ -295,6 +360,7 @@ export abstract class SchemaGenerator {
295360 : createSimpleFieldResolver ( field ) ,
296361 description : field . description ,
297362 deprecationReason : field . deprecationReason ,
363+ astNode : fieldDirectiveAstNodes ( field . name , field . directives ) ,
298364 } ;
299365 return fieldsMap ;
300366 } ,
@@ -604,4 +670,34 @@ export abstract class SchemaGenerator {
604670 return this . objectTypesInfo . find ( objectType => objectType . target === resolvedType ) ! . type ;
605671 } ;
606672 }
673+
674+ private static createDirective ( name : string , args ?: { [ name : string ] : any } ) : DirectiveNode {
675+ const directiveArguments : ArgumentNode [ ] = [ ] ;
676+
677+ if ( args ) {
678+ Object . keys ( args ) . forEach ( arg => {
679+ directiveArguments . push ( {
680+ kind : "Argument" ,
681+ name : {
682+ kind : "Name" ,
683+ value : arg ,
684+ } ,
685+ value : {
686+ kind : "StringValue" ,
687+ value : args [ arg ] ,
688+ block : false ,
689+ } ,
690+ } ) ;
691+ } ) ;
692+ }
693+
694+ return {
695+ kind : "Directive" ,
696+ name : {
697+ kind : "Name" ,
698+ value : name ,
699+ } ,
700+ arguments : directiveArguments ,
701+ } ;
702+ }
607703}
0 commit comments