-
Notifications
You must be signed in to change notification settings - Fork 257
/
Copy pathintrospection.ts
103 lines (90 loc) · 4.89 KB
/
introspection.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { DirectiveLocation } from "graphql";
import { EnumType, FieldDefinition, ListType, NonNullType, ObjectType, Schema } from "./definitions";
export const introspectionFieldNames = [ '__schema', '__type' ];
export const introspectionTypeNames = [
'__Schema',
'__Directive',
'__DirectiveLocation',
'__Type',
'__Field',
'__InputValue',
'__EnumValue',
'__TypeKind',
]
export function isIntrospectionName(name: string): boolean {
return name.startsWith('__');
}
export function addIntrospectionFields(schema: Schema) {
if (schema.type('__Schema')) {
return;
}
const typeKindEnum = schema.addType(new EnumType('__TypeKind', true));
typeKindEnum.addValue('SCALAR');
typeKindEnum.addValue('OBJECT');
typeKindEnum.addValue('INTERFACE');
typeKindEnum.addValue('UNION');
typeKindEnum.addValue('ENUM');
typeKindEnum.addValue('INPUT_OBJECT');
typeKindEnum.addValue('LIST');
typeKindEnum.addValue('NON_NULL');
const inputValueType = schema.addType(new ObjectType('__InputValue', true));
const fieldType = schema.addType(new ObjectType('__Field', true));
const typeType = schema.addType(new ObjectType('__Type', true));
const enumValueType = schema.addType(new ObjectType('__EnumValue', true));
typeType.addField('kind', new NonNullType(typeKindEnum));
typeType.addField('name', schema.stringType());
typeType.addField('description', schema.stringType());
typeType.addField('fields', new ListType(new NonNullType(fieldType)))
.addArgument('includeDeprecated', schema.booleanType(), false);
typeType.addField('interfaces', new ListType(new NonNullType(typeType)));
typeType.addField('possibleTypes', new ListType(new NonNullType(typeType)));
typeType.addField('enumValues', new ListType(new NonNullType(enumValueType)))
.addArgument('includeDeprecated', schema.booleanType(), false);
typeType.addField('inputFields', new ListType(new NonNullType(inputValueType)))
.addArgument('includeDeprecated', schema.booleanType(), false);
typeType.addField('ofType', typeType);
typeType.addField('specifiedByURL', schema.stringType());
fieldType.addField('name', new NonNullType(schema.stringType()));
fieldType.addField('description', schema.stringType());
fieldType.addField('args', new NonNullType(new ListType(new NonNullType(inputValueType))))
.addArgument('includeDeprecated', schema.booleanType(), false);
fieldType.addField('type', new NonNullType(typeType));
fieldType.addField('isDeprecated', new NonNullType(schema.booleanType()));
fieldType.addField('deprecationReason', schema.stringType());
inputValueType.addField('name', new NonNullType(schema.stringType()));
inputValueType.addField('description', schema.stringType());
inputValueType.addField('type', new NonNullType(typeType));
inputValueType.addField('defaultValue', schema.stringType());
inputValueType.addField('isDeprecated', new NonNullType(schema.booleanType()));
inputValueType.addField('deprecationReason', schema.stringType());
enumValueType.addField('name', new NonNullType(schema.stringType()));
enumValueType.addField('description', schema.stringType());
enumValueType.addField('isDeprecated', new NonNullType(schema.booleanType()));
enumValueType.addField('deprecationReason', schema.stringType());
const directiveLocationEnum = schema.addType(new EnumType('__DirectiveLocation', true));
for (const location of Object.values(DirectiveLocation)) {
directiveLocationEnum.addValue(location);
}
const directiveType = schema.addType(new ObjectType('__Directive', true));
directiveType.addField('name', new NonNullType(schema.stringType()));
directiveType.addField('description', schema.stringType());
directiveType.addField('locations', new NonNullType(new ListType(new NonNullType(directiveLocationEnum))));
directiveType.addField('args', new NonNullType(new ListType(new NonNullType(inputValueType))))
.addArgument('includeDeprecated', schema.booleanType(), false);
directiveType.addField('isRepeatable', new NonNullType(schema.booleanType()));
const schemaType = schema.addType(new ObjectType('__Schema', true));
schemaType.addField('description', schema.stringType());
schemaType.addField('types', new NonNullType(new ListType(new NonNullType(typeType))));
schemaType.addField('queryType', new NonNullType(typeType));
schemaType.addField('mutationType', new NonNullType(typeType));
schemaType.addField('subscriptionType', new NonNullType(typeType));
schemaType.addField('directives', new NonNullType(new ListType(new NonNullType(directiveType))));
let queryRoot = schema.schemaDefinition.rootType('query');
if (!queryRoot) {
queryRoot = schema.addType(new ObjectType('Query'));
schema.schemaDefinition.setRoot('query', queryRoot);
}
queryRoot.addField(new FieldDefinition('__schema', true), new NonNullType(schemaType));
queryRoot.addField(new FieldDefinition('__type', true), typeType)
.addArgument('name', new NonNullType(schema.stringType()));
}