This is possible in newer versions of the nodejs cookbook, by setting the `node["nodejs"]["package_action"]["nodejs"]` attribute to `:upgrade`
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
module NodeJs
 | 
						|
  module Helper
 | 
						|
    def npm_dist
 | 
						|
      if node['nodejs']['npm']['url']
 | 
						|
        { 'url' => node['nodejs']['npm']['url'] }
 | 
						|
      else
 | 
						|
 | 
						|
        require 'open-uri'
 | 
						|
        require 'json'
 | 
						|
        result = JSON.parse(URI.parse("https://registry.npmjs.org/npm/#{node['nodejs']['npm']['version']}").read, max_nesting: false)
 | 
						|
        ret = { 'url' => result['dist']['tarball'], 'version' => result['_npmVersion'], 'shasum' => result['dist']['shasum'] }
 | 
						|
        Chef::Log.debug("Npm dist #{ret}")
 | 
						|
        ret
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    def npm_list(package, path = nil, environment = {})
 | 
						|
      require 'json'
 | 
						|
      cmd = if path
 | 
						|
              Mixlib::ShellOut.new("npm list #{package} -json", cwd: path, environment: environment)
 | 
						|
            else
 | 
						|
              Mixlib::ShellOut.new("npm list #{package} -global -json", environment: environment)
 | 
						|
            end
 | 
						|
 | 
						|
      begin
 | 
						|
        JSON.parse(cmd.run_command.stdout, max_nesting: false)
 | 
						|
      rescue JSON::ParserError => e
 | 
						|
        Chef::Log.error("nodejs::library::nodejs_helper::npm_list exception #{e}")
 | 
						|
        {}
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    def url_valid?(list, package)
 | 
						|
      require 'open-uri'
 | 
						|
 | 
						|
      begin
 | 
						|
        URI.parse(list.fetch(package, {}).fetch('resolved'))
 | 
						|
      rescue KeyError
 | 
						|
        # the package may have been installed without using a url
 | 
						|
        true
 | 
						|
      rescue URI::InvalidURIError
 | 
						|
        false
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    def version_valid?(list, package, version)
 | 
						|
      (version ? list[package]['version'] == version : true)
 | 
						|
    end
 | 
						|
 | 
						|
    def npm_package_installed?(package, version = nil, path = nil, npm_token = nil)
 | 
						|
      environment = { 'NPM_TOKEN' => npm_token } if npm_token
 | 
						|
 | 
						|
      list = npm_list(package, path, environment)['dependencies']
 | 
						|
      # Return true if package installed and installed to good version
 | 
						|
      # see if we really want to add the url check
 | 
						|
      !list.nil? && list.key?(package) && version_valid?(list, package, version) && url_valid?(list, package)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |