Sha256: cc4e2500cdc0d0423ed5480dfa917ea5e4850365f9925c08c7915916c4aaa7f2

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

require "package_json"

module Shakapacker
  module Utils
    class Manager
      class Error < StandardError; end

      MANAGER_LOCKS = {
        "bun" => "bun.lockb",
        "npm" => "package-lock.json",
        "pnpm" => "pnpm-lock.yaml",
        "yarn" => "yarn.lock"
      }

      # Emits a warning if it's not obvious what package manager to use
      def self.error_unless_package_manager_is_obvious!
        return unless PackageJson.read.fetch("packageManager", nil).nil?

        guessed_binary = guess_binary

        return if guessed_binary == "npm"

        raise Error, <<~MSG
          You don't have "packageManager" set in your package.json
          meaning that Shakapacker will use npm but you've got a #{MANAGER_LOCKS[guessed_binary]}
          file meaning you probably want to be using #{guessed_binary} instead.

          To make this happen, set "packageManager" in your package.json to #{guessed_binary}@#{guess_version}
        MSG
      end

      # Guesses the binary of the package manager to use based on what lockfiles exist
      #
      # @return [String]
      def self.guess_binary
        MANAGER_LOCKS.find { |_, lock| File.exist?(lock) }&.first || "npm"
      end

      # Guesses the version of the package manager to use by calling `<manager> --version`
      #
      # @return [String]
      def self.guess_version
        require "open3"

        command = "#{guess_binary} --version"
        stdout, stderr, status = Open3.capture3(command)

        unless status.success?
          raise Error, "#{command} failed with exit code #{status.exitstatus}: #{stderr}"
        end

        stdout.chomp
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
shakapacker-8.0.2 lib/shakapacker/utils/manager.rb
shakapacker-8.0.1 lib/shakapacker/utils/manager.rb