dependabot-npm_and_yarn 0.289.0 → 0.291.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: 3b61a2e379cb066af66a91f9cbfd25d89755129946f7093b2e1d5be7f3642133
4
- data.tar.gz: 10995493f890b53c62af1c14f7d29a165ee32096b8b84a529f0822984d6f1480
3
+ metadata.gz: 02635cf238f21d329717cb8590e2c779109f30e53edb5a18d0af02c2eb1b7b52
4
+ data.tar.gz: 05a8982b1c132c4560dbde94a72575a7ba62d9e9b1b3e6524d2cbcb2042f3eae
5
5
  SHA512:
6
- metadata.gz: 3fb1619f2f8ba90e8bbe7945c7b1e179abd09004b940c1d2514d9f4290a7679955ad0fcc0db26ebcb4b810c5903e4d66ddb3f3d0b3ca0a265c9636f34f272519
7
- data.tar.gz: ae15d52f683156e2df0ddf213c254e0b9cd6e9324da8eda5367dae8d1c59629497739be437e3c76c6597ce9ccbbbd06509196ba9efad51240e3e98a9c99d91f4
6
+ metadata.gz: 69d8f7352749ea26e0aeee9ca63943fc6d46eccf927ec217fd9d5b072b60a405b5b7a4515c120e8e05145870ac1c0bc196c27ad38d4733c15e693af40d0055fa
7
+ data.tar.gz: e5f8ad4e72213b0620785369b37c6cbf4d2200eea2a2ec521df6f6240694527216da0450af39cb86b7d9650d4d04649d5fc3bb4136163574ae29f2a3dc6db539
@@ -12,7 +12,7 @@
12
12
  "@pnpm/dependency-path": "^5.1.1",
13
13
  "@pnpm/lockfile-file": "^9.1.2",
14
14
  "detect-indent": "^6.1.0",
15
- "nock": "^13.5.5",
15
+ "nock": "^13.5.6",
16
16
  "npm": "6.14.18",
17
17
  "patch-package": "^8.0.0",
18
18
  "semver": "^7.6.3"
@@ -21,10 +21,10 @@
21
21
  "helper": "run.js"
22
22
  },
23
23
  "devDependencies": {
24
- "eslint": "^9.14.0",
24
+ "eslint": "^9.16.0",
25
25
  "eslint-config-prettier": "^9.1.0",
26
26
  "jest": "^29.7.0",
27
- "prettier": "^3.3.3"
27
+ "prettier": "^3.4.2"
28
28
  }
29
29
  },
30
30
  "node_modules/@aashutoshrathi/word-wrap": {
@@ -732,12 +732,12 @@
732
732
  }
733
733
  },
734
734
  "node_modules/@eslint/config-array": {
735
- "version": "0.18.0",
736
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
737
- "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
735
+ "version": "0.19.1",
736
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
737
+ "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
738
738
  "dev": true,
739
739
  "dependencies": {
740
- "@eslint/object-schema": "^2.1.4",
740
+ "@eslint/object-schema": "^2.1.5",
741
741
  "debug": "^4.3.1",
742
742
  "minimatch": "^3.1.2"
743
743
  },
@@ -746,9 +746,9 @@
746
746
  }
747
747
  },
748
748
  "node_modules/@eslint/config-array/node_modules/debug": {
749
- "version": "4.3.7",
750
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
751
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
749
+ "version": "4.4.0",
750
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
751
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
752
752
  "dev": true,
753
753
  "dependencies": {
754
754
  "ms": "^2.1.3"
@@ -763,18 +763,21 @@
763
763
  }
764
764
  },
765
765
  "node_modules/@eslint/core": {
766
- "version": "0.7.0",
767
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
768
- "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
766
+ "version": "0.9.1",
767
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
768
+ "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
769
769
  "dev": true,
770
+ "dependencies": {
771
+ "@types/json-schema": "^7.0.15"
772
+ },
770
773
  "engines": {
771
774
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
772
775
  }
773
776
  },
774
777
  "node_modules/@eslint/eslintrc": {
775
- "version": "3.1.0",
776
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
777
- "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
778
+ "version": "3.2.0",
779
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
780
+ "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
778
781
  "dev": true,
779
782
  "dependencies": {
780
783
  "ajv": "^6.12.4",
@@ -801,12 +804,12 @@
801
804
  "dev": true
802
805
  },
803
806
  "node_modules/@eslint/eslintrc/node_modules/debug": {
804
- "version": "4.3.5",
805
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
806
- "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
807
+ "version": "4.4.0",
808
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
809
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
807
810
  "dev": true,
808
811
  "dependencies": {
809
- "ms": "2.1.2"
812
+ "ms": "^2.1.3"
810
813
  },
811
814
  "engines": {
812
815
  "node": ">=6.0"
@@ -829,34 +832,28 @@
829
832
  "js-yaml": "bin/js-yaml.js"
830
833
  }
831
834
  },
832
- "node_modules/@eslint/eslintrc/node_modules/ms": {
833
- "version": "2.1.2",
834
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
835
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
836
- "dev": true
837
- },
838
835
  "node_modules/@eslint/js": {
839
- "version": "9.14.0",
840
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz",
841
- "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==",
836
+ "version": "9.16.0",
837
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz",
838
+ "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==",
842
839
  "dev": true,
843
840
  "engines": {
844
841
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
845
842
  }
846
843
  },
847
844
  "node_modules/@eslint/object-schema": {
848
- "version": "2.1.4",
849
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
850
- "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
845
+ "version": "2.1.5",
846
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
847
+ "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
851
848
  "dev": true,
852
849
  "engines": {
853
850
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
854
851
  }
855
852
  },
856
853
  "node_modules/@eslint/plugin-kit": {
857
- "version": "0.2.0",
858
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz",
859
- "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==",
854
+ "version": "0.2.4",
855
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz",
856
+ "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==",
860
857
  "dev": true,
861
858
  "dependencies": {
862
859
  "levn": "^0.4.1"
@@ -914,9 +911,9 @@
914
911
  }
915
912
  },
916
913
  "node_modules/@humanwhocodes/retry": {
917
- "version": "0.4.0",
918
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.0.tgz",
919
- "integrity": "sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g==",
914
+ "version": "0.4.1",
915
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
916
+ "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
920
917
  "dev": true,
921
918
  "engines": {
922
919
  "node": ">=18.18"
@@ -4286,9 +4283,9 @@
4286
4283
  }
4287
4284
  },
4288
4285
  "node_modules/cross-spawn": {
4289
- "version": "7.0.3",
4290
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
4291
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
4286
+ "version": "7.0.6",
4287
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
4288
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
4292
4289
  "dependencies": {
4293
4290
  "path-key": "^3.1.0",
4294
4291
  "shebang-command": "^2.0.0",
@@ -4592,26 +4589,26 @@
4592
4589
  }
4593
4590
  },
4594
4591
  "node_modules/eslint": {
4595
- "version": "9.14.0",
4596
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz",
4597
- "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==",
4592
+ "version": "9.16.0",
4593
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz",
4594
+ "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==",
4598
4595
  "dev": true,
4599
4596
  "dependencies": {
4600
4597
  "@eslint-community/eslint-utils": "^4.2.0",
4601
4598
  "@eslint-community/regexpp": "^4.12.1",
4602
- "@eslint/config-array": "^0.18.0",
4603
- "@eslint/core": "^0.7.0",
4604
- "@eslint/eslintrc": "^3.1.0",
4605
- "@eslint/js": "9.14.0",
4606
- "@eslint/plugin-kit": "^0.2.0",
4599
+ "@eslint/config-array": "^0.19.0",
4600
+ "@eslint/core": "^0.9.0",
4601
+ "@eslint/eslintrc": "^3.2.0",
4602
+ "@eslint/js": "9.16.0",
4603
+ "@eslint/plugin-kit": "^0.2.3",
4607
4604
  "@humanfs/node": "^0.16.6",
4608
4605
  "@humanwhocodes/module-importer": "^1.0.1",
4609
- "@humanwhocodes/retry": "^0.4.0",
4606
+ "@humanwhocodes/retry": "^0.4.1",
4610
4607
  "@types/estree": "^1.0.6",
4611
4608
  "@types/json-schema": "^7.0.15",
4612
4609
  "ajv": "^6.12.4",
4613
4610
  "chalk": "^4.0.0",
4614
- "cross-spawn": "^7.0.2",
4611
+ "cross-spawn": "^7.0.5",
4615
4612
  "debug": "^4.3.2",
4616
4613
  "escape-string-regexp": "^4.0.0",
4617
4614
  "eslint-scope": "^8.2.0",
@@ -4630,8 +4627,7 @@
4630
4627
  "lodash.merge": "^4.6.2",
4631
4628
  "minimatch": "^3.1.2",
4632
4629
  "natural-compare": "^1.4.0",
4633
- "optionator": "^0.9.3",
4634
- "text-table": "^0.2.0"
4630
+ "optionator": "^0.9.3"
4635
4631
  },
4636
4632
  "bin": {
4637
4633
  "eslint": "bin/eslint.js"
@@ -5755,9 +5751,9 @@
5755
5751
  }
5756
5752
  },
5757
5753
  "node_modules/ignore": {
5758
- "version": "5.3.1",
5759
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
5760
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
5754
+ "version": "5.3.2",
5755
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
5756
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
5761
5757
  "dev": true,
5762
5758
  "engines": {
5763
5759
  "node": ">= 4"
@@ -9007,9 +9003,9 @@
9007
9003
  "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g=="
9008
9004
  },
9009
9005
  "node_modules/nock": {
9010
- "version": "13.5.5",
9011
- "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.5.tgz",
9012
- "integrity": "sha512-XKYnqUrCwXC8DGG1xX4YH5yNIrlh9c065uaMZZHUoeUUINTOyt+x/G+ezYk0Ft6ExSREVIs+qBJDK503viTfFA==",
9006
+ "version": "13.5.6",
9007
+ "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz",
9008
+ "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==",
9013
9009
  "dependencies": {
9014
9010
  "debug": "^4.1.0",
9015
9011
  "json-stringify-safe": "^5.0.1",
@@ -14557,9 +14553,9 @@
14557
14553
  }
14558
14554
  },
14559
14555
  "node_modules/prettier": {
14560
- "version": "3.3.3",
14561
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
14562
- "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
14556
+ "version": "3.4.2",
14557
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
14558
+ "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
14563
14559
  "dev": true,
14564
14560
  "bin": {
14565
14561
  "prettier": "bin/prettier.cjs"
@@ -15729,12 +15725,6 @@
15729
15725
  "node": ">=8"
15730
15726
  }
15731
15727
  },
15732
- "node_modules/text-table": {
15733
- "version": "0.2.0",
15734
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
15735
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
15736
- "dev": true
15737
- },
15738
15728
  "node_modules/thenify": {
15739
15729
  "version": "3.3.1",
15740
15730
  "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -16895,20 +16885,20 @@
16895
16885
  "dev": true
16896
16886
  },
16897
16887
  "@eslint/config-array": {
16898
- "version": "0.18.0",
16899
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
16900
- "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
16888
+ "version": "0.19.1",
16889
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
16890
+ "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
16901
16891
  "dev": true,
16902
16892
  "requires": {
16903
- "@eslint/object-schema": "^2.1.4",
16893
+ "@eslint/object-schema": "^2.1.5",
16904
16894
  "debug": "^4.3.1",
16905
16895
  "minimatch": "^3.1.2"
16906
16896
  },
16907
16897
  "dependencies": {
16908
16898
  "debug": {
16909
- "version": "4.3.7",
16910
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
16911
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
16899
+ "version": "4.4.0",
16900
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
16901
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
16912
16902
  "dev": true,
16913
16903
  "requires": {
16914
16904
  "ms": "^2.1.3"
@@ -16917,15 +16907,18 @@
16917
16907
  }
16918
16908
  },
16919
16909
  "@eslint/core": {
16920
- "version": "0.7.0",
16921
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
16922
- "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
16923
- "dev": true
16910
+ "version": "0.9.1",
16911
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
16912
+ "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
16913
+ "dev": true,
16914
+ "requires": {
16915
+ "@types/json-schema": "^7.0.15"
16916
+ }
16924
16917
  },
16925
16918
  "@eslint/eslintrc": {
16926
- "version": "3.1.0",
16927
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
16928
- "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
16919
+ "version": "3.2.0",
16920
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
16921
+ "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
16929
16922
  "dev": true,
16930
16923
  "requires": {
16931
16924
  "ajv": "^6.12.4",
@@ -16946,12 +16939,12 @@
16946
16939
  "dev": true
16947
16940
  },
16948
16941
  "debug": {
16949
- "version": "4.3.5",
16950
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
16951
- "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
16942
+ "version": "4.4.0",
16943
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
16944
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
16952
16945
  "dev": true,
16953
16946
  "requires": {
16954
- "ms": "2.1.2"
16947
+ "ms": "^2.1.3"
16955
16948
  }
16956
16949
  },
16957
16950
  "js-yaml": {
@@ -16962,31 +16955,25 @@
16962
16955
  "requires": {
16963
16956
  "argparse": "^2.0.1"
16964
16957
  }
16965
- },
16966
- "ms": {
16967
- "version": "2.1.2",
16968
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
16969
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
16970
- "dev": true
16971
16958
  }
16972
16959
  }
16973
16960
  },
16974
16961
  "@eslint/js": {
16975
- "version": "9.14.0",
16976
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz",
16977
- "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==",
16962
+ "version": "9.16.0",
16963
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz",
16964
+ "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==",
16978
16965
  "dev": true
16979
16966
  },
16980
16967
  "@eslint/object-schema": {
16981
- "version": "2.1.4",
16982
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
16983
- "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
16968
+ "version": "2.1.5",
16969
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
16970
+ "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
16984
16971
  "dev": true
16985
16972
  },
16986
16973
  "@eslint/plugin-kit": {
16987
- "version": "0.2.0",
16988
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz",
16989
- "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==",
16974
+ "version": "0.2.4",
16975
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz",
16976
+ "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==",
16990
16977
  "dev": true,
16991
16978
  "requires": {
16992
16979
  "levn": "^0.4.1"
@@ -17023,9 +17010,9 @@
17023
17010
  "dev": true
17024
17011
  },
17025
17012
  "@humanwhocodes/retry": {
17026
- "version": "0.4.0",
17027
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.0.tgz",
17028
- "integrity": "sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g==",
17013
+ "version": "0.4.1",
17014
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
17015
+ "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
17029
17016
  "dev": true
17030
17017
  },
17031
17018
  "@isaacs/cliui": {
@@ -19545,9 +19532,9 @@
19545
19532
  }
19546
19533
  },
19547
19534
  "cross-spawn": {
19548
- "version": "7.0.3",
19549
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
19550
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
19535
+ "version": "7.0.6",
19536
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
19537
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
19551
19538
  "requires": {
19552
19539
  "path-key": "^3.1.0",
19553
19540
  "shebang-command": "^2.0.0",
@@ -19780,26 +19767,26 @@
19780
19767
  "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
19781
19768
  },
19782
19769
  "eslint": {
19783
- "version": "9.14.0",
19784
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz",
19785
- "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==",
19770
+ "version": "9.16.0",
19771
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz",
19772
+ "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==",
19786
19773
  "dev": true,
19787
19774
  "requires": {
19788
19775
  "@eslint-community/eslint-utils": "^4.2.0",
19789
19776
  "@eslint-community/regexpp": "^4.12.1",
19790
- "@eslint/config-array": "^0.18.0",
19791
- "@eslint/core": "^0.7.0",
19792
- "@eslint/eslintrc": "^3.1.0",
19793
- "@eslint/js": "9.14.0",
19794
- "@eslint/plugin-kit": "^0.2.0",
19777
+ "@eslint/config-array": "^0.19.0",
19778
+ "@eslint/core": "^0.9.0",
19779
+ "@eslint/eslintrc": "^3.2.0",
19780
+ "@eslint/js": "9.16.0",
19781
+ "@eslint/plugin-kit": "^0.2.3",
19795
19782
  "@humanfs/node": "^0.16.6",
19796
19783
  "@humanwhocodes/module-importer": "^1.0.1",
19797
- "@humanwhocodes/retry": "^0.4.0",
19784
+ "@humanwhocodes/retry": "^0.4.1",
19798
19785
  "@types/estree": "^1.0.6",
19799
19786
  "@types/json-schema": "^7.0.15",
19800
19787
  "ajv": "^6.12.4",
19801
19788
  "chalk": "^4.0.0",
19802
- "cross-spawn": "^7.0.2",
19789
+ "cross-spawn": "^7.0.5",
19803
19790
  "debug": "^4.3.2",
19804
19791
  "escape-string-regexp": "^4.0.0",
19805
19792
  "eslint-scope": "^8.2.0",
@@ -19818,8 +19805,7 @@
19818
19805
  "lodash.merge": "^4.6.2",
19819
19806
  "minimatch": "^3.1.2",
19820
19807
  "natural-compare": "^1.4.0",
19821
- "optionator": "^0.9.3",
19822
- "text-table": "^0.2.0"
19808
+ "optionator": "^0.9.3"
19823
19809
  },
19824
19810
  "dependencies": {
19825
19811
  "ansi-styles": {
@@ -20629,9 +20615,9 @@
20629
20615
  }
20630
20616
  },
20631
20617
  "ignore": {
20632
- "version": "5.3.1",
20633
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
20634
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
20618
+ "version": "5.3.2",
20619
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
20620
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
20635
20621
  "dev": true
20636
20622
  },
20637
20623
  "ignore-walk": {
@@ -23068,9 +23054,9 @@
23068
23054
  "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g=="
23069
23055
  },
23070
23056
  "nock": {
23071
- "version": "13.5.5",
23072
- "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.5.tgz",
23073
- "integrity": "sha512-XKYnqUrCwXC8DGG1xX4YH5yNIrlh9c065uaMZZHUoeUUINTOyt+x/G+ezYk0Ft6ExSREVIs+qBJDK503viTfFA==",
23057
+ "version": "13.5.6",
23058
+ "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz",
23059
+ "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==",
23074
23060
  "requires": {
23075
23061
  "debug": "^4.1.0",
23076
23062
  "json-stringify-safe": "^5.0.1",
@@ -27170,9 +27156,9 @@
27170
27156
  "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
27171
27157
  },
27172
27158
  "prettier": {
27173
- "version": "3.3.3",
27174
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
27175
- "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
27159
+ "version": "3.4.2",
27160
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
27161
+ "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
27176
27162
  "dev": true
27177
27163
  },
27178
27164
  "pretty-format": {
@@ -28069,12 +28055,6 @@
28069
28055
  "minimatch": "^3.0.4"
28070
28056
  }
28071
28057
  },
28072
- "text-table": {
28073
- "version": "0.2.0",
28074
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
28075
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
28076
- "dev": true
28077
- },
28078
28058
  "thenify": {
28079
28059
  "version": "3.3.1",
28080
28060
  "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
data/helpers/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "@dependabot/yarn-lib": "^1.22.22",
14
14
  "@npmcli/arborist": "^8.0.0",
15
15
  "detect-indent": "^6.1.0",
16
- "nock": "^13.5.5",
16
+ "nock": "^13.5.6",
17
17
  "npm": "6.14.18",
18
18
  "@pnpm/lockfile-file": "^9.1.2",
19
19
  "@pnpm/dependency-path": "^5.1.1",
@@ -21,9 +21,9 @@
21
21
  "patch-package": "^8.0.0"
22
22
  },
23
23
  "devDependencies": {
24
- "eslint": "^9.14.0",
24
+ "eslint": "^9.16.0",
25
25
  "eslint-config-prettier": "^9.1.0",
26
26
  "jest": "^29.7.0",
27
- "prettier": "^3.3.3"
27
+ "prettier": "^3.4.2"
28
28
  }
29
29
  }
@@ -207,7 +207,9 @@ module Dependabot
207
207
  @package_manager_helper ||= T.let(
208
208
  PackageManagerHelper.new(
209
209
  parsed_package_json,
210
- lockfiles: lockfiles
210
+ lockfiles,
211
+ registry_config_files,
212
+ credentials
211
213
  ), T.nilable(PackageManagerHelper)
212
214
  )
213
215
  end
@@ -221,6 +223,17 @@ module Dependabot
221
223
  }
222
224
  end
223
225
 
226
+ # Returns the .npmrc, and .yarnrc files for the repository.
227
+ # @return [Hash{Symbol => Dependabot::DependencyFile}]
228
+ sig { returns(T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)]) }
229
+ def registry_config_files
230
+ {
231
+ npmrc: npmrc,
232
+ yarnrc: yarnrc,
233
+ yarnrc_yml: yarnrc_yml
234
+ }
235
+ end
236
+
224
237
  sig { returns(DependencyFile) }
225
238
  def package_json
226
239
  @package_json ||= T.let(fetch_file_from_host(MANIFEST_FILENAME), T.nilable(DependencyFile))
@@ -601,7 +614,10 @@ module Dependabot
601
614
 
602
615
  sig { returns(T.untyped) }
603
616
  def parsed_package_json
604
- JSON.parse(T.must(package_json.content))
617
+ parsed = JSON.parse(T.must(package_json.content))
618
+ raise Dependabot::DependencyFileNotParseable, package_json.path unless parsed.is_a?(Hash)
619
+
620
+ parsed
605
621
  rescue JSON::ParserError
606
622
  raise Dependabot::DependencyFileNotParseable, package_json.path
607
623
  end
@@ -98,7 +98,9 @@ module Dependabot
98
98
  @package_manager_helper ||= T.let(
99
99
  PackageManagerHelper.new(
100
100
  parsed_package_json,
101
- lockfiles: lockfiles
101
+ lockfiles,
102
+ registry_config_files,
103
+ credentials
102
104
  ), T.nilable(PackageManagerHelper)
103
105
  )
104
106
  end
@@ -112,6 +114,15 @@ module Dependabot
112
114
  }
113
115
  end
114
116
 
117
+ sig { returns(T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)]) }
118
+ def registry_config_files
119
+ {
120
+ npmrc: npmrc,
121
+ yarnrc: yarnrc,
122
+ yarnrc_yml: yarnrc_yml
123
+ }
124
+ end
125
+
115
126
  sig { returns(T.untyped) }
116
127
  def parsed_package_json
117
128
  JSON.parse(T.must(package_json.content))
@@ -156,6 +167,27 @@ module Dependabot
156
167
  end, T.nilable(Dependabot::DependencyFile))
157
168
  end
158
169
 
170
+ sig { returns(T.nilable(Dependabot::DependencyFile)) }
171
+ def npmrc
172
+ @npmrc ||= T.let(dependency_files.find do |f|
173
+ f.name == NpmPackageManager::RC_FILENAME
174
+ end, T.nilable(Dependabot::DependencyFile))
175
+ end
176
+
177
+ sig { returns(T.nilable(Dependabot::DependencyFile)) }
178
+ def yarnrc
179
+ @yarnrc ||= T.let(dependency_files.find do |f|
180
+ f.name == YarnPackageManager::RC_FILENAME
181
+ end, T.nilable(Dependabot::DependencyFile))
182
+ end
183
+
184
+ sig { returns(T.nilable(DependencyFile)) }
185
+ def yarnrc_yml
186
+ @yarnrc_yml ||= T.let(dependency_files.find do |f|
187
+ f.name == YarnPackageManager::RC_YML_FILENAME
188
+ end, T.nilable(Dependabot::DependencyFile))
189
+ end
190
+
159
191
  sig { returns(Dependabot::FileParsers::Base::DependencySet) }
160
192
  def manifest_dependencies
161
193
  dependency_set = DependencySet.new
@@ -9,7 +9,7 @@ require "sorbet-runtime"
9
9
 
10
10
  module Dependabot
11
11
  module NpmAndYarn
12
- module Helpers
12
+ module Helpers # rubocop:disable Metrics/ModuleLength
13
13
  extend T::Sig
14
14
 
15
15
  YARN_PATH_NOT_FOUND =
@@ -332,7 +332,7 @@ module Dependabot
332
332
  version.strip.delete_prefix("v") # Remove the "v" prefix if present
333
333
  end
334
334
  rescue StandardError => e
335
- puts "Error retrieving Node.js version: #{e.message}"
335
+ Dependabot.logger.error("Error retrieving Node.js version: #{e.message}")
336
336
  nil
337
337
  end
338
338
 
@@ -388,35 +388,89 @@ module Dependabot
388
388
  end
389
389
 
390
390
  # Install the package manager for specified version by using corepack
391
- # and prepare it for use by using corepack
392
- sig { params(name: String, version: String).returns(String) }
393
- def self.install(name, version)
391
+ sig do
392
+ params(
393
+ name: String,
394
+ version: String,
395
+ env: T.nilable(T::Hash[String, String])
396
+ )
397
+ .returns(String)
398
+ end
399
+ def self.install(name, version, env: {})
394
400
  Dependabot.logger.info("Installing \"#{name}@#{version}\"")
395
401
 
396
- package_manager_install(name, version)
397
- package_manager_activate(name, version)
398
- installed_version = package_manager_version(name)
402
+ begin
403
+ # Try to install the specified version
404
+ output = package_manager_install(name, version, env: env)
405
+
406
+ # Confirm success based on the output
407
+ if output.match?(/Adding #{name}@.* to the cache/)
408
+ Dependabot.logger.info("#{name}@#{version} successfully installed.")
399
409
 
400
- Dependabot.logger.info("Installed version of #{name}: #{installed_version}")
410
+ Dependabot.logger.info("Activating currently installed version of #{name}: #{version}")
411
+ package_manager_activate(name, version)
412
+
413
+ else
414
+ Dependabot.logger.error("Corepack installation output unexpected: #{output}")
415
+ fallback_to_local_version(name)
416
+ end
417
+ rescue StandardError => e
418
+ Dependabot.logger.error("Error installing #{name}@#{version}: #{e.message}")
419
+ fallback_to_local_version(name)
420
+ end
421
+
422
+ # Verify the installed version
423
+ installed_version = package_manager_version(name)
401
424
 
402
425
  installed_version
403
426
  end
404
427
 
428
+ # Attempt to activate the local version of the package manager
429
+ sig { params(name: String).void }
430
+ def self.fallback_to_local_version(name)
431
+ Dependabot.logger.info("Falling back to activate the currently installed version of #{name}.")
432
+
433
+ # Fetch the currently installed version directly from the environment
434
+ current_version = local_package_manager_version(name)
435
+ Dependabot.logger.info("Activating currently installed version of #{name}: #{current_version}")
436
+
437
+ # Prepare the existing version
438
+ package_manager_activate(name, current_version)
439
+ end
440
+
405
441
  # Install the package manager for specified version by using corepack
406
- sig { params(name: String, version: String).void }
407
- def self.package_manager_install(name, version)
442
+ sig do
443
+ params(
444
+ name: String,
445
+ version: String,
446
+ env: T.nilable(T::Hash[String, String])
447
+ )
448
+ .returns(String)
449
+ end
450
+ def self.package_manager_install(name, version, env: {})
408
451
  Dependabot::SharedHelpers.run_shell_command(
409
452
  "corepack install #{name}@#{version} --global --cache-only",
410
- fingerprint: "corepack install <name>@<version> --global --cache-only"
453
+ fingerprint: "corepack install <name>@<version> --global --cache-only",
454
+ env: env
411
455
  ).strip
412
456
  end
413
457
 
414
458
  # Prepare the package manager for use by using corepack
415
- sig { params(name: String, version: String).void }
459
+ sig { params(name: String, version: String).returns(String) }
416
460
  def self.package_manager_activate(name, version)
417
461
  Dependabot::SharedHelpers.run_shell_command(
418
462
  "corepack prepare #{name}@#{version} --activate",
419
- fingerprint: "corepack prepare --activate"
463
+ fingerprint: "corepack prepare <name>@<version> --activate"
464
+ ).strip
465
+ end
466
+
467
+ # Fetch the currently installed version of the package manager directly
468
+ # from the system without involving Corepack
469
+ sig { params(name: String).returns(String) }
470
+ def self.local_package_manager_version(name)
471
+ Dependabot::SharedHelpers.run_shell_command(
472
+ "#{name} -v",
473
+ fingerprint: "#{name} -v"
420
474
  ).strip
421
475
  end
422
476
 
@@ -427,7 +481,8 @@ module Dependabot
427
481
 
428
482
  version = package_manager_run_command(name, "-v").strip
429
483
 
430
- Dependabot.logger.info("Version for #{name}: #{version}")
484
+ Dependabot.logger.info("Installed version of #{name}: #{version}")
485
+
431
486
  version
432
487
  rescue StandardError => e
433
488
  Dependabot.logger.error("Error fetching version for package manager #{name}: #{e.message}")
@@ -445,14 +500,11 @@ module Dependabot
445
500
  def self.package_manager_run_command(name, command, fingerprint: nil)
446
501
  full_command = "corepack #{name} #{command}"
447
502
 
448
- Dependabot.logger.info("Running package manager command: #{full_command}")
449
-
450
503
  result = Dependabot::SharedHelpers.run_shell_command(
451
504
  full_command,
452
505
  fingerprint: "corepack #{name} #{fingerprint || command}"
453
506
  ).strip
454
507
 
455
- Dependabot.logger.info("Command executed successfully: #{full_command}")
456
508
  result
457
509
  rescue StandardError => e
458
510
  Dependabot.logger.error("Error running package manager command: #{full_command}, Error: #{e.message}")
@@ -5,6 +5,7 @@ require "dependabot/shared_helpers"
5
5
  require "dependabot/ecosystem"
6
6
  require "dependabot/npm_and_yarn/requirement"
7
7
  require "dependabot/npm_and_yarn/version_selector"
8
+ require "dependabot/npm_and_yarn/registry_helper"
8
9
 
9
10
  module Dependabot
10
11
  module NpmAndYarn
@@ -61,14 +62,13 @@ module Dependabot
61
62
 
62
63
  # Keep versions in ascending order
63
64
  SUPPORTED_VERSIONS = T.let([
64
- Version.new(NPM_V6),
65
65
  Version.new(NPM_V7),
66
66
  Version.new(NPM_V8),
67
67
  Version.new(NPM_V9),
68
68
  Version.new(NPM_V10)
69
69
  ].freeze, T::Array[Dependabot::Version])
70
70
 
71
- DEPRECATED_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
71
+ DEPRECATED_VERSIONS = T.let([Version.new(NPM_V6)].freeze, T::Array[Dependabot::Version])
72
72
 
73
73
  sig do
74
74
  params(
@@ -88,12 +88,17 @@ module Dependabot
88
88
 
89
89
  sig { override.returns(T::Boolean) }
90
90
  def deprecated?
91
- false
91
+ return false if unsupported?
92
+ return false unless Dependabot::Experiments.enabled?(:npm_v6_deprecation_warning)
93
+
94
+ deprecated_versions.include?(version)
92
95
  end
93
96
 
94
97
  sig { override.returns(T::Boolean) }
95
98
  def unsupported?
96
- false
99
+ return false unless Dependabot::Experiments.enabled?(:npm_v6_unsupported_error)
100
+
101
+ supported_versions.all? { |supported| supported > version }
97
102
  end
98
103
  end
99
104
 
@@ -311,17 +316,24 @@ module Dependabot
311
316
  sig do
312
317
  params(
313
318
  package_json: T.nilable(T::Hash[String, T.untyped]),
314
- lockfiles: T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)]
319
+ lockfiles: T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)],
320
+ registry_config_files: T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)],
321
+ credentials: T.nilable(T::Array[Dependabot::Credential])
315
322
  ).void
316
323
  end
317
- def initialize(package_json, lockfiles:)
324
+ def initialize(package_json, lockfiles, registry_config_files, credentials)
318
325
  @package_json = package_json
319
326
  @lockfiles = lockfiles
327
+ @registry_helper = T.let(
328
+ RegistryHelper.new(registry_config_files, credentials),
329
+ Dependabot::NpmAndYarn::RegistryHelper
330
+ )
320
331
  @package_manager_detector = T.let(PackageManagerDetector.new(lockfiles, package_json), PackageManagerDetector)
321
332
  @manifest_package_manager = T.let(package_json&.fetch(MANIFEST_PACKAGE_MANAGER_KEY, nil), T.nilable(String))
322
333
  @engines = T.let(package_json&.fetch(MANIFEST_ENGINES_KEY, nil), T.nilable(T::Hash[String, T.untyped]))
323
334
 
324
335
  @installed_versions = T.let({}, T::Hash[String, String])
336
+ @registries = T.let({}, T::Hash[String, String])
325
337
 
326
338
  @language = T.let(nil, T.nilable(Ecosystem::VersionManager))
327
339
  @language_requirement = T.let(nil, T.nilable(Requirement))
@@ -379,8 +391,8 @@ module Dependabot
379
391
  end
380
392
 
381
393
  # rubocop:disable Metrics/CyclomaticComplexity
382
- # rubocop:disable Metrics/PerceivedComplexity
383
394
  # rubocop:disable Metrics/AbcSize
395
+ # rubocop:disable Metrics/PerceivedComplexity
384
396
  sig { params(name: String).returns(T.nilable(T.any(Integer, String))) }
385
397
  def setup(name)
386
398
  # we prioritize version mentioned in "packageManager" instead of "engines"
@@ -438,6 +450,9 @@ module Dependabot
438
450
  end
439
451
  version
440
452
  end
453
+ # rubocop:enable Metrics/CyclomaticComplexity
454
+ # rubocop:enable Metrics/AbcSize
455
+ # rubocop:enable Metrics/PerceivedComplexity
441
456
 
442
457
  sig { params(name: T.nilable(String)).returns(Ecosystem::VersionManager) }
443
458
  def package_manager_by_name(name)
@@ -456,21 +471,15 @@ module Dependabot
456
471
  Dependabot.logger.info("No version requirement found for #{name}")
457
472
  end
458
473
 
459
- package_manager_instance = package_manager_class.new(
474
+ package_manager_class.new(
460
475
  installed_version,
461
476
  requirement: package_manager_requirement
462
477
  )
463
-
464
- Dependabot.logger.info("Package manager resolved for #{name}: #{package_manager_instance}")
465
- package_manager_instance
466
478
  rescue StandardError => e
467
479
  Dependabot.logger.error("Error resolving package manager for #{name || 'default'}: #{e.message}")
468
480
  raise
469
481
  end
470
482
 
471
- # rubocop:enable Metrics/CyclomaticComplexity
472
- # rubocop:enable Metrics/PerceivedComplexity
473
- # rubocop:enable Metrics/AbcSize
474
483
  # Retrieve the installed version of the package manager by executing
475
484
  # the "corepack <name> -v" command and using the output.
476
485
  # If the output does not match the expected version format (PACKAGE_MANAGER_VERSION_REGEX),
@@ -504,13 +513,18 @@ module Dependabot
504
513
  return unless name == PNPMPackageManager::NAME
505
514
  return unless Version.new(version) < Version.new("7")
506
515
 
507
- raise ToolVersionNotSupported.new(PNPMPackageManager::NAME.upcase, version, "7.*, 8.*")
516
+ raise ToolVersionNotSupported.new(PNPMPackageManager::NAME.upcase, version, "7.*, 8.*, 9.*")
508
517
  end
509
518
 
510
519
  sig { params(name: String, version: T.nilable(String)).void }
511
520
  def install(name, version)
512
521
  if Dependabot::Experiments.enabled?(:enable_corepack_for_npm_and_yarn)
513
- return Helpers.install(name, version.to_s)
522
+ env = {}
523
+ if Dependabot::Experiments.enabled?(:enable_private_registry_for_corepack)
524
+ env = @registry_helper.find_corepack_env_variables
525
+ end
526
+ # Use the Helpers.install method to install the package manager
527
+ return Helpers.install(name, version.to_s, env: env)
514
528
  end
515
529
 
516
530
  Dependabot.logger.info("Installing \"#{name}@#{version}\"")
@@ -0,0 +1,188 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "yaml"
5
+ require "dependabot/dependency_file"
6
+ require "sorbet-runtime"
7
+
8
+ module Dependabot
9
+ module NpmAndYarn
10
+ class RegistryHelper
11
+ extend T::Sig
12
+
13
+ # Keys for configurations
14
+ REGISTRY_KEY = "registry"
15
+ AUTH_KEY = "authToken"
16
+
17
+ # Yarn-specific keys
18
+ NPM_AUTH_TOKEN_KEY_FOR_YARN = "npmAuthToken"
19
+ NPM_SCOPE_KEY_FOR_YARN = "npmScopes"
20
+ NPM_REGISTER_KEY_FOR_YARN = "npmRegistryServer"
21
+
22
+ # Environment variable keys
23
+ COREPACK_NPM_REGISTRY_ENV = "COREPACK_NPM_REGISTRY"
24
+ COREPACK_NPM_TOKEN_ENV = "COREPACK_NPM_TOKEN"
25
+
26
+ sig do
27
+ params(
28
+ registry_config_files: T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)],
29
+ credentials: T.nilable(T::Array[Dependabot::Credential])
30
+ ).void
31
+ end
32
+ def initialize(registry_config_files, credentials)
33
+ @registry_config_files = T.let(registry_config_files, T::Hash[Symbol, T.nilable(Dependabot::DependencyFile)])
34
+ @credentials = T.let(credentials, T.nilable(T::Array[Dependabot::Credential]))
35
+ end
36
+
37
+ sig { returns(T::Hash[String, String]) }
38
+ def find_corepack_env_variables
39
+ registry_info = find_registry_and_token
40
+
41
+ env_variables = {}
42
+ env_variables[COREPACK_NPM_REGISTRY_ENV] = registry_info[:registry] if registry_info[:registry]
43
+ env_variables[COREPACK_NPM_TOKEN_ENV] = registry_info[:auth_token] if registry_info[:auth_token]
44
+
45
+ env_variables
46
+ end
47
+
48
+ private
49
+
50
+ sig { returns(T::Hash[Symbol, T.nilable(String)]) }
51
+ def find_registry_and_token
52
+ # Step 1: Check dependabot.yml configuration
53
+ dependabot_config = config_npm_registry_and_token
54
+ return dependabot_config if dependabot_config[:registry]
55
+
56
+ # Step 2: Check .npmrc
57
+ npmrc_config = @registry_config_files[:npmrc]
58
+ npmrc_result = parse_registry_from_npmrc_yarnrc(npmrc_config, "=", "npm")
59
+
60
+ return npmrc_result if npmrc_result[:registry]
61
+
62
+ # Step 3: Check .yarnrc
63
+ yarnrc_config = @registry_config_files[:yarnrc]
64
+ yarnrc_result = parse_registry_from_npmrc_yarnrc(yarnrc_config, " ", "npm")
65
+ return yarnrc_result if yarnrc_result[:registry]
66
+
67
+ # Step 4: Check yarnrc.yml
68
+ yarnrc_yml_config = @registry_config_files[:yarnrc_yml]
69
+ yarnrc_yml_result = parse_npm_from_yarnrc_yml(yarnrc_yml_config)
70
+ return yarnrc_yml_result if yarnrc_yml_result[:registry]
71
+
72
+ # Default values if no registry is found
73
+ {}
74
+ end
75
+
76
+ sig { returns(T::Hash[Symbol, T.nilable(String)]) }
77
+ def config_npm_registry_and_token
78
+ registries = {}
79
+
80
+ return registries unless @credentials&.any?
81
+
82
+ @credentials.each do |cred|
83
+ next unless cred["type"] == "npm_registry" # Skip if not an npm registry
84
+ next unless cred["replaces-base"] # Skip if not a reverse-proxy registry
85
+
86
+ # Set the registry if it's not already set
87
+ registries[:registry] ||= cred["registry"]
88
+
89
+ # Set the token if it's not already set
90
+ registries[:auth_token] ||= cred["token"]
91
+ end
92
+ registries
93
+ end
94
+
95
+ # Find registry and token in .npmrc or .yarnrc file
96
+ sig do
97
+ params(
98
+ file: T.nilable(Dependabot::DependencyFile),
99
+ separator: String
100
+ ).returns(T::Hash[Symbol, T.nilable(String)])
101
+ end
102
+ def parse_npm_from_npm_or_yarn_rc(file, separator = "=")
103
+ parse_registry_from_npmrc_yarnrc(file, separator, NpmPackageManager::NAME)
104
+ end
105
+
106
+ # Find registry and token in .npmrc or .yarnrc file
107
+ sig do
108
+ params(
109
+ file: T.nilable(Dependabot::DependencyFile),
110
+ separator: String,
111
+ scope: T.nilable(String)
112
+ ).returns(T::Hash[Symbol, T.nilable(String)])
113
+ end
114
+ def parse_registry_from_npmrc_yarnrc(file, separator = "=", scope = nil)
115
+ content = file&.content
116
+ return { registry: nil, auth_token: nil } unless content
117
+
118
+ global_registry = T.let(nil, T.nilable(String))
119
+ scoped_registry = T.let(nil, T.nilable(String))
120
+ auth_token = T.let(nil, T.nilable(String))
121
+
122
+ content.split("\n").each do |line|
123
+ # Split using the provided separator
124
+ key, value = line.strip.split(separator, 2)
125
+ next unless key && value
126
+
127
+ # Remove surrounding quotes from keys and values
128
+ cleaned_key = key.strip.gsub(/\A["']|["']\z/, "")
129
+ cleaned_value = value.strip.gsub(/\A["']|["']\z/, "")
130
+
131
+ case cleaned_key
132
+ when "registry"
133
+ # Case 1: Found a global registry
134
+ global_registry = cleaned_value
135
+ when "_authToken"
136
+ # Case 2: Found an auth token
137
+ auth_token = cleaned_value
138
+ else
139
+ # Handle scoped registry if a scope is provided
140
+ scoped_registry = cleaned_value if scope && cleaned_key == "@#{scope}:registry"
141
+ end
142
+ end
143
+
144
+ # Determine the registry to return (global first, fallback to scoped)
145
+ registry = global_registry || scoped_registry
146
+
147
+ { registry: registry, auth_token: auth_token }
148
+ end
149
+
150
+ # rubocop:disable Metrics/PerceivedComplexity
151
+ sig { params(file: T.nilable(Dependabot::DependencyFile)).returns(T::Hash[Symbol, T.nilable(String)]) }
152
+ def parse_npm_from_yarnrc_yml(file)
153
+ content = file&.content
154
+ return { registry: nil, auth_token: nil } unless content
155
+
156
+ result = {}
157
+ yaml_data = safe_load_yaml(content)
158
+
159
+ # Step 1: Extract global registry and auth token
160
+ result[:registry] = yaml_data[NPM_REGISTER_KEY_FOR_YARN] if yaml_data.key?(NPM_REGISTER_KEY_FOR_YARN)
161
+ result[:auth_token] = yaml_data[NPM_AUTH_TOKEN_KEY_FOR_YARN] if yaml_data.key?(NPM_AUTH_TOKEN_KEY_FOR_YARN)
162
+
163
+ # Step 2: Fallback to any scoped registry and auth token if global is missing
164
+ if result[:registry].nil? && yaml_data.key?(NPM_SCOPE_KEY_FOR_YARN)
165
+ yaml_data[NPM_SCOPE_KEY_FOR_YARN].each do |_current_scope, config|
166
+ next unless config.is_a?(Hash)
167
+
168
+ result[:registry] ||= config[NPM_REGISTER_KEY_FOR_YARN]
169
+ result[:auth_token] ||= config[NPM_AUTH_TOKEN_KEY_FOR_YARN]
170
+ end
171
+ end
172
+
173
+ result
174
+ end
175
+ # rubocop:enable Metrics/PerceivedComplexity
176
+
177
+ # Safely loads the YAML content and logs any parsing errors
178
+ sig { params(content: String).returns(T::Hash[String, T.untyped]) }
179
+ def safe_load_yaml(content)
180
+ YAML.safe_load(content, permitted_classes: [Symbol, String]) || {}
181
+ rescue Psych::SyntaxError => e
182
+ # Log the error instead of raising it
183
+ Dependabot.logger.error("YAML parsing error: #{e.message}")
184
+ {}
185
+ end
186
+ end
187
+ end
188
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-npm_and_yarn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.289.0
4
+ version: 0.291.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-05 00:00:00.000000000 Z
11
+ date: 2024-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dependabot-common
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.289.0
19
+ version: 0.291.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.289.0
26
+ version: 0.291.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: debug
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -326,6 +326,7 @@ files:
326
326
  - lib/dependabot/npm_and_yarn/native_helpers.rb
327
327
  - lib/dependabot/npm_and_yarn/package_manager.rb
328
328
  - lib/dependabot/npm_and_yarn/package_name.rb
329
+ - lib/dependabot/npm_and_yarn/registry_helper.rb
329
330
  - lib/dependabot/npm_and_yarn/registry_parser.rb
330
331
  - lib/dependabot/npm_and_yarn/requirement.rb
331
332
  - lib/dependabot/npm_and_yarn/sub_dependency_files_filterer.rb
@@ -346,8 +347,8 @@ licenses:
346
347
  - MIT
347
348
  metadata:
348
349
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
349
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.289.0
350
- post_install_message:
350
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.291.0
351
+ post_install_message:
351
352
  rdoc_options: []
352
353
  require_paths:
353
354
  - lib
@@ -363,7 +364,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
363
364
  version: 3.1.0
364
365
  requirements: []
365
366
  rubygems_version: 3.5.9
366
- signing_key:
367
+ signing_key:
367
368
  specification_version: 4
368
369
  summary: Provides Dependabot support for Javascript (npm and yarn)
369
370
  test_files: []