Packages
moon
2.79.4
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.gen.component.ex
defmodule Mix.Tasks.Moon.Gen.Component do
@shortdoc "Generates component and page"
@moduledoc """
Generates a component and a component page by component module name given
$ mix moon.gen.component Form.MyModule
"""
use Mix.Task
import Mix.Generator
import String, only: [replace: 3, downcase: 1, split: 2]
import Enum, only: [reverse: 1, join: 2]
import List, only: [last: 1]
defstruct name: nil,
path: nil
@doc false
def run([name]) do
name |> context() |> copy_templates() |> print_shell_instructions()
end
defp context(name) do
%{
name: name,
path: name |> replace(~r/([a-z])([A-Z])/, "\\1_\\2") |> downcase() |> replace(".", "/"),
short: name |> split(".") |> last()
}
end
defp pathes(%{path: path}) do
[
component: "lib/moon/design/#{path}.ex",
page: "lib/moon_web/pages/design/#{path}_page.ex",
example: "lib/moon_web/examples/design/#{path}_example/default.ex"
]
end
defp copy_templates(context) do
Enum.each(pathes(context), fn {template, file_path} ->
file_path |> split("/") |> reverse() |> tl() |> reverse() |> join("/") |> create_directory()
data =
EEx.eval_file(
"priv/templates/moon.gen.component/#{template}.ex",
Enum.map(context, fn {key, value} -> {key, value} end)
)
create_file(file_path, data, force: false)
end)
context
end
def print_shell_instructions(%{path: path, name: name}) do
Mix.shell().info("""
Add the resource to your lib/moon_web/router.ex
live("/components/v2/#{path}", MoonWeb.Pages.Design.#{name}Page)
And following to your lib/moon_web/schema/link.ex
MoonWeb.Pages.Design.#{name}Page
""")
end
end