dependabot-deno 0.374.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ec6066d4076a76e3d341894a983e26ee507fdeba5d5b6b64dcb24fe01ffc05e6
4
+ data.tar.gz: e3763f86ce236ceae251ba9ab0c161b6eca6aaf27a9d751ac1e7eed9c5966493
5
+ SHA512:
6
+ metadata.gz: ddb2bb058df3aeceaa8212feea1f922b41a35bd5c96c8ad4f201be1015d54a4c8858cc5002cd491c483b6484750753bc80a7da3d13bf7104a4dc44281f317a2c
7
+ data.tar.gz: c58c39f8f1e91219d894cac7f61d4362c5872c576b533b17b2061a4d6dba38aa4a12b34818ec3085ce33975fdca2d199def91f224f128f73126cde2ef56d19ec
@@ -0,0 +1,70 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "dependabot/file_fetchers"
5
+ require "dependabot/file_fetchers/base"
6
+
7
+ module Dependabot
8
+ module Deno
9
+ class FileFetcher < Dependabot::FileFetchers::Base
10
+ extend T::Sig
11
+
12
+ MANIFEST_FILENAMES = T.let(%w(deno.json deno.jsonc).freeze, T::Array[String])
13
+
14
+ sig { override.returns(String) }
15
+ def self.required_files_message
16
+ "Repo must contain a deno.json or deno.jsonc."
17
+ end
18
+
19
+ sig { override.params(filenames: T::Array[String]).returns(T::Boolean) }
20
+ def self.required_files_in?(filenames)
21
+ filenames.any? { |f| MANIFEST_FILENAMES.include?(f) }
22
+ end
23
+
24
+ sig { override.returns(T::Array[DependencyFile]) }
25
+ def fetch_files
26
+ unless allow_beta_ecosystems?
27
+ raise Dependabot::DependencyFileNotFound.new(
28
+ nil,
29
+ "Deno ecosystem support is in beta. Set enable-beta-ecosystems to use it."
30
+ )
31
+ end
32
+
33
+ fetched_files = []
34
+ fetched_files << manifest_file
35
+ fetched_files << lockfile if lockfile
36
+ fetched_files
37
+ end
38
+
39
+ sig { override.returns(T.nilable(T::Hash[Symbol, T.untyped])) }
40
+ def ecosystem_versions
41
+ nil
42
+ end
43
+
44
+ private
45
+
46
+ sig { returns(DependencyFile) }
47
+ def manifest_file
48
+ @manifest_file ||= T.let(
49
+ begin
50
+ file = MANIFEST_FILENAMES.filter_map { |f| fetch_file_if_present(f) }.first
51
+ raise Dependabot::DependencyFileNotFound.new(nil, self.class.required_files_message) unless file
52
+
53
+ file
54
+ end,
55
+ T.nilable(DependencyFile)
56
+ )
57
+ end
58
+
59
+ sig { returns(T.nilable(DependencyFile)) }
60
+ def lockfile
61
+ @lockfile ||= T.let(
62
+ fetch_file_if_present("deno.lock"),
63
+ T.nilable(DependencyFile)
64
+ )
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ Dependabot::FileFetchers.register("deno", Dependabot::Deno::FileFetcher)
@@ -0,0 +1,151 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "dependabot/dependency"
6
+ require "dependabot/file_parsers"
7
+ require "dependabot/file_parsers/base"
8
+ require "dependabot/deno/version"
9
+
10
+ module Dependabot
11
+ module Deno
12
+ class FileParser < Dependabot::FileParsers::Base
13
+ extend T::Sig
14
+
15
+ ECOSYSTEM = "deno"
16
+ MANIFEST_FILENAMES = T.let(%w(deno.json deno.jsonc).freeze, T::Array[String])
17
+
18
+ # Matches jsr:@scope/name[@constraint][/subpath] or npm:[@scope/]name[@constraint][/subpath]
19
+ # Constraint and subpath are both optional per Deno's specifier format.
20
+ JSR_SPECIFIER = %r{\Ajsr:(?<name>@[^@/]+/[^@/]+)(?:@(?<constraint>[^/]+))?(?:/[^\s]*)?\z}
21
+ NPM_SPECIFIER = %r{\Anpm:(?<name>(?:@[^/]+/)?[^@/]+)(?:@(?<constraint>[^/]+))?(?:/[^\s]*)?\z}
22
+
23
+ # Matches either a JSON string literal (with escapes), a line comment, a
24
+ # block comment, or a trailing comma. The alternation lets gsub preserve
25
+ # strings while stripping the JSONC-only constructs, so e.g. "//" inside a
26
+ # URL value is not mistaken for the start of a comment.
27
+ JSONC_TOKEN = %r{
28
+ ("(?:\\.|[^"\\])*") # JSON string literal
29
+ | //[^\n]* # line comment
30
+ | /\*.*?\*/ # block comment
31
+ | ,(?=\s*[\}\]]) # trailing comma
32
+ }mx
33
+
34
+ sig { override.returns(T::Array[Dependabot::Dependency]) }
35
+ def parse
36
+ # Multiple import aliases can reference the same underlying package
37
+ # (e.g. "@std/path" and "@std/path/posix"). Keyed dedup by name +
38
+ # source type collapses those without merging across registries — our
39
+ # update checker only queries the first requirement's source, so
40
+ # mixing jsr+npm under one Dependency would silently miss updates.
41
+ # When the same name+source appears with different constraints, every
42
+ # constraint is preserved as a separate requirement entry so callers
43
+ # can update them all.
44
+ deps_by_key = {}
45
+
46
+ imports.each do |_alias_name, specifier|
47
+ dep = parse_specifier(specifier.to_s)
48
+ next unless dep
49
+
50
+ key = [dep.name, T.must(dep.requirements.first)[:source][:type]]
51
+ existing = deps_by_key[key]
52
+ deps_by_key[key] = if existing
53
+ Dependabot::Dependency.new(
54
+ name: existing.name,
55
+ version: existing.version,
56
+ requirements: (existing.requirements + dep.requirements).uniq,
57
+ package_manager: existing.package_manager
58
+ )
59
+ else
60
+ dep
61
+ end
62
+ end
63
+
64
+ deps_by_key.values.sort_by(&:name)
65
+ end
66
+
67
+ private
68
+
69
+ sig { override.void }
70
+ def check_required_files
71
+ return if manifest_file
72
+
73
+ raise "No deno.json or deno.jsonc found!"
74
+ end
75
+
76
+ sig { returns(T::Hash[String, T.untyped]) }
77
+ def imports
78
+ parsed_manifest.fetch("imports", {})
79
+ end
80
+
81
+ sig { returns(T::Hash[String, T.untyped]) }
82
+ def parsed_manifest
83
+ @parsed_manifest ||= T.let(
84
+ parse_json_or_jsonc(T.must(manifest_file).content),
85
+ T.nilable(T::Hash[String, T.untyped])
86
+ )
87
+ end
88
+
89
+ sig { returns(T.nilable(DependencyFile)) }
90
+ def manifest_file
91
+ @manifest_file ||= T.let(
92
+ MANIFEST_FILENAMES.filter_map { |f| get_original_file(f) }.first,
93
+ T.nilable(DependencyFile)
94
+ )
95
+ end
96
+
97
+ sig { params(specifier: String).returns(T.nilable(Dependabot::Dependency)) }
98
+ def parse_specifier(specifier)
99
+ if (match = JSR_SPECIFIER.match(specifier))
100
+ build_dependency(
101
+ name: T.must(match[:name]),
102
+ constraint: match[:constraint],
103
+ source_type: "jsr"
104
+ )
105
+ elsif (match = NPM_SPECIFIER.match(specifier))
106
+ build_dependency(
107
+ name: T.must(match[:name]),
108
+ constraint: match[:constraint],
109
+ source_type: "npm"
110
+ )
111
+ end
112
+ end
113
+
114
+ sig { params(name: String, constraint: T.nilable(String), source_type: String).returns(Dependabot::Dependency) }
115
+ def build_dependency(name:, constraint:, source_type:)
116
+ version = constraint ? extract_version(constraint) : nil
117
+
118
+ Dependabot::Dependency.new(
119
+ name: name,
120
+ version: version,
121
+ requirements: [{
122
+ requirement: constraint,
123
+ file: T.must(manifest_file).name,
124
+ groups: ["imports"],
125
+ source: { type: source_type }
126
+ }],
127
+ package_manager: ECOSYSTEM
128
+ )
129
+ end
130
+
131
+ sig { params(constraint: String).returns(T.nilable(String)) }
132
+ def extract_version(constraint)
133
+ version_str = constraint.sub(/\A[~^>=<!\s]+/, "")
134
+ return version_str if Deno::Version.correct?(version_str)
135
+
136
+ nil
137
+ end
138
+
139
+ sig { params(content: T.nilable(String)).returns(T::Hash[String, T.untyped]) }
140
+ def parse_json_or_jsonc(content)
141
+ return {} unless content
142
+
143
+ cleaned = content.gsub(JSONC_TOKEN) { ::Regexp.last_match(1) || "" }
144
+
145
+ JSON.parse(cleaned)
146
+ end
147
+ end
148
+ end
149
+ end
150
+
151
+ Dependabot::FileParsers.register("deno", Dependabot::Deno::FileParser)
@@ -0,0 +1,66 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "dependabot/file_updaters"
5
+ require "dependabot/file_updaters/base"
6
+
7
+ module Dependabot
8
+ module Deno
9
+ class FileUpdater < Dependabot::FileUpdaters::Base
10
+ extend T::Sig
11
+
12
+ MANIFEST_FILENAMES = T.let(%w(deno.json deno.jsonc).freeze, T::Array[String])
13
+
14
+ sig { override.returns(T::Array[Dependabot::DependencyFile]) }
15
+ def updated_dependency_files
16
+ updated_files = []
17
+
18
+ dependency_files.each do |file|
19
+ next unless MANIFEST_FILENAMES.include?(file.name)
20
+
21
+ new_content = update_manifest_content(file)
22
+ next if new_content == file.content
23
+
24
+ updated_files << updated_file(file: file, content: new_content)
25
+ end
26
+
27
+ updated_files
28
+ end
29
+
30
+ private
31
+
32
+ sig { override.void }
33
+ def check_required_files
34
+ return if dependency_files.any? { |f| MANIFEST_FILENAMES.include?(f.name) }
35
+
36
+ raise "No deno.json or deno.jsonc found!"
37
+ end
38
+
39
+ sig { params(file: Dependabot::DependencyFile).returns(String) }
40
+ def update_manifest_content(file)
41
+ content = T.must(file.content)
42
+
43
+ dependencies.each do |dep|
44
+ prev_reqs = dep.previous_requirements&.select { |r| r[:file] == file.name } || []
45
+ new_reqs = dep.requirements.select { |r| r[:file] == file.name }
46
+
47
+ prev_reqs.zip(new_reqs).each do |prev_req, new_req|
48
+ source_type = prev_req[:source][:type]
49
+ prev_req_str = prev_req[:requirement]
50
+ new_req_str = T.must(new_req)[:requirement]
51
+
52
+ base = "#{source_type}:#{dep.name}"
53
+ old_specifier = prev_req_str ? "#{base}@#{prev_req_str}" : base
54
+ new_specifier = "#{base}@#{new_req_str}"
55
+
56
+ content = content.gsub(%r{#{Regexp.escape(old_specifier)}(?=["/])}, new_specifier)
57
+ end
58
+ end
59
+
60
+ content
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ Dependabot::FileUpdaters.register("deno", Dependabot::Deno::FileUpdater)
@@ -0,0 +1,52 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "dependabot/metadata_finders"
6
+ require "dependabot/metadata_finders/base"
7
+ require "dependabot/registry_client"
8
+
9
+ module Dependabot
10
+ module Deno
11
+ class MetadataFinder < Dependabot::MetadataFinders::Base
12
+ extend T::Sig
13
+
14
+ private
15
+
16
+ sig { override.returns(T.nilable(Dependabot::Source)) }
17
+ def look_up_source
18
+ source_type = dependency.requirements.first&.dig(:source, :type)
19
+
20
+ case source_type
21
+ when "npm"
22
+ find_source_from_npm
23
+ when "jsr"
24
+ find_source_from_jsr
25
+ end
26
+ end
27
+
28
+ sig { returns(T.nilable(Dependabot::Source)) }
29
+ def find_source_from_npm
30
+ response = Dependabot::RegistryClient.get(
31
+ url: "https://registry.npmjs.org/#{dependency.name}"
32
+ )
33
+ data = JSON.parse(response.body)
34
+
35
+ repo = data.dig("repository", "url")
36
+ return nil unless repo
37
+
38
+ Source.from_url(repo)
39
+ rescue JSON::ParserError, Excon::Error::Timeout, Excon::Error::Socket
40
+ nil
41
+ end
42
+
43
+ sig { returns(T.nilable(Dependabot::Source)) }
44
+ def find_source_from_jsr
45
+ # JSR meta.json doesn't include repository info directly
46
+ nil
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ Dependabot::MetadataFinders.register("deno", Dependabot::Deno::MetadataFinder)
@@ -0,0 +1,104 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "time"
6
+ require "sorbet-runtime"
7
+ require "dependabot/registry_client"
8
+ require "dependabot/package/package_release"
9
+ require "dependabot/deno/version"
10
+
11
+ module Dependabot
12
+ module Deno
13
+ module Package
14
+ class PackageDetailsFetcher
15
+ extend T::Sig
16
+
17
+ sig do
18
+ params(
19
+ dependency: Dependabot::Dependency
20
+ ).void
21
+ end
22
+ def initialize(dependency:)
23
+ @dependency = dependency
24
+ end
25
+
26
+ sig { returns(T::Array[Dependabot::Package::PackageRelease]) }
27
+ def available_versions
28
+ source_type = dependency.requirements.first&.dig(:source, :type)
29
+
30
+ case source_type
31
+ when "jsr"
32
+ fetch_jsr_releases
33
+ when "npm"
34
+ fetch_npm_releases
35
+ else
36
+ []
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ sig { returns(Dependabot::Dependency) }
43
+ attr_reader :dependency
44
+
45
+ sig { returns(T::Array[Dependabot::Package::PackageRelease]) }
46
+ def fetch_jsr_releases
47
+ name = dependency.name
48
+ url = "https://jsr.io/#{name}/meta.json"
49
+
50
+ response = Dependabot::RegistryClient.get(url: url)
51
+ data = JSON.parse(response.body)
52
+
53
+ data.fetch("versions", {}).filter_map do |version_str, meta|
54
+ next unless Deno::Version.correct?(version_str)
55
+
56
+ yanked = meta.is_a?(Hash) && meta["yanked"] == true
57
+ released_at = parse_time(meta["createdAt"]) if meta.is_a?(Hash)
58
+
59
+ Dependabot::Package::PackageRelease.new(
60
+ version: Deno::Version.new(version_str),
61
+ released_at: released_at,
62
+ yanked: yanked
63
+ )
64
+ end
65
+ rescue JSON::ParserError, Excon::Error::Timeout, Excon::Error::Socket
66
+ []
67
+ end
68
+
69
+ sig { returns(T::Array[Dependabot::Package::PackageRelease]) }
70
+ def fetch_npm_releases
71
+ name = dependency.name
72
+ url = "https://registry.npmjs.org/#{name}"
73
+
74
+ response = Dependabot::RegistryClient.get(url: url)
75
+ data = JSON.parse(response.body)
76
+
77
+ time_data = data.fetch("time", {})
78
+
79
+ data.fetch("versions", {}).filter_map do |version_str, _meta|
80
+ next unless Deno::Version.correct?(version_str)
81
+
82
+ released_at = parse_time(time_data[version_str])
83
+
84
+ Dependabot::Package::PackageRelease.new(
85
+ version: Deno::Version.new(version_str),
86
+ released_at: released_at
87
+ )
88
+ end
89
+ rescue JSON::ParserError, Excon::Error::Timeout, Excon::Error::Socket
90
+ []
91
+ end
92
+
93
+ sig { params(time_str: T.nilable(String)).returns(T.nilable(Time)) }
94
+ def parse_time(time_str)
95
+ return nil unless time_str
96
+
97
+ Time.parse(time_str)
98
+ rescue ArgumentError
99
+ nil
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,74 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/requirement"
6
+ require "dependabot/utils"
7
+ require "dependabot/deno/version"
8
+
9
+ # Deno uses npm-style semver constraints for both jsr: and npm: specifiers.
10
+ # Supported operators: ^, ~, >=, >, <=, <, =, exact version
11
+
12
+ module Dependabot
13
+ module Deno
14
+ class Requirement < Dependabot::Requirement
15
+ extend T::Sig
16
+
17
+ sig { override.params(requirement_string: T.nilable(String)).returns(T::Array[Requirement]) }
18
+ def self.requirements_array(requirement_string)
19
+ return [new(nil)] if requirement_string.nil?
20
+
21
+ [new(requirement_string)]
22
+ end
23
+
24
+ sig { params(requirements: T.nilable(T.any(String, T::Array[String]))).void }
25
+ def initialize(*requirements)
26
+ requirements = requirements.flatten.compact.flat_map do |req_string|
27
+ req_string.split(",").map(&:strip).map do |r|
28
+ convert_deno_constraint_to_ruby_constraint(r.strip)
29
+ end
30
+ end
31
+ requirements = [">= 0"] if requirements.empty?
32
+ super(requirements)
33
+ end
34
+
35
+ private
36
+
37
+ sig { params(req_string: String).returns(T.any(String, T::Array[String])) }
38
+ def convert_deno_constraint_to_ruby_constraint(req_string)
39
+ if req_string.match?(/^\^/) then convert_caret_req(req_string)
40
+ elsif req_string.match?(/^~[^>]/) then convert_tilde_req(req_string)
41
+ elsif req_string.match?(/[<=>]/) then req_string
42
+ else
43
+ "= #{req_string}"
44
+ end
45
+ end
46
+
47
+ sig { params(req_string: String).returns(String) }
48
+ def convert_tilde_req(req_string)
49
+ version = req_string.gsub(/^~/, "")
50
+ "~> #{version}"
51
+ end
52
+
53
+ sig { params(req_string: String).returns(T::Array[String]) }
54
+ def convert_caret_req(req_string)
55
+ version = req_string.gsub(/^\^/, "")
56
+ parts = version.split(".")
57
+ first_non_zero = parts.find { |d| d != "0" }
58
+ first_non_zero_index =
59
+ first_non_zero ? parts.index(first_non_zero) : parts.count - 1
60
+ upper_bound = parts.map.with_index do |part, i|
61
+ if i < T.must(first_non_zero_index) then part
62
+ elsif i == first_non_zero_index then (part.to_i + 1).to_s
63
+ else
64
+ 0
65
+ end
66
+ end.join(".")
67
+
68
+ [">= #{version}", "< #{upper_bound}"]
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ Dependabot::Utils.register_requirement_class("deno", Dependabot::Deno::Requirement)
@@ -0,0 +1,33 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/package/package_latest_version_finder"
6
+ require "dependabot/package/package_details"
7
+ require "dependabot/deno/update_checker"
8
+ require "dependabot/deno/package/package_details_fetcher"
9
+
10
+ module Dependabot
11
+ module Deno
12
+ class UpdateChecker < Dependabot::UpdateCheckers::Base
13
+ class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
14
+ extend T::Sig
15
+
16
+ private
17
+
18
+ sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
19
+ def package_details
20
+ @package_details ||= T.let(
21
+ Dependabot::Package::PackageDetails.new(
22
+ dependency: dependency,
23
+ releases: Package::PackageDetailsFetcher.new(
24
+ dependency: dependency
25
+ ).available_versions
26
+ ),
27
+ T.nilable(Dependabot::Package::PackageDetails)
28
+ )
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,94 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "dependabot/update_checkers"
5
+ require "dependabot/update_checkers/base"
6
+ require "dependabot/deno/version"
7
+ require "dependabot/deno/requirement"
8
+
9
+ module Dependabot
10
+ module Deno
11
+ class UpdateChecker < Dependabot::UpdateCheckers::Base
12
+ extend T::Sig
13
+
14
+ require_relative "update_checker/latest_version_finder"
15
+
16
+ sig { override.returns(T.nilable(T.any(String, Gem::Version))) }
17
+ def latest_version
18
+ latest_version_finder.latest_version
19
+ end
20
+
21
+ sig { override.returns(T.nilable(T.any(String, Gem::Version))) }
22
+ def latest_resolvable_version
23
+ latest_version
24
+ end
25
+
26
+ sig { override.returns(T.nilable(String)) }
27
+ def latest_resolvable_version_with_no_unlock
28
+ dependency.version
29
+ end
30
+
31
+ sig { override.returns(T::Array[T::Hash[Symbol, T.untyped]]) }
32
+ def updated_requirements
33
+ return dependency.requirements unless latest_version
34
+
35
+ dependency.requirements.map do |req|
36
+ req.merge(requirement: updated_constraint(req[:requirement]))
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ sig { override.returns(T::Boolean) }
43
+ def latest_version_resolvable_with_full_unlock?
44
+ false
45
+ end
46
+
47
+ sig { override.returns(T::Array[Dependabot::Dependency]) }
48
+ def updated_dependencies_after_full_unlock
49
+ []
50
+ end
51
+
52
+ sig { returns(LatestVersionFinder) }
53
+ def latest_version_finder
54
+ @latest_version_finder ||= T.let(
55
+ LatestVersionFinder.new(
56
+ dependency: dependency,
57
+ dependency_files: dependency_files,
58
+ credentials: credentials,
59
+ ignored_versions: ignored_versions,
60
+ security_advisories: security_advisories,
61
+ cooldown_options: update_cooldown
62
+ ),
63
+ T.nilable(LatestVersionFinder)
64
+ )
65
+ end
66
+
67
+ sig { params(old_constraint: T.nilable(String)).returns(String) }
68
+ def updated_constraint(old_constraint)
69
+ return latest_version.to_s unless old_constraint
70
+
71
+ latest = latest_version
72
+ return old_constraint unless latest
73
+
74
+ if old_constraint.start_with?("^")
75
+ "^#{latest}"
76
+ elsif old_constraint.start_with?("~")
77
+ "~#{latest}"
78
+ elsif old_constraint.start_with?("=")
79
+ "=#{latest}"
80
+ elsif old_constraint.match?(/\A[><]/)
81
+ # Range constraints (>=, <=, <, >, and compound ranges like
82
+ # ">=1.0.0 <2.0.0") are intentionally left unchanged. Updating
83
+ # range bounds requires resolving the new version against the
84
+ # full range and is deferred to a follow-up.
85
+ old_constraint
86
+ else
87
+ latest.to_s
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ Dependabot::UpdateCheckers.register("deno", Dependabot::Deno::UpdateChecker)
@@ -0,0 +1,57 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "dependabot/version"
5
+ require "dependabot/utils"
6
+ require "sorbet-runtime"
7
+
8
+ # Deno uses semver for both jsr: and npm: specifiers.
9
+ # Build metadata (e.g. 1.0.0+build) is preserved but ignored in comparisons.
10
+
11
+ module Dependabot
12
+ module Deno
13
+ class Version < Dependabot::Version
14
+ extend T::Sig
15
+
16
+ VERSION_PATTERN = T.let(Gem::Version::VERSION_PATTERN + '(\+[0-9a-zA-Z\-.]+)?', String)
17
+ ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/
18
+
19
+ sig { returns(T.nilable(String)) }
20
+ attr_reader :build_info
21
+
22
+ sig { override.params(version: VersionParameter).returns(T::Boolean) }
23
+ def self.correct?(version)
24
+ return false if version.nil?
25
+
26
+ version.to_s.match?(ANCHORED_VERSION_PATTERN)
27
+ end
28
+
29
+ sig { override.params(version: VersionParameter).void }
30
+ def initialize(version)
31
+ @version_string = T.let(version.to_s, String)
32
+ @build_info = T.let(nil, T.nilable(String))
33
+
34
+ version, @build_info = version.to_s.split("+") if version.to_s.include?("+")
35
+
36
+ super(T.must(version))
37
+ end
38
+
39
+ sig { override.params(version: VersionParameter).returns(Dependabot::Deno::Version) }
40
+ def self.new(version)
41
+ T.cast(super, Dependabot::Deno::Version)
42
+ end
43
+
44
+ sig { override.returns(String) }
45
+ def to_s
46
+ @version_string
47
+ end
48
+
49
+ sig { override.returns(String) }
50
+ def inspect
51
+ "#<#{self.class} #{@version_string}>"
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ Dependabot::Utils.register_version_class("deno", Dependabot::Deno::Version)
@@ -0,0 +1,23 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ # These all need to be required so the various classes can be registered in a
5
+ # lookup table of package manager names to concrete classes.
6
+ require "dependabot/deno/file_fetcher"
7
+ require "dependabot/deno/file_parser"
8
+ require "dependabot/deno/update_checker"
9
+ require "dependabot/deno/file_updater"
10
+ require "dependabot/deno/metadata_finder"
11
+ require "dependabot/deno/package/package_details_fetcher"
12
+ require "dependabot/deno/version"
13
+ require "dependabot/deno/requirement"
14
+
15
+ require "dependabot/pull_request_creator/labeler"
16
+ Dependabot::PullRequestCreator::Labeler
17
+ .register_label_details("deno", name: "deno", colour: "70ffaf")
18
+
19
+ require "dependabot/dependency"
20
+ # Deno's import map has no dev/prod distinction (no devDependencies equivalent),
21
+ # so every import is treated as production. If a future deno.json schema adds
22
+ # a way to mark dev-only or test-only imports, this check should consult groups.
23
+ Dependabot::Dependency.register_production_check("deno", ->(_) { true })
metadata ADDED
@@ -0,0 +1,277 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dependabot-deno
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.374.0
5
+ platform: ruby
6
+ authors:
7
+ - Dependabot
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: dependabot-common
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - '='
17
+ - !ruby/object:Gem::Version
18
+ version: 0.374.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - '='
24
+ - !ruby/object:Gem::Version
25
+ version: 0.374.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: debug
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.9'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.9'
40
+ - !ruby/object:Gem::Dependency
41
+ name: gpgme
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rake
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '13.2'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '13.2'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.12'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.12'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec-its
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rspec-sorbet
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.9'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.9'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.80'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.80'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rubocop-performance
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.26'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.26'
138
+ - !ruby/object:Gem::Dependency
139
+ name: rubocop-rspec
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.7'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.7'
152
+ - !ruby/object:Gem::Dependency
153
+ name: rubocop-sorbet
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.10'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.10'
166
+ - !ruby/object:Gem::Dependency
167
+ name: simplecov
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.22'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '0.22'
180
+ - !ruby/object:Gem::Dependency
181
+ name: turbo_tests
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: 2.2.5
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: 2.2.5
194
+ - !ruby/object:Gem::Dependency
195
+ name: vcr
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '6.1'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '6.1'
208
+ - !ruby/object:Gem::Dependency
209
+ name: webmock
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '3.25'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '3.25'
222
+ - !ruby/object:Gem::Dependency
223
+ name: webrick
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '1.9'
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '1.9'
236
+ description: Dependabot-Deno provides support for bumping Deno dependencies via Dependabot.
237
+ If you want support for multiple package managers, you probably want the meta-gem
238
+ dependabot-omnibus.
239
+ email: opensource@github.com
240
+ executables: []
241
+ extensions: []
242
+ extra_rdoc_files: []
243
+ files:
244
+ - lib/dependabot/deno.rb
245
+ - lib/dependabot/deno/file_fetcher.rb
246
+ - lib/dependabot/deno/file_parser.rb
247
+ - lib/dependabot/deno/file_updater.rb
248
+ - lib/dependabot/deno/metadata_finder.rb
249
+ - lib/dependabot/deno/package/package_details_fetcher.rb
250
+ - lib/dependabot/deno/requirement.rb
251
+ - lib/dependabot/deno/update_checker.rb
252
+ - lib/dependabot/deno/update_checker/latest_version_finder.rb
253
+ - lib/dependabot/deno/version.rb
254
+ homepage: https://github.com/dependabot/dependabot-core
255
+ licenses:
256
+ - MIT
257
+ metadata:
258
+ bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
259
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.374.0
260
+ rdoc_options: []
261
+ require_paths:
262
+ - lib
263
+ required_ruby_version: !ruby/object:Gem::Requirement
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ version: 3.3.0
268
+ required_rubygems_version: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - ">="
271
+ - !ruby/object:Gem::Version
272
+ version: 3.3.0
273
+ requirements: []
274
+ rubygems_version: 3.7.2
275
+ specification_version: 4
276
+ summary: Provides Dependabot support for Deno
277
+ test_files: []