Packages
absinthe
1.4.15
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/document/validation/known_argument_names.ex
defmodule Absinthe.Phase.Document.Validation.KnownArgumentNames do
@moduledoc false
# Validates document to ensure that all arguments are in the schema.
#
# Note: while graphql-js doesn't add errors to unknown arguments that
# are provided to unknown fields, Absinthe does -- but when the errors
# are harvested from the Blueprint tree, only the first layer of unknown
# errors (eg, the field) should be presented to the user.
alias Absinthe.{Blueprint, Phase, Schema, Type}
use Absinthe.Phase
@doc """
Run the validation.
"""
@spec run(Blueprint.t(), Keyword.t()) :: Phase.result_t()
def run(input, _options \\ []) do
result = Blueprint.prewalk(input, &handle_node(&1, input.schema))
{:ok, result}
end
@spec handle_node(Blueprint.node_t(), Schema.t()) :: Blueprint.node_t()
defp handle_node(%{schema_node: nil} = node, _schema) do
node
end
defp handle_node(%{selections: _, schema_node: schema_node} = node, schema) do
selections =
Enum.map(node.selections, fn
%{arguments: arguments} = field ->
arguments =
Enum.map(arguments, fn
%{schema_node: nil} = arg ->
arg
|> flag_invalid(:no_schema_node)
|> put_error(field_error(arg, field, type_name(schema_node, schema)))
other ->
other
end)
%{field | arguments: arguments}
other ->
other
end)
%{node | selections: selections}
end
defp handle_node(%Blueprint.Directive{} = node, _) do
arguments =
Enum.map(node.arguments, fn
%{schema_node: nil} = arg ->
arg
|> flag_invalid(:no_schema_node)
|> put_error(directive_error(arg, node))
other ->
other
end)
%{node | arguments: arguments}
end
defp handle_node(node, _) do
node
end
@spec type_name(Type.t(), Schema.t()) :: String.t()
defp type_name(%Type.Field{} = node, schema) do
node.type
|> Type.unwrap()
|> schema.__absinthe_lookup__()
|> Map.fetch!(:name)
end
defp type_name(node, _) do
node.name
end
# Generate the error for a directive argument
@spec directive_error(Blueprint.node_t(), Blueprint.node_t()) :: Phase.Error.t()
defp directive_error(argument_node, directive_node) do
%Phase.Error{
phase: __MODULE__,
message: directive_error_message(argument_node.name, directive_node.name),
locations: [argument_node.source_location]
}
end
# Generate the error for a field argument
@spec field_error(Blueprint.node_t(), Blueprint.node_t(), String.t()) :: Phase.Error.t()
defp field_error(argument_node, field_node, type_name) do
%Phase.Error{
phase: __MODULE__,
message: field_error_message(argument_node.name, field_node.name, type_name),
locations: [argument_node.source_location]
}
end
@doc """
Generate an error for a directive argument
"""
@spec directive_error_message(String.t(), String.t()) :: String.t()
def directive_error_message(argument_name, directive_name) do
~s(Unknown argument "#{argument_name}" on directive "@#{directive_name}".)
end
@doc """
Generate an error for a field argument
"""
@spec field_error_message(String.t(), String.t(), String.t()) :: String.t()
def field_error_message(argument_name, field_name, type_name) do
~s(Unknown argument "#{argument_name}" on field "#{field_name}" of type "#{type_name}".)
end
end