dependabot-common 0.393.0 → 0.394.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 +4 -4
- data/lib/dependabot/errors.rb +4 -1
- data/lib/dependabot/file_fetchers/base.rb +3 -11
- data/lib/dependabot/file_filtering.rb +0 -2
- data/lib/dependabot/package/npm_package_manager_config.rb +72 -0
- data/lib/dependabot/package/npm_registry_package.rb +186 -0
- data/lib/dependabot.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 56fd73092967bcc3c61c5380d818f4802319503d4ef71fe825cc0433e928e6a9
|
|
4
|
+
data.tar.gz: c2d55c57dc9a06af239f6f2797c65df21837495afa5c00da8435a0810fd8af30
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9051406a2bb191fc74abe230325d756939a54c84588c78c55ddc44e2a03452e2c57952cb8791f1b2f5f3cdfe9317fbabb01aa4ac00da1be8a30d2274bae835eb
|
|
7
|
+
data.tar.gz: e11299a8ef1eea997446cc50ea216a0615c54875a7a34ce5482f001be1bf038e0700fba9b5e3425aa6d931da753fac54c48f782365755006310651487cfff192
|
data/lib/dependabot/errors.rb
CHANGED
|
@@ -580,7 +580,10 @@ module Dependabot
|
|
|
580
580
|
end
|
|
581
581
|
def initialize(tool_name, tool_message)
|
|
582
582
|
@tool_name = tool_name
|
|
583
|
-
|
|
583
|
+
# Sanitize here as well as via `super`: the raw `tool_message` attribute is read
|
|
584
|
+
# directly during error serialization (see `updater_error_details`), so it must not
|
|
585
|
+
# carry credentials (e.g. basic-auth URLs) that the base message sanitization strips.
|
|
586
|
+
@tool_message = T.let(filter_sensitive_data(tool_message), String)
|
|
584
587
|
|
|
585
588
|
msg = "Dependabot detected that #{tool_name} is misconfigured in this repository. " \
|
|
586
589
|
"Running `#{tool_name.downcase}` results in the following error: #{tool_message}"
|
|
@@ -503,7 +503,7 @@ module Dependabot
|
|
|
503
503
|
params(path: String, fetch_submodules: T::Boolean, raise_errors: T::Boolean)
|
|
504
504
|
.returns(T::Array[RepositoryContent])
|
|
505
505
|
end
|
|
506
|
-
def _fetch_repo_contents(path, fetch_submodules: false, raise_errors: true)
|
|
506
|
+
def _fetch_repo_contents(path, fetch_submodules: false, raise_errors: true)
|
|
507
507
|
path = path.gsub(" ", "%20")
|
|
508
508
|
specification = _full_specification_for(path, fetch_submodules: fetch_submodules)
|
|
509
509
|
provider = specification.provider
|
|
@@ -512,11 +512,7 @@ module Dependabot
|
|
|
512
512
|
commit = specification.commit
|
|
513
513
|
|
|
514
514
|
entries = _fetch_repo_contents_fully_specified(provider, repo, tmp_path, commit)
|
|
515
|
-
|
|
516
|
-
filter_excluded(entries)
|
|
517
|
-
else
|
|
518
|
-
entries
|
|
519
|
-
end
|
|
515
|
+
filter_excluded(entries)
|
|
520
516
|
rescue *CLIENT_NOT_FOUND_ERRORS
|
|
521
517
|
raise Dependabot::DirectoryNotFound, directory if path == directory.gsub(%r{^/*}, "")
|
|
522
518
|
|
|
@@ -597,11 +593,7 @@ module Dependabot
|
|
|
597
593
|
size: 0 # NOTE: added for parity with github contents API
|
|
598
594
|
)
|
|
599
595
|
end
|
|
600
|
-
|
|
601
|
-
filter_excluded(entries)
|
|
602
|
-
else
|
|
603
|
-
entries
|
|
604
|
-
end
|
|
596
|
+
filter_excluded(entries)
|
|
605
597
|
end
|
|
606
598
|
|
|
607
599
|
# Filters out any entries whose paths match one of the exclude_paths globs.
|
|
@@ -90,8 +90,6 @@ module Dependabot
|
|
|
90
90
|
).returns(T::Boolean)
|
|
91
91
|
end
|
|
92
92
|
def self.should_exclude_path?(path, context, exclude_paths)
|
|
93
|
-
return false unless Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files)
|
|
94
|
-
|
|
95
93
|
return false if exclude_paths.nil? || exclude_paths.empty?
|
|
96
94
|
|
|
97
95
|
should_exclude = exclude_path?(path, exclude_paths)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
|
|
6
|
+
module Dependabot
|
|
7
|
+
module Package
|
|
8
|
+
class NpmPackageManagerConfig < T::ImmutableStruct
|
|
9
|
+
extend T::Sig
|
|
10
|
+
|
|
11
|
+
ObjectHash = T.type_alias { T::Hash[String, Object] }
|
|
12
|
+
|
|
13
|
+
const :package_manager, T.nilable(String), default: nil
|
|
14
|
+
const :engines, T.nilable(T::Hash[String, String]), default: nil
|
|
15
|
+
|
|
16
|
+
sig { params(package_json: T.nilable(Object)).returns(NpmPackageManagerConfig) }
|
|
17
|
+
def self.from_package_json(package_json)
|
|
18
|
+
return new if package_json.nil?
|
|
19
|
+
|
|
20
|
+
manifest = object_hash(package_json, "package.json")
|
|
21
|
+
|
|
22
|
+
new(
|
|
23
|
+
package_manager: optional_string(manifest["packageManager"], "packageManager"),
|
|
24
|
+
engines: parse_engines(manifest)
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
sig { params(manifest: ObjectHash).returns(T.nilable(T::Hash[String, String])) }
|
|
29
|
+
def self.parse_engines(manifest)
|
|
30
|
+
return unless manifest.key?("engines")
|
|
31
|
+
|
|
32
|
+
raw_engines = manifest["engines"]
|
|
33
|
+
return if raw_engines.nil?
|
|
34
|
+
|
|
35
|
+
engines = T.let({}, T::Hash[String, String])
|
|
36
|
+
object_hash(raw_engines, "engines").each do |name, raw_requirement|
|
|
37
|
+
next if raw_requirement.nil?
|
|
38
|
+
|
|
39
|
+
raise TypeError, "engines.#{name} must be a string" unless raw_requirement.is_a?(String)
|
|
40
|
+
|
|
41
|
+
engines[name] = raw_requirement
|
|
42
|
+
end
|
|
43
|
+
engines
|
|
44
|
+
end
|
|
45
|
+
private_class_method :parse_engines
|
|
46
|
+
|
|
47
|
+
sig { params(value: Object, context: String).returns(ObjectHash) }
|
|
48
|
+
def self.object_hash(value, context)
|
|
49
|
+
raise TypeError, "#{context} must be an object" unless value.is_a?(Hash)
|
|
50
|
+
|
|
51
|
+
result = T.let({}, ObjectHash)
|
|
52
|
+
value.each do |raw_key, raw_value|
|
|
53
|
+
key = T.cast(raw_key, Object)
|
|
54
|
+
raise TypeError, "#{context} keys must be strings" unless key.is_a?(String)
|
|
55
|
+
|
|
56
|
+
result[key] = T.cast(raw_value, Object)
|
|
57
|
+
end
|
|
58
|
+
result
|
|
59
|
+
end
|
|
60
|
+
private_class_method :object_hash
|
|
61
|
+
|
|
62
|
+
sig { params(value: T.nilable(Object), context: String).returns(T.nilable(String)) }
|
|
63
|
+
def self.optional_string(value, context)
|
|
64
|
+
return if value.nil?
|
|
65
|
+
return value if value.is_a?(String)
|
|
66
|
+
|
|
67
|
+
raise TypeError, "#{context} must be a string"
|
|
68
|
+
end
|
|
69
|
+
private_class_method :optional_string
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "json"
|
|
5
|
+
require "time"
|
|
6
|
+
require "sorbet-runtime"
|
|
7
|
+
|
|
8
|
+
module Dependabot
|
|
9
|
+
module Package
|
|
10
|
+
class NpmRegistryPackage < T::ImmutableStruct
|
|
11
|
+
extend T::Sig
|
|
12
|
+
|
|
13
|
+
ObjectHash = T.type_alias { T::Hash[String, Object] }
|
|
14
|
+
VersionFilter = T.type_alias { T.proc.params(version: String).returns(T::Boolean) }
|
|
15
|
+
|
|
16
|
+
class Repository < T::ImmutableStruct
|
|
17
|
+
extend T::Sig
|
|
18
|
+
|
|
19
|
+
const :git, T::Boolean
|
|
20
|
+
const :url, T.nilable(String), default: nil
|
|
21
|
+
const :type, T.nilable(String), default: nil
|
|
22
|
+
|
|
23
|
+
sig { returns(T::Boolean) }
|
|
24
|
+
def git?
|
|
25
|
+
git
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class Release < T::ImmutableStruct
|
|
30
|
+
extend T::Sig
|
|
31
|
+
|
|
32
|
+
const :version, String
|
|
33
|
+
const :released_at, T.nilable(Time), default: nil
|
|
34
|
+
const :node_requirement, T.nilable(String), default: nil
|
|
35
|
+
const :repository, T.nilable(Repository), default: nil
|
|
36
|
+
const :details, ObjectHash
|
|
37
|
+
|
|
38
|
+
sig { returns(String) }
|
|
39
|
+
def package_type
|
|
40
|
+
repository&.git? ? "git" : "npm"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
const :releases, T::Hash[String, Release]
|
|
45
|
+
const :dist_tags, T.nilable(T::Hash[String, String]), default: nil
|
|
46
|
+
|
|
47
|
+
sig { params(json: String, version_filter: VersionFilter).returns(NpmRegistryPackage) }
|
|
48
|
+
def self.from_json(json, &version_filter)
|
|
49
|
+
parsed = T.cast(JSON.parse(json), Object)
|
|
50
|
+
package = object_hash(parsed, "npm registry package")
|
|
51
|
+
|
|
52
|
+
versions = package["versions"]
|
|
53
|
+
times = package["time"]
|
|
54
|
+
dist_tags = package["dist-tags"]
|
|
55
|
+
|
|
56
|
+
release_details = versions.nil? ? {} : object_hash(versions, "versions")
|
|
57
|
+
accepted_versions = T.let({}, T::Hash[String, T::Boolean])
|
|
58
|
+
release_details.each_key do |version|
|
|
59
|
+
accepted_versions[version] = true if yield(version)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
release_times = if times.nil?
|
|
63
|
+
{}
|
|
64
|
+
else
|
|
65
|
+
string_map(times, "time", included_keys: accepted_versions)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
releases = T.let({}, T::Hash[String, Release])
|
|
69
|
+
release_details.each do |version, details|
|
|
70
|
+
next unless accepted_versions.key?(version)
|
|
71
|
+
|
|
72
|
+
releases[version] = parse_release(
|
|
73
|
+
version: version,
|
|
74
|
+
details: details,
|
|
75
|
+
released_at: release_times[version]
|
|
76
|
+
)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
new(
|
|
80
|
+
releases: releases,
|
|
81
|
+
dist_tags: dist_tags.nil? ? nil : string_map(dist_tags, "dist-tags")
|
|
82
|
+
)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
sig do
|
|
86
|
+
params(
|
|
87
|
+
version: String,
|
|
88
|
+
details: Object,
|
|
89
|
+
released_at: T.nilable(String)
|
|
90
|
+
).returns(Release)
|
|
91
|
+
end
|
|
92
|
+
def self.parse_release(version:, details:, released_at:)
|
|
93
|
+
details_hash = object_hash(details, "version #{version} details")
|
|
94
|
+
|
|
95
|
+
Release.new(
|
|
96
|
+
version: version,
|
|
97
|
+
released_at: released_at && Time.parse(released_at),
|
|
98
|
+
node_requirement: parse_node_requirement(details_hash, version),
|
|
99
|
+
repository: parse_repository(details_hash["repository"], version),
|
|
100
|
+
details: details_hash
|
|
101
|
+
)
|
|
102
|
+
end
|
|
103
|
+
private_class_method :parse_release
|
|
104
|
+
|
|
105
|
+
sig { params(details: ObjectHash, version: String).returns(T.nilable(String)) }
|
|
106
|
+
def self.parse_node_requirement(details, version)
|
|
107
|
+
engines = details["engines"]
|
|
108
|
+
return unless engines.is_a?(Hash)
|
|
109
|
+
|
|
110
|
+
engines_hash = object_hash(engines, "version #{version} engines")
|
|
111
|
+
optional_string(
|
|
112
|
+
engines_hash["node"],
|
|
113
|
+
"version #{version} engines.node"
|
|
114
|
+
)
|
|
115
|
+
end
|
|
116
|
+
private_class_method :parse_node_requirement
|
|
117
|
+
|
|
118
|
+
sig { params(value: T.nilable(Object), version: String).returns(T.nilable(Repository)) }
|
|
119
|
+
def self.parse_repository(value, version)
|
|
120
|
+
case value
|
|
121
|
+
when nil
|
|
122
|
+
nil
|
|
123
|
+
when String
|
|
124
|
+
Repository.new(url: value, git: value.start_with?("git+"))
|
|
125
|
+
when Hash
|
|
126
|
+
repository = object_hash(value, "version #{version} repository")
|
|
127
|
+
url = optional_string(repository["url"], "version #{version} repository.url")
|
|
128
|
+
type = optional_string(repository["type"], "version #{version} repository.type")
|
|
129
|
+
|
|
130
|
+
Repository.new(
|
|
131
|
+
url: url,
|
|
132
|
+
type: type,
|
|
133
|
+
git: type == "git"
|
|
134
|
+
)
|
|
135
|
+
else
|
|
136
|
+
raise TypeError, "version #{version} repository must be a string or object"
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
private_class_method :parse_repository
|
|
140
|
+
|
|
141
|
+
sig { params(value: Object, context: String).returns(ObjectHash) }
|
|
142
|
+
def self.object_hash(value, context)
|
|
143
|
+
raise TypeError, "#{context} must be an object" unless value.is_a?(Hash)
|
|
144
|
+
|
|
145
|
+
result = T.let({}, ObjectHash)
|
|
146
|
+
value.each do |raw_key, raw_value|
|
|
147
|
+
key = T.cast(raw_key, Object)
|
|
148
|
+
raise TypeError, "#{context} keys must be strings" unless key.is_a?(String)
|
|
149
|
+
|
|
150
|
+
result[key] = T.cast(raw_value, Object)
|
|
151
|
+
end
|
|
152
|
+
result
|
|
153
|
+
end
|
|
154
|
+
private_class_method :object_hash
|
|
155
|
+
|
|
156
|
+
sig do
|
|
157
|
+
params(
|
|
158
|
+
value: Object,
|
|
159
|
+
context: String,
|
|
160
|
+
included_keys: T.nilable(T::Hash[String, T::Boolean])
|
|
161
|
+
).returns(T::Hash[String, String])
|
|
162
|
+
end
|
|
163
|
+
def self.string_map(value, context, included_keys: nil)
|
|
164
|
+
result = T.let({}, T::Hash[String, String])
|
|
165
|
+
object_hash(value, context).each do |key, raw_value|
|
|
166
|
+
next if included_keys && !included_keys.key?(key)
|
|
167
|
+
|
|
168
|
+
raise TypeError, "#{context} values must be strings" unless raw_value.is_a?(String)
|
|
169
|
+
|
|
170
|
+
result[key] = raw_value
|
|
171
|
+
end
|
|
172
|
+
result
|
|
173
|
+
end
|
|
174
|
+
private_class_method :string_map
|
|
175
|
+
|
|
176
|
+
sig { params(value: T.nilable(Object), context: String).returns(T.nilable(String)) }
|
|
177
|
+
def self.optional_string(value, context)
|
|
178
|
+
return if value.nil?
|
|
179
|
+
return value if value.is_a?(String)
|
|
180
|
+
|
|
181
|
+
raise TypeError, "#{context} must be a string"
|
|
182
|
+
end
|
|
183
|
+
private_class_method :optional_string
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
data/lib/dependabot.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dependabot-common
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.394.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dependabot
|
|
@@ -441,14 +441,14 @@ dependencies:
|
|
|
441
441
|
requirements:
|
|
442
442
|
- - "~>"
|
|
443
443
|
- !ruby/object:Gem::Version
|
|
444
|
-
version: '
|
|
444
|
+
version: '1.1'
|
|
445
445
|
type: :development
|
|
446
446
|
prerelease: false
|
|
447
447
|
version_requirements: !ruby/object:Gem::Requirement
|
|
448
448
|
requirements:
|
|
449
449
|
- - "~>"
|
|
450
450
|
- !ruby/object:Gem::Version
|
|
451
|
-
version: '
|
|
451
|
+
version: '1.1'
|
|
452
452
|
- !ruby/object:Gem::Dependency
|
|
453
453
|
name: turbo_tests
|
|
454
454
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -572,6 +572,8 @@ files:
|
|
|
572
572
|
- lib/dependabot/metadata_finders/base/commits_finder.rb
|
|
573
573
|
- lib/dependabot/metadata_finders/base/release_finder.rb
|
|
574
574
|
- lib/dependabot/notices.rb
|
|
575
|
+
- lib/dependabot/package/npm_package_manager_config.rb
|
|
576
|
+
- lib/dependabot/package/npm_registry_package.rb
|
|
575
577
|
- lib/dependabot/package/package_details.rb
|
|
576
578
|
- lib/dependabot/package/package_language.rb
|
|
577
579
|
- lib/dependabot/package/package_latest_version_finder.rb
|
|
@@ -629,7 +631,7 @@ licenses:
|
|
|
629
631
|
- MIT
|
|
630
632
|
metadata:
|
|
631
633
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
632
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
|
634
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.394.0
|
|
633
635
|
rdoc_options: []
|
|
634
636
|
require_paths:
|
|
635
637
|
- lib
|