dependabot-core 0.76.1

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.
Files changed (321) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +6408 -0
  3. data/LICENSE +37 -0
  4. data/README.md +115 -0
  5. data/helpers/elixir/bin/check_update.exs +92 -0
  6. data/helpers/elixir/bin/do_update.exs +39 -0
  7. data/helpers/elixir/bin/parse_deps.exs +103 -0
  8. data/helpers/elixir/bin/run.exs +76 -0
  9. data/helpers/elixir/mix.exs +21 -0
  10. data/helpers/elixir/mix.lock +3 -0
  11. data/helpers/go/Makefile +9 -0
  12. data/helpers/go/go.mod +9 -0
  13. data/helpers/go/go.sum +5 -0
  14. data/helpers/go/importresolver/main.go +34 -0
  15. data/helpers/go/main.go +77 -0
  16. data/helpers/go/updatechecker/main.go +107 -0
  17. data/helpers/go/updater/go.mod +3 -0
  18. data/helpers/go/updater/go.sum +2 -0
  19. data/helpers/go/updater/helpers.go +57 -0
  20. data/helpers/go/updater/main.go +48 -0
  21. data/helpers/npm/.agignore +1 -0
  22. data/helpers/npm/.envrc +2 -0
  23. data/helpers/npm/.eslintrc +14 -0
  24. data/helpers/npm/.nvimrc +7 -0
  25. data/helpers/npm/bin/run.js +34 -0
  26. data/helpers/npm/lib/helpers.js +25 -0
  27. data/helpers/npm/lib/peer-dependency-checker.js +102 -0
  28. data/helpers/npm/lib/subdependency-updater.js +48 -0
  29. data/helpers/npm/lib/updater.js +95 -0
  30. data/helpers/npm/package.json +17 -0
  31. data/helpers/npm/test/fixtures/npm-left-pad.json +1 -0
  32. data/helpers/npm/test/fixtures/updater/original/package-lock.json +16 -0
  33. data/helpers/npm/test/fixtures/updater/original/package.json +9 -0
  34. data/helpers/npm/test/fixtures/updater/updated/package-lock.json +16 -0
  35. data/helpers/npm/test/helpers.js +7 -0
  36. data/helpers/npm/test/updater.test.js +50 -0
  37. data/helpers/npm/yarn.lock +6120 -0
  38. data/helpers/php/.php_cs +34 -0
  39. data/helpers/php/bin/run.php +57 -0
  40. data/helpers/php/composer.json +14 -0
  41. data/helpers/php/composer.lock +1521 -0
  42. data/helpers/php/composer.phar +0 -0
  43. data/helpers/php/setup.sh +4 -0
  44. data/helpers/php/src/DependabotInstallationManager.php +61 -0
  45. data/helpers/php/src/DependabotPluginManager.php +23 -0
  46. data/helpers/php/src/ExceptionIO.php +25 -0
  47. data/helpers/php/src/Hasher.php +21 -0
  48. data/helpers/php/src/UpdateChecker.php +123 -0
  49. data/helpers/php/src/Updater.php +97 -0
  50. data/helpers/python/lib/__init__.py +0 -0
  51. data/helpers/python/lib/hasher.py +23 -0
  52. data/helpers/python/lib/parser.py +130 -0
  53. data/helpers/python/requirements.txt +9 -0
  54. data/helpers/python/run.py +18 -0
  55. data/helpers/test/run.rb +15 -0
  56. data/helpers/utils/git-credential-store-immutable +10 -0
  57. data/helpers/yarn/.agignore +1 -0
  58. data/helpers/yarn/.envrc +2 -0
  59. data/helpers/yarn/.eslintrc +14 -0
  60. data/helpers/yarn/.nvimrc +7 -0
  61. data/helpers/yarn/bin/run.js +36 -0
  62. data/helpers/yarn/lib/fix-duplicates.js +53 -0
  63. data/helpers/yarn/lib/helpers.js +5 -0
  64. data/helpers/yarn/lib/lockfile-parser.js +21 -0
  65. data/helpers/yarn/lib/peer-dependency-checker.js +130 -0
  66. data/helpers/yarn/lib/replace-lockfile-declaration.js +45 -0
  67. data/helpers/yarn/lib/subdependency-updater.js +69 -0
  68. data/helpers/yarn/lib/updater.js +254 -0
  69. data/helpers/yarn/package.json +17 -0
  70. data/helpers/yarn/test/fixtures/updater/original/package.json +6 -0
  71. data/helpers/yarn/test/fixtures/updater/original/yarn.lock +11 -0
  72. data/helpers/yarn/test/fixtures/updater/updated/yarn.lock +12 -0
  73. data/helpers/yarn/test/fixtures/updater/with-version-comments/package.json +5 -0
  74. data/helpers/yarn/test/fixtures/updater/with-version-comments/yarn.lock +13 -0
  75. data/helpers/yarn/test/fixtures/yarnpkg-is-positive.json +1 -0
  76. data/helpers/yarn/test/fixtures/yarnpkg-left-pad.json +1 -0
  77. data/helpers/yarn/test/helpers.js +7 -0
  78. data/helpers/yarn/test/updater.test.js +93 -0
  79. data/helpers/yarn/yarn.lock +4912 -0
  80. data/lib/bundler_definition_bundler_version_patch.rb +15 -0
  81. data/lib/bundler_definition_ruby_version_patch.rb +14 -0
  82. data/lib/bundler_git_source_patch.rb +27 -0
  83. data/lib/dependabot.rb +4 -0
  84. data/lib/dependabot/clients/bitbucket.rb +101 -0
  85. data/lib/dependabot/clients/github_with_retries.rb +117 -0
  86. data/lib/dependabot/clients/gitlab.rb +72 -0
  87. data/lib/dependabot/dependency.rb +118 -0
  88. data/lib/dependabot/dependency_file.rb +54 -0
  89. data/lib/dependabot/errors.rb +179 -0
  90. data/lib/dependabot/file_fetchers.rb +48 -0
  91. data/lib/dependabot/file_fetchers/README.md +65 -0
  92. data/lib/dependabot/file_fetchers/base.rb +302 -0
  93. data/lib/dependabot/file_fetchers/docker/docker.rb +40 -0
  94. data/lib/dependabot/file_fetchers/dotnet/nuget.rb +215 -0
  95. data/lib/dependabot/file_fetchers/dotnet/nuget/import_paths_finder.rb +51 -0
  96. data/lib/dependabot/file_fetchers/dotnet/nuget/sln_project_paths_finder.rb +55 -0
  97. data/lib/dependabot/file_fetchers/elixir/hex.rb +78 -0
  98. data/lib/dependabot/file_fetchers/elm/elm_package.rb +52 -0
  99. data/lib/dependabot/file_fetchers/git/submodules.rb +73 -0
  100. data/lib/dependabot/file_fetchers/go/dep.rb +69 -0
  101. data/lib/dependabot/file_fetchers/go/modules.rb +64 -0
  102. data/lib/dependabot/file_fetchers/java/gradle.rb +56 -0
  103. data/lib/dependabot/file_fetchers/java/gradle/settings_file_parser.rb +66 -0
  104. data/lib/dependabot/file_fetchers/java/maven.rb +127 -0
  105. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn.rb +330 -0
  106. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn/path_dependency_builder.rb +107 -0
  107. data/lib/dependabot/file_fetchers/php/composer.rb +131 -0
  108. data/lib/dependabot/file_fetchers/python/pip.rb +305 -0
  109. data/lib/dependabot/file_fetchers/ruby/bundler.rb +185 -0
  110. data/lib/dependabot/file_fetchers/ruby/bundler/child_gemfile_finder.rb +70 -0
  111. data/lib/dependabot/file_fetchers/ruby/bundler/path_gemspec_finder.rb +114 -0
  112. data/lib/dependabot/file_fetchers/ruby/bundler/require_relative_finder.rb +67 -0
  113. data/lib/dependabot/file_fetchers/rust/cargo.rb +240 -0
  114. data/lib/dependabot/file_parsers.rb +48 -0
  115. data/lib/dependabot/file_parsers/README.md +45 -0
  116. data/lib/dependabot/file_parsers/base.rb +31 -0
  117. data/lib/dependabot/file_parsers/base/dependency_set.rb +77 -0
  118. data/lib/dependabot/file_parsers/docker/docker.rb +164 -0
  119. data/lib/dependabot/file_parsers/dotnet/nuget.rb +85 -0
  120. data/lib/dependabot/file_parsers/dotnet/nuget/packages_config_parser.rb +65 -0
  121. data/lib/dependabot/file_parsers/dotnet/nuget/project_file_parser.rb +156 -0
  122. data/lib/dependabot/file_parsers/dotnet/nuget/property_value_finder.rb +131 -0
  123. data/lib/dependabot/file_parsers/elixir/hex.rb +134 -0
  124. data/lib/dependabot/file_parsers/elm/elm_package.rb +136 -0
  125. data/lib/dependabot/file_parsers/git/submodules.rb +69 -0
  126. data/lib/dependabot/file_parsers/go/dep.rb +163 -0
  127. data/lib/dependabot/file_parsers/go/modules.rb +34 -0
  128. data/lib/dependabot/file_parsers/go/modules/go_mod_parser.rb +134 -0
  129. data/lib/dependabot/file_parsers/java/gradle.rb +236 -0
  130. data/lib/dependabot/file_parsers/java/gradle/property_value_finder.rb +90 -0
  131. data/lib/dependabot/file_parsers/java/gradle/repositories_finder.rb +145 -0
  132. data/lib/dependabot/file_parsers/java/maven.rb +252 -0
  133. data/lib/dependabot/file_parsers/java/maven/property_value_finder.rb +166 -0
  134. data/lib/dependabot/file_parsers/java/maven/repositories_finder.rb +188 -0
  135. data/lib/dependabot/file_parsers/java_script/npm_and_yarn.rb +394 -0
  136. data/lib/dependabot/file_parsers/php/composer.rb +177 -0
  137. data/lib/dependabot/file_parsers/python/pip.rb +223 -0
  138. data/lib/dependabot/file_parsers/python/pip/pipfile_files_parser.rb +154 -0
  139. data/lib/dependabot/file_parsers/python/pip/poetry_files_parser.rb +141 -0
  140. data/lib/dependabot/file_parsers/python/pip/setup_file_parser.rb +160 -0
  141. data/lib/dependabot/file_parsers/ruby/bundler.rb +295 -0
  142. data/lib/dependabot/file_parsers/ruby/bundler/file_preparer.rb +85 -0
  143. data/lib/dependabot/file_parsers/ruby/bundler/gemfile_checker.rb +48 -0
  144. data/lib/dependabot/file_parsers/rust/cargo.rb +213 -0
  145. data/lib/dependabot/file_updaters.rb +48 -0
  146. data/lib/dependabot/file_updaters/README.md +58 -0
  147. data/lib/dependabot/file_updaters/base.rb +52 -0
  148. data/lib/dependabot/file_updaters/docker/docker.rb +133 -0
  149. data/lib/dependabot/file_updaters/dotnet/nuget.rb +151 -0
  150. data/lib/dependabot/file_updaters/dotnet/nuget/packages_config_declaration_finder.rb +69 -0
  151. data/lib/dependabot/file_updaters/dotnet/nuget/project_file_declaration_finder.rb +78 -0
  152. data/lib/dependabot/file_updaters/dotnet/nuget/property_value_updater.rb +64 -0
  153. data/lib/dependabot/file_updaters/elixir/hex.rb +71 -0
  154. data/lib/dependabot/file_updaters/elixir/hex/lockfile_updater.rb +147 -0
  155. data/lib/dependabot/file_updaters/elixir/hex/mixfile_git_pin_updater.rb +53 -0
  156. data/lib/dependabot/file_updaters/elixir/hex/mixfile_requirement_updater.rb +74 -0
  157. data/lib/dependabot/file_updaters/elixir/hex/mixfile_sanitizer.rb +28 -0
  158. data/lib/dependabot/file_updaters/elixir/hex/mixfile_updater.rb +98 -0
  159. data/lib/dependabot/file_updaters/elm/elm_package.rb +79 -0
  160. data/lib/dependabot/file_updaters/elm/elm_package/elm_json_updater.rb +69 -0
  161. data/lib/dependabot/file_updaters/elm/elm_package/elm_package_updater.rb +69 -0
  162. data/lib/dependabot/file_updaters/git/submodules.rb +38 -0
  163. data/lib/dependabot/file_updaters/go/dep.rb +77 -0
  164. data/lib/dependabot/file_updaters/go/dep/lockfile_updater.rb +219 -0
  165. data/lib/dependabot/file_updaters/go/dep/manifest_updater.rb +155 -0
  166. data/lib/dependabot/file_updaters/go/modules.rb +71 -0
  167. data/lib/dependabot/file_updaters/go/modules/go_mod_updater.rb +81 -0
  168. data/lib/dependabot/file_updaters/java/gradle.rb +176 -0
  169. data/lib/dependabot/file_updaters/java/gradle/dependency_set_updater.rb +66 -0
  170. data/lib/dependabot/file_updaters/java/gradle/property_value_updater.rb +58 -0
  171. data/lib/dependabot/file_updaters/java/maven.rb +155 -0
  172. data/lib/dependabot/file_updaters/java/maven/declaration_finder.rb +132 -0
  173. data/lib/dependabot/file_updaters/java/maven/property_value_updater.rb +61 -0
  174. data/lib/dependabot/file_updaters/java_script/npm_and_yarn.rb +159 -0
  175. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npm_lockfile_updater.rb +532 -0
  176. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npmrc_builder.rb +191 -0
  177. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_preparer.rb +91 -0
  178. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_updater.rb +220 -0
  179. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/yarn_lockfile_updater.rb +475 -0
  180. data/lib/dependabot/file_updaters/php/composer.rb +78 -0
  181. data/lib/dependabot/file_updaters/php/composer/lockfile_updater.rb +264 -0
  182. data/lib/dependabot/file_updaters/php/composer/manifest_updater.rb +70 -0
  183. data/lib/dependabot/file_updaters/python/pip.rb +147 -0
  184. data/lib/dependabot/file_updaters/python/pip/pip_compile_file_updater.rb +363 -0
  185. data/lib/dependabot/file_updaters/python/pip/pipfile_file_updater.rb +397 -0
  186. data/lib/dependabot/file_updaters/python/pip/pipfile_preparer.rb +125 -0
  187. data/lib/dependabot/file_updaters/python/pip/poetry_file_updater.rb +289 -0
  188. data/lib/dependabot/file_updaters/python/pip/pyproject_preparer.rb +105 -0
  189. data/lib/dependabot/file_updaters/python/pip/requirement_file_updater.rb +166 -0
  190. data/lib/dependabot/file_updaters/python/pip/requirement_replacer.rb +95 -0
  191. data/lib/dependabot/file_updaters/python/pip/setup_file_sanitizer.rb +91 -0
  192. data/lib/dependabot/file_updaters/ruby/bundler.rb +121 -0
  193. data/lib/dependabot/file_updaters/ruby/bundler/gemfile_updater.rb +116 -0
  194. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_dependency_name_finder.rb +52 -0
  195. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_sanitizer.rb +298 -0
  196. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_updater.rb +64 -0
  197. data/lib/dependabot/file_updaters/ruby/bundler/git_pin_replacer.rb +80 -0
  198. data/lib/dependabot/file_updaters/ruby/bundler/git_source_remover.rb +102 -0
  199. data/lib/dependabot/file_updaters/ruby/bundler/lockfile_updater.rb +384 -0
  200. data/lib/dependabot/file_updaters/ruby/bundler/requirement_replacer.rb +188 -0
  201. data/lib/dependabot/file_updaters/rust/cargo.rb +83 -0
  202. data/lib/dependabot/file_updaters/rust/cargo/lockfile_updater.rb +251 -0
  203. data/lib/dependabot/file_updaters/rust/cargo/manifest_updater.rb +162 -0
  204. data/lib/dependabot/git_commit_checker.rb +412 -0
  205. data/lib/dependabot/metadata_finders.rb +46 -0
  206. data/lib/dependabot/metadata_finders/README.md +53 -0
  207. data/lib/dependabot/metadata_finders/base.rb +117 -0
  208. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +317 -0
  209. data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +177 -0
  210. data/lib/dependabot/metadata_finders/base/commits_finder.rb +217 -0
  211. data/lib/dependabot/metadata_finders/base/release_finder.rb +251 -0
  212. data/lib/dependabot/metadata_finders/docker/docker.rb +18 -0
  213. data/lib/dependabot/metadata_finders/dotnet/nuget.rb +116 -0
  214. data/lib/dependabot/metadata_finders/elixir/hex.rb +69 -0
  215. data/lib/dependabot/metadata_finders/elm/elm_package.rb +22 -0
  216. data/lib/dependabot/metadata_finders/git/submodules.rb +20 -0
  217. data/lib/dependabot/metadata_finders/go/dep.rb +56 -0
  218. data/lib/dependabot/metadata_finders/java/maven.rb +173 -0
  219. data/lib/dependabot/metadata_finders/java_script/npm_and_yarn.rb +215 -0
  220. data/lib/dependabot/metadata_finders/php/composer.rb +66 -0
  221. data/lib/dependabot/metadata_finders/python/pip.rb +120 -0
  222. data/lib/dependabot/metadata_finders/ruby/bundler.rb +150 -0
  223. data/lib/dependabot/metadata_finders/rust/cargo.rb +64 -0
  224. data/lib/dependabot/pull_request_creator.rb +151 -0
  225. data/lib/dependabot/pull_request_creator/branch_namer.rb +170 -0
  226. data/lib/dependabot/pull_request_creator/commit_signer.rb +63 -0
  227. data/lib/dependabot/pull_request_creator/github.rb +233 -0
  228. data/lib/dependabot/pull_request_creator/gitlab.rb +122 -0
  229. data/lib/dependabot/pull_request_creator/labeler.rb +361 -0
  230. data/lib/dependabot/pull_request_creator/message_builder.rb +888 -0
  231. data/lib/dependabot/pull_request_updater.rb +43 -0
  232. data/lib/dependabot/pull_request_updater/github.rb +151 -0
  233. data/lib/dependabot/shared_helpers.rb +201 -0
  234. data/lib/dependabot/source.rb +120 -0
  235. data/lib/dependabot/update_checkers.rb +48 -0
  236. data/lib/dependabot/update_checkers/README.md +67 -0
  237. data/lib/dependabot/update_checkers/base.rb +220 -0
  238. data/lib/dependabot/update_checkers/docker/docker.rb +290 -0
  239. data/lib/dependabot/update_checkers/dotnet/nuget.rb +127 -0
  240. data/lib/dependabot/update_checkers/dotnet/nuget/property_updater.rb +97 -0
  241. data/lib/dependabot/update_checkers/dotnet/nuget/repository_finder.rb +232 -0
  242. data/lib/dependabot/update_checkers/dotnet/nuget/requirements_updater.rb +81 -0
  243. data/lib/dependabot/update_checkers/dotnet/nuget/version_finder.rb +231 -0
  244. data/lib/dependabot/update_checkers/elixir/hex.rb +274 -0
  245. data/lib/dependabot/update_checkers/elixir/hex/file_preparer.rb +193 -0
  246. data/lib/dependabot/update_checkers/elixir/hex/requirements_updater.rb +177 -0
  247. data/lib/dependabot/update_checkers/elixir/hex/version_resolver.rb +175 -0
  248. data/lib/dependabot/update_checkers/elm/elm_package.rb +126 -0
  249. data/lib/dependabot/update_checkers/elm/elm_package/cli_parser.rb +33 -0
  250. data/lib/dependabot/update_checkers/elm/elm_package/elm_18_version_resolver.rb +234 -0
  251. data/lib/dependabot/update_checkers/elm/elm_package/elm_19_version_resolver.rb +198 -0
  252. data/lib/dependabot/update_checkers/elm/elm_package/requirements_updater.rb +75 -0
  253. data/lib/dependabot/update_checkers/git/submodules.rb +52 -0
  254. data/lib/dependabot/update_checkers/go/dep.rb +311 -0
  255. data/lib/dependabot/update_checkers/go/dep/file_preparer.rb +221 -0
  256. data/lib/dependabot/update_checkers/go/dep/latest_version_finder.rb +169 -0
  257. data/lib/dependabot/update_checkers/go/dep/requirements_updater.rb +223 -0
  258. data/lib/dependabot/update_checkers/go/dep/version_resolver.rb +164 -0
  259. data/lib/dependabot/update_checkers/go/modules.rb +112 -0
  260. data/lib/dependabot/update_checkers/java/gradle.rb +148 -0
  261. data/lib/dependabot/update_checkers/java/gradle/multi_dependency_updater.rb +105 -0
  262. data/lib/dependabot/update_checkers/java/gradle/version_finder.rb +183 -0
  263. data/lib/dependabot/update_checkers/java/maven.rb +159 -0
  264. data/lib/dependabot/update_checkers/java/maven/property_updater.rb +127 -0
  265. data/lib/dependabot/update_checkers/java/maven/requirements_updater.rb +92 -0
  266. data/lib/dependabot/update_checkers/java/maven/version_finder.rb +225 -0
  267. data/lib/dependabot/update_checkers/java_script/npm_and_yarn.rb +280 -0
  268. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/latest_version_finder.rb +342 -0
  269. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/library_detector.rb +69 -0
  270. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/registry_finder.rb +226 -0
  271. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/requirements_updater.rb +197 -0
  272. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/subdependency_version_resolver.rb +228 -0
  273. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/version_resolver.rb +452 -0
  274. data/lib/dependabot/update_checkers/php/composer.rb +165 -0
  275. data/lib/dependabot/update_checkers/php/composer/requirements_updater.rb +243 -0
  276. data/lib/dependabot/update_checkers/php/composer/version_resolver.rb +203 -0
  277. data/lib/dependabot/update_checkers/python/pip.rb +227 -0
  278. data/lib/dependabot/update_checkers/python/pip/latest_version_finder.rb +252 -0
  279. data/lib/dependabot/update_checkers/python/pip/pip_compile_version_resolver.rb +380 -0
  280. data/lib/dependabot/update_checkers/python/pip/pipfile_version_resolver.rb +559 -0
  281. data/lib/dependabot/update_checkers/python/pip/poetry_version_resolver.rb +300 -0
  282. data/lib/dependabot/update_checkers/python/pip/requirements_updater.rb +367 -0
  283. data/lib/dependabot/update_checkers/ruby/bundler.rb +324 -0
  284. data/lib/dependabot/update_checkers/ruby/bundler/file_preparer.rb +278 -0
  285. data/lib/dependabot/update_checkers/ruby/bundler/force_updater.rb +261 -0
  286. data/lib/dependabot/update_checkers/ruby/bundler/latest_version_finder.rb +169 -0
  287. data/lib/dependabot/update_checkers/ruby/bundler/requirements_updater.rb +264 -0
  288. data/lib/dependabot/update_checkers/ruby/bundler/ruby_requirement_setter.rb +115 -0
  289. data/lib/dependabot/update_checkers/ruby/bundler/shared_bundler_helpers.rb +243 -0
  290. data/lib/dependabot/update_checkers/ruby/bundler/version_resolver.rb +255 -0
  291. data/lib/dependabot/update_checkers/rust/cargo.rb +282 -0
  292. data/lib/dependabot/update_checkers/rust/cargo/file_preparer.rb +202 -0
  293. data/lib/dependabot/update_checkers/rust/cargo/requirements_updater.rb +175 -0
  294. data/lib/dependabot/update_checkers/rust/cargo/version_resolver.rb +242 -0
  295. data/lib/dependabot/utils.rb +84 -0
  296. data/lib/dependabot/utils/docker/credentials_finder.rb +65 -0
  297. data/lib/dependabot/utils/dotnet/requirement.rb +90 -0
  298. data/lib/dependabot/utils/dotnet/version.rb +22 -0
  299. data/lib/dependabot/utils/elixir/requirement.rb +53 -0
  300. data/lib/dependabot/utils/elixir/version.rb +59 -0
  301. data/lib/dependabot/utils/elm/requirement.rb +92 -0
  302. data/lib/dependabot/utils/elm/version.rb +19 -0
  303. data/lib/dependabot/utils/go/path_converter.rb +74 -0
  304. data/lib/dependabot/utils/go/requirement.rb +152 -0
  305. data/lib/dependabot/utils/go/shared_helper.rb +20 -0
  306. data/lib/dependabot/utils/go/version.rb +40 -0
  307. data/lib/dependabot/utils/java/requirement.rb +110 -0
  308. data/lib/dependabot/utils/java/version.rb +179 -0
  309. data/lib/dependabot/utils/java_script/requirement.rb +117 -0
  310. data/lib/dependabot/utils/java_script/version.rb +30 -0
  311. data/lib/dependabot/utils/php/requirement.rb +97 -0
  312. data/lib/dependabot/utils/php/version.rb +22 -0
  313. data/lib/dependabot/utils/python/requirement.rb +130 -0
  314. data/lib/dependabot/utils/python/version.rb +88 -0
  315. data/lib/dependabot/utils/ruby/requirement.rb +26 -0
  316. data/lib/dependabot/utils/rust/requirement.rb +108 -0
  317. data/lib/dependabot/utils/rust/version.rb +32 -0
  318. data/lib/dependabot/version.rb +5 -0
  319. data/lib/python_requirement_parser.rb +33 -0
  320. data/lib/python_versions.rb +21 -0
  321. metadata +641 -0
@@ -0,0 +1,228 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/update_checkers/java_script/npm_and_yarn"
4
+ require "dependabot/file_parsers/java_script/npm_and_yarn"
5
+ require "dependabot/utils/java_script/version"
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/errors"
8
+
9
+ file_updater_path = "dependabot/file_updaters/java_script/npm_and_yarn"
10
+ require "#{file_updater_path}/npmrc_builder"
11
+ require "#{file_updater_path}/package_json_preparer"
12
+
13
+ module Dependabot
14
+ module UpdateCheckers
15
+ module JavaScript
16
+ class NpmAndYarn
17
+ class SubdependencyVersionResolver
18
+ def initialize(dependency:, credentials:, dependency_files:,
19
+ ignored_versions:)
20
+ @dependency = dependency
21
+ @credentials = credentials
22
+ @dependency_files = dependency_files
23
+ @ignored_versions = ignored_versions
24
+ end
25
+
26
+ def latest_resolvable_version
27
+ raise "Not a subdependency!" if dependency.requirements.any?
28
+
29
+ lockfiles = [*package_locks, *shrinkwraps, *yarn_locks]
30
+ updated_lockfiles = lockfiles.map do |lockfile|
31
+ updated_content = update_subdependency_in_lockfile(lockfile)
32
+ updated_lockfile = lockfile.dup
33
+ updated_lockfile.content = updated_content
34
+ updated_lockfile
35
+ end
36
+
37
+ version_from_updated_lockfiles(updated_lockfiles)
38
+ rescue SharedHelpers::HelperSubprocessFailed
39
+ # TODO: Move error handling logic from the FileUpdater to this class
40
+
41
+ # Return nil (no update possible) if an unknown error occurred
42
+ nil
43
+ end
44
+
45
+ private
46
+
47
+ attr_reader :dependency, :credentials, :dependency_files,
48
+ :ignored_versions
49
+
50
+ def update_subdependency_in_lockfile(lockfile)
51
+ SharedHelpers.in_a_temporary_directory do
52
+ write_temporary_dependency_files
53
+ lockfile_name = Pathname.new(lockfile.name).basename.to_s
54
+ path = Pathname.new(lockfile.name).dirname.to_s
55
+
56
+ updated_files = if lockfile.name.end_with?("yarn.lock")
57
+ run_yarn_updater(path, lockfile_name)
58
+ else
59
+ run_npm_updater(path, lockfile_name)
60
+ end
61
+
62
+ updated_files.fetch(lockfile_name)
63
+ end
64
+ end
65
+
66
+ def version_from_updated_lockfiles(updated_lockfiles)
67
+ updated_files = dependency_files -
68
+ yarn_locks -
69
+ package_locks -
70
+ shrinkwraps +
71
+ updated_lockfiles
72
+
73
+ updated_version = FileParsers::JavaScript::NpmAndYarn.new(
74
+ dependency_files: updated_files,
75
+ source: nil,
76
+ credentials: credentials
77
+ ).parse.find { |d| d.name == dependency.name }&.version
78
+ return unless updated_version
79
+
80
+ version_class.new(updated_version)
81
+ end
82
+
83
+ # rubocop:disable Metrics/CyclomaticComplexity
84
+ # rubocop:disable Metrics/PerceivedComplexity
85
+ def run_yarn_updater(path, lockfile_name)
86
+ SharedHelpers.with_git_configured(credentials: credentials) do
87
+ Dir.chdir(path) do
88
+ SharedHelpers.run_helper_subprocess(
89
+ command: "node #{yarn_helper_path}",
90
+ function: "updateSubdependency",
91
+ args: [Dir.pwd, lockfile_name]
92
+ )
93
+ end
94
+ end
95
+ rescue SharedHelpers::HelperSubprocessFailed => error
96
+ unfindable_str = "find package \"#{dependency.name}"
97
+ raise unless error.message.include?("The registry may be down") ||
98
+ error.message.include?("ETIMEDOUT") ||
99
+ error.message.include?("ENOBUFS") ||
100
+ error.message.include?(unfindable_str)
101
+
102
+ retry_count ||= 0
103
+ retry_count += 1
104
+ raise if retry_count > 2
105
+
106
+ sleep(rand(3.0..10.0)) && retry
107
+ end
108
+ # rubocop:enable Metrics/CyclomaticComplexity
109
+ # rubocop:enable Metrics/PerceivedComplexity
110
+
111
+ def run_npm_updater(path, lockfile_name)
112
+ SharedHelpers.with_git_configured(credentials: credentials) do
113
+ Dir.chdir(path) do
114
+ SharedHelpers.run_helper_subprocess(
115
+ command: "node #{npm_helper_path}",
116
+ function: "updateSubdependency",
117
+ args: [Dir.pwd, lockfile_name]
118
+ )
119
+ end
120
+ end
121
+ end
122
+
123
+ def write_temporary_dependency_files
124
+ write_lock_files
125
+
126
+ File.write(".npmrc", npmrc_content)
127
+
128
+ package_files.each do |file|
129
+ path = file.name
130
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
131
+ File.write(file.name, prepared_package_json_content(file))
132
+ end
133
+ end
134
+
135
+ def write_lock_files
136
+ yarn_locks.each do |f|
137
+ FileUtils.mkdir_p(Pathname.new(f.name).dirname)
138
+ File.write(f.name, prepared_yarn_lockfile_content(f.content))
139
+ end
140
+
141
+ [*package_locks, *shrinkwraps].each do |f|
142
+ FileUtils.mkdir_p(Pathname.new(f.name).dirname)
143
+ File.write(f.name, prepared_npm_lockfile_content(f.content))
144
+ end
145
+ end
146
+
147
+ # Duplicated in NpmLockfileUpdater
148
+ # Remove the dependency we want to update from the lockfile and let
149
+ # yarn find the latest resolvable version and fix the lockfile
150
+ def prepared_yarn_lockfile_content(content)
151
+ content.gsub(/^#{Regexp.quote(dependency.name)}\@.*?\n\n/m, "")
152
+ end
153
+
154
+ def prepared_npm_lockfile_content(content)
155
+ JSON.dump(
156
+ remove_dependency_from_npm_lockfile(JSON.parse(content))
157
+ )
158
+ end
159
+
160
+ # Duplicated in NpmLockfileUpdater
161
+ # Remove the dependency we want to update from the lockfile and let
162
+ # npm find the latest resolvable version and fix the lockfile
163
+ def remove_dependency_from_npm_lockfile(npm_lockfile)
164
+ return npm_lockfile unless npm_lockfile.key?("dependencies")
165
+
166
+ dependencies =
167
+ npm_lockfile["dependencies"].
168
+ reject { |key, _| key == dependency.name }.
169
+ map { |k, v| [k, remove_dependency_from_npm_lockfile(v)] }.
170
+ to_h
171
+ npm_lockfile.merge("dependencies" => dependencies)
172
+ end
173
+
174
+ def prepared_package_json_content(file)
175
+ FileUpdaters::JavaScript::NpmAndYarn::PackageJsonPreparer.new(
176
+ package_json_content: file.content
177
+ ).prepared_content
178
+ end
179
+
180
+ def npmrc_content
181
+ FileUpdaters::JavaScript::NpmAndYarn::NpmrcBuilder.new(
182
+ credentials: credentials,
183
+ dependency_files: dependency_files
184
+ ).npmrc_content
185
+ end
186
+
187
+ def version_class
188
+ Utils::JavaScript::Version
189
+ end
190
+
191
+ def package_locks
192
+ @package_locks ||=
193
+ dependency_files.
194
+ select { |f| f.name.end_with?("package-lock.json") }
195
+ end
196
+
197
+ def yarn_locks
198
+ @yarn_locks ||=
199
+ dependency_files.
200
+ select { |f| f.name.end_with?("yarn.lock") }
201
+ end
202
+
203
+ def shrinkwraps
204
+ @shrinkwraps ||=
205
+ dependency_files.
206
+ select { |f| f.name.end_with?("npm-shrinkwrap.json") }
207
+ end
208
+
209
+ def package_files
210
+ @package_files ||=
211
+ dependency_files.
212
+ select { |f| f.name.end_with?("package.json") }
213
+ end
214
+
215
+ def yarn_helper_path
216
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
217
+ File.join(project_root, "helpers/yarn/bin/run.js")
218
+ end
219
+
220
+ def npm_helper_path
221
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
222
+ File.join(project_root, "helpers/npm/bin/run.js")
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,452 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/git_commit_checker"
4
+ require "dependabot/update_checkers/java_script/npm_and_yarn"
5
+ require "dependabot/file_parsers/java_script/npm_and_yarn"
6
+ require "dependabot/utils/java_script/version"
7
+ require "dependabot/utils/java_script/requirement"
8
+ require "dependabot/shared_helpers"
9
+ require "dependabot/errors"
10
+
11
+ file_updater_path = "dependabot/file_updaters/java_script/npm_and_yarn"
12
+ require "#{file_updater_path}/npmrc_builder"
13
+ require "#{file_updater_path}/package_json_preparer"
14
+
15
+ # rubocop:disable Metrics/ClassLength
16
+ module Dependabot
17
+ module UpdateCheckers
18
+ module JavaScript
19
+ class NpmAndYarn
20
+ class VersionResolver
21
+ require_relative "latest_version_finder"
22
+
23
+ # Error message from yarn add:
24
+ # " > @reach/router@1.2.1" has incorrect \
25
+ # peer dependency "react@15.x || 16.x || 16.4.0-alpha.0911da3"
26
+ # " > react-burger-menu@1.9.9" has unmet \
27
+ # peer dependency "react@>=0.14.0 <16.0.0".
28
+ YARN_PEER_DEP_ERROR_REGEX =
29
+ /
30
+ "\s>\s(?<requiring_dep>[^"]+)"\s
31
+ has\s(incorrect|unmet)\speer\sdependency\s
32
+ "(?<required_dep>[^"]+)"
33
+ /x.freeze
34
+
35
+ # Error message from npm install:
36
+ # react-dom@15.2.0 requires a peer of react@^15.2.0 \
37
+ # but none is installed. You must install peer dependencies yourself.
38
+ NPM_PEER_DEP_ERROR_REGEX =
39
+ /
40
+ (?<requiring_dep>[^\s]+)\s
41
+ requires\sa\speer\sof\s
42
+ (?<required_dep>.+?)\sbut\snone\sis\sinstalled.
43
+ /x.freeze
44
+
45
+ def initialize(dependency:, credentials:, dependency_files:,
46
+ latest_allowable_version:, latest_version_finder:)
47
+ @dependency = dependency
48
+ @credentials = credentials
49
+ @dependency_files = dependency_files
50
+ @latest_allowable_version = latest_allowable_version
51
+
52
+ @latest_version_finder = {}
53
+ @latest_version_finder[dependency] = latest_version_finder
54
+ end
55
+
56
+ def latest_resolvable_version
57
+ return latest_allowable_version if git_dependency?(dependency)
58
+
59
+ unless relevant_unmet_peer_dependencies.any?
60
+ return latest_allowable_version
61
+ end
62
+
63
+ satisfying_versions.first
64
+ end
65
+
66
+ def latest_version_resolvable_with_full_unlock?
67
+ return false if dependency_updates_from_full_unlock.nil?
68
+
69
+ true
70
+ end
71
+
72
+ def dependency_updates_from_full_unlock
73
+ return if git_dependency?(dependency)
74
+ return if newly_broken_peer_reqs_from_dep.any?
75
+
76
+ updates =
77
+ [{ dependency: dependency, version: latest_allowable_version }]
78
+ newly_broken_peer_reqs_on_dep.each do |peer_req|
79
+ dep_name = peer_req.fetch(:requiring_dep_name)
80
+ dep = top_level_dependencies.find { |d| d.name == dep_name }
81
+
82
+ # Can't handle reqs from sub-deps or git source deps (yet)
83
+ return nil if dep.nil?
84
+ return nil if git_dependency?(dep)
85
+
86
+ updated_version =
87
+ latest_version_of_dep_with_satisfied_peer_reqs(dep)
88
+ return nil unless updated_version
89
+
90
+ updates << { dependency: dep, version: updated_version }
91
+ end
92
+
93
+ updates
94
+ end
95
+
96
+ private
97
+
98
+ attr_reader :dependency, :credentials, :dependency_files,
99
+ :latest_allowable_version
100
+
101
+ def latest_version_finder(dep)
102
+ @latest_version_finder[dep] ||=
103
+ LatestVersionFinder.new(
104
+ dependency: dep,
105
+ credentials: credentials,
106
+ dependency_files: dependency_files,
107
+ ignored_versions: []
108
+ )
109
+ end
110
+
111
+ def peer_dependency_errors
112
+ return @peer_dependency_errors if @peer_dependency_errors_checked
113
+
114
+ @peer_dependency_errors_checked = true
115
+
116
+ @peer_dependency_errors =
117
+ fetch_peer_dependency_errors(version: latest_allowable_version)
118
+ end
119
+
120
+ def old_peer_dependency_errors
121
+ if @old_peer_dependency_errors_checked
122
+ return @old_peer_dependency_errors
123
+ end
124
+
125
+ @old_peer_dependency_errors_checked = true
126
+
127
+ @old_peer_dependency_errors =
128
+ fetch_peer_dependency_errors(version: dependency.version)
129
+ end
130
+
131
+ def fetch_peer_dependency_errors(version:)
132
+ # TODO: Add all of the error handling that the FileUpdater does
133
+ # here (since problematic repos will be resolved here before they're
134
+ # seen by the FileUpdater)
135
+ SharedHelpers.in_a_temporary_directory do
136
+ write_temporary_dependency_files
137
+
138
+ package_files.flat_map do |file|
139
+ path = Pathname.new(file.name).dirname
140
+ run_checker(path: path, version: version)
141
+ rescue SharedHelpers::HelperSubprocessFailed => error
142
+ errors = []
143
+ if error.message.match?(NPM_PEER_DEP_ERROR_REGEX)
144
+ error.message.scan(NPM_PEER_DEP_ERROR_REGEX) do
145
+ errors << Regexp.last_match.named_captures
146
+ end
147
+ elsif error.message.match?(YARN_PEER_DEP_ERROR_REGEX)
148
+ error.message.scan(YARN_PEER_DEP_ERROR_REGEX) do
149
+ errors << Regexp.last_match.named_captures
150
+ end
151
+ else raise
152
+ end
153
+ errors
154
+ end.compact
155
+ end
156
+ rescue SharedHelpers::HelperSubprocessFailed
157
+ # Fall back to allowing the version through. Whatever error
158
+ # occurred should be properly handled by the FileUpdater. We
159
+ # can slowly migrate error handling to this class over time.
160
+ []
161
+ end
162
+
163
+ def unmet_peer_dependencies
164
+ peer_dependency_errors.
165
+ map { |captures| error_details_from_captures(captures) }
166
+ end
167
+
168
+ def old_unmet_peer_dependencies
169
+ old_peer_dependency_errors.
170
+ map { |captures| error_details_from_captures(captures) }
171
+ end
172
+
173
+ def error_details_from_captures(captures)
174
+ {
175
+ requirement_name:
176
+ captures.fetch("required_dep").sub(/@[^@]+$/, ""),
177
+ requirement_version:
178
+ captures.fetch("required_dep").split("@").last,
179
+ requiring_dep_name:
180
+ captures.fetch("requiring_dep").sub(/@[^@]+$/, "")
181
+ }
182
+ end
183
+
184
+ def relevant_unmet_peer_dependencies
185
+ relevant_unmet_peer_dependencies =
186
+ unmet_peer_dependencies.select do |dep|
187
+ dep[:requirement_name] == dependency.name ||
188
+ dep[:requiring_dep_name] == dependency.name
189
+ end
190
+
191
+ return [] if relevant_unmet_peer_dependencies.empty?
192
+
193
+ # Prune out any pre-existing warnings
194
+ relevant_unmet_peer_dependencies.reject do |issue|
195
+ old_unmet_peer_dependencies.any? do |old_issue|
196
+ old_issue.slice(:requirement_name, :requiring_dep_name) ==
197
+ issue.slice(:requirement_name, :requiring_dep_name)
198
+ end
199
+ end
200
+ end
201
+
202
+ def satisfying_versions
203
+ latest_version_finder(dependency).
204
+ possible_versions_with_details.
205
+ select do |version, details|
206
+ next false unless satisfies_peer_reqs_on_dep?(version)
207
+ next true unless details["peerDependencies"]
208
+
209
+ details["peerDependencies"].all? do |dep, req|
210
+ dep = top_level_dependencies.find { |d| d.name == dep }
211
+ next false unless dep
212
+ next git_dependency?(dep) if req.include?("/")
213
+
214
+ reqs = requirement_class.requirements_array(req)
215
+ next false unless version_for_dependency(dep)
216
+
217
+ reqs.any? { |r| r.satisfied_by?(version_for_dependency(dep)) }
218
+ rescue Gem::Requirement::BadRequirementError
219
+ false
220
+ end
221
+ end.
222
+ map(&:first)
223
+ end
224
+
225
+ def satisfies_peer_reqs_on_dep?(version)
226
+ newly_broken_peer_reqs_on_dep.all? do |peer_req|
227
+ req = peer_req.fetch(:requirement_version)
228
+
229
+ # Git requirements can't be satisfied by a version
230
+ next false if req.include?("/")
231
+
232
+ reqs = requirement_class.requirements_array(req)
233
+ reqs.any? { |r| r.satisfied_by?(version) }
234
+ end
235
+ end
236
+
237
+ def latest_version_of_dep_with_satisfied_peer_reqs(dep)
238
+ latest_version_finder(dep).
239
+ possible_versions_with_details.
240
+ find do |version, details|
241
+ next false unless version > version_class.new(dep.version)
242
+ next true unless details["peerDependencies"]
243
+
244
+ details["peerDependencies"].all? do |peer_dep_name, req|
245
+ # Can't handle multiple peer dependencies
246
+ next false unless peer_dep_name == dependency.name
247
+ next git_dependency?(dependency) if req.include?("/")
248
+
249
+ reqs = requirement_class.requirements_array(req)
250
+
251
+ reqs.any? { |r| r.satisfied_by?(latest_allowable_version) }
252
+ end
253
+ end&.
254
+ first
255
+ end
256
+
257
+ def git_dependency?(dep)
258
+ GitCommitChecker.
259
+ new(dependency: dep, credentials: credentials).
260
+ git_dependency?
261
+ end
262
+
263
+ def newly_broken_peer_reqs_on_dep
264
+ relevant_unmet_peer_dependencies.
265
+ select { |dep| dep[:requirement_name] == dependency.name }
266
+ end
267
+
268
+ def newly_broken_peer_reqs_from_dep
269
+ relevant_unmet_peer_dependencies.
270
+ select { |dep| dep[:requiring_dep_name] == dependency.name }
271
+ end
272
+
273
+ def run_checker(path:, version:)
274
+ if [*package_locks, *shrinkwraps].any?
275
+ run_npm_checker(path: path, version: version)
276
+ end
277
+
278
+ run_yarn_checker(path: path, version: version) if yarn_locks.any?
279
+ run_yarn_checker(path: path, version: version) if lockfiles.none?
280
+ end
281
+
282
+ def run_yarn_checker(path:, version:)
283
+ SharedHelpers.with_git_configured(credentials: credentials) do
284
+ Dir.chdir(path) do
285
+ SharedHelpers.run_helper_subprocess(
286
+ command: "node #{yarn_helper_path}",
287
+ function: "checkPeerDependencies",
288
+ args: [
289
+ Dir.pwd,
290
+ dependency.name,
291
+ version,
292
+ requirements_for_path(dependency.requirements, path)
293
+ ]
294
+ )
295
+ end
296
+ end
297
+ end
298
+
299
+ def run_npm_checker(path:, version:)
300
+ SharedHelpers.with_git_configured(credentials: credentials) do
301
+ Dir.chdir(path) do
302
+ SharedHelpers.run_helper_subprocess(
303
+ command: "node #{npm_helper_path}",
304
+ function: "checkPeerDependencies",
305
+ args: [
306
+ Dir.pwd,
307
+ dependency.name,
308
+ version,
309
+ requirements_for_path(dependency.requirements, path),
310
+ top_level_dependencies.map(&:to_h)
311
+ ]
312
+ )
313
+ end
314
+ end
315
+ end
316
+
317
+ def requirements_for_path(requirements, path)
318
+ return requirements if path.to_s == "."
319
+
320
+ requirements.map do |r|
321
+ next unless r[:file].start_with?("#{path}/")
322
+
323
+ r.merge(file: r[:file].gsub(/^#{Regexp.quote("#{path}/")}/, ""))
324
+ end.compact
325
+ end
326
+
327
+ def write_temporary_dependency_files
328
+ write_lock_files
329
+
330
+ File.write(".npmrc", npmrc_content)
331
+
332
+ package_files.each do |file|
333
+ path = file.name
334
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
335
+ File.write(file.name, prepared_package_json_content(file))
336
+ end
337
+ end
338
+
339
+ def write_lock_files
340
+ yarn_locks.each do |f|
341
+ FileUtils.mkdir_p(Pathname.new(f.name).dirname)
342
+ File.write(f.name, prepared_yarn_lockfile_content(f.content))
343
+ end
344
+
345
+ package_locks.each do |f|
346
+ FileUtils.mkdir_p(Pathname.new(f.name).dirname)
347
+ File.write(f.name, f.content)
348
+ end
349
+
350
+ shrinkwraps.each do |f|
351
+ FileUtils.mkdir_p(Pathname.new(f.name).dirname)
352
+ File.write(f.name, f.content)
353
+ end
354
+ end
355
+
356
+ def prepared_yarn_lockfile_content(content)
357
+ content.gsub(/^#{Regexp.quote(dependency.name)}\@.*?\n\n/m, "")
358
+ end
359
+
360
+ def prepared_package_json_content(file)
361
+ FileUpdaters::JavaScript::NpmAndYarn::PackageJsonPreparer.new(
362
+ package_json_content: file.content
363
+ ).prepared_content
364
+ end
365
+
366
+ def npmrc_content
367
+ FileUpdaters::JavaScript::NpmAndYarn::NpmrcBuilder.new(
368
+ credentials: credentials,
369
+ dependency_files: dependency_files
370
+ ).npmrc_content
371
+ end
372
+
373
+ # Top level dependecies are required in the peer dep checker
374
+ # to fetch the manifests for all top level deps which may contain
375
+ # "peerDependency" requirements
376
+ def top_level_dependencies
377
+ @top_level_dependencies ||= FileParsers::JavaScript::NpmAndYarn.new(
378
+ dependency_files: dependency_files,
379
+ source: nil,
380
+ credentials: credentials
381
+ ).parse.select(&:top_level?)
382
+ end
383
+
384
+ def lockfiles
385
+ [*yarn_locks, *package_locks, *shrinkwraps]
386
+ end
387
+
388
+ def package_locks
389
+ @package_locks ||=
390
+ dependency_files.
391
+ select { |f| f.name.end_with?("package-lock.json") }
392
+ end
393
+
394
+ def yarn_locks
395
+ @yarn_locks ||=
396
+ dependency_files.
397
+ select { |f| f.name.end_with?("yarn.lock") }
398
+ end
399
+
400
+ def shrinkwraps
401
+ @shrinkwraps ||=
402
+ dependency_files.
403
+ select { |f| f.name.end_with?("npm-shrinkwrap.json") }
404
+ end
405
+
406
+ def package_files
407
+ @package_files ||=
408
+ dependency_files.
409
+ select { |f| f.name.end_with?("package.json") }
410
+ end
411
+
412
+ def yarn_helper_path
413
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
414
+ File.join(project_root, "helpers/yarn/bin/run.js")
415
+ end
416
+
417
+ def npm_helper_path
418
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
419
+ File.join(project_root, "helpers/npm/bin/run.js")
420
+ end
421
+
422
+ def version_for_dependency(dep)
423
+ if dep.version && version_class.correct?(dep.version)
424
+ return version_class.new(dep.version)
425
+ end
426
+
427
+ dep.requirements.map { |r| r[:requirement] }.compact.
428
+ reject { |req_string| req_string.start_with?("<") }.
429
+ select { |req_string| req_string.match?(version_regex) }.
430
+ map { |req_string| req_string.match(version_regex) }.
431
+ select { |version| version_class.correct?(version.to_s) }.
432
+ map { |version| version_class.new(version.to_s) }.
433
+ max
434
+ end
435
+
436
+ def version_class
437
+ Utils::JavaScript::Version
438
+ end
439
+
440
+ def requirement_class
441
+ Utils::JavaScript::Requirement
442
+ end
443
+
444
+ def version_regex
445
+ version_class::VERSION_PATTERN
446
+ end
447
+ end
448
+ end
449
+ end
450
+ end
451
+ end
452
+ # rubocop:enable Metrics/ClassLength