Packages
moon
2.88.0
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/moon.convert.component.ex
defmodule Mix.Tasks.Moon.Convert.Component do
@shortdoc "Converts surface component to phoenix_live_view"
@moduledoc """
Converts component from surface to live_view format
$ mix moon.convert.component Form.MyModule
"""
use Mix.Task
import Mix.Generator
import Moon.Convert
import Moon.Convert.{Ast}
import String, only: [replace: 3, downcase: 1, split: 2]
import List, only: [last: 1]
require Logger
defstruct name: nil
@doc false
def run([name]) do
name
|> to_module()
|> context()
|> copy_templates()
|> print_shell_instructions()
end
defp to_module(name, pathes \\ ~w(Design Moon)) do
Module.safe_concat([name | pathes] |> Enum.reverse())
rescue
ArgumentError ->
to_module(name, tl(pathes))
end
defp context(module) do
%{
module: module,
short: module |> to_string() |> split(".") |> last(),
component_type: module.component_type(),
level: 0,
config: %{
use_translates: fn
[:Moon, :StatelessComponent] -> [:Moon, :Light, :Component]
[:Moon, :StatefulComponent] -> [:Moon, :Light, :LiveComponent]
other -> other
end,
defmodule_translates: fn
[:Moon, :Design | others] -> [:Moon, :Light | others]
[:Moon, :Lego | others] -> [:Moon, :Light, :Lego | others]
[:MoonWeb, :Examples, :Design | others] -> [:MoonWeb, :Examples, :Light | others]
end,
module_translates: fn mod ->
[
:"Elixir"
| mod
|> to_string()
|> String.replace("Elixir.", "")
|> String.split(".")
|> Enum.map(&String.to_atom/1)
|> (fn
[:Moon, :Design | others] ->
[:Moon, :Light | others]
[:Moon, :Lego | others] ->
[:Moon, :Light, :Lego | others]
[:MoonWeb, :Examples, :Design | others] ->
[:MoonWeb, :Examples, :Light | others]
other ->
other
end).()
]
|> Enum.join(".")
|> String.to_atom()
end
}
}
end
defp copy_templates(context = %{component_type: Surface.LiveComponent}) do
context.module
|> context.config.module_translates.()
|> module_to_path()
|> create_file(
surface_to_liveview(context)
|> Macro.to_string()
|> String.replace(" :skip\n", "")
)
context
end
defp copy_templates(context = %{component_type: Surface.Component}) do
target_module = context.module |> parent_module() |> context.config.module_translates.()
target_module
|> module_to_path()
|> create_file(
case target_module |> Code.ensure_compiled() do
{:module, _} ->
target_module |> module_ast()
{:error, :nofile} ->
"priv/templates/moon.convert.component/empty_module.ex"
|> EEx.eval_file(name: target_module)
|> Code.string_to_quoted!()
end
|> merge_ast(surface_to_liveview(context))
|> Macro.to_string()
|> String.replace(" :skip\n", "")
)
context
end
defp module_to_path(module) do
(module
|> to_string()
|> replace(~r/([a-z])([A-Z])/, "\\1_\\2")
|> downcase()
|> replace(".", "/")
|> replace("elixir/", "lib/")) <> ".exs"
end
def print_shell_instructions(_) do
Mix.shell().info("""
""")
end
end