Packages
absinthe
1.4.0-beta.2
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.json.ex
defmodule Mix.Tasks.Absinthe.Schema.Json do
require Logger
use Mix.Task
import Mix.Generator
@shortdoc "Generate a schema.json file for an Absinthe schema"
@default_filename "./schema.json"
@default_codec_name "Poison"
@moduledoc """
Generate a schema.json file
## Usage
absinthe.schema.json [OPTIONS] [FILENAME]
## Options
--schema The schema. Default: As configured for `:absinthe` `:schema`
--json-codec Sets JSON Codec. Default: #{@default_codec_name}
--pretty Whether to pretty-print. Default: false
## Examples
Write to default path `#{@default_filename}` using the `:schema` configured for
the `:absinthe` application and the default `#{@default_codec_name}` JSON codec:
$ mix absinthe.schema.json
Write to default path `#{@default_filename}` using the `MySchema` schema and
the default `#{@default_codec_name}` JSON codec.
$ mix absinthe.schema.json --schema MySchema
Write to path `/path/to/schema.json` using the `MySchema` schema, using the
default `#{@default_codec_name}` JSON codec, and pretty-printing:
$ mix absinthe.schema.json --schema MySchema --pretty /path/to/schema.json
Write to default path `#{@default_filename}` using the `MySchema` schema and
a custom JSON codec, `MyCodec`:
$ mix absinthe.schema.json --schema MySchema --json-codec MyCodec
"""
@introspection_graphql Path.join([:code.priv_dir(:absinthe), "graphql", "introspection.graphql"])
def run(argv) do
Mix.Task.run("app.start", [])
{opts, args, _} = OptionParser.parse(argv)
schema = find_schema(opts)
json_codec = find_json(opts)
filename = args |> List.first || @default_filename
{:ok, query} = File.read(@introspection_graphql)
case Absinthe.run(query, schema) do
{:ok, result} ->
create_directory(Path.dirname(filename))
content = json_codec.module.encode!(result, json_codec.opts)
create_file(filename, content, force: true)
{:error, error} ->
raise error
end
end
defp find_json(opts) do
case Keyword.get(opts, :json_codec, Poison) do
module when is_atom(module) ->
%{module: module, opts: codec_opts(module, opts)}
other ->
other
end
end
defp codec_opts(Poison, opts) do
[pretty: Keyword.get(opts, :pretty, false)]
end
defp codec_opts(_, _) do
[]
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