Packages
absinthe
1.5.3
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/compile.ex
defmodule Absinthe.Phase.Schema.Compile do
@moduledoc false
alias Absinthe.Blueprint.Schema
def run(blueprint, opts) do
module_name = Module.concat(opts[:schema], Compiled)
%{schema_definitions: [schema]} = blueprint
type_ast = build_types(schema.type_artifacts)
directive_ast = build_directives(schema.directive_artifacts)
type_list =
Map.new(schema.type_definitions, fn type_def ->
{type_def.identifier, type_def.name}
end)
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_definitions, fn type_def ->
{type_def.identifier, type_def.name}
end)
prototype_schema = Keyword.fetch!(opts, :prototype_schema)
metadata = build_metadata(schema)
implementors = build_implementors(schema)
body =
quote do
@moduledoc false
unquote_splicing(type_ast)
unquote_splicing(directive_ast)
def __absinthe_types__() do
__absinthe_types__(:referenced)
end
def __absinthe_types__(:referenced) do
unquote(Macro.escape(referenced_types))
end
def __absinthe_types__(:all) do
unquote(Macro.escape(type_list))
end
def __absinthe_directives__() do
unquote(Macro.escape(directive_list))
end
def __absinthe_interface_implementors__() do
unquote(Macro.escape(implementors))
end
def __absinthe_prototype_schema__() do
unquote(Macro.escape(prototype_schema))
end
unquote_splicing(metadata)
end
Module.create(module_name, body, Macro.Env.location(__ENV__))
{:ok, blueprint}
end
def build_metadata(schema) do
for type <- schema.type_definitions do
quote do
def __absinthe_reference__(unquote(type.identifier)) do
unquote(Macro.escape(type.__reference__))
end
end
end
end
def build_types(types) do
for type <- types do
if !type.definition,
do:
raise("""
No definition set!
#{inspect(type)}
""")
ast = Macro.escape(type, unquote: true)
quote do
def __absinthe_type__(unquote(type.identifier)) do
unquote(ast)
end
def __absinthe_type__(unquote(type.name)) do
unquote(ast)
end
end
end
|> Enum.concat([
quote do
def __absinthe_type__(_type) do
nil
end
end
])
end
def build_directives(directives) do
for type <- directives do
ast = Macro.escape(type)
quote do
def __absinthe_directive__(unquote(type.identifier)) do
unquote(ast)
end
def __absinthe_directive__(unquote(type.name)) do
unquote(ast)
end
end
end
|> Enum.concat([
quote do
def __absinthe_directive__(_type) do
nil
end
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