1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const graphql_1 = require("graphql");
|
5 | function createResolversMap(schema) {
|
6 | const typeMap = schema.getTypeMap();
|
7 | return Object.keys(typeMap)
|
8 | .filter(typeName => !typeName.includes("__"))
|
9 | .reduce((resolversMap, typeName) => {
|
10 | const type = typeMap[typeName];
|
11 | if (type instanceof graphql_1.GraphQLObjectType) {
|
12 | resolversMap[typeName] = Object.assign({}, (type.isTypeOf && {
|
13 | __isTypeOf: type.isTypeOf,
|
14 | }), generateFieldsResolvers(type.getFields()));
|
15 | }
|
16 | if (type instanceof graphql_1.GraphQLInterfaceType) {
|
17 | resolversMap[typeName] = Object.assign({ __resolveType: generateTypeResolver(type, schema) }, generateFieldsResolvers(type.getFields()));
|
18 | }
|
19 | if (type instanceof graphql_1.GraphQLScalarType) {
|
20 | resolversMap[typeName] = type;
|
21 | }
|
22 | if (type instanceof graphql_1.GraphQLEnumType) {
|
23 | const enumValues = type.getValues();
|
24 | resolversMap[typeName] = enumValues.reduce((enumMap, { name, value }) => {
|
25 | enumMap[name] = value;
|
26 | return enumMap;
|
27 | }, {});
|
28 | }
|
29 | if (type instanceof graphql_1.GraphQLUnionType) {
|
30 | resolversMap[typeName] = {
|
31 | __resolveType: generateTypeResolver(type, schema),
|
32 | };
|
33 | }
|
34 | return resolversMap;
|
35 | }, {});
|
36 | }
|
37 | exports.createResolversMap = createResolversMap;
|
38 | function generateTypeResolver(abstractType, schema) {
|
39 | if (abstractType.resolveType) {
|
40 | return (source, context, info) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
41 | const detectedType = yield abstractType.resolveType(source, context, info);
|
42 | if (detectedType instanceof graphql_1.GraphQLObjectType) {
|
43 | return detectedType.name;
|
44 | }
|
45 | return detectedType;
|
46 | });
|
47 | }
|
48 | const possibleObjectTypes = schema.getPossibleTypes(abstractType);
|
49 | return (source, context, info) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
50 | for (const objectType of possibleObjectTypes) {
|
51 | if (objectType.isTypeOf && (yield objectType.isTypeOf(source, context, info))) {
|
52 | return objectType.name;
|
53 | }
|
54 | }
|
55 | return null;
|
56 | });
|
57 | }
|
58 | function generateFieldsResolvers(fields) {
|
59 | return Object.keys(fields).reduce((fieldsMap, fieldName) => {
|
60 | const field = fields[fieldName];
|
61 | if (field.subscribe) {
|
62 | fieldsMap[fieldName] = {
|
63 | subscribe: field.subscribe,
|
64 | resolve: field.resolve,
|
65 | };
|
66 | }
|
67 | else if (field.resolve) {
|
68 | fieldsMap[fieldName] = field.resolve;
|
69 | }
|
70 | return fieldsMap;
|
71 | }, {});
|
72 | }
|