Skip to content

Commit c025bd2

Browse files
authored
fix(graphql-types-generator): add wrapper for sub response in angular (#209)
* fix(graphql-types-generator): add wrapperr for sub response in angular * fix: change the sub type name
1 parent 6f932d0 commit c025bd2

File tree

2 files changed

+59
-10
lines changed

2 files changed

+59
-10
lines changed

packages/graphql-types-generator/src/angular/index.ts

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import { typeNameFromGraphQLType } from '../typescript/types';
1515
import { Property, interfaceDeclaration } from '../typescript/language';
1616
import { isList } from '../utilities/graphql';
17+
import { propertyDeclarations } from '../flow/codeGeneration';
1718

1819
export 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+
5787
function 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
}

packages/graphql-types-generator/test/angular/__snapshots__/index.js.snap

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,10 @@ export interface SubscriptionResponse<T> {
11141114
value: GraphQLResult<T>;
11151115
}
11161116
1117+
export type __SubscriptionContainer = {
1118+
onCreateRestaurant: OnCreateRestaurantSubscription;
1119+
};
1120+
11171121
export type Restaurant = {
11181122
__typename: \\"Restaurant\\";
11191123
id: string;
@@ -1135,7 +1139,7 @@ export type OnCreateRestaurantSubscription = {
11351139
})
11361140
export class APIService {
11371141
OnCreateRestaurantListener: Observable<
1138-
SubscriptionResponse<OnCreateRestaurantSubscription>
1142+
SubscriptionResponse<Pick<__SubscriptionContainer, \\"onCreateRestaurant\\">>
11391143
> = API.graphql(
11401144
graphqlOperation(
11411145
\`subscription OnCreateRestaurant {
@@ -1148,7 +1152,9 @@ export class APIService {
11481152
}
11491153
}\`
11501154
)
1151-
) as Observable<SubscriptionResponse<OnCreateRestaurantSubscription>>;
1155+
) as Observable<
1156+
SubscriptionResponse<Pick<__SubscriptionContainer, \\"onCreateRestaurant\\">>
1157+
>;
11521158
}
11531159
"
11541160
`;
@@ -1165,6 +1171,10 @@ export interface SubscriptionResponse<T> {
11651171
value: GraphQLResult<T>;
11661172
}
11671173
1174+
export type __SubscriptionContainer = {
1175+
onCreateRestaurant: OnCreateRestaurantSubscription;
1176+
};
1177+
11681178
export type Restaurant = {
11691179
__typename: \\"Restaurant\\";
11701180
id: string;
@@ -1193,7 +1203,9 @@ export type OnCreateRestaurantSubscription = {
11931203
export class APIService {
11941204
OnCreateRestaurantListener(
11951205
owner: string
1196-
): Observable<SubscriptionResponse<OnCreateRestaurantSubscription>> {
1206+
): Observable<
1207+
SubscriptionResponse<Pick<__SubscriptionContainer, \\"onCreateRestaurant\\">>
1208+
> {
11971209
const statement = \`subscription OnCreateRestaurant($owner: String!) {
11981210
onCreateRestaurant(owner: $owner) {
11991211
__typename
@@ -1211,7 +1223,9 @@ export class APIService {
12111223
};
12121224
return API.graphql(
12131225
graphqlOperation(statement, gqlAPIServiceArguments)
1214-
) as Observable<SubscriptionResponse<OnCreateRestaurantSubscription>>;
1226+
) as Observable<
1227+
SubscriptionResponse<Pick<__SubscriptionContainer, \\"onCreateRestaurant\\">>
1228+
>;
12151229
}
12161230
}
12171231
"

0 commit comments

Comments
 (0)