Skip to main content

lib/npm/install/lockfile_builder.ex

defmodule NPM.Install.LockfileBuilder do
  @moduledoc """
  Builds `npm.lock` entries from resolved package versions.
  """

  @doc "Build lockfile entries from a resolved `%{name => version}` map."
  @spec build(map(), (String.t(), String.t(), map() -> term())) :: NPM.Lockfile.t()
  def build(resolved, on_package \\ fn _name, _version, _info -> :ok end) do
    for {name, version_str} <- resolved, into: %{} do
      {:ok, packument} = NPM.Registry.get_packument(name)
      info = Map.fetch!(packument.versions, version_str)
      on_package.(name, version_str, info)

      {name,
       %{
         version: version_str,
         integrity: info.dist.integrity,
         tarball: info.dist.tarball,
         dependencies: info.dependencies,
         optional_dependencies: info.optional_dependencies,
         has_install_script: info.has_install_script
       }}
    end
  end
end