Packages
fermo
0.14.0
0.20.1
0.20.0
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.1
0.17.0
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.4
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A static site generator
Current section
Files
Jump to
Current section
Files
lib/webpack/assets.ex
defmodule Webpack.Assets do
use GenServer
@moduledoc """
Handles an external (Webpack) pipeline.
Runs the pipeline, then loads the manifest it produces into a GenServer
in order to provide asset name mapping.
"""
@webpack_config_path "webpack.config.js"
def start_link(_args) do
GenServer.start_link(__MODULE__, %{}, name: :assets)
end
def init(args) do
{:ok, args}
end
def build() do
if File.exists?(@webpack_config_path) do
System.cmd("yarn", ["run", "webpack"]) |> handle_build_result()
else
{:ok}
end
end
def load_manifest() do
manifest = "build/manifest.json"
|> File.read!
|> Jason.decode!
|> Enum.into(
%{},
fn
{"/" <> k, "/" <> v} -> {"/" <> k, "/" <> v}
{"/" <> k, v} -> {"/" <> k, "/" <> v}
{ k, "/" <> v} -> {"/" <> k, "/" <> v}
{ k, v} -> {"/" <> k, "/" <> v}
end
)
GenServer.call(:assets, {:put, manifest})
{:ok}
end
defp handle_build_result({_output, 0}) do
load_manifest()
end
defp handle_build_result({output, _exit_status}) do
{:error, "External webpack pipeline failed to build\n\n#{output}"}
end
def manifest do
GenServer.call(:assets, {:manifest})
end
def path("/" <> name) do
GenServer.call(:assets, {:path, "/" <> name})
end
def path(name) do
GenServer.call(:assets, {:path, "/" <> name})
end
def path!(name) do
{:ok, path} = path(name)
path
end
def handle_call({:put, state}, _from, _state) do
{:reply, {:ok}, state}
end
def handle_call({:manifest}, _from, state) do
{:reply, {:ok, state}, state}
end
def handle_call({:path, name}, _from, state) do
if Map.has_key?(state, name) do
path = state[name]
{:reply, {:ok, path}, state}
else
{:reply, {:error, "'#{name}' not found in manifest"}, state}
end
end
end