lib/npm/packagefile.ex

# Copyright (C) 2020 by the Georgia Tech Research Institute (GTRI)
# This software may be modified and distributed under the terms of
# the BSD 3-Clause license. See the LICENSE file for details.

defmodule Npm.Packagefile do
  @behaviour Parser

  @moduledoc """
    Provides package.json and package-lock.json dependency parser
  """

  @impl Parser
  def parse!(content) do
    deps =
      content
      |> Jason.decode()
      |> extract_deps()
      |> Enum.to_list()
      |> Enum.map(fn {dependency, info} ->
        if is_map(info) && Map.fetch!(info, "version"),
          do: {dependency, info["version"]},
          else: {dependency, List.last(String.split(info, ~r{[\^|~]}, parts: 2))}
      end)

    {:ok, {deps, length(deps)}}
  end

  @impl Parser
  def file_names(), do: ["package.json", "package-lock.json"]

  defp extract_deps({:ok, %{"dependencies" => deps, "devDependencies" => devDeps}}),
    do: Map.merge(deps, devDeps)

  defp extract_deps({:ok, %{"dependencies" => deps}}), do: deps

  defp extract_deps({:ok, %{"devDependencies" => devDeps}}), do: devDeps
end