defmodule Webpack.DevServer do
use GenServer
@moduledoc """
Runs the Webpack Development server for live mode.
"""
@webpack_dev_server_command_default "yarn run webpack serve --watch-options-stdin"
@webpack_dev_server_command Application.get_env(
:fermo,
:webpack_dev_server_command,
@webpack_dev_server_command_default
)
def start_link(_opts) do
if File.exists?(Webpack.Assets.webpack_config_path()) do
{:ok, _pid} = GenServer.start_link(__MODULE__, %{}, name: :webpack_dev_server)
else
{:error, :webpack_config_not_found}
end
end
def init(_args) do
IO.puts "Starting Webpack dev server..."
port = Port.open(
{:spawn, @webpack_dev_server_command},
[:binary, :exit_status, {:env, [{'NODE_ENV', 'development'}]}]
)
{:ok, port}
end
def handle_info({_port, {:data, message}}, state) do
if String.match?(message, ~r/manifest.json\s.*?\[emitted\]/) do
IO.puts "manifest emitted!"
{:ok} = Webpack.Assets.load_manifest()
end
{:noreply, state}
end
def handle_info(other, state) do
IO.puts "Webpack.DevServer message: #{inspect(other, [pretty: true, width: 0])}"
{:noreply, state}
end
end