dependabot-npm_and_yarn 0.331.0 → 0.333.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: 3ead6dbe56920db49b2451679cdb66303af4c2968b7d61d37faf04ac9b0623a4
4
- data.tar.gz: fe8c3c14c55c99ad445105f89f54b5b6a8bd322661ba2bf64c36567d992fa4a0
3
+ metadata.gz: 7be0417677733584b0aa5f37a0c8633a20c930f0d97142aa5b40ff12ec8eddeb
4
+ data.tar.gz: 1bf3f2fb844f57104a4073c14cb7b02fa4eb5f48535161f0890c8d25f076db18
5
5
  SHA512:
6
- metadata.gz: a4e7fae1ef42c26ba9327815a93d1850e27dd17ef9d8a26eb85ac932ec817b6f14ce8312456cd024a07c63770fdfd4465e4eeae9628c7b167211c7fa7d65d778
7
- data.tar.gz: b92350117f5b5059b36a2a96c0da36e2e0d4d45c5ebaa8fe3698b69b17007ad4968a71e0f87a79eff1251b1ee80dc80836c97a7c71ee93c11aa0c0fd5004fee3
6
+ metadata.gz: 4638ea644ac982c9d4fe016b81b5b2b7e40a0fb286388eb6acf6abc1674531d6f71cb72536fb4963b104d0bd8f16c6e0ae2dc3f4dbb54624280e21386c88384d
7
+ data.tar.gz: 247ed7731f5ceac78c3886edb8fdf8ebaf4c98d6d955a186039fd320ddcce02c173a5e2c0503517e70c1910ce75f9348a0de176fe1d1059aa70aaefc48e5807c
@@ -5,6 +5,7 @@ module Dependabot
5
5
  module NpmAndYarn
6
6
  class BunPackageManager < Ecosystem::VersionManager
7
7
  extend T::Sig
8
+
8
9
  NAME = "bun"
9
10
  LOCKFILE_NAME = "bun.lock"
10
11
 
@@ -7,6 +7,7 @@ require "dependabot/experiments"
7
7
  require "dependabot/logger"
8
8
  require "dependabot/file_fetchers"
9
9
  require "dependabot/file_fetchers/base"
10
+ require "dependabot/file_filtering"
10
11
  require "dependabot/npm_and_yarn/helpers"
11
12
  require "dependabot/npm_and_yarn/package_manager"
12
13
  require "dependabot/npm_and_yarn/file_parser"
@@ -89,7 +90,13 @@ module Dependabot
89
90
  fetched_files += workspace_package_jsons
90
91
  fetched_files += path_dependencies(fetched_files)
91
92
 
92
- fetched_files.uniq
93
+ # Filter excluded files from final collection
94
+ filtered_files = fetched_files.uniq.reject do |file|
95
+ Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files) &&
96
+ !@exclude_paths.empty? && Dependabot::FileFiltering.exclude_path?(file.name, @exclude_paths)
97
+ end
98
+
99
+ filtered_files
93
100
  end
94
101
 
95
102
  private
@@ -371,7 +378,7 @@ module Dependabot
371
378
 
372
379
  # rubocop:disable Metrics/PerceivedComplexity
373
380
  sig { params(fetched_files: T::Array[DependencyFile]).returns(T::Array[DependencyFile]) }
374
- def path_dependencies(fetched_files)
381
+ def path_dependencies(fetched_files) # rubocop:disable Metrics/AbcSize
375
382
  package_json_files = T.let([], T::Array[DependencyFile])
376
383
  unfetchable_deps = T.let([], T::Array[[String, String]])
377
384
 
@@ -390,6 +397,16 @@ module Dependabot
390
397
  cleaned_name = Pathname.new(filename).cleanpath.to_path
391
398
  next if fetched_files.map(&:name).include?(cleaned_name)
392
399
 
400
+ # Skip excluded path dependencies
401
+ if Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files) &&
402
+ !@exclude_paths.empty? && Dependabot::FileFiltering.exclude_path?(cleaned_name, @exclude_paths)
403
+ Dependabot.logger.warn(
404
+ "Skipping excluded path dependency '#{cleaned_name}' for package '#{name}'. " \
405
+ "This file is excluded by exclude_paths configuration: #{@exclude_paths}"
406
+ )
407
+ next
408
+ end
409
+
393
410
  begin
394
411
  file = fetch_file_from_host(filename, fetch_submodules: true)
395
412
  package_json_files << file
@@ -610,6 +627,16 @@ module Dependabot
610
627
  def fetch_package_json_if_present(workspace)
611
628
  file = File.join(workspace, MANIFEST_FILENAME)
612
629
 
630
+ # Skip excluded workspace packages
631
+ if Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files) &&
632
+ !@exclude_paths.empty? && Dependabot::FileFiltering.exclude_path?(file, @exclude_paths)
633
+ Dependabot.logger.info(
634
+ "Skipping excluded workspace package '#{file}' from workspace '#{workspace}'. " \
635
+ "This file is excluded by exclude_paths configuration: #{@exclude_paths}"
636
+ )
637
+ return nil
638
+ end
639
+
613
640
  begin
614
641
  fetch_file_from_host(file)
615
642
  rescue Dependabot::DependencyFileNotFound
@@ -40,8 +40,6 @@ module Dependabot
40
40
  def dependencies
41
41
  dependency_set = Dependabot::FileParsers::Base::DependencySet.new
42
42
 
43
- origin_file = Pathname.new(@dependency_file.directory).join(@dependency_file.name).to_s
44
-
45
43
  # bun.lock v0 format:
46
44
  # https://github.com/oven-sh/bun/blob/c130df6c589fdf28f9f3c7f23ed9901140bc9349/src/install/bun.lock.zig#L595-L605
47
45
 
@@ -64,8 +62,7 @@ module Dependabot
64
62
  name: name,
65
63
  version: semver.to_s,
66
64
  package_manager: "npm_and_yarn",
67
- requirements: [],
68
- origin_files: [origin_file]
65
+ requirements: []
69
66
  )
70
67
  end
71
68
 
@@ -15,9 +15,6 @@ module Dependabot
15
15
  sig { params(dependency_file: DependencyFile).void }
16
16
  def initialize(dependency_file)
17
17
  @dependency_file = dependency_file
18
- # Set this file to priority 1 to indicate it should override manifests for purposes of a graph
19
- dependency_file.priority = 1
20
- @direct_dependencies = T.let(fetch_direct_dependencies, T::Array[String])
21
18
  end
22
19
 
23
20
  sig { returns(T::Hash[String, T.untyped]) }
@@ -51,36 +48,11 @@ module Dependabot
51
48
 
52
49
  private
53
50
 
54
- # Only V3 lockfiles contain information on the package itself, so we use `npm ls` to generate
55
- # a graph we can pluck the direct dependency list from at parse-time for this lockfile.
56
- sig { returns(T::Array[String]) }
57
- def fetch_direct_dependencies
58
- # TODO(brrygrdn): Implement a 'verbose' flag that runs this extra step?
59
- #
60
- # For now, don't run this extra native command if we aren't using the submission experiment
61
- return [] unless Dependabot::Experiments.enabled?(:enable_dependency_submission_poc)
62
-
63
- SharedHelpers.in_a_temporary_repo_directory do |_|
64
- write_temporary_dependency_files
65
-
66
- npm_ls_json = Helpers.run_npm_command("ls --all --package-lock-only --json")
67
-
68
- JSON.parse(npm_ls_json).fetch("dependencies", {}).keys
69
- end
70
- end
71
-
72
- sig { void }
73
- def write_temporary_dependency_files
74
- path = @dependency_file.name
75
- FileUtils.mkdir_p(Pathname.new(path).dirname)
76
- File.write(path, @dependency_file.content)
77
- end
78
-
79
51
  sig do
80
52
  params(object_with_dependencies: T::Hash[String, T.untyped])
81
53
  .returns(Dependabot::FileParsers::Base::DependencySet)
82
54
  end
83
- def recursively_fetch_dependencies(object_with_dependencies) # rubocop:disable Metrics/AbcSize
55
+ def recursively_fetch_dependencies(object_with_dependencies)
84
56
  dependency_set = Dependabot::FileParsers::Base::DependencySet.new
85
57
 
86
58
  dependencies = object_with_dependencies["dependencies"]
@@ -95,18 +67,14 @@ module Dependabot
95
67
  package_name = name.split("node_modules/").last
96
68
  version = version.to_s
97
69
 
98
- origin_file = Pathname.new(@dependency_file.directory).join(@dependency_file.name).to_s
99
-
100
70
  dependency_args = {
101
71
  name: package_name,
102
72
  version: version,
103
73
  package_manager: "npm_and_yarn",
104
74
  requirements: [],
105
- direct_relationship: @direct_dependencies.include?(package_name),
106
75
  metadata: {
107
76
  depends_on: details&.fetch("dependencies", {})&.keys || []
108
- },
109
- origin_files: [origin_file]
77
+ }
110
78
  }
111
79
 
112
80
  if details["bundled"]
@@ -123,7 +91,6 @@ module Dependabot
123
91
  dependency_set += recursively_fetch_dependencies(details)
124
92
  end
125
93
 
126
- @dependency_file.dependencies = dependency_set.dependencies.to_set
127
94
  dependency_set
128
95
  end
129
96
 
@@ -75,8 +75,6 @@ module Dependabot
75
75
  end
76
76
  end
77
77
 
78
- origin_file = Pathname.new(@dependency_file.directory).join(@dependency_file.name).to_s
79
-
80
78
  # Add prioritized dependencies to the dependency set.
81
79
  dependencies_with_specifiers.each do |dependency_args|
82
80
  dependency_set << Dependency.new(
@@ -84,8 +82,7 @@ module Dependabot
84
82
  version: dependency_args[:version],
85
83
  package_manager: dependency_args[:package_manager],
86
84
  requirements: dependency_args[:requirements],
87
- subdependency_metadata: dependency_args[:subdependency_metadata],
88
- origin_files: [origin_file]
85
+ subdependency_metadata: dependency_args[:subdependency_metadata]
89
86
  )
90
87
  end
91
88
 
@@ -95,8 +92,7 @@ module Dependabot
95
92
  version: dependency_args[:version],
96
93
  package_manager: dependency_args[:package_manager],
97
94
  requirements: dependency_args[:requirements],
98
- subdependency_metadata: dependency_args[:subdependency_metadata],
99
- origin_files: [origin_file]
95
+ subdependency_metadata: dependency_args[:subdependency_metadata]
100
96
  )
101
97
  end
102
98
 
@@ -46,8 +46,6 @@ module Dependabot
46
46
  def dependencies
47
47
  dependency_set = Dependabot::FileParsers::Base::DependencySet.new
48
48
 
49
- origin_file = Pathname.new(@dependency_file.directory).join(@dependency_file.name).to_s
50
-
51
49
  parsed.each do |reqs, details|
52
50
  reqs.split(", ").each do |req|
53
51
  version = Version.semver_for(details["version"])
@@ -60,8 +58,7 @@ module Dependabot
60
58
  name: T.must(req.split(/(?<=\w)\@/).first),
61
59
  version: version.to_s,
62
60
  package_manager: "npm_and_yarn",
63
- requirements: [],
64
- origin_files: [origin_file]
61
+ requirements: []
65
62
  )
66
63
  end
67
64
  end
@@ -226,10 +226,7 @@ module Dependabot
226
226
  dep = build_dependency(
227
227
  file: file, type: type, name: name, requirement: requirement
228
228
  )
229
- if dep
230
- file.dependencies << dep
231
- dependency_set << dep
232
- end
229
+ dependency_set << dep if dep
233
230
  end
234
231
  end
235
232
 
@@ -302,8 +299,6 @@ module Dependabot
302
299
  # Example: "my-fetch-factory@npm:fetch-factory"
303
300
  return if aliased_package_name?(name)
304
301
 
305
- origin_file = Pathname.new(file.directory).join(file.name).to_s
306
-
307
302
  Dependency.new(
308
303
  name: name,
309
304
  version: converted_version,
@@ -313,8 +308,7 @@ module Dependabot
313
308
  file: file.name,
314
309
  groups: [type],
315
310
  source: source_for(name, requirement, lockfile_details)
316
- }],
317
- origin_files: [origin_file]
311
+ }]
318
312
  )
319
313
  end
320
314
 
@@ -207,8 +207,7 @@ module Dependabot
207
207
  version: d.previous_version,
208
208
  previous_version: d.previous_version,
209
209
  requirements: T.must(d.previous_requirements),
210
- previous_requirements: d.previous_requirements,
211
- origin_files: d.origin_files
210
+ previous_requirements: d.previous_requirements
212
211
  )
213
212
  end
214
213
 
@@ -219,8 +218,7 @@ module Dependabot
219
218
  version: d.previous_version,
220
219
  previous_version: d.previous_version,
221
220
  requirements: [],
222
- previous_requirements: [],
223
- origin_files: d.origin_files
221
+ previous_requirements: []
224
222
  )
225
223
  end
226
224
 
@@ -167,7 +167,6 @@ module Dependabot
167
167
  end
168
168
  end
169
169
 
170
- # rubocop:disable Metrics/AbcSize
171
170
  sig { returns(T.nilable(T::Array[String])) }
172
171
  def dependency_urls
173
172
  return @dependency_urls if defined?(@dependency_urls)
@@ -191,8 +190,7 @@ module Dependabot
191
190
  if npm_lockfile
192
191
  @dependency_urls +=
193
192
  T.must(npm_lockfile.content).scan(/"resolved"\s*:\s*"(.*)"/)
194
- .flatten
195
- .select { |url| url.is_a?(String) }
193
+ .flatten.grep(String)
196
194
  .reject { |url| url.start_with?("git") }
197
195
  end
198
196
  if yarn_lock
@@ -210,8 +208,6 @@ module Dependabot
210
208
  T.nilable(T::Array[String])
211
209
  )
212
210
  end
213
- # rubocop:enable Metrics/AbcSize
214
-
215
211
  sig { returns(String) }
216
212
  def complete_npmrc_from_credentials
217
213
  # removes attribute timeout to allow for job update,
@@ -60,7 +60,7 @@ module Dependabot
60
60
  )
61
61
 
62
62
  if Dependabot::Experiments.enabled?(:avoid_duplicate_updates_package_json) &&
63
- (content == new_content && unique_deps_count > 1)
63
+ content == new_content && unique_deps_count > 1
64
64
 
65
65
  # (we observed that) package.json does not always contains the same dependencies compared to
66
66
  # "dependencies" list, for example, dependencies object can contain same name dependency "dep"=> "1.0.0"
@@ -80,10 +80,10 @@ module Dependabot
80
80
  IRRESOLVABLE_PACKAGE = "ERR_PNPM_NO_MATCHING_VERSION"
81
81
  INVALID_REQUIREMENT = "ERR_PNPM_SPEC_NOT_SUPPORTED_BY_ANY_RESOLVER"
82
82
  UNREACHABLE_GIT = %r{Command failed with exit code 128: git ls-remote (?<url>.*github\.com/[^/]+/[^ ]+)}
83
- UNREACHABLE_GIT_V8 = %r{ERR_PNPM_FETCH_404[ [^:print:]]+GET (?<url>https://codeload\.github\.com/[^/]+/[^/]+)/}
84
- FORBIDDEN_PACKAGE = /ERR_PNPM_FETCH_403[ [^:print:]]+GET (?<dependency_url>.*): Forbidden - 403/
85
- MISSING_PACKAGE = /ERR_PNPM_FETCH_404[ [^:print:]]+GET (?<dependency_url>.*): (?:Not Found)? - 404/
86
- UNAUTHORIZED_PACKAGE = /ERR_PNPM_FETCH_401[ [^:print:]]+GET (?<dependency_url>.*): Unauthorized - 401/
83
+ UNREACHABLE_GIT_V8 = %r{ERR_PNPM_FETCH_404[ [^:print]]+GET (?<url>https://codeload\.github\.com/[^/]+/[^/]+)/}
84
+ FORBIDDEN_PACKAGE = /ERR_PNPM_FETCH_403[ [^:print]]+GET (?<dependency_url>.*): Forbidden - 403/
85
+ MISSING_PACKAGE = /ERR_PNPM_FETCH_404[ [^:print]]+GET (?<dependency_url>.*): (?:Not Found)? - 404/
86
+ UNAUTHORIZED_PACKAGE = /ERR_PNPM_FETCH_401[ [^:print]]+GET (?<dependency_url>.*): Unauthorized - 401/
87
87
 
88
88
  # ERR_PNPM_FETCH ERROR CODES
89
89
  ERR_PNPM_FETCH_401 = /ERR_PNPM_FETCH_401.*GET (?<dependency_url>.*):/
@@ -7,6 +7,7 @@ module Dependabot
7
7
  module NpmAndYarn
8
8
  class Language < Ecosystem::VersionManager
9
9
  extend T::Sig
10
+
10
11
  NAME = "node"
11
12
 
12
13
  SUPPORTED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
@@ -56,7 +56,7 @@ module Dependabot
56
56
  def npm_releaser
57
57
  all_version_listings
58
58
  .find { |v, _| v == dependency.version }
59
- &.last&.fetch("_npmUser", nil)&.fetch("name", nil)
59
+ &.last&.dig("_npmUser", "name")
60
60
  end
61
61
 
62
62
  sig { returns(T.nilable(T::Array[String])) }
@@ -73,7 +73,7 @@ module Dependabot
73
73
 
74
74
  all_version_listings
75
75
  .reject { |v, _| Time.parse(times[v]) > cutoff }
76
- .filter_map { |_, d| d.fetch("_npmUser", nil)&.fetch("name", nil) }
76
+ .filter_map { |_, d| d.dig("_npmUser", "name") }
77
77
  end
78
78
 
79
79
  sig { returns(T.nilable(Dependabot::Source)) }
@@ -7,6 +7,7 @@ module Dependabot
7
7
  module NpmAndYarn
8
8
  class NpmPackageManager < Ecosystem::VersionManager
9
9
  extend T::Sig
10
+
10
11
  NAME = "npm"
11
12
  RC_FILENAME = ".npmrc"
12
13
  LOCKFILE_NAME = "package-lock.json"
@@ -7,6 +7,7 @@ module Dependabot
7
7
  module NpmAndYarn
8
8
  class PNPMPackageManager < Ecosystem::VersionManager
9
9
  extend T::Sig
10
+
10
11
  NAME = "pnpm"
11
12
  LOCKFILE_NAME = "pnpm-lock.yaml"
12
13
  PNPM_WS_YML_FILENAME = "pnpm-workspace.yaml"
@@ -154,7 +154,7 @@ module Dependabot
154
154
  updated_requirement =
155
155
  if reqs.any? { |r| r.match?(/(<|-\s)/i) }
156
156
  update_range_requirement(current_requirement)
157
- elsif current_requirement.strip.split(SEPARATOR).count == 1
157
+ elsif current_requirement.strip.split(SEPARATOR).one?
158
158
  update_version_string(current_requirement)
159
159
  else
160
160
  current_requirement
@@ -174,7 +174,7 @@ module Dependabot
174
174
  range_requirements =
175
175
  req_string.split(SEPARATOR).select { |r| r.match?(/<|(\s+-\s+)/) }
176
176
 
177
- if range_requirements.count == 1
177
+ if range_requirements.one?
178
178
  range_requirement = T.must(range_requirements.first)
179
179
  versions = range_requirement.scan(VERSION_REGEX)
180
180
  version_objects = versions.map { |v| version_class.new(v.to_s) }
@@ -11,6 +11,7 @@ module Dependabot
11
11
  module NpmAndYarn
12
12
  class UpdateChecker < Dependabot::UpdateCheckers::Base # rubocop:disable Metrics/ClassLength
13
13
  extend T::Sig
14
+
14
15
  require_relative "update_checker/requirements_updater"
15
16
  require_relative "update_checker/library_detector"
16
17
  require_relative "update_checker/latest_version_finder"
@@ -31,7 +32,6 @@ module Dependabot
31
32
  requirements_update_strategy: T.nilable(Dependabot::RequirementsUpdateStrategy),
32
33
  dependency_group: T.nilable(Dependabot::DependencyGroup),
33
34
  update_cooldown: T.nilable(Dependabot::Package::ReleaseCooldownOptions),
34
- exclude_paths: T.nilable(T::Array[String]),
35
35
  options: T::Hash[Symbol, T.untyped]
36
36
  )
37
37
  .void
@@ -40,7 +40,7 @@ module Dependabot
40
40
  repo_contents_path: nil, ignored_versions: [],
41
41
  raise_on_ignored: false, security_advisories: [],
42
42
  requirements_update_strategy: nil, dependency_group: nil,
43
- update_cooldown: nil, exclude_paths: [], options: {})
43
+ update_cooldown: nil, options: {})
44
44
  @latest_version = T.let(nil, T.nilable(T.any(String, Gem::Version)))
45
45
  @latest_resolvable_version = T.let(nil, T.nilable(T.any(String, Dependabot::Version)))
46
46
  @updated_requirements = T.let(nil, T.nilable(T::Array[T::Hash[Symbol, T.untyped]]))
@@ -7,6 +7,7 @@ module Dependabot
7
7
  module NpmAndYarn
8
8
  class YarnPackageManager < Ecosystem::VersionManager
9
9
  extend T::Sig
10
+
10
11
  NAME = "yarn"
11
12
  RC_FILENAME = ".yarnrc"
12
13
  RC_YML_FILENAME = ".yarnrc.yml"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-npm_and_yarn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.331.0
4
+ version: 0.333.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.331.0
18
+ version: 0.333.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.331.0
25
+ version: 0.333.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -211,14 +211,14 @@ dependencies:
211
211
  requirements:
212
212
  - - "~>"
213
213
  - !ruby/object:Gem::Version
214
- version: '3.18'
214
+ version: '3.25'
215
215
  type: :development
216
216
  prerelease: false
217
217
  version_requirements: !ruby/object:Gem::Requirement
218
218
  requirements:
219
219
  - - "~>"
220
220
  - !ruby/object:Gem::Version
221
- version: '3.18'
221
+ version: '3.25'
222
222
  - !ruby/object:Gem::Dependency
223
223
  name: webrick
224
224
  requirement: !ruby/object:Gem::Requirement
@@ -362,7 +362,7 @@ licenses:
362
362
  - MIT
363
363
  metadata:
364
364
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
365
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.331.0
365
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.333.0
366
366
  rdoc_options: []
367
367
  require_paths:
368
368
  - lib