defmodule LiveSvelte.Reload do
@moduledoc """
Utilities for easier integration with Vite in development.
"""
use Phoenix.Component
attr :assets, :list, required: true
slot :inner_block, required: true, doc: "rendered when Vite path is not defined (production)"
@doc """
Renders Vite dev server assets in development, falls back to compiled assets in production.
When `config :live_svelte, vite_host: "http://localhost:5173"` is set, injects:
- `@vite/client` script (enables Vite HMR WebSocket)
- CSS assets as `` tags
- JS assets as `
"""
def vite_assets(assigns) do
vite_host = Application.get_env(:live_svelte, :vite_host)
assigns =
assigns
|> assign(:vite_host, vite_host)
|> assign(
:stylesheets,
for(path <- assigns.assets, String.ends_with?(path, ".css"), do: path)
)
|> assign(
:javascripts,
for(path <- assigns.assets, String.ends_with?(path, ".js"), do: path)
)
~H"""
<%= if @vite_host do %>
<% else %>
{render_slot(@inner_block)}
<% end %>
"""
end
end