dependabot-npm_and_yarn 0.387.0 → 0.388.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc3b9b0b9971143d48cf6678efb54d0e5f7664a283a0fef8a86063d86909be5d
4
- data.tar.gz: c47f23c922cc6bead3ffbe2c72d48a9ad141c1e267a27278d666a4faa5936830
3
+ metadata.gz: f40ec37d2f3b63d9c8a3f0484174fbb11a11f115d1e74646c130ae9e4577d70e
4
+ data.tar.gz: ad4b4183265d52c0c40da40cfc6c0e5eea2b7bdbe6256a07a6ca875274895def
5
5
  SHA512:
6
- metadata.gz: 78672be38a67f87e84128216d9152deac45e831966d1e4100579f177dc5c5af6ccad929fed7ae5912bc75ce45e81f898d8e16c11a91cb46b41a803b30efafbc0
7
- data.tar.gz: 400ad39fda40e64de78316445d7ef1a843b782b1a8ac6618cce309f323be3b89cb2ed6f751d8b3ea370b29505a826208de518c48393050cac5e568c58466be77
6
+ metadata.gz: f6d471d55e12b7fa3cd3e3742f09ea8ee376db3d0fe1324bc88e6a6372451d9fc4c225ae60a9e0c4aa6952fb4bcae7a82fbc9a7852d6171105a0523050dbef97
7
+ data.tar.gz: e7f31e3549ff1463a774486995863b9352f99a55116b75336954be3599ce2bdbb795da6c89bcc1909582953e3538c3ddcd77bc699f3ac9b327ca091e822ada84
@@ -3178,9 +3178,9 @@
3178
3178
  }
3179
3179
  },
3180
3180
  "node_modules/@sigstore/core": {
3181
- "version": "3.1.0",
3182
- "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.1.0.tgz",
3183
- "integrity": "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==",
3181
+ "version": "3.2.1",
3182
+ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz",
3183
+ "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==",
3184
3184
  "engines": {
3185
3185
  "node": "^20.17.0 || >=22.9.0"
3186
3186
  }
@@ -3222,12 +3222,12 @@
3222
3222
  }
3223
3223
  },
3224
3224
  "node_modules/@sigstore/verify": {
3225
- "version": "3.1.0",
3226
- "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz",
3227
- "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==",
3225
+ "version": "3.1.1",
3226
+ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz",
3227
+ "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==",
3228
3228
  "dependencies": {
3229
3229
  "@sigstore/bundle": "^4.0.0",
3230
- "@sigstore/core": "^3.1.0",
3230
+ "@sigstore/core": "^3.2.1",
3231
3231
  "@sigstore/protobuf-specs": "^0.5.0"
3232
3232
  },
3233
3233
  "engines": {
@@ -7027,27 +7027,13 @@
7027
7027
  }
7028
7028
  },
7029
7029
  "node_modules/ip-address": {
7030
- "version": "9.0.5",
7031
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
7032
- "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
7033
- "dependencies": {
7034
- "jsbn": "1.1.0",
7035
- "sprintf-js": "^1.1.3"
7036
- },
7030
+ "version": "10.2.0",
7031
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
7032
+ "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
7037
7033
  "engines": {
7038
7034
  "node": ">= 12"
7039
7035
  }
7040
7036
  },
7041
- "node_modules/ip-address/node_modules/jsbn": {
7042
- "version": "1.1.0",
7043
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
7044
- "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
7045
- },
7046
- "node_modules/ip-address/node_modules/sprintf-js": {
7047
- "version": "1.1.3",
7048
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
7049
- "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
7050
- },
7051
7037
  "node_modules/is-arguments": {
7052
7038
  "version": "1.1.0",
7053
7039
  "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
@@ -15689,11 +15675,11 @@
15689
15675
  }
15690
15676
  },
15691
15677
  "node_modules/socks": {
15692
- "version": "2.8.3",
15693
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
15694
- "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
15678
+ "version": "2.8.9",
15679
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz",
15680
+ "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==",
15695
15681
  "dependencies": {
15696
- "ip-address": "^9.0.5",
15682
+ "ip-address": "^10.1.1",
15697
15683
  "smart-buffer": "^4.2.0"
15698
15684
  },
15699
15685
  "engines": {
@@ -16916,11 +16902,17 @@
16916
16902
  "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
16917
16903
  },
16918
16904
  "node_modules/yaml": {
16919
- "version": "2.3.1",
16920
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
16921
- "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
16905
+ "version": "2.9.0",
16906
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
16907
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
16908
+ "bin": {
16909
+ "yaml": "bin.mjs"
16910
+ },
16922
16911
  "engines": {
16923
- "node": ">= 14"
16912
+ "node": ">= 14.6"
16913
+ },
16914
+ "funding": {
16915
+ "url": "https://github.com/sponsors/eemeli"
16924
16916
  }
16925
16917
  },
16926
16918
  "node_modules/yargs": {
@@ -19276,9 +19268,9 @@
19276
19268
  }
19277
19269
  },
19278
19270
  "@sigstore/core": {
19279
- "version": "3.1.0",
19280
- "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.1.0.tgz",
19281
- "integrity": "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A=="
19271
+ "version": "3.2.1",
19272
+ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz",
19273
+ "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g=="
19282
19274
  },
19283
19275
  "@sigstore/protobuf-specs": {
19284
19276
  "version": "0.5.0",
@@ -19308,12 +19300,12 @@
19308
19300
  }
19309
19301
  },
19310
19302
  "@sigstore/verify": {
19311
- "version": "3.1.0",
19312
- "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.0.tgz",
19313
- "integrity": "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==",
19303
+ "version": "3.1.1",
19304
+ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz",
19305
+ "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==",
19314
19306
  "requires": {
19315
19307
  "@sigstore/bundle": "^4.0.0",
19316
- "@sigstore/core": "^3.1.0",
19308
+ "@sigstore/core": "^3.2.1",
19317
19309
  "@sigstore/protobuf-specs": "^0.5.0"
19318
19310
  }
19319
19311
  },
@@ -22067,25 +22059,9 @@
22067
22059
  }
22068
22060
  },
22069
22061
  "ip-address": {
22070
- "version": "9.0.5",
22071
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
22072
- "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
22073
- "requires": {
22074
- "jsbn": "1.1.0",
22075
- "sprintf-js": "^1.1.3"
22076
- },
22077
- "dependencies": {
22078
- "jsbn": {
22079
- "version": "1.1.0",
22080
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
22081
- "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
22082
- },
22083
- "sprintf-js": {
22084
- "version": "1.1.3",
22085
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
22086
- "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
22087
- }
22088
- }
22062
+ "version": "10.2.0",
22063
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
22064
+ "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="
22089
22065
  },
22090
22066
  "is-arguments": {
22091
22067
  "version": "1.1.0",
@@ -28494,11 +28470,11 @@
28494
28470
  "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
28495
28471
  },
28496
28472
  "socks": {
28497
- "version": "2.8.3",
28498
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
28499
- "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
28473
+ "version": "2.8.9",
28474
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz",
28475
+ "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==",
28500
28476
  "requires": {
28501
- "ip-address": "^9.0.5",
28477
+ "ip-address": "^10.1.1",
28502
28478
  "smart-buffer": "^4.2.0"
28503
28479
  }
28504
28480
  },
@@ -29383,9 +29359,9 @@
29383
29359
  "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
29384
29360
  },
29385
29361
  "yaml": {
29386
- "version": "2.3.1",
29387
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
29388
- "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ=="
29362
+ "version": "2.9.0",
29363
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
29364
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="
29389
29365
  },
29390
29366
  "yargs": {
29391
29367
  "version": "17.7.2",
@@ -68,9 +68,9 @@
68
68
  }
69
69
  },
70
70
  "node_modules/ws": {
71
- "version": "8.18.3",
72
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
73
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
71
+ "version": "8.21.1",
72
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz",
73
+ "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==",
74
74
  "license": "MIT",
75
75
  "engines": {
76
76
  "node": ">=10.0.0"
@@ -565,9 +565,10 @@
565
565
  "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
566
566
  },
567
567
  "node_modules/lodash": {
568
- "version": "4.17.23",
569
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
570
- "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="
568
+ "version": "4.18.1",
569
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
570
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
571
+ "license": "MIT"
571
572
  },
572
573
  "node_modules/lru-queue": {
573
574
  "version": "0.1.0",
@@ -129,9 +129,9 @@ balanced-match@^1.0.0:
129
129
  integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
130
130
 
131
131
  brace-expansion@^1.1.7:
132
- version "1.1.13"
133
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.13.tgz#d37875c01dc9eff988dd49d112a57cb67b54efe6"
134
- integrity sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==
132
+ version "1.1.16"
133
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.16.tgz#723d3a30c0558c225abc9fc479a73e14e26c3c2f"
134
+ integrity sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==
135
135
  dependencies:
136
136
  balanced-match "^1.0.0"
137
137
  concat-map "0.0.1"
@@ -366,9 +366,9 @@ is-promise@^2.1:
366
366
  integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
367
367
 
368
368
  lodash@^4.17.14:
369
- version "4.17.23"
370
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a"
371
- integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==
369
+ version "4.18.1"
370
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c"
371
+ integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==
372
372
 
373
373
  lru-queue@0.1:
374
374
  version "0.1.0"
@@ -71,8 +71,8 @@ module Dependabot
71
71
  ).returns(String)
72
72
  end
73
73
  def replace_version_in_content(content:, dependency:, old_requirement:, new_requirement:)
74
- old_version = T.must(old_requirement.requirement)
75
- new_version = T.must(new_requirement.requirement)
74
+ old_version = string_requirement(old_requirement)
75
+ new_version = string_requirement(new_requirement)
76
76
 
77
77
  pattern = build_replacement_pattern(
78
78
  dependency_name: dependency.name,
@@ -87,6 +87,14 @@ module Dependabot
87
87
  content.gsub(pattern, replacement)
88
88
  end
89
89
 
90
+ sig { params(requirement: Dependabot::DependencyRequirement).returns(String) }
91
+ def string_requirement(requirement)
92
+ value = requirement.requirement
93
+ return value if value.is_a?(String)
94
+
95
+ raise TypeError, "pnpm workspace requirement must be a string"
96
+ end
97
+
90
98
  sig { params(dependency_name: String, version: String).returns(Regexp) }
91
99
  def build_replacement_pattern(dependency_name:, version:)
92
100
  /(["']?)#{dependency_name}\1:\s*(["']?)#{Regexp.escape(version)}\2/
@@ -504,11 +504,11 @@ module Dependabot
504
504
  def self.package_manager_install(name, version, env: {})
505
505
  return "Corepack does not support #{name}" unless corepack_supported_package_manager?(name)
506
506
 
507
- Dependabot::SharedHelpers.run_shell_command(
507
+ run_corepack_command(
508
508
  "corepack install #{name}@#{version} --global --cache-only",
509
509
  fingerprint: "corepack install <name>@<version> --global --cache-only",
510
510
  env: env
511
- ).strip
511
+ )
512
512
  end
513
513
 
514
514
  # Prepare the package manager for use by using corepack
@@ -516,11 +516,11 @@ module Dependabot
516
516
  def self.package_manager_activate(name, version, env: {})
517
517
  return "Corepack does not support #{name}" unless corepack_supported_package_manager?(name)
518
518
 
519
- Dependabot::SharedHelpers.run_shell_command(
519
+ run_corepack_command(
520
520
  "corepack prepare #{name}@#{version} --activate",
521
521
  fingerprint: "corepack prepare <name>@<version> --activate",
522
522
  env: env
523
- ).strip
523
+ )
524
524
  end
525
525
 
526
526
  # Fetch the currently installed version of the package manager directly
@@ -565,12 +565,30 @@ module Dependabot
565
565
  output_observer: nil,
566
566
  env: nil
567
567
  )
568
- full_command = T.let("corepack #{name} #{command}", String)
569
- command_fingerprint = T.let("corepack #{name} #{fingerprint || command}", String)
568
+ run_corepack_command(
569
+ "corepack #{name} #{command}",
570
+ fingerprint: "corepack #{name} #{fingerprint || command}",
571
+ output_observer: output_observer,
572
+ env: env
573
+ )
574
+ end
570
575
 
576
+ # Run a corepack shell command, retrying once with signature verification
577
+ # disabled when a configured private registry strips `dist.signatures`
578
+ # from its version endpoint (a known Artifactory behaviour that otherwise
579
+ # aborts the run with COREPACK_SIGNATURE_METADATA_ERROR).
580
+ sig do
581
+ params(
582
+ full_command: String,
583
+ fingerprint: String,
584
+ output_observer: CommandHelpers::OutputObserver,
585
+ env: T.nilable(T::Hash[String, String])
586
+ ).returns(String)
587
+ end
588
+ def self.run_corepack_command(full_command, fingerprint:, output_observer: nil, env: nil)
571
589
  run_corepack_shell_command(
572
590
  full_command,
573
- fingerprint: command_fingerprint,
591
+ fingerprint: fingerprint,
574
592
  output_observer: output_observer,
575
593
  env: env
576
594
  )
@@ -587,8 +605,8 @@ module Dependabot
587
605
  )
588
606
 
589
607
  return run_corepack_shell_command(
590
- T.must(full_command),
591
- fingerprint: T.must(command_fingerprint),
608
+ full_command,
609
+ fingerprint: fingerprint,
592
610
  output_observer: output_observer,
593
611
  env: retry_env
594
612
  )
@@ -271,23 +271,31 @@ module Dependabot
271
271
  blockers = audit_result["blocking_dependencies"]
272
272
  return generic_fix_unavailable_message(dependency) if blockers.nil? || blockers.empty?
273
273
 
274
- conflicts = blockers.map do |blocker|
275
- blocker_name = blocker["name"]
276
- blocker_version = blocker["version"]
277
- blocker_requirement = blocker["requirement"]
278
- detail = "#{blocker_name}@#{blocker_version} requires " \
279
- "#{dependency.name}@#{blocker_requirement}"
280
- ancestor = blocker["top_level_ancestor"]
281
-
282
- detail += " (pulled in via #{ancestor})" if ancestor && ancestor != blocker_name
283
- detail
284
- end.join("; ")
285
-
286
- "#{dependency.name} can't be updated to a non-vulnerable version because the npm helper identified parent " \
287
- "package constraints in the dependency tree that still require a vulnerable version: #{conflicts}. To " \
288
- "resolve this, update the parent " \
289
- "package(s) listed above to a release that allows a non-vulnerable #{dependency.name}, or add an " \
290
- "override/resolution pinning #{dependency.name} to a non-vulnerable version."
274
+ # Group by the top-level dependency a customer would actually need to act on, rather than
275
+ # listing one line per (parent, version, requirement) tuple. A single top-level package
276
+ # (e.g. jest) commonly pulls in the vulnerable dependency via several different parents/
277
+ # versions, and repeating each of those separately buries the actionable information.
278
+ grouped_by_ancestor = blockers.group_by { |blocker| blocker["top_level_ancestor"] }
279
+
280
+ ancestor_lines = grouped_by_ancestor.sort.map do |ancestor, group|
281
+ requirements = group.map do |blocker|
282
+ blocker_name = blocker["name"]
283
+ detail = "#{dependency.name}@#{blocker['requirement']}"
284
+ detail += " (via #{blocker_name}@#{blocker['version']})" if blocker_name != ancestor
285
+ detail
286
+ end.uniq.join(" and ")
287
+
288
+ " - #{ancestor}: requires #{requirements}"
289
+ end.join("\n")
290
+
291
+ ancestors = grouped_by_ancestor.keys.sort.join(", ")
292
+
293
+ "#{dependency.name} can't be automatically updated to a non-vulnerable version. The following " \
294
+ "top-level dependencies still require a vulnerable #{dependency.name} and need to be updated:\n" \
295
+ "#{ancestor_lines}\n\n" \
296
+ "To resolve this, update #{ancestors} to a release that depends on a non-vulnerable " \
297
+ "#{dependency.name}, or add an override/resolution pinning #{dependency.name} to a non-vulnerable " \
298
+ "version."
291
299
  end
292
300
 
293
301
  sig { params(dependency: Dependabot::Dependency).returns(String) }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-npm_and_yarn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.387.0
4
+ version: 0.388.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.387.0
18
+ version: 0.388.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.387.0
25
+ version: 0.388.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -381,7 +381,7 @@ licenses:
381
381
  - MIT
382
382
  metadata:
383
383
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
384
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.387.0
384
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.388.0
385
385
  rdoc_options: []
386
386
  require_paths:
387
387
  - lib