Class: Dependabot::NpmAndYarn::FileUpdater::BerryLockfileHandler

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dependabot/npm_and_yarn/file_updater/berry_lockfile_handler.rb

Class Method Summary collapse

Class Method Details

.extract_protocol(key, dep_name) ⇒ Object



97
98
99
100
101
102
103
104
# File 'lib/dependabot/npm_and_yarn/file_updater/berry_lockfile_handler.rb', line 97

def self.extract_protocol(key, dep_name)
  part = key.split(", ").find { |p| split_descriptor(p)[0] == dep_name }
  return "" unless part

  _, descriptor = split_descriptor(part)
  match = descriptor&.match(/^([a-z]+:)/)
  match ? T.must(match[1]) : ""
end

.find_exact_key(parsed, dep_name, version) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# File 'lib/dependabot/npm_and_yarn/file_updater/berry_lockfile_handler.rb', line 69

def self.find_exact_key(parsed, dep_name, version)
  parsed.keys.find do |key|
    next false unless key.is_a?(String)

    key.split(", ").any? do |part|
      name, desc = split_descriptor(part)
      name == dep_name && (desc&.end_with?(version) || false)
    end
  end
end

.parse(lockfile_path) ⇒ Object



20
21
22
23
24
25
# File 'lib/dependabot/npm_and_yarn/file_updater/berry_lockfile_handler.rb', line 20

def self.parse(lockfile_path)
  return unless File.exist?(lockfile_path)

  parsed = YAML.safe_load_file(lockfile_path)
  parsed.is_a?(Hash) ? parsed : nil
end

.replace_declaration(lockfile_path, dep_name, version, requirement) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/dependabot/npm_and_yarn/file_updater/berry_lockfile_handler.rb', line 49

def self.replace_declaration(lockfile_path, dep_name, version, requirement)
  return unless File.exist?(lockfile_path)

  content = File.read(lockfile_path)
  parsed = parse(lockfile_path)
  return unless parsed

  exact_key = find_exact_key(parsed, dep_name, version)
  return unless exact_key

  protocol = extract_protocol(exact_key, dep_name)
  new_key = "#{dep_name}@#{protocol}#{requirement}"

  escaped = Regexp.escape(exact_key)
  File.write(lockfile_path, content.gsub(/^"#{escaped}":/m, "\"#{new_key}\":"))
end

.split_descriptor(descriptor) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
# File 'lib/dependabot/npm_and_yarn/file_updater/berry_lockfile_handler.rb', line 83

def self.split_descriptor(descriptor)
  if descriptor.start_with?("@")
    at_index = descriptor.index("@", 1)
    return [descriptor, nil] unless at_index

    [T.must(descriptor[0...at_index]), descriptor[(at_index + 1)..]]
  else
    parts = descriptor.split("@", 2)
    [T.must(parts[0]), parts[1]]
  end
end

.version_matches?(parsed, dep_name, version) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
32
33
34
35
36
# File 'lib/dependabot/npm_and_yarn/file_updater/berry_lockfile_handler.rb', line 29

def self.version_matches?(parsed, dep_name, version)
  parsed.any? do |key, value|
    next false unless value.is_a?(Hash)

    key.to_s.split(", ").any? { |part| split_descriptor(part)[0] == dep_name } &&
      value["version"] == version
  end
end