Packages
surface
0.11.3
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.1
0.1.0
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha.0
A component based library for Phoenix LiveView
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/surface/surface.init/project_patchers/common.ex
defmodule Mix.Tasks.Surface.Init.ProjectPatchers.Common do
@moduledoc false
alias Mix.Tasks.Surface.Init.FilePatchers
@behaviour Mix.Tasks.Surface.Init.ProjectPatcher
@impl true
def specs(assigns) do
%{
context_app: context_app,
web_module: web_module,
web_module_path: web_module_path,
web_path: web_path
} = assigns
[
{:patch, "mix.exs", [add_surface_to_mix_compilers()]},
{:patch, "config/dev.exs",
[
add_surface_live_reload_pattern_to_endpoint_config(context_app, web_module, web_path)
]},
{:patch, web_module_path,
[
add_import_surface_to_html_macro(web_module),
add_surface_live_view_macro(web_module)
]}
]
end
def add_surface_to_mix_compilers() do
%{
name: "Add :surface to compilers",
patch: &FilePatchers.MixExs.add_compiler(&1, ":surface"),
instructions: """
Append `:surface` to the list of compilers.
# Example
```
def project do
[
...
compilers: Mix.compilers() ++ [:surface],
...
]
end
```
"""
}
end
def add_surface_live_reload_pattern_to_endpoint_config(context_app, web_module, web_path) do
%{
name: "Update patterns in :reload_patterns",
patch:
&FilePatchers.Phoenix.replace_live_reload_pattern_in_endpoint_config(
&1,
~s[~r"#{web_path}/(controllers|live|components)/.*(ex|heex)$"],
~s[~r"#{web_path}/(controllers|live|components)/.*(ex|heex|sface|js)$"],
"ex|heex|sface|js",
context_app,
web_module
),
instructions: """
Update the :reload_patterns entry to include surface related files.
# Example
```
config :my_app, MyAppWeb.Endpoint,
live_reload: [
patterns: [
~r"lib/my_app_web/(controllers|live|components)/.*(ex|heex|sface|js)$",
...
]
]
```
"""
}
end
def add_import_surface_to_html_macro(web_module) do
%{
name: "Add `import Surface` to html config",
patch: &FilePatchers.Phoenix.add_import_to_html_macro(&1, Surface, web_module),
instructions: """
In order to have `~F` available for any Phoenix cotroller, you can import surface.
# Example
```elixir
def html do
quote do
...
import Surface
end
end
```
"""
}
end
def add_surface_live_view_macro(web_module) do
%{
name: "Add `surface_live_view` macro",
patch:
&FilePatchers.Phoenix.append_def_to_web_module(&1, :surface_live_view, """
quote do
use Surface.LiveView,
layout: {#{inspect(web_module)}.Layouts, :app}
unquote(html_helpers())
end\
"""),
instructions: """
Create a `surface_live_view` macro so it includes the default phoenix helpers and layouts
when using `use #{inspect(web_module)}, :surface_live_view`.
# Example
```
def surface_live_view do
quote do
use Surface.LiveView,
layout: {#{inspect(web_module)}.Layouts, :app}
unquote(html_helpers())
end
end
"""
}
end
end