dependabot-npm_and_yarn 0.235.0 → 0.237.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/helpers/lib/pnpm/lockfile-parser.js +1 -0
- data/helpers/package-lock.json +144 -132
- data/helpers/package.json +4 -4
- data/lib/dependabot/npm_and_yarn/file_fetcher.rb +25 -6
- data/lib/dependabot/npm_and_yarn/file_parser/json_lock.rb +1 -1
- data/lib/dependabot/npm_and_yarn/file_parser/lockfile_parser.rb +1 -1
- data/lib/dependabot/npm_and_yarn/file_parser/pnpm_lock.rb +1 -1
- data/lib/dependabot/npm_and_yarn/file_parser/yarn_lock.rb +1 -1
- data/lib/dependabot/npm_and_yarn/file_parser.rb +49 -75
- data/lib/dependabot/npm_and_yarn/file_updater/npm_lockfile_updater.rb +15 -21
- data/lib/dependabot/npm_and_yarn/file_updater/npmrc_builder.rb +10 -2
- data/lib/dependabot/npm_and_yarn/file_updater/package_json_preparer.rb +6 -8
- data/lib/dependabot/npm_and_yarn/file_updater/package_json_updater.rb +1 -1
- data/lib/dependabot/npm_and_yarn/file_updater/pnpm_lockfile_updater.rb +14 -5
- data/lib/dependabot/npm_and_yarn/file_updater/yarn_lockfile_updater.rb +1 -1
- data/lib/dependabot/npm_and_yarn/helpers.rb +14 -9
- data/lib/dependabot/npm_and_yarn/package_manager.rb +4 -4
- data/lib/dependabot/npm_and_yarn/registry_parser.rb +75 -0
- data/lib/dependabot/npm_and_yarn/update_checker/registry_finder.rb +76 -61
- data/lib/dependabot/npm_and_yarn/update_checker/vulnerability_auditor.rb +1 -10
- data/lib/dependabot/npm_and_yarn/update_checker.rb +1 -2
- data/lib/dependabot/npm_and_yarn.rb +1 -1
- metadata +22 -7
@@ -31,7 +31,7 @@ module Dependabot
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def registry
|
34
|
-
locked_registry || first_registry_with_dependency_details
|
34
|
+
@registry ||= locked_registry || configured_registry || first_registry_with_dependency_details
|
35
35
|
end
|
36
36
|
|
37
37
|
def auth_headers
|
@@ -49,16 +49,22 @@ module Dependabot
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def registry_from_rc(dependency_name)
|
52
|
-
|
53
|
-
|
54
|
-
scope = dependency_name.split("/").first
|
55
|
-
scoped_registry(scope)
|
52
|
+
explicit_registry_from_rc(dependency_name) || global_registry
|
56
53
|
end
|
57
54
|
|
58
55
|
private
|
59
56
|
|
60
57
|
attr_reader :dependency, :credentials, :npmrc_file, :yarnrc_file, :yarnrc_yml_file
|
61
58
|
|
59
|
+
def explicit_registry_from_rc(dependency_name)
|
60
|
+
if dependency_name.start_with?("@") && dependency_name.include?("/")
|
61
|
+
scope = dependency_name.split("/").first
|
62
|
+
scoped_registry(scope) || configured_global_registry
|
63
|
+
else
|
64
|
+
configured_global_registry
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
62
68
|
def first_registry_with_dependency_details
|
63
69
|
@first_registry_with_dependency_details ||=
|
64
70
|
known_registries.find do |details|
|
@@ -126,6 +132,13 @@ module Dependabot
|
|
126
132
|
detailed_registry || lockfile_registry
|
127
133
|
end
|
128
134
|
|
135
|
+
def configured_registry
|
136
|
+
configured_registry_url = explicit_registry_from_rc(dependency.name)
|
137
|
+
return unless configured_registry_url
|
138
|
+
|
139
|
+
normalize_configured_registry(configured_registry_url)
|
140
|
+
end
|
141
|
+
|
129
142
|
def known_registries
|
130
143
|
@known_registries ||=
|
131
144
|
begin
|
@@ -157,44 +170,13 @@ module Dependabot
|
|
157
170
|
}
|
158
171
|
end
|
159
172
|
|
160
|
-
|
161
|
-
next if Regexp.last_match[:registry].include?("${")
|
162
|
-
|
163
|
-
registry = Regexp.last_match[:registry].strip
|
164
|
-
.sub(%r{/+$}, "")
|
165
|
-
.sub(%r{^.*?//}, "")
|
166
|
-
.gsub(/\s+/, "%20")
|
167
|
-
next if registries.map { |r| r["registry"] }.include?(registry)
|
168
|
-
|
169
|
-
registries << {
|
170
|
-
"type" => "npm_registry",
|
171
|
-
"registry" => registry,
|
172
|
-
"token" => nil
|
173
|
-
}
|
174
|
-
end
|
175
|
-
|
176
|
-
registries
|
173
|
+
registries += npmrc_global_registries
|
177
174
|
end
|
178
175
|
|
179
176
|
def yarnrc_registries
|
180
177
|
return [] unless yarnrc_file
|
181
178
|
|
182
|
-
|
183
|
-
yarnrc_file.content.scan(YARN_GLOBAL_REGISTRY_REGEX) do
|
184
|
-
next if Regexp.last_match[:registry].include?("${")
|
185
|
-
|
186
|
-
registry = Regexp.last_match[:registry].strip
|
187
|
-
.sub(%r{/+$}, "")
|
188
|
-
.sub(%r{^.*?//}, "")
|
189
|
-
.gsub(/\s+/, "%20")
|
190
|
-
registries << {
|
191
|
-
"type" => "npm_registry",
|
192
|
-
"registry" => registry,
|
193
|
-
"token" => nil
|
194
|
-
}
|
195
|
-
end
|
196
|
-
|
197
|
-
registries
|
179
|
+
yarnrc_global_registries
|
198
180
|
end
|
199
181
|
|
200
182
|
def unique_registries(registries)
|
@@ -208,56 +190,83 @@ module Dependabot
|
|
208
190
|
end
|
209
191
|
end
|
210
192
|
|
211
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
212
193
|
def global_registry
|
213
194
|
return @global_registry if defined? @global_registry
|
214
195
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
return @global_registry = Regexp.last_match[:registry].strip
|
219
|
-
end
|
196
|
+
@global_registry ||= configured_global_registry || "https://registry.npmjs.org"
|
197
|
+
end
|
220
198
|
|
221
|
-
|
222
|
-
|
199
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
200
|
+
def configured_global_registry
|
201
|
+
return @configured_global_registry if defined? @configured_global_registry
|
223
202
|
|
224
|
-
|
225
|
-
|
203
|
+
@configured_global_registry = (npmrc_file && npmrc_global_registries.first&.fetch("url")) ||
|
204
|
+
(yarnrc_file && yarnrc_global_registries.first&.fetch("url"))
|
205
|
+
return @configured_global_registry if @configured_global_registry
|
226
206
|
|
227
207
|
if parsed_yarnrc_yml&.key?("npmRegistryServer")
|
228
|
-
return @
|
208
|
+
return @configured_global_registry = parsed_yarnrc_yml["npmRegistryServer"]
|
229
209
|
end
|
230
210
|
|
231
211
|
replaces_base = credentials.find { |cred| cred["type"] == "npm_registry" && cred["replaces-base"] == true }
|
232
212
|
if replaces_base
|
233
213
|
registry = replaces_base["registry"]
|
234
214
|
registry = "https://#{registry}" unless registry.start_with?("http")
|
235
|
-
return @
|
215
|
+
return @configured_global_registry = registry
|
236
216
|
end
|
237
217
|
|
238
|
-
|
218
|
+
@configured_global_registry = nil
|
239
219
|
end
|
240
220
|
# rubocop:enable Metrics/PerceivedComplexity
|
241
221
|
|
222
|
+
def npmrc_global_registries
|
223
|
+
global_rc_registries(npmrc_file, syntax: NPM_GLOBAL_REGISTRY_REGEX)
|
224
|
+
end
|
225
|
+
|
226
|
+
def yarnrc_global_registries
|
227
|
+
global_rc_registries(yarnrc_file, syntax: YARN_GLOBAL_REGISTRY_REGEX)
|
228
|
+
end
|
229
|
+
|
242
230
|
def scoped_registry(scope)
|
243
|
-
npmrc_file
|
244
|
-
|
231
|
+
scoped_rc_registry = scoped_rc_registry(npmrc_file, syntax: NPM_SCOPED_REGISTRY_REGEX, scope: scope) ||
|
232
|
+
scoped_rc_registry(yarnrc_file, syntax: YARN_SCOPED_REGISTRY_REGEX, scope: scope)
|
233
|
+
return scoped_rc_registry if scoped_rc_registry
|
245
234
|
|
246
|
-
|
235
|
+
if parsed_yarnrc_yml
|
236
|
+
yarn_berry_registry = parsed_yarnrc_yml.dig("npmScopes", scope.delete_prefix("@"), "npmRegistryServer")
|
237
|
+
return yarn_berry_registry if yarn_berry_registry
|
247
238
|
end
|
248
239
|
|
249
|
-
|
250
|
-
|
240
|
+
nil
|
241
|
+
end
|
251
242
|
|
252
|
-
|
243
|
+
def global_rc_registries(file, syntax:)
|
244
|
+
registries = []
|
245
|
+
|
246
|
+
file.content.scan(syntax) do
|
247
|
+
next if Regexp.last_match[:registry].include?("${")
|
248
|
+
|
249
|
+
url = Regexp.last_match[:registry].strip
|
250
|
+
registry = normalize_configured_registry(url)
|
251
|
+
registries << {
|
252
|
+
"type" => "npm_registry",
|
253
|
+
"registry" => registry,
|
254
|
+
"url" => url,
|
255
|
+
"token" => nil
|
256
|
+
}
|
253
257
|
end
|
254
258
|
|
255
|
-
|
256
|
-
|
257
|
-
|
259
|
+
registries
|
260
|
+
end
|
261
|
+
|
262
|
+
def scoped_rc_registry(file, syntax:, scope:)
|
263
|
+
file&.content.to_s.scan(syntax) do
|
264
|
+
next if Regexp.last_match[:registry].include?("${") || Regexp.last_match[:scope] != scope
|
265
|
+
|
266
|
+
return Regexp.last_match[:registry].strip
|
258
267
|
end
|
259
268
|
|
260
|
-
|
269
|
+
nil
|
261
270
|
end
|
262
271
|
|
263
272
|
# npm registries expect slashes to be escaped
|
@@ -279,6 +288,12 @@ module Dependabot
|
|
279
288
|
|
280
289
|
@parsed_yarnrc_yml = YAML.safe_load(yarnrc_yml_file.content)
|
281
290
|
end
|
291
|
+
|
292
|
+
def normalize_configured_registry(url)
|
293
|
+
url.sub(%r{/+$}, "")
|
294
|
+
.sub(%r{^.*?//}, "")
|
295
|
+
.gsub(/\s+/, "%20")
|
296
|
+
end
|
282
297
|
end
|
283
298
|
end
|
284
299
|
end
|
@@ -16,10 +16,9 @@ module Dependabot
|
|
16
16
|
module NpmAndYarn
|
17
17
|
class UpdateChecker < Dependabot::UpdateCheckers::Base
|
18
18
|
class VulnerabilityAuditor
|
19
|
-
def initialize(dependency_files:, credentials
|
19
|
+
def initialize(dependency_files:, credentials:)
|
20
20
|
@dependency_files = dependency_files
|
21
21
|
@credentials = credentials
|
22
|
-
@allow_removal = allow_removal
|
23
22
|
end
|
24
23
|
|
25
24
|
# rubocop:disable Metrics/MethodLength
|
@@ -109,15 +108,11 @@ module Dependabot
|
|
109
108
|
"No patched version available for #{dependency.name}"
|
110
109
|
when :fix_incomplete
|
111
110
|
"The lockfile might be out of sync?"
|
112
|
-
when :vulnerable_dependency_removed
|
113
|
-
"#{dependency.name} was removed in the update. Dependabot is not able to " \
|
114
|
-
"deal with this yet, but you can still upgrade manually."
|
115
111
|
end
|
116
112
|
end
|
117
113
|
|
118
114
|
def validate_audit_result(audit_result, security_advisories)
|
119
115
|
return :fix_unavailable unless audit_result["fix_available"]
|
120
|
-
return :vulnerable_dependency_removed if !@allow_removal && vulnerable_dependency_removed?(audit_result)
|
121
116
|
return :dependency_still_vulnerable if dependency_still_vulnerable?(audit_result, security_advisories)
|
122
117
|
return :downgrades_dependencies if downgrades_dependencies?(audit_result)
|
123
118
|
return :fix_incomplete if fix_incomplete?(audit_result)
|
@@ -125,10 +120,6 @@ module Dependabot
|
|
125
120
|
:viable
|
126
121
|
end
|
127
122
|
|
128
|
-
def vulnerable_dependency_removed?(audit_result)
|
129
|
-
!audit_result["target_version"]
|
130
|
-
end
|
131
|
-
|
132
123
|
def dependency_still_vulnerable?(audit_result, security_advisories)
|
133
124
|
# vulnerable depenendency is removed if the target version is nil
|
134
125
|
return false unless audit_result["target_version"]
|
@@ -142,8 +142,7 @@ module Dependabot
|
|
142
142
|
@vulnerability_audit ||=
|
143
143
|
VulnerabilityAuditor.new(
|
144
144
|
dependency_files: dependency_files,
|
145
|
-
credentials: credentials
|
146
|
-
allow_removal: @options.key?(:npm_transitive_dependency_removal)
|
145
|
+
credentials: credentials
|
147
146
|
).audit(
|
148
147
|
dependency: dependency,
|
149
148
|
security_advisories: security_advisories
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependabot-npm_and_yarn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.237.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dependabot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dependabot-common
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.237.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.237.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: debug
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,20 +94,34 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-sorbet
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.9.2
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.9.2
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rubocop
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - "~>"
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.
|
117
|
+
version: 1.57.2
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: 1.
|
124
|
+
version: 1.57.2
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rubocop-performance
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -277,6 +291,7 @@ files:
|
|
277
291
|
- lib/dependabot/npm_and_yarn/native_helpers.rb
|
278
292
|
- lib/dependabot/npm_and_yarn/package_manager.rb
|
279
293
|
- lib/dependabot/npm_and_yarn/package_name.rb
|
294
|
+
- lib/dependabot/npm_and_yarn/registry_parser.rb
|
280
295
|
- lib/dependabot/npm_and_yarn/requirement.rb
|
281
296
|
- lib/dependabot/npm_and_yarn/sub_dependency_files_filterer.rb
|
282
297
|
- lib/dependabot/npm_and_yarn/update_checker.rb
|
@@ -295,7 +310,7 @@ licenses:
|
|
295
310
|
- Nonstandard
|
296
311
|
metadata:
|
297
312
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
298
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
313
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.237.0
|
299
314
|
post_install_message:
|
300
315
|
rdoc_options: []
|
301
316
|
require_paths:
|