Packages
live_svelte
0.10.0
0.18.0
0.18.0-rc0
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.15.0
0.15.0-rc.6
0.15.0-rc.5
0.15.0-rc.4
0.15.0-rc.3
0.15.0-rc.2
0.15.0-rc.1
0.14.1
0.14.0
0.13.3
0.13.3-rc.1
0.13.2
0.13.1
0.13.0
0.12.0
0.11.0
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc2
0.9.0-rc1
0.9.0-rc0
0.8.0
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.5.0-rc0
0.4.2
0.4.2-rc0
0.4.1
0.4.1-rc0
0.4.0
0.3.5
0.3.5-rc1
0.3.5-rc0
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-rc1
0.3.0-rc0
0.2.0
0.2.0-rc1
0.2.0-rc0
0.1.0
0.1.0-rc5
0.1.0-rc4
0.1.0-rc3
0.1.0-rc2
0.1.0-rc1
0.1.0-rc0
E2E reactivity for Svelte and LiveView
Current section
Files
Jump to
Current section
Files
lib/components.ex
defmodule LiveSvelte.Components do
@moduledoc """
Macros to improve the developer experience of crossing the Liveview/Svelte boundary.
"""
@doc """
Generates functions local to your current module that can be used to render Svelte components.
"""
defmacro __using__(_opts) do
get_svelte_components()
|> Enum.map(&name_to_function/1)
end
@doc """
TODO: This could perhaps be optimized to only read the files once per compilation.
"""
def get_svelte_components do
"./assets/svelte/"
|> Path.join("**/*.svelte")
|> Path.wildcard()
|> Enum.filter(&(not String.contains?(&1, "_build/")))
|> Enum.map(fn path ->
path
|> Path.basename()
|> String.replace(".svelte", "")
end)
end
defp name_to_function(name) do
quote do
def unquote(:"#{name}")(assigns) do
props =
assigns
|> Map.filter(fn
{:svelte_opts, _v} -> false
{k, _v} -> k not in [:__changed__, :__given__, :ssr]
_ -> false
end)
var!(assigns) =
assigns
|> Map.put(:__component_name, unquote(name))
|> Map.put_new(:ssr, true)
|> Map.put_new(:class, nil)
|> assign(:props, props)
~H"""
<LiveSvelte.svelte
name={@__component_name}
class={@class}
ssr={@ssr}
props={@props}
/>
"""
end
end
end
end