Packages
absinthe
1.7.4
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/phase/schema/populate_persistent_term.ex
if Code.ensure_loaded?(:persistent_term) do
defmodule Absinthe.Phase.Schema.PopulatePersistentTerm do
@moduledoc false
alias Absinthe.Blueprint.Schema
def run(blueprint, opts) do
%{schema_definitions: [schema]} = blueprint
type_list =
for %{identifier: identifier} = type <- schema.type_definitions,
into: %{},
do: {identifier, type.name}
types_map =
schema.type_artifacts
|> Enum.flat_map(fn type -> [{type.identifier, type}, {type.name, type}] end)
|> Map.new()
referenced_types =
for type_def <- schema.type_definitions,
type_def.__private__[:__absinthe_referenced__],
into: %{},
do: {type_def.identifier, type_def.name}
directive_list =
Map.new(schema.directive_artifacts, fn type_def ->
{type_def.identifier, type_def.name}
end)
directives_map =
schema.directive_artifacts
|> Enum.flat_map(fn type -> [{type.identifier, type}, {type.name, type}] end)
|> Map.new()
prototype_schema = Keyword.fetch!(opts, :prototype_schema)
metadata = build_metadata(schema)
implementors = build_implementors(schema)
schema_content = %{
__absinthe_types__: %{
referenced: referenced_types,
all: type_list
},
__absinthe_directives__: directive_list,
__absinthe_interface_implementors__: implementors,
__absinthe_prototype_schema__: prototype_schema,
__absinthe_type__: types_map,
__absinthe_directive__: directives_map,
__absinthe_reference__: metadata,
__absinthe_schema_declaration__: schema.schema_declaration
}
schema_name = opts[:schema] || raise "no schema name provided"
put_schema(schema_name, schema_content)
{:ok, blueprint}
end
@dialyzer {:nowarn_function, [put_schema: 2]}
defp put_schema(schema_name, content) do
:persistent_term.put(
{Absinthe.Schema.PersistentTerm, schema_name},
content
)
end
def build_metadata(schema) do
for %{identifier: identifier} = type <- schema.type_definitions do
{identifier, type.__reference__}
end
end
defp build_implementors(schema) do
schema.type_definitions
|> Enum.filter(&match?(%Schema.InterfaceTypeDefinition{}, &1))
|> Map.new(fn iface ->
implementors =
Schema.InterfaceTypeDefinition.find_implementors(iface, schema.type_definitions)
{iface.identifier, Enum.sort(implementors)}
end)
end
end
else
defmodule Absinthe.Phase.Schema.PopulatePersistentTerm do
def run(_, _) do
raise "This phase requires OTP >= 21.2"
end
end
end