assertResolversPresent.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.assertResolversPresent = void 0;
  4. const graphql_1 = require("graphql");
  5. const utils_1 = require("@graphql-tools/utils");
  6. function assertResolversPresent(schema, resolverValidationOptions = {}) {
  7. const { requireResolversForArgs, requireResolversForNonScalar, requireResolversForAllFields } = resolverValidationOptions;
  8. if (requireResolversForAllFields && (requireResolversForArgs || requireResolversForNonScalar)) {
  9. throw new TypeError('requireResolversForAllFields takes precedence over the more specific assertions. ' +
  10. 'Please configure either requireResolversForAllFields or requireResolversForArgs / ' +
  11. 'requireResolversForNonScalar, but not a combination of them.');
  12. }
  13. (0, utils_1.forEachField)(schema, (field, typeName, fieldName) => {
  14. // requires a resolver for *every* field.
  15. if (requireResolversForAllFields) {
  16. expectResolver('requireResolversForAllFields', requireResolversForAllFields, field, typeName, fieldName);
  17. }
  18. // requires a resolver on every field that has arguments
  19. if (requireResolversForArgs && field.args.length > 0) {
  20. expectResolver('requireResolversForArgs', requireResolversForArgs, field, typeName, fieldName);
  21. }
  22. // requires a resolver on every field that returns a non-scalar type
  23. if (requireResolversForNonScalar !== 'ignore' && !(0, graphql_1.isScalarType)((0, graphql_1.getNamedType)(field.type))) {
  24. expectResolver('requireResolversForNonScalar', requireResolversForNonScalar, field, typeName, fieldName);
  25. }
  26. });
  27. }
  28. exports.assertResolversPresent = assertResolversPresent;
  29. function expectResolver(validator, behavior, field, typeName, fieldName) {
  30. if (!field.resolve) {
  31. const message = `Resolver missing for "${typeName}.${fieldName}".
  32. To disable this validator, use:
  33. resolverValidationOptions: {
  34. ${validator}: 'ignore'
  35. }`;
  36. if (behavior === 'error') {
  37. throw new Error(message);
  38. }
  39. if (behavior === 'warn') {
  40. console.warn(message);
  41. }
  42. return;
  43. }
  44. if (typeof field.resolve !== 'function') {
  45. throw new Error(`Resolver "${typeName}.${fieldName}" must be a function`);
  46. }
  47. }