From 18e8c9bfc3f395ae41de659bbb3701da670dfe79 Mon Sep 17 00:00:00 2001 From: Conor Sinclair Date: Sat, 27 May 2023 22:43:37 +0100 Subject: [PATCH] added a macro to embed svelte components as local functions --- lib/macros.ex | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 lib/macros.ex diff --git a/lib/macros.ex b/lib/macros.ex new file mode 100644 index 0000000..a57d180 --- /dev/null +++ b/lib/macros.ex @@ -0,0 +1,55 @@ +defmodule LiveSvelte.Macros 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(fn name -> + quote do + def unquote(:"#{name}")(assigns) do + props = + assigns + |> Map.filter(fn + {:svelte_opts, _v} -> false + {k, _v} -> k not in [:__changed__] + _ -> false + end) + + var!(assigns) = + assign(assigns, + __component_name: unquote(name), + props: props || %{} + ) + + ~H""" + + """ + end + end + end) + 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 +end