class Licensed::Sources::Yarn::Berry

Public Class Methods

version_requirement() click to toggle source
# File lib/licensed/sources/yarn/berry.rb, line 9
def self.version_requirement
  Gem::Requirement.new(">= 2.0")
end

Public Instance Methods

enumerate_dependencies() click to toggle source
# File lib/licensed/sources/yarn/berry.rb, line 13
def enumerate_dependencies
  packages.map do |name, package|
    Dependency.new(
      name: name,
      version: package["version"],
      path: package["path"],
      metadata: {
        "type"     => self.class.type,
        "name"     => package["name"],
        "homepage" => package["homepage"]
      }
    )
  end
end
packages() click to toggle source

Finds packages that the current project relies on based on the output from ‘yarn info`

# File lib/licensed/sources/yarn/berry.rb, line 29
def packages
  # parse all lines of output to json and find one that is "type": "tree"
  yarn_info = JSON.parse("[#{yarn_info_command.lines.join(",")}]")
  mapped_packages = yarn_info.reduce({}) do |accum, package|
    name, _ = package["value"].rpartition("@")
    version = package.dig("children", "Version")
    id = "#{name}@#{version}"

    accum[name] ||= []
    accum[name] << {
      "id" => id,
      "name" => name,
      "version" => version,
      "homepage" => package.dig("children", "Manifest", "Homepage"),
      "path" => dependency_paths[id]
    }
    accum
  end

  mapped_packages.each_with_object({}) do |(name, results), hsh|
    results.uniq! { |package| package["version"] }
    if results.size == 1
      # if there is only one package for a name, reference it by name
      hsh[name] = results[0]
    else
      # if there is more than one package for a name, reference each by id
      results.each do |package|
        hsh[package["id"]] = package
      end
    end
  end
end
yarn_info_command() click to toggle source

Returns the output from running ‘yarn list` to get project dependencies

# File lib/licensed/sources/yarn/berry.rb, line 63
def yarn_info_command
  args = %w(--json --manifest --recursive --all)
  Licensed::Shell.execute("yarn", "info", *args)
end