Packages
absinthe
1.7.4
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/mix/tasks/absinthe.schema.sdl.ex
defmodule Mix.Tasks.Absinthe.Schema.Sdl do
use Mix.Task
import Mix.Generator
@shortdoc "Generate a schema.graphql file for an Absinthe schema"
@default_filename "./schema.graphql"
@moduledoc """
Generate a `schema.graphql` file.
## Usage
mix absinthe.schema.sdl [OPTIONS] [FILENAME]
## Options
* `--schema` - The name of the `Absinthe.Schema` module defining the schema to be generated.
Default: As [configured](https://hexdocs.pm/mix/Mix.Config.html) for `:absinthe` `:schema`
## Examples
Write to default path `#{@default_filename}` using the `:schema` configured for the `:absinthe` application:
mix absinthe.schema.sdl
Write to path `/path/to/schema.graphql` using the `MySchema` schema
mix absinthe.schema.sdl --schema MySchema /path/to/schema.graphql
"""
defmodule Options do
@moduledoc false
defstruct filename: nil, schema: nil
@type t() :: %__MODULE__{
filename: String.t(),
schema: module()
}
end
@impl Mix.Task
def run(argv) do
Application.ensure_all_started(:absinthe)
Mix.Task.run("loadpaths", argv)
Mix.Task.run("compile", argv)
opts = parse_options(argv)
# Start Absinthe.Schema if using persistent term provider
if opts.schema.__absinthe_schema_provider__() == Absinthe.Schema.PersistentTerm do
Supervisor.start_link([{Absinthe.Schema, opts.schema}], strategy: :one_for_one)
end
case generate_schema(opts) do
{:ok, content} -> write_schema(content, opts.filename)
{:error, error} -> raise error
end
end
def generate_schema(%Options{schema: schema}) do
pipeline =
schema
|> Absinthe.Pipeline.for_schema(prototype_schema: schema.__absinthe_prototype_schema__())
|> Absinthe.Pipeline.upto({Absinthe.Phase.Schema.Validation.Result, pass: :final})
|> Absinthe.Schema.apply_modifiers(schema)
with {:ok, blueprint, _phases} <-
Absinthe.Pipeline.run(
schema.__absinthe_blueprint__(),
pipeline
) do
{:ok, inspect(blueprint, pretty: true)}
else
_ -> {:error, "Failed to render schema"}
end
end
defp write_schema(content, filename) do
create_directory(Path.dirname(filename))
create_file(filename, content, force: true)
end
def parse_options(argv) do
{opts, args, _} = OptionParser.parse(argv, strict: [schema: :string])
%Options{
filename: args |> List.first() || @default_filename,
schema: find_schema(opts)
}
end
defp find_schema(opts) do
case Keyword.get(opts, :schema, Application.get_env(:absinthe, :schema)) do
nil ->
raise "No --schema given or :schema configured for the :absinthe application"
value ->
[value] |> Module.safe_concat()
end
end
end