require Rambo
defmodule Scripts do
defstruct [:scripts, :project_root]
defp ensure_file_structure(project_root) do
File.mkdir_p!("#{project_root}/build/scripts")
end
defp trim_abs_path(path, project_root) do
# ROOT + scripts/
begin = byte_size(project_root) + byte_size("scripts/")
# remove extension
binary_part(path, begin, byte_size(path) - begin)
end
def collect(project_root) do
%Scripts{
scripts:
Path.wildcard(project_root <> "/scripts/**/*.js")
|> Task.async_stream(fn script ->
{trim_abs_path(script, project_root), File.read!(script)}
end)
|> Enum.map(fn {:ok, val} -> val end),
project_root: project_root
}
end
def compile(scripts) do
t_begin = System.monotonic_time(:millisecond)
ensure_file_structure(scripts.project_root)
scripts.scripts
|> Task.async_stream(fn script -> compile_file(script, scripts.project_root) end)
|> Enum.map(fn {:ok, val} -> val end)
t_end = System.monotonic_time(:millisecond)
t_end - t_begin
end
# data | npx lightningcss -m
defp compile_file({path, data}, project_root) do
{:ok, %Rambo{out: out}} = Rambo.run("npx", ["uglifyjs"], in: data)
output_path = "#{project_root}/build/scripts#{path}"
File.write!(output_path, out)
IO.puts("[COMPILED] #{project_root}/scripts#{path} -> #{output_path}")
end
end