renovate 44.235.4 → 44.235.5
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 +3 -3
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/gitlabci/extract.js +14 -2
- package/dist/modules/manager/gitlabci/extract.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/pnpm.js +8 -6
- package/dist/modules/manager/npm/update/dependency/pnpm.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +2 -1
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/versioning/julia/index.js +2 -1
- package/dist/modules/versioning/julia/index.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -45,7 +45,7 @@ hashMap.set("fvm", "9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027
|
|
|
45
45
|
hashMap.set("gemspec", "3e467cfce562a0d7aef8f35083aceb9e41f9dce83dc0d4010422aee8dbc2a9d2");
|
|
46
46
|
hashMap.set("git-submodules", "064fa55369f11feec61b699cb122df6ea81f8e0c09ea9f7dbb96796c87be6950");
|
|
47
47
|
hashMap.set("github-actions", "a287f0081e4b18c68209b0e90762496839088522caf662aaf064b0fb945e139c");
|
|
48
|
-
hashMap.set("gitlabci", "
|
|
48
|
+
hashMap.set("gitlabci", "abc2a8a14a514d3c03eeca1fb67bb374931997b4221bc75733b81eb9a78018e5");
|
|
49
49
|
hashMap.set("gitlabci-include", "8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351");
|
|
50
50
|
hashMap.set("glasskube", "93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30");
|
|
51
51
|
hashMap.set("gleam", "5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3");
|
|
@@ -77,13 +77,13 @@ hashMap.set("mise", "432f3cd80b9fd3f76b2af73db5e96508edda102a0d7eb3265af232f07b8
|
|
|
77
77
|
hashMap.set("mix", "0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872");
|
|
78
78
|
hashMap.set("nix", "422242f1714be6972fc7006c37f4a497dbbd44ba9c3f68f7b73e7dd3d81fd74d");
|
|
79
79
|
hashMap.set("nodenv", "ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8");
|
|
80
|
-
hashMap.set("npm", "
|
|
80
|
+
hashMap.set("npm", "fd79695a5c7fb5e134308c5f4048c1376c3f3dc3d82c7d22e116445d4d7d321b");
|
|
81
81
|
hashMap.set("nuget", "fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f");
|
|
82
82
|
hashMap.set("nvm", "3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322");
|
|
83
83
|
hashMap.set("ocb", "032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca");
|
|
84
84
|
hashMap.set("osgi", "d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024");
|
|
85
85
|
hashMap.set("paket", "0cf8ff9b040ecf28f29b23bbe2ab2544ab3c94822bc1fb53ee4df7b74f000dea");
|
|
86
|
-
hashMap.set("pep621", "
|
|
86
|
+
hashMap.set("pep621", "702b061ee6ffbadc9a163f3d9d0dd043a1142f1c733e9222535dd2a2b7132e77");
|
|
87
87
|
hashMap.set("pep723", "77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f");
|
|
88
88
|
hashMap.set("pip-compile", "a98dc76a002e1dc21662237f009ff8fea36236bb4e24cb82ee30c6a78f57271f");
|
|
89
89
|
hashMap.set("pip_requirements", "bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a");
|
|
@@ -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','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','8e11293c8f61b4cbae77a3b1634a47213031c59df2c9833d89db65bf4e6edc64');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','559aca1db5b117b162962fe817db5550f1b17793b02b45982394ea2458e421f7');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','04a13dec4e08ba21004961c718072fde976226d65809fa3c838bf66ba93e5d5a');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4d4f1d9a6519ba552b316b396db13ff0654a2663d8ed976188899a2d57d306a2');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','85f389e291218c49c1c0400ba4c6c9ff7532a6b098e9a37b872fd26569c02fc0');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','0554277f0c9edfc12a8ba2aefdb74c890e274dabce1cbdb1383990063ddc510b');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','74ac02207de7b297d66dfed5b77c7fdeffcdcf2eac639798ba434d0571a90384');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','bbca094a652544845c147bd801b04ce4aae3719cb27acfb68b2ebac616940538');\nhashMap.set('conan','03cdeeffe4e688fb403766100cc1fc617dd388629f1c769ba54a966db3b23414');\nhashMap.set('copier','a0678cc1eec36301328780966eec215c6e18748ea80c98873c8e13291a684cfa');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','3dfe9b92c437010925c07b10e84cf69656de399f4032fb6db59480ce0fc08f27');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','b5faeb8f31d238e0d05a4aeebf9a837273687908ab8078b34e738bb0e369c80c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','ffa222820f72c4eb4cdc4c229ae8c50433bee96f3b974f0633d5a7d1f6427c97');\nhashMap.set('flux','f881de9cb1b09788f78a3de7c7bbfd8407f88a4af49a39b99f4f91634584249f');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('gemspec','3e467cfce562a0d7aef8f35083aceb9e41f9dce83dc0d4010422aee8dbc2a9d2');\nhashMap.set('git-submodules','064fa55369f11feec61b699cb122df6ea81f8e0c09ea9f7dbb96796c87be6950');\nhashMap.set('github-actions','a287f0081e4b18c68209b0e90762496839088522caf662aaf064b0fb945e139c');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','8b24033ac7fb1ef08c5fd4469854bef33064007b4aed6519ad09bd0d050048a2');\nhashMap.set('gradle','14ffeecba62452d47d3796e68753da745de2614b6e5ecc346da4f0067ed4bc6e');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','22f61344565f87ca3512c0ba8fac32627fde8ee919b7badae07b2116e285f049');\nhashMap.set('helm-values','0aa79bb0257d0d72e54dfd2653e59bfef63b97e46c035b7443593bdf6e6382aa');\nhashMap.set('helmfile','cb5377e2440515a79815f7a2833eb8510fbde2a454822bbb159e33ee027793fd');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','927798e082caf46a0da703389ba07e9e61fa73ef571ab551301b8fc6b06957d1');\nhashMap.set('hermit','abf066a64be5e5112e4da68896cf14583691e817d8bf2fc5ec65aebcc0fde53b');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('julia','1e8237ab435ea7acc9b8f3402385cd0a74f6c8f256d380b1ca4e8785cce6de8e');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','11b17044d29321b3b0ad8cee40ba00cd3297b9e94648556211043f1e8635c8e7');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','f9df7bfca0f8ffc2eff230aec09a53c8ae3e4012ac499a38622b31df203f047a');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','432f3cd80b9fd3f76b2af73db5e96508edda102a0d7eb3265af232f07b8e8f21');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','422242f1714be6972fc7006c37f4a497dbbd44ba9c3f68f7b73e7dd3d81fd74d');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','8c2d4126834c6a80d623b1ceae7be550b40b3355d854c76d511143aa0ee7864b');\nhashMap.set('nuget','fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('paket','0cf8ff9b040ecf28f29b23bbe2ab2544ab3c94822bc1fb53ee4df7b74f000dea');\nhashMap.set('pep621','6d6ef40bbc15aaab78a92efd3f7a7658958423385aaeb957f5174c0510e350b8');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','a98dc76a002e1dc21662237f009ff8fea36236bb4e24cb82ee30c6a78f57271f');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','9b8ac4f9432f2789f60847c80582966d5ed4f735d2f678c82416d0eb9548b4fa');\nhashMap.set('pixi','e31c397982ffa34222b061f23f3b3683f42523dd5dca45ecce2448b0ebc55ea2');\nhashMap.set('poetry','ee819d86b635173fe85aa2ae98396385999b3b4c182743e07cb3442108c74c8f');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','40927b98dd2bac45dba60e66b5fd0e6b84b61d02db8be536fda7b14546a4feb7');\nhashMap.set('renovate-config','890cabf707d01b58394e0bec05e3a29b73de8f0b43fcbe8a42cd26e328608d70');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','f30a8688f7cc19a6233d6efee51e942f32030d77a12c5d3201c67e3686de4936');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','48cdb72ce0a5f3239a741a87982769ac622d6071edae18e3e55641402ca1f170');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','6788a8569ba9c50c763ffa2bed952a4314ae8e696c29f93d3eb7c4a12d99ce20');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','300f8fb3c09667654412d2f5dd8ab4882e0f5d1d7a8bc39794993d2e7e58d1b7');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','30774cd456c443be2cd236fd5b8cd1cb821f1437c6309842e34960832df3557f');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','f2b92bf8afd6e23f68d47fc830f79529522a93e1ee5fb3f7594c7ce956f291f1');\nhashMap.set('regex','273c1965c363bb4d8488cc11ac7c1400280f93d75e66e3c3f1d0a45ec65f6419');"],"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','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','8e11293c8f61b4cbae77a3b1634a47213031c59df2c9833d89db65bf4e6edc64');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','559aca1db5b117b162962fe817db5550f1b17793b02b45982394ea2458e421f7');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','04a13dec4e08ba21004961c718072fde976226d65809fa3c838bf66ba93e5d5a');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4d4f1d9a6519ba552b316b396db13ff0654a2663d8ed976188899a2d57d306a2');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','85f389e291218c49c1c0400ba4c6c9ff7532a6b098e9a37b872fd26569c02fc0');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','0554277f0c9edfc12a8ba2aefdb74c890e274dabce1cbdb1383990063ddc510b');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','74ac02207de7b297d66dfed5b77c7fdeffcdcf2eac639798ba434d0571a90384');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','bbca094a652544845c147bd801b04ce4aae3719cb27acfb68b2ebac616940538');\nhashMap.set('conan','03cdeeffe4e688fb403766100cc1fc617dd388629f1c769ba54a966db3b23414');\nhashMap.set('copier','a0678cc1eec36301328780966eec215c6e18748ea80c98873c8e13291a684cfa');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','3dfe9b92c437010925c07b10e84cf69656de399f4032fb6db59480ce0fc08f27');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','b5faeb8f31d238e0d05a4aeebf9a837273687908ab8078b34e738bb0e369c80c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','ffa222820f72c4eb4cdc4c229ae8c50433bee96f3b974f0633d5a7d1f6427c97');\nhashMap.set('flux','f881de9cb1b09788f78a3de7c7bbfd8407f88a4af49a39b99f4f91634584249f');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('gemspec','3e467cfce562a0d7aef8f35083aceb9e41f9dce83dc0d4010422aee8dbc2a9d2');\nhashMap.set('git-submodules','064fa55369f11feec61b699cb122df6ea81f8e0c09ea9f7dbb96796c87be6950');\nhashMap.set('github-actions','a287f0081e4b18c68209b0e90762496839088522caf662aaf064b0fb945e139c');\nhashMap.set('gitlabci','abc2a8a14a514d3c03eeca1fb67bb374931997b4221bc75733b81eb9a78018e5');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','8b24033ac7fb1ef08c5fd4469854bef33064007b4aed6519ad09bd0d050048a2');\nhashMap.set('gradle','14ffeecba62452d47d3796e68753da745de2614b6e5ecc346da4f0067ed4bc6e');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','22f61344565f87ca3512c0ba8fac32627fde8ee919b7badae07b2116e285f049');\nhashMap.set('helm-values','0aa79bb0257d0d72e54dfd2653e59bfef63b97e46c035b7443593bdf6e6382aa');\nhashMap.set('helmfile','cb5377e2440515a79815f7a2833eb8510fbde2a454822bbb159e33ee027793fd');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','927798e082caf46a0da703389ba07e9e61fa73ef571ab551301b8fc6b06957d1');\nhashMap.set('hermit','abf066a64be5e5112e4da68896cf14583691e817d8bf2fc5ec65aebcc0fde53b');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('julia','1e8237ab435ea7acc9b8f3402385cd0a74f6c8f256d380b1ca4e8785cce6de8e');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','11b17044d29321b3b0ad8cee40ba00cd3297b9e94648556211043f1e8635c8e7');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','f9df7bfca0f8ffc2eff230aec09a53c8ae3e4012ac499a38622b31df203f047a');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','432f3cd80b9fd3f76b2af73db5e96508edda102a0d7eb3265af232f07b8e8f21');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','422242f1714be6972fc7006c37f4a497dbbd44ba9c3f68f7b73e7dd3d81fd74d');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','fd79695a5c7fb5e134308c5f4048c1376c3f3dc3d82c7d22e116445d4d7d321b');\nhashMap.set('nuget','fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('paket','0cf8ff9b040ecf28f29b23bbe2ab2544ab3c94822bc1fb53ee4df7b74f000dea');\nhashMap.set('pep621','702b061ee6ffbadc9a163f3d9d0dd043a1142f1c733e9222535dd2a2b7132e77');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','a98dc76a002e1dc21662237f009ff8fea36236bb4e24cb82ee30c6a78f57271f');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','9b8ac4f9432f2789f60847c80582966d5ed4f735d2f678c82416d0eb9548b4fa');\nhashMap.set('pixi','e31c397982ffa34222b061f23f3b3683f42523dd5dca45ecce2448b0ebc55ea2');\nhashMap.set('poetry','ee819d86b635173fe85aa2ae98396385999b3b4c182743e07cb3442108c74c8f');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','40927b98dd2bac45dba60e66b5fd0e6b84b61d02db8be536fda7b14546a4feb7');\nhashMap.set('renovate-config','890cabf707d01b58394e0bec05e3a29b73de8f0b43fcbe8a42cd26e328608d70');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','f30a8688f7cc19a6233d6efee51e942f32030d77a12c5d3201c67e3686de4936');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','48cdb72ce0a5f3239a741a87982769ac622d6071edae18e3e55641402ca1f170');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','6788a8569ba9c50c763ffa2bed952a4314ae8e696c29f93d3eb7c4a12d99ce20');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','300f8fb3c09667654412d2f5dd8ab4882e0f5d1d7a8bc39794993d2e7e58d1b7');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','30774cd456c443be2cd236fd5b8cd1cb821f1437c6309842e34960832df3557f');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','f2b92bf8afd6e23f68d47fc830f79529522a93e1ee5fb3f7594c7ce956f291f1');\nhashMap.set('regex','273c1965c363bb4d8488cc11ac7c1400280f93d75e66e3c3f1d0a45ec65f6419');"],"mappings":"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"}
|
|
@@ -7,7 +7,13 @@ import { GitlabTagsDatasource } from "../../datasource/gitlab-tags/index.js";
|
|
|
7
7
|
import { id } from "../../versioning/semver-partial/index.js";
|
|
8
8
|
import { GitlabDocument, Job, Jobs, MultiDocumentLocalIncludes } from "./schema.js";
|
|
9
9
|
import { getGitlabDep } from "./utils.js";
|
|
10
|
+
import { Scalar } from "yaml";
|
|
10
11
|
// lib/modules/manager/gitlabci/extract.ts
|
|
12
|
+
const referenceTag = {
|
|
13
|
+
tag: "!reference",
|
|
14
|
+
collection: "seq",
|
|
15
|
+
resolve: () => new Scalar(null)
|
|
16
|
+
};
|
|
11
17
|
const componentReferenceRegex = regEx(/(?<fqdn>[^/]+)\/(?<projectPath>.+)\/(?:.+)@(?<specificVersion>.+)/);
|
|
12
18
|
function extractDepFromIncludeComponent(component, registryAliases) {
|
|
13
19
|
let componentUrl = component;
|
|
@@ -33,7 +39,10 @@ function extractDepFromIncludeComponent(component, registryAliases) {
|
|
|
33
39
|
function extractPackageFile(content, packageFile, config) {
|
|
34
40
|
const deps = [];
|
|
35
41
|
try {
|
|
36
|
-
const docs = parseYaml(content, {
|
|
42
|
+
const docs = parseYaml(content, {
|
|
43
|
+
uniqueKeys: false,
|
|
44
|
+
customTags: [referenceTag]
|
|
45
|
+
});
|
|
37
46
|
for (const doc of docs) {
|
|
38
47
|
const topLevel = Job.parse(doc);
|
|
39
48
|
const jobs = Jobs.parse(doc);
|
|
@@ -79,7 +88,10 @@ async function extractAllPackageFiles(config, packageFiles) {
|
|
|
79
88
|
logger.debug({ packageFile: file }, `Empty or non existent gitlabci file`);
|
|
80
89
|
continue;
|
|
81
90
|
}
|
|
82
|
-
const { val: docs, err } = Result.wrap(() => parseYaml(content, {
|
|
91
|
+
const { val: docs, err } = Result.wrap(() => parseYaml(content, {
|
|
92
|
+
uniqueKeys: false,
|
|
93
|
+
customTags: [referenceTag]
|
|
94
|
+
})).unwrap();
|
|
83
95
|
if (err) {
|
|
84
96
|
logger.debug({
|
|
85
97
|
err,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":["semverPartialId"],"sources":["../../../../lib/modules/manager/gitlabci/extract.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { id as semverPartialId } from '../../versioning/semver-partial/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n GitlabDocument,\n Job,\n Jobs,\n MultiDocumentLocalIncludes,\n} from './schema.ts';\nimport { getGitlabDep } from './utils.ts';\n\n// See https://docs.gitlab.com/ee/ci/components/index.html#use-a-component\nconst componentReferenceRegex = regEx(\n /(?<fqdn>[^/]+)\\/(?<projectPath>.+)\\/(?:.+)@(?<specificVersion>.+)/,\n);\n\nfunction extractDepFromIncludeComponent(\n component: string,\n registryAliases?: Record<string, string>,\n): PackageDependency | null {\n let componentUrl = component;\n if (registryAliases) {\n for (const key in registryAliases) {\n componentUrl = componentUrl.replace(key, registryAliases[key]);\n }\n }\n const componentReference = componentReferenceRegex.exec(componentUrl)?.groups;\n if (!componentReference) {\n logger.debug(\n { componentReference: componentUrl },\n 'Ignoring malformed component reference',\n );\n return null;\n }\n const projectPathParts = componentReference.projectPath.split('/');\n if (projectPathParts.length < 2) {\n logger.debug(\n { componentReference: componentUrl },\n 'Ignoring component reference with incomplete project path',\n );\n return null;\n }\n\n const dep: PackageDependency = {\n datasource: GitlabTagsDatasource.id,\n depName: componentReference.projectPath,\n depType: 'repository',\n currentValue: componentReference.specificVersion,\n registryUrls: [`https://${componentReference.fqdn}`],\n versioning: semverPartialId,\n };\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const deps: PackageDependency[] = [];\n try {\n const docs = parseYaml(content, {
|
|
1
|
+
{"version":3,"file":"extract.js","names":["semverPartialId"],"sources":["../../../../lib/modules/manager/gitlabci/extract.ts"],"sourcesContent":["import { type CollectionTag, Scalar } from 'yaml';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { Result } from '../../../util/result.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { id as semverPartialId } from '../../versioning/semver-partial/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n GitlabDocument,\n Job,\n Jobs,\n MultiDocumentLocalIncludes,\n} from './schema.ts';\nimport { getGitlabDep } from './utils.ts';\n\n// GitLab `!reference` tags point at other parts of the configuration,\n// so they are resolved to `null` instead of being read as values.\n// A `Scalar` is returned because `yaml` ignores a bare `null` result.\n// See https://docs.gitlab.com/ci/yaml/yaml_optimization/#reference-tags\nconst referenceTag: CollectionTag = {\n tag: '!reference',\n collection: 'seq',\n resolve: () => new Scalar(null),\n};\n\n// See https://docs.gitlab.com/ee/ci/components/index.html#use-a-component\nconst componentReferenceRegex = regEx(\n /(?<fqdn>[^/]+)\\/(?<projectPath>.+)\\/(?:.+)@(?<specificVersion>.+)/,\n);\n\nfunction extractDepFromIncludeComponent(\n component: string,\n registryAliases?: Record<string, string>,\n): PackageDependency | null {\n let componentUrl = component;\n if (registryAliases) {\n for (const key in registryAliases) {\n componentUrl = componentUrl.replace(key, registryAliases[key]);\n }\n }\n const componentReference = componentReferenceRegex.exec(componentUrl)?.groups;\n if (!componentReference) {\n logger.debug(\n { componentReference: componentUrl },\n 'Ignoring malformed component reference',\n );\n return null;\n }\n const projectPathParts = componentReference.projectPath.split('/');\n if (projectPathParts.length < 2) {\n logger.debug(\n { componentReference: componentUrl },\n 'Ignoring component reference with incomplete project path',\n );\n return null;\n }\n\n const dep: PackageDependency = {\n datasource: GitlabTagsDatasource.id,\n depName: componentReference.projectPath,\n depType: 'repository',\n currentValue: componentReference.specificVersion,\n registryUrls: [`https://${componentReference.fqdn}`],\n versioning: semverPartialId,\n };\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const deps: PackageDependency[] = [];\n try {\n const docs = parseYaml(content, {\n uniqueKeys: false,\n customTags: [referenceTag],\n });\n\n for (const doc of docs) {\n const topLevel = Job.parse(doc);\n const jobs = Jobs.parse(doc);\n\n for (const job of [topLevel, ...jobs]) {\n const { image, services } = job;\n\n if (image) {\n const dep = getGitlabDep(image.value, config.registryAliases);\n dep.depType = image.type;\n deps.push(dep);\n }\n\n for (const service of services) {\n const dep = getGitlabDep(service, config.registryAliases);\n dep.depType = 'service-image';\n deps.push(dep);\n }\n }\n\n const includedComponents = GitlabDocument.parse(doc);\n for (const includedComponent of includedComponents) {\n const dep = extractDepFromIncludeComponent(\n includedComponent,\n config.registryAliases,\n );\n if (dep) {\n deps.push(dep);\n }\n }\n }\n } catch (err) /* istanbul ignore next */ {\n if (err.stack?.startsWith('YAMLException:')) {\n logger.debug(\n { err, packageFile },\n 'YAML exception extracting GitLab CI includes',\n );\n } else {\n logger.debug(\n { err, packageFile },\n 'Error extracting GitLab CI dependencies',\n );\n }\n }\n\n return deps.length ? { deps } : null;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[] | null> {\n const filesToExamine = [...packageFiles];\n const seen = new Set<string>(packageFiles);\n const results: PackageFile[] = [];\n\n // extract all includes from the files\n while (filesToExamine.length > 0) {\n const file = filesToExamine.pop()!;\n\n const content = await readLocalFile(file, 'utf8');\n if (!content) {\n logger.debug(\n { packageFile: file },\n `Empty or non existent gitlabci file`,\n );\n continue;\n }\n\n const { val: docs, err } = Result.wrap(() =>\n parseYaml(content, { uniqueKeys: false, customTags: [referenceTag] }),\n ).unwrap();\n\n if (err) {\n logger.debug(\n { err, packageFile: file },\n 'Error extracting GitLab CI dependencies',\n );\n continue;\n }\n\n const localIncludes = MultiDocumentLocalIncludes.parse(docs);\n for (const file of localIncludes) {\n if (!seen.has(file)) {\n seen.add(file);\n filesToExamine.push(file);\n }\n }\n\n const result = extractPackageFile(content, file, config);\n // v8 ignore else -- needs a listed file that yields no deps\n if (result !== null) {\n results.push({\n packageFile: file,\n deps: result.deps,\n });\n }\n }\n\n logger.trace(\n { packageFiles, files: filesToExamine.entries() },\n 'extracted all GitLab CI files',\n );\n\n if (!results.length) {\n return null;\n }\n\n return results;\n}\n"],"mappings":"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"}
|
|
@@ -41,14 +41,16 @@ function updatePnpmWorkspaceDependency({ fileContent, upgrade }) {
|
|
|
41
41
|
catalogName,
|
|
42
42
|
usesImplicitDefaultCatalog
|
|
43
43
|
}) : ["overrides", depName];
|
|
44
|
-
|
|
44
|
+
/* v8 ignore if -- this should not happen in practice, but we must satisfy the types */
|
|
45
|
+
if (!document.contents?.srcToken) return null;
|
|
46
|
+
const mapToken = document.contents.srcToken;
|
|
47
|
+
const head = fileContent.slice(0, mapToken.offset);
|
|
48
|
+
const tail = fileContent.slice(mapToken.offset + CST.stringify(mapToken).length);
|
|
49
|
+
if (!changeDependencyIn(document, path, {
|
|
45
50
|
newValue,
|
|
46
51
|
newName: upgrade.newName
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
/* v8 ignore if -- this should not happen in practice, but we must satisfy the types */
|
|
50
|
-
if (!modifiedDocument.contents?.srcToken) return null;
|
|
51
|
-
return CST.stringify(modifiedDocument.contents.srcToken);
|
|
52
|
+
})) return null;
|
|
53
|
+
return head + CST.stringify(mapToken) + tail;
|
|
52
54
|
}
|
|
53
55
|
/**
|
|
54
56
|
* Change the scalar name and/or value of a collection item in a YAML document,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../../lib/modules/manager/npm/update/dependency/pnpm.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport type { Document } from 'yaml';\nimport { CST, isCollection, isPair, isScalar, parseDocument } from 'yaml';\nimport { logger } from '../../../../../logger/index.ts';\nimport type { UpdateDependencyConfig } from '../../../types.ts';\nimport { pnpmWorkspaceOverrides } from '../../dep-types.ts';\nimport { PnpmWorkspaceFile } from '../../schema.ts';\nimport { getNewGitValue, getNewNpmAliasValue } from './common.ts';\n\nexport function updatePnpmWorkspaceDependency({\n fileContent,\n upgrade,\n}: UpdateDependencyConfig): string | null {\n const { depType, depName } = upgrade;\n\n const catalogName = depType?.split('.').at(-1);\n\n // should never happen\n if (!isString(catalogName) && depType !== pnpmWorkspaceOverrides) {\n logger.error(\n 'No catalogName or override was found; this is likely an extraction error.',\n );\n return null;\n }\n\n let { newValue } = upgrade;\n\n newValue = getNewGitValue(upgrade) ?? newValue;\n newValue = getNewNpmAliasValue(newValue, upgrade) ?? newValue;\n\n logger.trace(\n `npm.updatePnpmWorkspaceDependency(): ${depType}:${depName} = ${newValue}`,\n );\n\n let document: Document;\n let parsedContents: PnpmWorkspaceFile;\n\n try {\n // In order to preserve the original formatting as much as possible, we want\n // manipulate the CST directly. Using the AST (the result of parseDocument)\n // does not guarantee that formatting would be the same after\n // stringification. However, the CST is more annoying to query for certain\n // values. Thus, we use both an annotated AST and a JS representation; the\n // former for manipulation, and the latter for querying/validation.\n document = parseDocument(fileContent, { keepSourceTokens: true });\n parsedContents = PnpmWorkspaceFile.parse(fileContent);\n } catch (err) {\n logger.debug({ err }, 'Could not parse pnpm-workspace YAML file.');\n return null;\n }\n\n // In pnpm-workspace.yaml, the default catalog can be either `catalog` or\n // `catalog.default`, but not both (pnpm throws outright with a config error).\n // Thus, we must check which entry is being used, to reference it from / set\n // it in the right place.\n const usesImplicitDefaultCatalog = parsedContents.catalog !== undefined;\n const isCatalogUpdate = catalogName && depType !== pnpmWorkspaceOverrides;\n\n let oldVersion: string | undefined;\n if (isCatalogUpdate) {\n if (catalogName === 'default' && usesImplicitDefaultCatalog) {\n oldVersion = parsedContents.catalog?.[depName!];\n } else {\n oldVersion = parsedContents.catalogs?.[catalogName]?.[depName!];\n }\n } else {\n oldVersion = parsedContents.overrides?.[depName!];\n }\n\n if (oldVersion === newValue) {\n logger.trace('Version is already updated');\n return fileContent;\n }\n\n // Update the value\n const path = isCatalogUpdate\n ? getDepPath({\n depName: depName!,\n catalogName,\n usesImplicitDefaultCatalog,\n })\n : ['overrides', depName!];\n\n const modifiedDocument = changeDependencyIn(document, path, {\n newValue,\n newName: upgrade.newName,\n });\n\n if (!modifiedDocument) {\n // Case where we are explicitly unable to substitute the key/value, for\n // example if the value was an alias.\n return null;\n }\n\n
|
|
1
|
+
{"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../../lib/modules/manager/npm/update/dependency/pnpm.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport type { Document } from 'yaml';\nimport { CST, isCollection, isPair, isScalar, parseDocument } from 'yaml';\nimport { logger } from '../../../../../logger/index.ts';\nimport type { UpdateDependencyConfig } from '../../../types.ts';\nimport { pnpmWorkspaceOverrides } from '../../dep-types.ts';\nimport { PnpmWorkspaceFile } from '../../schema.ts';\nimport { getNewGitValue, getNewNpmAliasValue } from './common.ts';\n\nexport function updatePnpmWorkspaceDependency({\n fileContent,\n upgrade,\n}: UpdateDependencyConfig): string | null {\n const { depType, depName } = upgrade;\n\n const catalogName = depType?.split('.').at(-1);\n\n // should never happen\n if (!isString(catalogName) && depType !== pnpmWorkspaceOverrides) {\n logger.error(\n 'No catalogName or override was found; this is likely an extraction error.',\n );\n return null;\n }\n\n let { newValue } = upgrade;\n\n newValue = getNewGitValue(upgrade) ?? newValue;\n newValue = getNewNpmAliasValue(newValue, upgrade) ?? newValue;\n\n logger.trace(\n `npm.updatePnpmWorkspaceDependency(): ${depType}:${depName} = ${newValue}`,\n );\n\n let document: Document;\n let parsedContents: PnpmWorkspaceFile;\n\n try {\n // In order to preserve the original formatting as much as possible, we want\n // manipulate the CST directly. Using the AST (the result of parseDocument)\n // does not guarantee that formatting would be the same after\n // stringification. However, the CST is more annoying to query for certain\n // values. Thus, we use both an annotated AST and a JS representation; the\n // former for manipulation, and the latter for querying/validation.\n document = parseDocument(fileContent, { keepSourceTokens: true });\n parsedContents = PnpmWorkspaceFile.parse(fileContent);\n } catch (err) {\n logger.debug({ err }, 'Could not parse pnpm-workspace YAML file.');\n return null;\n }\n\n // In pnpm-workspace.yaml, the default catalog can be either `catalog` or\n // `catalog.default`, but not both (pnpm throws outright with a config error).\n // Thus, we must check which entry is being used, to reference it from / set\n // it in the right place.\n const usesImplicitDefaultCatalog = parsedContents.catalog !== undefined;\n const isCatalogUpdate = catalogName && depType !== pnpmWorkspaceOverrides;\n\n let oldVersion: string | undefined;\n if (isCatalogUpdate) {\n if (catalogName === 'default' && usesImplicitDefaultCatalog) {\n oldVersion = parsedContents.catalog?.[depName!];\n } else {\n oldVersion = parsedContents.catalogs?.[catalogName]?.[depName!];\n }\n } else {\n oldVersion = parsedContents.overrides?.[depName!];\n }\n\n if (oldVersion === newValue) {\n logger.trace('Version is already updated');\n return fileContent;\n }\n\n // Update the value\n const path = isCatalogUpdate\n ? getDepPath({\n depName: depName!,\n catalogName,\n usesImplicitDefaultCatalog,\n })\n : ['overrides', depName!];\n\n /* v8 ignore if -- this should not happen in practice, but we must satisfy the types */\n if (!document.contents?.srcToken) {\n return null;\n }\n\n // The root map token excludes comments before the first key and after the\n // last entry, so keep those bytes verbatim.\n const mapToken = document.contents.srcToken;\n const head = fileContent.slice(0, mapToken.offset);\n const tail = fileContent.slice(\n mapToken.offset + CST.stringify(mapToken).length,\n );\n\n const modifiedDocument = changeDependencyIn(document, path, {\n newValue,\n newName: upgrade.newName,\n });\n\n if (!modifiedDocument) {\n // Case where we are explicitly unable to substitute the key/value, for\n // example if the value was an alias.\n return null;\n }\n\n return head + CST.stringify(mapToken) + tail;\n}\n\n/**\n * Change the scalar name and/or value of a collection item in a YAML document,\n * while keeping formatting consistent. Mutates the given document.\n */\nfunction changeDependencyIn(\n document: Document,\n path: string[],\n { newName, newValue }: { newName?: string; newValue?: string },\n): Document | null {\n const parentPath = path.slice(0, -1);\n const relevantItemKey = path.at(-1);\n\n const parentNode = document.getIn(parentPath);\n\n if (!parentNode || !isCollection(parentNode)) {\n return null;\n }\n\n const relevantNode = parentNode.items.find(\n (item) =>\n isPair(item) && isScalar(item.key) && item.key.value === relevantItemKey,\n );\n\n if (!relevantNode || !isPair(relevantNode)) {\n return null;\n }\n\n if (newName) {\n /* v8 ignore if -- the try..catch block above already throws if a key is an alias */\n if (!CST.isScalar(relevantNode.srcToken?.key)) {\n return null;\n }\n CST.setScalarValue(relevantNode.srcToken.key, newName);\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (newValue) {\n // We only support scalar values when substituting. This explicitly avoids\n // substituting aliases, since those can be resolved from a shared location,\n // and replacing either the referrent anchor or the alias would be wrong in\n // the general case. We leave this up to the user, e.g. via a Regex custom\n // manager.\n if (!CST.isScalar(relevantNode.srcToken?.value)) {\n return null;\n }\n CST.setScalarValue(relevantNode.srcToken.value, newValue);\n }\n\n return document;\n}\n\nfunction getDepPath({\n catalogName,\n depName,\n usesImplicitDefaultCatalog,\n}: {\n usesImplicitDefaultCatalog: boolean;\n catalogName: string;\n depName: string;\n}): string[] {\n if (catalogName === 'default' && usesImplicitDefaultCatalog) {\n return ['catalog', depName];\n }\n return ['catalogs', catalogName, depName];\n}\n"],"mappings":";;;;;;;AASA,SAAgB,8BAA8B,EAC5C,aACA,WACwC;CACxC,MAAM,EAAE,SAAS,YAAY;CAE7B,MAAM,cAAc,SAAS,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE;CAG7C,IAAI,CAAC,SAAS,WAAW,KAAK,YAAA,4BAAoC;EAChE,OAAO,MACL,2EACF;EACA,OAAO;CACT;CAEA,IAAI,EAAE,aAAa;CAEnB,WAAW,eAAe,OAAO,KAAK;CACtC,WAAW,oBAAoB,UAAU,OAAO,KAAK;CAErD,OAAO,MACL,wCAAwC,QAAQ,GAAG,QAAQ,KAAK,UAClE;CAEA,IAAI;CACJ,IAAI;CAEJ,IAAI;EAOF,WAAW,cAAc,aAAa,EAAE,kBAAkB,KAAK,CAAC;EAChE,iBAAiB,kBAAkB,MAAM,WAAW;CACtD,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,2CAA2C;EACjE,OAAO;CACT;CAMA,MAAM,6BAA6B,eAAe,YAAY,KAAA;CAC9D,MAAM,kBAAkB,eAAe,YAAA;CAEvC,IAAI;CACJ,IAAI,iBAAiB;EACnB,IAAI,gBAAgB,aAAa,4BAC/B,aAAa,eAAe,UAAU;OAEtC,aAAa,eAAe,WAAW,YAAY,GAAG;CAE1D,OACE,aAAa,eAAe,YAAY;CAG1C,IAAI,eAAe,UAAU;EAC3B,OAAO,MAAM,4BAA4B;EACzC,OAAO;CACT;CAGA,MAAM,OAAO,kBACT,WAAW;EACA;EACT;EACA;CACF,CAAC,IACD,CAAC,aAAa,OAAQ;;CAG1B,IAAI,CAAC,SAAS,UAAU,UACtB,OAAO;CAKT,MAAM,WAAW,SAAS,SAAS;CACnC,MAAM,OAAO,YAAY,MAAM,GAAG,SAAS,MAAM;CACjD,MAAM,OAAO,YAAY,MACvB,SAAS,SAAS,IAAI,UAAU,QAAQ,CAAC,CAAC,MAC5C;CAOA,IAAI,CALqB,mBAAmB,UAAU,MAAM;EAC1D;EACA,SAAS,QAAQ;CACnB,CAEoB,GAGlB,OAAO;CAGT,OAAO,OAAO,IAAI,UAAU,QAAQ,IAAI;AAC1C;;;;;AAMA,SAAS,mBACP,UACA,MACA,EAAE,SAAS,YACM;CACjB,MAAM,aAAa,KAAK,MAAM,GAAG,EAAE;CACnC,MAAM,kBAAkB,KAAK,GAAG,EAAE;CAElC,MAAM,aAAa,SAAS,MAAM,UAAU;CAE5C,IAAI,CAAC,cAAc,CAAC,aAAa,UAAU,GACzC,OAAO;CAGT,MAAM,eAAe,WAAW,MAAM,MACnC,SACC,OAAO,IAAI,KAAK,SAAS,KAAK,GAAG,KAAK,KAAK,IAAI,UAAU,eAC7D;CAEA,IAAI,CAAC,gBAAgB,CAAC,OAAO,YAAY,GACvC,OAAO;CAGT,IAAI,SAAS;;EAEX,IAAI,CAAC,IAAI,SAAS,aAAa,UAAU,GAAG,GAC1C,OAAO;EAET,IAAI,eAAe,aAAa,SAAS,KAAK,OAAO;CACvD;;CAGA,IAAI,UAAU;EAMZ,IAAI,CAAC,IAAI,SAAS,aAAa,UAAU,KAAK,GAC5C,OAAO;EAET,IAAI,eAAe,aAAa,SAAS,OAAO,QAAQ;CAC1D;CAEA,OAAO;AACT;AAEA,SAAS,WAAW,EAClB,aACA,SACA,8BAKW;CACX,IAAI,gBAAgB,aAAa,4BAC/B,OAAO,CAAC,WAAW,OAAO;CAE5B,OAAO;EAAC;EAAY;EAAa;CAAO;AAC1C"}
|
|
@@ -18,6 +18,7 @@ import upath from "upath";
|
|
|
18
18
|
// lib/modules/manager/pep621/processors/uv.ts
|
|
19
19
|
const uvUpdateCMD = "uv lock";
|
|
20
20
|
const gitExec = withGitEnvironment(["pep621"]);
|
|
21
|
+
const gitPlusPrefixRegex = regEx(/^git\+/);
|
|
21
22
|
function isUvIndexSource(source) {
|
|
22
23
|
return "index" in source;
|
|
23
24
|
}
|
|
@@ -48,7 +49,7 @@ var UvProcessor = class extends BasePyProjectProcessor {
|
|
|
48
49
|
if (registryUrls.length) dep.registryUrls = [...new Set(registryUrls)];
|
|
49
50
|
} else if (depSources.length === 1) {
|
|
50
51
|
const depSource = depSources[0];
|
|
51
|
-
if ("git" in depSource) applyGitSource(dep, depSource.git, depSource.rev, depSource.tag, depSource.branch);
|
|
52
|
+
if ("git" in depSource) applyGitSource(dep, depSource.git.replace(gitPlusPrefixRegex, ""), depSource.rev, depSource.tag, depSource.branch);
|
|
52
53
|
else if ("url" in depSource) dep.skipReason = "unsupported-url";
|
|
53
54
|
else if ("path" in depSource) dep.skipReason = "path-dependency";
|
|
54
55
|
else if ("workspace" in depSource) dep.skipReason = "inherited-dependency";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uv.js","names":[],"sources":["../../../../../lib/modules/manager/pep621/processors/uv.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport type {\n ExecOptions,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../../util/git/exec.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { Result } from '../../../../util/result.ts';\nimport {\n parseUrl,\n stripUrlCredentials,\n trimTrailingSlash,\n} from '../../../../util/url.ts';\nimport { findPypiIndexCredentials } from '../../../datasource/pypi/host-rules.ts';\nimport { PypiDatasource } from '../../../datasource/pypi/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../../types.ts';\nimport {\n applyGitSource,\n artifactErrorResult,\n resolveToolConstraint,\n updateLockFile,\n} from '../../util.ts';\nimport {\n type PyProject,\n type UvLockedPackage,\n UvLockfile,\n type UvSource,\n} from '../schema.ts';\nimport type { Pep621ManagerData } from '../types.ts';\nimport { depTypes } from '../utils.ts';\nimport { BasePyProjectProcessor } from './abstract.ts';\n\nconst uvUpdateCMD = 'uv lock';\nconst gitExec = withGitEnvironment(['pep621']);\n\nfunction isUvIndexSource(\n source: UvSource,\n): source is Extract<UvSource, { index: string }> {\n return 'index' in source;\n}\n\n// The public PyPI index, as recorded in `uv.lock` package sources. Transitive\n// deps resolved from it use the datasource default, so no `registryUrls` needed.\nconst defaultPypiRegistry = 'https://pypi.org/simple';\n\nexport class UvProcessor extends BasePyProjectProcessor {\n override lockfileName = 'uv.lock';\n\n process(project: PyProject, deps: PackageDependency[]): PackageDependency[] {\n const uv = project.tool?.uv;\n if (!uv) {\n return deps;\n }\n\n const hasExplicitDefault = uv.index?.some(\n (index) => index.default && index.explicit,\n );\n const defaultIndex = uv.index?.find(\n (index) => index.default && !index.explicit,\n );\n const implicitIndexUrls = uv.index\n ?.filter((index) => !index.explicit && index.name !== defaultIndex?.name)\n ?.map(({ url }) => url);\n\n const devDependencies = uv['dev-dependencies'];\n if (devDependencies) {\n deps.push(...devDependencies);\n }\n\n // https://docs.astral.sh/uv/concepts/dependencies/#dependency-sources\n // Skip sources that do not make sense to handle (e.g. path).\n if (uv.sources || defaultIndex || implicitIndexUrls) {\n for (const dep of deps) {\n /* v8 ignore next -- needs test */\n if (!dep.packageName) {\n continue;\n }\n\n if (dep.depType === 'requires-python') {\n continue;\n }\n\n // Using `packageName` as it applies PEP 508 normalization, which is\n // also applied by uv when matching a source to a dependency.\n const depSources = uv.sources?.[dep.packageName];\n if (depSources) {\n // Dependency is pinned to one or more specific sources.\n dep.depType = depTypes.uvSources;\n if (depSources.every(isUvIndexSource)) {\n // Sources referencing an index, possibly disambiguated by\n // environment markers. Any of the indexes can serve the package,\n // so use all of them as registries.\n const registryUrls: string[] = [];\n for (const depSource of depSources) {\n const index = uv.index?.find(\n ({ name }) => name === depSource.index,\n );\n if (index) {\n registryUrls.push(index.url);\n }\n }\n if (registryUrls.length) {\n dep.registryUrls = [...new Set(registryUrls)];\n }\n } else if (depSources.length === 1) {\n const depSource = depSources[0];\n if ('git' in depSource) {\n applyGitSource(\n dep,\n depSource.git,\n depSource.rev,\n depSource.tag,\n depSource.branch,\n );\n } else if ('url' in depSource) {\n dep.skipReason = 'unsupported-url';\n } else if ('path' in depSource) {\n dep.skipReason = 'path-dependency';\n } else if ('workspace' in depSource) {\n dep.skipReason = 'inherited-dependency';\n } else {\n dep.skipReason = 'unknown-registry';\n }\n } else {\n // Multiple sources that are not all indexes (e.g. a git source\n // per platform) cannot be represented as a single update.\n dep.skipReason = 'unsupported';\n }\n } else {\n // Dependency is not pinned to a specific source, so we need to\n // determine the source based on the index configuration.\n if (hasExplicitDefault) {\n // don't fall back to pypi if there is an explicit default index\n dep.registryUrls = [];\n } else if (defaultIndex) {\n // There is a default index configured, so use it.\n dep.registryUrls = [defaultIndex.url];\n }\n\n if (implicitIndexUrls?.length) {\n // If there are implicit indexes, check them first and fall back\n // to the default.\n dep.registryUrls = implicitIndexUrls.concat(\n dep.registryUrls ?? PypiDatasource.defaultURL,\n );\n }\n }\n }\n }\n\n return deps;\n }\n\n async extractLockedVersions(\n project: PyProject,\n deps: PackageDependency[],\n packageFile: string,\n config?: ExtractConfig,\n ): Promise<PackageDependency[]> {\n const lockFileName = await findLocalSiblingOrParent(\n packageFile,\n this.lockfileName,\n );\n if (lockFileName === null) {\n logger.debug({ packageFile }, `No uv lock file found`);\n } else {\n const lockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (lockFileContent) {\n const { val: lockFileMapping, err } = Result.parse(\n lockFileContent,\n UvLockfile,\n ).unwrap();\n\n if (err) {\n logger.debug({ packageFile, err }, `Error parsing uv lock file`);\n } else {\n const { packages, declaredNames } = lockFileMapping;\n for (const dep of deps as PackageDependency<Pep621ManagerData>[]) {\n const packageName = dep.packageName;\n if (packageName && packageName in packages) {\n const locked = packages[packageName];\n dep.lockedVersion = locked.version;\n if (locked.hasMultipleEntries) {\n dep.managerData = {\n ...dep.managerData,\n hasMultipleLockedEntries: true,\n };\n }\n }\n }\n\n // Transitive dependencies are only of use to vulnerability\n // remediation, and a large `uv.lock` holds a lot of them, so don't\n // surface any unless vulnerability alerts are enabled.\n //\n // A workspace shares one lock file between its members, so they are\n // surfaced once, for the package file which owns it, or every member\n // would report the others' dependencies as transitive.\n if (\n config?.hasVulnerabilityAlertsRules &&\n upath.dirname(lockFileName) === upath.dirname(packageFile)\n ) {\n this.addTransitiveDeps(deps, packages, declaredNames);\n }\n }\n }\n }\n\n return Promise.resolve(deps);\n }\n\n /**\n * Appends the packages which only exist in `uv.lock` to the given dependencies.\n *\n * They are skipped, so they produce no routine updates, but\n * vulnerability alerts can still match them and clear the skip to get a\n * targeted `uv lock --upgrade-package` when a fixed version exists.\n */\n private addTransitiveDeps(\n deps: PackageDependency[],\n packages: Record<string, UvLockedPackage>,\n declaredNames: ReadonlySet<string>,\n ): void {\n const declaredPackageNames = new Set([\n ...declaredNames,\n ...deps.map((dep) => dep.packageName).filter(isString),\n ]);\n\n const transitiveDeps = Object.entries(packages).flatMap(\n ([packageName, locked]): PackageDependency[] => {\n const { registryUrl } = locked;\n // only a registry-sourced package can be remediated by name, which\n // rules out the workspace root and any virtual/editable/path/git one\n if (declaredPackageNames.has(packageName) || !registryUrl) {\n return [];\n }\n\n const transitiveDep: PackageDependency = {\n packageName,\n depName: packageName,\n depType: depTypes.uvTransitiveDependencies,\n datasource: PypiDatasource.id,\n lockedVersion: locked.version,\n skipReason: 'lockfile-only',\n skipStage: 'extract',\n };\n if (locked.hasMultipleEntries) {\n transitiveDep.managerData = { hasMultipleLockedEntries: true };\n }\n if (trimTrailingSlash(registryUrl) !== defaultPypiRegistry) {\n transitiveDep.registryUrls = [registryUrl];\n }\n return [transitiveDep];\n },\n );\n\n deps.push(...transitiveDeps);\n }\n\n async updateArtifacts(\n updateArtifact: UpdateArtifact<Pep621ManagerData>,\n project: PyProject,\n ): Promise<UpdateArtifactsResult[] | null> {\n const { config, updatedDeps, packageFileName } = updateArtifact;\n\n const { isLockFileMaintenance } = config;\n\n // abort if no lockfile is defined\n const lockFileName = await findLocalSiblingOrParent(\n packageFileName,\n 'uv.lock',\n );\n if (lockFileName === null) {\n logger.debug({ packageFileName }, `No uv lock file found`);\n return null;\n }\n try {\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n logger.debug('No uv.lock found');\n return null;\n }\n\n const pythonConstraint: ToolConstraint = {\n toolName: 'python',\n constraint: await resolveToolConstraint(\n config,\n 'python',\n () => project.project?.['requires-python'],\n ),\n };\n const uvConstraint: ToolConstraint = {\n toolName: 'uv',\n constraint: await resolveToolConstraint(\n config,\n 'uv',\n () => project.tool?.uv?.['required-version'],\n ),\n };\n\n const extraEnv = {\n ...(await getUvExtraIndexUrl(project, updateArtifact.updatedDeps)),\n ...(await getUvIndexCredentials(project)),\n };\n const execOptions: ExecOptions = {\n cwdFile: packageFileName,\n extraEnv,\n docker: {},\n toolConstraints: [pythonConstraint, uvConstraint],\n };\n\n // on lockFileMaintenance do not specify any packages and update the complete lock file\n // else only update specific packages\n let cmd: string;\n if (isLockFileMaintenance) {\n cmd = `${uvUpdateCMD} --upgrade`;\n } else {\n cmd = generateCMD(updatedDeps);\n }\n return await updateLockFile({\n lockFileName,\n existingLockFileContent,\n run: () => gitExec(cmd, execOptions),\n });\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update uv lock file');\n return artifactErrorResult(lockFileName, err);\n }\n }\n}\n\n/**\n * The `--upgrade-package` argument to move `dep` to the version which was\n * looked up, or to whichever version `uv` resolves when it cannot be pinned.\n */\nfunction pinnedUpgrade(dep: Upgrade<Pep621ManagerData>): string {\n // A package the lock file holds more than once, e.g. at a version per\n // resolution marker, can only be upgraded without a version: `uv` reads a\n // pinned one as a constraint on every marker, so it would downgrade the\n // other entries, or fail to resolve at all.\n if (dep.managerData?.hasMultipleLockedEntries) {\n logger.warn(\n { packageName: dep.packageName, newVersion: dep.newVersion },\n 'Upgrading a dependency which the lock file holds more than once, without a version: vulnerabilityFixStrategy cannot be honoured, so the version this resolves to may differ from the one Renovate picked',\n );\n return dep.packageName!;\n }\n\n return dep.newVersion\n ? `${dep.packageName!}==${dep.newVersion}`\n : dep.packageName!;\n}\n\nfunction generateCMD(updatedDeps: Upgrade<Pep621ManagerData>[]): string {\n const deps: string[] = [];\n\n for (const dep of updatedDeps) {\n switch (dep.depType) {\n case depTypes.optionalDependencies: {\n deps.push(dep.depName!);\n break;\n }\n case depTypes.uvDevDependencies:\n case depTypes.uvSources: {\n deps.push(dep.depName!);\n break;\n }\n case depTypes.uvTransitiveDependencies: {\n // Nothing in `pyproject.toml` constrains a transitive dependency, so an\n // unpinned upgrade would resolve to the newest release instead of the\n // version we determined, e.g. the lowest one fixing a vulnerability.\n deps.push(pinnedUpgrade(dep));\n break;\n }\n case depTypes.buildSystemRequires:\n // A build requirement is not locked, unless something depends on it at\n // runtime as well. Only a vulnerability fix has a reason to move that\n // locked copy: a routine bump of the requirement leaves it alone, as\n // it always has.\n if (dep.isVulnerabilityAlert && dep.lockedVersion) {\n deps.push(pinnedUpgrade(dep));\n }\n break;\n default: {\n deps.push(dep.packageName!);\n }\n }\n }\n\n return `${uvUpdateCMD} ${deps.map((dep) => `--upgrade-package ${quote(dep)}`).join(' ')}`;\n}\n\n/**\n * Returns `url` without its userinfo, placeholders included, or `url` unchanged when it cannot be parsed.\n */\nfunction withoutAnyUserinfo(url: string): string {\n return stripUrlCredentials(url) ?? url;\n}\n\nasync function getUvExtraIndexUrl(\n project: PyProject,\n deps: Upgrade[],\n): Promise<NodeJS.ProcessEnv> {\n // compared without any userinfo, which the registry URLs of the deps may no longer carry\n const configuredIndexUrls = new Set(\n coerceArray(project.tool?.uv?.index).map(({ url }) =>\n trimTrailingSlash(withoutAnyUserinfo(url)),\n ),\n );\n const pyPiRegistryUrls = deps\n .filter((dep) => dep.datasource === PypiDatasource.id)\n // a transitive dependency carries the index `uv.lock` recorded for it, which\n // `uv` reads from the lock file itself - passing it as an extra index would\n // instead rank it above the default for every package it resolves\n .filter((dep) => dep.depType !== depTypes.uvTransitiveDependencies)\n .filter((dep) => {\n // Remove dependencies that are pinned to a specific index\n const sources = project.tool?.uv?.sources;\n const packageName = dep.packageName!;\n return !sources || !(packageName in sources);\n })\n .flatMap((dep) => dep.registryUrls)\n .filter(isString)\n .filter((registryUrl) => {\n // Check if the registry URL is not the default one and not already configured\n return (\n registryUrl !== PypiDatasource.defaultURL &&\n !configuredIndexUrls.has(\n trimTrailingSlash(withoutAnyUserinfo(registryUrl)),\n )\n );\n });\n\n const registryUrls = new Set(pyPiRegistryUrls);\n const extraIndexUrls: string[] = [];\n\n for (const registryUrl of registryUrls) {\n const parsedUrl = parseUrl(registryUrl);\n if (!parsedUrl) {\n continue;\n }\n\n const { username, password } = await findPypiIndexCredentials(\n parsedUrl.toString(),\n );\n if (username || password) {\n // v8 ignore else -- needs a host rule carrying only one of the two\n if (username) {\n parsedUrl.username = username;\n }\n // v8 ignore else -- needs a host rule carrying only one of the two\n if (password) {\n parsedUrl.password = password;\n }\n }\n\n extraIndexUrls.push(parsedUrl.toString());\n }\n\n return {\n UV_EXTRA_INDEX_URL: extraIndexUrls.join(' '),\n };\n}\n\nasync function getUvIndexCredentials(\n project: PyProject,\n): Promise<NodeJS.ProcessEnv> {\n const uv_indexes = project.tool?.uv?.index;\n\n if (!uv_indexes) {\n return {};\n }\n\n const entries = [];\n\n for (const { name, url } of uv_indexes) {\n const parsedUrl = parseUrl(url);\n /* v8 ignore next -- needs test */\n if (!parsedUrl) {\n continue;\n }\n\n // If no name is provided for the index, authentication information must be passed through alternative methods\n if (!name) {\n continue;\n }\n\n const { username, password } = await findPypiIndexCredentials(\n parsedUrl.toString(),\n );\n\n const NAME = name.toUpperCase().replace(regEx(/[^A-Z0-9]/g), '_');\n\n // v8 ignore else -- needs a host rule carrying only one of the two\n if (username) {\n entries.push([`UV_INDEX_${NAME}_USERNAME`, username]);\n }\n\n // v8 ignore else -- needs a host rule carrying only one of the two\n if (password) {\n entries.push([`UV_INDEX_${NAME}_PASSWORD`, password]);\n }\n }\n\n return Object.fromEntries(entries);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uv.js","names":[],"sources":["../../../../../lib/modules/manager/pep621/processors/uv.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport type {\n ExecOptions,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../../util/git/exec.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { Result } from '../../../../util/result.ts';\nimport {\n parseUrl,\n stripUrlCredentials,\n trimTrailingSlash,\n} from '../../../../util/url.ts';\nimport { findPypiIndexCredentials } from '../../../datasource/pypi/host-rules.ts';\nimport { PypiDatasource } from '../../../datasource/pypi/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../../types.ts';\nimport {\n applyGitSource,\n artifactErrorResult,\n resolveToolConstraint,\n updateLockFile,\n} from '../../util.ts';\nimport {\n type PyProject,\n type UvLockedPackage,\n UvLockfile,\n type UvSource,\n} from '../schema.ts';\nimport type { Pep621ManagerData } from '../types.ts';\nimport { depTypes } from '../utils.ts';\nimport { BasePyProjectProcessor } from './abstract.ts';\n\nconst uvUpdateCMD = 'uv lock';\nconst gitExec = withGitEnvironment(['pep621']);\n\n// uv sources may use the pip-style `git+` prefix; strip it before handing the URL to git.\nconst gitPlusPrefixRegex = regEx(/^git\\+/);\n\nfunction isUvIndexSource(\n source: UvSource,\n): source is Extract<UvSource, { index: string }> {\n return 'index' in source;\n}\n\n// The public PyPI index, as recorded in `uv.lock` package sources. Transitive\n// deps resolved from it use the datasource default, so no `registryUrls` needed.\nconst defaultPypiRegistry = 'https://pypi.org/simple';\n\nexport class UvProcessor extends BasePyProjectProcessor {\n override lockfileName = 'uv.lock';\n\n process(project: PyProject, deps: PackageDependency[]): PackageDependency[] {\n const uv = project.tool?.uv;\n if (!uv) {\n return deps;\n }\n\n const hasExplicitDefault = uv.index?.some(\n (index) => index.default && index.explicit,\n );\n const defaultIndex = uv.index?.find(\n (index) => index.default && !index.explicit,\n );\n const implicitIndexUrls = uv.index\n ?.filter((index) => !index.explicit && index.name !== defaultIndex?.name)\n ?.map(({ url }) => url);\n\n const devDependencies = uv['dev-dependencies'];\n if (devDependencies) {\n deps.push(...devDependencies);\n }\n\n // https://docs.astral.sh/uv/concepts/dependencies/#dependency-sources\n // Skip sources that do not make sense to handle (e.g. path).\n if (uv.sources || defaultIndex || implicitIndexUrls) {\n for (const dep of deps) {\n /* v8 ignore next -- needs test */\n if (!dep.packageName) {\n continue;\n }\n\n if (dep.depType === 'requires-python') {\n continue;\n }\n\n // Using `packageName` as it applies PEP 508 normalization, which is\n // also applied by uv when matching a source to a dependency.\n const depSources = uv.sources?.[dep.packageName];\n if (depSources) {\n // Dependency is pinned to one or more specific sources.\n dep.depType = depTypes.uvSources;\n if (depSources.every(isUvIndexSource)) {\n // Sources referencing an index, possibly disambiguated by\n // environment markers. Any of the indexes can serve the package,\n // so use all of them as registries.\n const registryUrls: string[] = [];\n for (const depSource of depSources) {\n const index = uv.index?.find(\n ({ name }) => name === depSource.index,\n );\n if (index) {\n registryUrls.push(index.url);\n }\n }\n if (registryUrls.length) {\n dep.registryUrls = [...new Set(registryUrls)];\n }\n } else if (depSources.length === 1) {\n const depSource = depSources[0];\n if ('git' in depSource) {\n applyGitSource(\n dep,\n depSource.git.replace(gitPlusPrefixRegex, ''),\n depSource.rev,\n depSource.tag,\n depSource.branch,\n );\n } else if ('url' in depSource) {\n dep.skipReason = 'unsupported-url';\n } else if ('path' in depSource) {\n dep.skipReason = 'path-dependency';\n } else if ('workspace' in depSource) {\n dep.skipReason = 'inherited-dependency';\n } else {\n dep.skipReason = 'unknown-registry';\n }\n } else {\n // Multiple sources that are not all indexes (e.g. a git source\n // per platform) cannot be represented as a single update.\n dep.skipReason = 'unsupported';\n }\n } else {\n // Dependency is not pinned to a specific source, so we need to\n // determine the source based on the index configuration.\n if (hasExplicitDefault) {\n // don't fall back to pypi if there is an explicit default index\n dep.registryUrls = [];\n } else if (defaultIndex) {\n // There is a default index configured, so use it.\n dep.registryUrls = [defaultIndex.url];\n }\n\n if (implicitIndexUrls?.length) {\n // If there are implicit indexes, check them first and fall back\n // to the default.\n dep.registryUrls = implicitIndexUrls.concat(\n dep.registryUrls ?? PypiDatasource.defaultURL,\n );\n }\n }\n }\n }\n\n return deps;\n }\n\n async extractLockedVersions(\n project: PyProject,\n deps: PackageDependency[],\n packageFile: string,\n config?: ExtractConfig,\n ): Promise<PackageDependency[]> {\n const lockFileName = await findLocalSiblingOrParent(\n packageFile,\n this.lockfileName,\n );\n if (lockFileName === null) {\n logger.debug({ packageFile }, `No uv lock file found`);\n } else {\n const lockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (lockFileContent) {\n const { val: lockFileMapping, err } = Result.parse(\n lockFileContent,\n UvLockfile,\n ).unwrap();\n\n if (err) {\n logger.debug({ packageFile, err }, `Error parsing uv lock file`);\n } else {\n const { packages, declaredNames } = lockFileMapping;\n for (const dep of deps as PackageDependency<Pep621ManagerData>[]) {\n const packageName = dep.packageName;\n if (packageName && packageName in packages) {\n const locked = packages[packageName];\n dep.lockedVersion = locked.version;\n if (locked.hasMultipleEntries) {\n dep.managerData = {\n ...dep.managerData,\n hasMultipleLockedEntries: true,\n };\n }\n }\n }\n\n // Transitive dependencies are only of use to vulnerability\n // remediation, and a large `uv.lock` holds a lot of them, so don't\n // surface any unless vulnerability alerts are enabled.\n //\n // A workspace shares one lock file between its members, so they are\n // surfaced once, for the package file which owns it, or every member\n // would report the others' dependencies as transitive.\n if (\n config?.hasVulnerabilityAlertsRules &&\n upath.dirname(lockFileName) === upath.dirname(packageFile)\n ) {\n this.addTransitiveDeps(deps, packages, declaredNames);\n }\n }\n }\n }\n\n return Promise.resolve(deps);\n }\n\n /**\n * Appends the packages which only exist in `uv.lock` to the given dependencies.\n *\n * They are skipped, so they produce no routine updates, but\n * vulnerability alerts can still match them and clear the skip to get a\n * targeted `uv lock --upgrade-package` when a fixed version exists.\n */\n private addTransitiveDeps(\n deps: PackageDependency[],\n packages: Record<string, UvLockedPackage>,\n declaredNames: ReadonlySet<string>,\n ): void {\n const declaredPackageNames = new Set([\n ...declaredNames,\n ...deps.map((dep) => dep.packageName).filter(isString),\n ]);\n\n const transitiveDeps = Object.entries(packages).flatMap(\n ([packageName, locked]): PackageDependency[] => {\n const { registryUrl } = locked;\n // only a registry-sourced package can be remediated by name, which\n // rules out the workspace root and any virtual/editable/path/git one\n if (declaredPackageNames.has(packageName) || !registryUrl) {\n return [];\n }\n\n const transitiveDep: PackageDependency = {\n packageName,\n depName: packageName,\n depType: depTypes.uvTransitiveDependencies,\n datasource: PypiDatasource.id,\n lockedVersion: locked.version,\n skipReason: 'lockfile-only',\n skipStage: 'extract',\n };\n if (locked.hasMultipleEntries) {\n transitiveDep.managerData = { hasMultipleLockedEntries: true };\n }\n if (trimTrailingSlash(registryUrl) !== defaultPypiRegistry) {\n transitiveDep.registryUrls = [registryUrl];\n }\n return [transitiveDep];\n },\n );\n\n deps.push(...transitiveDeps);\n }\n\n async updateArtifacts(\n updateArtifact: UpdateArtifact<Pep621ManagerData>,\n project: PyProject,\n ): Promise<UpdateArtifactsResult[] | null> {\n const { config, updatedDeps, packageFileName } = updateArtifact;\n\n const { isLockFileMaintenance } = config;\n\n // abort if no lockfile is defined\n const lockFileName = await findLocalSiblingOrParent(\n packageFileName,\n 'uv.lock',\n );\n if (lockFileName === null) {\n logger.debug({ packageFileName }, `No uv lock file found`);\n return null;\n }\n try {\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n logger.debug('No uv.lock found');\n return null;\n }\n\n const pythonConstraint: ToolConstraint = {\n toolName: 'python',\n constraint: await resolveToolConstraint(\n config,\n 'python',\n () => project.project?.['requires-python'],\n ),\n };\n const uvConstraint: ToolConstraint = {\n toolName: 'uv',\n constraint: await resolveToolConstraint(\n config,\n 'uv',\n () => project.tool?.uv?.['required-version'],\n ),\n };\n\n const extraEnv = {\n ...(await getUvExtraIndexUrl(project, updateArtifact.updatedDeps)),\n ...(await getUvIndexCredentials(project)),\n };\n const execOptions: ExecOptions = {\n cwdFile: packageFileName,\n extraEnv,\n docker: {},\n toolConstraints: [pythonConstraint, uvConstraint],\n };\n\n // on lockFileMaintenance do not specify any packages and update the complete lock file\n // else only update specific packages\n let cmd: string;\n if (isLockFileMaintenance) {\n cmd = `${uvUpdateCMD} --upgrade`;\n } else {\n cmd = generateCMD(updatedDeps);\n }\n return await updateLockFile({\n lockFileName,\n existingLockFileContent,\n run: () => gitExec(cmd, execOptions),\n });\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update uv lock file');\n return artifactErrorResult(lockFileName, err);\n }\n }\n}\n\n/**\n * The `--upgrade-package` argument to move `dep` to the version which was\n * looked up, or to whichever version `uv` resolves when it cannot be pinned.\n */\nfunction pinnedUpgrade(dep: Upgrade<Pep621ManagerData>): string {\n // A package the lock file holds more than once, e.g. at a version per\n // resolution marker, can only be upgraded without a version: `uv` reads a\n // pinned one as a constraint on every marker, so it would downgrade the\n // other entries, or fail to resolve at all.\n if (dep.managerData?.hasMultipleLockedEntries) {\n logger.warn(\n { packageName: dep.packageName, newVersion: dep.newVersion },\n 'Upgrading a dependency which the lock file holds more than once, without a version: vulnerabilityFixStrategy cannot be honoured, so the version this resolves to may differ from the one Renovate picked',\n );\n return dep.packageName!;\n }\n\n return dep.newVersion\n ? `${dep.packageName!}==${dep.newVersion}`\n : dep.packageName!;\n}\n\nfunction generateCMD(updatedDeps: Upgrade<Pep621ManagerData>[]): string {\n const deps: string[] = [];\n\n for (const dep of updatedDeps) {\n switch (dep.depType) {\n case depTypes.optionalDependencies: {\n deps.push(dep.depName!);\n break;\n }\n case depTypes.uvDevDependencies:\n case depTypes.uvSources: {\n deps.push(dep.depName!);\n break;\n }\n case depTypes.uvTransitiveDependencies: {\n // Nothing in `pyproject.toml` constrains a transitive dependency, so an\n // unpinned upgrade would resolve to the newest release instead of the\n // version we determined, e.g. the lowest one fixing a vulnerability.\n deps.push(pinnedUpgrade(dep));\n break;\n }\n case depTypes.buildSystemRequires:\n // A build requirement is not locked, unless something depends on it at\n // runtime as well. Only a vulnerability fix has a reason to move that\n // locked copy: a routine bump of the requirement leaves it alone, as\n // it always has.\n if (dep.isVulnerabilityAlert && dep.lockedVersion) {\n deps.push(pinnedUpgrade(dep));\n }\n break;\n default: {\n deps.push(dep.packageName!);\n }\n }\n }\n\n return `${uvUpdateCMD} ${deps.map((dep) => `--upgrade-package ${quote(dep)}`).join(' ')}`;\n}\n\n/**\n * Returns `url` without its userinfo, placeholders included, or `url` unchanged when it cannot be parsed.\n */\nfunction withoutAnyUserinfo(url: string): string {\n return stripUrlCredentials(url) ?? url;\n}\n\nasync function getUvExtraIndexUrl(\n project: PyProject,\n deps: Upgrade[],\n): Promise<NodeJS.ProcessEnv> {\n // compared without any userinfo, which the registry URLs of the deps may no longer carry\n const configuredIndexUrls = new Set(\n coerceArray(project.tool?.uv?.index).map(({ url }) =>\n trimTrailingSlash(withoutAnyUserinfo(url)),\n ),\n );\n const pyPiRegistryUrls = deps\n .filter((dep) => dep.datasource === PypiDatasource.id)\n // a transitive dependency carries the index `uv.lock` recorded for it, which\n // `uv` reads from the lock file itself - passing it as an extra index would\n // instead rank it above the default for every package it resolves\n .filter((dep) => dep.depType !== depTypes.uvTransitiveDependencies)\n .filter((dep) => {\n // Remove dependencies that are pinned to a specific index\n const sources = project.tool?.uv?.sources;\n const packageName = dep.packageName!;\n return !sources || !(packageName in sources);\n })\n .flatMap((dep) => dep.registryUrls)\n .filter(isString)\n .filter((registryUrl) => {\n // Check if the registry URL is not the default one and not already configured\n return (\n registryUrl !== PypiDatasource.defaultURL &&\n !configuredIndexUrls.has(\n trimTrailingSlash(withoutAnyUserinfo(registryUrl)),\n )\n );\n });\n\n const registryUrls = new Set(pyPiRegistryUrls);\n const extraIndexUrls: string[] = [];\n\n for (const registryUrl of registryUrls) {\n const parsedUrl = parseUrl(registryUrl);\n if (!parsedUrl) {\n continue;\n }\n\n const { username, password } = await findPypiIndexCredentials(\n parsedUrl.toString(),\n );\n if (username || password) {\n // v8 ignore else -- needs a host rule carrying only one of the two\n if (username) {\n parsedUrl.username = username;\n }\n // v8 ignore else -- needs a host rule carrying only one of the two\n if (password) {\n parsedUrl.password = password;\n }\n }\n\n extraIndexUrls.push(parsedUrl.toString());\n }\n\n return {\n UV_EXTRA_INDEX_URL: extraIndexUrls.join(' '),\n };\n}\n\nasync function getUvIndexCredentials(\n project: PyProject,\n): Promise<NodeJS.ProcessEnv> {\n const uv_indexes = project.tool?.uv?.index;\n\n if (!uv_indexes) {\n return {};\n }\n\n const entries = [];\n\n for (const { name, url } of uv_indexes) {\n const parsedUrl = parseUrl(url);\n /* v8 ignore next -- needs test */\n if (!parsedUrl) {\n continue;\n }\n\n // If no name is provided for the index, authentication information must be passed through alternative methods\n if (!name) {\n continue;\n }\n\n const { username, password } = await findPypiIndexCredentials(\n parsedUrl.toString(),\n );\n\n const NAME = name.toUpperCase().replace(regEx(/[^A-Z0-9]/g), '_');\n\n // v8 ignore else -- needs a host rule carrying only one of the two\n if (username) {\n entries.push([`UV_INDEX_${NAME}_USERNAME`, username]);\n }\n\n // v8 ignore else -- needs a host rule carrying only one of the two\n if (password) {\n entries.push([`UV_INDEX_${NAME}_PASSWORD`, password]);\n }\n }\n\n return Object.fromEntries(entries);\n}\n"],"mappings":"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"}
|
|
@@ -78,9 +78,10 @@ function widen(currentValue, newVersion) {
|
|
|
78
78
|
const last = lastSpecifier(currentValue);
|
|
79
79
|
const operator = regEx(/^(?:[~^]|=\s*)/).exec(last)?.[0] ?? "";
|
|
80
80
|
const major = api$1.getMajor(newVersion);
|
|
81
|
+
const keepsMinor = operator === "~" && !regEx(/^\d+$/).test(last.slice(operator.length).trim());
|
|
81
82
|
let newSpec;
|
|
82
83
|
if (operator.startsWith("=")) newSpec = operator + newVersion;
|
|
83
|
-
else if (major > 0 &&
|
|
84
|
+
else if (major > 0 && !keepsMinor) newSpec = `${operator}${major}`;
|
|
84
85
|
else newSpec = operator + simplifiedSpec(newVersion);
|
|
85
86
|
const separator = currentValue.includes(",") && !currentValue.includes(", ") ? "," : ", ";
|
|
86
87
|
const specs = currentValue.split(",").map((spec) => spec.trim());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["npm","semver","getMajor","getMinor"],"sources":["../../../../lib/modules/versioning/julia/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { major as getMajor, minor as getMinor } from 'semver';\nimport semver from 'semver-stable';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'julia';\nexport const displayName = 'Julia';\nexport const urls = [\n '[Pkg.jl - Compatibility](https://pkgdocs.julialang.org/v1/compatibility/)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'pin',\n 'replace',\n 'widen',\n];\n\nfunction convertToCaret(item: string): string {\n // In Julia, caret is the default specifier — `1.2.3` means `^1.2.3`.\n // See: https://pkgdocs.julialang.org/v1/compatibility/#Version-specifier-format\n const trimmed = item.trim();\n if (\n npm.isVersion(trimmed) ||\n npm.isVersion(`${trimmed}.0`) ||\n npm.isVersion(`${trimmed}.0.0`)\n ) {\n return `^${trimmed}`;\n }\n return trimmed;\n}\n\nfunction julia2npm(input: string): string {\n // Julia uses `,` for *union* (npm: `||`), `≥` as a synonym for `>=`,\n // and treats bare versions as carets.\n return input\n .replaceAll('≥', '>=')\n .split(',')\n .map(convertToCaret)\n .filter(isNonEmptyString)\n .join(' || ');\n}\n\nfunction npm2julia(input: string): string {\n /* v8 ignore if -- defensive */\n if (!input) {\n logger.warn(\n { input },\n 'julia: npm2julia received an empty value, returning as-is',\n );\n return input;\n }\n // Convert npm union (`||`) back to Julia union (`,`).\n return input\n .split(regEx(/\\s*\\|\\|\\s*/))\n .map((part) => part.trim())\n .filter(isNonEmptyString)\n .join(', ');\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(version, julia2npm(range));\n}\n\nfunction isValid(input: string): boolean {\n // Pkg rejects an empty specifier, alone or in a union: `\"\"`, `\"1.2,\"`.\n return (\n input.split(',').every((spec) => isNonEmptyString(spec.trim())) &&\n npm.isValid(julia2npm(input))\n );\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(version, julia2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.getSatisfyingVersion(versions, julia2npm(range));\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.minSatisfyingVersion(versions, julia2npm(range));\n}\n\nfunction isSingleVersion(constraint: string): boolean {\n const trimmed = constraint.trim();\n return trimmed.startsWith('=') && npm.isVersion(trimmed.substring(1).trim());\n}\n\nfunction getPinnedValue(newVersion: string): string {\n return `=${newVersion}`;\n}\n\n// A union like `0.10, 0.11` is several specifiers; the last one carries the\n// precision and the lower bound an upgrade moves.\nfunction lastSpecifier(value: string): string {\n return value.split(',').at(-1)!.trim();\n}\n\nfunction componentCount(value: string): number {\n return lastSpecifier(value).split('.').length;\n}\n\n// dependabot's `simplified_version_spec`: `major.minor` above 1.0, `0.minor`\n// for 0.x, `0.0.patch` for 0.0.x, always written plain.\nfunction simplifiedSpec(version: string): string {\n /* v8 ignore next -- newVersion is always a full release */\n const major = npm.getMajor(version) ?? 0;\n /* v8 ignore next -- newVersion is always a full release */\n const minor = npm.getMinor(version) ?? 0;\n /* v8 ignore next -- newVersion is always a full release */\n const patch = npm.getPatch(version) ?? 0;\n if (major > 0) {\n return `${major}.${minor}`;\n }\n if (minor > 0) {\n return `0.${minor}`;\n }\n return `0.0.${patch}`;\n}\n\n// The lowest version a single specifier admits, for ordering; a bare upper\n// bound such as `<0.0.1` starts at zero.\nfunction specLowerBound(spec: string): number[] {\n if (spec.startsWith('<') || spec.startsWith('\\u2264')) {\n return [0];\n }\n /* v8 ignore next -- a specifier without digits never reaches ordering */\n const digits = regEx(/\\d+(?:\\.\\d+)*/).exec(spec)?.[0] ?? '0';\n return digits.split('.').map(Number);\n}\n\nfunction isAbove(a: number[], b: number[]): boolean {\n for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n const left = a[i] ?? 0;\n const right = b[i] ?? 0;\n if (left !== right) {\n return left > right;\n }\n }\n return false;\n}\n\n// Julia's convention is to append a new specifier rather than replace the\n// entry, keeping it in ascending order.\nfunction widen(currentValue: string, newVersion: string): string {\n if (matches(newVersion, currentValue)) {\n return currentValue;\n }\n // Keep the last specifier's `~`, `^` or `=`: a plain `1.3` is `[1.3, 2.0)`,\n // so next to `~1.2` or `=1.2.5` it would let in all of 1.x.\n const last = lastSpecifier(currentValue);\n const operator = regEx(/^(?:[~^]|=\\s*)/).exec(last)?.[0] ?? '';\n // Next to a bare major such as `5`, write `6`, not `6.0`: the entry's own\n // style, and CompatHelper's.\n const major = npm.getMajor(newVersion)!;\n let newSpec: string;\n if (operator.startsWith('=')) {\n newSpec = operator + newVersion;\n } else if (\n major > 0 &&\n regEx(/^\\d+$/).test(last.slice(operator.length).trim())\n ) {\n newSpec = `${operator}${major}`;\n } else {\n newSpec = operator + simplifiedSpec(newVersion);\n }\n const separator =\n currentValue.includes(',') && !currentValue.includes(', ') ? ',' : ', ';\n const specs = currentValue.split(',').map((spec) => spec.trim());\n const index = specs.findIndex((spec) =>\n isAbove(specLowerBound(spec), specLowerBound(newSpec)),\n );\n if (index === -1) {\n return `${currentValue}${separator}${newSpec}`;\n }\n specs.splice(index, 0, newSpec);\n return specs.join(separator);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (!currentValue || currentValue === '*') {\n return currentValue;\n }\n // A hyphen range is a deliberate manual constraint. Anchored: a hyphen\n // without surrounding whitespace is a prerelease tag, not a range.\n if (regEx(/^\\d+(?:\\.\\d+)*\\s+-\\s+\\d+(?:\\.\\d+)*$/).test(currentValue)) {\n return currentValue;\n }\n // A compat entry carries `major.minor.patch` and nothing else: the\n // specifier grammar in Pkg.jl `src/Versions.jl` (`ver_regs`, unchanged from\n // Julia 1.0 through 1.13) takes digits only, and its bounds compare the\n // three numbers, so `1.6.10` admits `1.6.10-rc1` and a JLL's `1.6.10+0`.\n const target = newVersion.replace(regEx(/[-+].*$/), '');\n // Bare version `1.2.3` (implicit caret) under bump → simply replace.\n if (rangeStrategy === 'bump' && regEx(/^\\d+(?:\\.\\d+)*$/).test(currentValue)) {\n return target;\n }\n if (isSingleVersion(currentValue)) {\n let res = '=';\n if (currentValue.startsWith('= ')) {\n res += ' ';\n }\n res += target;\n return res;\n }\n // After the single-version branch: an exact pin is a hard constraint, and\n // appending to it would silently relax it.\n if (rangeStrategy === 'widen') {\n return widen(currentValue, target);\n }\n if (rangeStrategy === 'replace' && matches(target, currentValue)) {\n return currentValue;\n }\n // npm bumps every comparator of a union and joins them with a space, which\n // is not Julia syntax; bump the last specifier instead.\n const npmCurrentValue =\n rangeStrategy === 'bump' && currentValue.includes(',')\n ? lastSpecifier(currentValue)\n : currentValue;\n const newSemver = npm.getNewValue({\n currentValue: julia2npm(npmCurrentValue),\n rangeStrategy,\n currentVersion,\n newVersion: target,\n });\n /* v8 ignore if: defensive — npm should always return a value for inputs julia2npm produces */\n if (!newSemver) {\n logger.warn(\n { currentValue, rangeStrategy, newVersion },\n 'Could not derive julia version range',\n );\n return currentValue;\n }\n let newJulia = npm2julia(newSemver);\n // Preserve precision (number of components) when current uses `^` or `~`.\n const isTildeOrCaret =\n currentValue.startsWith('~') || currentValue.startsWith('^');\n if (\n isTildeOrCaret &&\n rangeStrategy === 'replace' &&\n newJulia.split('.').length > componentCount(currentValue)\n ) {\n newJulia = newJulia\n .split('.')\n .slice(0, componentCount(currentValue))\n .join('.');\n }\n // Reverse any caret npm added that the original didn't have, restoring\n // Julia's bare-version-is-caret default.\n if (newJulia.startsWith('^') && !currentValue.startsWith('^')) {\n const withoutCaret = newJulia.substring(1);\n // Cutting to the current precision is a `replace` behavior; under `bump`\n // it would throw the bump away.\n newJulia =\n rangeStrategy === 'replace'\n ? withoutCaret\n .split('.')\n .slice(0, componentCount(currentValue))\n .join('.')\n : withoutCaret;\n }\n\n return newJulia;\n}\n\nfunction isBreaking(current: string, version: string): boolean {\n // Treat any unstable version as potentially breaking.\n if (!semver.is(version) || !semver.is(current)) {\n return true;\n }\n const currentMajor = getMajor(current);\n // Julia treats the leftmost non-zero digit as the breaking-change axis\n // (same as Cargo / npm caret semantics).\n if (currentMajor === 0) {\n if (getMinor(current) === 0) {\n return current !== version;\n }\n return getMinor(current) !== getMinor(version);\n }\n return currentMajor !== getMajor(version);\n}\n\nexport const api: VersioningApi = {\n ...npm,\n getNewValue,\n getPinnedValue,\n isBreaking,\n isLessThanRange,\n isSingleVersion,\n isValid,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n};\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["npm","semver","getMajor","getMinor"],"sources":["../../../../lib/modules/versioning/julia/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { major as getMajor, minor as getMinor } from 'semver';\nimport semver from 'semver-stable';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { api as npm } from '../npm/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\n\nexport const id = 'julia';\nexport const displayName = 'Julia';\nexport const urls = [\n '[Pkg.jl - Compatibility](https://pkgdocs.julialang.org/v1/compatibility/)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'pin',\n 'replace',\n 'widen',\n];\n\nfunction convertToCaret(item: string): string {\n // In Julia, caret is the default specifier — `1.2.3` means `^1.2.3`.\n // See: https://pkgdocs.julialang.org/v1/compatibility/#Version-specifier-format\n const trimmed = item.trim();\n if (\n npm.isVersion(trimmed) ||\n npm.isVersion(`${trimmed}.0`) ||\n npm.isVersion(`${trimmed}.0.0`)\n ) {\n return `^${trimmed}`;\n }\n return trimmed;\n}\n\nfunction julia2npm(input: string): string {\n // Julia uses `,` for *union* (npm: `||`), `≥` as a synonym for `>=`,\n // and treats bare versions as carets.\n return input\n .replaceAll('≥', '>=')\n .split(',')\n .map(convertToCaret)\n .filter(isNonEmptyString)\n .join(' || ');\n}\n\nfunction npm2julia(input: string): string {\n /* v8 ignore if -- defensive */\n if (!input) {\n logger.warn(\n { input },\n 'julia: npm2julia received an empty value, returning as-is',\n );\n return input;\n }\n // Convert npm union (`||`) back to Julia union (`,`).\n return input\n .split(regEx(/\\s*\\|\\|\\s*/))\n .map((part) => part.trim())\n .filter(isNonEmptyString)\n .join(', ');\n}\n\nfunction isLessThanRange(version: string, range: string): boolean {\n return !!npm.isLessThanRange?.(version, julia2npm(range));\n}\n\nfunction isValid(input: string): boolean {\n // Pkg rejects an empty specifier, alone or in a union: `\"\"`, `\"1.2,\"`.\n return (\n input.split(',').every((spec) => isNonEmptyString(spec.trim())) &&\n npm.isValid(julia2npm(input))\n );\n}\n\nfunction matches(version: string, range: string): boolean {\n return npm.matches(version, julia2npm(range));\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.getSatisfyingVersion(versions, julia2npm(range));\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return npm.minSatisfyingVersion(versions, julia2npm(range));\n}\n\nfunction isSingleVersion(constraint: string): boolean {\n const trimmed = constraint.trim();\n return trimmed.startsWith('=') && npm.isVersion(trimmed.substring(1).trim());\n}\n\nfunction getPinnedValue(newVersion: string): string {\n return `=${newVersion}`;\n}\n\n// A union like `0.10, 0.11` is several specifiers; the last one carries the\n// precision and the lower bound an upgrade moves.\nfunction lastSpecifier(value: string): string {\n return value.split(',').at(-1)!.trim();\n}\n\nfunction componentCount(value: string): number {\n return lastSpecifier(value).split('.').length;\n}\n\n// `major.minor` above 1.0, `0.minor` for 0.x, `0.0.patch` for 0.0.x, always\n// written plain.\nfunction simplifiedSpec(version: string): string {\n /* v8 ignore next -- newVersion is always a full release */\n const major = npm.getMajor(version) ?? 0;\n /* v8 ignore next -- newVersion is always a full release */\n const minor = npm.getMinor(version) ?? 0;\n /* v8 ignore next -- newVersion is always a full release */\n const patch = npm.getPatch(version) ?? 0;\n if (major > 0) {\n return `${major}.${minor}`;\n }\n if (minor > 0) {\n return `0.${minor}`;\n }\n return `0.0.${patch}`;\n}\n\n// The lowest version a single specifier admits, for ordering; a bare upper\n// bound such as `<0.0.1` starts at zero.\nfunction specLowerBound(spec: string): number[] {\n if (spec.startsWith('<') || spec.startsWith('\\u2264')) {\n return [0];\n }\n /* v8 ignore next -- a specifier without digits never reaches ordering */\n const digits = regEx(/\\d+(?:\\.\\d+)*/).exec(spec)?.[0] ?? '0';\n return digits.split('.').map(Number);\n}\n\nfunction isAbove(a: number[], b: number[]): boolean {\n for (let i = 0; i < Math.max(a.length, b.length); i += 1) {\n const left = a[i] ?? 0;\n const right = b[i] ?? 0;\n if (left !== right) {\n return left > right;\n }\n }\n return false;\n}\n\n// Julia's convention is to append a new specifier rather than replace the\n// entry, keeping it in ascending order.\nfunction widen(currentValue: string, newVersion: string): string {\n if (matches(newVersion, currentValue)) {\n return currentValue;\n }\n // Keep the last specifier's `~`, `^` or `=`: a plain `1.3` is `[1.3, 2.0)`,\n // so next to `~1.2` or `=1.2.5` it would let in all of 1.x.\n const last = lastSpecifier(currentValue);\n const operator = regEx(/^(?:[~^]|=\\s*)/).exec(last)?.[0] ?? '';\n // From 1.0 on, write the bare major, as CompatHelper's\n // `compat_version_number` does: `6` rather than `6.2`. A `~` keeps the minor,\n // since `~6` would let in all of 6.x, unless it is next to a bare major.\n const major = npm.getMajor(newVersion)!;\n const keepsMinor =\n operator === '~' &&\n !regEx(/^\\d+$/).test(last.slice(operator.length).trim());\n let newSpec: string;\n if (operator.startsWith('=')) {\n newSpec = operator + newVersion;\n } else if (major > 0 && !keepsMinor) {\n newSpec = `${operator}${major}`;\n } else {\n newSpec = operator + simplifiedSpec(newVersion);\n }\n const separator =\n currentValue.includes(',') && !currentValue.includes(', ') ? ',' : ', ';\n const specs = currentValue.split(',').map((spec) => spec.trim());\n const index = specs.findIndex((spec) =>\n isAbove(specLowerBound(spec), specLowerBound(newSpec)),\n );\n if (index === -1) {\n return `${currentValue}${separator}${newSpec}`;\n }\n specs.splice(index, 0, newSpec);\n return specs.join(separator);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n currentVersion,\n newVersion,\n}: NewValueConfig): string {\n if (!currentValue || currentValue === '*') {\n return currentValue;\n }\n // A hyphen range is a deliberate manual constraint. Anchored: a hyphen\n // without surrounding whitespace is a prerelease tag, not a range.\n if (regEx(/^\\d+(?:\\.\\d+)*\\s+-\\s+\\d+(?:\\.\\d+)*$/).test(currentValue)) {\n return currentValue;\n }\n // A compat entry carries `major.minor.patch` and nothing else: the\n // specifier grammar in Pkg.jl `src/Versions.jl` (`ver_regs`, unchanged from\n // Julia 1.0 through 1.13) takes digits only, and its bounds compare the\n // three numbers, so `1.6.10` admits `1.6.10-rc1` and a JLL's `1.6.10+0`.\n const target = newVersion.replace(regEx(/[-+].*$/), '');\n // Bare version `1.2.3` (implicit caret) under bump → simply replace.\n if (rangeStrategy === 'bump' && regEx(/^\\d+(?:\\.\\d+)*$/).test(currentValue)) {\n return target;\n }\n if (isSingleVersion(currentValue)) {\n let res = '=';\n if (currentValue.startsWith('= ')) {\n res += ' ';\n }\n res += target;\n return res;\n }\n // After the single-version branch: an exact pin is a hard constraint, and\n // appending to it would silently relax it.\n if (rangeStrategy === 'widen') {\n return widen(currentValue, target);\n }\n if (rangeStrategy === 'replace' && matches(target, currentValue)) {\n return currentValue;\n }\n // npm bumps every comparator of a union and joins them with a space, which\n // is not Julia syntax; bump the last specifier instead.\n const npmCurrentValue =\n rangeStrategy === 'bump' && currentValue.includes(',')\n ? lastSpecifier(currentValue)\n : currentValue;\n const newSemver = npm.getNewValue({\n currentValue: julia2npm(npmCurrentValue),\n rangeStrategy,\n currentVersion,\n newVersion: target,\n });\n /* v8 ignore if: defensive — npm should always return a value for inputs julia2npm produces */\n if (!newSemver) {\n logger.warn(\n { currentValue, rangeStrategy, newVersion },\n 'Could not derive julia version range',\n );\n return currentValue;\n }\n let newJulia = npm2julia(newSemver);\n // Preserve precision (number of components) when current uses `^` or `~`.\n const isTildeOrCaret =\n currentValue.startsWith('~') || currentValue.startsWith('^');\n if (\n isTildeOrCaret &&\n rangeStrategy === 'replace' &&\n newJulia.split('.').length > componentCount(currentValue)\n ) {\n newJulia = newJulia\n .split('.')\n .slice(0, componentCount(currentValue))\n .join('.');\n }\n // Reverse any caret npm added that the original didn't have, restoring\n // Julia's bare-version-is-caret default.\n if (newJulia.startsWith('^') && !currentValue.startsWith('^')) {\n const withoutCaret = newJulia.substring(1);\n // Cutting to the current precision is a `replace` behavior; under `bump`\n // it would throw the bump away.\n newJulia =\n rangeStrategy === 'replace'\n ? withoutCaret\n .split('.')\n .slice(0, componentCount(currentValue))\n .join('.')\n : withoutCaret;\n }\n\n return newJulia;\n}\n\nfunction isBreaking(current: string, version: string): boolean {\n // Treat any unstable version as potentially breaking.\n if (!semver.is(version) || !semver.is(current)) {\n return true;\n }\n const currentMajor = getMajor(current);\n // Julia treats the leftmost non-zero digit as the breaking-change axis\n // (same as Cargo / npm caret semantics).\n if (currentMajor === 0) {\n if (getMinor(current) === 0) {\n return current !== version;\n }\n return getMinor(current) !== getMinor(version);\n }\n return currentMajor !== getMajor(version);\n}\n\nexport const api: VersioningApi = {\n ...npm,\n getNewValue,\n getPinnedValue,\n isBreaking,\n isLessThanRange,\n isSingleVersion,\n isValid,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n};\nexport default api;\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.235.
|
|
4
|
+
"version": "44.235.5",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -217,7 +217,7 @@
|
|
|
217
217
|
"devDependencies": {
|
|
218
218
|
"@biomejs/biome": "2.6.5",
|
|
219
219
|
"@commander-js/extra-typings": "15.0.0",
|
|
220
|
-
"@containerbase/istanbul-reports-html": "2.0.
|
|
220
|
+
"@containerbase/istanbul-reports-html": "2.0.25",
|
|
221
221
|
"@containerbase/semantic-release-pnpm": "1.4.4",
|
|
222
222
|
"@hyrious/marshal": "0.3.4",
|
|
223
223
|
"@ls-lint/ls-lint": "2.3.2",
|
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.235.
|
|
3
|
+
"title": "JSON schema for Renovate 44.235.5 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.235.
|
|
5
|
+
"x-renovate-version": "44.235.5",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|