diff --git a/lib/graphql/schema/member/has_validators.rb b/lib/graphql/schema/member/has_validators.rb index 7e877f9325..8902c5cf77 100644 --- a/lib/graphql/schema/member/has_validators.rb +++ b/lib/graphql/schema/member/has_validators.rb @@ -10,6 +10,12 @@ module HasValidators # @param validation_config [Hash{Symbol => Hash}] # @return [void] def validates(validation_config) + validation_config.each do |validator_name, _options| + if validator_name.is_a?(Class) || !GraphQL::Schema::Validator.all_validators.key?(validator_name) + GraphQL::Schema::Validator::CustomValidatorWarning.warn_for(validator_name) + end + end + new_validators = GraphQL::Schema::Validator.from_config(self, validation_config) @own_validators ||= [] @own_validators.concat(new_validators) diff --git a/lib/graphql/schema/validator.rb b/lib/graphql/schema/validator.rb index fac5c34511..17723799bd 100644 --- a/lib/graphql/schema/validator.rb +++ b/lib/graphql/schema/validator.rb @@ -171,3 +171,4 @@ def self.validate!(validators, object, context, value, as: nil) GraphQL::Schema::Validator.install(:allow_blank, GraphQL::Schema::Validator::AllowBlankValidator) require "graphql/schema/validator/all_validator" GraphQL::Schema::Validator.install(:all, GraphQL::Schema::Validator::AllValidator) +require "graphql/schema/validator/custom_validator_warning" diff --git a/lib/graphql/schema/validator/custom_validator_warning.rb b/lib/graphql/schema/validator/custom_validator_warning.rb new file mode 100644 index 0000000000..2d3622a335 --- /dev/null +++ b/lib/graphql/schema/validator/custom_validator_warning.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +module GraphQL + class Schema + class Validator + module CustomValidatorWarning + def self.warn_for(validator_name) + border = "*" * 30 + timestamp = "[#{Time.now.strftime('%Y-%m-%dT%H:%M:%S.%6N')} ##{Process.pid}]" + warn <<~WARN + #{border} + WARNING: GraphQL Custom validator registered: #{validator_name} + Note that custom validators with I/O operations may fail unexpectedly due to GraphQL's default validate_timeout setting. Long-running I/O operations may not be killed halfway through, resulting in unpredictable behavior. See https://graphql-ruby.org/queries/timeout.html#validation-and-analysis for more information. + #{caller(3,1).first} + #{timestamp} + #{border} + WARN + end + end + end + end +end