@graphql-tools/schema
Version:
A set of utils for faster development of GraphQL tools
47 lines (46 loc) • 2.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.assertResolversPresent = assertResolversPresent;
const graphql_1 = require("graphql");
const utils_1 = require("@graphql-tools/utils");
function assertResolversPresent(schema, resolverValidationOptions = {}) {
const { requireResolversForArgs, requireResolversForNonScalar, requireResolversForAllFields } = 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.');
}
(0, utils_1.forEachField)(schema, (field, typeName, fieldName) => {
// requires a resolver for *every* field.
if (requireResolversForAllFields) {
expectResolver('requireResolversForAllFields', requireResolversForAllFields, field, typeName, fieldName);
}
// requires a resolver on every field that has arguments
if (requireResolversForArgs && field.args.length > 0) {
expectResolver('requireResolversForArgs', requireResolversForArgs, field, typeName, fieldName);
}
// requires a resolver on every field that returns a non-scalar type
if (requireResolversForNonScalar !== 'ignore' && !(0, graphql_1.isScalarType)((0, graphql_1.getNamedType)(field.type))) {
expectResolver('requireResolversForNonScalar', requireResolversForNonScalar, field, typeName, fieldName);
}
});
}
function expectResolver(validator, behavior, field, typeName, fieldName) {
if (!field.resolve) {
const message = `Resolver missing for "${typeName}.${fieldName}".
To disable this validator, use:
resolverValidationOptions: {
${validator}: 'ignore'
}`;
if (behavior === 'error') {
throw new Error(message);
}
if (behavior === 'warn') {
console.warn(message);
}
return;
}
if (typeof field.resolve !== 'function') {
throw new Error(`Resolver "${typeName}.${fieldName}" must be a function`);
}
}
;