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