Packages
absinthe
1.6.5
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/validation/directives_must_be_valid.ex
defmodule Absinthe.Phase.Schema.Validation.DirectivesMustBeValid do
@moduledoc false
use Absinthe.Phase
alias Absinthe.Blueprint
@spec_link "https://spec.graphql.org/draft/#sec-Type-System.Directives"
@directive_locations Absinthe.Introspection.DirectiveLocation.values()
@doc """
Run the validation.
"""
def run(bp, _) do
bp = Blueprint.prewalk(bp, &handle_schemas/1)
{:ok, bp}
end
defp handle_schemas(%Blueprint.Schema.SchemaDefinition{} = schema) do
directive_definitions = Enum.map(schema.directive_definitions, &validate_directive(&1))
{:halt, %{schema | directive_definitions: directive_definitions}}
end
defp handle_schemas(obj) do
obj
end
defp validate_directive(%Blueprint.Schema.DirectiveDefinition{locations: []} = directive) do
directive |> put_error(error_locations_absent(directive))
end
defp validate_directive(%Blueprint.Schema.DirectiveDefinition{locations: locations} = directive) do
Enum.reduce(locations, directive, fn location, directive ->
validate_location(directive, location)
end)
end
defp validate_location(directive, location) when location in @directive_locations do
directive
end
defp validate_location(directive, location) do
directive |> put_error(error_unknown_directive_location(directive, location))
end
defp error_unknown_directive_location(directive, location) do
%Absinthe.Phase.Error{
message: explanation(directive, location),
locations: [directive.__reference__.location],
phase: __MODULE__,
extra: %{
location: location
}
}
end
defp error_locations_absent(directive) do
%Absinthe.Phase.Error{
message: explanation(directive),
locations: [directive.__reference__.location],
phase: __MODULE__
}
end
defp explanation(directive, location) do
"""
Directive "#{directive.name}" must use a valid DirectiveLocation
Found: #{inspect(location)}
Expected one/multiple of: #{inspect(@directive_locations)}
Reference: #{@spec_link}
"""
end
defp explanation(directive) do
"""
Directive "#{directive.name}" must set DirectiveLocations
Expected one/multiple of: #{inspect(@directive_locations)}
Reference: #{@spec_link}
"""
end
end