Packages
igniter
0.8.1
0.8.2
0.8.1
0.8.0
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.30
0.6.29
0.6.28
0.6.27
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.52
0.5.51
0.5.50
0.5.49
0.5.48
0.5.47
0.5.46
0.5.45
0.5.44
0.5.43
0.5.42
0.5.41
0.5.40
0.5.39
0.5.38
0.5.37
0.5.36
0.5.35
0.5.34
0.5.33
0.5.32
0.5.31
0.5.30
0.5.29
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
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.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.78
0.3.77
0.3.76
0.3.75
0.3.74
0.3.73
0.3.72
0.3.71
0.3.70
0.3.69
0.3.68
0.3.67
0.3.66
0.3.65
0.3.64
0.3.63
0.3.62
0.3.61
0.3.60
0.3.59
0.3.58
0.3.57
0.3.56
0.3.55
0.3.54
0.3.53
0.3.52
0.3.51
0.3.50
0.3.49
0.3.48
0.3.47
0.3.46
0.3.45
0.3.44
0.3.43
0.3.42
0.3.41
0.3.40
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A code generation and project patching framework
Current section
Files
Jump to
Current section
Files
lib/igniter/extensions/phoenix.ex
# SPDX-FileCopyrightText: 2024 igniter contributors <https://github.com/ash-project/igniter/graphs/contributors>
#
# SPDX-License-Identifier: MIT
defmodule Igniter.Extensions.Phoenix do
@moduledoc """
A phoenix extension for Igniter.
Install with `mix igniter.add_extension phoenix`
"""
use Igniter.Extension
def proper_location(igniter, module, opts) do
case Keyword.get(opts, :location_convention, :phoenix_generators) do
:phoenix_generators ->
phoenix_generators_proper_location(igniter, module)
other ->
raise "Unknown phoenix location convention #{inspect(other)}"
end
end
defp phoenix_generators_proper_location(igniter, module) do
split = Module.split(module)
cond do
# Check if this is a LiveView/LiveComponent module but NOT if "Live" is just a namespace
# Exclude the case where element 1 is exactly "Live" (namespace usage)
String.ends_with?(Enum.at(split, 1) || "", "Live") &&
Enum.at(split, 1) != "Live" ->
[base | rest] = split
{:ok,
base
|> Macro.underscore()
|> Path.join("live")
|> then(fn path ->
rest
|> Enum.map(&Macro.underscore/1)
|> case do
[] -> [path]
nested -> [path | nested]
end
|> Path.join()
end)}
String.ends_with?(to_string(module), "Web.Layouts") && Enum.count(split) == 2 ->
[base | rest] = split
[type] = List.last(split) |> String.split("Controller", trim: true)
rest = :lists.droplast(rest)
{:ok,
base
|> Macro.underscore()
|> Path.join("components")
|> then(fn path ->
rest
|> Enum.map(&Macro.underscore/1)
|> case do
[] -> [path]
nested -> [path | nested]
end
|> Path.join()
end)
|> Path.join(Macro.underscore(type) <> ".ex")}
String.ends_with?(to_string(module), "Controller") && List.last(split) != "Controller" &&
String.ends_with?(List.first(split), "Web") ->
[base | rest] = split
[type] = List.last(split) |> String.split("Controller", trim: true)
rest = :lists.droplast(rest)
{:ok,
base
|> Macro.underscore()
|> Path.join("controllers")
|> then(fn path ->
rest
|> Enum.map(&Macro.underscore/1)
|> case do
[] -> [path]
nested -> [path | nested]
end
|> Path.join()
end)
|> Path.join(Macro.underscore(type) <> "_controller.ex")}
String.ends_with?(to_string(module), "HTML") && List.last(split) != "HTML" &&
String.ends_with?(List.first(split), "Web") ->
[base | rest] = split
[type] = List.last(split) |> String.split("HTML", trim: true)
rest = :lists.droplast(rest)
potential_controller_module =
Module.concat([base | rest] ++ [type <> "Controller"])
{exists?, _} = Igniter.Project.Module.module_exists(igniter, potential_controller_module)
if List.last(split) == "ErrorHTML" ||
(exists? && Igniter.Libs.Phoenix.controller?(igniter, potential_controller_module)) do
{:ok,
base
|> Macro.underscore()
|> Path.join("controllers")
|> then(fn path ->
rest
|> Enum.map(&Macro.underscore/1)
|> case do
[] -> [path]
nested -> [path | nested]
end
|> Path.join()
end)
|> Path.join(Macro.underscore(type) <> "_html.ex")}
else
:error
end
String.ends_with?(to_string(module), "CoreComponents") &&
String.contains?(to_string(module), "Web") ->
[base | rest] = split
[type] = List.last(split) |> String.split("HTML", trim: true)
rest = :lists.droplast(rest)
{:ok,
base
|> Macro.underscore()
|> Path.join("components")
|> then(fn path ->
rest
|> Enum.map(&Macro.underscore/1)
|> case do
[] -> [path]
nested -> [path | nested]
end
|> Path.join()
end)
|> Path.join(Macro.underscore(type) <> ".ex")}
String.ends_with?(to_string(module), "JSON") && List.last(Module.split(module)) != "JSON" &&
String.ends_with?(List.first(Module.split(module)), "Web") ->
[base | rest] = split
[type] = List.last(split) |> String.split("JSON", trim: true)
rest = :lists.droplast(rest)
potential_controller_module =
Module.concat([base | rest] ++ [type <> "Controller"])
{exists?, _} = Igniter.Project.Module.module_exists(igniter, potential_controller_module)
if List.last(split) == "ErrorJSON" ||
(exists? && Igniter.Libs.Phoenix.controller?(igniter, potential_controller_module)) do
{:ok,
base
|> Macro.underscore()
|> Path.join("controllers")
|> then(fn path ->
rest
|> Enum.map(&Macro.underscore/1)
|> case do
[] -> [path]
nested -> [path | nested]
end
|> Path.join()
end)
|> Path.join(Macro.underscore(type) <> "_json.ex")}
else
:error
end
true ->
:error
end
end
end