defmodule ExPostcss do def start(_, _) do Supervisor.start_link([], strategy: :one_for_one) end def run(profile, extra_args) when is_atom(profile) and is_list(extra_args) do config = config_for!(profile) config_args = config[:args] || [] opts = [ cd: config[:cd] || File.cwd!(), env: config[:env] || [{"FORCE_IS_TTY", "true"}], into: IO.stream(:stdio, :line), stderr_to_stdout: true ] System.cmd("npx", ["postcss"] ++ config_args ++ extra_args, opts) |> elem(1) end @doc """ Returns the configuration for the given profile. Returns nil if the profile does not exist. """ def config_for!(profile) when is_atom(profile) do Application.get_env(:ex_postcss, profile) || raise ArgumentError, """ unknown ex_postcss profile. Make sure the profile is defined in your config files, such as: config :ex_postcss, #{profile}: [ args: ~w(css/app.css -o ../priv/static/assets/app.css --config ./postcss.config.js), cd: Path.expand("../assets", __DIR__) ] """ end end