Module: GraphQL::Client::DocumentTypes

Defined in:
lib/graphql/client/document_types.rb

Overview

Internal: Use schema to detect definition and field types.

Class Method Summary collapse

Class Method Details

.analyze_types(schema, document) ⇒ Object

Internal: Detect all types used in a given document

schema - A GraphQL::Schema document - A GraphQL::Language::Nodes::Document to scan

Returns a Hash to GraphQL::Type objects.


14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/graphql/client/document_types.rb', line 14

def self.analyze_types(schema, document)
  unless schema.is_a?(GraphQL::Schema)
    raise TypeError, "expected schema to be a GraphQL::Schema, but was #{schema.class}"
  end

  unless document.is_a?(GraphQL::Language::Nodes::Document)
    raise TypeError, "expected schema to be a GraphQL::Language::Nodes::Document, but was #{document.class}"
  end

  visitor = GraphQL::Language::Visitor.new(document)
  type_stack = GraphQL::StaticValidation::TypeStack.new(schema, visitor)

  fields = {}

  visitor[GraphQL::Language::Nodes::OperationDefinition] << ->(node, _parent) do
    fields[node] = type_stack.object_types.last
  end
  visitor[GraphQL::Language::Nodes::FragmentDefinition] << ->(node, _parent) do
    fields[node] = type_stack.object_types.last
  end
  visitor[GraphQL::Language::Nodes::InlineFragment] << ->(node, _parent) do
    fields[node] = type_stack.object_types.last
  end
  visitor[GraphQL::Language::Nodes::Field] << ->(node, _parent) do
    fields[node] = type_stack.field_definitions.last.type
  end
  visitor.visit

  fields
rescue StandardError
  # FIXME: TypeStack my crash on invalid documents
  fields
end