Skip to content

Commit 9f60cad

Browse files
authored
fix(transforms): don't add __typename to subscriptions (#2292)
see: #2282 graphql/graphql-js#2861 graphql/graphql-spec#776
1 parent 1b730f8 commit 9f60cad

File tree

3 files changed

+42
-15
lines changed

3 files changed

+42
-15
lines changed

.changeset/fuzzy-bugs-sparkle.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
'@graphql-tools/wrap': patch
3+
---
4+
5+
fix(transforms): don't add \_\_typename to subscriptions
6+
7+
see:
8+
https://github.com/ardatan/graphql-tools/issues/2282
9+
https://github.com/graphql/graphql-js/pull/2861
10+
https://github.com/graphql/graphql-spec/pull/776

packages/wrap/src/transforms/MapFields.ts

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,31 @@ import { ObjectValueTransformerMap, ErrorsTransformer } from '../types';
99
import TransformCompositeFields from './TransformCompositeFields';
1010

1111
export default class MapFields implements Transform {
12-
private readonly transformer: TransformCompositeFields;
12+
private fieldNodeTransformerMap: FieldNodeMappers;
13+
private objectValueTransformerMap?: ObjectValueTransformerMap;
14+
private errorsTransformer?: ErrorsTransformer;
15+
private transformer: TransformCompositeFields;
1316

1417
constructor(
1518
fieldNodeTransformerMap: FieldNodeMappers,
1619
objectValueTransformerMap?: ObjectValueTransformerMap,
1720
errorsTransformer?: ErrorsTransformer
1821
) {
22+
this.fieldNodeTransformerMap = fieldNodeTransformerMap;
23+
this.objectValueTransformerMap = objectValueTransformerMap;
24+
this.errorsTransformer = errorsTransformer;
25+
}
26+
27+
public transformSchema(
28+
originalWrappingSchema: GraphQLSchema,
29+
subschemaConfig: SubschemaConfig,
30+
transformedSchema?: GraphQLSchema
31+
): GraphQLSchema {
32+
const subscriptionTypeName = originalWrappingSchema.getSubscriptionType()?.name;
1933
this.transformer = new TransformCompositeFields(
2034
() => undefined,
2135
(typeName, fieldName, fieldNode, fragments, transformationContext) => {
22-
const typeTransformers = fieldNodeTransformerMap[typeName];
36+
const typeTransformers = this.fieldNodeTransformerMap[typeName];
2337
if (typeTransformers == null) {
2438
return undefined;
2539
}
@@ -31,34 +45,31 @@ export default class MapFields implements Transform {
3145

3246
return fieldNodeTransformer(fieldNode, fragments, transformationContext);
3347
},
34-
objectValueTransformerMap != null
48+
this.objectValueTransformerMap != null
3549
? (data, transformationContext) => {
3650
if (data == null) {
3751
return data;
3852
}
3953

40-
const typeName = data.__typename;
54+
let typeName = data.__typename;
4155
if (typeName == null) {
42-
return data;
56+
// see https://github.com/ardatan/graphql-tools/issues/2282
57+
typeName = subscriptionTypeName;
58+
if (typeName == null) {
59+
return data;
60+
}
4361
}
4462

45-
const transformer = objectValueTransformerMap[typeName];
63+
const transformer = this.objectValueTransformerMap[typeName];
4664
if (transformer == null) {
4765
return data;
4866
}
4967

5068
return transformer(data, transformationContext);
5169
}
5270
: undefined,
53-
errorsTransformer != null ? errorsTransformer : undefined
71+
this.errorsTransformer != null ? this.errorsTransformer : undefined
5472
);
55-
}
56-
57-
public transformSchema(
58-
originalWrappingSchema: GraphQLSchema,
59-
subschemaConfig: SubschemaConfig,
60-
transformedSchema?: GraphQLSchema
61-
): GraphQLSchema {
6273
return this.transformer.transformSchema(originalWrappingSchema, subschemaConfig, transformedSchema);
6374
}
6475

packages/wrap/src/transforms/TransformCompositeFields.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export default class TransformCompositeFields implements Transform {
2525
private transformedSchema: GraphQLSchema;
2626
private typeInfo: TypeInfo;
2727
private mapping: Record<string, Record<string, string>>;
28+
private subscriptionTypeName: string;
2829

2930
constructor(
3031
fieldTransformer: FieldTransformer,
@@ -61,6 +62,7 @@ export default class TransformCompositeFields implements Transform {
6162
},
6263
});
6364
this.typeInfo = new TypeInfo(this.transformedSchema);
65+
this.subscriptionTypeName = originalWrappingSchema.getSubscriptionType()?.name;
6466

6567
return this.transformedSchema;
6668
}
@@ -135,7 +137,11 @@ export default class TransformCompositeFields implements Transform {
135137

136138
const newName = selection.name.value;
137139

138-
if (this.dataTransformer != null || this.errorsTransformer != null) {
140+
// See https://github.com/ardatan/graphql-tools/issues/2282
141+
if (
142+
(this.subscriptionTypeName && parentTypeName !== this.subscriptionTypeName && this.dataTransformer != null) ||
143+
this.errorsTransformer != null
144+
) {
139145
newSelections.push({
140146
kind: Kind.FIELD,
141147
name: {

0 commit comments

Comments
 (0)