forked from ardatan/graphql-tools
/
assertResolveFunctionsPresent.ts
73 lines (65 loc) · 2.15 KB
/
assertResolveFunctionsPresent.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
import {
GraphQLSchema,
GraphQLField,
getNamedType,
GraphQLScalarType,
} from 'graphql';
import { IResolverValidationOptions } from '../Interfaces';
import SchemaError from './SchemaError';
import forEachField from './forEachField';
function assertResolveFunctionsPresent(
schema: GraphQLSchema,
resolverValidationOptions: IResolverValidationOptions = {},
) {
const {
requireResolversForArgs = false,
requireResolversForNonScalar = false,
requireResolversForAllFields = false,
} = resolverValidationOptions;
if (
requireResolversForAllFields &&
(requireResolversForArgs || requireResolversForNonScalar)
) {
throw new TypeError(
'requireResolversForAllFields takes precedence over the more specific assertions. ' +
'Please configure either requireResolversForAllFields or requireResolversForArgs / ' +
'requireResolversForNonScalar, but not a combination of them.',
);
}
forEachField(schema, (field, typeName, fieldName) => {
// requires a resolve function for *every* field.
if (requireResolversForAllFields) {
expectResolveFunction(field, typeName, fieldName);
}
// requires a resolve function on every field that has arguments
if (requireResolversForArgs && field.args.length > 0) {
expectResolveFunction(field, typeName, fieldName);
}
// requires a resolve function on every field that returns a non-scalar type
if (
requireResolversForNonScalar &&
!(getNamedType(field.type) instanceof GraphQLScalarType)
) {
expectResolveFunction(field, typeName, fieldName);
}
});
}
function expectResolveFunction(
field: GraphQLField<any, any>,
typeName: string,
fieldName: string,
) {
if (!field.resolve) {
console.warn(
// tslint:disable-next-line: max-line-length
`Resolve function missing for "${typeName}.${fieldName}". To disable this warning check https://github.com/apollostack/graphql-tools/issues/131`,
);
return;
}
if (typeof field.resolve !== 'function') {
throw new SchemaError(
`Resolver "${typeName}.${fieldName}" must be a function`,
);
}
}
export default assertResolveFunctionsPresent;