Packages

Clarity is an interactive introspection and visualization tool for Elixir projects, providing navigable graphs and diagrams for frameworks like Ash, Phoenix, and Ecto.

Current section

Files

Jump to
clarity lib clarity components resources.ex
Raw

lib/clarity/components/resources.ex

defmodule Clarity.Resources do
@moduledoc false
use Phoenix.Component
import Phoenix.HTML
alias Phoenix.LiveView.Rendered
alias Phoenix.LiveView.Socket
phoenix_js_paths =
for app <- ~w(phoenix phoenix_live_view)a do
extension = if Mix.env() == :prod, do: ".min.js", else: ".js"
path = Application.app_dir(app, ["priv", "static", "#{app}#{extension}"])
Module.put_attribute(__MODULE__, :external_resource, path)
path
end
static_path = Application.app_dir(:clarity, ["priv", "static"])
@external_resource cache_static_manifest_path =
Application.app_dir(:clarity, "priv/static/cache_manifest.json")
manifest =
if File.exists?(cache_static_manifest_path) do
cache_static_manifest_path
|> File.read!()
|> JSON.decode!()
|> Map.fetch!("latest")
else
%{}
end
@external_resource js_path =
Path.join([
static_path,
Map.get(manifest, "assets/app.js", "assets/app.js")
])
@external_resource css_path =
Path.join([
static_path,
Map.get(manifest, "assets/app.css", "assets/app.css")
])
@external_resource logo_path =
Path.join([
static_path,
Map.get(
manifest,
"images/logo.svg",
"images/logo.svg"
)
])
@external_resource splash_path =
Path.join([
static_path,
Map.get(
manifest,
"images/splash.svg",
"images/splash.svg"
)
])
@doc """
Renders the CSS required for Clarity.
"""
@spec css(assigns :: Socket.assigns()) :: Rendered.t()
def css(assigns) do
~H"""
<style type="text/css">
<%= raw(resource(:css)) %>
</style>
"""
end
@doc """
Renders the JS required for Clarity.
"""
@spec js(assigns :: Socket.assigns()) :: Rendered.t()
def js(assigns) do
~H"""
<script defer type="text/javascript">
<%= raw(resource(:js)) %>
</script>
"""
end
@doc """
Returns the logo URI for Clarity.
"""
@spec logo_uri() :: iodata()
# sobelow_skip ["Traversal"]
def logo_uri, do: ["data:image/svg+xml;base64,", unquote(Base.encode64(File.read!(logo_path)))]
@doc """
Returns the splash screen logo SVG content for Clarity.
"""
@spec splash() :: String.t()
# sobelow_skip ["Traversal"]
def splash, do: unquote(File.read!(splash_path))
@spec resource(:js | :css) :: String.t()
defp resource(type)
# sobelow_skip ["Traversal"]
defp resource(:js),
do:
unquote("""
#{for path <- phoenix_js_paths, do: path |> File.read!() |> String.replace("//# sourceMappingURL=", "// ")}
#{File.read!(js_path)}
""")
# sobelow_skip ["Traversal"]
defp resource(:css), do: unquote(File.read!(css_path))
end