dependabot-bun 0.394.0 → 0.396.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/helpers/package-lock.json +7 -6
- data/lib/dependabot/bun/constraint_helper.rb +1 -1
- data/lib/dependabot/bun/dependency_files_filterer.rb +8 -7
- data/lib/dependabot/bun/dependency_grapher.rb +8 -10
- data/lib/dependabot/bun/file_fetcher.rb +1 -1
- data/lib/dependabot/bun/file_parser/bun_lock/record.rb +101 -0
- data/lib/dependabot/bun/file_parser/bun_lock.rb +47 -78
- data/lib/dependabot/bun/file_parser/lockfile_parser.rb +3 -2
- data/lib/dependabot/bun/file_parser.rb +22 -22
- data/lib/dependabot/bun/package_manager.rb +13 -13
- data/lib/dependabot/bun/update_checker/version_resolver.rb +1 -2
- data/lib/dependabot/bun/version_selector.rb +8 -10
- metadata +8 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8d8c5792f04904252b5cafdfc832e3ffd55327fed710c2192bf9d10c8201ef21
|
|
4
|
+
data.tar.gz: 18f707c30fc183e89236ed35019a5c7cbb6a8bbeea8be17f0c291544bb881a7a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a100f03e67e2dde0fe734fa91c66137508583cbfb38f1006e5c86afce7b511ac383819c04be14b3b0bfb9946fef72c2bc7222e7c066cb7bca7767206c8d4d82e
|
|
7
|
+
data.tar.gz: 0a67133acfc05a31241115d8a35be5f978d6a63dd6b01b19ca1509cdd0eadb213e3783b0f0bf348d12f1f151bd04558631d1713f20e9f28ad9ffa06c426bda24
|
data/helpers/package-lock.json
CHANGED
|
@@ -14521,9 +14521,10 @@
|
|
|
14521
14521
|
}
|
|
14522
14522
|
},
|
|
14523
14523
|
"node_modules/postcss-selector-parser": {
|
|
14524
|
-
"version": "6.1.
|
|
14525
|
-
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.
|
|
14526
|
-
"integrity": "sha512-
|
|
14524
|
+
"version": "6.1.4",
|
|
14525
|
+
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
|
|
14526
|
+
"integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
|
|
14527
|
+
"license": "MIT",
|
|
14527
14528
|
"dependencies": {
|
|
14528
14529
|
"cssesc": "^3.0.0",
|
|
14529
14530
|
"util-deprecate": "^1.0.2"
|
|
@@ -27148,9 +27149,9 @@
|
|
|
27148
27149
|
}
|
|
27149
27150
|
},
|
|
27150
27151
|
"postcss-selector-parser": {
|
|
27151
|
-
"version": "6.1.
|
|
27152
|
-
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.
|
|
27153
|
-
"integrity": "sha512-
|
|
27152
|
+
"version": "6.1.4",
|
|
27153
|
+
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
|
|
27154
|
+
"integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
|
|
27154
27155
|
"requires": {
|
|
27155
27156
|
"cssesc": "^3.0.0",
|
|
27156
27157
|
"util-deprecate": "^1.0.2"
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "dependabot/utils"
|
|
5
|
+
require "dependabot/package/npm_package_json"
|
|
5
6
|
require "dependabot/bun/file_parser/lockfile_parser"
|
|
6
7
|
require "sorbet-runtime"
|
|
7
8
|
|
|
@@ -87,7 +88,7 @@ module Dependabot
|
|
|
87
88
|
def workspaces_lockfile?(lockfile)
|
|
88
89
|
return false unless ["yarn.lock", "package-lock.json", "pnpm-lock.yaml", "bun.lock"].include?(lockfile.name)
|
|
89
90
|
|
|
90
|
-
return false unless
|
|
91
|
+
return false unless root_package_json_document.workspaces? || dependency_files.any? do |file|
|
|
91
92
|
file.name.end_with?("pnpm-workspace.yaml") && File.dirname(file.name) == File.dirname(lockfile.name)
|
|
92
93
|
end
|
|
93
94
|
|
|
@@ -114,14 +115,14 @@ module Dependabot
|
|
|
114
115
|
)
|
|
115
116
|
end
|
|
116
117
|
|
|
117
|
-
sig { returns(
|
|
118
|
-
def
|
|
119
|
-
@
|
|
118
|
+
sig { returns(Dependabot::Package::NpmPackageJson) }
|
|
119
|
+
def root_package_json_document
|
|
120
|
+
@root_package_json_document ||= T.let(
|
|
120
121
|
begin
|
|
121
122
|
package = T.must(dependency_files.find { |f| f.name == "package.json" })
|
|
122
|
-
|
|
123
|
+
Dependabot::Package::NpmPackageJson.from_file(package)
|
|
123
124
|
end,
|
|
124
|
-
T.nilable(
|
|
125
|
+
T.nilable(Dependabot::Package::NpmPackageJson)
|
|
125
126
|
)
|
|
126
127
|
end
|
|
127
128
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "sorbet-runtime"
|
|
@@ -110,17 +110,15 @@ module Dependabot
|
|
|
110
110
|
def fetch_package_relationships
|
|
111
111
|
return {} unless lockfile
|
|
112
112
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return {} unless packages.is_a?(Hash)
|
|
113
|
+
packages = FileParser::BunLock.new(T.must(lockfile)).records
|
|
114
|
+
return {} unless packages
|
|
116
115
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
next unless entry.is_a?(Array) && entry.first.is_a?(String)
|
|
116
|
+
packages.each_with_object({}) do |(_key, record), rels|
|
|
117
|
+
next unless record.graph_compatible?
|
|
120
118
|
|
|
121
|
-
parent_name =
|
|
122
|
-
children =
|
|
123
|
-
next
|
|
119
|
+
parent_name = record.name
|
|
120
|
+
children = record.dependency_names
|
|
121
|
+
next if children.empty?
|
|
124
122
|
|
|
125
123
|
rels[parent_name] = children
|
|
126
124
|
end
|
|
@@ -116,7 +116,7 @@ module Dependabot
|
|
|
116
116
|
def package_manager_helper
|
|
117
117
|
@package_manager_helper ||= T.let(
|
|
118
118
|
PackageManagerHelper.new(
|
|
119
|
-
parsed_package_json,
|
|
119
|
+
Dependabot::Package::NpmPackageManagerConfig.from_package_json(parsed_package_json),
|
|
120
120
|
lockfiles,
|
|
121
121
|
registry_config_files,
|
|
122
122
|
credentials
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "sorbet-runtime"
|
|
5
|
+
require "dependabot/bun/file_parser/bun_lock"
|
|
6
|
+
require "dependabot/package/npm_lockfile_details"
|
|
7
|
+
|
|
8
|
+
module Dependabot
|
|
9
|
+
module Bun
|
|
10
|
+
class FileParser < Dependabot::FileParsers::Base
|
|
11
|
+
class BunLock
|
|
12
|
+
class Record
|
|
13
|
+
extend T::Sig
|
|
14
|
+
|
|
15
|
+
sig { params(data: Object, path: String, context: String).void }
|
|
16
|
+
def initialize(data, path:, context:)
|
|
17
|
+
@data = data
|
|
18
|
+
@path = path
|
|
19
|
+
@context = context
|
|
20
|
+
@entry = T.let(nil, T.nilable(T::Array[Object]))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
sig { returns(T::Boolean) }
|
|
24
|
+
def graph_compatible?
|
|
25
|
+
data = @data
|
|
26
|
+
data.is_a?(Array) && T.cast(data.first, Object).is_a?(String)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
sig { returns(String) }
|
|
30
|
+
def name
|
|
31
|
+
name = resolution_label.split(/(?<=\w)\@/).first
|
|
32
|
+
invalid!("#{@context}[0] must contain a package name") unless name
|
|
33
|
+
|
|
34
|
+
name
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
sig { returns(T.nilable(String)) }
|
|
38
|
+
def version
|
|
39
|
+
Version.semver_for(package_resolution)&.to_s
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
sig { returns(Dependabot::Package::NpmLockfileDetails) }
|
|
43
|
+
def lookup_details
|
|
44
|
+
semver = version
|
|
45
|
+
Dependabot::Package::NpmLockfileDetails.new(
|
|
46
|
+
version: semver,
|
|
47
|
+
resolution: semver ? nil : package_resolution
|
|
48
|
+
)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
sig { returns(T::Array[String]) }
|
|
52
|
+
def dependency_names
|
|
53
|
+
details = entry[2]
|
|
54
|
+
return [] if details.nil?
|
|
55
|
+
|
|
56
|
+
invalid!("#{@context} details must be an object") unless details.is_a?(Hash)
|
|
57
|
+
dependencies = T.cast(details["dependencies"], Object)
|
|
58
|
+
return [] if dependencies.nil?
|
|
59
|
+
|
|
60
|
+
invalid!("#{@context}.dependencies must be an object") unless dependencies.is_a?(Hash)
|
|
61
|
+
dependencies.keys.map do |raw_name|
|
|
62
|
+
child = T.cast(raw_name, Object)
|
|
63
|
+
invalid!("#{@context}.dependencies keys must be strings") unless child.is_a?(String)
|
|
64
|
+
|
|
65
|
+
child
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
|
|
71
|
+
sig { returns(T::Array[Object]) }
|
|
72
|
+
def entry
|
|
73
|
+
return @entry if @entry
|
|
74
|
+
|
|
75
|
+
data = @data
|
|
76
|
+
invalid!("#{@context} must be an array") unless data.is_a?(Array)
|
|
77
|
+
@entry = data.map { |value| T.cast(value, Object) }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
sig { returns(String) }
|
|
81
|
+
def resolution_label
|
|
82
|
+
label = entry.first
|
|
83
|
+
invalid!("#{@context}[0] must be a string") unless label.is_a?(String)
|
|
84
|
+
|
|
85
|
+
label
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
sig { returns(T.nilable(String)) }
|
|
89
|
+
def package_resolution
|
|
90
|
+
resolution_label.split(/(?<=\w)\@/)[1]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
sig { params(message: String).returns(T.noreturn) }
|
|
94
|
+
def invalid!(message)
|
|
95
|
+
raise DependencyFileNotParseable.new(@path, "Invalid bun.lock file: #{message}")
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "yaml"
|
|
5
5
|
require "dependabot/errors"
|
|
6
|
+
require "dependabot/bun/file_parser"
|
|
6
7
|
require "dependabot/bun/bun_package_manager"
|
|
7
8
|
require "dependabot/bun/helpers"
|
|
8
9
|
require "sorbet-runtime"
|
|
@@ -13,22 +14,19 @@ module Dependabot
|
|
|
13
14
|
class BunLock
|
|
14
15
|
extend T::Sig
|
|
15
16
|
|
|
17
|
+
require_relative "bun_lock/record"
|
|
18
|
+
|
|
16
19
|
sig { params(dependency_file: DependencyFile).void }
|
|
17
20
|
def initialize(dependency_file)
|
|
18
21
|
@dependency_file = dependency_file
|
|
22
|
+
@parsed = T.let(nil, T.nilable(T::Hash[Object, Object]))
|
|
23
|
+
@records = T.let(nil, T.nilable(T::Hash[String, Record]))
|
|
19
24
|
end
|
|
20
25
|
|
|
21
|
-
sig { returns(T::Hash[
|
|
26
|
+
sig { returns(T::Hash[Object, Object]) }
|
|
22
27
|
def parsed
|
|
23
28
|
@parsed ||= begin
|
|
24
|
-
content =
|
|
25
|
-
# Since bun.lock is a JSONC file, which is a subset of YAML, we can use YAML to parse it
|
|
26
|
-
YAML.load(T.must(@dependency_file.content))
|
|
27
|
-
rescue Psych::SyntaxError => e
|
|
28
|
-
raise_invalid!("malformed JSONC at line #{e.line}, column #{e.column}")
|
|
29
|
-
end
|
|
30
|
-
raise_invalid!("expected to be an object") unless content.is_a?(Hash)
|
|
31
|
-
|
|
29
|
+
content = parse_document
|
|
32
30
|
version = content["lockfileVersion"]
|
|
33
31
|
raise_invalid!("expected 'lockfileVersion' to be an integer") unless version.is_a?(Integer)
|
|
34
32
|
raise_invalid!("expected 'lockfileVersion' to be >= 0") unless version >= 0
|
|
@@ -45,7 +43,23 @@ module Dependabot
|
|
|
45
43
|
end
|
|
46
44
|
end
|
|
47
45
|
|
|
48
|
-
|
|
46
|
+
content
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
private :parsed
|
|
50
|
+
|
|
51
|
+
sig { returns(T.nilable(T::Hash[String, Record])) }
|
|
52
|
+
def records
|
|
53
|
+
return @records if @records
|
|
54
|
+
|
|
55
|
+
packages = parsed["packages"]
|
|
56
|
+
return unless packages.is_a?(Hash)
|
|
57
|
+
|
|
58
|
+
@records = packages.to_h do |raw_key, value|
|
|
59
|
+
key = T.cast(raw_key, Object)
|
|
60
|
+
raise_invalid!("expected package keys to be strings") unless key.is_a?(String)
|
|
61
|
+
|
|
62
|
+
[key, Record.new(T.cast(value, Object), path: @dependency_file.path, context: "packages.#{key}")]
|
|
49
63
|
end
|
|
50
64
|
end
|
|
51
65
|
|
|
@@ -56,24 +70,19 @@ module Dependabot
|
|
|
56
70
|
# bun.lock v0 format:
|
|
57
71
|
# https://github.com/oven-sh/bun/blob/c130df6c589fdf28f9f3c7f23ed9901140bc9349/src/install/bun.lock.zig#L595-L605
|
|
58
72
|
|
|
59
|
-
packages =
|
|
60
|
-
raise_invalid!("expected 'packages' to be an object") unless packages
|
|
61
|
-
|
|
62
|
-
packages.each do |key, details|
|
|
63
|
-
raise_invalid!("expected 'packages.#{key}' to be an array") unless details.is_a?(Array)
|
|
73
|
+
packages = records
|
|
74
|
+
raise_invalid!("expected 'packages' to be an object") unless packages
|
|
64
75
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
name, version = resolution.split(/(?<=\w)\@/)
|
|
76
|
+
packages.each_value do |record|
|
|
77
|
+
name = record.name
|
|
69
78
|
next if name.empty?
|
|
70
79
|
|
|
71
|
-
semver =
|
|
80
|
+
semver = record.version
|
|
72
81
|
next unless semver
|
|
73
82
|
|
|
74
83
|
dependency_set << Dependency.new(
|
|
75
84
|
name: name,
|
|
76
|
-
version: semver
|
|
85
|
+
version: semver,
|
|
77
86
|
package_manager: "bun",
|
|
78
87
|
requirements: []
|
|
79
88
|
)
|
|
@@ -83,33 +92,27 @@ module Dependabot
|
|
|
83
92
|
end
|
|
84
93
|
|
|
85
94
|
sig do
|
|
86
|
-
params(dependency_name: String,
|
|
87
|
-
.returns(T.nilable(
|
|
95
|
+
params(dependency_name: String, _requirement: T.nilable(String), _manifest_name: String)
|
|
96
|
+
.returns(T.nilable(Dependabot::Package::NpmLockfileDetails))
|
|
88
97
|
end
|
|
89
|
-
def details(dependency_name,
|
|
90
|
-
|
|
91
|
-
return unless packages.is_a?(Hash)
|
|
92
|
-
|
|
93
|
-
candidates =
|
|
94
|
-
packages
|
|
95
|
-
.select { |name, _| name == dependency_name }
|
|
96
|
-
.values
|
|
97
|
-
|
|
98
|
-
# If there's only one entry for this dependency, use it, even if
|
|
99
|
-
# the requirement in the lockfile doesn't match
|
|
100
|
-
if candidates.one?
|
|
101
|
-
parse_details(candidates.first)
|
|
102
|
-
else
|
|
103
|
-
candidate = candidates.find do |label, _|
|
|
104
|
-
label.scan(/(?<=\w)\@(?:npm:)?([^\s,]+)/).flatten.include?(requirement)
|
|
105
|
-
end&.last
|
|
106
|
-
parse_details(candidate)
|
|
107
|
-
end
|
|
98
|
+
def details(dependency_name, _requirement, _manifest_name)
|
|
99
|
+
records&.[](dependency_name)&.lookup_details
|
|
108
100
|
end
|
|
109
101
|
|
|
110
102
|
private
|
|
111
103
|
|
|
112
|
-
sig {
|
|
104
|
+
sig { returns(T::Hash[Object, Object]) }
|
|
105
|
+
def parse_document
|
|
106
|
+
# Since bun.lock is a JSONC file, which is a subset of YAML, we can use YAML to parse it
|
|
107
|
+
content = T.cast(YAML.load(T.must(@dependency_file.content)), Object)
|
|
108
|
+
raise_invalid!("expected to be an object") unless content.is_a?(Hash)
|
|
109
|
+
|
|
110
|
+
content.to_h { |key, value| [T.cast(key, Object), T.cast(value, Object)] }
|
|
111
|
+
rescue Psych::SyntaxError => e
|
|
112
|
+
raise_invalid!("malformed JSONC at line #{e.line}, column #{e.column}")
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
sig { params(message: String).returns(T.noreturn) }
|
|
113
116
|
def raise_invalid!(message)
|
|
114
117
|
raise Dependabot::DependencyFileNotParseable.new(@dependency_file.path, "Invalid bun.lock file: #{message}")
|
|
115
118
|
end
|
|
@@ -124,40 +127,6 @@ module Dependabot
|
|
|
124
127
|
"The bun version Dependabot runs supports up to " \
|
|
125
128
|
"#{BunPackageManager::MAX_SUPPORTED_LOCKFILE_VERSION}."
|
|
126
129
|
end
|
|
127
|
-
|
|
128
|
-
sig do
|
|
129
|
-
params(entry: T.nilable(T::Array[T.untyped])).returns(T.nilable(T::Hash[String, T.untyped]))
|
|
130
|
-
end
|
|
131
|
-
def parse_details(entry)
|
|
132
|
-
return unless entry.is_a?(Array)
|
|
133
|
-
|
|
134
|
-
# Either:
|
|
135
|
-
# - "{name}@{version}", registry, details, integrity
|
|
136
|
-
# - "{name}@{resolution}", details
|
|
137
|
-
resolution = entry.first
|
|
138
|
-
return unless resolution.is_a?(String)
|
|
139
|
-
|
|
140
|
-
name, version = resolution.split(/(?<=\w)\@/)
|
|
141
|
-
semver = Version.semver_for(version)
|
|
142
|
-
|
|
143
|
-
if semver
|
|
144
|
-
registry, details, integrity = entry[1..3]
|
|
145
|
-
{
|
|
146
|
-
"name" => name,
|
|
147
|
-
"version" => semver.to_s,
|
|
148
|
-
"registry" => registry,
|
|
149
|
-
"details" => details,
|
|
150
|
-
"integrity" => integrity
|
|
151
|
-
}
|
|
152
|
-
else
|
|
153
|
-
details = entry[1]
|
|
154
|
-
{
|
|
155
|
-
"name" => name,
|
|
156
|
-
"resolution" => version,
|
|
157
|
-
"details" => details
|
|
158
|
-
}
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
130
|
end
|
|
162
131
|
end
|
|
163
132
|
end
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
require "dependabot/dependency_file"
|
|
5
5
|
require "dependabot/bun/file_parser"
|
|
6
6
|
require "dependabot/bun/helpers"
|
|
7
|
+
require "dependabot/package/npm_lockfile_details"
|
|
7
8
|
require "sorbet-runtime"
|
|
8
9
|
|
|
9
10
|
module Dependabot
|
|
@@ -45,10 +46,10 @@ module Dependabot
|
|
|
45
46
|
|
|
46
47
|
sig do
|
|
47
48
|
params(dependency_name: String, requirement: T.nilable(String), manifest_name: String)
|
|
48
|
-
.returns(T.nilable(
|
|
49
|
+
.returns(T.nilable(Dependabot::Package::NpmLockfileDetails))
|
|
49
50
|
end
|
|
50
51
|
def lockfile_details(dependency_name:, requirement:, manifest_name:)
|
|
51
|
-
details = T.let(nil, T.nilable(
|
|
52
|
+
details = T.let(nil, T.nilable(Dependabot::Package::NpmLockfileDetails))
|
|
52
53
|
potential_lockfiles_for_manifest(manifest_name).each do |lockfile|
|
|
53
54
|
details = lockfile_for(lockfile).details(dependency_name, requirement, manifest_name)
|
|
54
55
|
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
require "cgi/escape"
|
|
7
7
|
require "dependabot/dependency"
|
|
8
|
+
require "dependabot/package/npm_lockfile_details"
|
|
9
|
+
require "dependabot/package/npm_package_json"
|
|
8
10
|
require "dependabot/file_parsers"
|
|
9
11
|
require "dependabot/file_parsers/base"
|
|
10
12
|
require "dependabot/shared_helpers"
|
|
@@ -98,7 +100,7 @@ module Dependabot
|
|
|
98
100
|
def package_manager_helper
|
|
99
101
|
@package_manager_helper ||= T.let(
|
|
100
102
|
PackageManagerHelper.new(
|
|
101
|
-
|
|
103
|
+
package_json_document.package_manager_config,
|
|
102
104
|
lockfiles,
|
|
103
105
|
registry_config_files,
|
|
104
106
|
credentials
|
|
@@ -121,9 +123,9 @@ module Dependabot
|
|
|
121
123
|
}
|
|
122
124
|
end
|
|
123
125
|
|
|
124
|
-
sig { returns(
|
|
125
|
-
def
|
|
126
|
-
|
|
126
|
+
sig { returns(Dependabot::Package::NpmPackageJson) }
|
|
127
|
+
def package_json_document
|
|
128
|
+
Dependabot::Package::NpmPackageJson.from_file(package_json)
|
|
127
129
|
rescue JSON::ParserError
|
|
128
130
|
raise Dependabot::DependencyFileNotParseable, package_json.path
|
|
129
131
|
end
|
|
@@ -162,16 +164,14 @@ module Dependabot
|
|
|
162
164
|
dependency_set = DependencySet.new
|
|
163
165
|
|
|
164
166
|
package_files.each do |file|
|
|
165
|
-
|
|
167
|
+
manifest = Dependabot::Package::NpmPackageJson.from_file(file)
|
|
166
168
|
|
|
167
169
|
# TODO: Currently, Dependabot can't handle flat dependency files
|
|
168
170
|
# (and will error at the FileUpdater stage, because the
|
|
169
171
|
# UpdateChecker doesn't take account of flat resolution).
|
|
170
|
-
next if
|
|
171
|
-
|
|
172
|
-
self.class.each_dependency(json) do |name, requirement, type|
|
|
173
|
-
next unless requirement.is_a?(String)
|
|
172
|
+
next if manifest.flat?
|
|
174
173
|
|
|
174
|
+
manifest.each_dependency do |name, requirement, type|
|
|
175
175
|
# Skip dependencies using Yarn workspace cross-references as requirements
|
|
176
176
|
next if requirement.start_with?("workspace:", "catalog:")
|
|
177
177
|
|
|
@@ -202,7 +202,7 @@ module Dependabot
|
|
|
202
202
|
end
|
|
203
203
|
|
|
204
204
|
sig do
|
|
205
|
-
params(file: DependencyFile, type:
|
|
205
|
+
params(file: DependencyFile, type: String, name: String, requirement: String)
|
|
206
206
|
.returns(T.nilable(Dependency))
|
|
207
207
|
end
|
|
208
208
|
def build_dependency(file:, type:, name:, requirement:)
|
|
@@ -303,14 +303,14 @@ module Dependabot
|
|
|
303
303
|
def workspace_package_names
|
|
304
304
|
@workspace_package_names ||= T.let(
|
|
305
305
|
package_files.filter_map do |f|
|
|
306
|
-
|
|
306
|
+
Dependabot::Package::NpmPackageJson.from_file(f).name
|
|
307
307
|
end,
|
|
308
308
|
T.nilable(T::Array[String])
|
|
309
309
|
)
|
|
310
310
|
end
|
|
311
311
|
|
|
312
312
|
sig do
|
|
313
|
-
params(requirement: String, lockfile_details: T.nilable(
|
|
313
|
+
params(requirement: String, lockfile_details: T.nilable(Dependabot::Package::NpmLockfileDetails))
|
|
314
314
|
.returns(T.nilable(T.any(String, Integer, Gem::Version)))
|
|
315
315
|
end
|
|
316
316
|
def version_for(requirement, lockfile_details)
|
|
@@ -332,10 +332,10 @@ module Dependabot
|
|
|
332
332
|
end
|
|
333
333
|
end
|
|
334
334
|
|
|
335
|
-
sig { params(lockfile_details: T.nilable(
|
|
335
|
+
sig { params(lockfile_details: T.nilable(Dependabot::Package::NpmLockfileDetails)).returns(T.nilable(String)) }
|
|
336
336
|
def git_revision_for(lockfile_details)
|
|
337
|
-
version =
|
|
338
|
-
resolved =
|
|
337
|
+
version = lockfile_details&.version
|
|
338
|
+
resolved = lockfile_details&.resolved
|
|
339
339
|
[
|
|
340
340
|
version&.split("#")&.last,
|
|
341
341
|
resolved&.split("#")&.last,
|
|
@@ -375,11 +375,11 @@ module Dependabot
|
|
|
375
375
|
end
|
|
376
376
|
|
|
377
377
|
sig do
|
|
378
|
-
params(lockfile_details: T.nilable(
|
|
378
|
+
params(lockfile_details: T.nilable(Dependabot::Package::NpmLockfileDetails))
|
|
379
379
|
.returns(T.nilable(T.any(String, Integer, Gem::Version)))
|
|
380
380
|
end
|
|
381
381
|
def lockfile_version_for(lockfile_details)
|
|
382
|
-
semver_version_for(lockfile_details&.
|
|
382
|
+
semver_version_for(lockfile_details&.version)
|
|
383
383
|
end
|
|
384
384
|
|
|
385
385
|
sig { params(version: T.nilable(String)).returns(T.nilable(T.any(String, Integer, Gem::Version))) }
|
|
@@ -398,17 +398,17 @@ module Dependabot
|
|
|
398
398
|
end
|
|
399
399
|
|
|
400
400
|
sig do
|
|
401
|
-
params(name: String, requirement: String, lockfile_details: T.nilable(
|
|
401
|
+
params(name: String, requirement: String, lockfile_details: T.nilable(Dependabot::Package::NpmLockfileDetails))
|
|
402
402
|
.returns(T.nilable(T::Hash[Symbol, T.untyped]))
|
|
403
403
|
end
|
|
404
404
|
def source_for(name, requirement, lockfile_details)
|
|
405
405
|
return git_source_for(requirement) if git_url?(requirement)
|
|
406
406
|
|
|
407
|
-
resolved_url = lockfile_details&.
|
|
407
|
+
resolved_url = lockfile_details&.resolved
|
|
408
408
|
|
|
409
|
-
resolution = lockfile_details&.
|
|
410
|
-
|
|
411
|
-
resolved_url = CGI.unescape(
|
|
409
|
+
resolution = lockfile_details&.resolution
|
|
410
|
+
package_url = resolution&.[](/__archiveUrl=(.+)/, 1)
|
|
411
|
+
resolved_url = CGI.unescape(package_url) if package_url
|
|
412
412
|
|
|
413
413
|
return unless resolved_url
|
|
414
414
|
return unless resolved_url.start_with?("http")
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "dependabot/shared_helpers"
|
|
@@ -9,6 +9,7 @@ require "dependabot/bun/registry_helper"
|
|
|
9
9
|
require "dependabot/bun/bun_package_manager"
|
|
10
10
|
require "dependabot/bun/language"
|
|
11
11
|
require "dependabot/bun/constraint_helper"
|
|
12
|
+
require "dependabot/package/npm_package_manager_config"
|
|
12
13
|
|
|
13
14
|
module Dependabot
|
|
14
15
|
module Bun
|
|
@@ -59,22 +60,21 @@ module Dependabot
|
|
|
59
60
|
|
|
60
61
|
sig do
|
|
61
62
|
params(
|
|
62
|
-
|
|
63
|
+
config: Dependabot::Package::NpmPackageManagerConfig,
|
|
63
64
|
lockfiles: T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)],
|
|
64
65
|
registry_config_files: T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)],
|
|
65
66
|
credentials: T.nilable(T::Array[Dependabot::Credential])
|
|
66
67
|
).void
|
|
67
68
|
end
|
|
68
|
-
def initialize(
|
|
69
|
-
@package_json = package_json
|
|
69
|
+
def initialize(config, lockfiles, registry_config_files, credentials)
|
|
70
70
|
@lockfiles = lockfiles
|
|
71
71
|
@registry_helper = T.let(
|
|
72
72
|
RegistryHelper.new(registry_config_files, credentials),
|
|
73
73
|
Dependabot::Bun::RegistryHelper
|
|
74
74
|
)
|
|
75
75
|
|
|
76
|
-
@manifest_package_manager = T.let(
|
|
77
|
-
@engines = T.let(
|
|
76
|
+
@manifest_package_manager = T.let(config.package_manager, T.nilable(String))
|
|
77
|
+
@engines = T.let(config.engines, T.nilable(T::Hash[String, String]))
|
|
78
78
|
|
|
79
79
|
@installed_versions = T.let({}, T::Hash[String, String])
|
|
80
80
|
@registries = T.let({}, T::Hash[String, String])
|
|
@@ -105,9 +105,9 @@ module Dependabot
|
|
|
105
105
|
def find_engine_constraints_as_requirement(name)
|
|
106
106
|
Dependabot.logger.info("Processing engine constraints for #{name}")
|
|
107
107
|
|
|
108
|
-
return nil unless @engines
|
|
108
|
+
return nil unless @engines
|
|
109
109
|
|
|
110
|
-
raw_constraint = @engines
|
|
110
|
+
raw_constraint = @engines.fetch(name, "").strip
|
|
111
111
|
return nil if raw_constraint.empty?
|
|
112
112
|
|
|
113
113
|
constraints = ConstraintHelper.extract_ruby_constraints(raw_constraint)
|
|
@@ -227,25 +227,25 @@ module Dependabot
|
|
|
227
227
|
match["version"]
|
|
228
228
|
end
|
|
229
229
|
|
|
230
|
-
sig { params(name: String).returns(T.nilable(
|
|
230
|
+
sig { params(name: String).returns(T.nilable(Integer)) }
|
|
231
231
|
def guessed_version(name)
|
|
232
232
|
lockfile = @lockfiles[name.to_sym]
|
|
233
233
|
return unless lockfile
|
|
234
234
|
|
|
235
|
-
version = Helpers.
|
|
235
|
+
version = Helpers.bun_version_numeric(lockfile)
|
|
236
236
|
|
|
237
237
|
Dependabot.logger.info("Guessed version info \"#{name}\" : \"#{version}\"")
|
|
238
238
|
|
|
239
239
|
version
|
|
240
240
|
end
|
|
241
241
|
|
|
242
|
-
sig { params(name:
|
|
242
|
+
sig { params(name: String).returns(T.nilable(String)) }
|
|
243
243
|
def check_engine_version(name)
|
|
244
|
-
return
|
|
244
|
+
return unless @engines
|
|
245
245
|
|
|
246
246
|
version_selector = VersionSelector.new
|
|
247
247
|
|
|
248
|
-
engine_versions = version_selector.setup(@
|
|
248
|
+
engine_versions = version_selector.setup(@engines, name, BunPackageManager::SUPPORTED_VERSIONS)
|
|
249
249
|
|
|
250
250
|
return if engine_versions.empty?
|
|
251
251
|
|
|
@@ -18,7 +18,7 @@ require "dependabot/bun/update_checker"
|
|
|
18
18
|
require "dependabot/bun/version"
|
|
19
19
|
require "dependabot/shared_helpers"
|
|
20
20
|
|
|
21
|
-
# rubocop:disable Metrics/ClassLength
|
|
21
|
+
# rubocop:disable-next Metrics/ClassLength
|
|
22
22
|
module Dependabot
|
|
23
23
|
module Bun
|
|
24
24
|
class UpdateChecker
|
|
@@ -749,4 +749,3 @@ module Dependabot
|
|
|
749
749
|
end
|
|
750
750
|
end
|
|
751
751
|
end
|
|
752
|
-
# rubocop:enable Metrics/ClassLength
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "dependabot/shared_helpers"
|
|
@@ -10,29 +10,27 @@ module Dependabot
|
|
|
10
10
|
extend T::Sig
|
|
11
11
|
extend T::Helpers
|
|
12
12
|
|
|
13
|
-
# Sets up engine
|
|
13
|
+
# Sets up the requested engine version from the manifest engines.
|
|
14
14
|
#
|
|
15
|
-
# @param
|
|
15
|
+
# @param engine_versions [Hash] The manifest engine constraints.
|
|
16
16
|
# @param name [String] The engine name to match.
|
|
17
17
|
# @return [Hash] A hash with selected versions, if found.
|
|
18
18
|
sig do
|
|
19
19
|
params(
|
|
20
|
-
|
|
20
|
+
engine_versions: T.nilable(T::Hash[String, String]),
|
|
21
21
|
name: String,
|
|
22
22
|
dependabot_versions: T.nilable(T::Array[Dependabot::Version])
|
|
23
23
|
)
|
|
24
|
-
.returns(T::Hash[
|
|
24
|
+
.returns(T::Hash[String, T.nilable(String)])
|
|
25
25
|
end
|
|
26
|
-
def setup(
|
|
27
|
-
engine_versions = manifest_json["engines"]
|
|
28
|
-
|
|
26
|
+
def setup(engine_versions, name, dependabot_versions = nil)
|
|
29
27
|
# Return an empty hash if no engine versions are specified
|
|
30
28
|
return {} if engine_versions.nil?
|
|
31
29
|
|
|
32
|
-
versions = {}
|
|
30
|
+
versions = T.let({}, T::Hash[String, T.nilable(String)])
|
|
33
31
|
|
|
34
32
|
engine_versions.each do |engine, value|
|
|
35
|
-
next unless engine
|
|
33
|
+
next unless engine == name
|
|
36
34
|
|
|
37
35
|
versions[name] = ConstraintHelper.find_highest_version_from_constraint_expression(
|
|
38
36
|
value, dependabot_versions
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dependabot-bun
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.396.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.
|
|
18
|
+
version: 0.396.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.
|
|
25
|
+
version: 0.396.0
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: debug
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -178,19 +178,19 @@ dependencies:
|
|
|
178
178
|
- !ruby/object:Gem::Version
|
|
179
179
|
version: '1.1'
|
|
180
180
|
- !ruby/object:Gem::Dependency
|
|
181
|
-
name:
|
|
181
|
+
name: turbo_tests2
|
|
182
182
|
requirement: !ruby/object:Gem::Requirement
|
|
183
183
|
requirements:
|
|
184
184
|
- - "~>"
|
|
185
185
|
- !ruby/object:Gem::Version
|
|
186
|
-
version:
|
|
186
|
+
version: 3.2.7
|
|
187
187
|
type: :development
|
|
188
188
|
prerelease: false
|
|
189
189
|
version_requirements: !ruby/object:Gem::Requirement
|
|
190
190
|
requirements:
|
|
191
191
|
- - "~>"
|
|
192
192
|
- !ruby/object:Gem::Version
|
|
193
|
-
version:
|
|
193
|
+
version: 3.2.7
|
|
194
194
|
- !ruby/object:Gem::Dependency
|
|
195
195
|
name: vcr
|
|
196
196
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -319,6 +319,7 @@ files:
|
|
|
319
319
|
- lib/dependabot/bun/file_fetcher/path_dependency_builder.rb
|
|
320
320
|
- lib/dependabot/bun/file_parser.rb
|
|
321
321
|
- lib/dependabot/bun/file_parser/bun_lock.rb
|
|
322
|
+
- lib/dependabot/bun/file_parser/bun_lock/record.rb
|
|
322
323
|
- lib/dependabot/bun/file_parser/lockfile_parser.rb
|
|
323
324
|
- lib/dependabot/bun/file_updater.rb
|
|
324
325
|
- lib/dependabot/bun/file_updater/bun_lockfile_updater.rb
|
|
@@ -354,7 +355,7 @@ licenses:
|
|
|
354
355
|
- MIT
|
|
355
356
|
metadata:
|
|
356
357
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
357
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
|
358
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.396.0
|
|
358
359
|
rdoc_options: []
|
|
359
360
|
require_paths:
|
|
360
361
|
- lib
|