-
-
Notifications
You must be signed in to change notification settings - Fork 796
/
addTypenameToAbstract.ts
56 lines (54 loc) · 1.36 KB
/
addTypenameToAbstract.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import {
GraphQLType,
DocumentNode,
TypeInfo,
visit,
visitWithTypeInfo,
SelectionSetNode,
Kind,
FieldNode,
GraphQLInterfaceType,
GraphQLUnionType,
} from 'graphql';
import { GraphQLSchemaWithTransforms } from '../Interfaces';
export function addTypenameToAbstract(
targetSchema: GraphQLSchemaWithTransforms,
document: DocumentNode,
): DocumentNode {
const typeInfo = new TypeInfo(targetSchema);
return visit(
document,
visitWithTypeInfo(typeInfo, {
[Kind.SELECTION_SET](
node: SelectionSetNode,
): SelectionSetNode | null | undefined {
const parentType: GraphQLType = typeInfo.getParentType();
let selections = node.selections;
if (
parentType &&
(parentType instanceof GraphQLInterfaceType ||
parentType instanceof GraphQLUnionType) &&
!selections.find(
_ =>
(_ as FieldNode).kind === Kind.FIELD &&
(_ as FieldNode).name.value === '__typename',
)
) {
selections = selections.concat({
kind: Kind.FIELD,
name: {
kind: Kind.NAME,
value: '__typename',
},
});
}
if (selections !== node.selections) {
return {
...node,
selections,
};
}
},
}),
);
}