diff --git a/lib/absinthe/phase/schema/compile.ex b/lib/absinthe/phase/schema/compile.ex index 7e36f6f073..a76a166e63 100644 --- a/lib/absinthe/phase/schema/compile.ex +++ b/lib/absinthe/phase/schema/compile.ex @@ -19,12 +19,30 @@ defmodule Absinthe.Phase.Schema.Compile do {type_def.identifier, type_def.name} end) + type_list = + case prototype_schema do + Absinthe.Schema.Prototype -> + type_list + + prototype_schema -> + Map.merge(type_list, prototype_schema.__absinthe_types__()) + end + referenced_types = for type_def <- schema.type_definitions, type_def.__private__[:__absinthe_referenced__], into: %{}, do: {type_def.identifier, type_def.name} + referenced_types = + case prototype_schema do + Absinthe.Schema.Prototype -> + referenced_types + + prototype_schema -> + Map.merge(referenced_types, prototype_schema.__absinthe_types__(:referenced)) + end + directive_list = Map.new(schema.directive_artifacts, fn type_def -> {type_def.identifier, type_def.name} diff --git a/lib/absinthe/schema/persistent_term.ex b/lib/absinthe/schema/persistent_term.ex index 7655c452b5..db230e30f1 100644 --- a/lib/absinthe/schema/persistent_term.ex +++ b/lib/absinthe/schema/persistent_term.ex @@ -81,6 +81,7 @@ if Code.ensure_loaded?(:persistent_term) do |> get() |> Map.fetch!(:__absinthe_types__) |> Map.fetch!(:referenced) + |> __maybe_merge_types_from_prototype(schema_mod, :referenced) end def __absinthe_types__(schema_mod, group) do @@ -88,6 +89,17 @@ if Code.ensure_loaded?(:persistent_term) do |> get() |> Map.fetch!(:__absinthe_types__) |> Map.fetch!(group) + |> __maybe_merge_types_from_prototype(schema_mod, group) + end + + defp __maybe_merge_types_from_prototype(types, schema_mod, group) do + prototype_schema_mod = schema_mod.__absinthe_prototype_schema__() + + if prototype_schema_mod == Absinthe.Schema.Prototype do + types + else + Map.merge(types, prototype_schema_mod.__absinthe_types__(group)) + end end def __absinthe_directives__(schema_mod) do diff --git a/test/absinthe/introspection_test.exs b/test/absinthe/introspection_test.exs index e8db1e1aef..c9c1606cd7 100644 --- a/test/absinthe/introspection_test.exs +++ b/test/absinthe/introspection_test.exs @@ -111,6 +111,11 @@ defmodule Absinthe.IntrospectionTest do serialize &Utils.serialize/1 end + scalar :_underscore_normal_string, name: "_UnderscoreNormalString" do + parse &Utils.parse/1 + serialize &Utils.serialize/1 + end + enum :color_channel do description "The selected color channel" value :red, as: :r, description: "Color Red" @@ -122,6 +127,7 @@ defmodule Absinthe.IntrospectionTest do arg :complex, :complex arg :normal_string, :normal_string arg :color_channel, :color_channel + arg :_underscore_normal_string, :_underscore_normal_string on [:field] end @@ -142,6 +148,9 @@ defmodule Absinthe.IntrospectionTest do """ query IntrospectionQuery { __schema { + types { + name + } directives { name args { @@ -166,7 +175,8 @@ defmodule Absinthe.IntrospectionTest do "directives" => [ %{"name" => "complexDirective", "args" => complex_directive_args} | _ - ] + ], + "types" => types } } }} = result @@ -184,6 +194,8 @@ defmodule Absinthe.IntrospectionTest do } ) + assert Enum.member?(types, %{"name" => "Complex"}) + assert Enum.member?( complex_directive_args, %{ @@ -197,6 +209,8 @@ defmodule Absinthe.IntrospectionTest do } ) + assert Enum.member?(types, %{"name" => "NormalString"}) + assert Enum.member?( complex_directive_args, %{ @@ -209,6 +223,23 @@ defmodule Absinthe.IntrospectionTest do "name" => "colorChannel" } ) + + assert Enum.member?(types, %{"name" => "ColorChannel"}) + + assert Enum.member?( + complex_directive_args, + %{ + "type" => %{ + "kind" => "SCALAR", + "name" => "_UnderscoreNormalString" + }, + "defaultValue" => nil, + "description" => nil, + "name" => "_underscoreNormalString" + } + ) + + assert Enum.member?(types, %{"name" => "_UnderscoreNormalString"}) end end