11import "reflect-metadata" ;
2- import { IntrospectionObjectType , TypeKind } from "graphql" ;
2+ import { IntrospectionObjectType , TypeKind , GraphQLObjectType , graphql } from "graphql" ;
33
4- import { Query , ObjectType , Field } from "../../src" ;
4+ import { Query , ObjectType , Field , Resolver , buildSchema } from "../../src" ;
55import { getMetadataStorage } from "../../src/metadata/getMetadataStorage" ;
66import { getSchemaInfo } from "../helpers/getSchemaInfo" ;
77
@@ -19,14 +19,17 @@ describe("Circular references", () => {
1919 @Field ( type => CircularRef2 )
2020 ref2 : any ;
2121 }
22- class Resolver {
22+ @Resolver ( )
23+ class SampleResolver {
2324 @Query ( )
2425 objectQuery ( ) : SampleObject {
2526 return { } as any ;
2627 }
2728 }
2829
29- const { schemaIntrospection : { types } } = await getSchemaInfo ( { resolvers : [ Resolver ] } ) ;
30+ const {
31+ schemaIntrospection : { types } ,
32+ } = await getSchemaInfo ( { resolvers : [ SampleResolver ] } ) ;
3033 const circularRef1 = types . find (
3134 type => type . name === "CircularRef1" ,
3235 ) as IntrospectionObjectType ;
@@ -65,4 +68,70 @@ describe("Circular references", () => {
6568 jest . resetModules ( ) ;
6669 }
6770 } ) ;
71+
72+ it ( "should allow to have self-reference fields in object type" , async ( ) => {
73+ @ObjectType ( )
74+ class SampleObject {
75+ @Field ( )
76+ stringField : string ;
77+
78+ @Field ( type => SampleObject , { nullable : true } )
79+ selfReferenceField ?: SampleObject ;
80+
81+ @Field ( type => [ SampleObject ] )
82+ selfReferenceArrayField : SampleObject [ ] ;
83+ }
84+ @Resolver ( )
85+ class SampleResolver {
86+ @Query ( )
87+ objectQuery ( ) : SampleObject {
88+ const obj : SampleObject = {
89+ stringField : "nestedStringField" ,
90+ selfReferenceArrayField : [ ] ,
91+ } ;
92+ obj . selfReferenceField = obj ;
93+ return {
94+ stringField : "stringField" ,
95+ selfReferenceArrayField : [ obj ] ,
96+ selfReferenceField : obj ,
97+ } ;
98+ }
99+ }
100+
101+ const schema = await buildSchema ( {
102+ resolvers : [ SampleResolver ] ,
103+ } ) ;
104+ expect ( schema ) . toBeDefined ( ) ;
105+
106+ const query = /* graphql */ `
107+ query {
108+ objectQuery {
109+ stringField
110+ selfReferenceField {
111+ stringField
112+ }
113+ selfReferenceArrayField {
114+ selfReferenceField {
115+ stringField
116+ }
117+ }
118+ }
119+ }
120+ ` ;
121+ const { data } = await graphql ( schema , query ) ;
122+
123+ expect ( data ! . objectQuery ) . toEqual ( {
124+ stringField : "stringField" ,
125+ selfReferenceField : {
126+ stringField : "nestedStringField" ,
127+ } ,
128+ selfReferenceArrayField : [
129+ {
130+ selfReferenceField : {
131+ stringField : "nestedStringField" ,
132+ } ,
133+ } ,
134+ ] ,
135+ } ) ;
136+ } ) ;
68137} ) ;
0 commit comments