1

I tried my best to write a custom directive in Apollo Server Express to validate two input type fields. But the code even works but the recording of the mutation already occurs. I appreciate if anyone can help me fix any error in the code below. This is just sample code, I need to test the value in two fields at the same time.

const { SchemaDirectiveVisitor } = require('apollo-server');
const { GraphQLScalarType, GraphQLNonNull, defaultFieldResolver } = require('graphql');

class RegexDirective extends SchemaDirectiveVisitor {
  visitInputFieldDefinition(field) {
    this.wrapType(field);
  }

  visitFieldDefinition(field) {
    this.wrapType(field);
  }

  wrapType(field) {
    const { resolve = defaultFieldResolver } = field;
    field.resolve = async function (source, args, context, info) {
      if (info.operation.operation === 'mutation') {
        if (source[field.name] === 'error') {
          throw new Error(`Find error: ${field.name}`);
        }
      }
      return await resolve.call(this, source, args, context, info);
    };

    if (
      field.type instanceof GraphQLNonNull
      && field.type.ofType instanceof GraphQLScalarType
    ) {
      field.type = new GraphQLNonNull(
        new RegexType(field.type.ofType),
      );
    } else if (field.type instanceof GraphQLScalarType) {
      field.type = new RegexType(field.type);
    } else {
    //  throw new Error(`Not a scalar type: ${field.type}`);
    }
  }
}
class RegexType extends GraphQLScalarType {
  constructor(type) {
    super({
      name: 'RegexScalar',

      serialize(value) {
        return type.serialize(value);
      },

      parseValue(value) {
        return type.parseValue(value);
      },

      parseLiteral(ast) {
        const result = type.parseLiteral(ast);
        return result;
      },
    });
  }
}

module.exports = RegexDirective;
  • I need to run test and em in parseLiteral. In wrapType it's too late the recording has already been done. But in parseLiteral I can't variable SOURCE. – Álax Morais Filho Jul 06 '21 at 19:09

0 Answers0