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,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/base"
4
+
5
+ module Dependabot
6
+ module FileUpdaters
7
+ module JavaScript
8
+ class NpmAndYarn < Dependabot::FileUpdaters::Base
9
+ require_relative "npm_and_yarn/package_json_updater"
10
+ require_relative "npm_and_yarn/npm_lockfile_updater"
11
+ require_relative "npm_and_yarn/yarn_lockfile_updater"
12
+
13
+ def self.updated_files_regex
14
+ [
15
+ /^package\.json$/,
16
+ /^package-lock\.json$/,
17
+ /^npm-shrinkwrap\.json$/,
18
+ /^yarn\.lock$/
19
+ ]
20
+ end
21
+
22
+ def updated_dependency_files
23
+ updated_files = []
24
+
25
+ updated_files += updated_manifest_files
26
+ updated_files += updated_lockfiles
27
+
28
+ if updated_files.none? ||
29
+ updated_files.sort_by(&:name) == dependency_files.sort_by(&:name)
30
+ raise "No files have changed!"
31
+ end
32
+
33
+ updated_files
34
+ end
35
+
36
+ private
37
+
38
+ def check_required_files
39
+ raise "No package.json!" unless get_original_file("package.json")
40
+ end
41
+
42
+ def package_locks
43
+ @package_locks ||=
44
+ dependency_files.
45
+ select { |f| f.name.end_with?("package-lock.json") }
46
+ end
47
+
48
+ def yarn_locks
49
+ @yarn_locks ||=
50
+ dependency_files.
51
+ select { |f| f.name.end_with?("yarn.lock") }
52
+ end
53
+
54
+ def shrinkwraps
55
+ @shrinkwraps ||=
56
+ dependency_files.
57
+ select { |f| f.name.end_with?("npm-shrinkwrap.json") }
58
+ end
59
+
60
+ def package_files
61
+ dependency_files.select { |f| f.name.end_with?("package.json") }
62
+ end
63
+
64
+ def yarn_lock_changed?(yarn_lock)
65
+ yarn_lock.content != updated_yarn_lock_content(yarn_lock)
66
+ end
67
+
68
+ def package_lock_changed?(package_lock)
69
+ package_lock.content != updated_package_lock_content(package_lock)
70
+ end
71
+
72
+ def shrinkwrap_changed?(shrinkwrap)
73
+ shrinkwrap.content != updated_package_lock_content(shrinkwrap)
74
+ end
75
+
76
+ def updated_manifest_files
77
+ package_files.map do |file|
78
+ updated_content = updated_package_json_content(file)
79
+ next if updated_content == file.content
80
+
81
+ updated_file(file: file, content: updated_content)
82
+ end.compact
83
+ end
84
+
85
+ def updated_lockfiles
86
+ updated_files = []
87
+
88
+ yarn_locks.each do |yarn_lock|
89
+ next unless yarn_lock_changed?(yarn_lock)
90
+
91
+ updated_files << updated_file(
92
+ file: yarn_lock,
93
+ content: updated_yarn_lock_content(yarn_lock)
94
+ )
95
+ end
96
+
97
+ package_locks.each do |package_lock|
98
+ next unless package_lock_changed?(package_lock)
99
+
100
+ updated_files << updated_file(
101
+ file: package_lock,
102
+ content: updated_package_lock_content(package_lock)
103
+ )
104
+ end
105
+
106
+ shrinkwraps.each do |shrinkwrap|
107
+ next unless shrinkwrap_changed?(shrinkwrap)
108
+
109
+ updated_files << updated_file(
110
+ file: shrinkwrap,
111
+ content: updated_shrinkwrap_content(shrinkwrap)
112
+ )
113
+ end
114
+
115
+ updated_files
116
+ end
117
+
118
+ def updated_yarn_lock_content(yarn_lock)
119
+ yarn_lockfile_updater.updated_yarn_lock_content(yarn_lock)
120
+ end
121
+
122
+ def yarn_lockfile_updater
123
+ @yarn_lockfile_updater ||=
124
+ YarnLockfileUpdater.new(
125
+ dependencies: dependencies,
126
+ dependency_files: dependency_files,
127
+ credentials: credentials
128
+ )
129
+ end
130
+
131
+ def updated_package_lock_content(package_lock)
132
+ npm_lockfile_updater.updated_lockfile_content(package_lock)
133
+ end
134
+
135
+ def updated_shrinkwrap_content(shrinkwrap)
136
+ npm_lockfile_updater.updated_lockfile_content(shrinkwrap)
137
+ end
138
+
139
+ def npm_lockfile_updater
140
+ @npm_lockfile_updater ||=
141
+ NpmLockfileUpdater.new(
142
+ dependencies: dependencies,
143
+ dependency_files: dependency_files,
144
+ credentials: credentials
145
+ )
146
+ end
147
+
148
+ def updated_package_json_content(file)
149
+ @updated_package_json_content ||= {}
150
+ @updated_package_json_content[file.name] ||=
151
+ PackageJsonUpdater.new(
152
+ package_json: file,
153
+ dependencies: dependencies
154
+ ).updated_package_json.content
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,532 @@
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
+ require "dependabot/update_checkers/java_script/npm_and_yarn/registry_finder"
6
+ require "dependabot/shared_helpers"
7
+ require "dependabot/errors"
8
+
9
+ # rubocop:disable Metrics/ClassLength
10
+ module Dependabot
11
+ module FileUpdaters
12
+ module JavaScript
13
+ class NpmAndYarn
14
+ class NpmLockfileUpdater
15
+ require_relative "npmrc_builder"
16
+ require_relative "package_json_updater"
17
+
18
+ def initialize(dependencies:, dependency_files:, credentials:)
19
+ @dependencies = dependencies
20
+ @dependency_files = dependency_files
21
+ @credentials = credentials
22
+ end
23
+
24
+ def updated_lockfile_content(lockfile)
25
+ return lockfile.content if npmrc_disables_lockfile?
26
+ return lockfile.content if updatable_dependencies(lockfile).empty?
27
+
28
+ @updated_lockfile_content ||= {}
29
+ @updated_lockfile_content[lockfile.name] ||=
30
+ SharedHelpers.in_a_temporary_directory do
31
+ path = Pathname.new(lockfile.name).dirname.to_s
32
+ lockfile_name = Pathname.new(lockfile.name).basename.to_s
33
+ write_temporary_dependency_files(lockfile.name)
34
+ updated_files = Dir.chdir(path) do
35
+ run_current_npm_update(lockfile_name: lockfile_name)
36
+ end
37
+ updated_content = updated_files.fetch(lockfile_name)
38
+ updated_content = post_process_npm_lockfile(updated_content)
39
+ raise "No change!" if lockfile.content == updated_content
40
+
41
+ updated_content
42
+ end
43
+ rescue SharedHelpers::HelperSubprocessFailed => error
44
+ handle_npm_updater_error(error, lockfile)
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader :dependencies, :dependency_files, :credentials
50
+
51
+ UNREACHABLE_GIT =
52
+ /ls-remote (?:(-h -t)|(--tags --heads)) (?<url>.*)/.freeze
53
+ FORBIDDEN_PACKAGE =
54
+ /(403 Forbidden|401 Unauthorized): (?<package_req>.*)/.freeze
55
+ MISSING_PACKAGE = /404 Not Found: (?<package_req>.*)/.freeze
56
+ INVALID_PACKAGE = /Can't install (?<package_req>.*): Missing/.freeze
57
+
58
+ def top_level_dependencies
59
+ dependencies.select(&:top_level?)
60
+ end
61
+
62
+ def sub_dependencies
63
+ dependencies.reject(&:top_level?)
64
+ end
65
+
66
+ def updatable_dependencies(lockfile)
67
+ path = Pathname.new(lockfile.name).dirname.to_s
68
+ dependencies.reject do |dependency|
69
+ top_level_dependency_not_required?(dependency, path) ||
70
+ dependency_up_to_date?(lockfile, dependency)
71
+ end
72
+ end
73
+
74
+ def requirements_for_path(requirements, path)
75
+ return requirements if path.to_s == "."
76
+
77
+ requirements.map do |r|
78
+ next unless r[:file].start_with?("#{path}/")
79
+
80
+ r.merge(file: r[:file].gsub(/^#{Regexp.quote("#{path}/")}/, ""))
81
+ end.compact
82
+ end
83
+
84
+ def dependency_up_to_date?(lockfile, dependency)
85
+ existing_dep = FileParsers::JavaScript::NpmAndYarn.new(
86
+ dependency_files: [lockfile, *package_files],
87
+ source: nil,
88
+ credentials: credentials
89
+ ).parse.find { |dep| dep.name == dependency.name }
90
+
91
+ # If the dependency is missing but top level it should be treated as
92
+ # not up to date
93
+ # If it's a missing sub dependency we treat it as up to date
94
+ # (likely it is no longer required)
95
+ return !dependency.top_level? if existing_dep.nil?
96
+
97
+ existing_dep&.version == dependency.version
98
+ end
99
+
100
+ # Prevent changes to the lockfile when the dependency has been
101
+ # required in a package.json outside the current folder (e.g. lerna
102
+ # proj)
103
+ def top_level_dependency_not_required?(dependency, path)
104
+ dependency.top_level? &&
105
+ requirements_for_path(dependency.requirements, path).empty?
106
+ end
107
+
108
+ def run_current_npm_update(lockfile_name:)
109
+ top_level_dependency_updates = top_level_dependencies.map do |d|
110
+ { name: d.name, version: d.version, requirements: d.requirements }
111
+ end
112
+
113
+ run_npm_updater(
114
+ lockfile_name: lockfile_name,
115
+ top_level_dependency_updates: top_level_dependency_updates
116
+ )
117
+ end
118
+
119
+ def run_previous_npm_update(lockfile_name:)
120
+ previous_top_level_dependencies = top_level_dependencies.map do |d|
121
+ {
122
+ name: d.name,
123
+ version: d.previous_version,
124
+ requirements: d.previous_requirements
125
+ }
126
+ end
127
+
128
+ run_npm_updater(
129
+ lockfile_name: lockfile_name,
130
+ top_level_dependency_updates: previous_top_level_dependencies
131
+ )
132
+ end
133
+
134
+ def run_npm_updater(lockfile_name:, top_level_dependency_updates:)
135
+ SharedHelpers.with_git_configured(credentials: credentials) do
136
+ if top_level_dependency_updates.any?
137
+ run_npm_top_level_updater(
138
+ lockfile_name: lockfile_name,
139
+ top_level_dependency_updates: top_level_dependency_updates
140
+ )
141
+ else
142
+ run_npm_subdependency_updater(lockfile_name: lockfile_name)
143
+ end
144
+ end
145
+ end
146
+
147
+ def run_npm_top_level_updater(lockfile_name:,
148
+ top_level_dependency_updates:)
149
+ SharedHelpers.run_helper_subprocess(
150
+ command: "node #{npm_helper_path}",
151
+ function: "update",
152
+ args: [
153
+ Dir.pwd,
154
+ top_level_dependency_updates,
155
+ lockfile_name
156
+ ]
157
+ )
158
+ end
159
+
160
+ def run_npm_subdependency_updater(lockfile_name:)
161
+ SharedHelpers.run_helper_subprocess(
162
+ command: "node #{npm_helper_path}",
163
+ function: "updateSubdependency",
164
+ args: [Dir.pwd, lockfile_name]
165
+ )
166
+ end
167
+
168
+ # rubocop:disable Metrics/AbcSize
169
+ # rubocop:disable Metrics/CyclomaticComplexity
170
+ # rubocop:disable Metrics/PerceivedComplexity
171
+ # rubocop:disable Metrics/MethodLength
172
+ def handle_npm_updater_error(error, lockfile)
173
+ if error.message.match?(MISSING_PACKAGE)
174
+ package_name =
175
+ error.message.match(MISSING_PACKAGE).
176
+ named_captures["package_req"].
177
+ split(/(?<=\w)\@/).first
178
+ handle_missing_package(package_name)
179
+ end
180
+ names = dependencies.map(&:name)
181
+ if names.any? { |name| error.message.include?("#{name}@") } &&
182
+ error.message.start_with?("No matching vers") &&
183
+ resolvable_before_update?(lockfile)
184
+ # This happens if a new version has been published that relies on
185
+ # but npm is having consistency issues. We raise a bespoke error
186
+ # so we can capture and ignore it if we're trying to create a new
187
+ # PR (which will be created successfully at a later date).
188
+ raise Dependabot::InconsistentRegistryResponse, error.message
189
+ end
190
+
191
+ # When the package.json doesn't include a name or version
192
+ if error.message.match?(INVALID_PACKAGE)
193
+ raise_resolvability_error(error, lockfile)
194
+ end
195
+
196
+ if error.message.start_with?("No matching vers", "404 Not Found") ||
197
+ error.message.include?("not match any file(s) known to git") ||
198
+ error.message.include?("Non-registry package missing package") ||
199
+ error.message.include?("Cannot read property 'match' of ") ||
200
+ error.message.include?("Invalid tag name")
201
+ # This happens if a new version has been published that relies on
202
+ # subdependencies that have not yet been published.
203
+ raise if resolvable_before_update?(lockfile)
204
+
205
+ raise_resolvability_error(error, lockfile)
206
+ end
207
+ if error.message.match?(FORBIDDEN_PACKAGE)
208
+ package_name =
209
+ error.message.match(FORBIDDEN_PACKAGE).
210
+ named_captures["package_req"].
211
+ split(/(?<=\w)\@/).first
212
+ handle_missing_package(package_name)
213
+ end
214
+ if error.message.match?(UNREACHABLE_GIT)
215
+ dependency_url =
216
+ error.message.match(UNREACHABLE_GIT).
217
+ named_captures.fetch("url")
218
+
219
+ raise Dependabot::GitDependenciesNotReachable, dependency_url
220
+ end
221
+ raise
222
+ end
223
+ # rubocop:enable Metrics/AbcSize
224
+ # rubocop:enable Metrics/CyclomaticComplexity
225
+ # rubocop:enable Metrics/PerceivedComplexity
226
+ # rubocop:enable Metrics/MethodLength
227
+
228
+ def raise_resolvability_error(error, lockfile)
229
+ dependency_names = dependencies.map(&:name).join(", ")
230
+ msg = "Error whilst updating #{dependency_names} in "\
231
+ "#{lockfile.path}:\n#{error.message}"
232
+ raise Dependabot::DependencyFileNotResolvable, msg
233
+ end
234
+
235
+ def handle_missing_package(package_name)
236
+ missing_dep = FileParsers::JavaScript::NpmAndYarn.new(
237
+ dependency_files: dependency_files,
238
+ source: nil,
239
+ credentials: credentials
240
+ ).parse.find { |dep| dep.name == package_name }
241
+
242
+ return unless missing_dep
243
+
244
+ reg = UpdateCheckers::JavaScript::NpmAndYarn::RegistryFinder.new(
245
+ dependency: missing_dep,
246
+ credentials: credentials,
247
+ npmrc_file: dependency_files.
248
+ find { |f| f.name.end_with?(".npmrc") },
249
+ yarnrc_file: dependency_files.
250
+ find { |f| f.name.end_with?(".yarnrc") }
251
+ ).registry
252
+
253
+ if reg == "registry.npmjs.org" && !package_name.start_with?("@")
254
+ return
255
+ end
256
+
257
+ raise Dependabot::PrivateSourceAuthenticationFailure, reg
258
+ end
259
+
260
+ def resolvable_before_update?(lockfile)
261
+ @resolvable_before_update ||= {}
262
+ if @resolvable_before_update.key?(lockfile.name)
263
+ return @resolvable_before_update[lockfile.name]
264
+ end
265
+
266
+ @resolvable_before_update[lockfile.name] =
267
+ begin
268
+ SharedHelpers.in_a_temporary_directory do
269
+ write_temporary_dependency_files(
270
+ lockfile.name,
271
+ update_package_json: false
272
+ )
273
+
274
+ lockfile_name = Pathname.new(lockfile.name).basename.to_s
275
+ path = Pathname.new(lockfile.name).dirname.to_s
276
+ Dir.chdir(path) do
277
+ run_previous_npm_update(lockfile_name: lockfile_name)
278
+ end
279
+ end
280
+
281
+ true
282
+ rescue SharedHelpers::HelperSubprocessFailed
283
+ false
284
+ end
285
+ end
286
+
287
+ def write_temporary_dependency_files(lockfile_name,
288
+ update_package_json: true)
289
+ write_lockfiles(lockfile_name)
290
+ File.write(".npmrc", npmrc_content)
291
+
292
+ package_files.each do |file|
293
+ path = file.name
294
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
295
+
296
+ updated_content =
297
+ if update_package_json && top_level_dependencies.any?
298
+ updated_package_json_content(file)
299
+ else
300
+ file.content
301
+ end
302
+
303
+ # When updating a package-lock.json we have to manually lock all
304
+ # git dependencies, otherwise npm will (unhelpfully) update them
305
+ updated_content = lock_git_deps(updated_content)
306
+ updated_content = replace_ssh_sources(updated_content)
307
+
308
+ updated_content = sanitized_package_json_content(updated_content)
309
+ File.write(file.name, updated_content)
310
+ end
311
+ end
312
+
313
+ def write_lockfiles(lockfile_name)
314
+ excluded_lock =
315
+ case lockfile_name
316
+ when "package-lock.json" then "npm-shrinkwrap.json"
317
+ when "npm-shrinkwrap.json" then "package-lock.json"
318
+ end
319
+ [*package_locks, *shrinkwraps].each do |f|
320
+ next if f.name == excluded_lock
321
+
322
+ FileUtils.mkdir_p(Pathname.new(f.name).dirname)
323
+
324
+ if top_level_dependencies.any?
325
+ File.write(f.name, f.content)
326
+ else
327
+ File.write(f.name, prepared_npm_lockfile_content(f.content))
328
+ end
329
+ end
330
+ end
331
+
332
+ def lock_git_deps(content)
333
+ return content if git_dependencies_to_lock.empty?
334
+
335
+ types = FileParsers::JavaScript::NpmAndYarn::DEPENDENCY_TYPES
336
+
337
+ json = JSON.parse(content)
338
+ types.each do |type|
339
+ json.fetch(type, {}).each do |nm, _|
340
+ updated_version = git_dependencies_to_lock.dig(nm, :version)
341
+ next unless updated_version
342
+
343
+ json[type][nm] = git_dependencies_to_lock[nm][:version]
344
+ end
345
+ end
346
+
347
+ json.to_json
348
+ end
349
+
350
+ def git_dependencies_to_lock
351
+ return {} unless package_locks.any?
352
+ return @git_dependencies_to_lock if @git_dependencies_to_lock
353
+
354
+ @git_dependencies_to_lock = {}
355
+ dependency_names = dependencies.map(&:name)
356
+
357
+ package_locks.each do |package_lock|
358
+ parsed_lockfile = JSON.parse(package_lock.content)
359
+ parsed_lockfile.fetch("dependencies", {}).each do |nm, details|
360
+ next if dependency_names.include?(nm)
361
+ next unless details["version"]
362
+ next unless details["version"].start_with?("git")
363
+
364
+ @git_dependencies_to_lock[nm] = {
365
+ version: details["version"],
366
+ from: details["from"]
367
+ }
368
+ end
369
+ end
370
+ @git_dependencies_to_lock
371
+ end
372
+
373
+ def replace_ssh_sources(content)
374
+ updated_content = content
375
+
376
+ git_ssh_requirements_to_swap.each do |req|
377
+ new_req = req.gsub(%r{git\+ssh://git@(.*?)[:/]}, 'https://\1/')
378
+ updated_content = updated_content.gsub(req, new_req)
379
+ end
380
+
381
+ updated_content
382
+ end
383
+
384
+ def git_ssh_requirements_to_swap
385
+ if @git_ssh_requirements_to_swap
386
+ return @git_ssh_requirements_to_swap
387
+ end
388
+
389
+ @git_ssh_requirements_to_swap = []
390
+
391
+ package_files.each do |file|
392
+ FileParsers::JavaScript::NpmAndYarn::DEPENDENCY_TYPES.each do |t|
393
+ JSON.parse(file.content).fetch(t, {}).each do |_, requirement|
394
+ next unless requirement.start_with?("git+ssh:")
395
+
396
+ req = requirement.split("#").first
397
+ @git_ssh_requirements_to_swap << req
398
+ end
399
+ end
400
+ end
401
+
402
+ @git_ssh_requirements_to_swap
403
+ end
404
+
405
+ def prepared_npm_lockfile_content(content)
406
+ JSON.dump(
407
+ remove_dependency_from_npm_lockfile(JSON.parse(content))
408
+ )
409
+ end
410
+
411
+ # Duplicated in SubdependencyVersionResolver
412
+ # Remove the dependency we want to update from the lockfile and let
413
+ # npm find the latest resolvable version and fix the lockfile
414
+ def remove_dependency_from_npm_lockfile(npm_lockfile)
415
+ return npm_lockfile unless npm_lockfile.key?("dependencies")
416
+
417
+ sub_dependency_names = sub_dependencies.map(&:name)
418
+ dependencies =
419
+ npm_lockfile["dependencies"].
420
+ reject { |key, _| sub_dependency_names.include?(key) }.
421
+ map { |k, v| [k, remove_dependency_from_npm_lockfile(v)] }.
422
+ to_h
423
+ npm_lockfile.merge("dependencies" => dependencies)
424
+ end
425
+
426
+ def post_process_npm_lockfile(lockfile_content)
427
+ updated_content = lockfile_content
428
+
429
+ # Switch SSH requirements back for git dependencies
430
+ git_ssh_requirements_to_swap.each do |req|
431
+ new_r = req.gsub(%r{git\+ssh://git@(.*?)[:/]}, 'git+https://\1/')
432
+ old_r = req.gsub(%r{git@(.*?)[:/]}, 'git@\1/')
433
+ updated_content = updated_content.gsub(new_r, old_r)
434
+ end
435
+
436
+ # Switch from details back for git dependencies (they will have
437
+ # changed because we locked them)
438
+ git_dependencies_to_lock.each do |_, details|
439
+ next unless details[:from]
440
+
441
+ new_r = /"from": "#{Regexp.quote(details[:from])}#[^\"]+"/
442
+ old_r = %("from": "#{details[:from]}")
443
+ updated_content = updated_content.gsub(new_r, old_r)
444
+ end
445
+
446
+ # Switch back the protocol of tarball resolutions if they've changed
447
+ # (fixes an npm bug, which appears to be applied inconsistently)
448
+ tarball_urls.each do |url|
449
+ trimmed_url = url.gsub(/(\d+\.)*tgz$/, "")
450
+ incorrect_url = if url.start_with?("https")
451
+ trimmed_url.gsub(/^https:/, "http:")
452
+ else trimmed_url.gsub(/^http:/, "https:")
453
+ end
454
+ updated_content = updated_content.gsub(
455
+ /#{Regexp.quote(incorrect_url)}(?=(\d+\.)*tgz")/,
456
+ trimmed_url
457
+ )
458
+ end
459
+
460
+ updated_content
461
+ end
462
+
463
+ def tarball_urls
464
+ all_urls = [*package_locks, *shrinkwraps].flat_map do |file|
465
+ file.content.scan(/"resolved":\s+"(.*)\"/).flatten
466
+ end
467
+ all_urls.uniq! { |url| url.gsub(/(\d+\.)*tgz$/, "") }
468
+
469
+ # If both the http:// and https:// versions of the tarball appear
470
+ # in the lockfile, prefer the https:// one
471
+ trimmed_urls = all_urls.map { |url| url.gsub(/(\d+\.)*tgz$/, "") }
472
+ all_urls.reject do |url|
473
+ next false unless url.start_with?("http:")
474
+
475
+ trimmed_url = url.gsub(/(\d+\.)*tgz$/, "")
476
+ trimmed_urls.include?(trimmed_url.gsub(/^http:/, "https:"))
477
+ end
478
+ end
479
+
480
+ def npmrc_content
481
+ NpmrcBuilder.new(
482
+ credentials: credentials,
483
+ dependency_files: dependency_files
484
+ ).npmrc_content
485
+ end
486
+
487
+ def updated_package_json_content(file)
488
+ @updated_package_json_content ||= {}
489
+ @updated_package_json_content[file.name] ||=
490
+ PackageJsonUpdater.new(
491
+ package_json: file,
492
+ dependencies: top_level_dependencies
493
+ ).updated_package_json.content
494
+ end
495
+
496
+ def npmrc_disables_lockfile?
497
+ npmrc_content.match?(/^package-lock\s*=\s*false/)
498
+ end
499
+
500
+ def sanitized_package_json_content(content)
501
+ content.
502
+ gsub(/\{\{.*?\}\}/, "something"). # {{ name }} syntax not allowed
503
+ gsub(/(?<!\\)\\ /, " "). # escaped whitespace not allowed
504
+ gsub(%r{^\s*//.*}, " ") # comments are not allowed
505
+ end
506
+
507
+ def npm_helper_path
508
+ project_root = File.join(File.dirname(__FILE__), "../../../../..")
509
+ File.join(project_root, "helpers/npm/bin/run.js")
510
+ end
511
+
512
+ def package_locks
513
+ @package_locks ||=
514
+ dependency_files.
515
+ select { |f| f.name.end_with?("package-lock.json") }
516
+ end
517
+
518
+ def shrinkwraps
519
+ @shrinkwraps ||=
520
+ dependency_files.
521
+ select { |f| f.name.end_with?("npm-shrinkwrap.json") }
522
+ end
523
+
524
+ def package_files
525
+ dependency_files.select { |f| f.name.end_with?("package.json") }
526
+ end
527
+ end
528
+ end
529
+ end
530
+ end
531
+ end
532
+ # rubocop:enable Metrics/ClassLength