Packages
absinthe
1.7.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/inline_functions.ex
defmodule Absinthe.Phase.Schema.InlineFunctions do
@moduledoc false
use Absinthe.Phase
alias Absinthe.Blueprint
alias Absinthe.Blueprint.Schema
alias Absinthe.Type
def run(blueprint, opts) do
blueprint = Blueprint.prewalk(blueprint, &inline_functions(&1, blueprint.schema, opts))
{:ok, blueprint}
end
def inline_functions(%Schema.SchemaDefinition{} = schema_def, schema, opts) do
schema_def = %{
schema_def
| type_artifacts: Enum.map(schema_def.type_artifacts, &inline_functions(&1, schema, opts)),
directive_artifacts:
Enum.map(schema_def.directive_artifacts, &inline_functions(&1, schema, opts))
}
{:halt, schema_def}
end
def inline_functions(%type{identifier: _} = node, schema, opts) do
type
|> Schema.functions()
# middleware gets handled specially
|> Enum.reject(&(&1 in [:middleware]))
|> Enum.reduce(node, &inline_function(&1, &2, opts))
|> inline_middleware(schema, opts)
end
def inline_functions(node, _, _) do
node
end
defp inline_function(attr, node, opts) do
function = Type.function(node, attr)
if Absinthe.Utils.escapable?(function) || opts[:inline_always] do
%{node | attr => function}
else
node
end
end
def inline_middleware(%type_name{} = type, schema, opts)
when type_name in [Type.Object, Type.Union, Type.Interface] do
Map.update!(type, :fields, fn fields ->
fields =
Enum.map(fields, fn {field_ident, field} ->
{field_ident, inline_functions(field, schema, opts)}
end)
Map.new(fields, fn
{field_ident, %{middleware: middleware} = field} ->
expanded_middleware = Absinthe.Middleware.expand(schema, middleware, field, type)
if Absinthe.Utils.escapable?(expanded_middleware) || opts[:inline_always] do
{field_ident, %{field | middleware: expanded_middleware}}
else
middleware_shim = {
{Absinthe.Middleware, :shim},
{type.identifier, field.identifier, middleware}
}
{field_ident, %{field | middleware: [middleware_shim]}}
end
{field_ident, field} ->
middleware = Absinthe.Middleware.expand(schema, field.middleware, field, type)
{field_ident, %{field | middleware: middleware}}
end)
end)
end
def inline_middleware(type, _, _) do
type
end
end