@@ -14,6 +14,7 @@ import {
1414import { typeNameFromGraphQLType } from '../typescript/types' ;
1515import { Property , interfaceDeclaration } from '../typescript/language' ;
1616import { isList } from '../utilities/graphql' ;
17+ import { propertyDeclarations } from '../flow/codeGeneration' ;
1718
1819export function generateSource ( context : LegacyCompilerContext ) {
1920 const generator = new CodeGenerator < LegacyCompilerContext > ( context ) ;
@@ -39,11 +40,8 @@ function generateTypes(generator: CodeGenerator, context: LegacyCompilerContext)
3940 // if subscription operations exist create subscriptionResponse interface
4041 // https://github.com/aws-amplify/amplify-cli/issues/5284
4142 if ( context . schema . getSubscriptionType ( ) ) {
42- generator . printOnNewline ( `
43- export interface SubscriptionResponse<T> {
44- value: GraphQLResult<T>;
45- }` ) ;
46- generator . printNewline ( ) ;
43+ generateSubscriptionResponseWrapper ( generator ) ;
44+ generateSubscriptionOperationTypes ( generator , context ) ;
4745 }
4846 context . typesUsed . forEach ( type => typeDeclarationForGraphQLType ( generator , type ) ) ;
4947
@@ -54,6 +52,38 @@ function generateTypes(generator: CodeGenerator, context: LegacyCompilerContext)
5452 Object . values ( context . fragments ) . forEach ( operation => interfaceDeclarationForFragment ( generator , operation ) ) ;
5553}
5654
55+ function generateSubscriptionResponseWrapper ( generator : CodeGenerator ) {
56+ generator . printOnNewline ( `
57+ export interface SubscriptionResponse<T> {
58+ value: GraphQLResult<T>;
59+ }` ) ;
60+ generator . printNewline ( ) ;
61+ }
62+ function generateSubscriptionOperationTypes ( generator : CodeGenerator , context : LegacyCompilerContext ) {
63+ const typeName = '__SubscriptionContainer' ;
64+ const properties : Property [ ] = [ ] ;
65+ Object . values ( context . operations )
66+ . filter ( operation => operation . operationType === 'subscription' )
67+ . forEach ( operation => {
68+ const { operationName, operationType } = operation ;
69+ const typeName = interfaceNameFromOperation ( { operationName, operationType } ) ;
70+ if ( operation . fields . length ) {
71+ properties . push ( {
72+ fieldName : operation . fields [ 0 ] . responseName ,
73+ typeName,
74+ } ) ;
75+ }
76+ } ) ;
77+ if ( properties . length ) {
78+ generator . printOnNewline ( `export type ${ typeName } = ` ) ;
79+ generator . pushScope ( { typeName } ) ;
80+ generator . withinBlock ( ( ) => propertyDeclarations ( generator , properties ) , '{' , '}' ) ;
81+ generator . popScope ( ) ;
82+ generator . print ( ';' ) ;
83+ generator . printNewline ( ) ;
84+ }
85+ }
86+
5787function interfaceDeclarationForOperation ( generator : CodeGenerator , { operationName, operationType, fields } : LegacyOperation ) {
5888 const interfaceName = interfaceNameFromOperation ( { operationName, operationType } ) ;
5989 fields = fields . map ( field => updateTypeNameField ( field ) ) ;
@@ -102,6 +132,9 @@ function getReturnTypeName(generator: CodeGenerator, op: LegacyOperation): Strin
102132 return typeNameFromGraphQLType ( generator . context , type ) ;
103133 } else {
104134 let returnType = interfaceNameFromOperation ( { operationName, operationType } ) ;
135+ if ( op . operationType === 'subscription' && op . fields . length ) {
136+ returnType = `Pick<__SubscriptionContainer, "${ op . fields [ 0 ] . responseName } ">` ;
137+ }
105138 if ( isList ( type ) ) {
106139 returnType = `Array<${ returnType } >` ;
107140 }
@@ -150,7 +183,9 @@ function generateSubscriptionOperation(generator: CodeGenerator, op: LegacyOpera
150183 const params = [ 'statement' ] ;
151184 variableAssignmentToInput ( generator , vars ) ;
152185 params . push ( 'gqlAPIServiceArguments' ) ;
153- generator . printOnNewline ( `return API.graphql(graphqlOperation(${ params . join ( ', ' ) } )) as Observable<SubscriptionResponse<${ returnType } >>;` ) ;
186+ generator . printOnNewline (
187+ `return API.graphql(graphqlOperation(${ params . join ( ', ' ) } )) as Observable<SubscriptionResponse<${ returnType } >>;` ,
188+ ) ;
154189 generator . printOnNewline ( '}' ) ;
155190 } ) ;
156191 }
0 commit comments