Create custom scalars by defining transformation methods:
app/graphql/scalars/email_scalar.rb
module GraphQL class EmailScalar < GraphQL::Scalar desc 'A valid email address' class << self # Validate input values def valid_input?(value) value.is_a?(String) && value.match?(URI::MailTo::EMAIL_REGEXP) end # Validate output values def valid_output?(value) value.is_a?(String) end # Transform to JSON string def to_json(value) value.to_json end # Transform to hash representation def as_json(value) value.to_s end # Parse user input to Ruby object def deserialize(value) value.to_s.downcase end end endend
# Check if a value is valid inputdef self.valid_input?(value) # Return true/falseend# Check if a value is valid outputdef self.valid_output?(value) # Return true/falseend
module GraphQL class UrlScalar < GraphQL::Scalar desc 'A valid URL' class << self def valid_input?(value) value.is_a?(String) && value.match?(URI::DEFAULT_PARSER.make_regexp) end def valid_output?(value) value.is_a?(String) || value.is_a?(URI) end def to_json(value) value.to_s.to_json end def as_json(value) value.to_s end def deserialize(value) URI.parse(value.to_s) end end endend
module GraphQL class ColorScalar < GraphQL::Scalar desc 'A hex color code' class << self def valid_input?(value) value.is_a?(String) && value.match?(/^#[0-9A-Fa-f]{6}$/) end def valid_output?(value) value.is_a?(String) end def to_json(value) value.to_json end def as_json(value) value.upcase end def deserialize(value) value.upcase end end endend
module GraphQL class PhoneScalar < GraphQL::Scalar desc 'A phone number in E.164 format' class << self def valid_input?(value) value.is_a?(String) && value.match?(/^\+[1-9]\d{1,14}$/) end def valid_output?(value) value.is_a?(String) end def to_json(value) value.to_json end def as_json(value) value.to_s end def deserialize(value) # Normalize phone number value.to_s.gsub(/[^+0-9]/, '') end end endend