dependabot-bun 0.296.2 → 0.296.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/.eslintrc +11 -0
  3. data/helpers/README.md +29 -0
  4. data/helpers/build +26 -0
  5. data/helpers/jest.config.js +5 -0
  6. data/helpers/lib/npm/conflicting-dependency-parser.js +78 -0
  7. data/helpers/lib/npm/index.js +9 -0
  8. data/helpers/lib/npm/vulnerability-auditor.js +291 -0
  9. data/helpers/lib/npm6/helpers.js +25 -0
  10. data/helpers/lib/npm6/index.js +9 -0
  11. data/helpers/lib/npm6/peer-dependency-checker.js +111 -0
  12. data/helpers/lib/npm6/remove-dependencies-from-lockfile.js +22 -0
  13. data/helpers/lib/npm6/subdependency-updater.js +78 -0
  14. data/helpers/lib/npm6/updater.js +199 -0
  15. data/helpers/lib/pnpm/index.js +5 -0
  16. data/helpers/lib/pnpm/lockfile-parser.js +82 -0
  17. data/helpers/lib/yarn/conflicting-dependency-parser.js +176 -0
  18. data/helpers/lib/yarn/fix-duplicates.js +80 -0
  19. data/helpers/lib/yarn/helpers.js +54 -0
  20. data/helpers/lib/yarn/index.js +14 -0
  21. data/helpers/lib/yarn/lockfile-parser.js +21 -0
  22. data/helpers/lib/yarn/peer-dependency-checker.js +132 -0
  23. data/helpers/lib/yarn/replace-lockfile-declaration.js +57 -0
  24. data/helpers/lib/yarn/subdependency-updater.js +83 -0
  25. data/helpers/lib/yarn/updater.js +209 -0
  26. data/helpers/package-lock.json +28519 -0
  27. data/helpers/package.json +29 -0
  28. data/helpers/patches/npm++pacote+9.5.12.patch +14 -0
  29. data/helpers/run.js +30 -0
  30. data/helpers/test/npm6/conflicting-dependency-parser.test.js +66 -0
  31. data/helpers/test/npm6/fixtures/conflicting-dependency-parser/deeply-nested/package-lock.json +591 -0
  32. data/helpers/test/npm6/fixtures/conflicting-dependency-parser/deeply-nested/package.json +14 -0
  33. data/helpers/test/npm6/fixtures/conflicting-dependency-parser/nested/package-lock.json +188 -0
  34. data/helpers/test/npm6/fixtures/conflicting-dependency-parser/nested/package.json +14 -0
  35. data/helpers/test/npm6/fixtures/conflicting-dependency-parser/simple/package-lock.json +27 -0
  36. data/helpers/test/npm6/fixtures/conflicting-dependency-parser/simple/package.json +14 -0
  37. data/helpers/test/npm6/fixtures/updater/original/package-lock.json +16 -0
  38. data/helpers/test/npm6/fixtures/updater/original/package.json +9 -0
  39. data/helpers/test/npm6/fixtures/updater/updated/package-lock.json +16 -0
  40. data/helpers/test/npm6/helpers.js +21 -0
  41. data/helpers/test/npm6/updater.test.js +30 -0
  42. data/helpers/test/pnpm/fixtures/parser/empty_version/pnpm-lock.yaml +72 -0
  43. data/helpers/test/pnpm/fixtures/parser/no_lockfile_change/pnpm-lock.yaml +2744 -0
  44. data/helpers/test/pnpm/fixtures/parser/only_dev_dependencies/pnpm-lock.yaml +16 -0
  45. data/helpers/test/pnpm/fixtures/parser/peer_disambiguation/pnpm-lock.yaml +855 -0
  46. data/helpers/test/pnpm/lockfile-parser.test.js +62 -0
  47. data/helpers/test/yarn/conflicting-dependency-parser.test.js +83 -0
  48. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/deeply-nested/package.json +14 -0
  49. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/deeply-nested/yarn.lock +496 -0
  50. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/dev-dependencies/package.json +14 -0
  51. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/dev-dependencies/yarn.lock +21 -0
  52. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/nested/package.json +14 -0
  53. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/nested/yarn.lock +183 -0
  54. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/simple/package.json +14 -0
  55. data/helpers/test/yarn/fixtures/conflicting-dependency-parser/simple/yarn.lock +21 -0
  56. data/helpers/test/yarn/fixtures/updater/illegal_character/package.json +8 -0
  57. data/helpers/test/yarn/fixtures/updater/illegal_character/yarn.lock +14 -0
  58. data/helpers/test/yarn/fixtures/updater/original/package.json +6 -0
  59. data/helpers/test/yarn/fixtures/updater/original/yarn.lock +11 -0
  60. data/helpers/test/yarn/fixtures/updater/updated/yarn.lock +12 -0
  61. data/helpers/test/yarn/fixtures/updater/with-version-comments/package.json +5 -0
  62. data/helpers/test/yarn/fixtures/updater/with-version-comments/yarn.lock +13 -0
  63. data/helpers/test/yarn/helpers.js +18 -0
  64. data/helpers/test/yarn/updater.test.js +117 -0
  65. data/lib/dependabot/bun/bun_package_manager.rb +47 -0
  66. data/lib/dependabot/bun/constraint_helper.rb +359 -0
  67. data/lib/dependabot/bun/dependency_files_filterer.rb +157 -0
  68. data/lib/dependabot/bun/file_fetcher/path_dependency_builder.rb +184 -0
  69. data/lib/dependabot/bun/file_fetcher.rb +402 -0
  70. data/lib/dependabot/bun/file_parser/bun_lock.rb +140 -0
  71. data/lib/dependabot/bun/file_parser/lockfile_parser.rb +105 -0
  72. data/lib/dependabot/bun/file_parser.rb +477 -0
  73. data/lib/dependabot/bun/file_updater/bun_lockfile_updater.rb +144 -0
  74. data/lib/dependabot/bun/file_updater/npmrc_builder.rb +256 -0
  75. data/lib/dependabot/bun/file_updater/package_json_preparer.rb +88 -0
  76. data/lib/dependabot/bun/file_updater/package_json_updater.rb +378 -0
  77. data/lib/dependabot/bun/file_updater.rb +203 -0
  78. data/lib/dependabot/bun/helpers.rb +93 -0
  79. data/lib/dependabot/bun/language.rb +45 -0
  80. data/lib/dependabot/bun/metadata_finder.rb +214 -0
  81. data/lib/dependabot/bun/native_helpers.rb +19 -0
  82. data/lib/dependabot/bun/package_manager.rb +280 -0
  83. data/lib/dependabot/bun/package_name.rb +118 -0
  84. data/lib/dependabot/bun/pnpm_package_manager.rb +55 -0
  85. data/lib/dependabot/bun/registry_helper.rb +188 -0
  86. data/lib/dependabot/bun/registry_parser.rb +93 -0
  87. data/lib/dependabot/bun/requirement.rb +146 -0
  88. data/lib/dependabot/bun/sub_dependency_files_filterer.rb +82 -0
  89. data/lib/dependabot/bun/update_checker/conflicting_dependency_resolver.rb +59 -0
  90. data/lib/dependabot/bun/update_checker/dependency_files_builder.rb +79 -0
  91. data/lib/dependabot/bun/update_checker/latest_version_finder.rb +448 -0
  92. data/lib/dependabot/bun/update_checker/library_detector.rb +76 -0
  93. data/lib/dependabot/bun/update_checker/registry_finder.rb +279 -0
  94. data/lib/dependabot/bun/update_checker/requirements_updater.rb +206 -0
  95. data/lib/dependabot/bun/update_checker/subdependency_version_resolver.rb +154 -0
  96. data/lib/dependabot/bun/update_checker/version_resolver.rb +583 -0
  97. data/lib/dependabot/bun/update_checker/vulnerability_auditor.rb +164 -0
  98. data/lib/dependabot/bun/update_checker.rb +455 -0
  99. data/lib/dependabot/bun/version.rb +138 -0
  100. data/lib/dependabot/bun/version_selector.rb +61 -0
  101. data/lib/dependabot/bun.rb +337 -35
  102. metadata +108 -65
  103. data/lib/dependabot/javascript/bun/file_fetcher.rb +0 -77
  104. data/lib/dependabot/javascript/bun/file_parser/bun_lock.rb +0 -156
  105. data/lib/dependabot/javascript/bun/file_parser/lockfile_parser.rb +0 -55
  106. data/lib/dependabot/javascript/bun/file_parser.rb +0 -74
  107. data/lib/dependabot/javascript/bun/file_updater/lockfile_updater.rb +0 -138
  108. data/lib/dependabot/javascript/bun/file_updater.rb +0 -75
  109. data/lib/dependabot/javascript/bun/helpers.rb +0 -72
  110. data/lib/dependabot/javascript/bun/package_manager.rb +0 -48
  111. data/lib/dependabot/javascript/bun/requirement.rb +0 -11
  112. data/lib/dependabot/javascript/bun/update_checker/conflicting_dependency_resolver.rb +0 -64
  113. data/lib/dependabot/javascript/bun/update_checker/dependency_files_builder.rb +0 -47
  114. data/lib/dependabot/javascript/bun/update_checker/latest_version_finder.rb +0 -450
  115. data/lib/dependabot/javascript/bun/update_checker/library_detector.rb +0 -76
  116. data/lib/dependabot/javascript/bun/update_checker/requirements_updater.rb +0 -203
  117. data/lib/dependabot/javascript/bun/update_checker/subdependency_version_resolver.rb +0 -144
  118. data/lib/dependabot/javascript/bun/update_checker/version_resolver.rb +0 -525
  119. data/lib/dependabot/javascript/bun/update_checker/vulnerability_auditor.rb +0 -165
  120. data/lib/dependabot/javascript/bun/update_checker.rb +0 -440
  121. data/lib/dependabot/javascript/bun/version.rb +0 -11
  122. data/lib/dependabot/javascript/shared/constraint_helper.rb +0 -359
  123. data/lib/dependabot/javascript/shared/dependency_files_filterer.rb +0 -164
  124. data/lib/dependabot/javascript/shared/file_fetcher.rb +0 -283
  125. data/lib/dependabot/javascript/shared/file_parser/lockfile_parser.rb +0 -106
  126. data/lib/dependabot/javascript/shared/file_parser.rb +0 -454
  127. data/lib/dependabot/javascript/shared/file_updater/npmrc_builder.rb +0 -394
  128. data/lib/dependabot/javascript/shared/file_updater/package_json_preparer.rb +0 -87
  129. data/lib/dependabot/javascript/shared/file_updater/package_json_updater.rb +0 -376
  130. data/lib/dependabot/javascript/shared/file_updater.rb +0 -179
  131. data/lib/dependabot/javascript/shared/language.rb +0 -45
  132. data/lib/dependabot/javascript/shared/metadata_finder.rb +0 -209
  133. data/lib/dependabot/javascript/shared/native_helpers.rb +0 -21
  134. data/lib/dependabot/javascript/shared/package_manager_detector.rb +0 -72
  135. data/lib/dependabot/javascript/shared/package_name.rb +0 -118
  136. data/lib/dependabot/javascript/shared/registry_helper.rb +0 -190
  137. data/lib/dependabot/javascript/shared/registry_parser.rb +0 -93
  138. data/lib/dependabot/javascript/shared/requirement.rb +0 -144
  139. data/lib/dependabot/javascript/shared/sub_dependency_files_filterer.rb +0 -79
  140. data/lib/dependabot/javascript/shared/update_checker/dependency_files_builder.rb +0 -87
  141. data/lib/dependabot/javascript/shared/update_checker/registry_finder.rb +0 -358
  142. data/lib/dependabot/javascript/shared/version.rb +0 -133
  143. data/lib/dependabot/javascript/shared/version_selector.rb +0 -60
  144. data/lib/dependabot/javascript.rb +0 -39
@@ -1,450 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- require "excon"
5
-
6
- module Dependabot
7
- module Javascript
8
- module Bun
9
- class UpdateChecker
10
- class LatestVersionFinder
11
- extend T::Sig
12
-
13
- def initialize(dependency:, credentials:, dependency_files:,
14
- ignored_versions:, security_advisories:,
15
- raise_on_ignored: false)
16
- @dependency = dependency
17
- @credentials = credentials
18
- @dependency_files = dependency_files
19
- @ignored_versions = ignored_versions
20
- @raise_on_ignored = raise_on_ignored
21
- @security_advisories = security_advisories
22
- end
23
-
24
- def latest_version_from_registry
25
- return unless valid_npm_details?
26
- return version_from_dist_tags if version_from_dist_tags
27
- return if specified_dist_tag_requirement?
28
-
29
- possible_versions.find { |v| !yanked?(v) }
30
- rescue Excon::Error::Socket, Excon::Error::Timeout, RegistryError
31
- raise if dependency_registry == "registry.npmjs.org"
32
- # Custom registries can be flaky. We don't want to make that
33
- # our problem, so we quietly return `nil` here.
34
- end
35
-
36
- def latest_version_with_no_unlock
37
- return unless valid_npm_details?
38
- return version_from_dist_tags if specified_dist_tag_requirement?
39
-
40
- in_range_versions = filter_out_of_range_versions(possible_versions)
41
- in_range_versions.find { |version| !yanked?(version) }
42
- rescue Excon::Error::Socket, Excon::Error::Timeout
43
- raise if dependency_registry == "registry.npmjs.org"
44
- # Sometimes custom registries are flaky. We don't want to make that
45
- # our problem, so we quietly return `nil` here.
46
- end
47
-
48
- def lowest_security_fix_version
49
- return unless valid_npm_details?
50
-
51
- secure_versions =
52
- if specified_dist_tag_requirement?
53
- [version_from_dist_tags].compact
54
- else
55
- possible_versions(filter_ignored: false)
56
- end
57
-
58
- secure_versions = Dependabot::UpdateCheckers::VersionFilters.filter_vulnerable_versions(secure_versions,
59
- security_advisories)
60
- secure_versions = filter_ignored_versions(secure_versions)
61
- secure_versions = filter_lower_versions(secure_versions)
62
-
63
- secure_versions.reverse.find { |version| !yanked?(version) }
64
- rescue Excon::Error::Socket, Excon::Error::Timeout
65
- raise if dependency_registry == "registry.npmjs.org"
66
- # Sometimes custom registries are flaky. We don't want to make that
67
- # our problem, so we quietly return `nil` here.
68
- end
69
-
70
- def possible_previous_versions_with_details
71
- @possible_previous_versions_with_details ||= npm_details.fetch("versions", {})
72
- .transform_keys { |k| version_class.new(k) }
73
- .reject do |v, _|
74
- v.prerelease? && !related_to_current_pre?(v)
75
- end
76
- .sort_by(&:first).reverse
77
- end
78
-
79
- def possible_versions_with_details(filter_ignored: true)
80
- versions = possible_previous_versions_with_details
81
- .reject { |_, details| details["deprecated"] }
82
-
83
- return filter_ignored_versions(versions) if filter_ignored
84
-
85
- versions
86
- end
87
-
88
- def possible_versions(filter_ignored: true)
89
- possible_versions_with_details(filter_ignored: filter_ignored)
90
- .map(&:first)
91
- end
92
-
93
- private
94
-
95
- attr_reader :dependency
96
- attr_reader :credentials
97
- attr_reader :dependency_files
98
- attr_reader :ignored_versions
99
- attr_reader :security_advisories
100
-
101
- def valid_npm_details?
102
- !npm_details&.fetch("dist-tags", nil).nil?
103
- end
104
-
105
- sig { params(versions_array: T::Array[T.untyped]).returns(T::Array[T.untyped]) }
106
- def filter_ignored_versions(versions_array)
107
- filtered = versions_array.reject do |v, _|
108
- ignore_requirements.any? { |r| r.satisfied_by?(v) }
109
- end
110
-
111
- if @raise_on_ignored && filter_lower_versions(filtered).empty? && filter_lower_versions(versions_array).any?
112
- raise AllVersionsIgnored
113
- end
114
-
115
- if versions_array.count > filtered.count
116
- diff = versions_array.count - filtered.count
117
- Dependabot.logger.info("Filtered out #{diff} ignored versions")
118
- end
119
-
120
- filtered
121
- end
122
-
123
- sig { params(versions_array: T::Array[T.untyped]).returns(T::Array[T.untyped]) }
124
- def filter_out_of_range_versions(versions_array)
125
- reqs = dependency.requirements.filter_map do |r|
126
- NpmAndYarn::Requirement.requirements_array(r.fetch(:requirement))
127
- end
128
-
129
- versions_array
130
- .select { |v| reqs.all? { |r| r.any? { |o| o.satisfied_by?(v) } } }
131
- end
132
-
133
- sig { params(versions_array: T::Array[T.untyped]).returns(T::Array[T.untyped]) }
134
- def filter_lower_versions(versions_array)
135
- return versions_array unless dependency.numeric_version
136
-
137
- versions_array
138
- .select { |version, _| version > dependency.numeric_version }
139
- end
140
-
141
- def version_from_dist_tags
142
- dist_tags = npm_details["dist-tags"].keys
143
-
144
- # Check if a dist tag was specified as a requirement. If it was, and
145
- # it exists, use it.
146
- dist_tag_req = dependency.requirements
147
- .find { |r| dist_tags.include?(r[:requirement]) }
148
- &.fetch(:requirement)
149
-
150
- if dist_tag_req
151
- tag_vers =
152
- version_class.new(npm_details["dist-tags"][dist_tag_req])
153
- return tag_vers unless yanked?(tag_vers)
154
- end
155
-
156
- # Use the latest dist tag unless there's a reason not to
157
- return nil unless npm_details["dist-tags"]["latest"]
158
-
159
- latest = version_class.new(npm_details["dist-tags"]["latest"])
160
-
161
- wants_latest_dist_tag?(latest) ? latest : nil
162
- end
163
-
164
- def related_to_current_pre?(version)
165
- current_version = dependency.numeric_version
166
- if current_version&.prerelease? &&
167
- current_version&.release == version.release
168
- return true
169
- end
170
-
171
- dependency.requirements.any? do |req|
172
- next unless req[:requirement]&.match?(/\d-[A-Za-z]/)
173
-
174
- NpmAndYarn::Requirement
175
- .requirements_array(req.fetch(:requirement))
176
- .any? do |r|
177
- r.requirements.any? { |a| a.last.release == version.release }
178
- end
179
- rescue Gem::Requirement::BadRequirementError
180
- false
181
- end
182
- end
183
-
184
- def specified_dist_tag_requirement?
185
- dependency.requirements.any? do |req|
186
- next false if req[:requirement].nil?
187
- next false unless req[:requirement].match?(/^[A-Za-z]/)
188
-
189
- !req[:requirement].match?(/^v\d/i)
190
- end
191
- end
192
-
193
- def wants_latest_dist_tag?(latest_version)
194
- ver = latest_version
195
- return false if related_to_current_pre?(ver) ^ ver.prerelease?
196
- return false if current_version_greater_than?(ver)
197
- return false if current_requirement_greater_than?(ver)
198
- return false if ignore_requirements.any? { |r| r.satisfied_by?(ver) }
199
- return false if yanked?(ver)
200
-
201
- true
202
- end
203
-
204
- def current_version_greater_than?(version)
205
- return false unless dependency.numeric_version
206
-
207
- dependency.numeric_version > version
208
- end
209
-
210
- def current_requirement_greater_than?(version)
211
- dependency.requirements.any? do |req|
212
- next false unless req[:requirement]
213
-
214
- req_version = req[:requirement].sub(/^\^|~|>=?/, "")
215
- next false unless version_class.correct?(req_version)
216
-
217
- version_class.new(req_version) > version
218
- end
219
- end
220
-
221
- def yanked?(version)
222
- @yanked ||= {}
223
- return @yanked[version] if @yanked.key?(version)
224
-
225
- @yanked[version] =
226
- begin
227
- if dependency_registry == "registry.npmjs.org"
228
- status = Dependabot::RegistryClient.head(
229
- url: registry_finder.tarball_url(version),
230
- headers: registry_auth_headers
231
- ).status
232
- else
233
- status = Dependabot::RegistryClient.get(
234
- url: dependency_url + "/#{version}",
235
- headers: registry_auth_headers
236
- ).status
237
-
238
- if status == 404
239
- # Some registries don't handle escaped package names properly
240
- status = Dependabot::RegistryClient.get(
241
- url: dependency_url.gsub("%2F", "/") + "/#{version}",
242
- headers: registry_auth_headers
243
- ).status
244
- end
245
- end
246
-
247
- version_not_found = status == 404
248
- version_not_found && version_endpoint_working?
249
- rescue Excon::Error::Timeout, Excon::Error::Socket
250
- # Give the benefit of the doubt if the registry is playing up
251
- false
252
- end
253
- end
254
-
255
- def version_endpoint_working?
256
- return true if dependency_registry == "registry.npmjs.org"
257
-
258
- return @version_endpoint_working if defined?(@version_endpoint_working)
259
-
260
- @version_endpoint_working =
261
- begin
262
- Dependabot::RegistryClient.get(
263
- url: dependency_url + "/latest",
264
- headers: registry_auth_headers
265
- ).status < 400
266
- rescue Excon::Error::Timeout, Excon::Error::Socket
267
- # Give the benefit of the doubt if the registry is playing up
268
- true
269
- end
270
- end
271
-
272
- def npm_details
273
- return @npm_details if defined?(@npm_details)
274
-
275
- @npm_details = fetch_npm_details
276
- end
277
-
278
- def fetch_npm_details
279
- npm_response = fetch_npm_response
280
-
281
- check_npm_response(npm_response)
282
- JSON.parse(npm_response.body)
283
- rescue JSON::ParserError,
284
- Excon::Error::Timeout,
285
- Excon::Error::Socket,
286
- RegistryError => e
287
- if git_dependency?
288
- nil
289
- else
290
- raise_npm_details_error(e)
291
- end
292
- end
293
-
294
- def fetch_npm_response
295
- response = Dependabot::RegistryClient.get(
296
- url: dependency_url,
297
- headers: registry_auth_headers
298
- )
299
- return response unless response.status == 500
300
- return response unless registry_auth_headers["Authorization"]
301
-
302
- auth = registry_auth_headers["Authorization"]
303
- return response unless auth.start_with?("Basic")
304
-
305
- decoded_token = Base64.decode64(auth.gsub("Basic ", ""))
306
- return unless decoded_token.include?(":")
307
-
308
- username, password = decoded_token.split(":")
309
- Dependabot::RegistryClient.get(
310
- url: dependency_url,
311
- options: {
312
- user: username,
313
- password: password
314
- }
315
- )
316
- rescue URI::InvalidURIError => e
317
- raise DependencyFileNotResolvable, e.message
318
- end
319
-
320
- def check_npm_response(npm_response)
321
- return if git_dependency?
322
-
323
- if private_dependency_not_reachable?(npm_response)
324
- raise PrivateSourceAuthenticationFailure, dependency_registry
325
- end
326
-
327
- # handles scenario when private registry returns a server error 5xx
328
- if private_dependency_server_error?(npm_response)
329
- msg = "Server error #{npm_response.status} returned while accessing registry" \
330
- " #{dependency_registry}."
331
- raise DependencyFileNotResolvable, msg
332
- end
333
-
334
- status = npm_response.status
335
-
336
- # handles issue when status 200 is returned from registry but with an invalid JSON object
337
- if status.to_s.start_with?("2") && response_invalid_json?(npm_response)
338
- msg = "Invalid JSON object returned from registry #{dependency_registry}."
339
- Dependabot.logger.warn("#{msg} Response body (truncated) : #{npm_response.body[0..500]}...")
340
- raise DependencyFileNotResolvable, msg
341
- end
342
-
343
- return if status.to_s.start_with?("2")
344
-
345
- # Ignore 404s from the registry for updates where a lockfile doesn't
346
- # need to be generated. The 404 won't cause problems later.
347
- return if status == 404 && dependency.version.nil?
348
-
349
- msg = "Got #{status} response with body #{npm_response.body}"
350
- raise RegistryError.new(status, msg)
351
- end
352
-
353
- def raise_npm_details_error(error)
354
- raise if dependency_registry == "registry.npmjs.org"
355
- raise unless error.is_a?(Excon::Error::Timeout)
356
-
357
- raise PrivateSourceTimedOut, dependency_registry
358
- end
359
-
360
- def private_dependency_not_reachable?(npm_response)
361
- return true if npm_response.body.start_with?(/user ".*?" is not a /)
362
- return false unless [401, 402, 403, 404].include?(npm_response.status)
363
-
364
- # Check whether this dependency is (likely to be) private
365
- if dependency_registry == "registry.npmjs.org"
366
- return false unless dependency.name.start_with?("@")
367
-
368
- web_response = Dependabot::RegistryClient.get(url: "https://www.npmjs.com/package/#{dependency.name}")
369
- # NOTE: returns 429 when the login page is rate limited
370
- return web_response.body.include?("Forgot password?") ||
371
- web_response.status == 429
372
- end
373
-
374
- true
375
- end
376
-
377
- def private_dependency_server_error?(npm_response)
378
- if [500, 501, 502, 503].include?(npm_response.status)
379
- Dependabot.logger.warn("#{dependency_registry} returned code #{npm_response.status} with " \
380
- "body #{npm_response.body}.")
381
- return true
382
- end
383
- false
384
- end
385
-
386
- def response_invalid_json?(npm_response)
387
- result = JSON.parse(npm_response.body)
388
- result.is_a?(Hash) || result.is_a?(Array)
389
- false
390
- rescue JSON::ParserError, TypeError
391
- true
392
- end
393
-
394
- def dependency_url
395
- registry_finder.dependency_url
396
- end
397
-
398
- def dependency_registry
399
- registry_finder.registry
400
- end
401
-
402
- def registry_auth_headers
403
- registry_finder.auth_headers
404
- end
405
-
406
- def registry_finder
407
- @registry_finder ||= Dependabot::Javascript::Shared::UpdateChecker::RegistryFinder.new(
408
- dependency: dependency,
409
- credentials: credentials,
410
- rc_file: npmrc_file
411
- )
412
- end
413
-
414
- def ignore_requirements
415
- ignored_versions.flat_map { |req| requirement_class.requirements_array(req) }
416
- end
417
-
418
- def version_class
419
- dependency.version_class
420
- end
421
-
422
- def requirement_class
423
- dependency.requirement_class
424
- end
425
-
426
- def npmrc_file
427
- dependency_files.find { |f| f.name.end_with?(".npmrc") }
428
- end
429
-
430
- def yarnrc_file
431
- dependency_files.find { |f| f.name.end_with?(".yarnrc") }
432
- end
433
-
434
- def yarnrc_yml_file
435
- dependency_files.find { |f| f.name.end_with?(".yarnrc.yml") }
436
- end
437
-
438
- # TODO: Remove need for me
439
- def git_dependency?
440
- # ignored_version/raise_on_ignored are irrelevant.
441
- GitCommitChecker.new(
442
- dependency: dependency,
443
- credentials: credentials
444
- ).git_dependency?
445
- end
446
- end
447
- end
448
- end
449
- end
450
- end
@@ -1,76 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- require "excon"
5
-
6
- module Dependabot
7
- module Javascript
8
- module Bun
9
- class UpdateChecker
10
- class LibraryDetector
11
- def initialize(package_json_file:, credentials:, dependency_files:)
12
- @package_json_file = package_json_file
13
- @credentials = credentials
14
- @dependency_files = dependency_files
15
- end
16
-
17
- def library?
18
- return false unless package_json_may_be_for_library?
19
-
20
- npm_response_matches_package_json?
21
- end
22
-
23
- private
24
-
25
- attr_reader :package_json_file
26
- attr_reader :credentials
27
- attr_reader :dependency_files
28
-
29
- def package_json_may_be_for_library?
30
- return false unless project_name
31
- return false if project_name.match?(/\{\{.*\}\}/)
32
- return false unless parsed_package_json["version"]
33
- return false if parsed_package_json["private"]
34
-
35
- true
36
- end
37
-
38
- def npm_response_matches_package_json?
39
- project_description = parsed_package_json["description"]
40
- return false unless project_description
41
-
42
- # Check if the project is listed on npm. If it is, it's a library
43
- url = "#{registry.chomp('/')}/#{escaped_project_name}"
44
- @project_npm_response ||= Dependabot::RegistryClient.get(url: url)
45
- return false unless @project_npm_response.status == 200
46
-
47
- @project_npm_response.body.dup.force_encoding("UTF-8").encode
48
- .include?(project_description)
49
- rescue Excon::Error::Socket, Excon::Error::Timeout, URI::InvalidURIError
50
- false
51
- end
52
-
53
- def project_name
54
- parsed_package_json.fetch("name", nil)
55
- end
56
-
57
- def escaped_project_name
58
- project_name&.gsub("/", "%2F")
59
- end
60
-
61
- def parsed_package_json
62
- @parsed_package_json ||= JSON.parse(package_json_file.content)
63
- end
64
-
65
- def registry
66
- Dependabot::Javascript::Shared::UpdateChecker::RegistryFinder.new(
67
- dependency: nil,
68
- credentials: credentials,
69
- rc_file: dependency_files.find { |f| f.name.end_with?(".npmrc") }
70
- ).registry_from_rc(project_name)
71
- end
72
- end
73
- end
74
- end
75
- end
76
- end