lib/ex_teal/asset.ex

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