Packages
absinthe
1.7.11
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/no_unused_variables.ex
defmodule Absinthe.Phase.Document.Validation.NoUnusedVariables do
@moduledoc false
# Validates document to ensure that the only variables that are used in a
# document are defined on the operation.
alias Absinthe.{Blueprint, Phase}
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.operations))
{:ok, result}
end
def handle_node(%Blueprint.Document.VariableDefinition{} = node, operations) do
errors =
for op <- operations do
for var <- op.variable_definitions, var.name == node.name do
if Enum.find(op.variable_uses, &(&1.name == var.name)) do
[]
else
[error(node, op)]
end
end
end
|> List.flatten()
case errors do
[] ->
node
errors ->
%{node | errors: errors ++ node.errors}
|> flag_invalid(:unused)
end
end
def handle_node(node, _) do
node
end
# Generate the error for the node
@spec error(Blueprint.Document.VariableDefinition.t(), Blueprint.Document.Operation.t()) ::
Phase.Error.t()
defp error(node, operation) do
%Phase.Error{
phase: __MODULE__,
message: error_message(node.name, operation.name),
locations: Enum.uniq([node.source_location, operation.source_location])
}
end
@doc """
Generate an error message for an unused variable.
"""
@spec error_message(String.t(), nil | String.t()) :: String.t()
def error_message(name, nil) do
~s(Variable "#{name}" is never used.)
end
def error_message(name, operation_name) do
~s(Variable "#{name}" is never used in operation "#{operation_name}".)
end
end