/
remove-empty-nodes.ts
75 lines (66 loc) · 2.11 KB
/
remove-empty-nodes.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import { visit } from 'graphql';
import { DocumentOptimizer } from '../types.js';
/**
* This optimizer removes empty nodes/arrays (directives/argument/variableDefinitions) from a given DocumentNode of operation/fragment.
* @param input
*/
export const removeEmptyNodes: DocumentOptimizer = input => {
function transformNode(node: any) {
let resultNode = node;
if (
resultNode.directives &&
Array.isArray(resultNode.directives) &&
resultNode.directives.length === 0
) {
const { directives, ...rest } = resultNode;
resultNode = rest;
}
if (
resultNode.arguments &&
Array.isArray(resultNode.arguments) &&
resultNode.arguments.length === 0
) {
const { arguments: args, ...rest } = resultNode;
resultNode = rest;
}
if (
resultNode.variableDefinitions &&
Array.isArray(resultNode.variableDefinitions) &&
resultNode.variableDefinitions.length === 0
) {
const { variableDefinitions, ...rest } = resultNode;
resultNode = rest;
}
return resultNode;
}
return visit(input, {
// Request/Operation:
FragmentDefinition: transformNode,
OperationDefinition: transformNode,
VariableDefinition: transformNode,
Field: transformNode,
FragmentSpread: transformNode,
InlineFragment: transformNode,
Name: transformNode,
Directive: transformNode,
// Schema Definition:
SchemaDefinition: transformNode,
ScalarTypeDefinition: transformNode,
ObjectTypeDefinition: transformNode,
InterfaceTypeDefinition: transformNode,
UnionTypeDefinition: transformNode,
EnumTypeDefinition: transformNode,
EnumValueDefinition: transformNode,
InputObjectTypeDefinition: transformNode,
FieldDefinition: transformNode,
InputValueDefinition: transformNode,
// Schema Extension:
SchemaExtension: transformNode,
ScalarTypeExtension: transformNode,
ObjectTypeExtension: transformNode,
InterfaceTypeExtension: transformNode,
UnionTypeExtension: transformNode,
EnumTypeExtension: transformNode,
InputObjectTypeExtension: transformNode,
});
};