Packages
ash_phoenix
2.3.16
2.3.24
2.3.23
2.3.22
2.3.21
2.3.20
2.3.19
2.3.18
2.3.17
2.3.16
2.3.15
2.3.14
2.3.13
2.3.12
2.3.11
2.3.10
2.3.9
2.3.8
2.3.7
2.3.6
2.3.5
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.0
2.1.26
2.1.25
2.1.24
2.1.23
2.1.22
2.1.21
2.1.20
2.1.19
2.1.18
2.1.17
2.1.16
2.1.15
2.1.14
2.1.13
2.1.12
2.1.11
2.1.10
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.8
2.0.0-rc.7
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
1.3.7
1.3.6
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.26
1.2.25
1.2.24
1.2.23
1.2.22
1.2.21
1.2.20
1.2.19
1.2.18
1.2.17
1.2.16
1.2.15
1.2.14
1.2.13
1.2.12
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.1.0-rc.3
1.1.0-rc.2
1.1.0-rc.1
1.1.0-rc.0
1.0.0-rc.1
1.0.0-rc.0
1.0.0-pre.2
1.0.0-pre.1
1.0.0-pre.0
0.7.7
0.7.6-rc.0
0.7.5
0.7.4
0.7.3
0.7.2-rc.2
0.7.2-rc.1
0.7.2-rc.0
0.7.1
0.7.0
0.6.0-rc.7
0.6.0-rc.6
0.6.0-rc.5
0.6.0-rc.4
0.6.0-rc.3
0.6.0-rc.2
0.6.0-rc.1
0.6.0-rc.0
0.5.19-rc.2
0.5.19-rc.1
0.5.19-rc.0
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.24
0.4.23
0.4.23-rc.1
0.4.23-rc.0
0.4.22-rc2
0.4.22-rc1
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Utilities for integrating Ash and Phoenix
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/ash_phoenix.install.ex
if Code.ensure_loaded?(Igniter) do
defmodule Mix.Tasks.AshPhoenix.Install do
@shortdoc "Installs AshPhoenix into a project. Should be called with `mix igniter.install ash_phoenix`"
@moduledoc """
#{@shortdoc}
"""
use Igniter.Mix.Task
@impl Igniter.Mix.Task
def info(_argv, _source) do
%Igniter.Mix.Task.Info{
group: :ash
}
end
@impl Igniter.Mix.Task
def igniter(igniter) do
igniter
|> Igniter.Project.Formatter.import_dep(:ash_phoenix)
|> configure_phoenix_endpoints()
|> patch_phoenix_agents_md()
end
defp patch_phoenix_agents_md(igniter) do
if Igniter.exists?(igniter, "AGENTS.md") do
Igniter.update_file(igniter, "AGENTS.md", fn source ->
content =
source.content
|> String.split("\n")
|> Enum.reduce({:cont, []}, fn
"<!-- phoenix:ecto-start -->", {:cont, acc} -> {:skip, acc}
"<!-- phoenix:ecto-end -->", {:skip, acc} -> {:cont, acc}
_line, {:skip, acc} -> {:skip, acc}
line, {:cont, acc} -> {:cont, [line | acc]}
end)
|> elem(1)
|> Enum.reverse()
|> Enum.reduce({:cont, []}, fn
"### Form handling", {:cont, acc} -> {:skip, acc}
"### " <> _ = line, {:skip, acc} -> {:cont, [line | acc]}
"## " <> _ = line, {:skip, acc} -> {:cont, [line | acc]}
"# " <> _ = line, {:skip, acc} -> {:cont, [line | acc]}
_line, {:skip, acc} -> {:skip, acc}
line, {:cont, acc} -> {:cont, [line | acc]}
end)
|> elem(1)
|> Enum.reverse()
|> Enum.join("\n")
Rewrite.Source.update(source, :content, content)
end)
else
igniter
end
end
defp configure_phoenix_endpoints(igniter) do
{igniter, routers} =
Igniter.Libs.Phoenix.list_routers(igniter)
{igniter, endpoints} =
Enum.reduce(routers, {igniter, []}, fn router, {igniter, endpoints} ->
{igniter, new_endpoints} = Igniter.Libs.Phoenix.endpoints_for_router(igniter, router)
{igniter, endpoints ++ new_endpoints}
end)
Enum.reduce(endpoints, igniter, fn endpoint, igniter ->
setup_endpoint(igniter, endpoint)
end)
end
defp setup_endpoint(igniter, endpoint) do
Igniter.Project.Module.find_and_update_module!(igniter, endpoint, fn zipper ->
zipper
|> add_codegen_status_plug()
|> then(&{:ok, &1})
end)
end
defp add_codegen_status_plug(zipper) do
# Look for existing AshPhoenix.Plug.CheckCodegenStatus plug first
case Igniter.Code.Common.move_to(
zipper,
fn zipper ->
Igniter.Code.Function.function_call?(zipper, :plug, [1, 2]) &&
Igniter.Code.Function.argument_equals?(
zipper,
0,
AshPhoenix.Plug.CheckCodegenStatus
)
end
) do
{:ok, _zipper} ->
# Plug already exists, don't add it again
zipper
:error ->
case Igniter.Code.Common.move_to(
zipper,
fn zipper ->
Igniter.Code.Function.function_call?(zipper, :plug, [1, 2]) &&
Igniter.Code.Function.argument_equals?(
zipper,
0,
Phoenix.CodeReloader
)
end
) do
{:ok, zipper} ->
# Add AshPhoenix.Plug.CheckCodegenStatus after Phoenix.CodeReloader
Igniter.Code.Common.add_code(zipper, "plug AshPhoenix.Plug.CheckCodegenStatus",
placement: :after
)
:error ->
# Phoenix.CodeReloader not found, don't add the plug
zipper
end
end
end
end
else
defmodule Mix.Tasks.AshPhoenix.Install do
@moduledoc "Installs AshPhoenix into a project. Should be called with `mix igniter.install ash_phoenix`"
@shortdoc @moduledoc
use Mix.Task
def run(_argv) do
Mix.shell().error("""
The task 'ash_phoenix.install' requires igniter to be run.
Please install igniter and try again.
For more information, see: https://hexdocs.pm/igniter
""")
exit({:shutdown, 1})
end
end
end