Packages
absinthe
1.5.0-beta.0
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)
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
unquote_splicing(type_ast)
unquote_splicing(directive_ast)
def __absinthe_types__() 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 =
for %Schema.ObjectTypeDefinition{} = obj <- schema.type_definitions,
iface.identifier in obj.interfaces,
do: obj.identifier
{iface.identifier, Enum.sort(implementors)}
end)
end
end