dependabot-bun 0.304.0 → 0.306.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.
@@ -64,7 +64,7 @@ module Dependabot
64
64
  end
65
65
 
66
66
  def registry
67
- Bun::UpdateChecker::RegistryFinder.new(
67
+ Bun::Package::RegistryFinder.new(
68
68
  dependency: nil,
69
69
  credentials: credentials,
70
70
  npmrc_file: dependency_files.find { |f| f.name.end_with?(".npmrc") }
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
@@ -27,9 +27,9 @@ module Dependabot
27
27
 
28
28
  require_relative "latest_version_finder"
29
29
 
30
- TIGHTLY_COUPLED_MONOREPOS = {
30
+ TIGHTLY_COUPLED_MONOREPOS = T.let({
31
31
  "vue" => %w(vue vue-template-compiler)
32
- }.freeze
32
+ }.freeze, T::Hash[String, T::Array[String]])
33
33
 
34
34
  # Error message returned by `npm install` (for NPM 6):
35
35
  # react-dom@15.2.0 requires a peer of react@^15.2.0 \
@@ -54,19 +54,55 @@ module Dependabot
54
54
  npm\s(?:WARN|ERR!)\speer\s(?<required_dep>\S+@\S+(\s\S+)?)\sfrom\s(?<requiring_dep>\S+@\S+)
55
55
  /x
56
56
 
57
- def initialize(dependency:, credentials:, dependency_files:,
58
- latest_allowable_version:, latest_version_finder:, repo_contents_path:, dependency_group: nil)
57
+ sig do
58
+ params(
59
+ dependency: Dependabot::Dependency,
60
+ dependency_files: T::Array[Dependabot::DependencyFile],
61
+ credentials: T::Array[Dependabot::Credential],
62
+ latest_allowable_version: T.nilable(T.any(String, Gem::Version)),
63
+ latest_version_finder: T.any(LatestVersionFinder, PackageLatestVersionFinder),
64
+ repo_contents_path: T.nilable(String),
65
+ dependency_group: T.nilable(Dependabot::DependencyGroup),
66
+ raise_on_ignored: T::Boolean,
67
+ update_cooldown: T.nilable(Dependabot::Package::ReleaseCooldownOptions)
68
+ ).void
69
+ end
70
+ def initialize( # rubocop:disable Metrics/AbcSize
71
+ dependency:, dependency_files:, credentials:,
72
+ latest_allowable_version:, latest_version_finder:,
73
+ repo_contents_path:, dependency_group: nil,
74
+ raise_on_ignored: false, update_cooldown: nil
75
+ )
59
76
  @dependency = dependency
60
- @credentials = credentials
61
77
  @dependency_files = dependency_files
78
+ @credentials = credentials
62
79
  @latest_allowable_version = latest_allowable_version
63
80
  @dependency_group = dependency_group
64
81
 
65
- @latest_version_finder = {}
82
+ @latest_version_finder = T.let(
83
+ {},
84
+ T::Hash[Dependabot::Dependency, T.any(LatestVersionFinder, PackageLatestVersionFinder)
85
+ ]
86
+ )
66
87
  @latest_version_finder[dependency] = latest_version_finder
67
88
  @repo_contents_path = repo_contents_path
68
- end
69
-
89
+ @raise_on_ignored = raise_on_ignored
90
+ @update_cooldown = update_cooldown
91
+
92
+ @types_package = T.let(nil, T.nilable(Dependabot::Dependency))
93
+ @original_package = T.let(nil, T.nilable(Dependabot::Dependency))
94
+ @latest_types_package_version = T.let(nil, T.nilable(Dependabot::Version))
95
+ @dependency_files_builder = T.let(nil, T.nilable(DependencyFilesBuilder))
96
+ @resolve_latest_previous_version = T.let({}, T::Hash[Dependabot::Dependency, T.nilable(String)])
97
+ @paths_requiring_update_check = T.let(nil, T.nilable(T::Array[String]))
98
+ @top_level_dependencies = T.let(nil, T.nilable(T::Array[Dependabot::Dependency]))
99
+ @old_peer_dependency_errors = T.let(
100
+ nil, T.nilable(T::Array[T.any(T::Hash[String, T.nilable(String)], String)])
101
+ )
102
+ @peer_dependency_errors = T.let(nil, T.nilable(T::Array[T.any(T::Hash[String, T.nilable(String)], String)]))
103
+ end
104
+
105
+ sig { returns(T.nilable(T.any(String, Gem::Version))) }
70
106
  def latest_resolvable_version
71
107
  return latest_allowable_version if git_dependency?(dependency)
72
108
  return if part_of_tightly_locked_monorepo?
@@ -78,17 +114,24 @@ module Dependabot
78
114
  satisfying_versions.first
79
115
  end
80
116
 
117
+ sig { returns(T::Boolean) }
81
118
  def latest_version_resolvable_with_full_unlock?
82
119
  return false if dependency_updates_from_full_unlock.nil?
83
120
 
84
121
  true
85
122
  end
86
123
 
124
+ sig do
125
+ params(
126
+ updated_version: T.nilable(T.any(String, Gem::Version))
127
+ ).returns(T.nilable(T.any(String, Gem::Version)))
128
+ end
87
129
  def latest_resolvable_previous_version(updated_version)
88
130
  resolve_latest_previous_version(dependency, updated_version)
89
131
  end
90
132
 
91
133
  # rubocop:disable Metrics/PerceivedComplexity
134
+ sig { returns(T.nilable(T::Array[T::Hash[String, T.nilable(String)]])) }
92
135
  def dependency_updates_from_full_unlock
93
136
  return if git_dependency?(dependency)
94
137
  return updated_monorepo_dependencies if part_of_tightly_locked_monorepo?
@@ -131,28 +174,61 @@ module Dependabot
131
174
 
132
175
  sig { returns(Dependabot::Dependency) }
133
176
  attr_reader :dependency
134
- attr_reader :credentials
177
+ sig { returns(T::Array[Dependabot::DependencyFile]) }
135
178
  attr_reader :dependency_files
179
+ sig { returns(T::Array[Dependabot::Credential]) }
180
+ attr_reader :credentials
181
+ sig { returns(T.nilable(T.any(String, Gem::Version))) }
136
182
  attr_reader :latest_allowable_version
183
+ sig { returns(T.nilable(String)) }
137
184
  attr_reader :repo_contents_path
185
+ sig { returns(T.nilable(Dependabot::DependencyGroup)) }
138
186
  attr_reader :dependency_group
187
+ sig { returns(T.nilable(Dependabot::Package::ReleaseCooldownOptions)) }
188
+ attr_reader :update_cooldown
189
+ sig { returns(T::Boolean) }
190
+ attr_reader :raise_on_ignored
139
191
 
192
+ sig { params(dep: Dependabot::Dependency) .returns(T.any(LatestVersionFinder, PackageLatestVersionFinder)) }
140
193
  def latest_version_finder(dep)
141
194
  @latest_version_finder[dep] ||=
142
- LatestVersionFinder.new(
143
- dependency: dep,
144
- credentials: credentials,
145
- dependency_files: dependency_files,
146
- ignored_versions: [],
147
- security_advisories: []
148
- )
195
+ if enable_cooldown?
196
+ PackageLatestVersionFinder.new(
197
+ dependency: dep,
198
+ dependency_files: dependency_files,
199
+ credentials: credentials,
200
+ cooldown_options: update_cooldown,
201
+ ignored_versions: [],
202
+ security_advisories: [],
203
+ raise_on_ignored: raise_on_ignored
204
+ )
205
+ else
206
+ LatestVersionFinder.new(
207
+ dependency: dep,
208
+ credentials: credentials,
209
+ dependency_files: dependency_files,
210
+ ignored_versions: [],
211
+ security_advisories: [],
212
+ raise_on_ignored: raise_on_ignored
213
+ )
214
+ end
215
+ end
216
+
217
+ sig { returns(T::Boolean) }
218
+ def enable_cooldown?
219
+ Dependabot::Experiments.enabled?(:enable_cooldown_for_npm_and_yarn)
149
220
  end
150
221
 
151
222
  # rubocop:disable Metrics/PerceivedComplexity
223
+ sig do
224
+ params(
225
+ dep: Dependabot::Dependency,
226
+ updated_version: T.nilable(T.any(String, Gem::Version))
227
+ ).returns(T.nilable(String))
228
+ end
152
229
  def resolve_latest_previous_version(dep, updated_version)
153
230
  return dep.version if dep.version
154
231
 
155
- @resolve_latest_previous_version ||= {}
156
232
  @resolve_latest_previous_version[dep] ||= begin
157
233
  relevant_versions = latest_version_finder(dependency)
158
234
  .possible_previous_versions_with_details
@@ -183,6 +259,7 @@ module Dependabot
183
259
  end
184
260
  # rubocop:enable Metrics/PerceivedComplexity
185
261
 
262
+ sig { returns(T::Boolean) }
186
263
  def part_of_tightly_locked_monorepo?
187
264
  monorepo_dep_names =
188
265
  TIGHTLY_COUPLED_MONOREPOS.values
@@ -196,6 +273,7 @@ module Dependabot
196
273
  deps_to_update.count > 1
197
274
  end
198
275
 
276
+ sig { returns(T::Array[T::Hash[String, T.nilable(String)]]) }
199
277
  def updated_monorepo_dependencies
200
278
  monorepo_dep_names =
201
279
  TIGHTLY_COUPLED_MONOREPOS.values
@@ -203,7 +281,7 @@ module Dependabot
203
281
 
204
282
  deps_to_update =
205
283
  top_level_dependencies
206
- .select { |d| monorepo_dep_names.include?(d.name) }
284
+ .select { |d| monorepo_dep_names&.include?(d.name) }
207
285
 
208
286
  updates = []
209
287
  deps_to_update.each do |dep|
@@ -229,48 +307,71 @@ module Dependabot
229
307
  updates
230
308
  end
231
309
 
310
+ sig { returns(T.nilable(Dependabot::Dependency)) }
232
311
  def types_package
233
- @types_package ||= begin
312
+ return @types_package if @types_package
313
+
314
+ @types_package = begin
234
315
  types_package_name = PackageName.new(dependency.name).types_package_name
235
316
  top_level_dependencies.find { |d| types_package_name.to_s == d.name } if types_package_name
236
317
  end
318
+ @types_package
237
319
  end
238
320
 
321
+ sig { returns(T.nilable(Dependabot::Dependency)) }
239
322
  def original_package
240
- @original_package ||= begin
323
+ return @original_package if @original_package
324
+
325
+ @original_package = begin
241
326
  original_package_name = PackageName.new(dependency.name).library_name
242
327
  top_level_dependencies.find { |d| original_package_name.to_s == d.name } if original_package_name
243
328
  end
329
+ @original_package
244
330
  end
245
331
 
332
+ sig { returns(T.nilable(Dependabot::Version)) }
246
333
  def latest_types_package_version
247
- @latest_types_package_version ||= latest_version_finder(types_package).latest_version_from_registry
334
+ types_pkg = types_package
335
+ return unless types_pkg
336
+
337
+ return @latest_types_package_version if @latest_types_package_version
338
+
339
+ @latest_types_package_version = latest_version_finder(types_pkg).latest_version_from_registry
340
+ @latest_types_package_version
248
341
  end
249
342
 
343
+ sig { returns(T::Boolean) }
250
344
  def types_update_available?
251
- return false if types_package.nil?
345
+ types_pkg = types_package
346
+ return false unless types_pkg
252
347
 
253
- return false if latest_types_package_version.nil?
348
+ latest_types_version = latest_types_package_version
349
+ return false unless latest_types_version
254
350
 
255
- return false unless latest_allowable_version.backwards_compatible_with?(latest_types_package_version)
351
+ latest_allowable_ver = latest_allowable_version
352
+ return false unless latest_allowable_ver.is_a?(Version) && latest_allowable_ver.backwards_compatible_with?(
353
+ T.unsafe(latest_types_version)
354
+ )
256
355
 
257
- return false unless version_class.correct?(types_package.version)
356
+ return false unless version_class.correct?(types_pkg.version)
258
357
 
259
- current_types_package_version = version_class.new(types_package.version)
358
+ current_types_package_version = version_class.new(types_pkg.version)
260
359
 
261
- return false unless current_types_package_version < latest_types_package_version
360
+ return false unless current_types_package_version < latest_types_version
262
361
 
263
362
  true
264
363
  end
265
364
 
365
+ sig { returns(T::Boolean) }
266
366
  def original_package_update_available?
267
- return false if original_package.nil?
367
+ original_pack = original_package
368
+ return false unless original_pack
268
369
 
269
- return false unless version_class.correct?(original_package.version)
370
+ return false unless version_class.correct?(original_pack.version)
270
371
 
271
- original_package_version = version_class.new(original_package.version)
372
+ original_package_version = version_class.new(original_pack.version)
272
373
 
273
- latest_version = latest_version_finder(original_package).latest_version_from_registry
374
+ latest_version = latest_version_finder(original_pack).latest_version_from_registry
274
375
 
275
376
  # If the latest version is within the scope of the current requirements,
276
377
  # latest_version will be nil. In such cases, there is no update available.
@@ -279,41 +380,45 @@ module Dependabot
279
380
  original_package_version < latest_version
280
381
  end
281
382
 
383
+ sig { returns(T::Array[T::Hash[String, T.nilable(String)]]) }
282
384
  def updated_types_dependencies
283
385
  [{
284
386
  dependency: types_package,
285
387
  version: latest_types_package_version,
286
388
  previous_version: resolve_latest_previous_version(
287
- types_package, latest_types_package_version
389
+ T.must(types_package), T.cast(latest_types_package_version, Gem::Version)
288
390
  )
289
391
  }]
290
392
  end
291
393
 
394
+ sig { returns(T::Array[T.any(T::Hash[String, T.nilable(String)], String)]) }
292
395
  def peer_dependency_errors
293
- return @peer_dependency_errors if @peer_dependency_errors_checked
294
-
295
- @peer_dependency_errors_checked = true
396
+ return @peer_dependency_errors if @peer_dependency_errors
296
397
 
297
- @peer_dependency_errors =
298
- fetch_peer_dependency_errors(version: latest_allowable_version)
398
+ @peer_dependency_errors = fetch_peer_dependency_errors(version: latest_allowable_version)
399
+ @peer_dependency_errors
299
400
  end
300
401
 
402
+ sig { returns(T::Array[T.any(T::Hash[String, T.nilable(String)], String)]) }
301
403
  def old_peer_dependency_errors
302
- return @old_peer_dependency_errors if @old_peer_dependency_errors_checked
303
-
304
- @old_peer_dependency_errors_checked = true
404
+ return @old_peer_dependency_errors if @old_peer_dependency_errors
305
405
 
306
406
  version = version_for_dependency(dependency)
307
407
 
308
- @old_peer_dependency_errors =
309
- fetch_peer_dependency_errors(version: version)
408
+ @old_peer_dependency_errors = fetch_peer_dependency_errors(version: version)
409
+ @old_peer_dependency_errors
310
410
  end
311
411
 
412
+ sig do
413
+ params(
414
+ version: T.nilable(T.any(String, Gem::Version))
415
+ ).returns(T::Array[T.any(T::Hash[String, T.nilable(String)], String)])
416
+ end
312
417
  def fetch_peer_dependency_errors(version:)
313
418
  # TODO: Add all of the error handling that the FileUpdater does
314
419
  # here (since problematic repos will be resolved here before they're
315
420
  # seen by the FileUpdater)
316
- base_dir = dependency_files.first.directory
421
+ base_dir = T.must(dependency_files.first).directory
317
422
  SharedHelpers.in_a_temporary_repo_directory(base_dir, repo_contents_path) do
318
423
  dependency_files_builder.write_temporary_dependency_files
319
424
 
@@ -345,16 +450,22 @@ module Dependabot
345
450
  errors
346
451
  end
347
452
 
453
+ sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
348
454
  def unmet_peer_dependencies
349
455
  peer_dependency_errors
350
456
  .map { |captures| error_details_from_captures(captures) }
351
457
  end
352
458
 
459
+ sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
353
460
  def old_unmet_peer_dependencies
354
461
  old_peer_dependency_errors
355
462
  .map { |captures| error_details_from_captures(captures) }
356
463
  end
357
464
 
465
+ sig do
466
+ params(captures: T.any(T::Hash[String, T.nilable(String)], String))
467
+ .returns(T::Hash[Symbol, T.nilable(String)])
468
+ end
358
469
  def error_details_from_captures(captures)
359
470
  return {} unless captures.is_a?(Hash)
360
471
 
@@ -364,12 +475,13 @@ module Dependabot
364
475
 
365
476
  {
366
477
  requirement_name: required_dep_captures.sub(/@[^@]+$/, ""),
367
- requirement_version: required_dep_captures.split("@").last.delete('"'),
478
+ requirement_version: required_dep_captures.split("@").last&.delete('"'),
368
479
  requiring_dep_name: requiring_dep_captures.sub(/@[^@]+$/, "")
369
480
  }
370
481
  end
371
482
 
372
- def relevant_unmet_peer_dependencies
483
+ sig { returns(T::Array[T::Hash[Symbol, T.nilable(String)]]) }
484
+ def relevant_unmet_peer_dependencies # rubocop:disable Metrics/PerceivedComplexity
373
485
  relevant_unmet_peer_dependencies =
374
486
  unmet_peer_dependencies.select do |dep|
375
487
  dep[:requirement_name] == dependency.name ||
@@ -380,7 +492,7 @@ module Dependabot
380
492
  # Ignore unmet peer dependencies that are in the dependency group because
381
493
  # the update is also updating those dependencies.
382
494
  relevant_unmet_peer_dependencies.reject! do |dep|
383
- dependency_group.dependencies.any? do |group_dep|
495
+ dependency_group&.dependencies&.any? do |group_dep|
384
496
  dep[:requirement_name] == group_dep.name ||
385
497
  dep[:requiring_dep_name] == group_dep.name
386
498
  end
@@ -399,11 +511,13 @@ module Dependabot
399
511
  end
400
512
 
401
513
  # rubocop:disable Metrics/PerceivedComplexity
514
+ sig { returns(T::Array[T.any(String, Gem::Version)]) }
402
515
  def satisfying_versions
403
516
  latest_version_finder(dependency)
404
517
  .possible_versions_with_details
405
- .select do |version, details|
406
- next false unless satisfies_peer_reqs_on_dep?(version)
518
+ .select do |versions_with_details|
519
+ version, details = versions_with_details
520
+ next false unless satisfies_peer_reqs_on_dep?(T.unsafe(version))
407
521
  next true unless details["peerDependencies"]
408
522
  next true if version == version_for_dependency(dependency)
409
523
 
@@ -419,18 +533,18 @@ module Dependabot
419
533
  rescue Gem::Requirement::BadRequirementError
420
534
  false
421
535
  end
422
- end
423
- .map(&:first)
536
+ end.map(&:first)
424
537
  end
425
538
 
426
539
  # rubocop:enable Metrics/PerceivedComplexity
427
540
 
541
+ sig { params(version: T.nilable(T.any(String, Gem::Version))).returns(T::Boolean) }
428
542
  def satisfies_peer_reqs_on_dep?(version)
429
543
  newly_broken_peer_reqs_on_dep.all? do |peer_req|
430
544
  req = peer_req.fetch(:requirement_version)
431
545
 
432
546
  # Git requirements can't be satisfied by a version
433
- next false if req.include?("/")
547
+ next false if req&.include?("/")
434
548
 
435
549
  reqs = requirement_class.requirements_array(req)
436
550
  reqs.any? { |r| r.satisfied_by?(version) }
@@ -439,11 +553,16 @@ module Dependabot
439
553
  end
440
554
  end
441
555
 
442
- def latest_version_of_dep_with_satisfied_peer_reqs(dep)
443
- latest_version_finder(dep)
556
+ sig { params(dep: Dependabot::Dependency).returns(T.nilable(T.any(String, Gem::Version))) }
557
+ def latest_version_of_dep_with_satisfied_peer_reqs(dep) # rubocop:disable Metrics/PerceivedComplexity
558
+ dependency_version = version_for_dependency(dep)
559
+ version_with_detail =
560
+ latest_version_finder(dep)
444
561
  .possible_versions_with_details
445
- .find do |version, details|
446
- next false unless version > version_for_dependency(dep)
562
+ .find do |version_details|
563
+ version, details = version_details
564
+
565
+ next false unless !dependency_version || version > dependency_version
447
566
  next true unless details["peerDependencies"]
448
567
 
449
568
  details["peerDependencies"].all? do |peer_dep_name, req|
@@ -458,9 +577,10 @@ module Dependabot
458
577
  false
459
578
  end
460
579
  end
461
- &.first
580
+ version_with_detail.is_a?(Array) ? version_with_detail.first : version_with_detail
462
581
  end
463
582
 
583
+ sig { params(dep: Dependabot::Dependency).returns(T::Boolean) }
464
584
  def git_dependency?(dep)
465
585
  # ignored_version/raise_on_ignored are irrelevant.
466
586
  GitCommitChecker
@@ -468,22 +588,36 @@ module Dependabot
468
588
  .git_dependency?
469
589
  end
470
590
 
591
+ sig { returns(T::Array[T::Hash[Symbol, T.nilable(String)]]) }
471
592
  def newly_broken_peer_reqs_on_dep
472
593
  relevant_unmet_peer_dependencies
473
594
  .select { |dep| dep[:requirement_name] == dependency.name }
474
595
  end
475
596
 
597
+ sig { returns(T::Array[T::Hash[Symbol, T.nilable(String)]]) }
476
598
  def newly_broken_peer_reqs_from_dep
477
599
  relevant_unmet_peer_dependencies
478
600
  .select { |dep| dep[:requiring_dep_name] == dependency.name }
479
601
  end
480
602
 
603
+ sig do
604
+ params(
605
+ lockfiles: T::Array[Dependabot::DependencyFile],
606
+ path: String
607
+ ).returns(T::Array[Dependabot::DependencyFile])
608
+ end
481
609
  def lockfiles_for_path(lockfiles:, path:)
482
610
  lockfiles.select do |lockfile|
483
611
  File.dirname(lockfile.name) == File.dirname(path)
484
612
  end
485
613
  end
486
614
 
615
+ sig do
616
+ params(
617
+ path: String,
618
+ version: T.nilable(T.any(String, Gem::Version))
619
+ ).returns(T.nilable(T.any(T::Hash[String, T.untyped], String, T::Array[T::Hash[String, T.untyped]])))
620
+ end
487
621
  def run_checker(path:, version:)
488
622
  bun_lockfiles = lockfiles_for_path(lockfiles: dependency_files_builder.bun_locks, path: path)
489
623
  return run_bun_checker(path: path, version: version) if bun_lockfiles.any?
@@ -494,6 +628,12 @@ module Dependabot
494
628
  handle_peer_dependency_errors(e.message)
495
629
  end
496
630
 
631
+ sig do
632
+ params(
633
+ path: String,
634
+ version: T.nilable(T.any(String, Gem::Version))
635
+ ).returns(T.untyped)
636
+ end
497
637
  def run_bun_checker(path:, version:)
498
638
  SharedHelpers.with_git_configured(credentials: credentials) do
499
639
  Dir.chdir(path) do
@@ -505,6 +645,11 @@ module Dependabot
505
645
  end
506
646
  end
507
647
 
648
+ sig do
649
+ params(
650
+ version: T.nilable(T.any(String, Gem::Version))
651
+ ).returns(String)
652
+ end
508
653
  def version_install_arg(version:)
509
654
  git_source = dependency.requirements.find { |req| req[:source] && req[:source][:type] == "git" }
510
655
 
@@ -515,6 +660,12 @@ module Dependabot
515
660
  end
516
661
  end
517
662
 
663
+ sig do
664
+ params(
665
+ requirements: T::Array[T::Hash[Symbol, T.untyped]],
666
+ path: String
667
+ ).returns(T::Array[T::Hash[Symbol, T.untyped]])
668
+ end
518
669
  def requirements_for_path(requirements, path)
519
670
  return requirements if path.to_s == "."
520
671
 
@@ -528,31 +679,44 @@ module Dependabot
528
679
  # Top level dependencies are required in the peer dep checker
529
680
  # to fetch the manifests for all top level deps which may contain
530
681
  # "peerDependency" requirements
682
+ sig { returns(T::Array[Dependabot::Dependency]) }
531
683
  def top_level_dependencies
532
- @top_level_dependencies ||= Bun::FileParser.new(
684
+ return @top_level_dependencies if @top_level_dependencies
685
+
686
+ @top_level_dependencies = Bun::FileParser.new(
533
687
  dependency_files: dependency_files,
534
688
  source: nil,
535
689
  credentials: credentials
536
690
  ).parse.select(&:top_level?)
691
+ @top_level_dependencies
537
692
  end
538
693
 
694
+ sig { returns(T::Array[String]) }
539
695
  def paths_requiring_update_check
540
- @paths_requiring_update_check ||=
696
+ return @paths_requiring_update_check if @paths_requiring_update_check
697
+
698
+ @paths_requiring_update_check =
541
699
  DependencyFilesFilterer.new(
542
700
  dependency_files: dependency_files,
543
701
  updated_dependencies: [dependency]
544
702
  ).paths_requiring_update_check
703
+ @paths_requiring_update_check
545
704
  end
546
705
 
706
+ sig { returns(DependencyFilesBuilder) }
547
707
  def dependency_files_builder
548
- @dependency_files_builder ||=
708
+ return @dependency_files_builder if @dependency_files_builder
709
+
710
+ @dependency_files_builder =
549
711
  DependencyFilesBuilder.new(
550
712
  dependency: dependency,
551
713
  dependency_files: dependency_files,
552
714
  credentials: credentials
553
715
  )
716
+ @dependency_files_builder
554
717
  end
555
718
 
719
+ sig { params(dep: Dependabot::Dependency).returns(T.nilable(T.any(String, Gem::Version))) }
556
720
  def version_for_dependency(dep)
557
721
  return version_class.new(dep.version) if dep.version && version_class.correct?(dep.version)
558
722
 
@@ -565,14 +729,17 @@ module Dependabot
565
729
  .max
566
730
  end
567
731
 
732
+ sig { returns(T.class_of(Dependabot::Version)) }
568
733
  def version_class
569
734
  dependency.version_class
570
735
  end
571
736
 
737
+ sig { returns(T.class_of(Dependabot::Requirement)) }
572
738
  def requirement_class
573
739
  dependency.requirement_class
574
740
  end
575
741
 
742
+ sig { returns(String) }
576
743
  def version_regex
577
744
  Dependabot::Bun::Version::VERSION_PATTERN
578
745
  end