dependabot-bun 0.392.0 → 0.393.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a26cc2bacba80d0257ab7818f69fbe7f5347e71eb1975a1558f5d49c145d0ebd
4
- data.tar.gz: e472da36b4791b838a6e543f225f06b872a6f9d4966b76878f73043c99cb9db7
3
+ metadata.gz: 923b839c39e732c6fb6811cf6c9d1d7ec632278e3ea3e53a869091ebbf4ebf3f
4
+ data.tar.gz: 39e1cf8df33890c3eb795c37ca76d05a13407a0147cbd30c61cd89d192983aed
5
5
  SHA512:
6
- metadata.gz: 61c9f416d4fd133198b90bf7e6d2f30e00745422dd9eed1e8f23c27b47db97511c999e1983a4c358508e1eba720b2489ef13bf1f44efe96963646b6e53be207b
7
- data.tar.gz: 15e81fb3532a1bd2126d1a5d01e33ceab4b37e9b872802dd59248b10ac6d0555782d5b6006bd9e44295272da7f9114967e68b9635b4d72454e38058467de621b
6
+ metadata.gz: 4954f66e622be9eee7f56ab6ce81d65a8874b3308140b63d2c98bf2a0316eead317e296cb71e173b810170047995f9fc9fe9230b543fdbcf1939c2990399a207
7
+ data.tar.gz: 8f4ed98c474f44bd4f385ea10f54506294776b9b4a6ba2f72150d07c544b9eef60cdd3bddbe5a2ec93ebcf76eaa58281244bb5cebe4c5356d8d213e13225452a
@@ -37,7 +37,7 @@ module Dependabot
37
37
  #
38
38
  # @param dependency [Dependabot::Dependency] the dependency to check
39
39
  # @param target_version [String] the version to check
40
- # @return [Array<Hash{String => String}]
40
+ # @return [Array<Hash{String => Object}]
41
41
  # * name [String] the blocking dependencies name
42
42
  # * version [String] the version of the blocking dependency
43
43
  # * requirement [String] the requirement on the target_dependency
@@ -46,7 +46,7 @@ module Dependabot
46
46
  dependency: Dependabot::Dependency,
47
47
  target_version: T.nilable(T.any(String, Dependabot::Version))
48
48
  )
49
- .returns(T::Array[T::Hash[String, String]])
49
+ .returns(T::Array[Dependabot::UpdateCheckers::Conflict])
50
50
  end
51
51
  def conflicting_dependencies(dependency:, target_version:)
52
52
  SharedHelpers.in_a_temporary_directory do
@@ -63,7 +63,7 @@ module Dependabot
63
63
  function: "yarn:findConflictingDependencies",
64
64
  args: [Dir.pwd, dependency.name, target_version.to_s]
65
65
  ),
66
- T::Array[T::Hash[String, String]]
66
+ T::Array[Dependabot::UpdateCheckers::Conflict]
67
67
  )
68
68
  end
69
69
  rescue SharedHelpers::HelperSubprocessFailed
@@ -141,7 +141,7 @@ module Dependabot
141
141
  secure_versions =
142
142
  Dependabot::UpdateCheckers::VersionFilters
143
143
  .filter_vulnerable_versions(
144
- T.unsafe(secure_versions),
144
+ secure_versions,
145
145
  security_advisories
146
146
  )
147
147
  secure_versions = filter_ignored_versions(secure_versions)
@@ -237,7 +237,7 @@ module Dependabot
237
237
  def possible_previous_releases
238
238
  (package_details&.releases || [])
239
239
  .reject do |r|
240
- r.version.prerelease? && !related_to_current_pre?(T.unsafe(r.version))
240
+ r.version.prerelease? && !related_to_current_pre?(r.version)
241
241
  end
242
242
  .sort_by(&:version).reverse
243
243
  end
@@ -343,9 +343,11 @@ module Dependabot
343
343
  latest_types_version = latest_types_package_version
344
344
  return false unless latest_types_version
345
345
 
346
+ latest_types_version = T.cast(latest_types_version, Version)
347
+
346
348
  latest_allowable_ver = latest_allowable_version
347
349
  return false unless latest_allowable_ver.is_a?(Version) && latest_allowable_ver.backwards_compatible_with?(
348
- T.unsafe(latest_types_version)
350
+ latest_types_version
349
351
  )
350
352
 
351
353
  return false unless version_class.correct?(types_pkg.version)
@@ -512,7 +514,7 @@ module Dependabot
512
514
  .possible_versions_with_details
513
515
  .select do |versions_with_details|
514
516
  version, details = versions_with_details
515
- next false unless satisfies_peer_reqs_on_dep?(T.unsafe(version))
517
+ next false unless satisfies_peer_reqs_on_dep?(version)
516
518
  next true unless details["peerDependencies"]
517
519
  next true if version == version_for_dependency(dependency)
518
520
 
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
@@ -13,6 +13,7 @@ require "dependabot/bun/native_helpers"
13
13
  require "dependabot/bun/update_checker"
14
14
  require "dependabot/bun/update_checker/dependency_files_builder"
15
15
  require "dependabot/shared_helpers"
16
+ require "dependabot/update_checkers/vulnerability_audit"
16
17
 
17
18
  module Dependabot
18
19
  module Bun
@@ -20,6 +21,8 @@ module Dependabot
20
21
  class VulnerabilityAuditor
21
22
  extend T::Sig
22
23
 
24
+ Audit = Dependabot::UpdateCheckers::VulnerabilityAudit
25
+
23
26
  sig do
24
27
  params(
25
28
  dependency_files: T::Array[Dependabot::DependencyFile],
@@ -32,7 +35,6 @@ module Dependabot
32
35
  @credentials = credentials
33
36
  end
34
37
 
35
- # rubocop:disable Metrics/MethodLength
36
38
  # Finds any dependencies in the `package-lock.json` or `npm-shrinkwrap.json` that have
37
39
  # a subdependency on the given dependency that is locked to a vuln version range.
38
40
  #
@@ -40,36 +42,18 @@ module Dependabot
40
42
  #
41
43
  # @param dependency [Dependabot::Dependency] the dependency to check
42
44
  # @param security_advisories [Array<Dependabot::SecurityAdvisory>] advisories for the dependency
43
- # @return [Hash<String, [String, Array<Hash<String, String>>]>] the audit results
44
- # * :dependency_name [String] the name of the dependency
45
- # * :fix_available [Boolean] whether a fix is available
46
- # * :current_version [String] the version of the dependency
47
- # * :target_version [String] the version of the dependency after the fix
48
- # * :fix_updates [Array<Hash<String, String>>] a list of dependencies to update in order to fix
49
- # * :dependency_name [String] the name of the blocking dependency
50
- # * :current_version [String] the current version of the blocking dependency
51
- # * :target_version [String] the target version of the blocking dependency
52
- # * :top_level_ancestors [Array<String>] the names of top-level dependencies with a transitive
53
- # dependency on the blocking dependency
54
- # * :top_level_ancestors [Array<String>] the names of all top-level dependencies with a transitive
55
- # dependency on the dependency
56
- # * :explanation [String] an explanation for why the project failed the vulnerability auditor run
45
+ # @return [Dependabot::UpdateCheckers::VulnerabilityAudit] the parsed audit result
57
46
  sig do
58
47
  params(
59
48
  dependency: Dependabot::Dependency,
60
49
  security_advisories: T::Array[Dependabot::SecurityAdvisory]
61
50
  )
62
- .returns(T::Hash[String, T.untyped])
51
+ .returns(Audit)
63
52
  end
64
53
  def audit(dependency:, security_advisories:)
65
54
  Dependabot.logger.info("VulnerabilityAuditor: starting audit")
66
55
 
67
- fix_unavailable = {
68
- "dependency_name" => dependency.name,
69
- "fix_available" => false,
70
- "fix_updates" => [],
71
- "top_level_ancestors" => []
72
- }
56
+ fix_unavailable = Audit.unavailable(dependency_name: dependency.name)
73
57
 
74
58
  SharedHelpers.in_a_temporary_directory do
75
59
  dependency_files_builder = DependencyFilesBuilder.new(
@@ -86,20 +70,20 @@ module Dependabot
86
70
  }
87
71
  end
88
72
 
89
- audit_result = T.cast(
73
+ audit_result = Audit.from_object(
90
74
  SharedHelpers.run_helper_subprocess(
91
75
  command: NativeHelpers.helper_path,
92
76
  function: "npm:vulnerabilityAuditor",
93
77
  args: [Dir.pwd, vuln_versions]
94
- ),
95
- T::Hash[String, T.untyped]
78
+ )
96
79
  )
97
80
 
98
81
  validation_result = validate_audit_result(audit_result, security_advisories)
99
82
  if validation_result != :viable
100
83
  Dependabot.logger.info("VulnerabilityAuditor: audit result not viable: #{validation_result}")
101
- fix_unavailable["explanation"] = explain_fix_unavailable(validation_result, dependency)
102
- return fix_unavailable
84
+ return fix_unavailable.unavailable_with_explanation(
85
+ explain_fix_unavailable(validation_result, dependency)
86
+ )
103
87
  end
104
88
 
105
89
  Dependabot.logger.info("VulnerabilityAuditor: audit result viable")
@@ -109,7 +93,6 @@ module Dependabot
109
93
  log_helper_subprocess_failure(dependency, e)
110
94
  T.must(fix_unavailable)
111
95
  end
112
- # rubocop:enable Metrics/MethodLength
113
96
 
114
97
  private
115
98
 
@@ -133,12 +116,12 @@ module Dependabot
133
116
 
134
117
  sig do
135
118
  params(
136
- audit_result: T::Hash[String, T.untyped],
119
+ audit_result: Audit,
137
120
  security_advisories: T::Array[Dependabot::SecurityAdvisory]
138
121
  ).returns(Symbol)
139
122
  end
140
123
  def validate_audit_result(audit_result, security_advisories)
141
- return :fix_unavailable unless audit_result["fix_available"]
124
+ return :fix_unavailable unless audit_result.fix_available
142
125
  return :dependency_still_vulnerable if dependency_still_vulnerable?(audit_result, security_advisories)
143
126
  return :downgrades_dependencies if downgrades_dependencies?(audit_result)
144
127
  return :fix_incomplete if fix_incomplete?(audit_result)
@@ -148,25 +131,26 @@ module Dependabot
148
131
 
149
132
  sig do
150
133
  params(
151
- audit_result: T::Hash[String, T.untyped],
134
+ audit_result: Audit,
152
135
  security_advisories: T::Array[Dependabot::SecurityAdvisory]
153
136
  )
154
137
  .returns(T::Boolean)
155
138
  end
156
139
  def dependency_still_vulnerable?(audit_result, security_advisories)
157
140
  # vulnerable dependency is removed if the target version is nil
158
- return false unless audit_result["target_version"]
141
+ target_version = audit_result.target_version
142
+ return false unless target_version
159
143
 
160
- version = Version.new(audit_result["target_version"])
144
+ version = Version.new(target_version)
161
145
  security_advisories.any? { |a| a.vulnerable?(version) }
162
146
  end
163
147
 
164
- sig { params(audit_result: T::Hash[String, T.untyped]).returns(T::Boolean) }
148
+ sig { params(audit_result: Audit).returns(T::Boolean) }
165
149
  def downgrades_dependencies?(audit_result)
166
- return true if downgrades_version?(audit_result["current_version"], audit_result["target_version"])
150
+ return true if downgrades_version?(audit_result.current_version, audit_result.target_version)
167
151
 
168
- audit_result["fix_updates"].any? do |update|
169
- downgrades_version?(update["current_version"], update["target_version"])
152
+ audit_result.fix_updates.any? do |update|
153
+ downgrades_version?(update.current_version, update.target_version)
170
154
  end
171
155
  end
172
156
 
@@ -185,10 +169,10 @@ module Dependabot
185
169
  current > target
186
170
  end
187
171
 
188
- sig { params(audit_result: T::Hash[String, T.untyped]).returns(T::Boolean) }
172
+ sig { params(audit_result: Audit).returns(T::Boolean) }
189
173
  def fix_incomplete?(audit_result)
190
- audit_result["fix_updates"].any? { |update| !update.key?("target_version") } ||
191
- audit_result["fix_updates"].empty?
174
+ audit_result.fix_updates.any? { |update| !update.target_version_provided? } ||
175
+ audit_result.fix_updates.empty?
192
176
  end
193
177
 
194
178
  sig do
@@ -200,15 +184,18 @@ module Dependabot
200
184
  def log_helper_subprocess_failure(dependency, error)
201
185
  # See `Dependabot::SharedHelpers.run_helper_subprocess` for details on error context
202
186
  context = error.error_context
187
+ function = T.cast(context[:function], T.nilable(String))
188
+ time_taken = T.cast(context[:time_taken], T.nilable(Float))
189
+ trace = error.trace&.join("\n")
203
190
 
204
191
  builder = ::StringIO.new
205
192
  builder << "VulnerabilityAuditor: "
206
- builder << "#{context[:function]} " if context[:function]
193
+ builder << "#{function} " if function
207
194
  builder << "failed"
208
- builder << " after #{context[:time_taken].truncate(2)}s" if context[:time_taken]
195
+ builder << " after #{time_taken.truncate(2)}s" if time_taken
209
196
  builder << " while auditing #{dependency.name}: "
210
197
  builder << error.message
211
- builder << "\n" << context[:trace]
198
+ builder << "\n#{trace}" if trace
212
199
 
213
200
  msg = builder.string
214
201
  Dependabot.logger.info(msg) # TODO: is this the right log level?
@@ -12,6 +12,8 @@ module Dependabot
12
12
  class UpdateChecker < Dependabot::UpdateCheckers::Base # rubocop:disable Metrics/ClassLength
13
13
  extend T::Sig
14
14
 
15
+ Audit = Dependabot::UpdateCheckers::VulnerabilityAudit
16
+
15
17
  require_relative "update_checker/requirements_updater"
16
18
  require_relative "update_checker/library_detector"
17
19
  require_relative "update_checker/latest_version_finder"
@@ -52,7 +54,7 @@ module Dependabot
52
54
  @latest_version = T.let(nil, T.nilable(T.any(String, Gem::Version)))
53
55
  @latest_resolvable_version = T.let(nil, T.nilable(T.any(String, Dependabot::Version)))
54
56
  @updated_requirements = T.let(nil, T.nilable(T::Array[Dependabot::DependencyRequirement]))
55
- @vulnerability_audit = T.let(nil, T.nilable(T::Hash[String, T.untyped]))
57
+ @vulnerability_audit = T.let(nil, T.nilable(Audit))
56
58
  @vulnerable_versions = T.let(nil, T.nilable(T::Array[T.any(String, Gem::Version)]))
57
59
 
58
60
  @latest_version_for_git_dependency = T.let(nil, T.nilable(T.any(String, Gem::Version)))
@@ -116,9 +118,9 @@ module Dependabot
116
118
  sig { override.returns(T.nilable(Dependabot::Version)) }
117
119
  def lowest_security_fix_version
118
120
  # This will require a full unlock to update multiple top level ancestors.
119
- return if vulnerability_audit["fix_available"] && vulnerability_audit["top_level_ancestors"].count > 1
121
+ return if vulnerability_audit.fix_available && vulnerability_audit.top_level_ancestors.count > 1
120
122
 
121
- T.unsafe(latest_version_finder.lowest_security_fix_version)
123
+ latest_version_finder.lowest_security_fix_version
122
124
  end
123
125
 
124
126
  sig { override.returns(T.nilable(Dependabot::Version)) }
@@ -155,10 +157,10 @@ module Dependabot
155
157
 
156
158
  sig do
157
159
  params(updated_version: T.any(String, Gem::Version))
158
- .returns(T.nilable(T.any(String, T.untyped)))
160
+ .returns(T.nilable(T.any(String, Gem::Version)))
159
161
  end
160
162
  def latest_resolvable_previous_version(updated_version)
161
- T.unsafe(version_resolver.latest_resolvable_previous_version(updated_version))
163
+ version_resolver.latest_resolvable_previous_version(updated_version)
162
164
  end
163
165
 
164
166
  sig { override.returns(T::Array[Dependabot::DependencyRequirement]) }
@@ -198,7 +200,7 @@ module Dependabot
198
200
  library? ? RequirementsUpdateStrategy::WidenRanges : RequirementsUpdateStrategy::BumpVersions
199
201
  end
200
202
 
201
- sig { override.returns(T::Array[T::Hash[String, String]]) }
203
+ sig { override.returns(T::Array[Dependabot::UpdateCheckers::Conflict]) }
202
204
  def conflicting_dependencies
203
205
  conflicts = ConflictingDependencyResolver.new(
204
206
  dependency_files: dependency_files,
@@ -209,9 +211,8 @@ module Dependabot
209
211
  )
210
212
  return conflicts unless vulnerability_audit_performed?
211
213
 
212
- vulnerable = [vulnerability_audit].select do |hash|
213
- !hash["fix_available"] && hash["explanation"]
214
- end
214
+ audit = vulnerability_audit
215
+ vulnerable = !audit.fix_available && audit.explanation ? [audit.to_h] : []
215
216
 
216
217
  conflicts + vulnerable
217
218
  end
@@ -223,7 +224,7 @@ module Dependabot
223
224
  !!defined?(@vulnerability_audit)
224
225
  end
225
226
 
226
- sig { returns(T::Hash[String, T.untyped]) }
227
+ sig { returns(Audit) }
227
228
  def vulnerability_audit
228
229
  @vulnerability_audit ||=
229
230
  VulnerabilityAuditor.new(
@@ -256,12 +257,12 @@ module Dependabot
256
257
 
257
258
  return false unless security_advisories.any?
258
259
 
259
- vulnerability_audit["fix_available"]
260
+ vulnerability_audit.fix_available
260
261
  end
261
262
 
262
263
  sig { override.returns(T::Array[Dependabot::Dependency]) }
263
264
  def updated_dependencies_after_full_unlock
264
- return conflicting_updated_dependencies if security_advisories.any? && vulnerability_audit["fix_available"]
265
+ return conflicting_updated_dependencies if security_advisories.any? && vulnerability_audit.fix_available
265
266
 
266
267
  T.must(version_resolver.dependency_updates_from_full_unlock)
267
268
  .map { |update_details| build_updated_dependency(update_details.transform_keys(&:to_sym)) }
@@ -273,8 +274,8 @@ module Dependabot
273
274
  top_level_dependencies = top_level_dependency_lookup
274
275
 
275
276
  updated_deps = []
276
- vulnerability_audit["fix_updates"].each do |update|
277
- dependency_name = update["dependency_name"]
277
+ vulnerability_audit.fix_updates.each do |update|
278
+ dependency_name = update.dependency_name
278
279
  requirements = top_level_dependencies[dependency_name]&.requirements || []
279
280
 
280
281
  updated_deps << build_updated_dependency(
@@ -283,8 +284,8 @@ module Dependabot
283
284
  package_manager: "bun",
284
285
  requirements: requirements
285
286
  ),
286
- version: update["target_version"],
287
- previous_version: update["current_version"]
287
+ version: update.target_version,
288
+ previous_version: update.current_version
288
289
  )
289
290
  end
290
291
  # rubocop:enable Metrics/AbcSize
@@ -294,7 +295,7 @@ module Dependabot
294
295
  # to include it so it's described in the PR and we'll pass validation
295
296
  # that this dependency is at a non-vulnerable version.
296
297
  if updated_deps.none? { |dep| dep.name == dependency.name }
297
- target_version = vulnerability_audit["target_version"]
298
+ target_version = vulnerability_audit.target_version
298
299
  updated_deps << build_updated_dependency(
299
300
  dependency: dependency,
300
301
  version: target_version,
@@ -394,10 +395,8 @@ module Dependabot
394
395
  def latest_version_for_git_dependency
395
396
  @latest_version_for_git_dependency ||=
396
397
  if version_class.correct?(dependency.version)
397
- T.unsafe(
398
- latest_git_version_details[:version] &&
399
- version_class.new(latest_git_version_details[:version])
400
- )
398
+ version = latest_git_version_details[:version]
399
+ version && version_class.new(version)
401
400
  else
402
401
  latest_git_version_details[:sha]
403
402
  end
@@ -466,7 +465,7 @@ module Dependabot
466
465
  git_commit_checker.git_dependency?
467
466
  end
468
467
 
469
- sig { returns(T::Hash[Symbol, T.untyped]) }
468
+ sig { returns(T::Hash[Symbol, T.nilable(String)]) }
470
469
  def latest_git_version_details
471
470
  semver_req =
472
471
  dependency.requirements
@@ -478,8 +477,8 @@ module Dependabot
478
477
  if semver_req || git_commit_checker.pinned_ref_looks_like_version?
479
478
  latest_tag = git_commit_checker.local_tag_for_latest_version(update_cooldown)
480
479
  return {
481
- sha: latest_tag&.fetch(:commit_sha),
482
- version: latest_tag&.fetch(:tag)&.gsub(/^[^\d]*/, "")
480
+ sha: latest_tag&.commit_sha,
481
+ version: latest_tag&.tag&.gsub(/^[^\d]*/, "")
483
482
  }
484
483
  end
485
484
 
@@ -501,7 +500,7 @@ module Dependabot
501
500
  if git_commit_checker.pinned_ref_looks_like_version? &&
502
501
  !git_commit_checker.local_tag_for_latest_version(update_cooldown).nil?
503
502
  new_tag = git_commit_checker.local_tag_for_latest_version(update_cooldown)
504
- return dependency_source_details&.merge(ref: new_tag&.fetch(:tag))
503
+ return dependency_source_details&.merge(ref: new_tag&.tag)
505
504
  end
506
505
 
507
506
  # Otherwise return the original source
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-bun
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.392.0
4
+ version: 0.393.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.392.0
18
+ version: 0.393.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.392.0
25
+ version: 0.393.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -354,7 +354,7 @@ licenses:
354
354
  - MIT
355
355
  metadata:
356
356
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
357
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.392.0
357
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.393.0
358
358
  rdoc_options: []
359
359
  require_paths:
360
360
  - lib