renovate 44.43.1 → 44.44.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.
- package/dist/modules/manager/fingerprint.generated.js +1 -1
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/sveltos/extract.js +1 -1
- package/dist/modules/manager/sveltos/extract.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.d.ts +2 -7
- package/dist/modules/platform/bitbucket/index.js +19 -105
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/bitbucket/schema.js +0 -4
- package/dist/modules/platform/bitbucket/schema.js.map +1 -1
- package/dist/util/http/bitbucket.js +31 -0
- package/dist/util/http/bitbucket.js.map +1 -1
- package/dist/util/http/http.d.ts +1 -0
- package/dist/util/http/http.js +2 -0
- package/dist/util/http/http.js.map +1 -1
- package/package.json +3 -3
- package/renovate-schema.json +2 -2
|
@@ -101,7 +101,7 @@ hashMap.set("sbt", "e508c2e2fb8d44e6cbec20f449c8eed096728566e6058187269c637930d3
|
|
|
101
101
|
hashMap.set("scalafmt", "9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f");
|
|
102
102
|
hashMap.set("setup-cfg", "7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785");
|
|
103
103
|
hashMap.set("smithy", "9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100");
|
|
104
|
-
hashMap.set("sveltos", "
|
|
104
|
+
hashMap.set("sveltos", "8d2558bce5fbcdfa4a96bf11de6f40bf6d93179025bbf6a9eeb0b7e02e8e9c00");
|
|
105
105
|
hashMap.set("swift", "eb5f7c3c4dabf28eed36916269ca9be16ab9ddb83993db03ea66b9195ad7bdc6");
|
|
106
106
|
hashMap.set("tekton", "fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd");
|
|
107
107
|
hashMap.set("terraform", "73f9d1753d1077585bd264163b7bfacaf6cf20b586b233cbb8cf058a9fce0103");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861b3083111');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','b2acfc0a6164e9a279daa724777c423f84572dafb0df09b1b0cf6f205f9eb6d0');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','bd9208444eff1a4958061484db66a47b616c31f15a8d49d23b75c4560fcee83e');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4994a8bd86d5bfb169d67c08efd8509b58c368c2bf3dd9bbe42553c0fabc3f1a');\nhashMap.set('bazel-module','40f6a862b4e72fcc7262ee41f8b570ea3fd5600d6d552b94ed3301bb201f5db5');\nhashMap.set('bazelisk','d71489650feefb0dbbe7461f924cb50e41c8eef8fe2e11acdec2d42d0212c8ef');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','691aa0bd20c20f7e05be5d231ed14dccdf81b9399d062448794176403aa53d94');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','246899c76663fa66024e19aa18287d364dd0de46febe998cb9c1b1e2b09fe53c');\nhashMap.set('cake','ed6d14c96161f1d3d927adc7e333b96585164e1f25151a87990914d57ae17fe1');\nhashMap.set('cargo','beae41d92d6d321459b1ca6eb80e7ee6906c694fd3c01ffeec32d8053db96e44');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','3d3affcaab991e9a27916dfbc8bdddb1066be28303c37be781695bfc0645aa81');\nhashMap.set('composer','d84def5d2f07adb0b5c37195fa115a3a9d86194b57eae014d7b43d2d59fe7d1c');\nhashMap.set('conan','74ca922a0ffdf1a9dd44b83eb2b3a36c56c7d792031e3a4a484f293046be3ecd');\nhashMap.set('copier','3010e0a1f77203b001e4d851dd899d3e23a96f0c25cff8a9c1819837c9972d6a');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','a43016a9a469e0472f00855c8db64bb65ef5ffa773e7bbfade02a21400f67690');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','a608d1e6db93a8f997d41f8dee7b67533452a956057865978342e2819272e0a9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','54122792bf8ea0be98e0a0716e627e3115b40a5f0155ccd7ae0cfc52424a3478');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','70833dd068ea0a746a9392469e7904021562c7629428d0cd554603bad4eb6ce5');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','e95bbc9b69a36dee82e255e8983640b7179cb5f17d24b035c6cf01d9635b35bd');\nhashMap.set('github-actions','3dea0c91977c92d9c225c16cf27ce04a2dd7a1b652f0382c59d19b4685312cb3');\nhashMap.set('gitlabci','33c264edf7837fb8fbc4cf0078c8bd2d5a75431039b1db65bf47356df7753125');\nhashMap.set('gitlabci-include','ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','02389785183c39d2896d7893414c5e1060023f95c1fe7b595bd06cc5c1186d39');\nhashMap.set('gomod','b21d52f02d181eb1dcd252a9fd545e7ac04d76679790b254377a9e077f2d3a8a');\nhashMap.set('gradle','1780fe7560babe735da868a0dd1a013fea76d82abfde62028cd48f9de42fb52c');\nhashMap.set('gradle-wrapper','e16500ce08dd35ecb3ddcc3c79989648087b8249c3a95413a991627d064657ca');\nhashMap.set('haskell-cabal','f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','0adc0092400df2075e1c4580ebe35bbc3b638ebee67cc948a4338094cb16a8ae');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','572f7b0b746377e0c5d6f5ad5c0b78cbed6782a561be77263cf45620b6fdad0c');\nhashMap.set('hermit','61e132cfccbe4e3884801a3728f3391455c214811a33c1f733b0dea7122bbbb6');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','9c64a4f1475b1c2052372e566c9190f32ae8acd1c54313031d55ae8772388367');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','e26b390528f2de43dc572bcee7cb15bb4671d2df75413a56caf1ddcee683a0ee');\nhashMap.set('kotlin-script','8a327ba00370d0df5ee656033f0526b898204ef6805cc5692221a71ca2ad654d');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','14bc841079d278b8e03b1eb184d94fef3df8811fa25beddc7ac9e6e2697b43b5');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','f084cdc88320ca1e82af957d0008e7c9ce991d3282cb428f3108a5722239cead');\nhashMap.set('maven-wrapper','db967206d960b12d7c58d78132808d3c412087ababf5c59444262782e4434c6a');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','8509ff587ee410eeb94cbf1d4616c6a174b5f4110d0e748496edd8ed150d8b9b');\nhashMap.set('mix','ca855b0353a8087d91a63fba5cc097d11e0396a963f214a508279aef065707f0');\nhashMap.set('nix','f90bb8943129de40b50564b203df71bb86079dd134e204390a103535de1c5af7');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','788c412f962a5fcace60bc99f9f31438d001b2d70e1a6c04a26900dd5d521992');\nhashMap.set('nuget','4818fdcf3258a19228004c62a605c3fb4b6665ca09df524ab37f712ea201db89');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','db4dc12af1643b6883819bc8d0b4a7fc4533384e5678a61745710f0087f97ab9');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','04747259c660d6ec4f9a36d7efd1c823c78767292faf4b358c11f5507214d6f8');\nhashMap.set('pip_requirements','f92868732a7a9bb2b6d7525bd5b4515108376434fe6a2a12d802f7075c12a56c');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','f4c5d17bfcb6f5cb8b85584d4b782379daa69ee85936ca79ef01172e5d6652a2');\nhashMap.set('pixi','3732f052617efd5007ddbe31091a2ba026909288bac4cbbe6d2bd6ac64d85393');\nhashMap.set('poetry','17e7a8e6a233ef311acfed2663b231dbf681a6d25edc9b92ae7c063205d042fc');\nhashMap.set('pre-commit','17a5f183985ebffe98785a541d3609bf25efedc387deb3d50e9f00f02b25f615');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','3ade8bf8232eda456e24909b4d1abce066e674c9ea9aa250c567cf621a96bf9b');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d');\nhashMap.set('renovate-config','ca60beee2e3b871ea1216fa9df9a501f7ed355fe7da29e12509e56a124a78e69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e508c2e2fb8d44e6cbec20f449c8eed096728566e6058187269c637930d388fb');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','05b3158e88771ed4629e171592cf4f1bf0ff342f8aeae89be0b340c630cc6d8e');\nhashMap.set('swift','eb5f7c3c4dabf28eed36916269ca9be16ab9ddb83993db03ea66b9195ad7bdc6');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','73f9d1753d1077585bd264163b7bfacaf6cf20b586b233cbb8cf058a9fce0103');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','ffcbaa67dd65f064d43f8c121c1006115eab1879c4bd38de263b9b90a009c118');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','31247d37bc80aae17039bfa21bd989c5717730c5ef10cf2a6f09841576d012ec');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','8901ee24116f7998bddcfc8d2492bff8138d9c66a23caea75c24d594ef4a504d');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861b3083111');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','b2acfc0a6164e9a279daa724777c423f84572dafb0df09b1b0cf6f205f9eb6d0');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','bd9208444eff1a4958061484db66a47b616c31f15a8d49d23b75c4560fcee83e');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4994a8bd86d5bfb169d67c08efd8509b58c368c2bf3dd9bbe42553c0fabc3f1a');\nhashMap.set('bazel-module','40f6a862b4e72fcc7262ee41f8b570ea3fd5600d6d552b94ed3301bb201f5db5');\nhashMap.set('bazelisk','d71489650feefb0dbbe7461f924cb50e41c8eef8fe2e11acdec2d42d0212c8ef');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','691aa0bd20c20f7e05be5d231ed14dccdf81b9399d062448794176403aa53d94');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','246899c76663fa66024e19aa18287d364dd0de46febe998cb9c1b1e2b09fe53c');\nhashMap.set('cake','ed6d14c96161f1d3d927adc7e333b96585164e1f25151a87990914d57ae17fe1');\nhashMap.set('cargo','beae41d92d6d321459b1ca6eb80e7ee6906c694fd3c01ffeec32d8053db96e44');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','3d3affcaab991e9a27916dfbc8bdddb1066be28303c37be781695bfc0645aa81');\nhashMap.set('composer','d84def5d2f07adb0b5c37195fa115a3a9d86194b57eae014d7b43d2d59fe7d1c');\nhashMap.set('conan','74ca922a0ffdf1a9dd44b83eb2b3a36c56c7d792031e3a4a484f293046be3ecd');\nhashMap.set('copier','3010e0a1f77203b001e4d851dd899d3e23a96f0c25cff8a9c1819837c9972d6a');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','a43016a9a469e0472f00855c8db64bb65ef5ffa773e7bbfade02a21400f67690');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','a608d1e6db93a8f997d41f8dee7b67533452a956057865978342e2819272e0a9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','54122792bf8ea0be98e0a0716e627e3115b40a5f0155ccd7ae0cfc52424a3478');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','70833dd068ea0a746a9392469e7904021562c7629428d0cd554603bad4eb6ce5');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','e95bbc9b69a36dee82e255e8983640b7179cb5f17d24b035c6cf01d9635b35bd');\nhashMap.set('github-actions','3dea0c91977c92d9c225c16cf27ce04a2dd7a1b652f0382c59d19b4685312cb3');\nhashMap.set('gitlabci','33c264edf7837fb8fbc4cf0078c8bd2d5a75431039b1db65bf47356df7753125');\nhashMap.set('gitlabci-include','ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','02389785183c39d2896d7893414c5e1060023f95c1fe7b595bd06cc5c1186d39');\nhashMap.set('gomod','b21d52f02d181eb1dcd252a9fd545e7ac04d76679790b254377a9e077f2d3a8a');\nhashMap.set('gradle','1780fe7560babe735da868a0dd1a013fea76d82abfde62028cd48f9de42fb52c');\nhashMap.set('gradle-wrapper','e16500ce08dd35ecb3ddcc3c79989648087b8249c3a95413a991627d064657ca');\nhashMap.set('haskell-cabal','f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','0adc0092400df2075e1c4580ebe35bbc3b638ebee67cc948a4338094cb16a8ae');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','572f7b0b746377e0c5d6f5ad5c0b78cbed6782a561be77263cf45620b6fdad0c');\nhashMap.set('hermit','61e132cfccbe4e3884801a3728f3391455c214811a33c1f733b0dea7122bbbb6');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','9c64a4f1475b1c2052372e566c9190f32ae8acd1c54313031d55ae8772388367');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','e26b390528f2de43dc572bcee7cb15bb4671d2df75413a56caf1ddcee683a0ee');\nhashMap.set('kotlin-script','8a327ba00370d0df5ee656033f0526b898204ef6805cc5692221a71ca2ad654d');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','14bc841079d278b8e03b1eb184d94fef3df8811fa25beddc7ac9e6e2697b43b5');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','f084cdc88320ca1e82af957d0008e7c9ce991d3282cb428f3108a5722239cead');\nhashMap.set('maven-wrapper','db967206d960b12d7c58d78132808d3c412087ababf5c59444262782e4434c6a');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','8509ff587ee410eeb94cbf1d4616c6a174b5f4110d0e748496edd8ed150d8b9b');\nhashMap.set('mix','ca855b0353a8087d91a63fba5cc097d11e0396a963f214a508279aef065707f0');\nhashMap.set('nix','f90bb8943129de40b50564b203df71bb86079dd134e204390a103535de1c5af7');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','788c412f962a5fcace60bc99f9f31438d001b2d70e1a6c04a26900dd5d521992');\nhashMap.set('nuget','4818fdcf3258a19228004c62a605c3fb4b6665ca09df524ab37f712ea201db89');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','db4dc12af1643b6883819bc8d0b4a7fc4533384e5678a61745710f0087f97ab9');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','04747259c660d6ec4f9a36d7efd1c823c78767292faf4b358c11f5507214d6f8');\nhashMap.set('pip_requirements','f92868732a7a9bb2b6d7525bd5b4515108376434fe6a2a12d802f7075c12a56c');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','f4c5d17bfcb6f5cb8b85584d4b782379daa69ee85936ca79ef01172e5d6652a2');\nhashMap.set('pixi','3732f052617efd5007ddbe31091a2ba026909288bac4cbbe6d2bd6ac64d85393');\nhashMap.set('poetry','17e7a8e6a233ef311acfed2663b231dbf681a6d25edc9b92ae7c063205d042fc');\nhashMap.set('pre-commit','17a5f183985ebffe98785a541d3609bf25efedc387deb3d50e9f00f02b25f615');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','3ade8bf8232eda456e24909b4d1abce066e674c9ea9aa250c567cf621a96bf9b');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d');\nhashMap.set('renovate-config','ca60beee2e3b871ea1216fa9df9a501f7ed355fe7da29e12509e56a124a78e69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e508c2e2fb8d44e6cbec20f449c8eed096728566e6058187269c637930d388fb');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','8d2558bce5fbcdfa4a96bf11de6f40bf6d93179025bbf6a9eeb0b7e02e8e9c00');\nhashMap.set('swift','eb5f7c3c4dabf28eed36916269ca9be16ab9ddb83993db03ea66b9195ad7bdc6');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','73f9d1753d1077585bd264163b7bfacaf6cf20b586b233cbb8cf058a9fce0103');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','ffcbaa67dd65f064d43f8c121c1006115eab1879c4bd38de263b9b90a009c118');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','31247d37bc80aae17039bfa21bd989c5717730c5ef10cf2a6f09841576d012ec');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','8901ee24116f7998bddcfc8d2492bff8138d9c66a23caea75c24d594ef4a504d');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
|
|
@@ -32,7 +32,7 @@ function processHelmCharts(source, registryAliases) {
|
|
|
32
32
|
if (isOCIRegistry(source.repositoryURL)) {
|
|
33
33
|
const image = trimTrailingSlash(removeOCIPrefix(source.repositoryURL));
|
|
34
34
|
dep.datasource = DockerDatasource.id;
|
|
35
|
-
dep.packageName = getDep(image
|
|
35
|
+
dep.packageName = getDep(`${image}/${source.chartName}`, false, registryAliases).packageName;
|
|
36
36
|
} else {
|
|
37
37
|
dep.packageName = removeRepositoryName(source.repositoryName, source.chartName);
|
|
38
38
|
dep.registryUrls = [source.repositoryURL];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/sveltos/extract.ts"],"sourcesContent":["import { coerceArray } from '../../../util/array.ts';\nimport { trimTrailingSlash } from '../../../util/url.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport { isOCIRegistry, removeOCIPrefix } from '../helmv3/oci.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { ProfileDefinition, type SveltosHelmSource } from './schema.ts';\nimport { removeRepositoryName } from './util.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): PackageFileContent | null {\n const definitions = parseYaml(content, {\n customSchema: ProfileDefinition,\n failureBehaviour: 'filter',\n });\n\n const deps: PackageDependency[] = [];\n\n for (const definition of definitions) {\n const extractedDeps = extractDefinition(definition, config);\n deps.push(...extractedDeps);\n }\n\n return deps.length ? { deps } : null;\n}\n\nexport function extractDefinition(\n definition: ProfileDefinition,\n config?: ExtractConfig,\n): PackageDependency[] {\n return processAppSpec(definition, config);\n}\n\nfunction processHelmCharts(\n source: SveltosHelmSource,\n registryAliases: Record<string, string> | undefined,\n): PackageDependency | null {\n const dep: PackageDependency = {\n depName: source.chartName,\n currentValue: source.chartVersion,\n datasource: HelmDatasource.id,\n };\n\n if (isOCIRegistry(source.repositoryURL)) {\n const image = trimTrailingSlash(removeOCIPrefix(source.repositoryURL));\n\n dep.datasource = DockerDatasource.id;\n dep.packageName = getDep(image
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/sveltos/extract.ts"],"sourcesContent":["import { coerceArray } from '../../../util/array.ts';\nimport { trimTrailingSlash } from '../../../util/url.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport { isOCIRegistry, removeOCIPrefix } from '../helmv3/oci.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { ProfileDefinition, type SveltosHelmSource } from './schema.ts';\nimport { removeRepositoryName } from './util.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): PackageFileContent | null {\n const definitions = parseYaml(content, {\n customSchema: ProfileDefinition,\n failureBehaviour: 'filter',\n });\n\n const deps: PackageDependency[] = [];\n\n for (const definition of definitions) {\n const extractedDeps = extractDefinition(definition, config);\n deps.push(...extractedDeps);\n }\n\n return deps.length ? { deps } : null;\n}\n\nexport function extractDefinition(\n definition: ProfileDefinition,\n config?: ExtractConfig,\n): PackageDependency[] {\n return processAppSpec(definition, config);\n}\n\nfunction processHelmCharts(\n source: SveltosHelmSource,\n registryAliases: Record<string, string> | undefined,\n): PackageDependency | null {\n const dep: PackageDependency = {\n depName: source.chartName,\n currentValue: source.chartVersion,\n datasource: HelmDatasource.id,\n };\n\n if (isOCIRegistry(source.repositoryURL)) {\n const image = trimTrailingSlash(removeOCIPrefix(source.repositoryURL));\n\n dep.datasource = DockerDatasource.id;\n dep.packageName = getDep(\n `${image}/${source.chartName}`,\n false,\n registryAliases,\n ).packageName;\n } else {\n dep.packageName = removeRepositoryName(\n source.repositoryName,\n source.chartName,\n );\n dep.registryUrls = [source.repositoryURL];\n dep.datasource = HelmDatasource.id;\n }\n\n return dep;\n}\n\nfunction processAppSpec(\n definition: ProfileDefinition,\n config?: ExtractConfig,\n): PackageDependency[] {\n const deps: PackageDependency[] = [];\n\n const depType = definition.kind;\n\n const helmCharts =\n definition.kind === 'ClusterPromotion'\n ? definition.spec?.profileSpec?.helmCharts\n : definition.spec?.helmCharts;\n\n for (const source of coerceArray(helmCharts)) {\n const dep = processHelmCharts(source, config?.registryAliases);\n if (dep) {\n dep.depType = depType;\n deps.push(dep);\n }\n }\n\n return deps;\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,MAAM,cAAc,UAAU,SAAS;EACrC,cAAc;EACd,kBAAkB;CACpB,CAAC;CAED,MAAM,OAA4B,CAAC;CAEnC,KAAK,MAAM,cAAc,aAAa;EACpC,MAAM,gBAAgB,kBAAkB,YAAY,MAAM;EAC1D,KAAK,KAAK,GAAG,aAAa;CAC5B;CAEA,OAAO,KAAK,SAAS,EAAE,KAAK,IAAI;AAClC;AAEA,SAAgB,kBACd,YACA,QACqB;CACrB,OAAO,eAAe,YAAY,MAAM;AAC1C;AAEA,SAAS,kBACP,QACA,iBAC0B;CAC1B,MAAM,MAAyB;EAC7B,SAAS,OAAO;EAChB,cAAc,OAAO;EACrB,YAAY,eAAe;CAC7B;CAEA,IAAI,cAAc,OAAO,aAAa,GAAG;EACvC,MAAM,QAAQ,kBAAkB,gBAAgB,OAAO,aAAa,CAAC;EAErE,IAAI,aAAa,iBAAiB;EAClC,IAAI,cAAc,OAChB,GAAG,MAAM,GAAG,OAAO,aACnB,OACA,eACF,CAAC,CAAC;CACJ,OAAO;EACL,IAAI,cAAc,qBAChB,OAAO,gBACP,OAAO,SACT;EACA,IAAI,eAAe,CAAC,OAAO,aAAa;EACxC,IAAI,aAAa,eAAe;CAClC;CAEA,OAAO;AACT;AAEA,SAAS,eACP,YACA,QACqB;CACrB,MAAM,OAA4B,CAAC;CAEnC,MAAM,UAAU,WAAW;CAE3B,MAAM,aACJ,WAAW,SAAS,qBAChB,WAAW,MAAM,aAAa,aAC9B,WAAW,MAAM;CAEvB,KAAK,MAAM,UAAU,YAAY,UAAU,GAAG;EAC5C,MAAM,MAAM,kBAAkB,QAAQ,QAAQ,eAAe;EAC7D,IAAI,KAAK;GACP,IAAI,UAAU;GACd,KAAK,KAAK,GAAG;EACf;CACF;CAEA,OAAO;AACT"}
|
|
@@ -16,12 +16,6 @@ declare function getBranchPr(branchName: string): Promise<Pr | null>;
|
|
|
16
16
|
declare function getBranchStatus(branchName: string, internalChecksAsSuccess: boolean): Promise<BranchStatus>;
|
|
17
17
|
declare function getBranchStatusCheck(branchName: string, context: string): Promise<BranchStatus | null>;
|
|
18
18
|
declare function setBranchStatus({ branchName, context, description, state, url: targetUrl }: BranchStatusConfig): Promise<void>;
|
|
19
|
-
declare function findIssue(title: string): Promise<Issue | null>;
|
|
20
|
-
/**
|
|
21
|
-
* Remove or transform markdown into Bitbucket supported syntax.
|
|
22
|
-
*
|
|
23
|
-
* See https://bitbucket.org/tutorials/markdowndemo/src for supported markdown syntax
|
|
24
|
-
*/
|
|
25
19
|
/**
|
|
26
20
|
* Remove or transform markdown into Bitbucket supported syntax.
|
|
27
21
|
*
|
|
@@ -29,7 +23,8 @@ declare function findIssue(title: string): Promise<Issue | null>;
|
|
|
29
23
|
*/
|
|
30
24
|
declare function massageMarkdown(input: string): string;
|
|
31
25
|
declare function maxBodyLength(): number;
|
|
32
|
-
declare function
|
|
26
|
+
declare function findIssue(title: string): Promise<Issue | null>;
|
|
27
|
+
declare function ensureIssue({ title }: EnsureIssueConfig): Promise<EnsureIssueResult | null>;
|
|
33
28
|
declare function getIssueList(): Promise<Issue[]>;
|
|
34
29
|
declare function ensureIssueClosing(title: string): Promise<void>;
|
|
35
30
|
declare function addAssignees(_prNr: number, _assignees: string[]): Promise<void>;
|
|
@@ -16,7 +16,6 @@ import { getUrl, initRepo as initRepo$1 } from "../../../util/git/index.js";
|
|
|
16
16
|
import { aggressiveRepoCacheProvider, repoCacheProvider } from "../../../util/http/cache/repository-http-cache-provider.js";
|
|
17
17
|
import { repoFingerprint } from "../util.js";
|
|
18
18
|
import { smartTruncate } from "../utils/pr-body.js";
|
|
19
|
-
import readOnlyIssueBody from "../utils/read-only-issue-body.js";
|
|
20
19
|
import { REOPEN_PR_COMMENT_KEYWORD, ensureComment as ensureComment$1, ensureCommentRemoval as ensureCommentRemoval$1, reopenComments } from "./comments.js";
|
|
21
20
|
import { buildStates, mergeBodyTransformer, prInfo } from "./utils.js";
|
|
22
21
|
import { BitbucketPrCache } from "./pr-cache.js";
|
|
@@ -153,7 +152,6 @@ async function initRepo({ repository, cloneSubmodules, cloneSubmodulesFilter })
|
|
|
153
152
|
...config,
|
|
154
153
|
owner: info.owner,
|
|
155
154
|
mergeMethod: info.mergeMethod,
|
|
156
|
-
has_issues: info.has_issues,
|
|
157
155
|
is_private: info.is_private
|
|
158
156
|
};
|
|
159
157
|
logger.debug(`${repository} owner = ${config.owner}`);
|
|
@@ -309,41 +307,6 @@ async function setBranchStatus({ branchName, context, description, state, url: t
|
|
|
309
307
|
const branchStatusesUrl = bitbucketHttp.resolveUrl(`/2.0/repositories/${config.repository}/commit/${sha}/statuses`).toString();
|
|
310
308
|
aggressiveRepoCacheProvider.markSynced("get", branchStatusesUrl, false);
|
|
311
309
|
}
|
|
312
|
-
async function findOpenIssues(title) {
|
|
313
|
-
try {
|
|
314
|
-
const filters = [`title=${JSON.stringify(title)}`, "(state = \"new\" OR state = \"open\")"];
|
|
315
|
-
if (renovateUserUuid) filters.push(`reporter.uuid="${renovateUserUuid}"`);
|
|
316
|
-
const filter = encodeURIComponent(filters.join(" AND "));
|
|
317
|
-
// v8 ignore next -- TODO: add test #40625
|
|
318
|
-
return (await bitbucketHttp.getJsonUnchecked(`/2.0/repositories/${config.repository}/issues?q=${filter}`, { cacheProvider: aggressiveRepoCacheProvider })).body.values || [];
|
|
319
|
-
} catch (err) /* v8 ignore next -- defensive: issue search failures are logged and mapped to [], not simulated in specs */ {
|
|
320
|
-
logger.warn({ err }, "Error finding issues");
|
|
321
|
-
return [];
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
async function findIssue(title) {
|
|
325
|
-
logger.debug(`findIssue(${title})`);
|
|
326
|
-
/* v8 ignore next -- specs initialize repos with the issue tracker enabled */
|
|
327
|
-
if (!config.has_issues) {
|
|
328
|
-
logger.debug("Issues are disabled - cannot findIssue");
|
|
329
|
-
return null;
|
|
330
|
-
}
|
|
331
|
-
const issues = await findOpenIssues(title);
|
|
332
|
-
if (!issues.length) return null;
|
|
333
|
-
const [issue] = issues;
|
|
334
|
-
return {
|
|
335
|
-
number: issue.id,
|
|
336
|
-
body: issue.content?.raw
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
async function closeIssue(issueNumber) {
|
|
340
|
-
await bitbucketHttp.putJson(`/2.0/repositories/${config.repository}/issues/${issueNumber}`, { body: { state: "closed" } });
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Remove or transform markdown into Bitbucket supported syntax.
|
|
344
|
-
*
|
|
345
|
-
* See https://bitbucket.org/tutorials/markdowndemo/src for supported markdown syntax
|
|
346
|
-
*/
|
|
347
310
|
/**
|
|
348
311
|
* Remove or transform markdown into Bitbucket supported syntax.
|
|
349
312
|
*
|
|
@@ -402,77 +365,28 @@ function massageDetailSummaryHtmlToNestedLists(body) {
|
|
|
402
365
|
function maxBodyLength() {
|
|
403
366
|
return 25e4;
|
|
404
367
|
}
|
|
405
|
-
|
|
406
|
-
logger.debug(
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
if (!issues.length && reuseTitle) issues = await findOpenIssues(reuseTitle);
|
|
418
|
-
if (issues.length) {
|
|
419
|
-
for (const issue of issues.slice(1)) await closeIssue(issue.id);
|
|
420
|
-
const [issue] = issues;
|
|
421
|
-
if (issue.title !== title || String(issue.content?.raw).trim() !== description.trim() || issue.kind !== issueKind) {
|
|
422
|
-
logger.debug("Issue updated");
|
|
423
|
-
await bitbucketHttp.putJson(`/2.0/repositories/${config.repository}/issues/${issue.id}`, { body: {
|
|
424
|
-
kind: issueKind,
|
|
425
|
-
content: {
|
|
426
|
-
raw: readOnlyIssueBody(description),
|
|
427
|
-
markup: "markdown"
|
|
428
|
-
}
|
|
429
|
-
} });
|
|
430
|
-
return "updated";
|
|
431
|
-
}
|
|
432
|
-
} else {
|
|
433
|
-
logger.info("Issue created");
|
|
434
|
-
await bitbucketHttp.postJson(`/2.0/repositories/${config.repository}/issues`, { body: {
|
|
435
|
-
title,
|
|
436
|
-
kind: issueKind,
|
|
437
|
-
content: {
|
|
438
|
-
raw: readOnlyIssueBody(description),
|
|
439
|
-
markup: "markdown"
|
|
440
|
-
}
|
|
441
|
-
} });
|
|
442
|
-
return "created";
|
|
443
|
-
}
|
|
444
|
-
} catch (err) /* v8 ignore next -- issue creation failure handling is not mocked in specs */ {
|
|
445
|
-
if (err.message.startsWith("Repository has no issue tracker.")) logger.debug(`Issues are disabled, so could not create issue: ${title}`);
|
|
446
|
-
else logger.warn({ err }, "Could not ensure issue");
|
|
447
|
-
}
|
|
448
|
-
return null;
|
|
368
|
+
function logIssuesRemoved() {
|
|
369
|
+
logger.once.debug("Bitbucket Cloud has removed its issue tracker, so Renovate features which rely on issues, like the Dependency Dashboard, do not work. See https://developer.atlassian.com/cloud/bitbucket/changelog/#CHANGE-3071");
|
|
370
|
+
}
|
|
371
|
+
function findIssue(title) {
|
|
372
|
+
logger.debug(`findIssue(${title})`);
|
|
373
|
+
logIssuesRemoved();
|
|
374
|
+
return Promise.resolve(null);
|
|
375
|
+
}
|
|
376
|
+
function ensureIssue({ title }) {
|
|
377
|
+
logger.once.warn({ title }, "Cannot ensure issue");
|
|
378
|
+
logIssuesRemoved();
|
|
379
|
+
return Promise.resolve(null);
|
|
449
380
|
}
|
|
450
|
-
|
|
451
|
-
async function getIssueList() {
|
|
381
|
+
function getIssueList() {
|
|
452
382
|
logger.debug(`getIssueList()`);
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
return [];
|
|
456
|
-
}
|
|
457
|
-
try {
|
|
458
|
-
const filters = ["(state = \"new\" OR state = \"open\")"];
|
|
459
|
-
if (renovateUserUuid) filters.push(`reporter.uuid="${renovateUserUuid}"`);
|
|
460
|
-
const filter = encodeURIComponent(filters.join(" AND "));
|
|
461
|
-
const url = `/2.0/repositories/${config.repository}/issues?q=${filter}`;
|
|
462
|
-
return (await bitbucketHttp.getJsonUnchecked(url, { cacheProvider: repoCacheProvider })).body.values || [];
|
|
463
|
-
} catch (err) {
|
|
464
|
-
logger.warn({ err }, "Error finding issues");
|
|
465
|
-
return [];
|
|
466
|
-
}
|
|
383
|
+
logIssuesRemoved();
|
|
384
|
+
return Promise.resolve([]);
|
|
467
385
|
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
|
-
const issues = await findOpenIssues(title);
|
|
475
|
-
for (const issue of issues) await closeIssue(issue.id);
|
|
386
|
+
function ensureIssueClosing(title) {
|
|
387
|
+
logger.debug(`ensureIssueClosing(${title})`);
|
|
388
|
+
logIssuesRemoved();
|
|
389
|
+
return Promise.resolve();
|
|
476
390
|
}
|
|
477
391
|
function addAssignees(_prNr, _assignees) {
|
|
478
392
|
logger.warn("Cannot add assignees");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["promises.map","hostRules.find","git.getUrl","git.initRepo","utils.prInfo","reopenComments","comments.reopenComments","comments.REOPEN_PR_COMMENT_KEYWORD","utils.buildStates","comments.ensureComment","comments.ensureCommentRemoval"],"sources":["../../../../lib/modules/platform/bitbucket/index.ts"],"sourcesContent":["import { isNonEmptyArray, isNonEmptyString } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { REPOSITORY_NOT_FOUND } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { getInheritedOrGlobal, parseJson } from '../../../util/common.ts';\nimport * as git from '../../../util/git/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport type { BitbucketHttpOptions } from '../../../util/http/bitbucket.ts';\nimport { BitbucketHttp, setBaseUrl } from '../../../util/http/bitbucket.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport {\n aggressiveRepoCacheProvider,\n repoCacheProvider,\n} from '../../../util/http/cache/repository-http-cache-provider.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport * as promises from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { UUIDRegex, matchRegexOrGlobList } from '../../../util/string-match.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type {\n AutodiscoverConfig,\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport { readOnlyIssueBody } from '../utils/read-only-issue-body.ts';\nimport * as comments from './comments.ts';\nimport { BitbucketPrCache } from './pr-cache.ts';\nimport {\n RepoInfo,\n Repositories,\n UnresolvedPrTasks,\n WorkspaceAccesses,\n} from './schema.ts';\nimport type {\n Account,\n BitbucketStatus,\n BranchResponse,\n Config,\n EffectiveReviewer,\n PagedResult,\n PrResponse,\n RepoBranchingModel,\n} from './types.ts';\nimport * as utils from './utils.ts';\nimport { mergeBodyTransformer } from './utils.ts';\n\nexport const id = 'bitbucket';\n\nconst bitbucketHttp = new BitbucketHttp();\n\nconst BITBUCKET_PROD_ENDPOINT = 'https://api.bitbucket.org/';\n\nlet config: Config = {} as any;\n\nexport function resetPlatform(): void {\n config = {} as any;\n renovateUserUuid = null;\n}\n\nconst defaults = { endpoint: BITBUCKET_PROD_ENDPOINT };\n\nconst pathSeparator = '/';\n\nlet renovateUserUuid: string | null = null;\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n token,\n}: PlatformParams): Promise<PlatformResult> {\n if (!(username && password) && !token) {\n throw new Error(\n 'Init: You must configure either a Bitbucket token or username and password',\n );\n }\n if (endpoint && endpoint !== BITBUCKET_PROD_ENDPOINT) {\n logger.warn(\n { endpoint, defaultEndpoint: BITBUCKET_PROD_ENDPOINT },\n 'Init: Bitbucket Cloud endpoint should generally be the default but is being configured to a different value. Did you mean to use Bitbucket Server?',\n );\n defaults.endpoint = endpoint;\n }\n setBaseUrl(defaults.endpoint);\n renovateUserUuid = null;\n const options: HttpOptions = { memCache: false };\n if (token) {\n options.token = token;\n } else {\n options.username = username;\n options.password = password;\n }\n try {\n const { uuid } = (\n await bitbucketHttp.getJsonUnchecked<Account>('/2.0/user', options)\n ).body;\n renovateUserUuid = uuid;\n } catch (err) {\n if (\n err.statusCode === 403 &&\n err.body?.error?.detail?.required?.includes('account')\n ) {\n logger.warn(`Bitbucket: missing 'account' scope for password`);\n } else {\n logger.debug({ err }, 'Unknown error fetching Bitbucket user identity');\n }\n }\n // TODO: Add a connection check that endpoint/username/password combination are valid (#9594)\n const platformConfig: PlatformResult = {\n endpoint: endpoint ?? BITBUCKET_PROD_ENDPOINT,\n };\n return Promise.resolve(platformConfig);\n}\n\n// Get all repositories that the user has access to\nexport async function getRepos(config: AutodiscoverConfig): Promise<string[]> {\n logger.debug('Autodiscovering Bitbucket Cloud repositories');\n try {\n // Determine which workspaces to query.\n // If the caller supplied explicit namespaces use them directly;\n // otherwise discover all workspaces the authenticated user belongs to.\n // The old cross-workspace endpoint GET /2.0/repositories?role=contributor\n // was removed by Bitbucket on 2026-03-31 (CHANGE-2770).\n let workspaceSlugs: string[];\n const autodiscoverNamespaces = config.namespaces;\n if (isNonEmptyArray(autodiscoverNamespaces)) {\n logger.debug(\n { autodiscoverNamespaces },\n 'Using configured namespaces as Bitbucket workspaces',\n );\n workspaceSlugs = autodiscoverNamespaces;\n } else {\n logger.debug('Fetching Bitbucket workspaces for the current user');\n const { body: slugs } = await bitbucketHttp.getJson(\n '/2.0/user/workspaces',\n { paginate: true },\n WorkspaceAccesses,\n );\n workspaceSlugs = slugs;\n logger.debug(\n { workspaceSlugs },\n `Found ${workspaceSlugs.length} Bitbucket workspace(s)`,\n );\n }\n\n // Fetch repositories for every workspace in parallel (concurrency-limited).\n const repoArrays = await promises.map(workspaceSlugs, (workspace) =>\n bitbucketHttp\n .getJson(\n `/2.0/repositories/${workspace}`,\n { paginate: true },\n Repositories,\n )\n .then(({ body }) => body),\n );\n\n let repos = repoArrays.flat();\n\n // if autodiscoverProjects is configured, filter the repos list\n const autodiscoverProjects = config.projects;\n if (isNonEmptyArray(autodiscoverProjects)) {\n logger.debug(\n { autodiscoverProjects: config.projects },\n 'Applying autodiscoverProjects filter',\n );\n repos = repos.filter(\n (repo) =>\n repo.projectName &&\n matchRegexOrGlobList(repo.projectName, autodiscoverProjects),\n );\n }\n\n return repos.map(({ owner, name }) => `${owner}/${name}`);\n } catch (err) /* v8 ignore next -- defensive: repo listing failures are logged and rethrown, not simulated in specs */ {\n logger.error({ err }, `bitbucket getRepos error`);\n throw err;\n }\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n // See: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/src/%7Bcommit%7D/%7Bpath%7D\n const repo = repoName ?? config.repository;\n const path = fileName;\n\n let finalBranchOrTag = branchOrTag;\n if (branchOrTag?.includes(pathSeparator)) {\n // Branch name contains slash, so we have to replace branch name with SHA1 of the head commit; otherwise the API will not work.\n finalBranchOrTag = await getBranchCommit(branchOrTag);\n }\n\n const url = `/2.0/repositories/${repo}/src/${finalBranchOrTag ?? `HEAD`}/${path}`;\n const res = await bitbucketHttp.getText(url, {\n cacheProvider: repoCacheProvider,\n });\n return res.body;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n // TODO #22198\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\n// Initialize bitbucket by getting base branch and SHA\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(\"${repository}\")`);\n const opts = hostRules.find({\n hostType: 'bitbucket',\n url: defaults.endpoint,\n });\n config = {\n repository,\n ignorePrAuthor: GlobalConfig.get('ignorePrAuthor'),\n } as Config;\n let info: RepoInfo;\n let mainBranch: string;\n try {\n const { body: repoInfo } = await bitbucketHttp.getJson(\n `/2.0/repositories/${repository}`,\n RepoInfo,\n );\n info = repoInfo;\n\n mainBranch = info.mainbranch;\n\n if (getInheritedOrGlobal('bbUseDevelopmentBranch')) {\n // Fetch Bitbucket development branch\n const developmentBranch = (\n await bitbucketHttp.getJsonUnchecked<RepoBranchingModel>(\n `/2.0/repositories/${repository}/branching-model`,\n )\n ).body.development?.branch?.name;\n\n if (developmentBranch) {\n mainBranch = developmentBranch;\n }\n }\n\n config.defaultBranch = mainBranch;\n\n config = {\n ...config,\n owner: info.owner,\n mergeMethod: info.mergeMethod,\n has_issues: info.has_issues,\n is_private: info.is_private,\n };\n\n logger.debug(`${repository} owner = ${config.owner}`);\n } catch (err) /* v8 ignore next -- initRepo error mapping (404 to not-found) is not mocked in specs */ {\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n logger.debug({ err }, 'Unknown Bitbucket initRepo error');\n throw err;\n }\n\n const parsedEndpoint = parseUrl(defaults.endpoint);\n // v8 ignore if: endpoint is a constant\n if (!parsedEndpoint) {\n throw new Error(`Invalid Bitbucket endpoint: ${defaults.endpoint}`);\n }\n const { hostname } = parsedEndpoint;\n\n // Converts API hostnames to their respective HTTP git hosts:\n // `api.bitbucket.org` to `bitbucket.org`\n // `api-staging.<host>` to `staging.<host>`\n // TODO #22198\n const hostnameWithoutApiPrefix = regEx(/api[.|-](.+)/).exec(hostname)?.[1];\n\n let auth = '';\n if (opts.token) {\n auth = `x-token-auth:${opts.token}`;\n } else if (opts.password?.startsWith('ATAT')) {\n auth = `x-bitbucket-api-token-auth:${opts.password}`;\n } else {\n auth = `${opts.username!}:${opts.password!}`;\n }\n\n const url = git.getUrl({\n protocol: 'https',\n auth,\n hostname: hostnameWithoutApiPrefix,\n repository,\n });\n\n await git.initRepo({\n ...config,\n url,\n cloneSubmodules,\n cloneSubmodulesFilter,\n });\n const repoConfig: RepoResult = {\n defaultBranch: mainBranch,\n isFork: info.isFork,\n repoFingerprint: repoFingerprint(info.uuid, defaults.endpoint),\n };\n return repoConfig;\n}\n\n/* v8 ignore next -- covered only through findPr callers, never invoked directly in specs */\nfunction matchesState(state: string, desiredState: string): boolean {\n if (desiredState === 'all') {\n return true;\n }\n if (desiredState.startsWith('!')) {\n return state !== desiredState.substring(1);\n }\n return state === desiredState;\n}\n\nexport async function getPrList(): Promise<Pr[]> {\n logger.trace('getPrList()');\n return await BitbucketPrCache.getPrs(\n bitbucketHttp,\n config.repository,\n renovateUserUuid,\n );\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n includeOtherAuthors,\n}: FindPRConfig): Promise<Pr | null> {\n logger.debug(`findPr(${branchName}, ${prTitle}, ${state})`);\n\n if (includeOtherAuthors) {\n // PR might have been created by anyone, so don't use the cached Renovate PR list\n const prs = (\n await bitbucketHttp.getJsonUnchecked<PagedResult<PrResponse>>(\n `/2.0/repositories/${config.repository}/pullrequests?q=source.branch.name=\"${branchName}\"&state=open`,\n { cacheProvider: memCacheProvider },\n )\n ).body.values;\n\n if (prs.length === 0) {\n logger.debug(`No PR found for branch ${branchName}`);\n return null;\n }\n\n return utils.prInfo(prs[0]);\n }\n\n const prList = await getPrList();\n const pr = prList.find(\n (p) =>\n p.sourceBranch === branchName &&\n (!prTitle || p.title.toUpperCase() === prTitle.toUpperCase()) &&\n matchesState(p.state, state),\n );\n\n if (!pr) {\n return null;\n }\n logger.debug(`Found PR #${pr.number}`);\n\n /**\n * Bitbucket doesn't support renaming or reopening declined PRs.\n * Instead, we have to use comment-driven signals.\n */\n if (pr.state === 'closed') {\n const reopenComments = await comments.reopenComments(config, pr.number);\n\n if (isNonEmptyArray(reopenComments)) {\n if (config.is_private) {\n // Only workspace members could have commented on a private repository\n logger.debug(\n `Found '${comments.REOPEN_PR_COMMENT_KEYWORD}' comment from workspace member. Renovate will reopen PR ${pr.number} as a new PR`,\n );\n return null;\n }\n\n for (const comment of reopenComments) {\n if (await isAccountMemberOfWorkspace(comment.user, config.repository)) {\n logger.debug(\n `Found '${comments.REOPEN_PR_COMMENT_KEYWORD}' comment from workspace member. Renovate will reopen PR ${pr.number} as a new PR`,\n );\n return null;\n }\n }\n }\n }\n\n return pr;\n}\n\n// Gets details for a PR\nexport async function getPr(prNo: number): Promise<Pr | null> {\n const pr = (\n await bitbucketHttp.getJsonUnchecked<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n )\n ).body;\n\n /* v8 ignore next -- defensive: the PR endpoint returns a body or throws, never an empty body */\n if (!pr) {\n return null;\n }\n\n const res: Pr = {\n ...utils.prInfo(pr),\n };\n\n if (isNonEmptyArray(pr.reviewers)) {\n res.reviewers = pr.reviewers\n .map(({ uuid }) => uuid)\n .filter(isNonEmptyString);\n }\n\n return res;\n}\n\nfunction escapeHash(input: string): string {\n return input?.replace(regEx(/#/g), '%23');\n}\n\n// Return the commit SHA for a branch\nasync function getBranchCommit(\n branchName: string,\n): Promise<string | undefined> {\n try {\n const branch = (\n await bitbucketHttp.getJsonUnchecked<BranchResponse>(\n `/2.0/repositories/${config.repository}/refs/branches/${escapeHash(\n branchName,\n )}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n )\n ).body;\n return branch.target.hash;\n } catch (err) /* v8 ignore next -- defensive: missing branch is logged and mapped to undefined, not mocked in specs */ {\n logger.debug({ err }, `getBranchCommit('${branchName}') failed'`);\n return undefined;\n }\n}\n\n// Returns the Pull Request for a branch. Null if not exists.\nexport async function getBranchPr(branchName: string): Promise<Pr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const existingPr = await findPr({\n branchName,\n state: 'open',\n });\n return existingPr ? getPr(existingPr.number) : null;\n}\n\nasync function getStatus(\n branchName: string,\n memCache = true,\n): Promise<BitbucketStatus[]> {\n const sha = await getBranchCommit(branchName);\n const opts: BitbucketHttpOptions = { paginate: true };\n /* v8 ignore next: temporary code */\n if (memCache) {\n opts.cacheProvider = aggressiveRepoCacheProvider;\n } else {\n opts.memCache = false;\n }\n return (\n await bitbucketHttp.getJsonUnchecked<PagedResult<BitbucketStatus>>(\n `/2.0/repositories/${config.repository}/commit/${sha!}/statuses`,\n opts,\n )\n ).body.values;\n}\n// Returns the combined status for a branch.\nexport async function getBranchStatus(\n branchName: string,\n internalChecksAsSuccess: boolean,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n const statuses = await getStatus(branchName);\n logger.debug({ branch: branchName, statuses }, 'branch status check result');\n if (!statuses.length) {\n logger.debug('empty branch status check result = returning \"pending\"');\n return 'yellow';\n }\n const noOfFailures = statuses.filter(\n (status: { state: string }) =>\n status.state === 'FAILED' || status.state === 'STOPPED',\n ).length;\n if (noOfFailures) {\n return 'red';\n }\n const noOfPending = statuses.filter(\n (status: { state: string }) => status.state === 'INPROGRESS',\n ).length;\n if (noOfPending) {\n return 'yellow';\n }\n if (\n !internalChecksAsSuccess &&\n statuses.every(\n (status) =>\n status.state === 'SUCCESSFUL' && status.key?.startsWith('renovate/'),\n )\n ) {\n logger.debug(\n 'Successful checks are all internal renovate/ checks, so returning \"pending\" branch status',\n );\n return 'yellow';\n }\n return 'green';\n}\n\nconst bbToRenovateStatusMapping: Record<string, BranchStatus> = {\n SUCCESSFUL: 'green',\n INPROGRESS: 'yellow',\n FAILED: 'red',\n};\n\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n const statuses = await getStatus(branchName);\n const bbState = statuses.find((status) => status.key === context)?.state;\n // TODO #22198\n return bbToRenovateStatusMapping[bbState!] || null;\n}\n\nexport async function setBranchStatus({\n branchName,\n context,\n description,\n state,\n url: targetUrl,\n}: BranchStatusConfig): Promise<void> {\n const sha = await getBranchCommit(branchName);\n\n // TargetUrl can not be empty so default to bitbucket\n /* v8 ignore next -- specs always pass a targetUrl, fallback exists for direct API constraints */\n const url = targetUrl ?? 'https://bitbucket.org';\n\n const body = {\n name: context,\n state: utils.buildStates[state],\n key: context,\n description,\n url,\n };\n\n await bitbucketHttp.postJson(\n `/2.0/repositories/${config.repository}/commit/${sha}/statuses/build`,\n { body },\n );\n\n // invalidate status cache\n const branchStatusesUrl = bitbucketHttp\n .resolveUrl(`/2.0/repositories/${config.repository}/commit/${sha}/statuses`)\n .toString();\n aggressiveRepoCacheProvider.markSynced('get', branchStatusesUrl, false);\n}\n\ninterface BbIssue {\n id: number;\n title: string;\n kind: string;\n content?: { raw: string };\n}\n\nasync function findOpenIssues(title: string): Promise<BbIssue[]> {\n try {\n const filters = [\n `title=${JSON.stringify(title)}`,\n '(state = \"new\" OR state = \"open\")',\n ];\n if (renovateUserUuid) {\n filters.push(`reporter.uuid=\"${renovateUserUuid}\"`);\n }\n const filter = encodeURIComponent(filters.join(' AND '));\n // v8 ignore next -- TODO: add test #40625\n return (\n (\n await bitbucketHttp.getJsonUnchecked<{ values: BbIssue[] }>(\n `/2.0/repositories/${config.repository}/issues?q=${filter}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n )\n ).body.values || []\n );\n } catch (err) /* v8 ignore next -- defensive: issue search failures are logged and mapped to [], not simulated in specs */ {\n logger.warn({ err }, 'Error finding issues');\n return [];\n }\n}\n\nexport async function findIssue(title: string): Promise<Issue | null> {\n logger.debug(`findIssue(${title})`);\n\n /* v8 ignore next -- specs initialize repos with the issue tracker enabled */\n if (!config.has_issues) {\n logger.debug('Issues are disabled - cannot findIssue');\n return null;\n }\n const issues = await findOpenIssues(title);\n if (!issues.length) {\n return null;\n }\n const [issue] = issues;\n return {\n number: issue.id,\n body: issue.content?.raw,\n };\n}\n\nasync function closeIssue(issueNumber: number): Promise<void> {\n await bitbucketHttp.putJson(\n `/2.0/repositories/${config.repository}/issues/${issueNumber}`,\n {\n body: { state: 'closed' },\n },\n );\n}\n\n/**\n * Remove or transform markdown into Bitbucket supported syntax.\n *\n * See https://bitbucket.org/tutorials/markdowndemo/src for supported markdown syntax\n */\n/**\n * Remove or transform markdown into Bitbucket supported syntax.\n *\n * See https://bitbucket.org/tutorials/markdowndemo/src for supported markdown syntax\n */\nexport function massageMarkdown(input: string): string {\n let massaged = smartTruncate(input, maxBodyLength())\n .replace(\n 'you tick the rebase/retry checkbox',\n 'by renaming this PR to start with \"rebase!\"',\n )\n .replace(\n 'checking the rebase/retry box above',\n 'renaming the PR to start with \"rebase!\"',\n )\n .replace(\n regEx(\n /<details>\\n(<summary>View abandoned dependencies.*<\\/summary>\\n\\n)([\\s\\S]*?)<\\/details>/,\n ),\n '$2',\n )\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?\\n`), '')\n .replace(regEx(/\\]\\(\\.\\.\\/issues\\//g), '](../../issues/')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](../../pull-requests/')\n .replace(regEx(/<!--renovate-(?:debug|config-hash):.*?-->/g), '');\n\n massaged = massageDetailSummaryHtmlToNestedLists(massaged);\n\n return massageCodeblockMarkdown(massaged);\n}\n\n/**\n * Massage codeblocks indentation to ensure correct rendering in Bitbucket.\n */\nfunction massageCodeblockMarkdown(body: string): string {\n const codeBlockRegex = regEx(\n /^(?<indent>[ \\t]*)```(?<lang>\\w*)[^\\n]*\\n(?<code>[\\s\\S]*?)\\n[ \\t]*```/gm,\n );\n let codeMatch;\n let result = body;\n\n while ((codeMatch = codeBlockRegex.exec(body)) !== null) {\n const { indent, lang, code } = codeMatch.groups!;\n const indentLength = indent.length;\n const lines = code.split('\\n');\n const cleanedLines = lines.map((line) =>\n // Remove `indentLength` characters from the start of each line\n line.slice(indentLength),\n );\n\n const cleaned = cleanedLines.join('\\n');\n const replacement = `\\`\\`\\`${lang}\\n${cleaned}\\n\\`\\`\\``;\n\n result = result.replace(codeMatch[0], replacement);\n }\n\n return result;\n}\n\n/**\n * Massage collapsible html sections into nested unordered lists.\n *\n * Bitbucket doesn't currently support collapsible syntax; https://jira.atlassian.com/browse/BCLOUD-20231\n */\nfunction massageDetailSummaryHtmlToNestedLists(body: string): string {\n let depth = 0;\n // Parse detail parts to calculate correct list depth\n const detailsParts = body.split('<details>').map((raw) => {\n const partDepth = depth;\n\n depth += 1;\n const countClosingDetailsTags = raw.split('</details>').length - 1;\n depth = Math.max(0, depth - countClosingDetailsTags);\n\n return { raw, partDepth };\n });\n\n // Reassemble parts while replacing collapsible html elements with markdown list\n return detailsParts\n .map(({ raw, partDepth }) => {\n let t = raw;\n\n if (partDepth === 0) {\n return t;\n }\n\n const partIndentation = '\\t'.repeat(partDepth - 1);\n const nestedListItemIndentation = '\\t'.repeat(partDepth);\n\n const rawContainsBlockquote = raw.includes('<blockquote>');\n\n t = t.replace(regEx(/<\\/?summary>/g), partDepth === 1 ? '**' : '`');\n\n if (partDepth > 1) {\n t = t.replace(\n regEx(/^([ \\t]*- [`[])/gm),\n `${nestedListItemIndentation}$1`,\n );\n }\n\n let result = partIndentation;\n if (rawContainsBlockquote || partDepth > 1) {\n result += ' - ';\n }\n result += t;\n\n return result;\n })\n .join('')\n .replace(regEx(/<\\/?(summary|details|blockquote)>/g), '');\n}\n\nexport function maxBodyLength(): number {\n return 250000;\n}\n\nexport async function ensureIssue({\n title,\n reuseTitle,\n body,\n}: EnsureIssueConfig): Promise<EnsureIssueResult | null> {\n logger.debug(`ensureIssue()`);\n /* v8 ignore next -- specs initialize repos with the issue tracker enabled */\n if (!config.has_issues) {\n logger.debug('Issues are disabled - cannot ensureIssue');\n logger.debug(`Failed to ensure Issue with title:${title}`);\n return null;\n }\n try {\n let issues = await findOpenIssues(title);\n const description = massageMarkdown(sanitize(body));\n const issueKind = 'task';\n\n if (!issues.length && reuseTitle) {\n issues = await findOpenIssues(reuseTitle);\n }\n if (issues.length) {\n // Close any duplicates\n for (const issue of issues.slice(1)) {\n await closeIssue(issue.id);\n }\n const [issue] = issues;\n\n if (\n issue.title !== title ||\n String(issue.content?.raw).trim() !== description.trim() ||\n issue.kind !== issueKind\n ) {\n logger.debug('Issue updated');\n await bitbucketHttp.putJson(\n `/2.0/repositories/${config.repository}/issues/${issue.id}`,\n {\n body: {\n kind: issueKind,\n content: {\n raw: readOnlyIssueBody(description),\n markup: 'markdown',\n },\n },\n },\n );\n return 'updated';\n }\n } else {\n logger.info('Issue created');\n await bitbucketHttp.postJson(\n `/2.0/repositories/${config.repository}/issues`,\n {\n body: {\n title,\n kind: issueKind,\n content: {\n raw: readOnlyIssueBody(description),\n markup: 'markdown',\n },\n },\n },\n );\n return 'created';\n }\n } catch (err) /* v8 ignore next -- issue creation failure handling is not mocked in specs */ {\n if (err.message.startsWith('Repository has no issue tracker.')) {\n logger.debug(`Issues are disabled, so could not create issue: ${title}`);\n } else {\n logger.warn({ err }, 'Could not ensure issue');\n }\n }\n return null;\n}\n\n/* v8 ignore next -- exercised only through the dependency dashboard flow, which specs mock at a higher level */\nexport async function getIssueList(): Promise<Issue[]> {\n logger.debug(`getIssueList()`);\n\n if (!config.has_issues) {\n logger.debug('Issues are disabled - cannot getIssueList');\n return [];\n }\n try {\n const filters = ['(state = \"new\" OR state = \"open\")'];\n if (renovateUserUuid) {\n filters.push(`reporter.uuid=\"${renovateUserUuid}\"`);\n }\n const filter = encodeURIComponent(filters.join(' AND '));\n const url = `/2.0/repositories/${config.repository}/issues?q=${filter}`;\n const res = await bitbucketHttp.getJsonUnchecked<{ values: Issue[] }>(url, {\n cacheProvider: repoCacheProvider,\n });\n return res.body.values || [];\n } catch (err) {\n logger.warn({ err }, 'Error finding issues');\n return [];\n }\n}\n\nexport async function ensureIssueClosing(title: string): Promise<void> {\n /* v8 ignore next -- specs initialize repos with the issue tracker enabled */\n if (!config.has_issues) {\n logger.debug('Issues are disabled - cannot ensureIssueClosing');\n return;\n }\n const issues = await findOpenIssues(title);\n for (const issue of issues) {\n await closeIssue(issue.id);\n }\n}\n\nexport function addAssignees(\n _prNr: number,\n _assignees: string[],\n): Promise<void> {\n // Bitbucket supports \"participants\" and \"reviewers\" so does not seem to have the concept of \"assignee\"\n logger.warn('Cannot add assignees');\n return Promise.resolve();\n}\n\nexport async function addReviewers(\n prId: number,\n reviewers: string[],\n): Promise<void> {\n logger.debug(`Adding reviewers '${reviewers.join(', ')}' to #${prId}`);\n\n // TODO #22198\n const { title } = (await getPr(prId))!;\n\n const body = {\n title,\n reviewers: reviewers.map((username: string) => {\n const isUUID =\n username.startsWith('{') &&\n username.endsWith('}') &&\n UUIDRegex.test(username.slice(1, -1));\n const key = isUUID ? 'uuid' : 'username';\n return {\n [key]: username,\n };\n }),\n };\n\n await bitbucketHttp.putJson(\n `/2.0/repositories/${config.repository}/pullrequests/${prId}`,\n {\n body,\n },\n );\n}\n\n/* v8 ignore next -- stub: Bitbucket Cloud has no PR labels, callers never reach this */\nexport function deleteLabel(): never {\n throw new Error('deleteLabel not implemented');\n}\n\nexport function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n // https://developer.atlassian.com/bitbucket/api/2/reference/search?q=pullrequest+comment\n return comments.ensureComment({\n config,\n number,\n topic,\n content: sanitize(content),\n });\n}\n\nexport function ensureCommentRemoval(\n deleteConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n return comments.ensureCommentRemoval(config, deleteConfig);\n}\n\nasync function sanitizeReviewers(\n reviewers: Account[],\n err: any,\n): Promise<Account[] | undefined> {\n if (err.statusCode === 400 && err.body?.error?.fields?.reviewers) {\n const sanitizedReviewers: Account[] = [];\n\n const MSG_AUTHOR_AND_REVIEWER =\n 'is the author and cannot be included as a reviewer.';\n const MSG_MALFORMED_REVIEWERS_LIST = 'Malformed reviewers list';\n const MSG_NOT_WORKSPACE_MEMBER =\n 'is not a member of this workspace and cannot be added to this pull request';\n\n for (const msg of err.body.error.fields.reviewers) {\n // Bitbucket returns a 400 if any of the PR reviewer accounts are now inactive (ie: disabled/suspended)\n if (msg === MSG_MALFORMED_REVIEWERS_LIST) {\n logger.debug(\n { err },\n 'PR contains reviewers that may be either inactive or no longer a member of this workspace. Will try setting only active reviewers',\n );\n\n // Validate that each previous PR reviewer account is still active\n for (const reviewer of reviewers) {\n const reviewerUser = (\n await bitbucketHttp.getJsonUnchecked<Account>(\n `/2.0/users/${reviewer.uuid}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n )\n ).body;\n\n // There are cases where an active user may still not be a member of a workspace\n if (\n reviewerUser.account_status === 'active' &&\n (await isAccountMemberOfWorkspace(reviewer, config.repository))\n ) {\n sanitizedReviewers.push(reviewer);\n }\n }\n // Bitbucket returns a 400 if any of the PR reviewer accounts are no longer members of this workspace\n } else if (msg.endsWith(MSG_NOT_WORKSPACE_MEMBER)) {\n logger.debug(\n { err },\n 'PR contains reviewer accounts which are no longer member of this workspace. Will try setting only member reviewers',\n );\n\n // Validate that each previous PR reviewer account is still a member of this workspace\n for (const reviewer of reviewers) {\n if (await isAccountMemberOfWorkspace(reviewer, config.repository)) {\n sanitizedReviewers.push(reviewer);\n }\n }\n } else if (msg.endsWith(MSG_AUTHOR_AND_REVIEWER)) {\n logger.debug(\n { err },\n 'PR contains reviewer accounts which are also the author. Will try setting only non-author reviewers',\n );\n const author = msg.replace(MSG_AUTHOR_AND_REVIEWER, '').trim();\n for (const reviewer of reviewers) {\n if (reviewer.display_name !== author) {\n sanitizedReviewers.push(reviewer);\n }\n }\n } else {\n return undefined;\n }\n }\n\n return sanitizedReviewers;\n }\n\n return undefined;\n}\n\nasync function isAccountMemberOfWorkspace(\n reviewer: Account,\n repository: string,\n): Promise<boolean> {\n const workspace = repository.split('/')[0];\n\n try {\n await bitbucketHttp.get(\n `/2.0/workspaces/${workspace}/members/${reviewer.uuid}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n );\n\n return true;\n } catch (err) {\n // HTTP 404: User cannot be found, or the user is not a member of this workspace.\n if (err.statusCode === 404) {\n logger.debug(\n { err },\n `User ${reviewer.display_name} is not a member of the workspace ${workspace}. Will be removed from the PR`,\n );\n\n return false;\n }\n throw err;\n }\n}\n\n// Creates PR and returns PR number\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle: title,\n prBody: description,\n draftPR = false,\n platformPrOptions,\n}: CreatePRConfig): Promise<Pr> {\n // labels is not supported in Bitbucket: https://bitbucket.org/site/master/issues/11976/ability-to-add-labels-to-pull-requests-bb\n\n const base = targetBranch;\n\n logger.debug({ repository: config.repository, title, base }, 'Creating PR');\n\n let reviewers: Account[] = [];\n\n if (platformPrOptions?.bbUseDefaultReviewers) {\n const reviewersResponse = (\n await bitbucketHttp.getJsonUnchecked<PagedResult<EffectiveReviewer>>(\n `/2.0/repositories/${config.repository}/effective-default-reviewers`,\n {\n paginate: true,\n cacheProvider: aggressiveRepoCacheProvider,\n },\n )\n ).body;\n reviewers = reviewersResponse.values.map((reviewer: EffectiveReviewer) => ({\n uuid: reviewer.user.uuid,\n display_name: reviewer.user.display_name,\n }));\n }\n\n const body = {\n title,\n description: sanitize(description),\n source: {\n branch: {\n name: sourceBranch,\n },\n },\n destination: {\n branch: {\n name: base,\n },\n },\n close_source_branch: true,\n reviewers,\n draft: draftPR,\n };\n\n try {\n const prRes = (\n await bitbucketHttp.postJson<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests`,\n {\n body,\n },\n )\n ).body;\n const pr = utils.prInfo(prRes);\n await BitbucketPrCache.setPr(\n bitbucketHttp,\n config.repository,\n renovateUserUuid,\n pr,\n );\n if (platformPrOptions?.bbAutoResolvePrTasks) {\n await autoResolvePrTasks(pr);\n }\n return pr;\n } catch (err) /* v8 ignore next -- reviewer-sanitizing retry path depends on API error shapes not mocked in specs */ {\n // Try sanitizing reviewers\n const sanitizedReviewers = await sanitizeReviewers(reviewers, err);\n\n if (sanitizedReviewers === undefined) {\n logger.warn({ err }, 'Error creating pull request');\n throw err;\n } else {\n const prRes = (\n await bitbucketHttp.postJson<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests`,\n {\n body: {\n ...body,\n reviewers: sanitizedReviewers,\n },\n },\n )\n ).body;\n const pr = utils.prInfo(prRes);\n await BitbucketPrCache.setPr(\n bitbucketHttp,\n config.repository,\n renovateUserUuid,\n pr,\n );\n if (platformPrOptions?.bbAutoResolvePrTasks) {\n await autoResolvePrTasks(pr);\n }\n return pr;\n }\n }\n}\n\nasync function autoResolvePrTasks(pr: Pr): Promise<void> {\n logger.debug(`Auto resolve PR tasks in #${pr.number}`);\n try {\n const unResolvedTasks = (\n await bitbucketHttp.getJson(\n `/2.0/repositories/${config.repository}/pullrequests/${pr.number}/tasks`,\n { paginate: true, pagelen: 100 },\n UnresolvedPrTasks,\n )\n ).body;\n\n logger.trace(\n {\n prId: pr.number,\n listTaskRes: unResolvedTasks,\n },\n 'List PR tasks',\n );\n\n for (const task of unResolvedTasks) {\n const res = await bitbucketHttp.putJson(\n `/2.0/repositories/${config.repository}/pullrequests/${pr.number}/tasks/${task.id}`,\n {\n body: {\n state: 'RESOLVED',\n content: {\n raw: task.content.raw,\n },\n },\n },\n );\n logger.trace(\n {\n prId: pr.number,\n updateTaskResponse: res,\n },\n 'Put PR tasks - mark resolved',\n );\n }\n } catch (err) {\n logger.warn({ prId: pr.number, err }, 'Error resolving PR tasks');\n }\n}\n\nexport async function updatePr({\n number: prNo,\n prTitle: title,\n prBody: description,\n state,\n targetBranch,\n}: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prNo}, ${title}, body)`);\n // Updating a PR in Bitbucket will clear the reviewers if reviewers is not present\n const pr = (\n await bitbucketHttp.getJsonUnchecked<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}`,\n )\n ).body;\n\n let updatedPrRes: PrResponse;\n try {\n const body: any = {\n title,\n description: sanitize(description),\n reviewers: pr.reviewers,\n };\n if (targetBranch) {\n body.destination = {\n branch: {\n name: targetBranch,\n },\n };\n }\n\n updatedPrRes = (\n await bitbucketHttp.putJson<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}`,\n { body },\n )\n ).body;\n } catch (err) {\n // Try sanitizing reviewers\n const sanitizedReviewers = await sanitizeReviewers(pr.reviewers, err);\n\n if (sanitizedReviewers === undefined) {\n throw err;\n } else {\n updatedPrRes = (\n await bitbucketHttp.putJson<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}`,\n {\n body: {\n title,\n description: sanitize(description),\n reviewers: sanitizedReviewers,\n },\n },\n )\n ).body;\n }\n }\n\n if (state === 'closed' && pr) {\n await bitbucketHttp.postJson(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}/decline`,\n );\n }\n\n // update pr cache\n await BitbucketPrCache.setPr(\n bitbucketHttp,\n config.repository,\n renovateUserUuid,\n utils.prInfo({ ...updatedPrRes, ...(state && { state }) }),\n );\n}\n\nexport async function mergePr({\n branchName,\n id: prNo,\n strategy: mergeStrategy,\n}: MergePRConfig): Promise<boolean> {\n logger.debug(`mergePr(${prNo}, ${branchName}, ${mergeStrategy})`);\n\n // Bitbucket Cloud does not support a rebase-alike; https://jira.atlassian.com/browse/BCLOUD-16610\n if (mergeStrategy === 'rebase') {\n logger.warn('Bitbucket Cloud does not support a \"rebase\" strategy.');\n return false;\n }\n\n try {\n await bitbucketHttp.postJson(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}/merge`,\n {\n body: mergeBodyTransformer(mergeStrategy),\n },\n );\n logger.debug('Automerging succeeded');\n } catch (err) /* v8 ignore next -- defensive: merge failures are logged and mapped to false, not simulated in specs */ {\n logger.debug({ err }, `PR merge error`);\n logger.info({ pr: prNo }, 'PR automerge failed');\n return false;\n }\n return true;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["promises.map","hostRules.find","git.getUrl","git.initRepo","utils.prInfo","reopenComments","comments.reopenComments","comments.REOPEN_PR_COMMENT_KEYWORD","utils.buildStates","comments.ensureComment","comments.ensureCommentRemoval"],"sources":["../../../../lib/modules/platform/bitbucket/index.ts"],"sourcesContent":["import { isNonEmptyArray, isNonEmptyString } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { REPOSITORY_NOT_FOUND } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { getInheritedOrGlobal, parseJson } from '../../../util/common.ts';\nimport * as git from '../../../util/git/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport type { BitbucketHttpOptions } from '../../../util/http/bitbucket.ts';\nimport { BitbucketHttp, setBaseUrl } from '../../../util/http/bitbucket.ts';\nimport { memCacheProvider } from '../../../util/http/cache/memory-http-cache-provider.ts';\nimport {\n aggressiveRepoCacheProvider,\n repoCacheProvider,\n} from '../../../util/http/cache/repository-http-cache-provider.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport * as promises from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { UUIDRegex, matchRegexOrGlobList } from '../../../util/string-match.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport type {\n AutodiscoverConfig,\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport * as comments from './comments.ts';\nimport { BitbucketPrCache } from './pr-cache.ts';\nimport {\n RepoInfo,\n Repositories,\n UnresolvedPrTasks,\n WorkspaceAccesses,\n} from './schema.ts';\nimport type {\n Account,\n BitbucketStatus,\n BranchResponse,\n Config,\n EffectiveReviewer,\n PagedResult,\n PrResponse,\n RepoBranchingModel,\n} from './types.ts';\nimport * as utils from './utils.ts';\nimport { mergeBodyTransformer } from './utils.ts';\n\nexport const id = 'bitbucket';\n\nconst bitbucketHttp = new BitbucketHttp();\n\nconst BITBUCKET_PROD_ENDPOINT = 'https://api.bitbucket.org/';\n\nlet config: Config = {} as any;\n\nexport function resetPlatform(): void {\n config = {} as any;\n renovateUserUuid = null;\n}\n\nconst defaults = { endpoint: BITBUCKET_PROD_ENDPOINT };\n\nconst pathSeparator = '/';\n\nlet renovateUserUuid: string | null = null;\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n token,\n}: PlatformParams): Promise<PlatformResult> {\n if (!(username && password) && !token) {\n throw new Error(\n 'Init: You must configure either a Bitbucket token or username and password',\n );\n }\n if (endpoint && endpoint !== BITBUCKET_PROD_ENDPOINT) {\n logger.warn(\n { endpoint, defaultEndpoint: BITBUCKET_PROD_ENDPOINT },\n 'Init: Bitbucket Cloud endpoint should generally be the default but is being configured to a different value. Did you mean to use Bitbucket Server?',\n );\n defaults.endpoint = endpoint;\n }\n setBaseUrl(defaults.endpoint);\n renovateUserUuid = null;\n const options: HttpOptions = { memCache: false };\n if (token) {\n options.token = token;\n } else {\n options.username = username;\n options.password = password;\n }\n try {\n const { uuid } = (\n await bitbucketHttp.getJsonUnchecked<Account>('/2.0/user', options)\n ).body;\n renovateUserUuid = uuid;\n } catch (err) {\n if (\n err.statusCode === 403 &&\n err.body?.error?.detail?.required?.includes('account')\n ) {\n logger.warn(`Bitbucket: missing 'account' scope for password`);\n } else {\n logger.debug({ err }, 'Unknown error fetching Bitbucket user identity');\n }\n }\n // TODO: Add a connection check that endpoint/username/password combination are valid (#9594)\n const platformConfig: PlatformResult = {\n endpoint: endpoint ?? BITBUCKET_PROD_ENDPOINT,\n };\n return Promise.resolve(platformConfig);\n}\n\n// Get all repositories that the user has access to\nexport async function getRepos(config: AutodiscoverConfig): Promise<string[]> {\n logger.debug('Autodiscovering Bitbucket Cloud repositories');\n try {\n // Determine which workspaces to query.\n // If the caller supplied explicit namespaces use them directly;\n // otherwise discover all workspaces the authenticated user belongs to.\n // The old cross-workspace endpoint GET /2.0/repositories?role=contributor\n // was removed by Bitbucket on 2026-03-31 (CHANGE-2770).\n let workspaceSlugs: string[];\n const autodiscoverNamespaces = config.namespaces;\n if (isNonEmptyArray(autodiscoverNamespaces)) {\n logger.debug(\n { autodiscoverNamespaces },\n 'Using configured namespaces as Bitbucket workspaces',\n );\n workspaceSlugs = autodiscoverNamespaces;\n } else {\n logger.debug('Fetching Bitbucket workspaces for the current user');\n const { body: slugs } = await bitbucketHttp.getJson(\n '/2.0/user/workspaces',\n { paginate: true },\n WorkspaceAccesses,\n );\n workspaceSlugs = slugs;\n logger.debug(\n { workspaceSlugs },\n `Found ${workspaceSlugs.length} Bitbucket workspace(s)`,\n );\n }\n\n // Fetch repositories for every workspace in parallel (concurrency-limited).\n const repoArrays = await promises.map(workspaceSlugs, (workspace) =>\n bitbucketHttp\n .getJson(\n `/2.0/repositories/${workspace}`,\n { paginate: true },\n Repositories,\n )\n .then(({ body }) => body),\n );\n\n let repos = repoArrays.flat();\n\n // if autodiscoverProjects is configured, filter the repos list\n const autodiscoverProjects = config.projects;\n if (isNonEmptyArray(autodiscoverProjects)) {\n logger.debug(\n { autodiscoverProjects: config.projects },\n 'Applying autodiscoverProjects filter',\n );\n repos = repos.filter(\n (repo) =>\n repo.projectName &&\n matchRegexOrGlobList(repo.projectName, autodiscoverProjects),\n );\n }\n\n return repos.map(({ owner, name }) => `${owner}/${name}`);\n } catch (err) /* v8 ignore next -- defensive: repo listing failures are logged and rethrown, not simulated in specs */ {\n logger.error({ err }, `bitbucket getRepos error`);\n throw err;\n }\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n // See: https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/src/%7Bcommit%7D/%7Bpath%7D\n const repo = repoName ?? config.repository;\n const path = fileName;\n\n let finalBranchOrTag = branchOrTag;\n if (branchOrTag?.includes(pathSeparator)) {\n // Branch name contains slash, so we have to replace branch name with SHA1 of the head commit; otherwise the API will not work.\n finalBranchOrTag = await getBranchCommit(branchOrTag);\n }\n\n const url = `/2.0/repositories/${repo}/src/${finalBranchOrTag ?? `HEAD`}/${path}`;\n const res = await bitbucketHttp.getText(url, {\n cacheProvider: repoCacheProvider,\n });\n return res.body;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n // TODO #22198\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\n// Initialize bitbucket by getting base branch and SHA\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(\"${repository}\")`);\n const opts = hostRules.find({\n hostType: 'bitbucket',\n url: defaults.endpoint,\n });\n config = {\n repository,\n ignorePrAuthor: GlobalConfig.get('ignorePrAuthor'),\n } as Config;\n let info: RepoInfo;\n let mainBranch: string;\n try {\n const { body: repoInfo } = await bitbucketHttp.getJson(\n `/2.0/repositories/${repository}`,\n RepoInfo,\n );\n info = repoInfo;\n\n mainBranch = info.mainbranch;\n\n if (getInheritedOrGlobal('bbUseDevelopmentBranch')) {\n // Fetch Bitbucket development branch\n const developmentBranch = (\n await bitbucketHttp.getJsonUnchecked<RepoBranchingModel>(\n `/2.0/repositories/${repository}/branching-model`,\n )\n ).body.development?.branch?.name;\n\n if (developmentBranch) {\n mainBranch = developmentBranch;\n }\n }\n\n config.defaultBranch = mainBranch;\n\n config = {\n ...config,\n owner: info.owner,\n mergeMethod: info.mergeMethod,\n is_private: info.is_private,\n };\n\n logger.debug(`${repository} owner = ${config.owner}`);\n } catch (err) /* v8 ignore next -- initRepo error mapping (404 to not-found) is not mocked in specs */ {\n if (err.statusCode === 404) {\n throw new Error(REPOSITORY_NOT_FOUND);\n }\n logger.debug({ err }, 'Unknown Bitbucket initRepo error');\n throw err;\n }\n\n const parsedEndpoint = parseUrl(defaults.endpoint);\n // v8 ignore if: endpoint is a constant\n if (!parsedEndpoint) {\n throw new Error(`Invalid Bitbucket endpoint: ${defaults.endpoint}`);\n }\n const { hostname } = parsedEndpoint;\n\n // Converts API hostnames to their respective HTTP git hosts:\n // `api.bitbucket.org` to `bitbucket.org`\n // `api-staging.<host>` to `staging.<host>`\n // TODO #22198\n const hostnameWithoutApiPrefix = regEx(/api[.|-](.+)/).exec(hostname)?.[1];\n\n let auth = '';\n if (opts.token) {\n auth = `x-token-auth:${opts.token}`;\n } else if (opts.password?.startsWith('ATAT')) {\n auth = `x-bitbucket-api-token-auth:${opts.password}`;\n } else {\n auth = `${opts.username!}:${opts.password!}`;\n }\n\n const url = git.getUrl({\n protocol: 'https',\n auth,\n hostname: hostnameWithoutApiPrefix,\n repository,\n });\n\n await git.initRepo({\n ...config,\n url,\n cloneSubmodules,\n cloneSubmodulesFilter,\n });\n const repoConfig: RepoResult = {\n defaultBranch: mainBranch,\n isFork: info.isFork,\n repoFingerprint: repoFingerprint(info.uuid, defaults.endpoint),\n };\n return repoConfig;\n}\n\n/* v8 ignore next -- covered only through findPr callers, never invoked directly in specs */\nfunction matchesState(state: string, desiredState: string): boolean {\n if (desiredState === 'all') {\n return true;\n }\n if (desiredState.startsWith('!')) {\n return state !== desiredState.substring(1);\n }\n return state === desiredState;\n}\n\nexport async function getPrList(): Promise<Pr[]> {\n logger.trace('getPrList()');\n return await BitbucketPrCache.getPrs(\n bitbucketHttp,\n config.repository,\n renovateUserUuid,\n );\n}\n\nexport async function findPr({\n branchName,\n prTitle,\n state = 'all',\n includeOtherAuthors,\n}: FindPRConfig): Promise<Pr | null> {\n logger.debug(`findPr(${branchName}, ${prTitle}, ${state})`);\n\n if (includeOtherAuthors) {\n // PR might have been created by anyone, so don't use the cached Renovate PR list\n const prs = (\n await bitbucketHttp.getJsonUnchecked<PagedResult<PrResponse>>(\n `/2.0/repositories/${config.repository}/pullrequests?q=source.branch.name=\"${branchName}\"&state=open`,\n { cacheProvider: memCacheProvider },\n )\n ).body.values;\n\n if (prs.length === 0) {\n logger.debug(`No PR found for branch ${branchName}`);\n return null;\n }\n\n return utils.prInfo(prs[0]);\n }\n\n const prList = await getPrList();\n const pr = prList.find(\n (p) =>\n p.sourceBranch === branchName &&\n (!prTitle || p.title.toUpperCase() === prTitle.toUpperCase()) &&\n matchesState(p.state, state),\n );\n\n if (!pr) {\n return null;\n }\n logger.debug(`Found PR #${pr.number}`);\n\n /**\n * Bitbucket doesn't support renaming or reopening declined PRs.\n * Instead, we have to use comment-driven signals.\n */\n if (pr.state === 'closed') {\n const reopenComments = await comments.reopenComments(config, pr.number);\n\n if (isNonEmptyArray(reopenComments)) {\n if (config.is_private) {\n // Only workspace members could have commented on a private repository\n logger.debug(\n `Found '${comments.REOPEN_PR_COMMENT_KEYWORD}' comment from workspace member. Renovate will reopen PR ${pr.number} as a new PR`,\n );\n return null;\n }\n\n for (const comment of reopenComments) {\n if (await isAccountMemberOfWorkspace(comment.user, config.repository)) {\n logger.debug(\n `Found '${comments.REOPEN_PR_COMMENT_KEYWORD}' comment from workspace member. Renovate will reopen PR ${pr.number} as a new PR`,\n );\n return null;\n }\n }\n }\n }\n\n return pr;\n}\n\n// Gets details for a PR\nexport async function getPr(prNo: number): Promise<Pr | null> {\n const pr = (\n await bitbucketHttp.getJsonUnchecked<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n )\n ).body;\n\n /* v8 ignore next -- defensive: the PR endpoint returns a body or throws, never an empty body */\n if (!pr) {\n return null;\n }\n\n const res: Pr = {\n ...utils.prInfo(pr),\n };\n\n if (isNonEmptyArray(pr.reviewers)) {\n res.reviewers = pr.reviewers\n .map(({ uuid }) => uuid)\n .filter(isNonEmptyString);\n }\n\n return res;\n}\n\nfunction escapeHash(input: string): string {\n return input?.replace(regEx(/#/g), '%23');\n}\n\n// Return the commit SHA for a branch\nasync function getBranchCommit(\n branchName: string,\n): Promise<string | undefined> {\n try {\n const branch = (\n await bitbucketHttp.getJsonUnchecked<BranchResponse>(\n `/2.0/repositories/${config.repository}/refs/branches/${escapeHash(\n branchName,\n )}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n )\n ).body;\n return branch.target.hash;\n } catch (err) /* v8 ignore next -- defensive: missing branch is logged and mapped to undefined, not mocked in specs */ {\n logger.debug({ err }, `getBranchCommit('${branchName}') failed'`);\n return undefined;\n }\n}\n\n// Returns the Pull Request for a branch. Null if not exists.\nexport async function getBranchPr(branchName: string): Promise<Pr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const existingPr = await findPr({\n branchName,\n state: 'open',\n });\n return existingPr ? getPr(existingPr.number) : null;\n}\n\nasync function getStatus(\n branchName: string,\n memCache = true,\n): Promise<BitbucketStatus[]> {\n const sha = await getBranchCommit(branchName);\n const opts: BitbucketHttpOptions = { paginate: true };\n /* v8 ignore next: temporary code */\n if (memCache) {\n opts.cacheProvider = aggressiveRepoCacheProvider;\n } else {\n opts.memCache = false;\n }\n return (\n await bitbucketHttp.getJsonUnchecked<PagedResult<BitbucketStatus>>(\n `/2.0/repositories/${config.repository}/commit/${sha!}/statuses`,\n opts,\n )\n ).body.values;\n}\n// Returns the combined status for a branch.\nexport async function getBranchStatus(\n branchName: string,\n internalChecksAsSuccess: boolean,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n const statuses = await getStatus(branchName);\n logger.debug({ branch: branchName, statuses }, 'branch status check result');\n if (!statuses.length) {\n logger.debug('empty branch status check result = returning \"pending\"');\n return 'yellow';\n }\n const noOfFailures = statuses.filter(\n (status: { state: string }) =>\n status.state === 'FAILED' || status.state === 'STOPPED',\n ).length;\n if (noOfFailures) {\n return 'red';\n }\n const noOfPending = statuses.filter(\n (status: { state: string }) => status.state === 'INPROGRESS',\n ).length;\n if (noOfPending) {\n return 'yellow';\n }\n if (\n !internalChecksAsSuccess &&\n statuses.every(\n (status) =>\n status.state === 'SUCCESSFUL' && status.key?.startsWith('renovate/'),\n )\n ) {\n logger.debug(\n 'Successful checks are all internal renovate/ checks, so returning \"pending\" branch status',\n );\n return 'yellow';\n }\n return 'green';\n}\n\nconst bbToRenovateStatusMapping: Record<string, BranchStatus> = {\n SUCCESSFUL: 'green',\n INPROGRESS: 'yellow',\n FAILED: 'red',\n};\n\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n const statuses = await getStatus(branchName);\n const bbState = statuses.find((status) => status.key === context)?.state;\n // TODO #22198\n return bbToRenovateStatusMapping[bbState!] || null;\n}\n\nexport async function setBranchStatus({\n branchName,\n context,\n description,\n state,\n url: targetUrl,\n}: BranchStatusConfig): Promise<void> {\n const sha = await getBranchCommit(branchName);\n\n // TargetUrl can not be empty so default to bitbucket\n /* v8 ignore next -- specs always pass a targetUrl, fallback exists for direct API constraints */\n const url = targetUrl ?? 'https://bitbucket.org';\n\n const body = {\n name: context,\n state: utils.buildStates[state],\n key: context,\n description,\n url,\n };\n\n await bitbucketHttp.postJson(\n `/2.0/repositories/${config.repository}/commit/${sha}/statuses/build`,\n { body },\n );\n\n // invalidate status cache\n const branchStatusesUrl = bitbucketHttp\n .resolveUrl(`/2.0/repositories/${config.repository}/commit/${sha}/statuses`)\n .toString();\n aggressiveRepoCacheProvider.markSynced('get', branchStatusesUrl, false);\n}\n\n/**\n * Remove or transform markdown into Bitbucket supported syntax.\n *\n * See https://bitbucket.org/tutorials/markdowndemo/src for supported markdown syntax\n */\nexport function massageMarkdown(input: string): string {\n let massaged = smartTruncate(input, maxBodyLength())\n .replace(\n 'you tick the rebase/retry checkbox',\n 'by renaming this PR to start with \"rebase!\"',\n )\n .replace(\n 'checking the rebase/retry box above',\n 'renaming the PR to start with \"rebase!\"',\n )\n .replace(\n regEx(\n /<details>\\n(<summary>View abandoned dependencies.*<\\/summary>\\n\\n)([\\s\\S]*?)<\\/details>/,\n ),\n '$2',\n )\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?\\n`), '')\n .replace(regEx(/\\]\\(\\.\\.\\/issues\\//g), '](../../issues/')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](../../pull-requests/')\n .replace(regEx(/<!--renovate-(?:debug|config-hash):.*?-->/g), '');\n\n massaged = massageDetailSummaryHtmlToNestedLists(massaged);\n\n return massageCodeblockMarkdown(massaged);\n}\n\n/**\n * Massage codeblocks indentation to ensure correct rendering in Bitbucket.\n */\nfunction massageCodeblockMarkdown(body: string): string {\n const codeBlockRegex = regEx(\n /^(?<indent>[ \\t]*)```(?<lang>\\w*)[^\\n]*\\n(?<code>[\\s\\S]*?)\\n[ \\t]*```/gm,\n );\n let codeMatch;\n let result = body;\n\n while ((codeMatch = codeBlockRegex.exec(body)) !== null) {\n const { indent, lang, code } = codeMatch.groups!;\n const indentLength = indent.length;\n const lines = code.split('\\n');\n const cleanedLines = lines.map((line) =>\n // Remove `indentLength` characters from the start of each line\n line.slice(indentLength),\n );\n\n const cleaned = cleanedLines.join('\\n');\n const replacement = `\\`\\`\\`${lang}\\n${cleaned}\\n\\`\\`\\``;\n\n result = result.replace(codeMatch[0], replacement);\n }\n\n return result;\n}\n\n/**\n * Massage collapsible html sections into nested unordered lists.\n *\n * Bitbucket doesn't currently support collapsible syntax; https://jira.atlassian.com/browse/BCLOUD-20231\n */\nfunction massageDetailSummaryHtmlToNestedLists(body: string): string {\n let depth = 0;\n // Parse detail parts to calculate correct list depth\n const detailsParts = body.split('<details>').map((raw) => {\n const partDepth = depth;\n\n depth += 1;\n const countClosingDetailsTags = raw.split('</details>').length - 1;\n depth = Math.max(0, depth - countClosingDetailsTags);\n\n return { raw, partDepth };\n });\n\n // Reassemble parts while replacing collapsible html elements with markdown list\n return detailsParts\n .map(({ raw, partDepth }) => {\n let t = raw;\n\n if (partDepth === 0) {\n return t;\n }\n\n const partIndentation = '\\t'.repeat(partDepth - 1);\n const nestedListItemIndentation = '\\t'.repeat(partDepth);\n\n const rawContainsBlockquote = raw.includes('<blockquote>');\n\n t = t.replace(regEx(/<\\/?summary>/g), partDepth === 1 ? '**' : '`');\n\n if (partDepth > 1) {\n t = t.replace(\n regEx(/^([ \\t]*- [`[])/gm),\n `${nestedListItemIndentation}$1`,\n );\n }\n\n let result = partIndentation;\n if (rawContainsBlockquote || partDepth > 1) {\n result += ' - ';\n }\n result += t;\n\n return result;\n })\n .join('')\n .replace(regEx(/<\\/?(summary|details|blockquote)>/g), '');\n}\n\nexport function maxBodyLength(): number {\n return 250000;\n}\n\nfunction logIssuesRemoved(): void {\n logger.once.debug(\n 'Bitbucket Cloud has removed its issue tracker, so Renovate features which rely on issues, like the Dependency Dashboard, do not work. See https://developer.atlassian.com/cloud/bitbucket/changelog/#CHANGE-3071',\n );\n}\n\nexport function findIssue(title: string): Promise<Issue | null> {\n logger.debug(`findIssue(${title})`);\n logIssuesRemoved();\n return Promise.resolve(null);\n}\n\nexport function ensureIssue({\n title,\n}: EnsureIssueConfig): Promise<EnsureIssueResult | null> {\n logger.once.warn({ title }, 'Cannot ensure issue');\n logIssuesRemoved();\n return Promise.resolve(null);\n}\n\nexport function getIssueList(): Promise<Issue[]> {\n logger.debug(`getIssueList()`);\n logIssuesRemoved();\n return Promise.resolve([]);\n}\n\nexport function ensureIssueClosing(title: string): Promise<void> {\n logger.debug(`ensureIssueClosing(${title})`);\n logIssuesRemoved();\n return Promise.resolve();\n}\n\nexport function addAssignees(\n _prNr: number,\n _assignees: string[],\n): Promise<void> {\n // Bitbucket supports \"participants\" and \"reviewers\" so does not seem to have the concept of \"assignee\"\n logger.warn('Cannot add assignees');\n return Promise.resolve();\n}\n\nexport async function addReviewers(\n prId: number,\n reviewers: string[],\n): Promise<void> {\n logger.debug(`Adding reviewers '${reviewers.join(', ')}' to #${prId}`);\n\n // TODO #22198\n const { title } = (await getPr(prId))!;\n\n const body = {\n title,\n reviewers: reviewers.map((username: string) => {\n const isUUID =\n username.startsWith('{') &&\n username.endsWith('}') &&\n UUIDRegex.test(username.slice(1, -1));\n const key = isUUID ? 'uuid' : 'username';\n return {\n [key]: username,\n };\n }),\n };\n\n await bitbucketHttp.putJson(\n `/2.0/repositories/${config.repository}/pullrequests/${prId}`,\n {\n body,\n },\n );\n}\n\n/* v8 ignore next -- stub: Bitbucket Cloud has no PR labels, callers never reach this */\nexport function deleteLabel(): never {\n throw new Error('deleteLabel not implemented');\n}\n\nexport function ensureComment({\n number,\n topic,\n content,\n}: EnsureCommentConfig): Promise<boolean> {\n // https://developer.atlassian.com/bitbucket/api/2/reference/search?q=pullrequest+comment\n return comments.ensureComment({\n config,\n number,\n topic,\n content: sanitize(content),\n });\n}\n\nexport function ensureCommentRemoval(\n deleteConfig: EnsureCommentRemovalConfig,\n): Promise<void> {\n return comments.ensureCommentRemoval(config, deleteConfig);\n}\n\nasync function sanitizeReviewers(\n reviewers: Account[],\n err: any,\n): Promise<Account[] | undefined> {\n if (err.statusCode === 400 && err.body?.error?.fields?.reviewers) {\n const sanitizedReviewers: Account[] = [];\n\n const MSG_AUTHOR_AND_REVIEWER =\n 'is the author and cannot be included as a reviewer.';\n const MSG_MALFORMED_REVIEWERS_LIST = 'Malformed reviewers list';\n const MSG_NOT_WORKSPACE_MEMBER =\n 'is not a member of this workspace and cannot be added to this pull request';\n\n for (const msg of err.body.error.fields.reviewers) {\n // Bitbucket returns a 400 if any of the PR reviewer accounts are now inactive (ie: disabled/suspended)\n if (msg === MSG_MALFORMED_REVIEWERS_LIST) {\n logger.debug(\n { err },\n 'PR contains reviewers that may be either inactive or no longer a member of this workspace. Will try setting only active reviewers',\n );\n\n // Validate that each previous PR reviewer account is still active\n for (const reviewer of reviewers) {\n const reviewerUser = (\n await bitbucketHttp.getJsonUnchecked<Account>(\n `/2.0/users/${reviewer.uuid}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n )\n ).body;\n\n // There are cases where an active user may still not be a member of a workspace\n if (\n reviewerUser.account_status === 'active' &&\n (await isAccountMemberOfWorkspace(reviewer, config.repository))\n ) {\n sanitizedReviewers.push(reviewer);\n }\n }\n // Bitbucket returns a 400 if any of the PR reviewer accounts are no longer members of this workspace\n } else if (msg.endsWith(MSG_NOT_WORKSPACE_MEMBER)) {\n logger.debug(\n { err },\n 'PR contains reviewer accounts which are no longer member of this workspace. Will try setting only member reviewers',\n );\n\n // Validate that each previous PR reviewer account is still a member of this workspace\n for (const reviewer of reviewers) {\n if (await isAccountMemberOfWorkspace(reviewer, config.repository)) {\n sanitizedReviewers.push(reviewer);\n }\n }\n } else if (msg.endsWith(MSG_AUTHOR_AND_REVIEWER)) {\n logger.debug(\n { err },\n 'PR contains reviewer accounts which are also the author. Will try setting only non-author reviewers',\n );\n const author = msg.replace(MSG_AUTHOR_AND_REVIEWER, '').trim();\n for (const reviewer of reviewers) {\n if (reviewer.display_name !== author) {\n sanitizedReviewers.push(reviewer);\n }\n }\n } else {\n return undefined;\n }\n }\n\n return sanitizedReviewers;\n }\n\n return undefined;\n}\n\nasync function isAccountMemberOfWorkspace(\n reviewer: Account,\n repository: string,\n): Promise<boolean> {\n const workspace = repository.split('/')[0];\n\n try {\n await bitbucketHttp.get(\n `/2.0/workspaces/${workspace}/members/${reviewer.uuid}`,\n { cacheProvider: aggressiveRepoCacheProvider },\n );\n\n return true;\n } catch (err) {\n // HTTP 404: User cannot be found, or the user is not a member of this workspace.\n if (err.statusCode === 404) {\n logger.debug(\n { err },\n `User ${reviewer.display_name} is not a member of the workspace ${workspace}. Will be removed from the PR`,\n );\n\n return false;\n }\n throw err;\n }\n}\n\n// Creates PR and returns PR number\nexport async function createPr({\n sourceBranch,\n targetBranch,\n prTitle: title,\n prBody: description,\n draftPR = false,\n platformPrOptions,\n}: CreatePRConfig): Promise<Pr> {\n // labels is not supported in Bitbucket: https://bitbucket.org/site/master/issues/11976/ability-to-add-labels-to-pull-requests-bb\n\n const base = targetBranch;\n\n logger.debug({ repository: config.repository, title, base }, 'Creating PR');\n\n let reviewers: Account[] = [];\n\n if (platformPrOptions?.bbUseDefaultReviewers) {\n const reviewersResponse = (\n await bitbucketHttp.getJsonUnchecked<PagedResult<EffectiveReviewer>>(\n `/2.0/repositories/${config.repository}/effective-default-reviewers`,\n {\n paginate: true,\n cacheProvider: aggressiveRepoCacheProvider,\n },\n )\n ).body;\n reviewers = reviewersResponse.values.map((reviewer: EffectiveReviewer) => ({\n uuid: reviewer.user.uuid,\n display_name: reviewer.user.display_name,\n }));\n }\n\n const body = {\n title,\n description: sanitize(description),\n source: {\n branch: {\n name: sourceBranch,\n },\n },\n destination: {\n branch: {\n name: base,\n },\n },\n close_source_branch: true,\n reviewers,\n draft: draftPR,\n };\n\n try {\n const prRes = (\n await bitbucketHttp.postJson<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests`,\n {\n body,\n },\n )\n ).body;\n const pr = utils.prInfo(prRes);\n await BitbucketPrCache.setPr(\n bitbucketHttp,\n config.repository,\n renovateUserUuid,\n pr,\n );\n if (platformPrOptions?.bbAutoResolvePrTasks) {\n await autoResolvePrTasks(pr);\n }\n return pr;\n } catch (err) /* v8 ignore next -- reviewer-sanitizing retry path depends on API error shapes not mocked in specs */ {\n // Try sanitizing reviewers\n const sanitizedReviewers = await sanitizeReviewers(reviewers, err);\n\n if (sanitizedReviewers === undefined) {\n logger.warn({ err }, 'Error creating pull request');\n throw err;\n } else {\n const prRes = (\n await bitbucketHttp.postJson<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests`,\n {\n body: {\n ...body,\n reviewers: sanitizedReviewers,\n },\n },\n )\n ).body;\n const pr = utils.prInfo(prRes);\n await BitbucketPrCache.setPr(\n bitbucketHttp,\n config.repository,\n renovateUserUuid,\n pr,\n );\n if (platformPrOptions?.bbAutoResolvePrTasks) {\n await autoResolvePrTasks(pr);\n }\n return pr;\n }\n }\n}\n\nasync function autoResolvePrTasks(pr: Pr): Promise<void> {\n logger.debug(`Auto resolve PR tasks in #${pr.number}`);\n try {\n const unResolvedTasks = (\n await bitbucketHttp.getJson(\n `/2.0/repositories/${config.repository}/pullrequests/${pr.number}/tasks`,\n { paginate: true, pagelen: 100 },\n UnresolvedPrTasks,\n )\n ).body;\n\n logger.trace(\n {\n prId: pr.number,\n listTaskRes: unResolvedTasks,\n },\n 'List PR tasks',\n );\n\n for (const task of unResolvedTasks) {\n const res = await bitbucketHttp.putJson(\n `/2.0/repositories/${config.repository}/pullrequests/${pr.number}/tasks/${task.id}`,\n {\n body: {\n state: 'RESOLVED',\n content: {\n raw: task.content.raw,\n },\n },\n },\n );\n logger.trace(\n {\n prId: pr.number,\n updateTaskResponse: res,\n },\n 'Put PR tasks - mark resolved',\n );\n }\n } catch (err) {\n logger.warn({ prId: pr.number, err }, 'Error resolving PR tasks');\n }\n}\n\nexport async function updatePr({\n number: prNo,\n prTitle: title,\n prBody: description,\n state,\n targetBranch,\n}: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prNo}, ${title}, body)`);\n // Updating a PR in Bitbucket will clear the reviewers if reviewers is not present\n const pr = (\n await bitbucketHttp.getJsonUnchecked<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}`,\n )\n ).body;\n\n let updatedPrRes: PrResponse;\n try {\n const body: any = {\n title,\n description: sanitize(description),\n reviewers: pr.reviewers,\n };\n if (targetBranch) {\n body.destination = {\n branch: {\n name: targetBranch,\n },\n };\n }\n\n updatedPrRes = (\n await bitbucketHttp.putJson<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}`,\n { body },\n )\n ).body;\n } catch (err) {\n // Try sanitizing reviewers\n const sanitizedReviewers = await sanitizeReviewers(pr.reviewers, err);\n\n if (sanitizedReviewers === undefined) {\n throw err;\n } else {\n updatedPrRes = (\n await bitbucketHttp.putJson<PrResponse>(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}`,\n {\n body: {\n title,\n description: sanitize(description),\n reviewers: sanitizedReviewers,\n },\n },\n )\n ).body;\n }\n }\n\n if (state === 'closed' && pr) {\n await bitbucketHttp.postJson(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}/decline`,\n );\n }\n\n // update pr cache\n await BitbucketPrCache.setPr(\n bitbucketHttp,\n config.repository,\n renovateUserUuid,\n utils.prInfo({ ...updatedPrRes, ...(state && { state }) }),\n );\n}\n\nexport async function mergePr({\n branchName,\n id: prNo,\n strategy: mergeStrategy,\n}: MergePRConfig): Promise<boolean> {\n logger.debug(`mergePr(${prNo}, ${branchName}, ${mergeStrategy})`);\n\n // Bitbucket Cloud does not support a rebase-alike; https://jira.atlassian.com/browse/BCLOUD-16610\n if (mergeStrategy === 'rebase') {\n logger.warn('Bitbucket Cloud does not support a \"rebase\" strategy.');\n return false;\n }\n\n try {\n await bitbucketHttp.postJson(\n `/2.0/repositories/${config.repository}/pullrequests/${prNo}/merge`,\n {\n body: mergeBodyTransformer(mergeStrategy),\n },\n );\n logger.debug('Automerging succeeded');\n } catch (err) /* v8 ignore next -- defensive: merge failures are logged and mapped to false, not simulated in specs */ {\n logger.debug({ err }, `PR merge error`);\n logger.info({ pr: prNo }, 'PR automerge failed');\n return false;\n }\n return true;\n}\n"],"mappings":"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"}
|
|
@@ -18,9 +18,6 @@ const PagedSourceResults = z.object({
|
|
|
18
18
|
const RepoInfo = z.object({
|
|
19
19
|
parent: z.unknown().optional().catch(void 0),
|
|
20
20
|
mainbranch: z.object({ name: z.string() }),
|
|
21
|
-
has_issues: z.boolean().catch(() => {
|
|
22
|
-
return false;
|
|
23
|
-
}),
|
|
24
21
|
uuid: z.string(),
|
|
25
22
|
full_name: z.string().regex(regEx(/^[^/]+\/[^/]+$/), "Expected repository full_name to be in the format \"owner/repo\""),
|
|
26
23
|
is_private: z.boolean().catch(() => {
|
|
@@ -37,7 +34,6 @@ const RepoInfo = z.object({
|
|
|
37
34
|
name,
|
|
38
35
|
mainbranch: repoInfoBody.mainbranch.name,
|
|
39
36
|
mergeMethod: "merge",
|
|
40
|
-
has_issues: repoInfoBody.has_issues,
|
|
41
37
|
uuid: repoInfoBody.uuid,
|
|
42
38
|
is_private: repoInfoBody.is_private,
|
|
43
39
|
projectName: repoInfoBody.project?.name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/platform/bitbucket/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\n\nconst BitbucketSourceType = z.enum(['commit_directory', 'commit_file']);\n\nconst SourceResults = z.object({\n path: z.string(),\n type: BitbucketSourceType,\n commit: z.object({\n hash: z.string(),\n }),\n});\n\nconst Paged = z.object({\n page: z.number().optional(),\n pagelen: z.number(),\n size: z.number().optional(),\n next: z.string().optional(),\n});\n\nexport const PagedSourceResults = Paged.extend({\n values: z.array(SourceResults),\n});\n\nexport const RepoInfo = z\n .object({\n parent: z.unknown().optional().catch(undefined),\n mainbranch: z.object({\n name: z.string(),\n }),\n
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/platform/bitbucket/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\n\nconst BitbucketSourceType = z.enum(['commit_directory', 'commit_file']);\n\nconst SourceResults = z.object({\n path: z.string(),\n type: BitbucketSourceType,\n commit: z.object({\n hash: z.string(),\n }),\n});\n\nconst Paged = z.object({\n page: z.number().optional(),\n pagelen: z.number(),\n size: z.number().optional(),\n next: z.string().optional(),\n});\n\nexport const PagedSourceResults = Paged.extend({\n values: z.array(SourceResults),\n});\n\nexport const RepoInfo = z\n .object({\n parent: z.unknown().optional().catch(undefined),\n mainbranch: z.object({\n name: z.string(),\n }),\n uuid: z.string(),\n full_name: z\n .string()\n .regex(\n regEx(/^[^/]+\\/[^/]+$/),\n 'Expected repository full_name to be in the format \"owner/repo\"',\n ),\n is_private: z.boolean().catch(() => {\n logger.once.warn('Bitbucket: \"is_private\" field missing from repo info');\n return true;\n }),\n project: z\n .object({\n name: z.string(),\n })\n .nullable()\n .catch(null),\n })\n .transform((repoInfoBody) => {\n const isFork = !!repoInfoBody.parent;\n const [owner, name] = repoInfoBody.full_name.split('/');\n\n return {\n isFork,\n owner,\n name,\n mainbranch: repoInfoBody.mainbranch.name,\n mergeMethod: 'merge',\n uuid: repoInfoBody.uuid,\n is_private: repoInfoBody.is_private,\n projectName: repoInfoBody.project?.name,\n };\n });\nexport type RepoInfo = z.infer<typeof RepoInfo>;\n\nexport const Repositories = z\n .object({\n values: LooseArray(RepoInfo),\n })\n .transform((body) => body.values);\n\nconst TaskState = z.union([z.literal('RESOLVED'), z.literal('UNRESOLVED')]);\n\nconst PrTask = z.object({\n id: z.number(),\n state: TaskState,\n content: z.object({\n raw: z.string(),\n }),\n});\n\nexport type PrTask = z.infer<typeof PrTask>;\n\nexport const UnresolvedPrTasks = z\n .object({\n values: z.array(PrTask),\n })\n .transform((data) =>\n data.values.filter((task) => task.state === 'UNRESOLVED'),\n );\n\nconst WorkspaceAccess = z.object({\n workspace: z.object({\n slug: z.string(),\n }),\n});\n\nexport const WorkspaceAccesses = z\n .object({\n values: z.array(WorkspaceAccess),\n })\n .transform((body) => body.values.map(({ workspace }) => workspace.slug));\n"],"mappings":";;;;;AAKA,MAAM,sBAAsB,EAAE,KAAK,CAAC,oBAAoB,aAAa,CAAC;AAEtE,MAAM,gBAAgB,EAAE,OAAO;CAC7B,MAAM,EAAE,OAAO;CACf,MAAM;CACN,QAAQ,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACjB,CAAC;AACH,CAAC;AASD,MAAa,qBAPC,EAAE,OAAO;CACrB,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,SAAS,EAAE,OAAO;CAClB,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;AAC5B,CAEkC,CAAA,CAAM,OAAO,EAC7C,QAAQ,EAAE,MAAM,aAAa,EAC/B,CAAC;AAED,MAAa,WAAW,EACrB,OAAO;CACN,QAAQ,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;CAC9C,YAAY,EAAE,OAAO,EACnB,MAAM,EAAE,OAAO,EACjB,CAAC;CACD,MAAM,EAAE,OAAO;CACf,WAAW,EACR,OAAO,CAAC,CACR,MACC,MAAM,gBAAgB,GACtB,kEACF;CACF,YAAY,EAAE,QAAQ,CAAC,CAAC,YAAY;EAClC,OAAO,KAAK,KAAK,wDAAsD;EACvE,OAAO;CACT,CAAC;CACD,SAAS,EACN,OAAO,EACN,MAAM,EAAE,OAAO,EACjB,CAAC,CAAC,CACD,SAAS,CAAC,CACV,MAAM,IAAI;AACf,CAAC,CAAC,CACD,WAAW,iBAAiB;CAC3B,MAAM,SAAS,CAAC,CAAC,aAAa;CAC9B,MAAM,CAAC,OAAO,QAAQ,aAAa,UAAU,MAAM,GAAG;CAEtD,OAAO;EACL;EACA;EACA;EACA,YAAY,aAAa,WAAW;EACpC,aAAa;EACb,MAAM,aAAa;EACnB,YAAY,aAAa;EACzB,aAAa,aAAa,SAAS;CACrC;AACF,CAAC;AAGH,MAAa,eAAe,EACzB,OAAO,EACN,QAAQ,WAAW,QAAQ,EAC7B,CAAC,CAAC,CACD,WAAW,SAAS,KAAK,MAAM;AAElC,MAAM,YAAY,EAAE,MAAM,CAAC,EAAE,QAAQ,UAAU,GAAG,EAAE,QAAQ,YAAY,CAAC,CAAC;AAE1E,MAAM,SAAS,EAAE,OAAO;CACtB,IAAI,EAAE,OAAO;CACb,OAAO;CACP,SAAS,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EAChB,CAAC;AACH,CAAC;AAID,MAAa,oBAAoB,EAC9B,OAAO,EACN,QAAQ,EAAE,MAAM,MAAM,EACxB,CAAC,CAAC,CACD,WAAW,SACV,KAAK,OAAO,QAAQ,SAAS,KAAK,UAAU,YAAY,CAC1D;AAEF,MAAM,kBAAkB,EAAE,OAAO,EAC/B,WAAW,EAAE,OAAO,EAClB,MAAM,EAAE,OAAO,EACjB,CAAC,EACH,CAAC;AAED,MAAa,oBAAoB,EAC9B,OAAO,EACN,QAAQ,EAAE,MAAM,eAAe,EACjC,CAAC,CAAC,CACD,WAAW,SAAS,KAAK,OAAO,KAAK,EAAE,gBAAgB,UAAU,IAAI,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { logger } from "../../logger/index.js";
|
|
2
|
+
import { Json } from "../schema-utils/index.js";
|
|
1
3
|
import { HttpBase } from "./http.js";
|
|
2
4
|
import { isNonEmptyObject, isNullOrUndefined } from "@sindresorhus/is";
|
|
5
|
+
import { RequestError } from "got";
|
|
6
|
+
import { z } from "zod/v4";
|
|
3
7
|
//#region lib/util/http/bitbucket.ts
|
|
4
8
|
const MAX_PAGES = 100;
|
|
5
9
|
const MAX_PAGELEN = 100;
|
|
@@ -17,6 +21,21 @@ var BitbucketHttp = class extends HttpBase {
|
|
|
17
21
|
extraOptions() {
|
|
18
22
|
return super.extraOptions().concat(["paginate", "pagelen"]);
|
|
19
23
|
}
|
|
24
|
+
handleError(url, httpOptions, err) {
|
|
25
|
+
if (err instanceof RequestError && err.response) {
|
|
26
|
+
const announcement = DeprecationAnnouncementBody.safeParse(err.response.body);
|
|
27
|
+
if (announcement.success) {
|
|
28
|
+
const { message, detail, data } = announcement.data.error;
|
|
29
|
+
logger.once.warn({
|
|
30
|
+
url: err.response.url,
|
|
31
|
+
message,
|
|
32
|
+
detail,
|
|
33
|
+
announcementUrl: data.announcement_url
|
|
34
|
+
}, "Bitbucket API functionality has been deprecated or removed");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return super.handleError(url, httpOptions, err);
|
|
38
|
+
}
|
|
20
39
|
async requestJsonUnsafe(method, options) {
|
|
21
40
|
const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);
|
|
22
41
|
const opts = {
|
|
@@ -50,6 +69,18 @@ var BitbucketHttp = class extends HttpBase {
|
|
|
50
69
|
return result;
|
|
51
70
|
}
|
|
52
71
|
};
|
|
72
|
+
/**
|
|
73
|
+
* Bitbucket Cloud responds with an error body linking to the relevant changelog entry when the endpoint's functionality has been deprecated or removed.
|
|
74
|
+
*
|
|
75
|
+
* See https://developer.atlassian.com/cloud/bitbucket/changelog/
|
|
76
|
+
*/
|
|
77
|
+
const DeprecationAnnouncement = z.object({ error: z.object({
|
|
78
|
+
message: z.string(),
|
|
79
|
+
detail: z.string().optional(),
|
|
80
|
+
data: z.object({ announcement_url: z.string() })
|
|
81
|
+
}) });
|
|
82
|
+
/** The body is already parsed for JSON requests, but a raw string otherwise. */
|
|
83
|
+
const DeprecationAnnouncementBody = z.union([DeprecationAnnouncement, Json.pipe(DeprecationAnnouncement)]);
|
|
53
84
|
function hasPagelen(url) {
|
|
54
85
|
return !isNullOrUndefined(url.searchParams.get("pagelen"));
|
|
55
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitbucket.js","names":[],"sources":["../../../lib/util/http/bitbucket.ts"],"sourcesContent":["import { isNonEmptyObject, isNullOrUndefined } from '@sindresorhus/is';\nimport type { PagedResult } from '../../modules/platform/bitbucket/types.ts';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nconst MAX_PAGES = 100;\nconst MAX_PAGELEN = 100;\n\nlet baseUrl = 'https://api.bitbucket.org/';\n\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport interface BitbucketHttpOptions extends HttpOptions {\n paginate?: boolean;\n pagelen?: number;\n}\n\nexport class BitbucketHttp extends HttpBase<BitbucketHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'bitbucket', options?: BitbucketHttpOptions) {\n super(type, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat(['paginate', 'pagelen'] as (keyof BitbucketHttpOptions)[]);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<BitbucketHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts: InternalJsonUnsafeOptions<BitbucketHttpOptions> = {\n ...options,\n url: resolvedUrl,\n };\n const paginate = opts.httpOptions?.paginate;\n\n if (paginate && !hasPagelen(resolvedUrl)) {\n const pagelen = opts.httpOptions!.pagelen ?? MAX_PAGELEN;\n resolvedUrl.searchParams.set('pagelen', pagelen.toString());\n }\n\n const result = await super.requestJsonUnsafe<T | PagedResult<T>>(\n method,\n opts,\n );\n\n if (paginate && isPagedResult(result.body)) {\n // v8 ignore else -- TODO: add test #40625\n if (opts.httpOptions) {\n opts.httpOptions.memCache = false;\n }\n const resultBody = result.body;\n let nextURL = result.body.next;\n let page = 1;\n\n for (; nextURL && page <= MAX_PAGES; page++) {\n opts.url = nextURL;\n const nextResult = await super.requestJsonUnsafe<PagedResult<T>>(\n method,\n opts,\n );\n\n resultBody.values.push(...nextResult.body.values);\n nextURL = nextResult.body.next;\n }\n\n // Override other page-related attributes\n resultBody.pagelen = resultBody.values.length;\n /* v8 ignore next -- hard to test all branches */\n resultBody.size =\n page <= MAX_PAGES ? resultBody.values.length : undefined;\n // v8 ignore next -- hard to test all branches\n resultBody.next = page <= MAX_PAGES ? nextURL : undefined;\n }\n\n return result as HttpResponse<T>;\n }\n}\n\nfunction hasPagelen(url: URL): boolean {\n return !isNullOrUndefined(url.searchParams.get('pagelen'));\n}\n\nfunction isPagedResult<T>(obj: any): obj is PagedResult<T> {\n return isNonEmptyObject(obj) && Array.isArray(obj.values);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"bitbucket.js","names":[],"sources":["../../../lib/util/http/bitbucket.ts"],"sourcesContent":["import { isNonEmptyObject, isNullOrUndefined } from '@sindresorhus/is';\nimport { RequestError } from 'got';\nimport { z } from 'zod/v4';\nimport { logger } from '../../logger/index.ts';\nimport type { PagedResult } from '../../modules/platform/bitbucket/types.ts';\nimport { Json } from '../schema-utils/index.ts';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nconst MAX_PAGES = 100;\nconst MAX_PAGELEN = 100;\n\nlet baseUrl = 'https://api.bitbucket.org/';\n\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport interface BitbucketHttpOptions extends HttpOptions {\n paginate?: boolean;\n pagelen?: number;\n}\n\nexport class BitbucketHttp extends HttpBase<BitbucketHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'bitbucket', options?: BitbucketHttpOptions) {\n super(type, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat(['paginate', 'pagelen'] as (keyof BitbucketHttpOptions)[]);\n }\n\n protected override handleError(\n url: string | URL,\n httpOptions: HttpOptions,\n err: Error,\n ): never {\n if (err instanceof RequestError && err.response) {\n const announcement = DeprecationAnnouncementBody.safeParse(\n err.response.body,\n );\n if (announcement.success) {\n const { message, detail, data } = announcement.data.error;\n logger.once.warn(\n {\n // `url` is only resolved against the base URL for JSON requests\n url: err.response.url,\n message,\n detail,\n announcementUrl: data.announcement_url,\n },\n 'Bitbucket API functionality has been deprecated or removed',\n );\n }\n }\n return super.handleError(url, httpOptions, err);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<BitbucketHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts: InternalJsonUnsafeOptions<BitbucketHttpOptions> = {\n ...options,\n url: resolvedUrl,\n };\n const paginate = opts.httpOptions?.paginate;\n\n if (paginate && !hasPagelen(resolvedUrl)) {\n const pagelen = opts.httpOptions!.pagelen ?? MAX_PAGELEN;\n resolvedUrl.searchParams.set('pagelen', pagelen.toString());\n }\n\n const result = await super.requestJsonUnsafe<T | PagedResult<T>>(\n method,\n opts,\n );\n\n if (paginate && isPagedResult(result.body)) {\n // v8 ignore else -- TODO: add test #40625\n if (opts.httpOptions) {\n opts.httpOptions.memCache = false;\n }\n const resultBody = result.body;\n let nextURL = result.body.next;\n let page = 1;\n\n for (; nextURL && page <= MAX_PAGES; page++) {\n opts.url = nextURL;\n const nextResult = await super.requestJsonUnsafe<PagedResult<T>>(\n method,\n opts,\n );\n\n resultBody.values.push(...nextResult.body.values);\n nextURL = nextResult.body.next;\n }\n\n // Override other page-related attributes\n resultBody.pagelen = resultBody.values.length;\n /* v8 ignore next -- hard to test all branches */\n resultBody.size =\n page <= MAX_PAGES ? resultBody.values.length : undefined;\n // v8 ignore next -- hard to test all branches\n resultBody.next = page <= MAX_PAGES ? nextURL : undefined;\n }\n\n return result as HttpResponse<T>;\n }\n}\n\n/**\n * Bitbucket Cloud responds with an error body linking to the relevant changelog entry when the endpoint's functionality has been deprecated or removed.\n *\n * See https://developer.atlassian.com/cloud/bitbucket/changelog/\n */\nconst DeprecationAnnouncement = z.object({\n error: z.object({\n message: z.string(),\n detail: z.string().optional(),\n data: z.object({\n announcement_url: z.string(),\n }),\n }),\n});\n\n/** The body is already parsed for JSON requests, but a raw string otherwise. */\nconst DeprecationAnnouncementBody = z.union([\n DeprecationAnnouncement,\n Json.pipe(DeprecationAnnouncement),\n]);\n\nfunction hasPagelen(url: URL): boolean {\n return !isNullOrUndefined(url.searchParams.get('pagelen'));\n}\n\nfunction isPagedResult<T>(obj: any): obj is PagedResult<T> {\n return isNonEmptyObject(obj) && Array.isArray(obj.values);\n}\n"],"mappings":";;;;;;;AASA,MAAM,YAAY;AAClB,MAAM,cAAc;AAEpB,IAAI,UAAU;AAEd,SAAgB,WAAW,KAAmB;CAC5C,UAAU;AACZ;AAOA,IAAa,gBAAb,cAAmC,SAA+B;CAChE,IAAuB,UAA8B;EACnD,OAAO;CACT;CAEA,YAAY,OAAO,aAAa,SAAgC;EAC9D,MAAM,MAAM,OAAO;CACrB;CAEA,eAAqD;EACnD,OAAO,MACJ,aAAa,CAAC,CACd,OAAO,CAAC,YAAY,SAAS,CAAmC;CACrE;CAEA,YACE,KACA,aACA,KACO;EACP,IAAI,eAAe,gBAAgB,IAAI,UAAU;GAC/C,MAAM,eAAe,4BAA4B,UAC/C,IAAI,SAAS,IACf;GACA,IAAI,aAAa,SAAS;IACxB,MAAM,EAAE,SAAS,QAAQ,SAAS,aAAa,KAAK;IACpD,OAAO,KAAK,KACV;KAEE,KAAK,IAAI,SAAS;KAClB;KACA;KACA,iBAAiB,KAAK;IACxB,GACA,4DACF;GACF;EACF;EACA,OAAO,MAAM,YAAY,KAAK,aAAa,GAAG;CAChD;CAEA,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,WAAW;EACpE,MAAM,OAAwD;GAC5D,GAAG;GACH,KAAK;EACP;EACA,MAAM,WAAW,KAAK,aAAa;EAEnC,IAAI,YAAY,CAAC,WAAW,WAAW,GAAG;GACxC,MAAM,UAAU,KAAK,YAAa,WAAW;GAC7C,YAAY,aAAa,IAAI,WAAW,QAAQ,SAAS,CAAC;EAC5D;EAEA,MAAM,SAAS,MAAM,MAAM,kBACzB,QACA,IACF;EAEA,IAAI,YAAY,cAAc,OAAO,IAAI,GAAG;;GAE1C,IAAI,KAAK,aACP,KAAK,YAAY,WAAW;GAE9B,MAAM,aAAa,OAAO;GAC1B,IAAI,UAAU,OAAO,KAAK;GAC1B,IAAI,OAAO;GAEX,OAAO,WAAW,QAAQ,WAAW,QAAQ;IAC3C,KAAK,MAAM;IACX,MAAM,aAAa,MAAM,MAAM,kBAC7B,QACA,IACF;IAEA,WAAW,OAAO,KAAK,GAAG,WAAW,KAAK,MAAM;IAChD,UAAU,WAAW,KAAK;GAC5B;GAGA,WAAW,UAAU,WAAW,OAAO;;GAEvC,WAAW,OACT,QAAQ,YAAY,WAAW,OAAO,SAAS,KAAA;;GAEjD,WAAW,OAAO,QAAQ,YAAY,UAAU,KAAA;EAClD;EAEA,OAAO;CACT;AACF;;;;;;AAOA,MAAM,0BAA0B,EAAE,OAAO,EACvC,OAAO,EAAE,OAAO;CACd,SAAS,EAAE,OAAO;CAClB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;CAC5B,MAAM,EAAE,OAAO,EACb,kBAAkB,EAAE,OAAO,EAC7B,CAAC;AACH,CAAC,EACH,CAAC;;AAGD,MAAM,8BAA8B,EAAE,MAAM,CAC1C,yBACA,KAAK,KAAK,uBAAuB,CACnC,CAAC;AAED,SAAS,WAAW,KAAmB;CACrC,OAAO,CAAC,kBAAkB,IAAI,aAAa,IAAI,SAAS,CAAC;AAC3D;AAEA,SAAS,cAAiB,KAAiC;CACzD,OAAO,iBAAiB,GAAG,KAAK,MAAM,QAAQ,IAAI,MAAM;AAC1D"}
|
package/dist/util/http/http.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ declare abstract class HttpBase<JSONOpts extends HttpOptions = HttpOptions, Opts
|
|
|
27
27
|
protected extraOptions(): readonly string[];
|
|
28
28
|
protected processOptions(_url: URL, _options: InternalHttpOptions): void;
|
|
29
29
|
protected handleError(_url: string | URL, _httpOptions: HttpOptions, err: Error): never;
|
|
30
|
+
protected handleResponse(_url: URL, _res: HttpResponse<unknown>): void;
|
|
30
31
|
resolveUrl(requestUrl: string | URL, options?: HttpOptions): URL;
|
|
31
32
|
protected calculateRetryDelay({ computedValue }: RetryObject): number;
|
|
32
33
|
get(url: string, options?: HttpOptions): Promise<HttpResponse<string | Buffer>>;
|
package/dist/util/http/http.js
CHANGED
|
@@ -111,6 +111,7 @@ var HttpBase = class {
|
|
|
111
111
|
const deepCopyNeeded = !!memCacheKey && res.statusCode !== 304;
|
|
112
112
|
const resCopy = copyResponse(res, deepCopyNeeded);
|
|
113
113
|
resCopy.authorization = !!options?.headers?.authorization;
|
|
114
|
+
this.handleResponse(resolvedUrl, resCopy);
|
|
114
115
|
if (cacheProvider) return await cacheProvider.wrapServerResponse(method, url, resCopy);
|
|
115
116
|
return resCopy;
|
|
116
117
|
} catch (err) {
|
|
@@ -142,6 +143,7 @@ var HttpBase = class {
|
|
|
142
143
|
handleError(_url, _httpOptions, err) {
|
|
143
144
|
throw err;
|
|
144
145
|
}
|
|
146
|
+
handleResponse(_url, _res) {}
|
|
145
147
|
resolveUrl(requestUrl, options) {
|
|
146
148
|
let url = requestUrl;
|
|
147
149
|
if (url instanceof URL) return url;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","names":["memCache.get"],"sources":["../../../lib/util/http/http.ts"],"sourcesContent":["import { isPlainObject, isUndefined } from '@sindresorhus/is';\nimport merge from 'deepmerge';\nimport type { Options, OptionsInit, RetryObject } from 'got';\nimport type { Merge, SetRequired } from 'type-fest';\nimport type { z } from 'zod/v4';\nimport { ZodType } from 'zod/v4';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport * as memCache from '../cache/memory/index.ts';\nimport { getEnv } from '../env.ts';\nimport { hash } from '../hash.ts';\nimport { acquireLock } from '../mutex.ts';\nimport { type AsyncResult, Result } from '../result.ts';\nimport { Toml } from '../schema-utils/index.ts';\nimport { ObsoleteCacheHitLogger } from '../stats.ts';\nimport { compile } from '../template/index.ts';\nimport { isHttpUrl, parseUrl, resolveBaseUrl } from '../url.ts';\nimport { parseSingleYaml } from '../yaml.ts';\nimport { applyAuthorization } from './auth.ts';\nimport type { HttpCacheProvider } from './cache/types.ts';\nimport { fetch, normalize, stream } from './got.ts';\nimport { applyHostRule, findMatchingRule } from './host-rules.ts';\n\nimport { getQueue } from './queue.ts';\nimport { getRetryAfter, wrapWithRetry } from './retry-after.ts';\nimport { getThrottle } from './throttle.ts';\nimport type {\n GotOptions,\n GotStreamOptions,\n GotTask,\n HttpMethod,\n HttpOptions,\n HttpResponse,\n SafeJsonError,\n} from './types.ts';\nimport { copyResponse } from './util.ts';\n\nexport interface InternalJsonUnsafeOptions<\n Opts extends HttpOptions = HttpOptions,\n> {\n url: string | URL;\n httpOptions?: Opts;\n}\n\nexport interface InternalJsonOptions<\n Opts extends HttpOptions,\n ResT = unknown,\n Schema extends ZodType<ResT, any> = ZodType<ResT, any>,\n> extends InternalJsonUnsafeOptions<Opts> {\n schema?: Schema;\n}\n\nexport type InternalGotOptions = SetRequired<GotOptions, 'method' | 'context'>;\n\nexport interface InternalHttpOptions extends HttpOptions {\n json?: HttpOptions['body'];\n\n method?: HttpMethod;\n\n parseJson?: Options['parseJson'];\n}\n\nexport function applyDefaultHeaders(options: OptionsInit): void {\n const userAgentTemplate = GlobalConfig.get('userAgent');\n options.headers = {\n ...options.headers,\n 'user-agent': compile(userAgentTemplate, {}),\n };\n}\n\nexport abstract class HttpBase<\n JSONOpts extends HttpOptions = HttpOptions,\n Opts extends HttpOptions = HttpOptions,\n> {\n private readonly options: InternalGotOptions;\n\n protected get baseUrl(): string | undefined {\n return undefined;\n }\n\n protected hostType: string;\n\n constructor(hostType: string, options: HttpOptions = {}) {\n this.hostType = hostType;\n const retryLimit = getEnv().NODE_ENV === 'test' ? 0 : 2;\n this.options = merge<InternalGotOptions>(\n options,\n {\n method: 'get',\n context: { hostType },\n retry: {\n calculateDelay: (retryObject) =>\n this.calculateRetryDelay(retryObject),\n limit: retryLimit,\n maxRetryAfter: 0, // Don't rely on `got` retry-after handling, just let it fail and then we'll handle it\n },\n },\n { isMergeableObject: isPlainObject },\n );\n }\n\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions,\n ): Promise<HttpResponse>;\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'text' },\n ): Promise<HttpResponse>;\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'buffer' },\n ): Promise<HttpResponse<Buffer>>;\n private async request<T = unknown>(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'json' },\n ): Promise<HttpResponse<T>>;\n\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions,\n ): Promise<HttpResponse<unknown>> {\n const resolvedUrl = this.resolveUrl(requestUrl, httpOptions);\n const url = resolvedUrl.toString();\n\n this.processOptions(resolvedUrl, httpOptions);\n\n let options = merge<InternalGotOptions, InternalHttpOptions>(\n {\n ...this.options,\n hostType: this.hostType,\n },\n httpOptions,\n { isMergeableObject: isPlainObject },\n );\n\n const method = options.method.toLowerCase();\n const isReadMethod = ['head', 'get'].includes(method);\n\n logger.trace(`HTTP request: ${method.toUpperCase()} ${url}`);\n\n applyDefaultHeaders(options);\n\n if (isUndefined(options.readOnly) && isReadMethod) {\n options.readOnly = true;\n }\n\n const hostRule = findMatchingRule(url, options);\n options = applyHostRule(url, options, hostRule);\n if (options.enabled === false) {\n logger.debug(`Host is disabled - rejecting request. HostUrl: ${url}`);\n throw new Error(HOST_DISABLED);\n }\n options = applyAuthorization(options);\n const timeout = options.timeout ?? 60000;\n options.timeout = timeout;\n\n let cacheProvider: HttpCacheProvider | undefined;\n if (isReadMethod && options.cacheProvider) {\n cacheProvider = options.cacheProvider;\n }\n\n const memCacheKey =\n !process.env.RENOVATE_X_DISABLE_HTTP_MEMCACHE &&\n !cacheProvider &&\n options.memCache !== false &&\n isReadMethod\n ? hash(\n `got-${JSON.stringify({\n url,\n headers: options.headers,\n method,\n })}`,\n )\n : null;\n\n let resPromise: Promise<HttpResponse<unknown>> | null = null;\n\n // Cache GET requests unless memCache=false\n if (memCacheKey) {\n resPromise = memCache.get(memCacheKey);\n\n /* v8 ignore next: temporary code */\n if (resPromise && !cacheProvider) {\n ObsoleteCacheHitLogger.write(url);\n }\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (!resPromise) {\n if (cacheProvider) {\n await cacheProvider.setCacheHeaders(method, url, options);\n }\n\n const startTime = Date.now();\n const httpTask: GotTask = async () => {\n let releaseLock: undefined | (() => void);\n if (isReadMethod) {\n releaseLock = await acquireLock(\n `${options.method} ${url}`,\n 'http-mutex',\n timeout * 2,\n );\n }\n try {\n const cachedResponse = await cacheProvider?.bypassServer<unknown>(\n options.method,\n url,\n );\n if (cachedResponse) {\n return cachedResponse;\n }\n\n const queueMs = Date.now() - startTime;\n return fetch(url, this._normalizeOptions(options), {\n queueMs,\n });\n } finally {\n releaseLock?.();\n }\n };\n\n const throttle = getThrottle(url);\n const throttledTask = throttle ? () => throttle.add(httpTask) : httpTask;\n\n const queue = getQueue(url);\n const queuedTask = queue ? () => queue.add(throttledTask) : throttledTask;\n\n const { maxRetryAfter = 60 } = hostRule;\n resPromise = wrapWithRetry(queuedTask, url, getRetryAfter, maxRetryAfter);\n\n if (memCacheKey) {\n memCache.set(memCacheKey, resPromise);\n }\n }\n\n try {\n const res = await resPromise;\n const deepCopyNeeded = !!memCacheKey && res.statusCode !== 304;\n const resCopy = copyResponse(res, deepCopyNeeded);\n resCopy.authorization = !!options?.headers?.authorization;\n\n if (cacheProvider) {\n return await cacheProvider.wrapServerResponse(method, url, resCopy);\n }\n\n return resCopy;\n } catch (err) {\n const { abortOnError, abortIgnoreStatusCodes } = options;\n if (abortOnError && !abortIgnoreStatusCodes?.includes(err.statusCode)) {\n throw new ExternalHostError(err);\n }\n\n const staleResponse = await cacheProvider?.bypassServer<string | Buffer>(\n method,\n url,\n true,\n );\n if (staleResponse) {\n logger.debug(\n { err },\n `Request error: returning stale cache instead for ${url}`,\n );\n return staleResponse;\n }\n\n this.handleError(requestUrl, httpOptions, err);\n }\n }\n\n private _normalizeOptions<T extends OptionsInit>(options: T): T {\n return normalize(options, this.extraOptions());\n }\n\n /**\n * Returns Renovate extra options which needs to be removed before passing to got.\n * @returns extra Renovate options.\n */\n protected extraOptions(): readonly string[] {\n return ['baseUrl', 'cacheProvider', 'readOnly'] as (keyof HttpOptions)[];\n }\n\n protected processOptions(_url: URL, _options: InternalHttpOptions): void {\n // noop\n }\n\n protected handleError(\n _url: string | URL,\n _httpOptions: HttpOptions,\n err: Error,\n ): never {\n throw err;\n }\n\n resolveUrl(requestUrl: string | URL, options?: HttpOptions): URL {\n let url = requestUrl;\n\n if (url instanceof URL) {\n // already a aboslute URL\n return url;\n }\n\n const baseUrl = options?.baseUrl ?? this.baseUrl;\n if (baseUrl) {\n url = resolveBaseUrl(baseUrl, url);\n }\n\n const parsedUrl = parseUrl(url);\n if (!parsedUrl || !isHttpUrl(parsedUrl)) {\n logger.error(\n { url: requestUrl, baseUrl, resolvedUrl: url },\n 'Request Error: cannot parse url',\n );\n throw new Error('Invalid URL');\n }\n return parsedUrl;\n }\n\n protected calculateRetryDelay({ computedValue }: RetryObject): number {\n return computedValue;\n }\n\n get(\n url: string,\n options: HttpOptions = {},\n ): Promise<HttpResponse<string | Buffer>> {\n return this.request(url, options);\n }\n\n head(url: string, options: HttpOptions = {}): Promise<HttpResponse<never>> {\n // to complex to validate\n return this.request(url, {\n ...options,\n responseType: 'text',\n method: 'head',\n }) as Promise<HttpResponse<never>>;\n }\n\n getText(url: string | URL, options: HttpOptions = {}): Promise<HttpResponse> {\n return this.request(url, { ...options, responseType: 'text' });\n }\n\n getBuffer(\n url: string | URL,\n options: HttpOptions = {},\n ): Promise<HttpResponse<Buffer>> {\n return this.request(url, { ...options, responseType: 'buffer' });\n }\n\n protected requestJsonUnsafe<ResT>(\n method: HttpMethod,\n { url, httpOptions: requestOptions }: InternalJsonUnsafeOptions<JSONOpts>,\n ): Promise<HttpResponse<ResT>> {\n const { body: json, ...httpOptions } = { ...requestOptions };\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method,\n };\n // signal that we expect a json response\n opts.headers = {\n accept: 'application/json',\n ...opts.headers,\n };\n if (json) {\n opts.json = json;\n }\n return this.request<ResT>(url, { ...opts, responseType: 'json' });\n }\n\n private async requestJson<\n ResT,\n Schema extends ZodType<ResT, any> = ZodType<ResT, any>,\n >(\n method: HttpMethod,\n options: InternalJsonOptions<JSONOpts, ResT, Schema>,\n ): Promise<HttpResponse<ResT>> {\n const res = await this.requestJsonUnsafe<ResT>(method, options);\n\n if (options.schema) {\n res.body = await options.schema.parseAsync(res.body);\n }\n\n return res;\n }\n\n private resolveArgs<ResT = unknown>(\n arg1: string,\n arg2: JSONOpts | ZodType<ResT> | undefined,\n arg3: ZodType<ResT> | undefined,\n ): InternalJsonOptions<JSONOpts, ResT> {\n const res: InternalJsonOptions<JSONOpts, ResT> = { url: arg1 };\n\n if (arg2 instanceof ZodType) {\n res.schema = arg2;\n } else if (arg2) {\n res.httpOptions = arg2;\n }\n\n if (arg3) {\n res.schema = arg3;\n }\n\n return res;\n }\n\n async getPlain(url: string, options?: Opts): Promise<HttpResponse> {\n const opt = options ?? {};\n return await this.getText(url, {\n headers: {\n Accept: 'text/plain',\n },\n ...opt,\n });\n }\n\n /**\n * @deprecated use `getYaml` instead\n */\n async getYamlUnchecked<ResT>(\n url: string,\n options?: Opts,\n ): Promise<HttpResponse<ResT>> {\n const res = await this.getText(url, options);\n const body = parseSingleYaml<ResT>(res.body);\n return { ...res, body };\n }\n\n async getYaml<Schema extends ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getYaml<Schema extends ZodType<any, any, any>>(\n url: string,\n options: Opts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getYaml<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: Opts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const url = arg1;\n let schema: Schema;\n let httpOptions: Opts | undefined;\n if (arg3) {\n schema = arg3;\n httpOptions = arg2 as Opts;\n } else {\n schema = arg2 as Schema;\n }\n\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method: 'get',\n };\n\n const res = await this.getText(url, opts);\n const body = await schema.parseAsync(parseSingleYaml(res.body));\n return { ...res, body };\n }\n\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(url: string, schema: Schema): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(\n url: string,\n options: Opts,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(\n arg1: string,\n arg2: Opts | Schema,\n arg3?: Schema,\n ): AsyncResult<ResT, SafeJsonError> {\n const url = arg1;\n let schema: Schema;\n let httpOptions: Opts | undefined;\n if (arg3) {\n schema = arg3;\n httpOptions = arg2 as Opts;\n } else {\n schema = arg2 as Schema;\n }\n\n let res: AsyncResult<HttpResponse<ResT>, SafeJsonError>;\n if (httpOptions) {\n res = Result.wrap(this.getYaml(url, httpOptions, schema));\n } else {\n res = Result.wrap(this.getYaml(url, schema));\n }\n\n return res.transform((response) => Result.ok(response.body));\n }\n\n /**\n * Request JSON and return the response without any validation.\n *\n * The usage of this method is discouraged, please use `getJson` instead.\n *\n * If you're new to Zod schema validation library:\n * - consult the [documentation of Zod library](https://github.com/colinhacks/zod?tab=readme-ov-file#basic-usage)\n * - search the Renovate codebase for 'zod' module usage\n * - take a look at the `schema-utils.ts` file for Renovate-specific schemas and utilities\n */\n getJsonUnchecked<ResT = unknown>(\n url: string,\n options?: JSONOpts,\n ): Promise<HttpResponse<ResT>> {\n return this.requestJson<ResT>('get', { url, httpOptions: options });\n }\n\n /**\n * Request JSON with a Zod schema for the response,\n * throwing an error if the response is not valid.\n *\n * @param url\n * @param schema Zod schema for the response\n */\n getJson<Schema extends ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n getJson<Schema extends ZodType<any, any, any>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n getJson<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const args = this.resolveArgs<z.infer<Schema>>(arg1, arg2, arg3);\n return this.requestJson<z.infer<Schema>>('get', args);\n }\n\n /**\n * Request JSON with a Zod schema for the response,\n * wrapping response data in a `Result` class.\n *\n * @param url\n * @param schema Zod schema for the response\n */\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n url: string,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): AsyncResult<ResT, SafeJsonError> {\n const args = this.resolveArgs<ResT>(arg1, arg2, arg3);\n return Result.wrap(this.requestJson<ResT>('get', args)).transform(\n (response) => Result.ok(response.body),\n );\n }\n\n /**\n * @deprecated use `head` instead\n */\n headJson(url: string, httpOptions?: JSONOpts): Promise<HttpResponse<never>> {\n return this.requestJson<never>('head', { url, httpOptions });\n }\n\n postJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n postJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n postJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n postJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('post', args);\n }\n\n putJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n putJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n putJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n putJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs<T>(arg1, arg2, arg3);\n return this.requestJson<T>('put', args);\n }\n\n patchJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n patchJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n patchJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n patchJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('patch', args);\n }\n\n deleteJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n deleteJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n deleteJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n deleteJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('delete', args);\n }\n\n stream(url: string, options?: HttpOptions): NodeJS.ReadableStream {\n let combinedOptions: Merge<\n GotStreamOptions,\n SetRequired<InternalHttpOptions, 'method'>\n > = {\n ...this.options,\n hostType: this.hostType,\n ...options,\n method: 'get',\n };\n\n const resolvedUrl = this.resolveUrl(url, options).toString();\n\n applyDefaultHeaders(combinedOptions);\n\n // v8 ignore else -- TODO: add test #40625\n if (\n isUndefined(combinedOptions.readOnly) &&\n ['head', 'get'].includes(combinedOptions.method)\n ) {\n combinedOptions.readOnly = true;\n }\n\n const hostRule = findMatchingRule(url, combinedOptions);\n combinedOptions = applyHostRule(resolvedUrl, combinedOptions, hostRule);\n if (combinedOptions.enabled === false) {\n throw new Error(HOST_DISABLED);\n }\n combinedOptions = applyAuthorization(combinedOptions);\n\n return stream(resolvedUrl, this._normalizeOptions(combinedOptions));\n }\n\n async getToml<Schema extends ZodType<any, any, any>>(\n url: string,\n schema?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getToml<Schema extends ZodType<any, any, any>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getToml<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const { url, schema, httpOptions } = this.resolveArgs<z.infer<Schema>>(\n arg1,\n arg2,\n arg3,\n );\n\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method: 'get',\n headers: {\n 'Content-Type': 'application/toml',\n ...httpOptions?.headers,\n },\n };\n\n const res = await this.getText(url, opts);\n if (schema) {\n res.body = await Toml.pipe(schema).parseAsync(res.body);\n } else {\n res.body = (await Toml.parseAsync(res.body)) as z.infer<Schema>;\n }\n\n return res as HttpResponse<z.infer<Schema>>;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http.js","names":["memCache.get"],"sources":["../../../lib/util/http/http.ts"],"sourcesContent":["import { isPlainObject, isUndefined } from '@sindresorhus/is';\nimport merge from 'deepmerge';\nimport type { Options, OptionsInit, RetryObject } from 'got';\nimport type { Merge, SetRequired } from 'type-fest';\nimport type { z } from 'zod/v4';\nimport { ZodType } from 'zod/v4';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport * as memCache from '../cache/memory/index.ts';\nimport { getEnv } from '../env.ts';\nimport { hash } from '../hash.ts';\nimport { acquireLock } from '../mutex.ts';\nimport { type AsyncResult, Result } from '../result.ts';\nimport { Toml } from '../schema-utils/index.ts';\nimport { ObsoleteCacheHitLogger } from '../stats.ts';\nimport { compile } from '../template/index.ts';\nimport { isHttpUrl, parseUrl, resolveBaseUrl } from '../url.ts';\nimport { parseSingleYaml } from '../yaml.ts';\nimport { applyAuthorization } from './auth.ts';\nimport type { HttpCacheProvider } from './cache/types.ts';\nimport { fetch, normalize, stream } from './got.ts';\nimport { applyHostRule, findMatchingRule } from './host-rules.ts';\n\nimport { getQueue } from './queue.ts';\nimport { getRetryAfter, wrapWithRetry } from './retry-after.ts';\nimport { getThrottle } from './throttle.ts';\nimport type {\n GotOptions,\n GotStreamOptions,\n GotTask,\n HttpMethod,\n HttpOptions,\n HttpResponse,\n SafeJsonError,\n} from './types.ts';\nimport { copyResponse } from './util.ts';\n\nexport interface InternalJsonUnsafeOptions<\n Opts extends HttpOptions = HttpOptions,\n> {\n url: string | URL;\n httpOptions?: Opts;\n}\n\nexport interface InternalJsonOptions<\n Opts extends HttpOptions,\n ResT = unknown,\n Schema extends ZodType<ResT, any> = ZodType<ResT, any>,\n> extends InternalJsonUnsafeOptions<Opts> {\n schema?: Schema;\n}\n\nexport type InternalGotOptions = SetRequired<GotOptions, 'method' | 'context'>;\n\nexport interface InternalHttpOptions extends HttpOptions {\n json?: HttpOptions['body'];\n\n method?: HttpMethod;\n\n parseJson?: Options['parseJson'];\n}\n\nexport function applyDefaultHeaders(options: OptionsInit): void {\n const userAgentTemplate = GlobalConfig.get('userAgent');\n options.headers = {\n ...options.headers,\n 'user-agent': compile(userAgentTemplate, {}),\n };\n}\n\nexport abstract class HttpBase<\n JSONOpts extends HttpOptions = HttpOptions,\n Opts extends HttpOptions = HttpOptions,\n> {\n private readonly options: InternalGotOptions;\n\n protected get baseUrl(): string | undefined {\n return undefined;\n }\n\n protected hostType: string;\n\n constructor(hostType: string, options: HttpOptions = {}) {\n this.hostType = hostType;\n const retryLimit = getEnv().NODE_ENV === 'test' ? 0 : 2;\n this.options = merge<InternalGotOptions>(\n options,\n {\n method: 'get',\n context: { hostType },\n retry: {\n calculateDelay: (retryObject) =>\n this.calculateRetryDelay(retryObject),\n limit: retryLimit,\n maxRetryAfter: 0, // Don't rely on `got` retry-after handling, just let it fail and then we'll handle it\n },\n },\n { isMergeableObject: isPlainObject },\n );\n }\n\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions,\n ): Promise<HttpResponse>;\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'text' },\n ): Promise<HttpResponse>;\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'buffer' },\n ): Promise<HttpResponse<Buffer>>;\n private async request<T = unknown>(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'json' },\n ): Promise<HttpResponse<T>>;\n\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions,\n ): Promise<HttpResponse<unknown>> {\n const resolvedUrl = this.resolveUrl(requestUrl, httpOptions);\n const url = resolvedUrl.toString();\n\n this.processOptions(resolvedUrl, httpOptions);\n\n let options = merge<InternalGotOptions, InternalHttpOptions>(\n {\n ...this.options,\n hostType: this.hostType,\n },\n httpOptions,\n { isMergeableObject: isPlainObject },\n );\n\n const method = options.method.toLowerCase();\n const isReadMethod = ['head', 'get'].includes(method);\n\n logger.trace(`HTTP request: ${method.toUpperCase()} ${url}`);\n\n applyDefaultHeaders(options);\n\n if (isUndefined(options.readOnly) && isReadMethod) {\n options.readOnly = true;\n }\n\n const hostRule = findMatchingRule(url, options);\n options = applyHostRule(url, options, hostRule);\n if (options.enabled === false) {\n logger.debug(`Host is disabled - rejecting request. HostUrl: ${url}`);\n throw new Error(HOST_DISABLED);\n }\n options = applyAuthorization(options);\n const timeout = options.timeout ?? 60000;\n options.timeout = timeout;\n\n let cacheProvider: HttpCacheProvider | undefined;\n if (isReadMethod && options.cacheProvider) {\n cacheProvider = options.cacheProvider;\n }\n\n const memCacheKey =\n !process.env.RENOVATE_X_DISABLE_HTTP_MEMCACHE &&\n !cacheProvider &&\n options.memCache !== false &&\n isReadMethod\n ? hash(\n `got-${JSON.stringify({\n url,\n headers: options.headers,\n method,\n })}`,\n )\n : null;\n\n let resPromise: Promise<HttpResponse<unknown>> | null = null;\n\n // Cache GET requests unless memCache=false\n if (memCacheKey) {\n resPromise = memCache.get(memCacheKey);\n\n /* v8 ignore next: temporary code */\n if (resPromise && !cacheProvider) {\n ObsoleteCacheHitLogger.write(url);\n }\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (!resPromise) {\n if (cacheProvider) {\n await cacheProvider.setCacheHeaders(method, url, options);\n }\n\n const startTime = Date.now();\n const httpTask: GotTask = async () => {\n let releaseLock: undefined | (() => void);\n if (isReadMethod) {\n releaseLock = await acquireLock(\n `${options.method} ${url}`,\n 'http-mutex',\n timeout * 2,\n );\n }\n try {\n const cachedResponse = await cacheProvider?.bypassServer<unknown>(\n options.method,\n url,\n );\n if (cachedResponse) {\n return cachedResponse;\n }\n\n const queueMs = Date.now() - startTime;\n return fetch(url, this._normalizeOptions(options), {\n queueMs,\n });\n } finally {\n releaseLock?.();\n }\n };\n\n const throttle = getThrottle(url);\n const throttledTask = throttle ? () => throttle.add(httpTask) : httpTask;\n\n const queue = getQueue(url);\n const queuedTask = queue ? () => queue.add(throttledTask) : throttledTask;\n\n const { maxRetryAfter = 60 } = hostRule;\n resPromise = wrapWithRetry(queuedTask, url, getRetryAfter, maxRetryAfter);\n\n if (memCacheKey) {\n memCache.set(memCacheKey, resPromise);\n }\n }\n\n try {\n const res = await resPromise;\n const deepCopyNeeded = !!memCacheKey && res.statusCode !== 304;\n const resCopy = copyResponse(res, deepCopyNeeded);\n resCopy.authorization = !!options?.headers?.authorization;\n\n this.handleResponse(resolvedUrl, resCopy);\n\n if (cacheProvider) {\n return await cacheProvider.wrapServerResponse(method, url, resCopy);\n }\n\n return resCopy;\n } catch (err) {\n const { abortOnError, abortIgnoreStatusCodes } = options;\n if (abortOnError && !abortIgnoreStatusCodes?.includes(err.statusCode)) {\n throw new ExternalHostError(err);\n }\n\n const staleResponse = await cacheProvider?.bypassServer<string | Buffer>(\n method,\n url,\n true,\n );\n if (staleResponse) {\n logger.debug(\n { err },\n `Request error: returning stale cache instead for ${url}`,\n );\n return staleResponse;\n }\n\n this.handleError(requestUrl, httpOptions, err);\n }\n }\n\n private _normalizeOptions<T extends OptionsInit>(options: T): T {\n return normalize(options, this.extraOptions());\n }\n\n /**\n * Returns Renovate extra options which needs to be removed before passing to got.\n * @returns extra Renovate options.\n */\n protected extraOptions(): readonly string[] {\n return ['baseUrl', 'cacheProvider', 'readOnly'] as (keyof HttpOptions)[];\n }\n\n protected processOptions(_url: URL, _options: InternalHttpOptions): void {\n // noop\n }\n\n protected handleError(\n _url: string | URL,\n _httpOptions: HttpOptions,\n err: Error,\n ): never {\n throw err;\n }\n\n protected handleResponse(_url: URL, _res: HttpResponse<unknown>): void {\n // noop\n }\n\n resolveUrl(requestUrl: string | URL, options?: HttpOptions): URL {\n let url = requestUrl;\n\n if (url instanceof URL) {\n // already a aboslute URL\n return url;\n }\n\n const baseUrl = options?.baseUrl ?? this.baseUrl;\n if (baseUrl) {\n url = resolveBaseUrl(baseUrl, url);\n }\n\n const parsedUrl = parseUrl(url);\n if (!parsedUrl || !isHttpUrl(parsedUrl)) {\n logger.error(\n { url: requestUrl, baseUrl, resolvedUrl: url },\n 'Request Error: cannot parse url',\n );\n throw new Error('Invalid URL');\n }\n return parsedUrl;\n }\n\n protected calculateRetryDelay({ computedValue }: RetryObject): number {\n return computedValue;\n }\n\n get(\n url: string,\n options: HttpOptions = {},\n ): Promise<HttpResponse<string | Buffer>> {\n return this.request(url, options);\n }\n\n head(url: string, options: HttpOptions = {}): Promise<HttpResponse<never>> {\n // to complex to validate\n return this.request(url, {\n ...options,\n responseType: 'text',\n method: 'head',\n }) as Promise<HttpResponse<never>>;\n }\n\n getText(url: string | URL, options: HttpOptions = {}): Promise<HttpResponse> {\n return this.request(url, { ...options, responseType: 'text' });\n }\n\n getBuffer(\n url: string | URL,\n options: HttpOptions = {},\n ): Promise<HttpResponse<Buffer>> {\n return this.request(url, { ...options, responseType: 'buffer' });\n }\n\n protected requestJsonUnsafe<ResT>(\n method: HttpMethod,\n { url, httpOptions: requestOptions }: InternalJsonUnsafeOptions<JSONOpts>,\n ): Promise<HttpResponse<ResT>> {\n const { body: json, ...httpOptions } = { ...requestOptions };\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method,\n };\n // signal that we expect a json response\n opts.headers = {\n accept: 'application/json',\n ...opts.headers,\n };\n if (json) {\n opts.json = json;\n }\n return this.request<ResT>(url, { ...opts, responseType: 'json' });\n }\n\n private async requestJson<\n ResT,\n Schema extends ZodType<ResT, any> = ZodType<ResT, any>,\n >(\n method: HttpMethod,\n options: InternalJsonOptions<JSONOpts, ResT, Schema>,\n ): Promise<HttpResponse<ResT>> {\n const res = await this.requestJsonUnsafe<ResT>(method, options);\n\n if (options.schema) {\n res.body = await options.schema.parseAsync(res.body);\n }\n\n return res;\n }\n\n private resolveArgs<ResT = unknown>(\n arg1: string,\n arg2: JSONOpts | ZodType<ResT> | undefined,\n arg3: ZodType<ResT> | undefined,\n ): InternalJsonOptions<JSONOpts, ResT> {\n const res: InternalJsonOptions<JSONOpts, ResT> = { url: arg1 };\n\n if (arg2 instanceof ZodType) {\n res.schema = arg2;\n } else if (arg2) {\n res.httpOptions = arg2;\n }\n\n if (arg3) {\n res.schema = arg3;\n }\n\n return res;\n }\n\n async getPlain(url: string, options?: Opts): Promise<HttpResponse> {\n const opt = options ?? {};\n return await this.getText(url, {\n headers: {\n Accept: 'text/plain',\n },\n ...opt,\n });\n }\n\n /**\n * @deprecated use `getYaml` instead\n */\n async getYamlUnchecked<ResT>(\n url: string,\n options?: Opts,\n ): Promise<HttpResponse<ResT>> {\n const res = await this.getText(url, options);\n const body = parseSingleYaml<ResT>(res.body);\n return { ...res, body };\n }\n\n async getYaml<Schema extends ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getYaml<Schema extends ZodType<any, any, any>>(\n url: string,\n options: Opts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getYaml<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: Opts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const url = arg1;\n let schema: Schema;\n let httpOptions: Opts | undefined;\n if (arg3) {\n schema = arg3;\n httpOptions = arg2 as Opts;\n } else {\n schema = arg2 as Schema;\n }\n\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method: 'get',\n };\n\n const res = await this.getText(url, opts);\n const body = await schema.parseAsync(parseSingleYaml(res.body));\n return { ...res, body };\n }\n\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(url: string, schema: Schema): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(\n url: string,\n options: Opts,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(\n arg1: string,\n arg2: Opts | Schema,\n arg3?: Schema,\n ): AsyncResult<ResT, SafeJsonError> {\n const url = arg1;\n let schema: Schema;\n let httpOptions: Opts | undefined;\n if (arg3) {\n schema = arg3;\n httpOptions = arg2 as Opts;\n } else {\n schema = arg2 as Schema;\n }\n\n let res: AsyncResult<HttpResponse<ResT>, SafeJsonError>;\n if (httpOptions) {\n res = Result.wrap(this.getYaml(url, httpOptions, schema));\n } else {\n res = Result.wrap(this.getYaml(url, schema));\n }\n\n return res.transform((response) => Result.ok(response.body));\n }\n\n /**\n * Request JSON and return the response without any validation.\n *\n * The usage of this method is discouraged, please use `getJson` instead.\n *\n * If you're new to Zod schema validation library:\n * - consult the [documentation of Zod library](https://github.com/colinhacks/zod?tab=readme-ov-file#basic-usage)\n * - search the Renovate codebase for 'zod' module usage\n * - take a look at the `schema-utils.ts` file for Renovate-specific schemas and utilities\n */\n getJsonUnchecked<ResT = unknown>(\n url: string,\n options?: JSONOpts,\n ): Promise<HttpResponse<ResT>> {\n return this.requestJson<ResT>('get', { url, httpOptions: options });\n }\n\n /**\n * Request JSON with a Zod schema for the response,\n * throwing an error if the response is not valid.\n *\n * @param url\n * @param schema Zod schema for the response\n */\n getJson<Schema extends ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n getJson<Schema extends ZodType<any, any, any>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n getJson<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const args = this.resolveArgs<z.infer<Schema>>(arg1, arg2, arg3);\n return this.requestJson<z.infer<Schema>>('get', args);\n }\n\n /**\n * Request JSON with a Zod schema for the response,\n * wrapping response data in a `Result` class.\n *\n * @param url\n * @param schema Zod schema for the response\n */\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n url: string,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): AsyncResult<ResT, SafeJsonError> {\n const args = this.resolveArgs<ResT>(arg1, arg2, arg3);\n return Result.wrap(this.requestJson<ResT>('get', args)).transform(\n (response) => Result.ok(response.body),\n );\n }\n\n /**\n * @deprecated use `head` instead\n */\n headJson(url: string, httpOptions?: JSONOpts): Promise<HttpResponse<never>> {\n return this.requestJson<never>('head', { url, httpOptions });\n }\n\n postJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n postJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n postJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n postJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('post', args);\n }\n\n putJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n putJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n putJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n putJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs<T>(arg1, arg2, arg3);\n return this.requestJson<T>('put', args);\n }\n\n patchJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n patchJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n patchJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n patchJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('patch', args);\n }\n\n deleteJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n deleteJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n deleteJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n deleteJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('delete', args);\n }\n\n stream(url: string, options?: HttpOptions): NodeJS.ReadableStream {\n let combinedOptions: Merge<\n GotStreamOptions,\n SetRequired<InternalHttpOptions, 'method'>\n > = {\n ...this.options,\n hostType: this.hostType,\n ...options,\n method: 'get',\n };\n\n const resolvedUrl = this.resolveUrl(url, options).toString();\n\n applyDefaultHeaders(combinedOptions);\n\n // v8 ignore else -- TODO: add test #40625\n if (\n isUndefined(combinedOptions.readOnly) &&\n ['head', 'get'].includes(combinedOptions.method)\n ) {\n combinedOptions.readOnly = true;\n }\n\n const hostRule = findMatchingRule(url, combinedOptions);\n combinedOptions = applyHostRule(resolvedUrl, combinedOptions, hostRule);\n if (combinedOptions.enabled === false) {\n throw new Error(HOST_DISABLED);\n }\n combinedOptions = applyAuthorization(combinedOptions);\n\n return stream(resolvedUrl, this._normalizeOptions(combinedOptions));\n }\n\n async getToml<Schema extends ZodType<any, any, any>>(\n url: string,\n schema?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getToml<Schema extends ZodType<any, any, any>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getToml<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const { url, schema, httpOptions } = this.resolveArgs<z.infer<Schema>>(\n arg1,\n arg2,\n arg3,\n );\n\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method: 'get',\n headers: {\n 'Content-Type': 'application/toml',\n ...httpOptions?.headers,\n },\n };\n\n const res = await this.getText(url, opts);\n if (schema) {\n res.body = await Toml.pipe(schema).parseAsync(res.body);\n } else {\n res.body = (await Toml.parseAsync(res.body)) as z.infer<Schema>;\n }\n\n return res as HttpResponse<z.infer<Schema>>;\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "renovate",
|
|
3
3
|
"description": "Automated dependency updates. Flexible so you don't need to be.",
|
|
4
|
-
"version": "44.
|
|
4
|
+
"version": "44.44.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -257,7 +257,7 @@
|
|
|
257
257
|
"@types/validate-npm-package-name": "4.0.2",
|
|
258
258
|
"@types/yauzl": "3.4.0",
|
|
259
259
|
"@types/yazl": "3.3.1",
|
|
260
|
-
"@vitest/coverage-v8": "4.1.
|
|
260
|
+
"@vitest/coverage-v8": "4.1.11",
|
|
261
261
|
"ajv": "8.20.0",
|
|
262
262
|
"ajv-formats": "3.0.1",
|
|
263
263
|
"aws-sdk-client-mock": "4.1.0",
|
|
@@ -288,7 +288,7 @@
|
|
|
288
288
|
"typescript": "7.0.2",
|
|
289
289
|
"unified": "11.0.5",
|
|
290
290
|
"vite": "8.2.1",
|
|
291
|
-
"vitest": "4.1.
|
|
291
|
+
"vitest": "4.1.11",
|
|
292
292
|
"vitest-mock-extended": "5.1.1",
|
|
293
293
|
"yazl": "3.3.1"
|
|
294
294
|
},
|
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.
|
|
3
|
+
"title": "JSON schema for Renovate 44.44.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.
|
|
5
|
+
"x-renovate-version": "44.44.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|