lib/webpack/dev_server.ex

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