dependabot-bun 0.395.0 → 0.397.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: '0648b7baf73e363870c4861430535dc9f35abf4152baa7d8c7005a8c24a0db17'
4
- data.tar.gz: 4fc09e11fbebaf9dd3ca41200fc727b6b01e5bfff5533922bd6965cd3e83c6aa
3
+ metadata.gz: 7b2b3b0451e9df5a0b011f86aa2350c9dfc0e8144ced6556d1425d4a081af8f3
4
+ data.tar.gz: 17a5e6489722676fb3b8939e8f3ce6eddb8f8a3e5afb0738edc7d11cdaab3a16
5
5
  SHA512:
6
- metadata.gz: 254c7ce06535deeef02648b0620e3f199a538e934bd1ce24cbd8c454cfe33fb8dcfb1efe8f14ead0d6d208e85505235e3706c9e1da06a925bdd1022e3dc1da1e
7
- data.tar.gz: 5ff486306f46d916352f1daa4d0a7288861e84b2dba0b27b614a0beaf07345f78852b2f3c4a6bcce41aa257b60b1cb96aa62e6d735026be411b44596b25bedde
6
+ metadata.gz: 0e2b0630b65dd996e8099e5d3600fe082fd6f589d2588960ed94df6ded3c180fba7b32b242e3ba07b85fab5f86c581fa25a7238c62d5191e989e6b6bc72de05f
7
+ data.tar.gz: 33400c832cc9a40a7ca79dde6354eab961e3515194d245e93d7fd2e5909c7b13853f6e3cfc28bb2ff6d76af674eb832b5e43d782f792105f8561cfd43a99bb42
@@ -836,10 +836,21 @@
836
836
  }
837
837
  },
838
838
  "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
839
- "version": "4.1.0",
840
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
841
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
839
+ "version": "4.3.2",
840
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
841
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
842
842
  "dev": true,
843
+ "funding": [
844
+ {
845
+ "type": "github",
846
+ "url": "https://github.com/sponsors/puzrin"
847
+ },
848
+ {
849
+ "type": "github",
850
+ "url": "https://github.com/sponsors/nodeca"
851
+ }
852
+ ],
853
+ "license": "MIT",
843
854
  "dependencies": {
844
855
  "argparse": "^2.0.1"
845
856
  },
@@ -3632,6 +3643,19 @@
3632
3643
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
3633
3644
  "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
3634
3645
  },
3646
+ "node_modules/baseline-browser-mapping": {
3647
+ "version": "2.11.23",
3648
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.23.tgz",
3649
+ "integrity": "sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==",
3650
+ "dev": true,
3651
+ "license": "Apache-2.0",
3652
+ "bin": {
3653
+ "baseline-browser-mapping": "dist/cli.cjs"
3654
+ },
3655
+ "engines": {
3656
+ "node": ">=6.0.0"
3657
+ }
3658
+ },
3635
3659
  "node_modules/bcrypt-pbkdf": {
3636
3660
  "version": "1.0.2",
3637
3661
  "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -3760,9 +3784,9 @@
3760
3784
  }
3761
3785
  },
3762
3786
  "node_modules/browserslist": {
3763
- "version": "4.22.1",
3764
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
3765
- "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
3787
+ "version": "4.28.9",
3788
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz",
3789
+ "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==",
3766
3790
  "dev": true,
3767
3791
  "funding": [
3768
3792
  {
@@ -3778,11 +3802,13 @@
3778
3802
  "url": "https://github.com/sponsors/ai"
3779
3803
  }
3780
3804
  ],
3805
+ "license": "MIT",
3781
3806
  "dependencies": {
3782
- "caniuse-lite": "^1.0.30001541",
3783
- "electron-to-chromium": "^1.4.535",
3784
- "node-releases": "^2.0.13",
3785
- "update-browserslist-db": "^1.0.13"
3807
+ "baseline-browser-mapping": "^2.11.20",
3808
+ "caniuse-lite": "^1.0.30001810",
3809
+ "electron-to-chromium": "^1.5.420",
3810
+ "node-releases": "^2.0.54",
3811
+ "update-browserslist-db": "^1.3.2"
3786
3812
  },
3787
3813
  "bin": {
3788
3814
  "browserslist": "cli.js"
@@ -3944,9 +3970,9 @@
3944
3970
  }
3945
3971
  },
3946
3972
  "node_modules/caniuse-lite": {
3947
- "version": "1.0.30001546",
3948
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz",
3949
- "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==",
3973
+ "version": "1.0.30001810",
3974
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
3975
+ "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
3950
3976
  "dev": true,
3951
3977
  "funding": [
3952
3978
  {
@@ -3961,7 +3987,8 @@
3961
3987
  "type": "github",
3962
3988
  "url": "https://github.com/sponsors/ai"
3963
3989
  }
3964
- ]
3990
+ ],
3991
+ "license": "CC-BY-4.0"
3965
3992
  },
3966
3993
  "node_modules/caseless": {
3967
3994
  "version": "0.12.0",
@@ -4505,10 +4532,11 @@
4505
4532
  }
4506
4533
  },
4507
4534
  "node_modules/electron-to-chromium": {
4508
- "version": "1.4.544",
4509
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz",
4510
- "integrity": "sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==",
4511
- "dev": true
4535
+ "version": "1.5.427",
4536
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.427.tgz",
4537
+ "integrity": "sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==",
4538
+ "dev": true,
4539
+ "license": "ISC"
4512
4540
  },
4513
4541
  "node_modules/emittery": {
4514
4542
  "version": "0.13.1",
@@ -4587,10 +4615,11 @@
4587
4615
  }
4588
4616
  },
4589
4617
  "node_modules/escalade": {
4590
- "version": "3.1.1",
4591
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
4592
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
4618
+ "version": "3.2.0",
4619
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
4620
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
4593
4621
  "dev": true,
4622
+ "license": "MIT",
4594
4623
  "engines": {
4595
4624
  "node": ">=6"
4596
4625
  }
@@ -8141,9 +8170,10 @@
8141
8170
  "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
8142
8171
  },
8143
8172
  "node_modules/js-yaml": {
8144
- "version": "3.14.1",
8145
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
8146
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
8173
+ "version": "3.15.2",
8174
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz",
8175
+ "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==",
8176
+ "license": "MIT",
8147
8177
  "dependencies": {
8148
8178
  "argparse": "^1.0.7",
8149
8179
  "esprima": "^4.0.0"
@@ -9242,10 +9272,14 @@
9242
9272
  "dev": true
9243
9273
  },
9244
9274
  "node_modules/node-releases": {
9245
- "version": "2.0.13",
9246
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
9247
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
9248
- "dev": true
9275
+ "version": "2.0.55",
9276
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz",
9277
+ "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==",
9278
+ "dev": true,
9279
+ "license": "MIT",
9280
+ "engines": {
9281
+ "node": ">=18"
9282
+ }
9249
9283
  },
9250
9284
  "node_modules/nopt": {
9251
9285
  "version": "8.0.0",
@@ -14483,10 +14517,11 @@
14483
14517
  "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
14484
14518
  },
14485
14519
  "node_modules/picocolors": {
14486
- "version": "1.0.0",
14487
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
14488
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
14489
- "dev": true
14520
+ "version": "1.1.1",
14521
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
14522
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
14523
+ "dev": true,
14524
+ "license": "ISC"
14490
14525
  },
14491
14526
  "node_modules/picomatch": {
14492
14527
  "version": "2.3.1",
@@ -15937,9 +15972,9 @@
15937
15972
  }
15938
15973
  },
15939
15974
  "node_modules/update-browserslist-db": {
15940
- "version": "1.0.13",
15941
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
15942
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
15975
+ "version": "1.3.3",
15976
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz",
15977
+ "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==",
15943
15978
  "dev": true,
15944
15979
  "funding": [
15945
15980
  {
@@ -15955,9 +15990,10 @@
15955
15990
  "url": "https://github.com/sponsors/ai"
15956
15991
  }
15957
15992
  ],
15993
+ "license": "MIT",
15958
15994
  "dependencies": {
15959
- "escalade": "^3.1.1",
15960
- "picocolors": "^1.0.0"
15995
+ "escalade": "^3.2.0",
15996
+ "picocolors": "^1.1.1"
15961
15997
  },
15962
15998
  "bin": {
15963
15999
  "update-browserslist-db": "cli.js"
@@ -16979,9 +17015,9 @@
16979
17015
  "dev": true
16980
17016
  },
16981
17017
  "js-yaml": {
16982
- "version": "4.1.0",
16983
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
16984
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
17018
+ "version": "4.3.2",
17019
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz",
17020
+ "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==",
16985
17021
  "dev": true,
16986
17022
  "requires": {
16987
17023
  "argparse": "^2.0.1"
@@ -19052,6 +19088,12 @@
19052
19088
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
19053
19089
  "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
19054
19090
  },
19091
+ "baseline-browser-mapping": {
19092
+ "version": "2.11.23",
19093
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.23.tgz",
19094
+ "integrity": "sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==",
19095
+ "dev": true
19096
+ },
19055
19097
  "bcrypt-pbkdf": {
19056
19098
  "version": "1.0.2",
19057
19099
  "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -19163,15 +19205,16 @@
19163
19205
  }
19164
19206
  },
19165
19207
  "browserslist": {
19166
- "version": "4.22.1",
19167
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
19168
- "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
19208
+ "version": "4.28.9",
19209
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz",
19210
+ "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==",
19169
19211
  "dev": true,
19170
19212
  "requires": {
19171
- "caniuse-lite": "^1.0.30001541",
19172
- "electron-to-chromium": "^1.4.535",
19173
- "node-releases": "^2.0.13",
19174
- "update-browserslist-db": "^1.0.13"
19213
+ "baseline-browser-mapping": "^2.11.20",
19214
+ "caniuse-lite": "^1.0.30001810",
19215
+ "electron-to-chromium": "^1.5.420",
19216
+ "node-releases": "^2.0.54",
19217
+ "update-browserslist-db": "^1.3.2"
19175
19218
  }
19176
19219
  },
19177
19220
  "bser": {
@@ -19296,9 +19339,9 @@
19296
19339
  "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
19297
19340
  },
19298
19341
  "caniuse-lite": {
19299
- "version": "1.0.30001546",
19300
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz",
19301
- "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==",
19342
+ "version": "1.0.30001810",
19343
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
19344
+ "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
19302
19345
  "dev": true
19303
19346
  },
19304
19347
  "caseless": {
@@ -19718,9 +19761,9 @@
19718
19761
  }
19719
19762
  },
19720
19763
  "electron-to-chromium": {
19721
- "version": "1.4.544",
19722
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz",
19723
- "integrity": "sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==",
19764
+ "version": "1.5.427",
19765
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.427.tgz",
19766
+ "integrity": "sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==",
19724
19767
  "dev": true
19725
19768
  },
19726
19769
  "emittery": {
@@ -19787,9 +19830,9 @@
19787
19830
  }
19788
19831
  },
19789
19832
  "escalade": {
19790
- "version": "3.1.1",
19791
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
19792
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
19833
+ "version": "3.2.0",
19834
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
19835
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
19793
19836
  "dev": true
19794
19837
  },
19795
19838
  "escape-string-regexp": {
@@ -22388,9 +22431,9 @@
22388
22431
  "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
22389
22432
  },
22390
22433
  "js-yaml": {
22391
- "version": "3.14.1",
22392
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
22393
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
22434
+ "version": "3.15.2",
22435
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz",
22436
+ "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==",
22394
22437
  "requires": {
22395
22438
  "argparse": "^1.0.7",
22396
22439
  "esprima": "^4.0.0"
@@ -23242,9 +23285,9 @@
23242
23285
  "dev": true
23243
23286
  },
23244
23287
  "node-releases": {
23245
- "version": "2.0.13",
23246
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
23247
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
23288
+ "version": "2.0.55",
23289
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz",
23290
+ "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==",
23248
23291
  "dev": true
23249
23292
  },
23250
23293
  "nopt": {
@@ -27123,9 +27166,9 @@
27123
27166
  "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
27124
27167
  },
27125
27168
  "picocolors": {
27126
- "version": "1.0.0",
27127
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
27128
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
27169
+ "version": "1.1.1",
27170
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
27171
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
27129
27172
  "dev": true
27130
27173
  },
27131
27174
  "picomatch": {
@@ -28229,13 +28272,13 @@
28229
28272
  "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
28230
28273
  },
28231
28274
  "update-browserslist-db": {
28232
- "version": "1.0.13",
28233
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
28234
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
28275
+ "version": "1.3.3",
28276
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz",
28277
+ "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==",
28235
28278
  "dev": true,
28236
28279
  "requires": {
28237
- "escalade": "^3.1.1",
28238
- "picocolors": "^1.0.0"
28280
+ "escalade": "^3.2.0",
28281
+ "picocolors": "^1.1.1"
28239
28282
  }
28240
28283
  },
28241
28284
  "uri-js": {
@@ -1,7 +1,8 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "dependabot/utils"
5
+ require "dependabot/package/npm_package_json"
5
6
  require "dependabot/bun/file_parser/lockfile_parser"
6
7
  require "sorbet-runtime"
7
8
 
@@ -87,7 +88,7 @@ module Dependabot
87
88
  def workspaces_lockfile?(lockfile)
88
89
  return false unless ["yarn.lock", "package-lock.json", "pnpm-lock.yaml", "bun.lock"].include?(lockfile.name)
89
90
 
90
- return false unless parsed_root_package_json["workspaces"] || dependency_files.any? do |file|
91
+ return false unless root_package_json_document.workspaces? || dependency_files.any? do |file|
91
92
  file.name.end_with?("pnpm-workspace.yaml") && File.dirname(file.name) == File.dirname(lockfile.name)
92
93
  end
93
94
 
@@ -114,14 +115,14 @@ module Dependabot
114
115
  )
115
116
  end
116
117
 
117
- sig { returns(T::Hash[String, T.untyped]) }
118
- def parsed_root_package_json
119
- @parsed_root_package_json ||= T.let(
118
+ sig { returns(Dependabot::Package::NpmPackageJson) }
119
+ def root_package_json_document
120
+ @root_package_json_document ||= T.let(
120
121
  begin
121
122
  package = T.must(dependency_files.find { |f| f.name == "package.json" })
122
- JSON.parse(T.must(package.content))
123
+ Dependabot::Package::NpmPackageJson.from_file(package)
123
124
  end,
124
- T.nilable(T::Hash[String, T.untyped])
125
+ T.nilable(Dependabot::Package::NpmPackageJson)
125
126
  )
126
127
  end
127
128
 
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
@@ -110,17 +110,15 @@ module Dependabot
110
110
  def fetch_package_relationships
111
111
  return {} unless lockfile
112
112
 
113
- parsed_lockfile = FileParser::BunLock.new(T.must(lockfile)).parsed
114
- packages = parsed_lockfile.fetch("packages", nil)
115
- return {} unless packages.is_a?(Hash)
113
+ packages = FileParser::BunLock.new(T.must(lockfile)).records
114
+ return {} unless packages
116
115
 
117
- # bun.lock entries are arrays: ["{name}@{version}", registry, {details}, integrity]
118
- packages.each_with_object({}) do |(_key, entry), rels|
119
- next unless entry.is_a?(Array) && entry.first.is_a?(String)
116
+ packages.each_with_object({}) do |(_key, record), rels|
117
+ next unless record.graph_compatible?
120
118
 
121
- parent_name = T.must(T.cast(entry.first, String).split(/(?<=\w)\@/).first)
122
- children = entry.dig(2, "dependencies")&.keys
123
- next unless children&.any?
119
+ parent_name = record.name
120
+ children = record.dependency_names
121
+ next if children.empty?
124
122
 
125
123
  rels[parent_name] = children
126
124
  end
@@ -0,0 +1,101 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/bun/file_parser/bun_lock"
6
+ require "dependabot/package/npm_lockfile_details"
7
+
8
+ module Dependabot
9
+ module Bun
10
+ class FileParser < Dependabot::FileParsers::Base
11
+ class BunLock
12
+ class Record
13
+ extend T::Sig
14
+
15
+ sig { params(data: Object, path: String, context: String).void }
16
+ def initialize(data, path:, context:)
17
+ @data = data
18
+ @path = path
19
+ @context = context
20
+ @entry = T.let(nil, T.nilable(T::Array[Object]))
21
+ end
22
+
23
+ sig { returns(T::Boolean) }
24
+ def graph_compatible?
25
+ data = @data
26
+ data.is_a?(Array) && T.cast(data.first, Object).is_a?(String)
27
+ end
28
+
29
+ sig { returns(String) }
30
+ def name
31
+ name = resolution_label.split(/(?<=\w)\@/).first
32
+ invalid!("#{@context}[0] must contain a package name") unless name
33
+
34
+ name
35
+ end
36
+
37
+ sig { returns(T.nilable(String)) }
38
+ def version
39
+ Version.semver_for(package_resolution)&.to_s
40
+ end
41
+
42
+ sig { returns(Dependabot::Package::NpmLockfileDetails) }
43
+ def lookup_details
44
+ semver = version
45
+ Dependabot::Package::NpmLockfileDetails.new(
46
+ version: semver,
47
+ resolution: semver ? nil : package_resolution
48
+ )
49
+ end
50
+
51
+ sig { returns(T::Array[String]) }
52
+ def dependency_names
53
+ details = entry[2]
54
+ return [] if details.nil?
55
+
56
+ invalid!("#{@context} details must be an object") unless details.is_a?(Hash)
57
+ dependencies = T.cast(details["dependencies"], Object)
58
+ return [] if dependencies.nil?
59
+
60
+ invalid!("#{@context}.dependencies must be an object") unless dependencies.is_a?(Hash)
61
+ dependencies.keys.map do |raw_name|
62
+ child = T.cast(raw_name, Object)
63
+ invalid!("#{@context}.dependencies keys must be strings") unless child.is_a?(String)
64
+
65
+ child
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ sig { returns(T::Array[Object]) }
72
+ def entry
73
+ return @entry if @entry
74
+
75
+ data = @data
76
+ invalid!("#{@context} must be an array") unless data.is_a?(Array)
77
+ @entry = data.map { |value| T.cast(value, Object) }
78
+ end
79
+
80
+ sig { returns(String) }
81
+ def resolution_label
82
+ label = entry.first
83
+ invalid!("#{@context}[0] must be a string") unless label.is_a?(String)
84
+
85
+ label
86
+ end
87
+
88
+ sig { returns(T.nilable(String)) }
89
+ def package_resolution
90
+ resolution_label.split(/(?<=\w)\@/)[1]
91
+ end
92
+
93
+ sig { params(message: String).returns(T.noreturn) }
94
+ def invalid!(message)
95
+ raise DependencyFileNotParseable.new(@path, "Invalid bun.lock file: #{message}")
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -1,8 +1,9 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "yaml"
5
5
  require "dependabot/errors"
6
+ require "dependabot/bun/file_parser"
6
7
  require "dependabot/bun/bun_package_manager"
7
8
  require "dependabot/bun/helpers"
8
9
  require "sorbet-runtime"
@@ -13,22 +14,19 @@ module Dependabot
13
14
  class BunLock
14
15
  extend T::Sig
15
16
 
17
+ require_relative "bun_lock/record"
18
+
16
19
  sig { params(dependency_file: DependencyFile).void }
17
20
  def initialize(dependency_file)
18
21
  @dependency_file = dependency_file
22
+ @parsed = T.let(nil, T.nilable(T::Hash[Object, Object]))
23
+ @records = T.let(nil, T.nilable(T::Hash[String, Record]))
19
24
  end
20
25
 
21
- sig { returns(T::Hash[String, T.untyped]) }
26
+ sig { returns(T::Hash[Object, Object]) }
22
27
  def parsed
23
28
  @parsed ||= begin
24
- content = begin
25
- # Since bun.lock is a JSONC file, which is a subset of YAML, we can use YAML to parse it
26
- YAML.load(T.must(@dependency_file.content))
27
- rescue Psych::SyntaxError => e
28
- raise_invalid!("malformed JSONC at line #{e.line}, column #{e.column}")
29
- end
30
- raise_invalid!("expected to be an object") unless content.is_a?(Hash)
31
-
29
+ content = parse_document
32
30
  version = content["lockfileVersion"]
33
31
  raise_invalid!("expected 'lockfileVersion' to be an integer") unless version.is_a?(Integer)
34
32
  raise_invalid!("expected 'lockfileVersion' to be >= 0") unless version >= 0
@@ -45,7 +43,23 @@ module Dependabot
45
43
  end
46
44
  end
47
45
 
48
- T.let(content, T.untyped)
46
+ content
47
+ end
48
+ end
49
+ private :parsed
50
+
51
+ sig { returns(T.nilable(T::Hash[String, Record])) }
52
+ def records
53
+ return @records if @records
54
+
55
+ packages = parsed["packages"]
56
+ return unless packages.is_a?(Hash)
57
+
58
+ @records = packages.to_h do |raw_key, value|
59
+ key = T.cast(raw_key, Object)
60
+ raise_invalid!("expected package keys to be strings") unless key.is_a?(String)
61
+
62
+ [key, Record.new(T.cast(value, Object), path: @dependency_file.path, context: "packages.#{key}")]
49
63
  end
50
64
  end
51
65
 
@@ -56,24 +70,19 @@ module Dependabot
56
70
  # bun.lock v0 format:
57
71
  # https://github.com/oven-sh/bun/blob/c130df6c589fdf28f9f3c7f23ed9901140bc9349/src/install/bun.lock.zig#L595-L605
58
72
 
59
- packages = parsed["packages"]
60
- raise_invalid!("expected 'packages' to be an object") unless packages.is_a?(Hash)
61
-
62
- packages.each do |key, details|
63
- raise_invalid!("expected 'packages.#{key}' to be an array") unless details.is_a?(Array)
73
+ packages = records
74
+ raise_invalid!("expected 'packages' to be an object") unless packages
64
75
 
65
- resolution = details.first
66
- raise_invalid!("expected 'packages.#{key}[0]' to be a string") unless resolution.is_a?(String)
67
-
68
- name, version = resolution.split(/(?<=\w)\@/)
76
+ packages.each_value do |record|
77
+ name = record.name
69
78
  next if name.empty?
70
79
 
71
- semver = Version.semver_for(version)
80
+ semver = record.version
72
81
  next unless semver
73
82
 
74
83
  dependency_set << Dependency.new(
75
84
  name: name,
76
- version: semver.to_s,
85
+ version: semver,
77
86
  package_manager: "bun",
78
87
  requirements: []
79
88
  )
@@ -83,33 +92,27 @@ module Dependabot
83
92
  end
84
93
 
85
94
  sig do
86
- params(dependency_name: String, requirement: T.untyped, _manifest_name: String)
87
- .returns(T.nilable(T::Hash[String, T.untyped]))
95
+ params(dependency_name: String, _requirement: T.nilable(String), _manifest_name: String)
96
+ .returns(T.nilable(Dependabot::Package::NpmLockfileDetails))
88
97
  end
89
- def details(dependency_name, requirement, _manifest_name)
90
- packages = parsed["packages"]
91
- return unless packages.is_a?(Hash)
92
-
93
- candidates =
94
- packages
95
- .select { |name, _| name == dependency_name }
96
- .values
97
-
98
- # If there's only one entry for this dependency, use it, even if
99
- # the requirement in the lockfile doesn't match
100
- if candidates.one?
101
- parse_details(candidates.first)
102
- else
103
- candidate = candidates.find do |label, _|
104
- label.scan(/(?<=\w)\@(?:npm:)?([^\s,]+)/).flatten.include?(requirement)
105
- end&.last
106
- parse_details(candidate)
107
- end
98
+ def details(dependency_name, _requirement, _manifest_name)
99
+ records&.[](dependency_name)&.lookup_details
108
100
  end
109
101
 
110
102
  private
111
103
 
112
- sig { params(message: String).void }
104
+ sig { returns(T::Hash[Object, Object]) }
105
+ def parse_document
106
+ # Since bun.lock is a JSONC file, which is a subset of YAML, we can use YAML to parse it
107
+ content = T.cast(YAML.load(T.must(@dependency_file.content)), Object)
108
+ raise_invalid!("expected to be an object") unless content.is_a?(Hash)
109
+
110
+ content.to_h { |key, value| [T.cast(key, Object), T.cast(value, Object)] }
111
+ rescue Psych::SyntaxError => e
112
+ raise_invalid!("malformed JSONC at line #{e.line}, column #{e.column}")
113
+ end
114
+
115
+ sig { params(message: String).returns(T.noreturn) }
113
116
  def raise_invalid!(message)
114
117
  raise Dependabot::DependencyFileNotParseable.new(@dependency_file.path, "Invalid bun.lock file: #{message}")
115
118
  end
@@ -124,40 +127,6 @@ module Dependabot
124
127
  "The bun version Dependabot runs supports up to " \
125
128
  "#{BunPackageManager::MAX_SUPPORTED_LOCKFILE_VERSION}."
126
129
  end
127
-
128
- sig do
129
- params(entry: T.nilable(T::Array[T.untyped])).returns(T.nilable(T::Hash[String, T.untyped]))
130
- end
131
- def parse_details(entry)
132
- return unless entry.is_a?(Array)
133
-
134
- # Either:
135
- # - "{name}@{version}", registry, details, integrity
136
- # - "{name}@{resolution}", details
137
- resolution = entry.first
138
- return unless resolution.is_a?(String)
139
-
140
- name, version = resolution.split(/(?<=\w)\@/)
141
- semver = Version.semver_for(version)
142
-
143
- if semver
144
- registry, details, integrity = entry[1..3]
145
- {
146
- "name" => name,
147
- "version" => semver.to_s,
148
- "registry" => registry,
149
- "details" => details,
150
- "integrity" => integrity
151
- }
152
- else
153
- details = entry[1]
154
- {
155
- "name" => name,
156
- "resolution" => version,
157
- "details" => details
158
- }
159
- end
160
- end
161
130
  end
162
131
  end
163
132
  end
@@ -4,6 +4,7 @@
4
4
  require "dependabot/dependency_file"
5
5
  require "dependabot/bun/file_parser"
6
6
  require "dependabot/bun/helpers"
7
+ require "dependabot/package/npm_lockfile_details"
7
8
  require "sorbet-runtime"
8
9
 
9
10
  module Dependabot
@@ -45,10 +46,10 @@ module Dependabot
45
46
 
46
47
  sig do
47
48
  params(dependency_name: String, requirement: T.nilable(String), manifest_name: String)
48
- .returns(T.nilable(T::Hash[String, T.untyped]))
49
+ .returns(T.nilable(Dependabot::Package::NpmLockfileDetails))
49
50
  end
50
51
  def lockfile_details(dependency_name:, requirement:, manifest_name:)
51
- details = T.let(nil, T.nilable(T::Hash[String, T.untyped]))
52
+ details = T.let(nil, T.nilable(Dependabot::Package::NpmLockfileDetails))
52
53
  potential_lockfiles_for_manifest(manifest_name).each do |lockfile|
53
54
  details = lockfile_for(lockfile).details(dependency_name, requirement, manifest_name)
54
55
 
@@ -5,6 +5,8 @@
5
5
 
6
6
  require "cgi/escape"
7
7
  require "dependabot/dependency"
8
+ require "dependabot/package/npm_lockfile_details"
9
+ require "dependabot/package/npm_package_json"
8
10
  require "dependabot/file_parsers"
9
11
  require "dependabot/file_parsers/base"
10
12
  require "dependabot/shared_helpers"
@@ -28,6 +30,7 @@ module Dependabot
28
30
  require_relative "file_parser/lockfile_parser"
29
31
 
30
32
  DEPENDENCY_TYPES = %w(dependencies devDependencies optionalDependencies).freeze
33
+ ALIAS_PROTOCOL = "npm:"
31
34
  GIT_URL_REGEX = %r{
32
35
  (?<git_prefix>^|^git.*?|^github:|^bitbucket:|^gitlab:|github\.com/)
33
36
  (?<username>[a-z0-9-]+)/
@@ -98,7 +101,7 @@ module Dependabot
98
101
  def package_manager_helper
99
102
  @package_manager_helper ||= T.let(
100
103
  PackageManagerHelper.new(
101
- Dependabot::Package::NpmPackageManagerConfig.from_package_json(parsed_package_json),
104
+ package_json_document.package_manager_config,
102
105
  lockfiles,
103
106
  registry_config_files,
104
107
  credentials
@@ -121,9 +124,9 @@ module Dependabot
121
124
  }
122
125
  end
123
126
 
124
- sig { returns(T.untyped) }
125
- def parsed_package_json
126
- JSON.parse(T.must(package_json.content))
127
+ sig { returns(Dependabot::Package::NpmPackageJson) }
128
+ def package_json_document
129
+ Dependabot::Package::NpmPackageJson.from_file(package_json)
127
130
  rescue JSON::ParserError
128
131
  raise Dependabot::DependencyFileNotParseable, package_json.path
129
132
  end
@@ -162,16 +165,14 @@ module Dependabot
162
165
  dependency_set = DependencySet.new
163
166
 
164
167
  package_files.each do |file|
165
- json = JSON.parse(T.must(file.content))
168
+ manifest = Dependabot::Package::NpmPackageJson.from_file(file)
166
169
 
167
170
  # TODO: Currently, Dependabot can't handle flat dependency files
168
171
  # (and will error at the FileUpdater stage, because the
169
172
  # UpdateChecker doesn't take account of flat resolution).
170
- next if json["flat"]
171
-
172
- self.class.each_dependency(json) do |name, requirement, type|
173
- next unless requirement.is_a?(String)
173
+ next if manifest.flat?
174
174
 
175
+ manifest.each_dependency do |name, requirement, type|
175
176
  # Skip dependencies using Yarn workspace cross-references as requirements
176
177
  next if requirement.start_with?("workspace:", "catalog:")
177
178
 
@@ -202,7 +203,7 @@ module Dependabot
202
203
  end
203
204
 
204
205
  sig do
205
- params(file: DependencyFile, type: T.untyped, name: String, requirement: String)
206
+ params(file: DependencyFile, type: String, name: String, requirement: String)
206
207
  .returns(T.nilable(Dependency))
207
208
  end
208
209
  def build_dependency(file:, type:, name:, requirement:)
@@ -274,7 +275,7 @@ module Dependabot
274
275
 
275
276
  sig { params(requirement: String).returns(T::Boolean) }
276
277
  def alias_package?(requirement)
277
- requirement.start_with?("#{BunPackageManager::NAME}:")
278
+ requirement.start_with?(ALIAS_PROTOCOL)
278
279
  end
279
280
 
280
281
  sig { params(requirement: String).returns(T::Boolean) }
@@ -296,21 +297,21 @@ module Dependabot
296
297
 
297
298
  sig { params(name: String).returns(T::Boolean) }
298
299
  def aliased_package_name?(name)
299
- name.include?("@#{BunPackageManager::NAME}:")
300
+ name.include?("@#{ALIAS_PROTOCOL}")
300
301
  end
301
302
 
302
303
  sig { returns(T::Array[String]) }
303
304
  def workspace_package_names
304
305
  @workspace_package_names ||= T.let(
305
306
  package_files.filter_map do |f|
306
- JSON.parse(T.must(f.content))["name"]
307
+ Dependabot::Package::NpmPackageJson.from_file(f).name
307
308
  end,
308
309
  T.nilable(T::Array[String])
309
310
  )
310
311
  end
311
312
 
312
313
  sig do
313
- params(requirement: String, lockfile_details: T.nilable(T::Hash[String, T.untyped]))
314
+ params(requirement: String, lockfile_details: T.nilable(Dependabot::Package::NpmLockfileDetails))
314
315
  .returns(T.nilable(T.any(String, Integer, Gem::Version)))
315
316
  end
316
317
  def version_for(requirement, lockfile_details)
@@ -332,10 +333,10 @@ module Dependabot
332
333
  end
333
334
  end
334
335
 
335
- sig { params(lockfile_details: T.nilable(T::Hash[String, T.untyped])).returns(T.nilable(String)) }
336
+ sig { params(lockfile_details: T.nilable(Dependabot::Package::NpmLockfileDetails)).returns(T.nilable(String)) }
336
337
  def git_revision_for(lockfile_details)
337
- version = T.cast(lockfile_details&.fetch("version", nil), T.nilable(String))
338
- resolved = T.cast(lockfile_details&.fetch("resolved", nil), T.nilable(String))
338
+ version = lockfile_details&.version
339
+ resolved = lockfile_details&.resolved
339
340
  [
340
341
  version&.split("#")&.last,
341
342
  resolved&.split("#")&.last,
@@ -375,11 +376,11 @@ module Dependabot
375
376
  end
376
377
 
377
378
  sig do
378
- params(lockfile_details: T.nilable(T::Hash[String, T.untyped]))
379
+ params(lockfile_details: T.nilable(Dependabot::Package::NpmLockfileDetails))
379
380
  .returns(T.nilable(T.any(String, Integer, Gem::Version)))
380
381
  end
381
382
  def lockfile_version_for(lockfile_details)
382
- semver_version_for(lockfile_details&.fetch("version", ""))
383
+ semver_version_for(lockfile_details&.version)
383
384
  end
384
385
 
385
386
  sig { params(version: T.nilable(String)).returns(T.nilable(T.any(String, Integer, Gem::Version))) }
@@ -398,17 +399,17 @@ module Dependabot
398
399
  end
399
400
 
400
401
  sig do
401
- params(name: String, requirement: String, lockfile_details: T.nilable(T::Hash[String, T.untyped]))
402
+ params(name: String, requirement: String, lockfile_details: T.nilable(Dependabot::Package::NpmLockfileDetails))
402
403
  .returns(T.nilable(T::Hash[Symbol, T.untyped]))
403
404
  end
404
405
  def source_for(name, requirement, lockfile_details)
405
406
  return git_source_for(requirement) if git_url?(requirement)
406
407
 
407
- resolved_url = lockfile_details&.fetch("resolved", nil)
408
+ resolved_url = lockfile_details&.resolved
408
409
 
409
- resolution = lockfile_details&.fetch("resolution", nil)
410
- package_match = resolution&.match(/__archiveUrl=(?<package_url>.+)/)
411
- resolved_url = CGI.unescape(package_match.named_captures.fetch("package_url", "")) if package_match
410
+ resolution = lockfile_details&.resolution
411
+ package_url = resolution&.[](/__archiveUrl=(.+)/, 1)
412
+ resolved_url = CGI.unescape(package_url) if package_url
412
413
 
413
414
  return unless resolved_url
414
415
  return unless resolved_url.start_with?("http")
@@ -171,14 +171,6 @@ module Dependabot
171
171
  possible_releases
172
172
  end
173
173
 
174
- sig do
175
- params(filter_ignored: T::Boolean)
176
- .returns(T::Array[T::Array[T.untyped]])
177
- end
178
- def possible_versions_with_details(filter_ignored: true)
179
- possible_releases(filter_ignored: filter_ignored).map { |r| [r.version, r.details] }
180
- end
181
-
182
174
  sig do
183
175
  params(releases: T::Array[Dependabot::Package::PackageRelease])
184
176
  .returns(T::Array[Dependabot::Package::PackageRelease])
@@ -242,13 +234,6 @@ module Dependabot
242
234
  .sort_by(&:version).reverse
243
235
  end
244
236
 
245
- sig { returns(T::Array[[Dependabot::Version, T::Hash[String, T.anything]]]) }
246
- def possible_previous_versions_with_details
247
- possible_previous_releases.map do |r|
248
- [r.version, r.details]
249
- end
250
- end
251
-
252
237
  sig { override.returns(T::Boolean) }
253
238
  def cooldown_enabled?
254
239
  true
@@ -1,4 +1,4 @@
1
- # typed: strict
1
+ # typed: strong
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
@@ -6,6 +6,7 @@ require "sorbet-runtime"
6
6
  require "dependabot/errors"
7
7
  require "dependabot/git_commit_checker"
8
8
  require "dependabot/logger"
9
+ require "dependabot/package/npm_registry_package"
9
10
  require "dependabot/bun/dependency_files_filterer"
10
11
  require "dependabot/bun/file_parser"
11
12
  require "dependabot/bun/file_updater/npmrc_builder"
@@ -17,6 +18,7 @@ require "dependabot/bun/requirement"
17
18
  require "dependabot/bun/update_checker"
18
19
  require "dependabot/bun/version"
19
20
  require "dependabot/shared_helpers"
21
+ require "dependabot/update_checkers/peer_dependency_conflict"
20
22
 
21
23
  # rubocop:disable-next Metrics/ClassLength
22
24
  module Dependabot
@@ -27,6 +29,8 @@ module Dependabot
27
29
 
28
30
  require_relative "latest_version_finder"
29
31
 
32
+ PeerDependencyConflict = Dependabot::UpdateCheckers::PeerDependencyConflict
33
+
30
34
  TIGHTLY_COUPLED_MONOREPOS = T.let(
31
35
  {
32
36
  "vue" => %w(vue vue-template-compiler)
@@ -70,7 +74,7 @@ module Dependabot
70
74
  update_cooldown: T.nilable(Dependabot::Package::ReleaseCooldownOptions)
71
75
  ).void
72
76
  end
73
- def initialize( # rubocop:disable Metrics/AbcSize
77
+ def initialize(
74
78
  dependency:,
75
79
  dependency_files:,
76
80
  credentials:,
@@ -101,9 +105,9 @@ module Dependabot
101
105
  @paths_requiring_update_check = T.let(nil, T.nilable(T::Array[String]))
102
106
  @top_level_dependencies = T.let(nil, T.nilable(T::Array[Dependabot::Dependency]))
103
107
  @old_peer_dependency_errors = T.let(
104
- nil, T.nilable(T::Array[T.any(T::Hash[String, T.nilable(String)], String)])
108
+ nil, T.nilable(T::Array[PeerDependencyConflict])
105
109
  )
106
- @peer_dependency_errors = T.let(nil, T.nilable(T::Array[T.any(T::Hash[String, T.nilable(String)], String)]))
110
+ @peer_dependency_errors = T.let(nil, T.nilable(T::Array[PeerDependencyConflict]))
107
111
  end
108
112
 
109
113
  sig { returns(T.nilable(T.any(String, Gem::Version))) }
@@ -150,7 +154,7 @@ module Dependabot
150
154
  )
151
155
  }]
152
156
  newly_broken_peer_reqs_on_dep.each do |peer_req|
153
- dep_name = peer_req.fetch(:requiring_dep_name)
157
+ dep_name = peer_req.requiring_dep_name
154
158
  dep = top_level_dependencies.find { |d| d.name == dep_name }
155
159
 
156
160
  # Can't handle reqs from sub-deps or git source deps (yet)
@@ -226,8 +230,8 @@ module Dependabot
226
230
 
227
231
  @resolve_latest_previous_version[dep] ||= begin
228
232
  relevant_versions = latest_version_finder(dependency)
229
- .possible_previous_versions_with_details
230
- .map(&:first)
233
+ .possible_previous_releases
234
+ .map(&:version)
231
235
  reqs = dep.requirements.filter_map(&:requirement_string)
232
236
  .map { |r| requirement_class.requirements_array(r) }
233
237
 
@@ -388,7 +392,7 @@ module Dependabot
388
392
  }]
389
393
  end
390
394
 
391
- sig { returns(T::Array[T.any(T::Hash[String, T.nilable(String)], String)]) }
395
+ sig { returns(T::Array[PeerDependencyConflict]) }
392
396
  def peer_dependency_errors
393
397
  return @peer_dependency_errors if @peer_dependency_errors
394
398
 
@@ -396,7 +400,7 @@ module Dependabot
396
400
  @peer_dependency_errors
397
401
  end
398
402
 
399
- sig { returns(T::Array[T.any(T::Hash[String, T.nilable(String)], String)]) }
403
+ sig { returns(T::Array[PeerDependencyConflict]) }
400
404
  def old_peer_dependency_errors
401
405
  return @old_peer_dependency_errors if @old_peer_dependency_errors
402
406
 
@@ -409,7 +413,7 @@ module Dependabot
409
413
  sig do
410
414
  params(
411
415
  version: T.nilable(T.any(String, Gem::Version))
412
- ).returns(T::Array[T.any(T::Hash[String, T.nilable(String)], String)])
416
+ ).returns(T::Array[PeerDependencyConflict])
413
417
  end
414
418
  def fetch_peer_dependency_errors(version:)
415
419
  # TODO: Add all of the error handling that the FileUpdater does
@@ -421,7 +425,7 @@ module Dependabot
421
425
 
422
426
  paths_requiring_update_check.flat_map do |path|
423
427
  run_checker(path: path, version: version)
424
- end.compact
428
+ end
425
429
  end
426
430
  rescue SharedHelpers::HelperSubprocessFailed
427
431
  # Fall back to allowing the version through. Whatever error
@@ -430,12 +434,12 @@ module Dependabot
430
434
  []
431
435
  end
432
436
 
433
- sig { params(message: String).returns(T::Array[T::Hash[String, T.nilable(String)]]) }
437
+ sig { params(message: String).returns(T::Array[PeerDependencyConflict]) }
434
438
  def handle_peer_dependency_errors(message)
435
- errors = []
439
+ errors = T.let([], T::Array[T::Hash[String, T.nilable(String)]])
436
440
  if message.match?(NPM6_PEER_DEP_ERROR_REGEX)
437
441
  message.scan(NPM6_PEER_DEP_ERROR_REGEX) do
438
- errors << Regexp.last_match&.named_captures
442
+ errors << T.must(Regexp.last_match).named_captures
439
443
  end
440
444
  elsif message.match?(NPM8_PEER_DEP_ERROR_REGEX)
441
445
  message.scan(NPM8_PEER_DEP_ERROR_REGEX) do
@@ -444,45 +448,15 @@ module Dependabot
444
448
  else
445
449
  raise
446
450
  end
447
- errors
448
- end
449
-
450
- sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
451
- def unmet_peer_dependencies
452
- peer_dependency_errors
453
- .map { |captures| error_details_from_captures(captures) }
454
- end
455
-
456
- sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
457
- def old_unmet_peer_dependencies
458
- old_peer_dependency_errors
459
- .map { |captures| error_details_from_captures(captures) }
460
- end
461
-
462
- sig do
463
- params(captures: T.any(T::Hash[String, T.nilable(String)], String))
464
- .returns(T::Hash[Symbol, T.nilable(String)])
451
+ errors.filter_map { |captures| PeerDependencyConflict.from_captures(captures) }
465
452
  end
466
- def error_details_from_captures(captures)
467
- return {} unless captures.is_a?(Hash)
468
453
 
469
- required_dep_captures = captures.fetch("required_dep")
470
- requiring_dep_captures = captures.fetch("requiring_dep")
471
- return {} unless required_dep_captures && requiring_dep_captures
472
-
473
- {
474
- requirement_name: required_dep_captures.sub(/@[^@]+$/, ""),
475
- requirement_version: required_dep_captures.split("@").last&.delete('"'),
476
- requiring_dep_name: requiring_dep_captures.sub(/@[^@]+$/, "")
477
- }
478
- end
479
-
480
- sig { returns(T::Array[T::Hash[Symbol, T.nilable(String)]]) }
454
+ sig { returns(T::Array[PeerDependencyConflict]) }
481
455
  def relevant_unmet_peer_dependencies # rubocop:disable Metrics/PerceivedComplexity
482
456
  relevant_unmet_peer_dependencies =
483
- unmet_peer_dependencies.select do |dep|
484
- dep[:requirement_name] == dependency.name ||
485
- dep[:requiring_dep_name] == dependency.name
457
+ peer_dependency_errors.select do |dep|
458
+ dep.requirement_name == dependency.name ||
459
+ dep.requiring_dep_name == dependency.name
486
460
  end
487
461
 
488
462
  unless dependency_group.nil?
@@ -490,8 +464,8 @@ module Dependabot
490
464
  # the update is also updating those dependencies.
491
465
  relevant_unmet_peer_dependencies.reject! do |dep|
492
466
  dependency_group&.dependencies&.any? do |group_dep|
493
- dep[:requirement_name] == group_dep.name ||
494
- dep[:requiring_dep_name] == group_dep.name
467
+ dep.requirement_name == group_dep.name ||
468
+ dep.requiring_dep_name == group_dep.name
495
469
  end
496
470
  end
497
471
  end
@@ -500,10 +474,7 @@ module Dependabot
500
474
 
501
475
  # Prune out any pre-existing warnings
502
476
  relevant_unmet_peer_dependencies.reject do |issue|
503
- old_unmet_peer_dependencies.any? do |old_issue|
504
- old_issue.slice(:requirement_name, :requiring_dep_name) ==
505
- issue.slice(:requirement_name, :requiring_dep_name)
506
- end
477
+ old_peer_dependency_errors.any? { |old_issue| old_issue.same_dependencies?(issue) }
507
478
  end
508
479
  end
509
480
 
@@ -511,14 +482,18 @@ module Dependabot
511
482
  sig { returns(T::Array[T.any(String, Gem::Version)]) }
512
483
  def satisfying_versions
513
484
  latest_version_finder(dependency)
514
- .possible_versions_with_details
515
- .select do |versions_with_details|
516
- version, details = versions_with_details
485
+ .possible_releases
486
+ .select do |release|
487
+ version = release.version
517
488
  next false unless satisfies_peer_reqs_on_dep?(version)
518
- next true unless details["peerDependencies"]
519
489
  next true if version == version_for_dependency(dependency)
520
490
 
521
- details["peerDependencies"].all? do |dep, req|
491
+ peer_requirements = Dependabot::Package::NpmRegistryPackage.peer_dependencies(
492
+ details: release.details,
493
+ package_name: dependency.name,
494
+ version: version.to_s
495
+ )
496
+ peer_requirements.all? do |dep, req|
522
497
  dep = top_level_dependencies.find { |d| d.name == dep }
523
498
  next false unless dep
524
499
  next git_dependency?(dep) if req.include?("/")
@@ -530,11 +505,7 @@ module Dependabot
530
505
  rescue Gem::Requirement::BadRequirementError
531
506
  false
532
507
  end
533
- end.map do |versions_with_details| # rubocop:disable Style/MultilineBlockChain
534
- # Return just the version
535
- version, = versions_with_details
536
- version
537
- end
508
+ end.map(&:version)
538
509
  end
539
510
 
540
511
  # rubocop:enable Metrics/PerceivedComplexity
@@ -542,7 +513,7 @@ module Dependabot
542
513
  sig { params(version: T.nilable(T.any(String, Gem::Version))).returns(T::Boolean) }
543
514
  def satisfies_peer_reqs_on_dep?(version)
544
515
  newly_broken_peer_reqs_on_dep.all? do |peer_req|
545
- req = peer_req.fetch(:requirement_version)
516
+ req = peer_req.requirement_version
546
517
 
547
518
  # Git requirements can't be satisfied by a version
548
519
  next false if req&.include?("/")
@@ -555,18 +526,22 @@ module Dependabot
555
526
  end
556
527
 
557
528
  sig { params(dep: Dependabot::Dependency).returns(T.nilable(T.any(String, Gem::Version))) }
558
- def latest_version_of_dep_with_satisfied_peer_reqs(dep) # rubocop:disable Metrics/PerceivedComplexity
529
+ def latest_version_of_dep_with_satisfied_peer_reqs(dep)
559
530
  dependency_version = version_for_dependency(dep)
560
- version_with_detail =
531
+ release =
561
532
  latest_version_finder(dep)
562
- .possible_versions_with_details
563
- .find do |version_details|
564
- version, details = version_details
533
+ .possible_releases
534
+ .find do |candidate|
535
+ version = candidate.version
565
536
 
566
537
  next false unless !dependency_version || version > dependency_version
567
- next true unless details["peerDependencies"]
568
538
 
569
- details["peerDependencies"].all? do |peer_dep_name, req|
539
+ peer_requirements = Dependabot::Package::NpmRegistryPackage.peer_dependencies(
540
+ details: candidate.details,
541
+ package_name: dep.name,
542
+ version: version.to_s
543
+ )
544
+ peer_requirements.all? do |peer_dep_name, req|
570
545
  # Can't handle multiple peer dependencies
571
546
  next false unless peer_dep_name == dependency.name
572
547
  next git_dependency?(dependency) if req.include?("/")
@@ -578,7 +553,7 @@ module Dependabot
578
553
  false
579
554
  end
580
555
  end
581
- version_with_detail.is_a?(Array) ? version_with_detail.first : version_with_detail
556
+ release&.version
582
557
  end
583
558
 
584
559
  sig { params(dep: Dependabot::Dependency).returns(T::Boolean) }
@@ -589,16 +564,16 @@ module Dependabot
589
564
  .git_dependency?
590
565
  end
591
566
 
592
- sig { returns(T::Array[T::Hash[Symbol, T.nilable(String)]]) }
567
+ sig { returns(T::Array[PeerDependencyConflict]) }
593
568
  def newly_broken_peer_reqs_on_dep
594
569
  relevant_unmet_peer_dependencies
595
- .select { |dep| dep[:requirement_name] == dependency.name }
570
+ .select { |dep| dep.requirement_name == dependency.name }
596
571
  end
597
572
 
598
- sig { returns(T::Array[T::Hash[Symbol, T.nilable(String)]]) }
573
+ sig { returns(T::Array[PeerDependencyConflict]) }
599
574
  def newly_broken_peer_reqs_from_dep
600
575
  relevant_unmet_peer_dependencies
601
- .select { |dep| dep[:requiring_dep_name] == dependency.name }
576
+ .select { |dep| dep.requiring_dep_name == dependency.name }
602
577
  end
603
578
 
604
579
  sig do
@@ -617,14 +592,16 @@ module Dependabot
617
592
  params(
618
593
  path: String,
619
594
  version: T.nilable(T.any(String, Gem::Version))
620
- ).returns(T.nilable(T.any(T::Hash[String, T.untyped], String, T::Array[T::Hash[String, T.untyped]])))
595
+ ).returns(T::Array[PeerDependencyConflict])
621
596
  end
622
597
  def run_checker(path:, version:)
623
598
  bun_lockfiles = lockfiles_for_path(lockfiles: dependency_files_builder.bun_locks, path: path)
624
599
  return run_bun_checker(path: path, version: version) if bun_lockfiles.any?
625
600
 
626
601
  root_bun_lock = dependency_files_builder.root_bun_lock
627
- run_bun_checker(path: path, version: version) if root_bun_lock
602
+ return [] unless root_bun_lock
603
+
604
+ run_bun_checker(path: path, version: version)
628
605
  rescue SharedHelpers::HelperSubprocessFailed => e
629
606
  handle_peer_dependency_errors(e.message)
630
607
  end
@@ -633,7 +610,7 @@ module Dependabot
633
610
  params(
634
611
  path: String,
635
612
  version: T.nilable(T.any(String, Gem::Version))
636
- ).returns(T.untyped)
613
+ ).returns(T::Array[PeerDependencyConflict])
637
614
  end
638
615
  def run_bun_checker(path:, version:)
639
616
  SharedHelpers.with_git_configured(credentials: credentials) do
@@ -644,6 +621,7 @@ module Dependabot
644
621
  )
645
622
  end
646
623
  end
624
+ []
647
625
  end
648
626
 
649
627
  sig do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-bun
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.395.0
4
+ version: 0.397.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.395.0
18
+ version: 0.397.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.395.0
25
+ version: 0.397.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -319,6 +319,7 @@ files:
319
319
  - lib/dependabot/bun/file_fetcher/path_dependency_builder.rb
320
320
  - lib/dependabot/bun/file_parser.rb
321
321
  - lib/dependabot/bun/file_parser/bun_lock.rb
322
+ - lib/dependabot/bun/file_parser/bun_lock/record.rb
322
323
  - lib/dependabot/bun/file_parser/lockfile_parser.rb
323
324
  - lib/dependabot/bun/file_updater.rb
324
325
  - lib/dependabot/bun/file_updater/bun_lockfile_updater.rb
@@ -354,7 +355,7 @@ licenses:
354
355
  - MIT
355
356
  metadata:
356
357
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
357
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.395.0
358
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.397.0
358
359
  rdoc_options: []
359
360
  require_paths:
360
361
  - lib