@@ -23,6 +23,8 @@ import GraphQLMongoID from './types/mongoid';
2323
2424import type {
2525 MongooseModelT ,
26+ MongooseModelSchemaT ,
27+ MongoosePseudoModelT ,
2628 MongooseFieldT ,
2729 MongooseFieldMapT ,
2830 ComplexTypesT ,
@@ -98,7 +100,9 @@ export function dotPathsToEmbedded(fields: MongooseFieldMapT): MongooseFieldMapT
98100 return result ;
99101}
100102
101- export function getFieldsFromModel ( model : MongooseModelT ) : MongooseFieldMapT {
103+ export function getFieldsFromModel (
104+ model : MongooseModelT | MongoosePseudoModelT
105+ ) : MongooseFieldMapT {
102106 if ( ! model || ! model . schema || ! model . schema . paths ) {
103107 throw new Error ( 'You provide incorrect mongoose model to `getFieldsFromModel()`. '
104108 + 'Correct model should contain `schema.paths` properties.' ) ;
@@ -118,18 +122,14 @@ export function getFieldsFromModel(model: MongooseModelT): MongooseFieldMapT {
118122}
119123
120124export function convertModelToGraphQL (
121- model : MongooseModelT ,
125+ model : MongooseModelT | MongoosePseudoModelT ,
122126 typeName : string
123127) : TypeComposer {
124128 if ( ! typeName ) {
125129 throw new Error ( 'You provide empty name for type. '
126130 + '`name` argument should be non-empty string.' ) ;
127131 }
128132
129- if ( model . _gqcTypeComposer ) {
130- return model . _gqcTypeComposer ;
131- }
132-
133133 const typeComposer = new TypeComposer (
134134 new GraphQLObjectType ( {
135135 name : typeName ,
@@ -139,8 +139,6 @@ export function convertModelToGraphQL(
139139 } )
140140 ) ;
141141
142- model . _gqcTypeComposer = typeComposer ; // eslint-disable-line
143-
144142 const mongooseFields = getFieldsFromModel ( model , typeName ) ;
145143 const graphqlFields = { } ;
146144
@@ -156,6 +154,27 @@ export function convertModelToGraphQL(
156154 return typeComposer ;
157155}
158156
157+ export function convertSchemaToGraphQL (
158+ schema : MongooseModelSchemaT ,
159+ typeName : string
160+ ) {
161+ if ( ! typeName ) {
162+ throw new Error ( 'You provide empty name for type. '
163+ + '`name` argument should be non-empty string.' ) ;
164+ }
165+
166+ if ( schema . _gqcTypeComposer ) {
167+ return schema . _gqcTypeComposer ;
168+ }
169+
170+ const tc = convertModelToGraphQL ( { schema } , typeName ) ;
171+ // also generate InputType
172+ tc . getInputTypeComposer ( ) ;
173+
174+ schema . _gqcTypeComposer = tc ; // eslint-disable-line
175+ return tc ;
176+ }
177+
159178export function convertFieldToGraphQL (
160179 field : MongooseFieldT ,
161180 prefix : string = ''
@@ -255,9 +274,7 @@ export function embeddedToGraphQL(
255274 }
256275
257276 const typeName = `${ prefix } ${ capitalize ( fieldName ) } ` ;
258- // $FlowFixMe
259- const fieldAsModel : MongooseModelT = field ;
260- const typeComposer = convertModelToGraphQL ( fieldAsModel , typeName ) ;
277+ const typeComposer = convertSchemaToGraphQL ( field . schema , typeName ) ;
261278 removePseudoIdField ( typeComposer ) ;
262279
263280 return typeComposer . getType ( ) ;
0 commit comments