-
Notifications
You must be signed in to change notification settings - Fork 33
/
extract-resolvers-from-schema.ts
62 lines (54 loc) · 1.74 KB
/
extract-resolvers-from-schema.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
import {
GraphQLSchema,
GraphQLScalarType,
DocumentNode,
buildASTSchema,
isScalarType,
isInterfaceType,
isObjectType,
isEnumType,
isUnionType,
} from 'graphql';
import { extractFieldResolversFromObjectType } from './extract-field-resolvers-from-object-type';
import { IResolvers } from '@graphql-toolkit/types';
export interface ExtractResolversFromSchemaOptions {
selectedTypeDefs?: DocumentNode;
}
export function extractResolversFromSchema(
schema: GraphQLSchema,
options?: ExtractResolversFromSchemaOptions
): IResolvers {
let selectedTypeNames: string[];
const resolvers: IResolvers = {};
const typeMap = schema.getTypeMap();
if (options && options.selectedTypeDefs) {
const invalidSchema = buildASTSchema(options.selectedTypeDefs);
selectedTypeNames = Object.keys(invalidSchema.getTypeMap());
}
for (const typeName in typeMap) {
if (!typeName.startsWith('__')) {
const typeDef = typeMap[typeName];
if (selectedTypeNames && !selectedTypeNames.includes(typeName)) {
continue;
}
if (isScalarType(typeDef)) {
resolvers[typeName] = typeDef as GraphQLScalarType;
} else if (isObjectType(typeDef) || isInterfaceType(typeDef)) {
resolvers[typeName] = extractFieldResolversFromObjectType(typeDef, {
selectedTypeDefs: options && options.selectedTypeDefs,
});
} else if (isEnumType(typeDef)) {
const enumValues = typeDef.getValues();
resolvers[typeName] = {};
for (const { name, value } of enumValues) {
resolvers[typeName][name] = value;
}
} else if (isUnionType(typeDef)) {
resolvers[typeName] = {
__resolveType: typeDef.resolveType,
};
}
}
}
return resolvers;
}