module SvelteOnRails::Installer::Npm

def self.install_or_update_package(package_name, version_specifier: 'latest', dev_dependency: false)

def self.install_or_update_package(package_name, version_specifier: 'latest', dev_dependency: false)
  pkg = inspect_package(package_name)
  puts "#{package_name} already installed (#{pkg[:version].join('.')}, specified: #{version_specifier})" if pkg
  major_version = version_specifier.to_s.match(/^\d+(?=\.|$)/)
  to_do = if !pkg
            true
          elsif major_version
            r = pkg[:version].first != major_version.to_s.to_i
            if r
              puts "updating to major version #{major_version}"
            else
              puts "nothing to do (major version #{major_version} OK)"
            end
            r
          else
            puts 'nothing to do'
            false
          end
  save_dev = (dev_dependency ? ' --save-dev' : '')
  if to_do
    cmd = "npm install #{package_name}#{'@' + version_specifier if version_specifier}#{save_dev}"
    stdout, stderr, status = Open3.capture3(cmd)
    puts cmd
    if stderr.present?
      raise "ERROR #{cmd} => #{stderr}"
    end
    notice = [
      (pkg ? "Updated" : "Installed"),
      package_name,
      (pkg ? "from version #{pkg[:version].join('.')}" : nil),
      (pkg ? "to" : nil),
      "@latest"
    ].compact.join(' ')
    puts notice
  else
    puts "#{package_name} already installed (#{pkg[:version].join('.')}, required: «#{version_specifier}»), skipping."
  end
end