Module: SvelteOnRails::Installer::Npm

Defined in:
lib/svelte_on_rails/installer/npm.rb

Class Method Summary collapse

Class Method Details

.inspect_package(package_name) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/svelte_on_rails/installer/npm.rb', line 80

def self.inspect_package(package_name)
  pkg = nil
  version = nil

  if File.exist?('package-lock.json')
    pl = JSON.parse(File.read('package-lock.json'))
    unless pl['packages']
      raise "ERROR: package-lock.json found, but no packages found, seems to be corrupted."
    end
    pkg = pl['packages'].keys.grep(/\/#{package_name}$/).first
    version = pl['packages'][pkg]['version'] if pkg
  end

  if pkg
    {
      type: pkg.match(/^.*?(?=\/[^\/]*$)/).to_s,
      version: version&.split('.')&.map(&:to_i)
    }
  end

end

.install_or_update_package(package_name, version_specifier: 'latest', dev_dependency: false) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/svelte_on_rails/installer/npm.rb', line 5

def self.install_or_update_package(package_name, version_specifier: 'latest', dev_dependency: false)
  pkg = inspect_package(package_name)
  if pkg
    if pkg[:version]
      puts "#{package_name} already installed (#{pkg[:version].join('.')}, specified: #{version_specifier})"
    else
      puts "#{package_name} already installed ERROR: pkg is: +++\n#{pkg}\n+++\n\n, specified: #{version_specifier})"
    end
  end
  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
    if pkg[:version]
      puts "#{package_name} already installed (#{pkg[:version].join('.')}, required: «#{version_specifier}»), skipping."
    else
      puts "#{package_name} already installed ERROR: pkg is: +++\n#{pkg}\n+++\n\n, specified: #{version_specifier})"
    end
  end
end


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/svelte_on_rails/installer/npm.rb', line 63

def self.link_local_package(package_name, local_package_url)
  Dir.chdir(local_package_url) do
    `npm unlink`
    `npm link`
  end
  Dir.chdir(Rails.root) do
    # Instead of just `npm link`, use `npm install` to add the local package to package.json
    `npm install #{local_package_url} --save`
    stdout, stderr, status = Open3.capture3("npm ls #{package_name}")
    if stderr.present?
      raise "ERROR: npm link failed for #{package_name} => #{stderr}"
    end
    puts "Successfully linked #{package_name} to #{local_package_url}"
    puts "  • `npm ls #{package_name}` => «#{stdout}»"
  end
end