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,191 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/java_script/npm_and_yarn"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module JavaScript
8
+ class NpmAndYarn
9
+ # Build a .npmrc file from the lockfile content, credentials, and any
10
+ # committed .npmrc
11
+ class NpmrcBuilder
12
+ CENTRAL_REGISTRIES = %w(
13
+ registry.npmjs.org
14
+ registry.yarnpkg.com
15
+ ).freeze
16
+
17
+ def initialize(dependency_files:, credentials:)
18
+ @dependency_files = dependency_files
19
+ @credentials = credentials
20
+ end
21
+
22
+ def npmrc_content
23
+ initial_content =
24
+ if npmrc_file then complete_npmrc_from_credentials
25
+ elsif yarnrc_file then build_npmrc_from_yarnrc
26
+ else build_npmrc_content_from_lockfile
27
+ end
28
+
29
+ return initial_content || "" unless registry_credentials.any?
30
+
31
+ ([initial_content] + credential_lines_for_npmrc).compact.join("\n")
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :dependency_files, :credentials
37
+
38
+ def build_npmrc_content_from_lockfile
39
+ return unless yarn_lock || package_lock
40
+ return unless global_registry
41
+
42
+ "registry = https://#{global_registry['registry']}\n"\
43
+ "#{global_registry_auth_line}\n"\
44
+ "always-auth = true"
45
+ end
46
+
47
+ def global_registry
48
+ @global_registry ||=
49
+ registry_credentials.find do |cred|
50
+ next false if CENTRAL_REGISTRIES.include?(cred["registry"])
51
+
52
+ # If all the URLs include this registry, it's global
53
+ if dependency_urls.all? { |url| url.include?(cred["registry"]) }
54
+ next true
55
+ end
56
+
57
+ # If any unscoped URLs include this registry, it's global
58
+ dependency_urls.
59
+ reject { |u| u.include?("@") || u.include?("%40") }.
60
+ any? { |url| url.include?(cred["registry"]) }
61
+ end
62
+ end
63
+
64
+ def global_registry_auth_line
65
+ token = global_registry.fetch("token")
66
+
67
+ if token.include?(":")
68
+ encoded_token = Base64.encode64(token).delete("\n")
69
+ "_auth = #{encoded_token}"
70
+ elsif Base64.decode64(token).ascii_only? &&
71
+ Base64.decode64(token).include?(":")
72
+ "_auth = #{token.delete("\n")}"
73
+ else
74
+ "_authToken = #{token}"
75
+ end
76
+ end
77
+
78
+ def dependency_urls
79
+ if package_lock
80
+ parsed_package_lock.fetch("dependencies", {}).
81
+ map { |_, details| details["resolved"] }.compact.
82
+ reject { |url| url.start_with?("git") }
83
+ elsif yarn_lock
84
+ yarn_lock.content.scan(/ resolved "(.*?)"/).flatten
85
+ end
86
+ end
87
+
88
+ def complete_npmrc_from_credentials
89
+ initial_content = npmrc_file.content.
90
+ gsub(/^.*\$\{.*\}.*/, "").strip + "\n"
91
+ return initial_content unless yarn_lock || package_lock
92
+ return initial_content unless global_registry
93
+
94
+ initial_content +
95
+ "registry = https://#{global_registry['registry']}\n"\
96
+ "#{global_registry_auth_line}\n"\
97
+ "always-auth = true\n"
98
+ end
99
+
100
+ def build_npmrc_from_yarnrc
101
+ yarnrc_global_registry =
102
+ yarnrc_file.content.
103
+ lines.find { |line| line.match?(/^\s*registry\s/) }&.
104
+ match(/^\s*registry\s+"(?<registry>[^"]+)"/)&.
105
+ named_captures&.fetch("registry")
106
+
107
+ if yarnrc_global_registry
108
+ return "registry = #{yarnrc_global_registry}\n"
109
+ end
110
+
111
+ build_npmrc_content_from_lockfile
112
+ end
113
+
114
+ def credential_lines_for_npmrc
115
+ lines = []
116
+ registry_credentials.each do |cred|
117
+ registry = cred.fetch("registry")
118
+
119
+ lines << registry_scope(registry) if registry_scope(registry)
120
+
121
+ token = cred.fetch("token")
122
+ if token.include?(":")
123
+ encoded_token = Base64.encode64(token).delete("\n")
124
+ lines << "//#{registry}/:_auth=#{encoded_token}"
125
+ elsif Base64.decode64(token).ascii_only? &&
126
+ Base64.decode64(token).include?(":")
127
+ lines << %(//#{registry}/:_auth=#{token.delete("\n")})
128
+ else
129
+ lines << "//#{registry}/:_authToken=#{token}"
130
+ end
131
+ end
132
+
133
+ return lines unless lines.any? { |str| str.include?("auth=") }
134
+
135
+ # Work around a suspected yarn bug
136
+ ["always-auth = true"] + lines
137
+ end
138
+
139
+ def registry_scope(registry)
140
+ # Central registries don't just apply to scopes
141
+ return if CENTRAL_REGISTRIES.include?(registry)
142
+
143
+ return unless dependency_urls
144
+
145
+ affected_urls = dependency_urls.
146
+ select { |url| url.include?(registry) }
147
+
148
+ scopes = affected_urls.map do |url|
149
+ url.split(/\%40|@/)[1]&.split(%r{\%2F|/})&.first
150
+ end
151
+
152
+ # Registry used for unscoped packages
153
+ return if scopes.include?(nil)
154
+
155
+ # This just seems unlikely
156
+ return unless scopes.uniq.count == 1
157
+
158
+ "@#{scopes.first}:registry=https://#{registry}/"
159
+ end
160
+
161
+ def registry_credentials
162
+ credentials.select { |cred| cred.fetch("type") == "npm_registry" }
163
+ end
164
+
165
+ def parsed_package_lock
166
+ @parsed_package_lock ||= JSON.parse(package_lock.content)
167
+ end
168
+
169
+ def npmrc_file
170
+ @npmrc_file ||= dependency_files.
171
+ find { |f| f.name.end_with?(".npmrc") }
172
+ end
173
+
174
+ def yarnrc_file
175
+ @yarnrc_file ||= dependency_files.
176
+ find { |f| f.name.end_with?(".yarnrc") }
177
+ end
178
+
179
+ def yarn_lock
180
+ @yarn_lock ||= dependency_files.find { |f| f.name == "yarn.lock" }
181
+ end
182
+
183
+ def package_lock
184
+ @package_lock ||=
185
+ dependency_files.find { |f| f.name == "package-lock.json" }
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/java_script/npm_and_yarn"
4
+ require "dependabot/file_parsers/java_script/npm_and_yarn"
5
+
6
+ module Dependabot
7
+ module FileUpdaters
8
+ module JavaScript
9
+ class NpmAndYarn
10
+ class PackageJsonPreparer
11
+ def initialize(package_json_content:)
12
+ @package_json_content = package_json_content
13
+ end
14
+
15
+ def prepared_content
16
+ content = package_json_content
17
+ content = replace_ssh_sources(content)
18
+ content = remove_workspace_path_prefixes(content)
19
+ content = remove_invalid_characters(content)
20
+ content
21
+ end
22
+
23
+ def replace_ssh_sources(content)
24
+ updated_content = content
25
+
26
+ git_ssh_requirements_to_swap.each do |req|
27
+ new_req = req.gsub(%r{git\+ssh://git@(.*?)[:/]}, 'https://\1/')
28
+ updated_content = updated_content.gsub(req, new_req)
29
+ end
30
+
31
+ updated_content
32
+ end
33
+
34
+ # A bug prevents Yarn recognising that a directory is part of a
35
+ # workspace if it is specified with a `./` prefix.
36
+ def remove_workspace_path_prefixes(content)
37
+ json = JSON.parse(content)
38
+ return content unless json.key?("workspaces")
39
+
40
+ workspace_object = json.fetch("workspaces")
41
+ paths_array =
42
+ if workspace_object.is_a?(Hash)
43
+ workspace_object.values_at("packages", "nohoist").
44
+ flatten.compact
45
+ elsif workspace_object.is_a?(Array) then workspace_object
46
+ else raise "Unexpected workspace object"
47
+ end
48
+
49
+ paths_array.each { |path| path.gsub!(%r{^\./}, "") }
50
+
51
+ json.to_json
52
+ end
53
+
54
+ def remove_invalid_characters(content)
55
+ content.
56
+ gsub(/\{\{.*?\}\}/, "something"). # {{ name }} syntax not allowed
57
+ gsub(/(?<!\\)\\ /, " "). # escaped whitespace not allowed
58
+ gsub(%r{^\s*//.*}, " ") # comments are not allowed
59
+ end
60
+
61
+ def swapped_ssh_requirements
62
+ git_ssh_requirements_to_swap
63
+ end
64
+
65
+ private
66
+
67
+ attr_reader :package_json_content
68
+
69
+ def git_ssh_requirements_to_swap
70
+ if @git_ssh_requirements_to_swap
71
+ return @git_ssh_requirements_to_swap
72
+ end
73
+
74
+ @git_ssh_requirements_to_swap = []
75
+
76
+ FileParsers::JavaScript::NpmAndYarn::DEPENDENCY_TYPES.each do |t|
77
+ JSON.parse(package_json_content).fetch(t, {}).each do |_, req|
78
+ next unless req.start_with?("git+ssh:")
79
+
80
+ req = req.split("#").first
81
+ @git_ssh_requirements_to_swap << req
82
+ end
83
+ end
84
+
85
+ @git_ssh_requirements_to_swap
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,220 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/java_script/npm_and_yarn"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module JavaScript
8
+ class NpmAndYarn
9
+ class PackageJsonUpdater
10
+ def initialize(package_json:, dependencies:)
11
+ @package_json = package_json
12
+ @dependencies = dependencies
13
+ end
14
+
15
+ def updated_package_json
16
+ updated_file = package_json.dup
17
+ updated_file.content = updated_package_json_content
18
+ updated_file
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :package_json, :dependencies
24
+
25
+ def updated_package_json_content
26
+ dependencies.reduce(package_json.content.dup) do |content, dep|
27
+ updated_requirements(dep).each do |new_req|
28
+ old_req = old_requirement(dep, new_req)
29
+
30
+ new_content = update_package_json_declaration(
31
+ package_json_content: content,
32
+ dependency_name: dep.name,
33
+ old_req: old_req,
34
+ new_req: new_req
35
+ )
36
+
37
+ raise "Expected content to change!" if content == new_content
38
+
39
+ content = new_content
40
+ end
41
+
42
+ new_requirements(dep).each do |new_req|
43
+ old_req = old_requirement(dep, new_req)
44
+
45
+ content = update_package_json_resolutions(
46
+ package_json_content: content,
47
+ new_req: new_req,
48
+ dependency: dep,
49
+ old_req: old_req
50
+ )
51
+ end
52
+
53
+ content
54
+ end
55
+ end
56
+
57
+ def old_requirement(dependency, new_requirement)
58
+ dependency.previous_requirements.
59
+ select { |r| r[:file] == package_json.name }.
60
+ find { |r| r[:groups] == new_requirement[:groups] }
61
+ end
62
+
63
+ def new_requirements(dependency)
64
+ dependency.requirements.select { |r| r[:file] == package_json.name }
65
+ end
66
+
67
+ def updated_requirements(dependency)
68
+ new_requirements(dependency).
69
+ reject { |r| dependency.previous_requirements.include?(r) }
70
+ end
71
+
72
+ def update_package_json_declaration(package_json_content:, new_req:,
73
+ dependency_name:, old_req:)
74
+ original_line = declaration_line(
75
+ dependency_name: dependency_name,
76
+ dependency_req: old_req,
77
+ content: package_json_content
78
+ )
79
+
80
+ replacement_line = replacement_declaration_line(
81
+ original_line: original_line,
82
+ old_req: old_req,
83
+ new_req: new_req
84
+ )
85
+
86
+ groups = new_req.fetch(:groups)
87
+
88
+ update_package_json_sections(
89
+ groups,
90
+ package_json_content,
91
+ original_line,
92
+ replacement_line
93
+ )
94
+ end
95
+
96
+ # For full details on how Yarn resolutions work, see
97
+ # https://github.com/yarnpkg/rfcs/blob/master/implemented/
98
+ # 0000-selective-versions-resolutions.md
99
+ def update_package_json_resolutions(package_json_content:, new_req:,
100
+ dependency:, old_req:)
101
+ dep = dependency
102
+ resolutions =
103
+ JSON.parse(package_json_content).fetch("resolutions", {}).
104
+ reject { |_, v| v != old_req && v != dep.previous_version }.
105
+ select { |k, _| k == dep.name || k.end_with?("/#{dep.name}") }
106
+
107
+ return package_json_content unless resolutions.any?
108
+
109
+ content = package_json_content
110
+ resolutions.each do |_, resolution|
111
+ original_line = declaration_line(
112
+ dependency_name: dep.name,
113
+ dependency_req: { requirement: resolution },
114
+ content: content
115
+ )
116
+
117
+ new_resolution = resolution == old_req ? new_req : dep.version
118
+
119
+ replacement_line = replacement_declaration_line(
120
+ original_line: original_line,
121
+ old_req: { requirement: resolution },
122
+ new_req: { requirement: new_resolution }
123
+ )
124
+
125
+ content = update_package_json_sections(
126
+ ["resolutions"], content, original_line, replacement_line
127
+ )
128
+ end
129
+ content
130
+ end
131
+
132
+ def declaration_line(dependency_name:, dependency_req:, content:)
133
+ git_dependency = dependency_req.dig(:source, :type) == "git"
134
+
135
+ unless git_dependency
136
+ requirement = dependency_req.fetch(:requirement)
137
+ return content.match(/"#{Regexp.escape(dependency_name)}"\s*:\s*
138
+ "#{Regexp.escape(requirement)}"/x).to_s
139
+ end
140
+
141
+ username, repo =
142
+ dependency_req.dig(:source, :url).split("/").last(2)
143
+
144
+ content.match(
145
+ %r{"#{Regexp.escape(dependency_name)}"\s*:\s*
146
+ ".*?#{Regexp.escape(username)}/#{Regexp.escape(repo)}.*"}x
147
+ ).to_s
148
+ end
149
+
150
+ def replacement_declaration_line(original_line:, old_req:, new_req:)
151
+ was_git_dependency = old_req.dig(:source, :type) == "git"
152
+ now_git_dependency = new_req.dig(:source, :type) == "git"
153
+
154
+ unless was_git_dependency
155
+ return original_line.gsub(
156
+ %("#{old_req.fetch(:requirement)}"),
157
+ %("#{new_req.fetch(:requirement)}")
158
+ )
159
+ end
160
+
161
+ unless now_git_dependency
162
+ return original_line.gsub(
163
+ /(?<=\s").*[^\\](?=")/,
164
+ new_req.fetch(:requirement)
165
+ )
166
+ end
167
+
168
+ if original_line.include?("semver:")
169
+ return original_line.gsub(
170
+ %(semver:#{old_req.fetch(:requirement)}"),
171
+ %(semver:#{new_req.fetch(:requirement)}")
172
+ )
173
+ end
174
+
175
+ original_line.gsub(
176
+ %(\##{old_req.dig(:source, :ref)}"),
177
+ %(\##{new_req.dig(:source, :ref)}")
178
+ )
179
+ end
180
+
181
+ def update_package_json_sections(sections, content, old_line,
182
+ new_line)
183
+ # Currently, Dependabot doesn't update peerDependencies. However,
184
+ # if a development dependency is being updated and its requirement
185
+ # matches the requirement on a peer dependency we probably want to
186
+ # update the peer too.
187
+ #
188
+ # TODO: Move this logic to the UpdateChecker (and parse peer deps)
189
+ sections += ["peerDependencies"]
190
+ sections_regex = /#{sections.join("|")}/
191
+
192
+ declaration_blocks = []
193
+
194
+ content.scan(/['"]#{sections_regex}['"]\s*:\s*\{/m) do
195
+ mtch = Regexp.last_match
196
+ declaration_blocks <<
197
+ mtch.to_s +
198
+ mtch.post_match[0..closing_bracket_index(mtch.post_match)]
199
+ end
200
+
201
+ declaration_blocks.reduce(content.dup) do |new_content, block|
202
+ updated_block = block.sub(old_line, new_line)
203
+ new_content.sub!(block, updated_block)
204
+ end
205
+ end
206
+
207
+ def closing_bracket_index(string)
208
+ closes_required = 1
209
+
210
+ string.chars.each_with_index do |char, index|
211
+ closes_required += 1 if char == "{"
212
+ closes_required -= 1 if char == "}"
213
+ return index if closes_required.zero?
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end