defmodule ExTeal.Asset do @moduledoc """ Functionality for fetching Vue Assets """ defstruct [:styles, :scripts, :compiled_assets] def all_assets do compiled_assets = case Application.fetch_env(:ex_teal, :compiled_assets) do {:ok, val} -> val :error -> true end assets_for(compiled_assets) end defp assets_for(true) do manifest = :ex_teal |> :code.priv_dir() |> Path.join(["static/", "teal/", "manifest.json"]) |> File.read!() |> Jason.decode!() %__MODULE__{ compiled_assets: true, scripts: scripts_in_manifest(manifest), styles: styles_in_manifest(manifest) } end defp assets_for(false) do %__MODULE__{ compiled_assets: false } end defp scripts_in_manifest(map) do map |> Enum.filter(fn {k, v} -> is_not_a_chunk?(k) && is_not_minified?(v) && !is_css?(v) end) |> Enum.map(fn {_k, v} -> v end) |> Enum.sort() end defp styles_in_manifest(map) do map |> Enum.filter(fn {k, v} -> is_not_a_chunk?(k) && is_not_minified?(v) && is_css?(v) end) |> Enum.map(fn {_k, v} -> v end) |> Enum.sort() end defp is_not_a_chunk?("npm." <> _), do: true defp is_not_a_chunk?("js/" <> _), do: false defp is_not_a_chunk?(_), do: true defp is_not_minified?(value) do !String.ends_with?(value, ".gz") && !String.ends_with?(value, ".br") end defp is_css?(value), do: String.ends_with?(value, ".css") end