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