@@ -15,6 +15,7 @@ import getScalars from './parse-graphql/getScalars';
1515import { saveRenderedTemplate } from './helpers/saveRenderedTemplate' ;
1616import { findProjectMainPath } from './helpers/findProjectMainPath' ;
1717import { execQuietly } from './helpers/execQuietly' ;
18+ import getUnions from './parse-graphql/getUnions' ;
1819
1920const debug = configureDebug ( 'generate-module' ) ;
2021
@@ -247,36 +248,38 @@ export const executeGeneration = async (appPrefix = '~app', generatedPrefix = '~
247248
248249 const federatedEntities = getFederatedEntities ( schemaString ) ;
249250 const interfaces = getInterfaces ( schemaString ) ;
251+ const unions = getUnions ( schemaString ) ;
252+
250253 // Leaving this for now
251254 // eslint-disable-next-line no-param-reassign
252255 schemaString = schemaString . replace ( / e x t e n d t y p e / g, 'type' ) ;
253256 const source = new Source ( schemaString ) ;
254257 const schema = buildSchema ( source , { assumeValidSDL : true } ) ;
255258 shelljs . mkdir ( '-p' , `${ projectMainPath } /src/${ graphqlFileRootPath } /types/` ) ;
256259
257- const createInterfaceType = ( interfaceName : string ) => {
260+ const createResolveType = ( resolverTypeName : string ) => {
258261 const templateName = './templates/typeTypeResolvers.handlebars' ;
259262 const capitalizedFieldName = capitalize ( '__resolveType' ) ;
260263 const context = {
261- typeName : interfaceName ,
264+ typeName : resolverTypeName ,
262265 fieldName : '__resolveType' ,
263266 moduleName : name ,
264267 resolveReferenceType : true ,
265268 capitalizedFieldName,
266269 generatedPrefix,
267270 } ;
268271 const filePath = `${ projectMainPath } /src/${ graphqlFileRootPath } /types/` ;
269- const fileName = `${ interfaceName } ${ capitalizedFieldName } .ts` ;
272+ const fileName = `${ resolverTypeName } ${ capitalizedFieldName } .ts` ;
270273 const keepIfExists = true ;
271274
272275 saveRenderedTemplate ( templateName , context , filePath , fileName , keepIfExists ) ;
273276 } ;
274277
275- const createInterfaceSpec = ( interfaceName : string ) => {
278+ const createResolveTypeSpec = ( resoverTypeName : string ) => {
276279 const templateName = './templates/typeTypeResolvers.spec.handlebars' ;
277280 const capitalizedFieldName = capitalize ( '__resolveType' ) ;
278281 const context = {
279- typeName : interfaceName ,
282+ typeName : resoverTypeName ,
280283 fieldName : '__resolveType' ,
281284 moduleName : name ,
282285 hasArguments : false ,
@@ -285,17 +288,17 @@ export const executeGeneration = async (appPrefix = '~app', generatedPrefix = '~
285288 generatedPrefix,
286289 } ;
287290 const filePath = `${ projectMainPath } /src/${ graphqlFileRootPath } /types/` ;
288- const fileName = `${ interfaceName } ${ capitalizedFieldName } .spec.ts` ;
291+ const fileName = `${ resoverTypeName } ${ capitalizedFieldName } .spec.ts` ;
289292 const keepIfExists = true ;
290293
291294 saveRenderedTemplate ( templateName , context , filePath , fileName , keepIfExists ) ;
292295 } ;
293296
294- const createInterfaceSpecWrapper = ( interfaceName : string ) => {
297+ const createResolveTypeSpecWrapper = ( resolverTypeName : string ) => {
295298 const templateName = './templates/typeTypeResolversSpecWrapper.handlebars' ;
296299 const capitalizedFieldName = capitalize ( '__resolveType' ) ;
297300 const context = {
298- typeName : interfaceName ,
301+ typeName : resolverTypeName ,
299302 fieldName : '__resolveType' ,
300303 moduleName : name ,
301304 hasArguments : false ,
@@ -306,20 +309,31 @@ export const executeGeneration = async (appPrefix = '~app', generatedPrefix = '~
306309 graphqlFileRootPath,
307310 } ;
308311 const filePath = `${ projectMainPath } /generated/graphql/helpers/` ;
309- const fileName = `${ interfaceName } ${ capitalizedFieldName } SpecWrapper.ts` ;
312+ const fileName = `${ resolverTypeName } ${ capitalizedFieldName } SpecWrapper.ts` ;
310313 const keepIfExists = false ;
311314
312315 saveRenderedTemplate ( templateName , context , filePath , fileName , keepIfExists ) ;
313316 } ;
314317 interfaces . forEach ( ( interfaceName ) => {
315- createInterfaceType ( interfaceName ) ;
316- createInterfaceSpec ( interfaceName ) ;
317- createInterfaceSpecWrapper ( interfaceName ) ;
318+ createResolveType ( interfaceName ) ;
319+ createResolveTypeSpec ( interfaceName ) ;
320+ createResolveTypeSpecWrapper ( interfaceName ) ;
318321 typeResolvers . push ( {
319322 typeName : interfaceName ,
320323 fieldName : [ { name : '__resolveType' , capitalizedName : capitalize ( '__resolveType' ) } ] ,
321324 } ) ;
322325 } ) ;
326+
327+ unions . forEach ( ( unionName ) => {
328+ createResolveType ( unionName ) ;
329+ createResolveTypeSpec ( unionName ) ;
330+ createResolveTypeSpecWrapper ( unionName ) ;
331+ typeResolvers . push ( {
332+ typeName : unionName ,
333+ fieldName : [ { name : '__resolveType' , capitalizedName : capitalize ( '__resolveType' ) } ] ,
334+ } ) ;
335+ } ) ;
336+
323337 type FilteredType = { name : { value : string } ; resolveReferenceType: boolean ; arguments ?: string [ ] } ;
324338 typeDefinitions . forEach ( ( typeDef ) => {
325339 let filtered : FilteredType [ ] = [ ] ;
@@ -333,7 +347,10 @@ export const executeGeneration = async (appPrefix = '~app', generatedPrefix = '~
333347 filtered = type . astNode . fields . filter ( ( field ) =>
334348 field . directives . find (
335349 ( d : { name : { value : string } } ) =>
336- d . name . value === 'computed' || d . name . value === 'link' || d . name . value === 'requires' ,
350+ d . name . value === 'computed' ||
351+ d . name . value === 'link' ||
352+ d . name . value === 'requires' ||
353+ d . name . value === 'map' ,
337354 ) ,
338355 ) ;
339356 }
0 commit comments