Packages
surface
0.9.0
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/js_hooks.ex
defmodule Mix.Tasks.Surface.Init.ProjectPatchers.JsHooks do
@moduledoc false
alias Mix.Tasks.Surface.Init.FilePatchers
@behaviour Mix.Tasks.Surface.Init.ProjectPatcher
@impl true
def specs(%{js_hooks: true} = assigns) do
%{context_app: context_app, web_module: web_module} = assigns
[
{:patch, "assets/js/app.js", [js_hooks()]},
{:patch, "config/dev.exs",
[
add_surface_to_reloadable_compilers_in_endpoint_config(context_app, web_module)
]},
{:patch, ".gitignore", [add_ignore_js_hooks_to_gitignore()]}
]
end
def specs(_assigns), do: []
def add_surface_to_reloadable_compilers_in_endpoint_config(context_app, web_module) do
%{
name: "Add :surface to :reloadable_compilers",
patch:
&FilePatchers.Phoenix.add_reloadable_compiler_to_endpoint_config(&1, :surface, context_app, web_module),
instructions: """
Add :surface to the list of reloadable compilers.
# Example
```
config :my_app, MyAppWeb.Endpoint,
reloadable_compilers: [:phoenix, :elixir, :surface],
...
```
"""
}
end
def js_hooks() do
%{
name: "Configure components' JS hooks",
instructions: """
Import Surface components' hooks and pass them to `new LiveSocket(...)`.
# Example
```JS
import Hooks from "./_hooks"
let liveSocket = new LiveSocket("/live", Socket, { hooks: Hooks, ... })
```
""",
patch: [
&FilePatchers.JS.add_import(&1, ~S[import Hooks from "./_hooks"]),
&FilePatchers.Text.replace_line_text(
&1,
~S[let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}})],
~S[let liveSocket = new LiveSocket("/live", Socket, {params: {_csrf_token: csrfToken}, hooks: Hooks})]
)
]
}
end
def add_ignore_js_hooks_to_gitignore() do
%{
name: "Ignore generated JS hook files for components",
instructions: "",
patch:
&FilePatchers.Text.append_line(
&1,
"""
# Ignore generated js hook files for components
assets/js/_hooks/
""",
"assets/js/_hooks/"
)
}
end
end