Skip to main content

lib/mix/tasks/npm.init.ex

defmodule Mix.Tasks.Npm.Init do
  @shortdoc "Create a package.json"

  @moduledoc """
  Create a new `package.json` in the current directory.

      mix npm.init

  Creates a minimal `package.json` with the project name from `mix.exs`.
  Skips if `package.json` already exists.
  """

  use Mix.Task

  @impl true
  def run([]) do
    if File.exists?("package.json") do
      Mix.shell().info("package.json already exists.")
    else
      name = project_name()
      create_package_json(name)
      Mix.shell().info("Created package.json")
    end
  end

  def run(_) do
    Mix.shell().error("Usage: mix npm.init")
  end

  defp project_name do
    config = Mix.Project.config()
    to_string(config[:app])
  end

  defp create_package_json(name) do
    data = %{
      "name" => name,
      "version" => "1.0.0",
      "private" => true,
      "dependencies" => %{},
      "devDependencies" => %{}
    }

    File.write!("package.json", NPM.JSON.encode_pretty(data))
  end
end