dependabot-npm_and_yarn 0.289.0 → 0.291.0

Sign up to get free protection for your applications and to get access to all the features.
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: []