defmodule Mix.Tasks.LightningCss do @shortdoc "Invokes lightning_css with the profile and args" @compile {:no_warn_undefined, Mix} @moduledoc """ Runs lightning_css with the given profile and args. ```bash $ mix lightning_css --runtime-config dev ``` The task will install lightning_css if it hasn't been installed previously via the `mix lightning_css.install` task. ## Options * `--runtime-config` - load the runtime configuration before executing command * `--watch` - watches for file changes and re-runs Lightning CSS when any of the matched files changes. """ use Mix.Task @impl true def run(args) do switches = [runtime_config: :boolean, watch: :boolean] {opts, remaining_args} = OptionParser.parse_head!(args, switches: switches) if function_exported?(Mix, :ensure_application!, 1) do Mix.ensure_application!(:inets) Mix.ensure_application!(:ssl) end if opts[:runtime_config] do # Loads and configures all registered apps. Mix.Task.run("app.config") else # Ensures that the application and their child application are started. Application.ensure_all_started(:lightning_css) end Mix.Task.reenable("lightning_css") install_and_run(remaining_args, watch: Keyword.get(opts, :watch, false)) end defp install_and_run([profile | args] = all, opts) do case LightningCSS.install_and_run(String.to_atom(profile), args, opts) do :ok -> :ok {:error, {:exited, status}} -> Mix.raise( "`mix lightning_css #{Enum.join(all, " ")}` exited caused by lightningcss failing with status code #{status}" ) end end defp install_and_run([], _opts) do Mix.raise("`mix lightning_css` expects the profile as argument") end end