dependabot-npm_and_yarn 0.293.0 → 0.294.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/npm/vulnerability-auditor.js +16 -16
- data/helpers/lib/npm6/updater.js +1 -1
- data/lib/dependabot/npm_and_yarn/bun_package_manager.rb +1 -1
- data/lib/dependabot/npm_and_yarn/file_fetcher.rb +12 -3
- data/lib/dependabot/npm_and_yarn/file_parser.rb +9 -9
- data/lib/dependabot/npm_and_yarn/file_updater/pnpm_lockfile_updater.rb +81 -12
- data/lib/dependabot/npm_and_yarn/file_updater.rb +18 -0
- data/lib/dependabot/npm_and_yarn/helpers.rb +14 -2
- data/lib/dependabot/npm_and_yarn/package_manager.rb +4 -2
- data/lib/dependabot/npm_and_yarn/version.rb +4 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72e338772b3c3aac3cf86538fc2d70dbbc45f5f7cb854cd7fd74913b140fe056
|
4
|
+
data.tar.gz: 1856c138b871ebe80e5cc6faa5984ba80c10b342aa8bf0822e325e5a31a3f815
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e3267d0aafcf35e345505c87a23b2b783cfc36377e46f5f10875a4bd8b0c4fe201b6dea0dbed75463b75dccba175014af850451cfc52b39c0a2a410a5c5ab34
|
7
|
+
data.tar.gz: a1c6be5ccbebcf43a76a51d7871a37743428f052c734a985a48fc90d4b1e2944679a8b6eb17910a8ef7e14c69dbe46d9761319b28d6a57d7dcbac7e94fbb9c09
|
@@ -97,9 +97,9 @@ async function findVulnerableDependencies(directory, advisories) {
|
|
97
97
|
|
98
98
|
for (const group of groupedFixUpdateChains.values()) {
|
99
99
|
const fixUpdateNode = group[0].nodes[0]
|
100
|
-
const groupTopLevelAncestors = group.reduce((
|
100
|
+
const groupTopLevelAncestors = group.reduce((ancestor, chain) => {
|
101
101
|
const topLevelNode = chain.nodes[chain.nodes.length - 1]
|
102
|
-
return
|
102
|
+
return ancestor.add(topLevelNode.name)
|
103
103
|
}, new Set())
|
104
104
|
|
105
105
|
// Add group's top-level ancestors to the set of all top-level ancestors of
|
@@ -269,23 +269,23 @@ const maybeReadFile = file => {
|
|
269
269
|
}
|
270
270
|
|
271
271
|
function loadCACerts(npmConfig) {
|
272
|
-
|
273
|
-
|
274
|
-
|
272
|
+
if (npmConfig.ca) {
|
273
|
+
return npmConfig.ca
|
274
|
+
}
|
275
275
|
|
276
|
-
|
277
|
-
|
278
|
-
|
276
|
+
if (!npmConfig.cafile) {
|
277
|
+
return
|
278
|
+
}
|
279
279
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
280
|
+
const raw = maybeReadFile(npmConfig.cafile)
|
281
|
+
if (!raw) {
|
282
|
+
return
|
283
|
+
}
|
284
284
|
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
285
|
+
const delim = '-----END CERTIFICATE-----'
|
286
|
+
return raw.replace(/\r\n/g, '\n').split(delim)
|
287
|
+
.filter(section => section.trim())
|
288
|
+
.map(section => section.trimStart() + delim)
|
289
289
|
}
|
290
290
|
|
291
291
|
module.exports = { findVulnerableDependencies }
|
data/helpers/lib/npm6/updater.js
CHANGED
@@ -213,7 +213,7 @@ module Dependabot
|
|
213
213
|
|
214
214
|
sig { returns(T.nilable(T.any(Integer, String))) }
|
215
215
|
def bun_version
|
216
|
-
return @bun_version = nil unless
|
216
|
+
return @bun_version = nil unless allow_beta_ecosystems?
|
217
217
|
|
218
218
|
@bun_version ||= T.let(
|
219
219
|
package_manager_helper.setup(BunPackageManager::NAME),
|
@@ -453,6 +453,15 @@ module Dependabot
|
|
453
453
|
|
454
454
|
resolution_deps = resolution_objects.flat_map(&:to_a)
|
455
455
|
.map do |path, value|
|
456
|
+
# skip dependencies that contain invalid values such as inline comments, null, etc.
|
457
|
+
|
458
|
+
unless value.is_a?(String)
|
459
|
+
Dependabot.logger.warn("File fetcher: Skipping dependency \"#{path}\" " \
|
460
|
+
"with value: \"#{value}\"")
|
461
|
+
|
462
|
+
next
|
463
|
+
end
|
464
|
+
|
456
465
|
convert_dependency_path_to_name(path, value)
|
457
466
|
end
|
458
467
|
|
@@ -645,8 +654,8 @@ module Dependabot
|
|
645
654
|
def parsed_pnpm_workspace_yaml
|
646
655
|
return {} unless pnpm_workspace_yaml
|
647
656
|
|
648
|
-
YAML.safe_load(T.must(T.must(pnpm_workspace_yaml).content))
|
649
|
-
rescue Psych::SyntaxError
|
657
|
+
YAML.safe_load(T.must(T.must(pnpm_workspace_yaml).content), aliases: true)
|
658
|
+
rescue Psych::SyntaxError, Psych::BadAlias
|
650
659
|
raise Dependabot::DependencyFileNotParseable, T.must(pnpm_workspace_yaml).path
|
651
660
|
end
|
652
661
|
|
@@ -143,56 +143,56 @@ module Dependabot
|
|
143
143
|
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
144
144
|
def shrinkwrap
|
145
145
|
@shrinkwrap ||= T.let(dependency_files.find do |f|
|
146
|
-
f.name
|
146
|
+
f.name.end_with?(NpmPackageManager::SHRINKWRAP_LOCKFILE_NAME)
|
147
147
|
end, T.nilable(Dependabot::DependencyFile))
|
148
148
|
end
|
149
149
|
|
150
150
|
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
151
151
|
def package_lock
|
152
152
|
@package_lock ||= T.let(dependency_files.find do |f|
|
153
|
-
f.name
|
153
|
+
f.name.end_with?(NpmPackageManager::LOCKFILE_NAME)
|
154
154
|
end, T.nilable(Dependabot::DependencyFile))
|
155
155
|
end
|
156
156
|
|
157
157
|
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
158
158
|
def yarn_lock
|
159
159
|
@yarn_lock ||= T.let(dependency_files.find do |f|
|
160
|
-
f.name
|
160
|
+
f.name.end_with?(YarnPackageManager::LOCKFILE_NAME)
|
161
161
|
end, T.nilable(Dependabot::DependencyFile))
|
162
162
|
end
|
163
163
|
|
164
164
|
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
165
165
|
def pnpm_lock
|
166
166
|
@pnpm_lock ||= T.let(dependency_files.find do |f|
|
167
|
-
f.name
|
167
|
+
f.name.end_with?(PNPMPackageManager::LOCKFILE_NAME)
|
168
168
|
end, T.nilable(Dependabot::DependencyFile))
|
169
169
|
end
|
170
170
|
|
171
171
|
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
172
172
|
def bun_lock
|
173
173
|
@bun_lock ||= T.let(dependency_files.find do |f|
|
174
|
-
f.name
|
174
|
+
f.name.end_with?(BunPackageManager::LOCKFILE_NAME)
|
175
175
|
end, T.nilable(Dependabot::DependencyFile))
|
176
176
|
end
|
177
177
|
|
178
178
|
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
179
179
|
def npmrc
|
180
180
|
@npmrc ||= T.let(dependency_files.find do |f|
|
181
|
-
f.name
|
181
|
+
f.name.end_with?(NpmPackageManager::RC_FILENAME)
|
182
182
|
end, T.nilable(Dependabot::DependencyFile))
|
183
183
|
end
|
184
184
|
|
185
185
|
sig { returns(T.nilable(Dependabot::DependencyFile)) }
|
186
186
|
def yarnrc
|
187
187
|
@yarnrc ||= T.let(dependency_files.find do |f|
|
188
|
-
f.name
|
188
|
+
f.name.end_with?(YarnPackageManager::RC_FILENAME)
|
189
189
|
end, T.nilable(Dependabot::DependencyFile))
|
190
190
|
end
|
191
191
|
|
192
192
|
sig { returns(T.nilable(DependencyFile)) }
|
193
193
|
def yarnrc_yml
|
194
194
|
@yarnrc_yml ||= T.let(dependency_files.find do |f|
|
195
|
-
f.name
|
195
|
+
f.name.end_with?(YarnPackageManager::RC_YML_FILENAME)
|
196
196
|
end, T.nilable(Dependabot::DependencyFile))
|
197
197
|
end
|
198
198
|
|
@@ -212,7 +212,7 @@ module Dependabot
|
|
212
212
|
next unless requirement.is_a?(String)
|
213
213
|
|
214
214
|
# Skip dependencies using Yarn workspace cross-references as requirements
|
215
|
-
next if requirement.start_with?("workspace:")
|
215
|
+
next if requirement.start_with?("workspace:", "catalog:")
|
216
216
|
|
217
217
|
requirement = "*" if requirement == ""
|
218
218
|
dep = build_dependency(
|
@@ -18,6 +18,10 @@ module Dependabot
|
|
18
18
|
@dependency_files = dependency_files
|
19
19
|
@repo_contents_path = repo_contents_path
|
20
20
|
@credentials = credentials
|
21
|
+
@error_handler = PnpmErrorHandler.new(
|
22
|
+
dependencies: dependencies,
|
23
|
+
dependency_files: dependency_files
|
24
|
+
)
|
21
25
|
end
|
22
26
|
|
23
27
|
def updated_pnpm_lock_content(pnpm_lock)
|
@@ -36,6 +40,7 @@ module Dependabot
|
|
36
40
|
attr_reader :dependency_files
|
37
41
|
attr_reader :repo_contents_path
|
38
42
|
attr_reader :credentials
|
43
|
+
attr_reader :error_handler
|
39
44
|
|
40
45
|
IRRESOLVABLE_PACKAGE = "ERR_PNPM_NO_MATCHING_VERSION"
|
41
46
|
INVALID_REQUIREMENT = "ERR_PNPM_SPEC_NOT_SUPPORTED_BY_ANY_RESOLVER"
|
@@ -46,12 +51,12 @@ module Dependabot
|
|
46
51
|
UNAUTHORIZED_PACKAGE = /ERR_PNPM_FETCH_401[ [^:print:]]+GET (?<dependency_url>.*): Unauthorized - 401/
|
47
52
|
|
48
53
|
# ERR_PNPM_FETCH ERROR CODES
|
49
|
-
ERR_PNPM_FETCH_401 = /ERR_PNPM_FETCH_401.*GET (?<dependency_url>.*)
|
50
|
-
ERR_PNPM_FETCH_403 = /ERR_PNPM_FETCH_403.*GET (?<dependency_url>.*)
|
51
|
-
ERR_PNPM_FETCH_404 = /ERR_PNPM_FETCH_404.*GET (?<dependency_url>.*)
|
52
|
-
ERR_PNPM_FETCH_500 = /ERR_PNPM_FETCH_500.*GET (?<dependency_url>.*)
|
53
|
-
ERR_PNPM_FETCH_502 = /ERR_PNPM_FETCH_502.*GET (?<dependency_url>.*)
|
54
|
-
ERR_PNPM_FETCH_503 = /ERR_PNPM_FETCH_503.*GET (?<dependency_url>.*)
|
54
|
+
ERR_PNPM_FETCH_401 = /ERR_PNPM_FETCH_401.*GET (?<dependency_url>.*):/
|
55
|
+
ERR_PNPM_FETCH_403 = /ERR_PNPM_FETCH_403.*GET (?<dependency_url>.*):/
|
56
|
+
ERR_PNPM_FETCH_404 = /ERR_PNPM_FETCH_404.*GET (?<dependency_url>.*):/
|
57
|
+
ERR_PNPM_FETCH_500 = /ERR_PNPM_FETCH_500.*GET (?<dependency_url>.*):/
|
58
|
+
ERR_PNPM_FETCH_502 = /ERR_PNPM_FETCH_502.*GET (?<dependency_url>.*):/
|
59
|
+
ERR_PNPM_FETCH_503 = /ERR_PNPM_FETCH_503.*GET (?<dependency_url>.*):/
|
55
60
|
|
56
61
|
# ERR_PNPM_UNSUPPORTED_ENGINE
|
57
62
|
ERR_PNPM_UNSUPPORTED_ENGINE = /ERR_PNPM_UNSUPPORTED_ENGINE/
|
@@ -100,7 +105,7 @@ module Dependabot
|
|
100
105
|
File.write(".npmrc", npmrc_content(pnpm_lock))
|
101
106
|
|
102
107
|
SharedHelpers.with_git_configured(credentials: credentials) do
|
103
|
-
|
108
|
+
run_pnpm_update_packages
|
104
109
|
|
105
110
|
write_final_package_json_files
|
106
111
|
|
@@ -111,15 +116,22 @@ module Dependabot
|
|
111
116
|
end
|
112
117
|
end
|
113
118
|
|
114
|
-
def
|
119
|
+
def run_pnpm_update_packages
|
115
120
|
dependency_updates = dependencies.map do |d|
|
116
121
|
"#{d.name}@#{d.version}"
|
117
122
|
end.join(" ")
|
118
123
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
124
|
+
if Dependabot::Experiments.enabled?(:enable_fix_for_pnpm_no_change_error)
|
125
|
+
Helpers.run_pnpm_command(
|
126
|
+
"update #{dependency_updates} --lockfile-only --no-save -r",
|
127
|
+
fingerprint: "update <dependency_updates> --lockfile-only --no-save -r"
|
128
|
+
)
|
129
|
+
else
|
130
|
+
Helpers.run_pnpm_command(
|
131
|
+
"install #{dependency_updates} --lockfile-only --ignore-workspace-root-check",
|
132
|
+
fingerprint: "install <dependency_updates> --lockfile-only --ignore-workspace-root-check"
|
133
|
+
)
|
134
|
+
end
|
123
135
|
end
|
124
136
|
|
125
137
|
def run_pnpm_install
|
@@ -251,6 +263,8 @@ module Dependabot
|
|
251
263
|
pnpm_lock)
|
252
264
|
end
|
253
265
|
|
266
|
+
error_handler.handle_pnpm_error(error)
|
267
|
+
|
254
268
|
raise
|
255
269
|
end
|
256
270
|
# rubocop:enable Metrics/AbcSize
|
@@ -360,5 +374,60 @@ module Dependabot
|
|
360
374
|
end
|
361
375
|
end
|
362
376
|
end
|
377
|
+
|
378
|
+
class PnpmErrorHandler
|
379
|
+
extend T::Sig
|
380
|
+
|
381
|
+
# remote connection closed
|
382
|
+
ECONNRESET_ERROR = /ECONNRESET/
|
383
|
+
|
384
|
+
# socket hang up error code
|
385
|
+
SOCKET_HANG_UP = /socket hang up/
|
386
|
+
|
387
|
+
# ERR_PNPM_CATALOG_ENTRY_NOT_FOUND_FOR_SPEC error
|
388
|
+
ERR_PNPM_CATALOG_ENTRY_NOT_FOUND_FOR_SPEC = /ERR_PNPM_CATALOG_ENTRY_NOT_FOUND_FOR_SPEC/
|
389
|
+
|
390
|
+
# duplicate package error code
|
391
|
+
DUPLICATE_PACKAGE = /Found duplicates/
|
392
|
+
|
393
|
+
ERR_PNPM_NO_VERSIONS = /ERR_PNPM_NO_VERSIONS/
|
394
|
+
|
395
|
+
# Initializes the YarnErrorHandler with dependencies and dependency files
|
396
|
+
sig do
|
397
|
+
params(
|
398
|
+
dependencies: T::Array[Dependabot::Dependency],
|
399
|
+
dependency_files: T::Array[Dependabot::DependencyFile]
|
400
|
+
).void
|
401
|
+
end
|
402
|
+
def initialize(dependencies:, dependency_files:)
|
403
|
+
@dependencies = dependencies
|
404
|
+
@dependency_files = dependency_files
|
405
|
+
end
|
406
|
+
|
407
|
+
private
|
408
|
+
|
409
|
+
sig { returns(T::Array[Dependabot::Dependency]) }
|
410
|
+
attr_reader :dependencies
|
411
|
+
|
412
|
+
sig { returns(T::Array[Dependabot::DependencyFile]) }
|
413
|
+
attr_reader :dependency_files
|
414
|
+
|
415
|
+
public
|
416
|
+
|
417
|
+
# Handles errors with specific to yarn error codes
|
418
|
+
sig { params(error: SharedHelpers::HelperSubprocessFailed).void }
|
419
|
+
def handle_pnpm_error(error)
|
420
|
+
if error.message.match?(DUPLICATE_PACKAGE) || error.message.match?(ERR_PNPM_NO_VERSIONS) ||
|
421
|
+
error.message.match?(ERR_PNPM_CATALOG_ENTRY_NOT_FOUND_FOR_SPEC)
|
422
|
+
|
423
|
+
raise DependencyFileNotResolvable, "Error resolving dependency"
|
424
|
+
end
|
425
|
+
|
426
|
+
## Clean error message from ANSI escape codes
|
427
|
+
return unless error.message.match?(ECONNRESET_ERROR) || error.message.match?(SOCKET_HANG_UP)
|
428
|
+
|
429
|
+
raise InconsistentRegistryResponse, "Inconsistent registry response while resolving dependency"
|
430
|
+
end
|
431
|
+
end
|
363
432
|
end
|
364
433
|
end
|
@@ -48,6 +48,7 @@ module Dependabot
|
|
48
48
|
]
|
49
49
|
end
|
50
50
|
|
51
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
51
52
|
sig { override.returns(T::Array[DependencyFile]) }
|
52
53
|
def updated_dependency_files
|
53
54
|
updated_files = T.let([], T::Array[DependencyFile])
|
@@ -56,6 +57,22 @@ module Dependabot
|
|
56
57
|
updated_files += updated_lockfiles
|
57
58
|
|
58
59
|
if updated_files.none?
|
60
|
+
|
61
|
+
if Dependabot::Experiments.enabled?(:enable_fix_for_pnpm_no_change_error)
|
62
|
+
# when all dependencies are transitive
|
63
|
+
all_transitive = dependencies.none?(&:top_level?)
|
64
|
+
# when there is no update in package.json
|
65
|
+
no_package_json_update = package_files.empty?
|
66
|
+
# handle the no change error for transitive dependency updates
|
67
|
+
if pnpm_locks.any? && dependencies.length.positive? && all_transitive && no_package_json_update
|
68
|
+
raise ToolFeatureNotSupported.new(
|
69
|
+
tool_name: "pnpm",
|
70
|
+
tool_type: "package_manager",
|
71
|
+
feature: "updating transitive dependencies"
|
72
|
+
)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
59
76
|
raise NoChangeError.new(
|
60
77
|
message: "No files were updated!",
|
61
78
|
error_context: error_context(updated_files: updated_files)
|
@@ -72,6 +89,7 @@ module Dependabot
|
|
72
89
|
|
73
90
|
vendor_updated_files(updated_files)
|
74
91
|
end
|
92
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
75
93
|
|
76
94
|
private
|
77
95
|
|
@@ -40,6 +40,9 @@ module Dependabot
|
|
40
40
|
YARN_DEFAULT_VERSION = YARN_V3
|
41
41
|
YARN_FALLBACK_VERSION = YARN_V1
|
42
42
|
|
43
|
+
# corepack supported package managers
|
44
|
+
SUPPORTED_COREPACK_PACKAGE_MANAGERS = %w(npm yarn pnpm).freeze
|
45
|
+
|
43
46
|
# Determines the npm version depends to the feature flag
|
44
47
|
# If the feature flag is enabled, we are going to use the minimum version npm 8
|
45
48
|
# Otherwise, we are going to use old versionining npm 6
|
@@ -324,8 +327,8 @@ module Dependabot
|
|
324
327
|
package_manager_run_command(NpmPackageManager::NAME, command, fingerprint: fingerprint)
|
325
328
|
else
|
326
329
|
Dependabot::SharedHelpers.run_shell_command(
|
327
|
-
"
|
328
|
-
fingerprint: "
|
330
|
+
"npm #{command}",
|
331
|
+
fingerprint: "npm #{fingerprint}"
|
329
332
|
)
|
330
333
|
end
|
331
334
|
end
|
@@ -484,6 +487,8 @@ module Dependabot
|
|
484
487
|
.returns(String)
|
485
488
|
end
|
486
489
|
def self.package_manager_install(name, version, env: {})
|
490
|
+
return "Corepack does not support #{name}" unless corepack_supported_package_manager?(name)
|
491
|
+
|
487
492
|
Dependabot::SharedHelpers.run_shell_command(
|
488
493
|
"corepack install #{name}@#{version} --global --cache-only",
|
489
494
|
fingerprint: "corepack install <name>@<version> --global --cache-only",
|
@@ -494,6 +499,8 @@ module Dependabot
|
|
494
499
|
# Prepare the package manager for use by using corepack
|
495
500
|
sig { params(name: String, version: String).returns(String) }
|
496
501
|
def self.package_manager_activate(name, version)
|
502
|
+
return "Corepack does not support #{name}" unless corepack_supported_package_manager?(name)
|
503
|
+
|
497
504
|
Dependabot::SharedHelpers.run_shell_command(
|
498
505
|
"corepack prepare #{name}@#{version} --activate",
|
499
506
|
fingerprint: "corepack prepare <name>@<version> --activate"
|
@@ -566,6 +573,11 @@ module Dependabot
|
|
566
573
|
dependency
|
567
574
|
end
|
568
575
|
end
|
576
|
+
|
577
|
+
sig { params(name: String).returns(T::Boolean) }
|
578
|
+
def self.corepack_supported_package_manager?(name)
|
579
|
+
SUPPORTED_COREPACK_PACKAGE_MANAGERS.include?(name)
|
580
|
+
end
|
569
581
|
end
|
570
582
|
end
|
571
583
|
end
|
@@ -59,14 +59,16 @@ module Dependabot
|
|
59
59
|
T.any(
|
60
60
|
T.class_of(Dependabot::NpmAndYarn::NpmPackageManager),
|
61
61
|
T.class_of(Dependabot::NpmAndYarn::YarnPackageManager),
|
62
|
-
T.class_of(Dependabot::NpmAndYarn::PNPMPackageManager)
|
62
|
+
T.class_of(Dependabot::NpmAndYarn::PNPMPackageManager),
|
63
|
+
T.class_of(Dependabot::NpmAndYarn::BunPackageManager)
|
63
64
|
)
|
64
65
|
end
|
65
66
|
|
66
67
|
PACKAGE_MANAGER_CLASSES = T.let({
|
67
68
|
NpmPackageManager::NAME => NpmPackageManager,
|
68
69
|
YarnPackageManager::NAME => YarnPackageManager,
|
69
|
-
PNPMPackageManager::NAME => PNPMPackageManager
|
70
|
+
PNPMPackageManager::NAME => PNPMPackageManager,
|
71
|
+
BunPackageManager::NAME => BunPackageManager
|
70
72
|
}.freeze, T::Hash[String, NpmAndYarnPackageManagerClassType])
|
71
73
|
|
72
74
|
# Error malformed version number string
|
@@ -80,6 +80,10 @@ module Dependabot
|
|
80
80
|
# Matches @ followed by x.y.z (digits separated by dots)
|
81
81
|
if (match = version.match(/@(\d+\.\d+\.\d+)/))
|
82
82
|
version = match[1] # Just "4.5.3"
|
83
|
+
|
84
|
+
# Extract version in case the output contains Corepack verbose data
|
85
|
+
elsif version.include?("Corepack")
|
86
|
+
version = T.must(T.must(version.tr("\n", " ").match(/(\d+\.\d+\.\d+)/))[-1])
|
83
87
|
end
|
84
88
|
version = version&.gsub(/^v/, "")
|
85
89
|
end
|
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.294.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dependabot
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-01-
|
11
|
+
date: 2025-01-23 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.294.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.294.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: debug
|
29
29
|
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.
|
357
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.294.0
|
358
358
|
post_install_message:
|
359
359
|
rdoc_options: []
|
360
360
|
require_paths:
|