Skip to main content

lib/release_kit/asset.ex

defmodule ReleaseKit.Asset do
  @moduledoc """
  Runs first-class frontend asset build presets before packaging a release.
  """

  alias ReleaseKit.AssetInfo

  @doc """
  Runs configured asset presets and returns metadata for the manifest.
  """
  @spec build(keyword()) :: [AssetInfo.t()]
  def build(opts) when is_list(opts) do
    opts
    |> Keyword.get(:assets, [])
    |> run_assets()
  end

  defp run_assets([]), do: []

  defp run_assets(assets) when is_list(assets) do
    Enum.flat_map(assets, &run_asset/1)
  end

  defp run_assets(other) do
    Mix.raise("release_kit :assets expects a keyword list, got: #{inspect(other)}")
  end

  defp run_asset({:volt, opts}) when is_list(opts) do
    step_module = Module.concat(ReleaseKit.Step, Volt)

    unless Code.ensure_loaded?(step_module) and function_exported?(step_module, :run, 1) do
      Mix.raise("release_kit Volt assets require optional dependencies :volt and :npm")
    end

    {:ok, assets} = step_module.run(opts)
    assets
  end

  defp run_asset(other) do
    Mix.raise("invalid release_kit asset preset: #{inspect(other)}")
  end
end