renovate 44.216.6 → 44.217.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import "../../../constants/error-messages.js";
2
2
  import { logger } from "../../../logger/index.js";
3
- import { deleteLocalFile, getSiblingFileName, readLocalFile, writeLocalFile } from "../../../util/fs/index.js";
3
+ import { getSiblingFileName, readLocalFile, writeLocalFile } from "../../../util/fs/index.js";
4
4
  import { exec } from "../../../util/exec/index.js";
5
5
  import { getRepoStatus } from "../../../util/git/index.js";
6
6
  import { collectFileChanges } from "../../../util/git/file-changes.js";
@@ -21,7 +21,6 @@ async function updateArtifacts({ packageFileName, updatedDeps, newPackageFileCon
21
21
  }
22
22
  try {
23
23
  await writeLocalFile(packageFileName, newPackageFileContent);
24
- if (isLockFileMaintenance) await deleteLocalFile(lockFileName);
25
24
  const execOptions = {
26
25
  cwdFile: packageFileName,
27
26
  docker: {},
@@ -30,7 +29,7 @@ async function updateArtifacts({ packageFileName, updatedDeps, newPackageFileCon
30
29
  constraint: await resolveToolConstraint(config, "apm")
31
30
  }]
32
31
  };
33
- await exec("apm install", execOptions);
32
+ await exec(isLockFileMaintenance ? "apm install --update" : "apm install", execOptions);
34
33
  const status = await getRepoStatus();
35
34
  const res = fileChangesToArtifactResults([...await collectFileChanges(status, {
36
35
  include: ["modified", "not_added"],
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/apm/artifacts.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { collectFileChanges } from '../../../util/git/file-changes.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport {\n artifactErrorResult,\n fileChangesToArtifactResults,\n resolveToolConstraint,\n} from '../util.ts';\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`apm.updateArtifacts(${packageFileName})`);\n const { isLockFileMaintenance } = config;\n\n if (!isNonEmptyArray(updatedDeps) && !isLockFileMaintenance) {\n logger.debug('apm: no updated deps - returning null');\n return null;\n }\n\n const lockFileName = getSiblingFileName(packageFileName, 'apm.lock.yaml');\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n logger.debug('apm: no lock file found');\n return null;\n }\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n if (isLockFileMaintenance) {\n await deleteLocalFile(lockFileName);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: packageFileName,\n docker: {},\n toolConstraints: [\n {\n toolName: 'apm',\n constraint: await resolveToolConstraint(config, 'apm'),\n },\n ],\n };\n await exec('apm install', execOptions);\n\n // `apm install` regenerates the lockfile and re-deploys the harness\n // directories (`.github/`, `.claude/`, ...) that APM consumers commit, so\n // return every file it changed - not just the lockfile - or the committed\n // instruction files go stale after a bump. `apm_modules/` is the gitignored\n // cache, so it is not reported here.\n const status = await getRepoStatus();\n const res = fileChangesToArtifactResults([\n ...(await collectFileChanges(status, {\n include: ['modified', 'not_added'],\n // the manifest itself is committed as an updated package file\n filter: (path) => path !== packageFileName,\n })),\n ...(await collectFileChanges(status, { include: ['deleted'] })),\n ]);\n if (!res.length) {\n logger.debug('apm: no changed files after install');\n return null;\n }\n return res;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, `Failed to update ${lockFileName}`);\n return artifactErrorResult(lockFileName, err);\n }\n}\n"],"mappings":";;;;;;;;;AAoBA,eAAsB,gBAAgB,EACpC,iBACA,aACA,uBACA,UAC0D;CAC1D,OAAO,MAAM,uBAAuB,gBAAgB,EAAE;CACtD,MAAM,EAAE,0BAA0B;CAElC,IAAI,CAAC,gBAAgB,WAAW,KAAK,CAAC,uBAAuB;EAC3D,OAAO,MAAM,uCAAuC;EACpD,OAAO;CACT;CAEA,MAAM,eAAe,mBAAmB,iBAAiB,eAAe;CAExE,IAAI,CAAC,MADiC,cAAc,cAAc,MAAM,GAC1C;EAC5B,OAAO,MAAM,yBAAyB;EACtC,OAAO;CACT;CAEA,IAAI;EACF,MAAM,eAAe,iBAAiB,qBAAqB;EAC3D,IAAI,uBACF,MAAM,gBAAgB,YAAY;EAGpC,MAAM,cAA2B;GAC/B,SAAS;GACT,QAAQ,CAAC;GACT,iBAAiB,CACf;IACE,UAAU;IACV,YAAY,MAAM,sBAAsB,QAAQ,KAAK;GACvD,CACF;EACF;EACA,MAAM,KAAK,eAAe,WAAW;EAOrC,MAAM,SAAS,MAAM,cAAc;EACnC,MAAM,MAAM,6BAA6B,CACvC,GAAI,MAAM,mBAAmB,QAAQ;GACnC,SAAS,CAAC,YAAY,WAAW;GAEjC,SAAS,SAAS,SAAS;EAC7B,CAAC,GACD,GAAI,MAAM,mBAAmB,QAAQ,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAC/D,CAAC;EACD,IAAI,CAAC,IAAI,QAAQ;GACf,OAAO,MAAM,qCAAqC;GAClD,OAAO;EACT;EACA,OAAO;CACT,SAAS,KAAK;EACZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,MAAM,EAAE,IAAI,GAAG,oBAAoB,cAAc;EACxD,OAAO,oBAAoB,cAAc,GAAG;CAC9C;AACF"}
1
+ {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/apm/artifacts.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { collectFileChanges } from '../../../util/git/file-changes.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport {\n artifactErrorResult,\n fileChangesToArtifactResults,\n resolveToolConstraint,\n} from '../util.ts';\n\nexport async function updateArtifacts({\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`apm.updateArtifacts(${packageFileName})`);\n const { isLockFileMaintenance } = config;\n\n if (!isNonEmptyArray(updatedDeps) && !isLockFileMaintenance) {\n logger.debug('apm: no updated deps - returning null');\n return null;\n }\n\n const lockFileName = getSiblingFileName(packageFileName, 'apm.lock.yaml');\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n logger.debug('apm: no lock file found');\n return null;\n }\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n\n const execOptions: ExecOptions = {\n cwdFile: packageFileName,\n docker: {},\n toolConstraints: [\n {\n toolName: 'apm',\n constraint: await resolveToolConstraint(config, 'apm'),\n },\n ],\n };\n // Plain `apm install` only syncs the lockfile to the manifest. For lock\n // file maintenance, `--update` re-resolves each dependency to the latest\n // ref `apm.yml` allows, without editing `apm.yml`. (`apm update` would also\n // move full-SHA pins in `apm.yml`, which is for Renovate's own updates.)\n //\n // The lockfile stays in place. It is APM's record of which deployed files\n // it owns, so without it `apm install` skips the committed files as\n // unmanaged: the ownership ledger and file hashes are lost, and when a ref\n // moves, the deployed files stay at the old version.\n await exec(\n isLockFileMaintenance ? 'apm install --update' : 'apm install',\n execOptions,\n );\n\n // The command regenerates the lockfile and re-deploys the harness\n // directories (`.github/`, `.claude/`, ...) that APM consumers commit, so\n // return every file it changed - not just the lockfile - or the committed\n // instruction files go stale after a bump. `apm_modules/` is the gitignored\n // cache, so it is not reported here.\n const status = await getRepoStatus();\n const res = fileChangesToArtifactResults([\n ...(await collectFileChanges(status, {\n include: ['modified', 'not_added'],\n // the manifest itself is committed as an updated package file\n filter: (path) => path !== packageFileName,\n })),\n ...(await collectFileChanges(status, { include: ['deleted'] })),\n ]);\n if (!res.length) {\n logger.debug('apm: no changed files after install');\n return null;\n }\n return res;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, `Failed to update ${lockFileName}`);\n return artifactErrorResult(lockFileName, err);\n }\n}\n"],"mappings":";;;;;;;;;AAmBA,eAAsB,gBAAgB,EACpC,iBACA,aACA,uBACA,UAC0D;CAC1D,OAAO,MAAM,uBAAuB,gBAAgB,EAAE;CACtD,MAAM,EAAE,0BAA0B;CAElC,IAAI,CAAC,gBAAgB,WAAW,KAAK,CAAC,uBAAuB;EAC3D,OAAO,MAAM,uCAAuC;EACpD,OAAO;CACT;CAEA,MAAM,eAAe,mBAAmB,iBAAiB,eAAe;CAExE,IAAI,CAAC,MADiC,cAAc,cAAc,MAAM,GAC1C;EAC5B,OAAO,MAAM,yBAAyB;EACtC,OAAO;CACT;CAEA,IAAI;EACF,MAAM,eAAe,iBAAiB,qBAAqB;EAE3D,MAAM,cAA2B;GAC/B,SAAS;GACT,QAAQ,CAAC;GACT,iBAAiB,CACf;IACE,UAAU;IACV,YAAY,MAAM,sBAAsB,QAAQ,KAAK;GACvD,CACF;EACF;EAUA,MAAM,KACJ,wBAAwB,yBAAyB,eACjD,WACF;EAOA,MAAM,SAAS,MAAM,cAAc;EACnC,MAAM,MAAM,6BAA6B,CACvC,GAAI,MAAM,mBAAmB,QAAQ;GACnC,SAAS,CAAC,YAAY,WAAW;GAEjC,SAAS,SAAS,SAAS;EAC7B,CAAC,GACD,GAAI,MAAM,mBAAmB,QAAQ,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAC/D,CAAC;EACD,IAAI,CAAC,IAAI,QAAQ;GACf,OAAO,MAAM,qCAAqC;GAClD,OAAO;EACT;EACA,OAAO;CACT,SAAS,KAAK;EACZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,MAAM,EAAE,IAAI,GAAG,oBAAoB,cAAc;EACxD,OAAO,oBAAoB,cAAc,GAAG;CAC9C;AACF"}
@@ -3,7 +3,7 @@ const hashMap = /* @__PURE__ */ new Map();
3
3
  hashMap.set("ansible", "a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81");
4
4
  hashMap.set("ansible-galaxy", "8e11293c8f61b4cbae77a3b1634a47213031c59df2c9833d89db65bf4e6edc64");
5
5
  hashMap.set("ant", "2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17");
6
- hashMap.set("apm", "b804a297488db65b99b6f3af966bf3f02ddb4a3ae6f4bfe418fb7023d895d261");
6
+ hashMap.set("apm", "559aca1db5b117b162962fe817db5550f1b17793b02b45982394ea2458e421f7");
7
7
  hashMap.set("argocd", "cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5");
8
8
  hashMap.set("asdf", "430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb");
9
9
  hashMap.set("azure-pipelines", "04a13dec4e08ba21004961c718072fde976226d65809fa3c838bf66ba93e5d5a");
@@ -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','b804a297488db65b99b6f3af966bf3f02ddb4a3ae6f4bfe418fb7023d895d261');\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','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\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','41e6a8b7b8bae08f07b3e4b69c8c095db5da984bb23c004cd1ebf755a6317794');\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('git-submodules','064fa55369f11feec61b699cb122df6ea81f8e0c09ea9f7dbb96796c87be6950');\nhashMap.set('github-actions','ab06f8778662cdb79f4593d2c57cbd80e713537d885bbcef88be1db27c7a4f2c');\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','ab63e5bc2bb381939a6b75911947e3fc79d31827423ded07f61ea1c98d95a542');\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('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','49077fd316618114cea787f4d165dee2abd9afb7c3b52e5213a70645c35dfb70');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','422242f1714be6972fc7006c37f4a497dbbd44ba9c3f68f7b73e7dd3d81fd74d');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','c5d528011733342584558827bc9b5124762fd5091612ea7292e2a1101d2851b7');\nhashMap.set('nuget','fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('paket','0cf8ff9b040ecf28f29b23bbe2ab2544ab3c94822bc1fb53ee4df7b74f000dea');\nhashMap.set('pep621','02ba97d9d2bbd696417ea0ea26c0ed27f4e8cf296f1afdbb27ec07bcc3bd987c');\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','2c74e8e94c484c8bfc93ba1272078d531a52e4faaa978fc90ddb654064bb85bc');\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','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','cdf063debdbf36888523ff8cec6d2d1b0ec6f49b37b2fbcd80b0d4f6a31114e1');\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','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"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','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\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','41e6a8b7b8bae08f07b3e4b69c8c095db5da984bb23c004cd1ebf755a6317794');\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('git-submodules','064fa55369f11feec61b699cb122df6ea81f8e0c09ea9f7dbb96796c87be6950');\nhashMap.set('github-actions','ab06f8778662cdb79f4593d2c57cbd80e713537d885bbcef88be1db27c7a4f2c');\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','ab63e5bc2bb381939a6b75911947e3fc79d31827423ded07f61ea1c98d95a542');\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('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','49077fd316618114cea787f4d165dee2abd9afb7c3b52e5213a70645c35dfb70');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','422242f1714be6972fc7006c37f4a497dbbd44ba9c3f68f7b73e7dd3d81fd74d');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','c5d528011733342584558827bc9b5124762fd5091612ea7292e2a1101d2851b7');\nhashMap.set('nuget','fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('paket','0cf8ff9b040ecf28f29b23bbe2ab2544ab3c94822bc1fb53ee4df7b74f000dea');\nhashMap.set('pep621','02ba97d9d2bbd696417ea0ea26c0ed27f4e8cf296f1afdbb27ec07bcc3bd987c');\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','2c74e8e94c484c8bfc93ba1272078d531a52e4faaa978fc90ddb654064bb85bc');\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','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','cdf063debdbf36888523ff8cec6d2d1b0ec6f49b37b2fbcd80b0d4f6a31114e1');\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','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":"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"}
@@ -53,6 +53,13 @@ export interface ToolConstraintsConfig {
53
53
  * the files it is called with.
54
54
  */
55
55
  extractedConstraints?: Partial<Record<ConstraintName, string>> | null;
56
+ /**
57
+ * Tool versions which other managers, like `mise`, share for the directory of
58
+ * the package files, see {@link SharedConstraintsScope}. They are the versions
59
+ * a version manager installs, so they win over a range which the package
60
+ * files only require, if they are within it.
61
+ */
62
+ sharedConstraints?: Partial<Record<ConstraintName, string>> | null;
56
63
  }
57
64
  export interface UpdateArtifactsConfig extends ToolConstraintsConfig {
58
65
  isLockFileMaintenance?: boolean;
@@ -83,6 +90,10 @@ export interface RangeConfig<T = unknown> extends ManagerData<T> {
83
90
  export interface PackageFileContent<T = unknown> extends ManagerData<T> {
84
91
  autoReplaceStringTemplate?: string;
85
92
  extractedConstraints?: Partial<Record<ConstraintName, string>>;
93
+ /**
94
+ * Set by the manager to share constraints with the package files of other managers, see {@link SharedConstraintsScope}.
95
+ */
96
+ sharedConstraintsScope?: SharedConstraintsScope;
86
97
  /**
87
98
  * Any specific overrides for the versioning for the `AdditionalConstraintName`s.
88
99
  */
@@ -380,6 +391,33 @@ export interface DepTypeMetadata {
380
391
  /** Human-readable description of what this depType represents */
381
392
  description: string;
382
393
  }
394
+ /**
395
+ * A constraint which a package file shares, see {@link SharedConstraintsScope}.
396
+ */
397
+ export interface SharedConstraint {
398
+ /** The dependency which sets the constraint, a branch which updates it uses its new value */
399
+ depName: string;
400
+ /** The constraint, or `null` if the tool has a version which is no constraint, like the Rust channel `stable`, so that it hides the constraint of a parent directory */
401
+ value: string | null;
402
+ }
403
+ /**
404
+ * The constraints which a package file shares with the package files of other managers, and the directory tree in which they apply.
405
+ */
406
+ export interface SharedConstraintsScope {
407
+ /** The directory, relative to the repository root, whose package files and subdirectories the constraints apply to */
408
+ directory: string;
409
+ /** Decides between package files of the manager in the same directory, the higher one wins */
410
+ precedence: number;
411
+ /** The shared constraints, which unlike `extractedConstraints` do not apply to the package file itself */
412
+ constraints: Partial<Record<ConstraintName, SharedConstraint>>;
413
+ }
414
+ /**
415
+ * The constraints which a package file of a manager shares, see {@link SharedConstraintsScope}.
416
+ */
417
+ export interface SharedConstraints extends SharedConstraintsScope {
418
+ manager: string;
419
+ packageFile: string;
420
+ }
383
421
  /**
384
422
  * `true` when supported, or the version range of the package manager that supports it, e.g. `>=11.10.0`.
385
423
  */
@@ -1,6 +1,9 @@
1
1
  import { logger } from "../../logger/index.js";
2
+ import { isToolName } from "../../util/exec/types.js";
3
+ import { getToolConfig } from "../../util/exec/containerbase.js";
2
4
  import { detectPlatform } from "../../util/common.js";
3
5
  import { deleteLocalFile, readLocalFile, writeLocalFile } from "../../util/fs/index.js";
6
+ import { get } from "../versioning/index.js";
4
7
  import { parseGitUrl } from "../../util/git/url.js";
5
8
  import { GitRefsDatasource } from "../datasource/git-refs/index.js";
6
9
  import { GitTagsDatasource } from "../datasource/git-tags/index.js";
@@ -62,22 +65,35 @@ function fileChangesToArtifactResults(changes) {
62
65
  * 2. `derive`, because it reads the package files as the branch changed them,
63
66
  * so it can be newer than what extraction saw
64
67
  * 3. `extractedConstraints`, as collected while extracting the base branch
68
+ * 4. `sharedConstraints`, the version which a version manager like `mise`
69
+ * installs for the directory, which also wins over the constraint of step 2
70
+ * or 3 if it is within it, like `20.11.0` within `>=18`
65
71
  *
66
72
  * Managers that have no way to derive the constraint at artifact time can omit
67
73
  * `derive`. An empty string counts as "not set" at every step, so it never
68
74
  * shadows a value further down the list.
69
75
  *
70
- * This is the only place that reads `constraints` and `extractedConstraints`
71
- * from the config; the `renovate/prefer-resolve-tool-constraint` lint rule
72
- * keeps managers from reading them directly.
76
+ * This is the only place that reads `constraints`, `extractedConstraints` and
77
+ * `sharedConstraints` from the config; the
78
+ * `renovate/prefer-resolve-tool-constraint` lint rule keeps managers from
79
+ * reading them directly.
73
80
  */
74
81
  async function resolveToolConstraint(config, toolName, derive) {
75
82
  const configured = config.constraints?.[toolName];
76
83
  if (isNonEmptyString(configured)) return configured;
77
- const derived = await derive?.();
78
- if (isNonEmptyString(derived)) return derived;
79
- const extracted = config.extractedConstraints?.[toolName];
80
- return isNonEmptyString(extracted) ? extracted : void 0;
84
+ const required = [await derive?.(), config.extractedConstraints?.[toolName]].find(isNonEmptyString);
85
+ const shared = config.sharedConstraints?.[toolName];
86
+ if (!isNonEmptyString(shared)) return required;
87
+ return !required || isWithin(toolName, shared, required) ? shared : required;
88
+ }
89
+ /**
90
+ * Whether the tool `constraint` is a version within `range`, or a range which is a subset of it.
91
+ */
92
+ function isWithin(toolName, constraint, range) {
93
+ if (!isToolName(toolName)) return false;
94
+ const versioning = get(getToolConfig(toolName)?.versioning);
95
+ if (!versioning.isValid(constraint) || !versioning.isValid(range)) return false;
96
+ return versioning.isSingleVersion(constraint) ? versioning.matches(constraint, range) : versioning.subset?.(constraint, range) === true;
81
97
  }
82
98
  /**
83
99
  * The result which reports `path` as created or updated.
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":[],"sources":["../../../lib/modules/manager/util.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { logger } from '../../logger/index.ts';\nimport type { MaybePromise } from '../../types/index.ts';\nimport { detectPlatform } from '../../util/common.ts';\nimport type { ExecError } from '../../util/exec/exec-error.ts';\nimport type { ConstraintName } from '../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n readLocalFile,\n writeLocalFile,\n} from '../../util/fs/index.ts';\nimport type { FileChange } from '../../util/git/types.ts';\nimport { parseGitUrl } from '../../util/git/url.ts';\nimport { GitRefsDatasource } from '../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../datasource/gitlab-tags/index.ts';\nimport type {\n PackageDependency,\n ToolConstraintsConfig,\n UpdateArtifactsResult,\n UpdateLockFileConfig,\n} from './types.ts';\n\nexport function applyGitSource(\n dep: PackageDependency,\n git: string,\n rev: string | undefined,\n tag: string | undefined,\n branch: string | undefined,\n): void {\n if (tag) {\n const platform = detectPlatform(git);\n if (platform === 'github' || platform === 'gitlab') {\n dep.datasource =\n platform === 'github'\n ? GithubTagsDatasource.id\n : GitlabTagsDatasource.id;\n const { host, full_name } = parseGitUrl(git);\n\n // Always use HTTPS for GitHub/GitLab API endpoints, even if the git URL protocol is SSH.\n dep.registryUrls = [`https://${host}`];\n dep.packageName = full_name;\n } else {\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = git;\n }\n dep.currentValue = tag;\n dep.skipReason = undefined;\n } else if (rev) {\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = git;\n dep.currentDigest = rev;\n dep.replaceString = rev;\n dep.skipReason = undefined;\n } else {\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = git;\n dep.currentValue = branch;\n dep.skipReason = branch ? 'git-dependency' : 'unspecified-version';\n }\n}\n\n/**\n * Given an {@link ExecError}, retrieve the message which will be used for an {@link ArtifactError}.\n *\n * An `ExecError` always carries a `stderr` property, so nullish coalescing would keep an empty string and render an artifact error with no message at all.\n *\n */\nexport function artifactErrorMessageFromExecError(\n err: Partial<ExecError>,\n message: string,\n): string {\n if (err.stderr?.trim()) {\n return err.stderr;\n }\n\n if (err.stdout?.trim()) {\n return err.stdout;\n }\n\n return message;\n}\n\n/**\n * Wraps {@link FileChange}s, e.g. the result of `collectFileChanges()`, into the\n * result shape returned by `updateArtifacts()`.\n */\nexport function fileChangesToArtifactResults(\n changes: FileChange[],\n): UpdateArtifactsResult[] {\n return changes.map((file) => ({ file }));\n}\n\n/**\n * Resolve the constraint for a tool that `updateArtifacts()` has to run.\n *\n * The precedence is:\n *\n * 1. `constraints`, because the user asked for it explicitly\n * 2. `derive`, because it reads the package files as the branch changed them,\n * so it can be newer than what extraction saw\n * 3. `extractedConstraints`, as collected while extracting the base branch\n *\n * Managers that have no way to derive the constraint at artifact time can omit\n * `derive`. An empty string counts as \"not set\" at every step, so it never\n * shadows a value further down the list.\n *\n * This is the only place that reads `constraints` and `extractedConstraints`\n * from the config; the `renovate/prefer-resolve-tool-constraint` lint rule\n * keeps managers from reading them directly.\n */\nexport async function resolveToolConstraint(\n config: ToolConstraintsConfig,\n toolName: ConstraintName,\n derive?: () => MaybePromise<string | null | undefined>,\n): Promise<string | undefined> {\n const configured = config.constraints?.[toolName];\n if (isNonEmptyString(configured)) {\n return configured;\n }\n const derived = await derive?.();\n if (isNonEmptyString(derived)) {\n return derived;\n }\n const extracted = config.extractedConstraints?.[toolName];\n return isNonEmptyString(extracted) ? extracted : undefined;\n}\n\n/**\n * The result which reports `path` as created or updated.\n */\nexport function fileAddition(\n path: string,\n contents: string | Buffer | null,\n): UpdateArtifactsResult {\n return { file: { type: 'addition', path, contents } };\n}\n\n/**\n * The result which reports a failed artifact update to the user.\n */\nexport function artifactError(\n fileName: string | undefined,\n stderr: string,\n): UpdateArtifactsResult {\n return { artifactError: { fileName, stderr } };\n}\n\n/**\n * The result for an artifact update which threw, using the most informative\n * output the error carries. Callers are expected to have rethrown\n * `TEMPORARY_ERROR` and logged the error before calling this.\n */\nexport function artifactErrorResult(\n fileName: string | undefined,\n err: Error & Partial<ExecError>,\n): UpdateArtifactsResult[] {\n return [\n artifactError(\n fileName,\n artifactErrorMessageFromExecError(err, err.message),\n ),\n ];\n}\n\n/**\n * The skeleton shared by the managers which regenerate a single lock file:\n * rewrite the package file, optionally drop the lock file, run the package\n * manager and return the lock file when its content changed.\n *\n * Errors from `run()` are not handled here - callers keep their own logging and\n * pass the error to {@link artifactErrorResult}.\n */\nexport async function updateLockFile({\n lockFileName,\n existingLockFileContent,\n packageFile,\n deleteLockFile,\n run,\n}: UpdateLockFileConfig): Promise<UpdateArtifactsResult[] | null> {\n if (packageFile) {\n await writeLocalFile(packageFile.path, packageFile.contents);\n }\n\n if (deleteLockFile) {\n await deleteLocalFile(lockFileName);\n }\n\n await run();\n\n // A Buffer as the existing content means the lock file may be binary, so the\n // new content is read and compared as bytes as well.\n const newLockFileContent = await readLockFile(\n lockFileName,\n Buffer.isBuffer(existingLockFileContent),\n );\n if (!newLockFileContent) {\n logger.debug(`No ${lockFileName} found`);\n return null;\n }\n\n if (isSameContent(existingLockFileContent, newLockFileContent)) {\n logger.debug(`${lockFileName} is unchanged`);\n return null;\n }\n\n return [fileAddition(lockFileName, newLockFileContent)];\n}\n\nfunction readLockFile(\n lockFileName: string,\n asBuffer: boolean,\n): Promise<string | Buffer | null> {\n return asBuffer\n ? readLocalFile(lockFileName)\n : readLocalFile(lockFileName, 'utf8');\n}\n\nfunction isSameContent(\n before: string | Buffer | null,\n after: string | Buffer,\n): boolean {\n if (Buffer.isBuffer(before) && Buffer.isBuffer(after)) {\n return before.equals(after);\n }\n return before === after;\n}\n"],"mappings":";;;;;;;;;;AAwBA,SAAgB,eACd,KACA,KACA,KACA,KACA,QACM;CACN,IAAI,KAAK;EACP,MAAM,WAAW,eAAe,GAAG;EACnC,IAAI,aAAa,YAAY,aAAa,UAAU;GAClD,IAAI,aACF,aAAa,WACT,qBAAqB,KACrB,qBAAqB;GAC3B,MAAM,EAAE,MAAM,cAAc,YAAY,GAAG;GAG3C,IAAI,eAAe,CAAC,WAAW,MAAM;GACrC,IAAI,cAAc;EACpB,OAAO;GACL,IAAI,aAAa,kBAAkB;GACnC,IAAI,cAAc;EACpB;EACA,IAAI,eAAe;EACnB,IAAI,aAAa,KAAA;CACnB,OAAO,IAAI,KAAK;EACd,IAAI,aAAa,kBAAkB;EACnC,IAAI,cAAc;EAClB,IAAI,gBAAgB;EACpB,IAAI,gBAAgB;EACpB,IAAI,aAAa,KAAA;CACnB,OAAO;EACL,IAAI,aAAa,kBAAkB;EACnC,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,IAAI,aAAa,SAAS,mBAAmB;CAC/C;AACF;;;;;;;AAQA,SAAgB,kCACd,KACA,SACQ;CACR,IAAI,IAAI,QAAQ,KAAK,GACnB,OAAO,IAAI;CAGb,IAAI,IAAI,QAAQ,KAAK,GACnB,OAAO,IAAI;CAGb,OAAO;AACT;;;;;AAMA,SAAgB,6BACd,SACyB;CACzB,OAAO,QAAQ,KAAK,UAAU,EAAE,KAAK,EAAE;AACzC;;;;;;;;;;;;;;;;;;;AAoBA,eAAsB,sBACpB,QACA,UACA,QAC6B;CAC7B,MAAM,aAAa,OAAO,cAAc;CACxC,IAAI,iBAAiB,UAAU,GAC7B,OAAO;CAET,MAAM,UAAU,MAAM,SAAS;CAC/B,IAAI,iBAAiB,OAAO,GAC1B,OAAO;CAET,MAAM,YAAY,OAAO,uBAAuB;CAChD,OAAO,iBAAiB,SAAS,IAAI,YAAY,KAAA;AACnD;;;;AAKA,SAAgB,aACd,MACA,UACuB;CACvB,OAAO,EAAE,MAAM;EAAE,MAAM;EAAY;EAAM;CAAS,EAAE;AACtD;;;;AAKA,SAAgB,cACd,UACA,QACuB;CACvB,OAAO,EAAE,eAAe;EAAE;EAAU;CAAO,EAAE;AAC/C;;;;;;AAOA,SAAgB,oBACd,UACA,KACyB;CACzB,OAAO,CACL,cACE,UACA,kCAAkC,KAAK,IAAI,OAAO,CACpD,CACF;AACF;;;;;;;;;AAUA,eAAsB,eAAe,EACnC,cACA,yBACA,aACA,gBACA,OACgE;CAChE,IAAI,aACF,MAAM,eAAe,YAAY,MAAM,YAAY,QAAQ;CAG7D,IAAI,gBACF,MAAM,gBAAgB,YAAY;CAGpC,MAAM,IAAI;CAIV,MAAM,qBAAqB,MAAM,aAC/B,cACA,OAAO,SAAS,uBAAuB,CACzC;CACA,IAAI,CAAC,oBAAoB;EACvB,OAAO,MAAM,MAAM,aAAa,OAAO;EACvC,OAAO;CACT;CAEA,IAAI,cAAc,yBAAyB,kBAAkB,GAAG;EAC9D,OAAO,MAAM,GAAG,aAAa,cAAc;EAC3C,OAAO;CACT;CAEA,OAAO,CAAC,aAAa,cAAc,kBAAkB,CAAC;AACxD;AAEA,SAAS,aACP,cACA,UACiC;CACjC,OAAO,WACH,cAAc,YAAY,IAC1B,cAAc,cAAc,MAAM;AACxC;AAEA,SAAS,cACP,QACA,OACS;CACT,IAAI,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,KAAK,GAClD,OAAO,OAAO,OAAO,KAAK;CAE5B,OAAO,WAAW;AACpB"}
1
+ {"version":3,"file":"util.js","names":["getVersioning"],"sources":["../../../lib/modules/manager/util.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { logger } from '../../logger/index.ts';\nimport type { MaybePromise } from '../../types/index.ts';\nimport { detectPlatform } from '../../util/common.ts';\nimport { getToolConfig } from '../../util/exec/containerbase.ts';\nimport type { ExecError } from '../../util/exec/exec-error.ts';\nimport { type ConstraintName, isToolName } from '../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n readLocalFile,\n writeLocalFile,\n} from '../../util/fs/index.ts';\nimport type { FileChange } from '../../util/git/types.ts';\nimport { parseGitUrl } from '../../util/git/url.ts';\nimport { GitRefsDatasource } from '../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../datasource/gitlab-tags/index.ts';\nimport { get as getVersioning } from '../versioning/index.ts';\nimport type {\n PackageDependency,\n ToolConstraintsConfig,\n UpdateArtifactsResult,\n UpdateLockFileConfig,\n} from './types.ts';\n\nexport function applyGitSource(\n dep: PackageDependency,\n git: string,\n rev: string | undefined,\n tag: string | undefined,\n branch: string | undefined,\n): void {\n if (tag) {\n const platform = detectPlatform(git);\n if (platform === 'github' || platform === 'gitlab') {\n dep.datasource =\n platform === 'github'\n ? GithubTagsDatasource.id\n : GitlabTagsDatasource.id;\n const { host, full_name } = parseGitUrl(git);\n\n // Always use HTTPS for GitHub/GitLab API endpoints, even if the git URL protocol is SSH.\n dep.registryUrls = [`https://${host}`];\n dep.packageName = full_name;\n } else {\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = git;\n }\n dep.currentValue = tag;\n dep.skipReason = undefined;\n } else if (rev) {\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = git;\n dep.currentDigest = rev;\n dep.replaceString = rev;\n dep.skipReason = undefined;\n } else {\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = git;\n dep.currentValue = branch;\n dep.skipReason = branch ? 'git-dependency' : 'unspecified-version';\n }\n}\n\n/**\n * Given an {@link ExecError}, retrieve the message which will be used for an {@link ArtifactError}.\n *\n * An `ExecError` always carries a `stderr` property, so nullish coalescing would keep an empty string and render an artifact error with no message at all.\n *\n */\nexport function artifactErrorMessageFromExecError(\n err: Partial<ExecError>,\n message: string,\n): string {\n if (err.stderr?.trim()) {\n return err.stderr;\n }\n\n if (err.stdout?.trim()) {\n return err.stdout;\n }\n\n return message;\n}\n\n/**\n * Wraps {@link FileChange}s, e.g. the result of `collectFileChanges()`, into the\n * result shape returned by `updateArtifacts()`.\n */\nexport function fileChangesToArtifactResults(\n changes: FileChange[],\n): UpdateArtifactsResult[] {\n return changes.map((file) => ({ file }));\n}\n\n/**\n * Resolve the constraint for a tool that `updateArtifacts()` has to run.\n *\n * The precedence is:\n *\n * 1. `constraints`, because the user asked for it explicitly\n * 2. `derive`, because it reads the package files as the branch changed them,\n * so it can be newer than what extraction saw\n * 3. `extractedConstraints`, as collected while extracting the base branch\n * 4. `sharedConstraints`, the version which a version manager like `mise`\n * installs for the directory, which also wins over the constraint of step 2\n * or 3 if it is within it, like `20.11.0` within `>=18`\n *\n * Managers that have no way to derive the constraint at artifact time can omit\n * `derive`. An empty string counts as \"not set\" at every step, so it never\n * shadows a value further down the list.\n *\n * This is the only place that reads `constraints`, `extractedConstraints` and\n * `sharedConstraints` from the config; the\n * `renovate/prefer-resolve-tool-constraint` lint rule keeps managers from\n * reading them directly.\n */\nexport async function resolveToolConstraint(\n config: ToolConstraintsConfig,\n toolName: ConstraintName,\n derive?: () => MaybePromise<string | null | undefined>,\n): Promise<string | undefined> {\n const configured = config.constraints?.[toolName];\n if (isNonEmptyString(configured)) {\n return configured;\n }\n const required = [\n await derive?.(),\n config.extractedConstraints?.[toolName],\n ].find(isNonEmptyString);\n const shared = config.sharedConstraints?.[toolName];\n if (!isNonEmptyString(shared)) {\n return required;\n }\n return !required || isWithin(toolName, shared, required) ? shared : required;\n}\n\n/**\n * Whether the tool `constraint` is a version within `range`, or a range which is a subset of it.\n */\nfunction isWithin(\n toolName: ConstraintName,\n constraint: string,\n range: string,\n): boolean {\n if (!isToolName(toolName)) {\n return false;\n }\n const versioning = getVersioning(getToolConfig(toolName)?.versioning);\n if (!versioning.isValid(constraint) || !versioning.isValid(range)) {\n return false;\n }\n return versioning.isSingleVersion(constraint)\n ? versioning.matches(constraint, range)\n : versioning.subset?.(constraint, range) === true;\n}\n\n/**\n * The result which reports `path` as created or updated.\n */\nexport function fileAddition(\n path: string,\n contents: string | Buffer | null,\n): UpdateArtifactsResult {\n return { file: { type: 'addition', path, contents } };\n}\n\n/**\n * The result which reports a failed artifact update to the user.\n */\nexport function artifactError(\n fileName: string | undefined,\n stderr: string,\n): UpdateArtifactsResult {\n return { artifactError: { fileName, stderr } };\n}\n\n/**\n * The result for an artifact update which threw, using the most informative\n * output the error carries. Callers are expected to have rethrown\n * `TEMPORARY_ERROR` and logged the error before calling this.\n */\nexport function artifactErrorResult(\n fileName: string | undefined,\n err: Error & Partial<ExecError>,\n): UpdateArtifactsResult[] {\n return [\n artifactError(\n fileName,\n artifactErrorMessageFromExecError(err, err.message),\n ),\n ];\n}\n\n/**\n * The skeleton shared by the managers which regenerate a single lock file:\n * rewrite the package file, optionally drop the lock file, run the package\n * manager and return the lock file when its content changed.\n *\n * Errors from `run()` are not handled here - callers keep their own logging and\n * pass the error to {@link artifactErrorResult}.\n */\nexport async function updateLockFile({\n lockFileName,\n existingLockFileContent,\n packageFile,\n deleteLockFile,\n run,\n}: UpdateLockFileConfig): Promise<UpdateArtifactsResult[] | null> {\n if (packageFile) {\n await writeLocalFile(packageFile.path, packageFile.contents);\n }\n\n if (deleteLockFile) {\n await deleteLocalFile(lockFileName);\n }\n\n await run();\n\n // A Buffer as the existing content means the lock file may be binary, so the\n // new content is read and compared as bytes as well.\n const newLockFileContent = await readLockFile(\n lockFileName,\n Buffer.isBuffer(existingLockFileContent),\n );\n if (!newLockFileContent) {\n logger.debug(`No ${lockFileName} found`);\n return null;\n }\n\n if (isSameContent(existingLockFileContent, newLockFileContent)) {\n logger.debug(`${lockFileName} is unchanged`);\n return null;\n }\n\n return [fileAddition(lockFileName, newLockFileContent)];\n}\n\nfunction readLockFile(\n lockFileName: string,\n asBuffer: boolean,\n): Promise<string | Buffer | null> {\n return asBuffer\n ? readLocalFile(lockFileName)\n : readLocalFile(lockFileName, 'utf8');\n}\n\nfunction isSameContent(\n before: string | Buffer | null,\n after: string | Buffer,\n): boolean {\n if (Buffer.isBuffer(before) && Buffer.isBuffer(after)) {\n return before.equals(after);\n }\n return before === after;\n}\n"],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import { isToolName } from "../../../util/exec/types.js";
2
+ import { getToolConfig } from "../../../util/exec/containerbase.js";
3
+ import { get } from "../../../modules/versioning/index.js";
4
+ import { isNonEmptyObject } from "@sindresorhus/is";
5
+ // lib/workers/repository/extract/shared-constraints.ts
6
+ function getDepth(directory) {
7
+ return directory === "" ? 0 : directory.split("/").length;
8
+ }
9
+ function isInScope(directory, packageFile) {
10
+ return directory === "" || packageFile.startsWith(`${directory}/`);
11
+ }
12
+ /**
13
+ * The managers whose shared constraints win over those of the other managers, the last one winning, like `mise` over a `rust-toolchain.toml` in any directory, as mise sets `RUSTUP_TOOLCHAIN`, which rustup prefers over a toolchain file.
14
+ */
15
+ const managerOrder = ["mise"];
16
+ function compareBytes(a, b) {
17
+ return Buffer.compare(Buffer.from(a), Buffer.from(b));
18
+ }
19
+ /**
20
+ * Orders the sources by manager, see {@link managerOrder}, else by name, and the sources of a manager by depth, then by precedence, then by path in byte order, the order in which mise loads the `conf.d` files of a directory.
21
+ */
22
+ function compareSources(a, b) {
23
+ return managerOrder.indexOf(a.manager) - managerOrder.indexOf(b.manager) || compareBytes(a.manager, b.manager) || getDepth(a.directory) - getDepth(b.directory) || a.precedence - b.precedence || compareBytes(a.packageFile, b.packageFile);
24
+ }
25
+ /**
26
+ * Collects the constraints which managers like `mise` share, in the order in which they apply, the last one winning.
27
+ */
28
+ function collectSharedConstraints(packageFiles) {
29
+ const sources = [];
30
+ for (const [manager, files] of Object.entries(packageFiles)) for (const { packageFile, sharedConstraintsScope: scope } of files) if (scope && isNonEmptyObject(scope.constraints)) sources.push({
31
+ ...scope,
32
+ manager,
33
+ packageFile
34
+ });
35
+ return sources.sort(compareSources);
36
+ }
37
+ /**
38
+ * Whether `value` is the current value or version of `upgrade`.
39
+ */
40
+ function isCurrentValue(value, upgrade) {
41
+ return value === upgrade.currentValue || value === upgrade.currentVersion || value === upgrade.lockedVersion;
42
+ }
43
+ /**
44
+ * Returns `constraint` with the new version of `upgrade`, or with `null` if the versioning of the tool reads that as no version, or `undefined` if `upgrade` does not update it.
45
+ */
46
+ function getUpdatedConstraint(toolName, constraint, upgrade) {
47
+ if (constraint.depName !== upgrade.depName || !upgrade.newVersion || !isCurrentValue(constraint.value, upgrade)) return;
48
+ const versioning = get(getToolConfig(toolName)?.versioning);
49
+ return {
50
+ ...constraint,
51
+ value: versioning.isVersion(upgrade.newVersion) ? upgrade.newVersion : null
52
+ };
53
+ }
54
+ function updateSharedConstraint(shared, upgrades) {
55
+ const updates = upgrades.filter((upgrade) => upgrade.manager === shared.manager && upgrade.packageFile === shared.packageFile && upgrade.updateType !== "replacement");
56
+ if (!updates.length) return shared;
57
+ const constraints = { ...shared.constraints };
58
+ for (const [name, constraint] of Object.entries(shared.constraints)) if (isToolName(name)) {
59
+ let current = constraint;
60
+ for (const upgrade of updates) current = getUpdatedConstraint(name, current, upgrade) ?? current;
61
+ constraints[name] = current;
62
+ }
63
+ return {
64
+ ...shared,
65
+ constraints
66
+ };
67
+ }
68
+ /**
69
+ * Returns the shared constraints with the new values of the dependencies which `upgrades` update, without changing `sharedConstraints`.
70
+ */
71
+ function updateSharedConstraints(sharedConstraints, upgrades) {
72
+ return sharedConstraints.map((shared) => updateSharedConstraint(shared, upgrades));
73
+ }
74
+ /**
75
+ * Returns the shared constraints which apply to a package file of `manager`, the nearest directory winning, leaving out those which `manager` shares itself and those without a value.
76
+ */
77
+ function getSharedConstraints(sharedConstraints, manager, packageFile) {
78
+ const merged = {};
79
+ for (const shared of sharedConstraints) if (shared.manager !== manager && isInScope(shared.directory, packageFile)) Object.assign(merged, shared.constraints);
80
+ const constraints = {};
81
+ for (const [name, { value }] of Object.entries(merged)) if (value !== null && isToolName(name)) constraints[name] = value;
82
+ return constraints;
83
+ }
84
+ export { collectSharedConstraints, getSharedConstraints, updateSharedConstraints };
85
+
86
+ //# sourceMappingURL=shared-constraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-constraints.js","names":["getVersioning"],"sources":["../../../../lib/workers/repository/extract/shared-constraints.ts"],"sourcesContent":["import { isNonEmptyObject } from '@sindresorhus/is';\nimport type {\n PackageFile,\n SharedConstraint,\n SharedConstraints,\n} from '../../../modules/manager/types.ts';\nimport { get as getVersioning } from '../../../modules/versioning/index.ts';\nimport { getToolConfig } from '../../../util/exec/containerbase.ts';\nimport {\n type ConstraintName,\n type ToolName,\n isToolName,\n} from '../../../util/exec/types.ts';\nimport type { BranchUpgradeConfig } from '../../types.ts';\n\nfunction getDepth(directory: string): number {\n return directory === '' ? 0 : directory.split('/').length;\n}\n\nfunction isInScope(directory: string, packageFile: string): boolean {\n return directory === '' || packageFile.startsWith(`${directory}/`);\n}\n\n/**\n * The managers whose shared constraints win over those of the other managers, the last one winning, like `mise` over a `rust-toolchain.toml` in any directory, as mise sets `RUSTUP_TOOLCHAIN`, which rustup prefers over a toolchain file.\n */\nconst managerOrder = ['mise'];\n\nfunction compareBytes(a: string, b: string): number {\n return Buffer.compare(Buffer.from(a), Buffer.from(b));\n}\n\n/**\n * Orders the sources by manager, see {@link managerOrder}, else by name, and the sources of a manager by depth, then by precedence, then by path in byte order, the order in which mise loads the `conf.d` files of a directory.\n */\nfunction compareSources(a: SharedConstraints, b: SharedConstraints): number {\n return (\n managerOrder.indexOf(a.manager) - managerOrder.indexOf(b.manager) ||\n compareBytes(a.manager, b.manager) ||\n getDepth(a.directory) - getDepth(b.directory) ||\n a.precedence - b.precedence ||\n compareBytes(a.packageFile, b.packageFile)\n );\n}\n\n/**\n * Collects the constraints which managers like `mise` share, in the order in which they apply, the last one winning.\n */\nexport function collectSharedConstraints(\n packageFiles: Record<string, PackageFile[]>,\n): SharedConstraints[] {\n const sources: SharedConstraints[] = [];\n for (const [manager, files] of Object.entries(packageFiles)) {\n for (const { packageFile, sharedConstraintsScope: scope } of files) {\n if (scope && isNonEmptyObject(scope.constraints)) {\n sources.push({ ...scope, manager, packageFile });\n }\n }\n }\n return sources.sort(compareSources);\n}\n\n/**\n * Whether `value` is the current value or version of `upgrade`.\n */\nfunction isCurrentValue(\n value: string | null,\n upgrade: BranchUpgradeConfig,\n): boolean {\n return (\n value === upgrade.currentValue ||\n value === upgrade.currentVersion ||\n value === upgrade.lockedVersion\n );\n}\n\n/**\n * Returns `constraint` with the new version of `upgrade`, or with `null` if the versioning of the tool reads that as no version, or `undefined` if `upgrade` does not update it.\n */\nfunction getUpdatedConstraint(\n toolName: ToolName,\n constraint: SharedConstraint,\n upgrade: BranchUpgradeConfig,\n): SharedConstraint | undefined {\n // only replace the value being updated, like for the `constraints` which a branch updates\n if (\n constraint.depName !== upgrade.depName ||\n !upgrade.newVersion ||\n !isCurrentValue(constraint.value, upgrade)\n ) {\n return undefined;\n }\n const versioning = getVersioning(getToolConfig(toolName)?.versioning);\n return {\n ...constraint,\n value: versioning.isVersion(upgrade.newVersion) ? upgrade.newVersion : null,\n };\n}\n\nfunction updateSharedConstraint(\n shared: SharedConstraints,\n upgrades: BranchUpgradeConfig[],\n): SharedConstraints {\n const updates = upgrades.filter(\n (upgrade) =>\n upgrade.manager === shared.manager &&\n upgrade.packageFile === shared.packageFile &&\n upgrade.updateType !== 'replacement',\n );\n if (!updates.length) {\n return shared;\n }\n const constraints = { ...shared.constraints };\n for (const [name, constraint] of Object.entries(shared.constraints)) {\n // the managers only share the constraints of tools\n if (isToolName(name)) {\n let current = constraint;\n for (const upgrade of updates) {\n current = getUpdatedConstraint(name, current, upgrade) ?? current;\n }\n constraints[name] = current;\n }\n }\n return { ...shared, constraints };\n}\n\n/**\n * Returns the shared constraints with the new values of the dependencies which `upgrades` update, without changing `sharedConstraints`.\n */\nexport function updateSharedConstraints(\n sharedConstraints: SharedConstraints[],\n upgrades: BranchUpgradeConfig[],\n): SharedConstraints[] {\n return sharedConstraints.map((shared) =>\n updateSharedConstraint(shared, upgrades),\n );\n}\n\n/**\n * Returns the shared constraints which apply to a package file of `manager`, the nearest directory winning, leaving out those which `manager` shares itself and those without a value.\n */\nexport function getSharedConstraints(\n sharedConstraints: SharedConstraints[],\n manager: string,\n packageFile: string,\n): Partial<Record<ConstraintName, string>> {\n const merged: Partial<Record<ConstraintName, SharedConstraint>> = {};\n for (const shared of sharedConstraints) {\n if (\n shared.manager !== manager &&\n isInScope(shared.directory, packageFile)\n ) {\n Object.assign(merged, shared.constraints);\n }\n }\n const constraints: Partial<Record<ConstraintName, string>> = {};\n for (const [name, { value }] of Object.entries(merged)) {\n if (value !== null && isToolName(name)) {\n constraints[name] = value;\n }\n }\n return constraints;\n}\n"],"mappings":";;;;;AAeA,SAAS,SAAS,WAA2B;CAC3C,OAAO,cAAc,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC;AACrD;AAEA,SAAS,UAAU,WAAmB,aAA8B;CAClE,OAAO,cAAc,MAAM,YAAY,WAAW,GAAG,UAAU,EAAE;AACnE;;;;AAKA,MAAM,eAAe,CAAC,MAAM;AAE5B,SAAS,aAAa,GAAW,GAAmB;CAClD,OAAO,OAAO,QAAQ,OAAO,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC;AACtD;;;;AAKA,SAAS,eAAe,GAAsB,GAA8B;CAC1E,OACE,aAAa,QAAQ,EAAE,OAAO,IAAI,aAAa,QAAQ,EAAE,OAAO,KAChE,aAAa,EAAE,SAAS,EAAE,OAAO,KACjC,SAAS,EAAE,SAAS,IAAI,SAAS,EAAE,SAAS,KAC5C,EAAE,aAAa,EAAE,cACjB,aAAa,EAAE,aAAa,EAAE,WAAW;AAE7C;;;;AAKA,SAAgB,yBACd,cACqB;CACrB,MAAM,UAA+B,CAAC;CACtC,KAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,YAAY,GACxD,KAAK,MAAM,EAAE,aAAa,wBAAwB,WAAW,OAC3D,IAAI,SAAS,iBAAiB,MAAM,WAAW,GAC7C,QAAQ,KAAK;EAAE,GAAG;EAAO;EAAS;CAAY,CAAC;CAIrD,OAAO,QAAQ,KAAK,cAAc;AACpC;;;;AAKA,SAAS,eACP,OACA,SACS;CACT,OACE,UAAU,QAAQ,gBAClB,UAAU,QAAQ,kBAClB,UAAU,QAAQ;AAEtB;;;;AAKA,SAAS,qBACP,UACA,YACA,SAC8B;CAE9B,IACE,WAAW,YAAY,QAAQ,WAC/B,CAAC,QAAQ,cACT,CAAC,eAAe,WAAW,OAAO,OAAO,GAEzC;CAEF,MAAM,aAAaA,IAAc,cAAc,QAAQ,CAAC,EAAE,UAAU;CACpE,OAAO;EACL,GAAG;EACH,OAAO,WAAW,UAAU,QAAQ,UAAU,IAAI,QAAQ,aAAa;CACzE;AACF;AAEA,SAAS,uBACP,QACA,UACmB;CACnB,MAAM,UAAU,SAAS,QACtB,YACC,QAAQ,YAAY,OAAO,WAC3B,QAAQ,gBAAgB,OAAO,eAC/B,QAAQ,eAAe,aAC3B;CACA,IAAI,CAAC,QAAQ,QACX,OAAO;CAET,MAAM,cAAc,EAAE,GAAG,OAAO,YAAY;CAC5C,KAAK,MAAM,CAAC,MAAM,eAAe,OAAO,QAAQ,OAAO,WAAW,GAEhE,IAAI,WAAW,IAAI,GAAG;EACpB,IAAI,UAAU;EACd,KAAK,MAAM,WAAW,SACpB,UAAU,qBAAqB,MAAM,SAAS,OAAO,KAAK;EAE5D,YAAY,QAAQ;CACtB;CAEF,OAAO;EAAE,GAAG;EAAQ;CAAY;AAClC;;;;AAKA,SAAgB,wBACd,mBACA,UACqB;CACrB,OAAO,kBAAkB,KAAK,WAC5B,uBAAuB,QAAQ,QAAQ,CACzC;AACF;;;;AAKA,SAAgB,qBACd,mBACA,SACA,aACyC;CACzC,MAAM,SAA4D,CAAC;CACnE,KAAK,MAAM,UAAU,mBACnB,IACE,OAAO,YAAY,WACnB,UAAU,OAAO,WAAW,WAAW,GAEvC,OAAO,OAAO,QAAQ,OAAO,WAAW;CAG5C,MAAM,cAAuD,CAAC;CAC9D,KAAK,MAAM,CAAC,MAAM,EAAE,YAAY,OAAO,QAAQ,MAAM,GACnD,IAAI,UAAU,QAAQ,WAAW,IAAI,GACnC,YAAY,QAAQ;CAGxB,OAAO;AACT"}
@@ -1,4 +1,5 @@
1
1
  import { addMeta, logger, removeMeta } from "../../../logger/index.js";
2
+ import { collectSharedConstraints } from "../extract/shared-constraints.js";
2
3
  import { flattenUpdates } from "./flatten.js";
3
4
  import { generateBranchConfig } from "./generate.js";
4
5
  // lib/workers/repository/updates/branchify.ts
@@ -16,6 +17,7 @@ async function branchifyUpgrades(config, packageFiles) {
16
17
  branchUpgrades[update.branchName] = [update].concat(branchUpgrades[update.branchName]);
17
18
  }
18
19
  logger.debug(`Returning ${Object.keys(branchUpgrades).length} branch(es)`);
20
+ const sharedConstraints = collectSharedConstraints(packageFiles);
19
21
  for (const branchName of Object.keys(branchUpgrades)) {
20
22
  addMeta({ branch: branchName });
21
23
  const seenUpdates = {};
@@ -37,7 +39,7 @@ async function branchifyUpgrades(config, packageFiles) {
37
39
  seenUpdates[upgradeKey] = newValue;
38
40
  return true;
39
41
  }).reverse();
40
- const branch = generateBranchConfig(branchUpgrades[branchName]);
42
+ const branch = generateBranchConfig(branchUpgrades[branchName], sharedConstraints);
41
43
  branch.branchName = branchName;
42
44
  branch.packageFiles = packageFiles;
43
45
  branches.push(branch);
@@ -1 +1 @@
1
- {"version":3,"file":"branchify.js","names":[],"sources":["../../../../lib/workers/repository/updates/branchify.ts"],"sourcesContent":["// TODO #22198\nimport type { Merge } from 'type-fest';\nimport type {\n RenovateConfig,\n ValidationMessage,\n} from '../../../config/types.ts';\nimport { addMeta, logger, removeMeta } from '../../../logger/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types.ts';\nimport { flattenUpdates } from './flatten.ts';\nimport { generateBranchConfig } from './generate.ts';\n\nexport type BranchifiedConfig = Merge<\n RenovateConfig,\n {\n branches: BranchConfig[];\n branchList: string[];\n }\n>;\nexport async function branchifyUpgrades(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<BranchifiedConfig> {\n logger.debug('branchifyUpgrades');\n const updates = await flattenUpdates(config, packageFiles);\n logger.debug(\n `${updates.length} flattened updates found: ${updates\n .map((u) => u.depName)\n .filter((txt) => txt?.trim().length)\n .join(', ')}`,\n );\n const errors: ValidationMessage[] = [];\n const warnings: ValidationMessage[] = [];\n const branchUpgrades: Record<string, BranchUpgradeConfig[]> = {};\n const branches: BranchConfig[] = [];\n for (const u of updates) {\n const update: BranchUpgradeConfig = { ...u };\n branchUpgrades[update.branchName] = branchUpgrades[update.branchName] || [];\n branchUpgrades[update.branchName] = [update].concat(\n branchUpgrades[update.branchName],\n );\n }\n logger.debug(`Returning ${Object.keys(branchUpgrades).length} branch(es)`);\n for (const branchName of Object.keys(branchUpgrades)) {\n // Add branch name to metadata before generating branch config\n addMeta({\n branch: branchName,\n });\n const seenUpdates: Record<string, string> = {};\n // Filter out duplicates\n branchUpgrades[branchName] = branchUpgrades[branchName]\n .reverse()\n .filter((upgrade) => {\n const { manager, packageFile, depName, currentValue, newValue } =\n upgrade;\n // TODO: types (#22198)\n const upgradeKey = `${packageFile!}:${depName!}:${currentValue!}`;\n const previousNewValue = seenUpdates[upgradeKey];\n if (previousNewValue && previousNewValue !== newValue) {\n logger.info(\n {\n manager,\n packageFile,\n depName,\n currentValue,\n previousNewValue,\n thisNewValue: newValue,\n },\n 'Ignoring upgrade collision',\n );\n return false;\n }\n seenUpdates[upgradeKey] = newValue!;\n return true;\n })\n .reverse();\n\n const branch = generateBranchConfig(branchUpgrades[branchName]);\n branch.branchName = branchName;\n branch.packageFiles = packageFiles;\n branches.push(branch);\n }\n removeMeta(['branch']);\n // TODO: types (#22198)\n logger.debug(`config.repoIsOnboarded=${config.repoIsOnboarded!}`);\n const branchList = config.repoIsOnboarded\n ? branches.map((upgrade) => upgrade.branchName)\n : config.branchList;\n // istanbul ignore next\n try {\n // Here we check if there are updates from the same source repo\n // that are not grouped into the same branch\n const branchUpdates: Record<string, Record<string, string>> = {};\n for (const branch of branches) {\n const { sourceUrl, branchName, depName, newVersion } = branch;\n if (sourceUrl && newVersion) {\n const key = `${sourceUrl}|${newVersion}`;\n branchUpdates[key] = branchUpdates[key] || {};\n if (!branchUpdates[key][branchName]) {\n branchUpdates[key][branchName] = depName!;\n }\n }\n }\n for (const [key, value] of Object.entries(branchUpdates)) {\n if (Object.keys(value).length > 1) {\n const [sourceUrl, newVersion] = key.split('|');\n logger.debug(\n { sourceUrl, newVersion, branches: value },\n 'Found sourceUrl with multiple branches that should probably be combined into a group',\n );\n }\n }\n } catch (err) {\n logger.debug({ err }, 'Error checking branch duplicates');\n }\n return {\n errors: config.errors!.concat(errors),\n warnings: config.warnings!.concat(warnings),\n branches,\n branchList: branchList!,\n };\n}\n"],"mappings":";;;;AAmBA,eAAsB,kBACpB,QACA,cAC4B;CAC5B,OAAO,MAAM,mBAAmB;CAChC,MAAM,UAAU,MAAM,eAAe,QAAQ,YAAY;CACzD,OAAO,MACL,GAAG,QAAQ,OAAO,4BAA4B,QAC3C,KAAK,MAAM,EAAE,OAAO,CAAC,CACrB,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC,CACnC,KAAK,IAAI,GACd;CACA,MAAM,SAA8B,CAAC;CACrC,MAAM,WAAgC,CAAC;CACvC,MAAM,iBAAwD,CAAC;CAC/D,MAAM,WAA2B,CAAC;CAClC,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,SAA8B,EAAE,GAAG,EAAE;EAC3C,eAAe,OAAO,cAAc,eAAe,OAAO,eAAe,CAAC;EAC1E,eAAe,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,OAC3C,eAAe,OAAO,WACxB;CACF;CACA,OAAO,MAAM,aAAa,OAAO,KAAK,cAAc,CAAC,CAAC,OAAO,YAAY;CACzE,KAAK,MAAM,cAAc,OAAO,KAAK,cAAc,GAAG;EAEpD,QAAQ,EACN,QAAQ,WACV,CAAC;EACD,MAAM,cAAsC,CAAC;EAE7C,eAAe,cAAc,eAAe,WAAW,CACpD,QAAQ,CAAC,CACT,QAAQ,YAAY;GACnB,MAAM,EAAE,SAAS,aAAa,SAAS,cAAc,aACnD;GAEF,MAAM,aAAa,GAAG,YAAa,GAAG,QAAS,GAAG;GAClD,MAAM,mBAAmB,YAAY;GACrC,IAAI,oBAAoB,qBAAqB,UAAU;IACrD,OAAO,KACL;KACE;KACA;KACA;KACA;KACA;KACA,cAAc;IAChB,GACA,4BACF;IACA,OAAO;GACT;GACA,YAAY,cAAc;GAC1B,OAAO;EACT,CAAC,CAAC,CACD,QAAQ;EAEX,MAAM,SAAS,qBAAqB,eAAe,WAAW;EAC9D,OAAO,aAAa;EACpB,OAAO,eAAe;EACtB,SAAS,KAAK,MAAM;CACtB;CACA,WAAW,CAAC,QAAQ,CAAC;CAErB,OAAO,MAAM,0BAA0B,OAAO,iBAAkB;CAChE,MAAM,aAAa,OAAO,kBACtB,SAAS,KAAK,YAAY,QAAQ,UAAU,IAC5C,OAAO;;CAEX,IAAI;EAGF,MAAM,gBAAwD,CAAC;EAC/D,KAAK,MAAM,UAAU,UAAU;GAC7B,MAAM,EAAE,WAAW,YAAY,SAAS,eAAe;GACvD,IAAI,aAAa,YAAY;IAC3B,MAAM,MAAM,GAAG,UAAU,GAAG;IAC5B,cAAc,OAAO,cAAc,QAAQ,CAAC;IAC5C,IAAI,CAAC,cAAc,IAAI,CAAC,aACtB,cAAc,IAAI,CAAC,cAAc;GAErC;EACF;EACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,GACrD,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG;GACjC,MAAM,CAAC,WAAW,cAAc,IAAI,MAAM,GAAG;GAC7C,OAAO,MACL;IAAE;IAAW;IAAY,UAAU;GAAM,GACzC,sFACF;EACF;CAEJ,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,kCAAkC;CAC1D;CACA,OAAO;EACL,QAAQ,OAAO,OAAQ,OAAO,MAAM;EACpC,UAAU,OAAO,SAAU,OAAO,QAAQ;EAC1C;EACY;CACd;AACF"}
1
+ {"version":3,"file":"branchify.js","names":[],"sources":["../../../../lib/workers/repository/updates/branchify.ts"],"sourcesContent":["// TODO #22198\nimport type { Merge } from 'type-fest';\nimport type {\n RenovateConfig,\n ValidationMessage,\n} from '../../../config/types.ts';\nimport { addMeta, logger, removeMeta } from '../../../logger/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types.ts';\nimport { collectSharedConstraints } from '../extract/shared-constraints.ts';\nimport { flattenUpdates } from './flatten.ts';\nimport { generateBranchConfig } from './generate.ts';\n\nexport type BranchifiedConfig = Merge<\n RenovateConfig,\n {\n branches: BranchConfig[];\n branchList: string[];\n }\n>;\nexport async function branchifyUpgrades(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<BranchifiedConfig> {\n logger.debug('branchifyUpgrades');\n const updates = await flattenUpdates(config, packageFiles);\n logger.debug(\n `${updates.length} flattened updates found: ${updates\n .map((u) => u.depName)\n .filter((txt) => txt?.trim().length)\n .join(', ')}`,\n );\n const errors: ValidationMessage[] = [];\n const warnings: ValidationMessage[] = [];\n const branchUpgrades: Record<string, BranchUpgradeConfig[]> = {};\n const branches: BranchConfig[] = [];\n for (const u of updates) {\n const update: BranchUpgradeConfig = { ...u };\n branchUpgrades[update.branchName] = branchUpgrades[update.branchName] || [];\n branchUpgrades[update.branchName] = [update].concat(\n branchUpgrades[update.branchName],\n );\n }\n logger.debug(`Returning ${Object.keys(branchUpgrades).length} branch(es)`);\n const sharedConstraints = collectSharedConstraints(packageFiles);\n for (const branchName of Object.keys(branchUpgrades)) {\n // Add branch name to metadata before generating branch config\n addMeta({\n branch: branchName,\n });\n const seenUpdates: Record<string, string> = {};\n // Filter out duplicates\n branchUpgrades[branchName] = branchUpgrades[branchName]\n .reverse()\n .filter((upgrade) => {\n const { manager, packageFile, depName, currentValue, newValue } =\n upgrade;\n // TODO: types (#22198)\n const upgradeKey = `${packageFile!}:${depName!}:${currentValue!}`;\n const previousNewValue = seenUpdates[upgradeKey];\n if (previousNewValue && previousNewValue !== newValue) {\n logger.info(\n {\n manager,\n packageFile,\n depName,\n currentValue,\n previousNewValue,\n thisNewValue: newValue,\n },\n 'Ignoring upgrade collision',\n );\n return false;\n }\n seenUpdates[upgradeKey] = newValue!;\n return true;\n })\n .reverse();\n\n const branch = generateBranchConfig(\n branchUpgrades[branchName],\n sharedConstraints,\n );\n branch.branchName = branchName;\n branch.packageFiles = packageFiles;\n branches.push(branch);\n }\n removeMeta(['branch']);\n // TODO: types (#22198)\n logger.debug(`config.repoIsOnboarded=${config.repoIsOnboarded!}`);\n const branchList = config.repoIsOnboarded\n ? branches.map((upgrade) => upgrade.branchName)\n : config.branchList;\n // istanbul ignore next\n try {\n // Here we check if there are updates from the same source repo\n // that are not grouped into the same branch\n const branchUpdates: Record<string, Record<string, string>> = {};\n for (const branch of branches) {\n const { sourceUrl, branchName, depName, newVersion } = branch;\n if (sourceUrl && newVersion) {\n const key = `${sourceUrl}|${newVersion}`;\n branchUpdates[key] = branchUpdates[key] || {};\n if (!branchUpdates[key][branchName]) {\n branchUpdates[key][branchName] = depName!;\n }\n }\n }\n for (const [key, value] of Object.entries(branchUpdates)) {\n if (Object.keys(value).length > 1) {\n const [sourceUrl, newVersion] = key.split('|');\n logger.debug(\n { sourceUrl, newVersion, branches: value },\n 'Found sourceUrl with multiple branches that should probably be combined into a group',\n );\n }\n }\n } catch (err) {\n logger.debug({ err }, 'Error checking branch duplicates');\n }\n return {\n errors: config.errors!.concat(errors),\n warnings: config.warnings!.concat(warnings),\n branches,\n branchList: branchList!,\n };\n}\n"],"mappings":";;;;;AAoBA,eAAsB,kBACpB,QACA,cAC4B;CAC5B,OAAO,MAAM,mBAAmB;CAChC,MAAM,UAAU,MAAM,eAAe,QAAQ,YAAY;CACzD,OAAO,MACL,GAAG,QAAQ,OAAO,4BAA4B,QAC3C,KAAK,MAAM,EAAE,OAAO,CAAC,CACrB,QAAQ,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC,CACnC,KAAK,IAAI,GACd;CACA,MAAM,SAA8B,CAAC;CACrC,MAAM,WAAgC,CAAC;CACvC,MAAM,iBAAwD,CAAC;CAC/D,MAAM,WAA2B,CAAC;CAClC,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,SAA8B,EAAE,GAAG,EAAE;EAC3C,eAAe,OAAO,cAAc,eAAe,OAAO,eAAe,CAAC;EAC1E,eAAe,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,OAC3C,eAAe,OAAO,WACxB;CACF;CACA,OAAO,MAAM,aAAa,OAAO,KAAK,cAAc,CAAC,CAAC,OAAO,YAAY;CACzE,MAAM,oBAAoB,yBAAyB,YAAY;CAC/D,KAAK,MAAM,cAAc,OAAO,KAAK,cAAc,GAAG;EAEpD,QAAQ,EACN,QAAQ,WACV,CAAC;EACD,MAAM,cAAsC,CAAC;EAE7C,eAAe,cAAc,eAAe,WAAW,CACpD,QAAQ,CAAC,CACT,QAAQ,YAAY;GACnB,MAAM,EAAE,SAAS,aAAa,SAAS,cAAc,aACnD;GAEF,MAAM,aAAa,GAAG,YAAa,GAAG,QAAS,GAAG;GAClD,MAAM,mBAAmB,YAAY;GACrC,IAAI,oBAAoB,qBAAqB,UAAU;IACrD,OAAO,KACL;KACE;KACA;KACA;KACA;KACA;KACA,cAAc;IAChB,GACA,4BACF;IACA,OAAO;GACT;GACA,YAAY,cAAc;GAC1B,OAAO;EACT,CAAC,CAAC,CACD,QAAQ;EAEX,MAAM,SAAS,qBACb,eAAe,aACf,iBACF;EACA,OAAO,aAAa;EACpB,OAAO,eAAe;EACtB,SAAS,KAAK,MAAM;CACtB;CACA,WAAW,CAAC,QAAQ,CAAC;CAErB,OAAO,MAAM,0BAA0B,OAAO,iBAAkB;CAChE,MAAM,aAAa,OAAO,kBACtB,SAAS,KAAK,YAAY,QAAQ,UAAU,IAC5C,OAAO;;CAEX,IAAI;EAGF,MAAM,gBAAwD,CAAC;EAC/D,KAAK,MAAM,UAAU,UAAU;GAC7B,MAAM,EAAE,WAAW,YAAY,SAAS,eAAe;GACvD,IAAI,aAAa,YAAY;IAC3B,MAAM,MAAM,GAAG,UAAU,GAAG;IAC5B,cAAc,OAAO,cAAc,QAAQ,CAAC;IAC5C,IAAI,CAAC,cAAc,IAAI,CAAC,aACtB,cAAc,IAAI,CAAC,cAAc;GAErC;EACF;EACA,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,aAAa,GACrD,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG;GACjC,MAAM,CAAC,WAAW,cAAc,IAAI,MAAM,GAAG;GAC7C,OAAO,MACL;IAAE;IAAW;IAAY,UAAU;GAAM,GACzC,sFACF;EACF;CAEJ,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,kCAAkC;CAC1D;CACA,OAAO;EACL,QAAQ,OAAO,OAAQ,OAAO,MAAM;EACpC,UAAU,OAAO,SAAU,OAAO,QAAQ;EAC1C;EACY;CACd;AACF"}
@@ -11,6 +11,7 @@ import { compile } from "../../../util/template/index.js";
11
11
  import { uniq } from "../../../util/uniq.js";
12
12
  import "../../../config/index.js";
13
13
  import { CommitMessage } from "../model/commit-message.js";
14
+ import { getSharedConstraints, updateSharedConstraints } from "../extract/shared-constraints.js";
14
15
  import { isArray, isNonEmptyString, isString } from "@sindresorhus/is";
15
16
  import { DateTime } from "luxon";
16
17
  import semver from "semver";
@@ -119,7 +120,7 @@ const semanticCommitTypeByPriority = [
119
120
  "fix",
120
121
  "feat"
121
122
  ];
122
- function generateBranchConfig(upgrades) {
123
+ function generateBranchConfig(upgrades, sharedConstraints = []) {
123
124
  let branchUpgrades = upgrades;
124
125
  if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {
125
126
  logger.debug({ branch: branchUpgrades[0].branchName }, "Branch is not pending, removing pending upgrades");
@@ -270,14 +271,24 @@ function generateBranchConfig(upgrades) {
270
271
  ...upgrade.constraints,
271
272
  [depName]: newValue
272
273
  };
274
+ const branchSharedConstraints = updateSharedConstraints(sharedConstraints, config.upgrades);
273
275
  config.constraints = {};
274
276
  config.extractedConstraints = {};
277
+ config.sharedConstraints = {};
275
278
  for (const upgrade of config.upgrades) {
276
279
  if (upgrade.constraints) config.constraints = {
277
280
  ...config.constraints,
278
281
  ...upgrade.constraints
279
282
  };
280
- if (upgrade.extractedConstraints) config.extractedConstraints = {
283
+ const shared = getSharedConstraints(branchSharedConstraints, upgrade.manager, upgrade.packageFile ?? "");
284
+ if (Object.keys(shared).length) {
285
+ upgrade.sharedConstraints = shared;
286
+ config.sharedConstraints = {
287
+ ...config.sharedConstraints,
288
+ ...shared
289
+ };
290
+ }
291
+ config.extractedConstraints = {
281
292
  ...config.extractedConstraints,
282
293
  ...upgrade.extractedConstraints
283
294
  };
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","names":["template.compile","template\n .compile"],"sources":["../../../../lib/workers/repository/updates/generate.ts"],"sourcesContent":["import { isArray, isNonEmptyString, isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { markdownTable } from 'markdown-table';\nimport semver from 'semver';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { isConstraintName } from '../../../util/exec/types.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { safeStringify } from '../../../util/stringify.ts';\nimport * as template from '../../../util/template/index.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { uniq } from '../../../util/uniq.ts';\nimport { withoutUrlCredentials } from '../../../util/url.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types.ts';\nimport { CommitMessage } from '../model/commit-message.ts';\n\nfunction prettifyVersion(version: string): string {\n if (regEx(/^\\d/).test(version)) {\n return `v${version}`;\n }\n\n return version;\n}\n\nfunction isTypesGroup(branchUpgrades: BranchUpgradeConfig[]): boolean {\n return (\n branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) &&\n new Set(\n branchUpgrades.map(({ depName }) =>\n depName?.replace(regEx(/^@types\\//), ''),\n ),\n ).size === 1\n );\n}\n\nfunction sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {\n function isTypesUpgrade({ depName }: BranchUpgradeConfig): boolean {\n return !!depName?.startsWith('@types/');\n }\n const regularUpgrades = upgrades.filter(\n (upgrade) => !isTypesUpgrade(upgrade),\n );\n const typesUpgrades = upgrades.filter(isTypesUpgrade);\n upgrades.splice(0, upgrades.length);\n upgrades.push(...regularUpgrades, ...typesUpgrades);\n}\n\nfunction getTableValues(upgrade: BranchUpgradeConfig): string[] | null {\n if (!upgrade.commitBodyTable) {\n return null;\n }\n const { datasource, packageName, depName, currentVersion, newVersion } =\n upgrade;\n if (datasource && packageName && currentVersion && newVersion) {\n return [datasource, packageName, currentVersion, newVersion];\n }\n logger.trace(\n {\n datasource,\n packageName,\n depName,\n currentVersion,\n newVersion,\n },\n 'Cannot determine table values',\n );\n return null;\n}\n\nfunction compileCommitMessage(upgrade: BranchUpgradeConfig): string {\n if (upgrade.semanticCommits === 'enabled' && !upgrade.commitMessagePrefix) {\n logger.trace('Upgrade has semantic commits enabled');\n let semanticPrefix = upgrade.semanticCommitType;\n if (upgrade.semanticCommitScope) {\n semanticPrefix += `(${template.compile(\n upgrade.semanticCommitScope,\n upgrade,\n )})`;\n }\n upgrade.commitMessagePrefix = CommitMessage.formatPrefix(semanticPrefix!);\n upgrade.toLowerCase =\n regEx(/[A-Z]/).exec(upgrade.semanticCommitType!) === null &&\n !upgrade.semanticCommitType!.startsWith(':');\n }\n\n // Compile a few times in case there are nested templates\n upgrade.commitMessage = template.compile(\n upgrade.commitMessage ?? '',\n upgrade,\n );\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n upgrade.commitMessage = withoutUrlCredentials(\n template.compile(upgrade.commitMessage, upgrade),\n );\n // istanbul ignore if\n if (upgrade.commitMessage !== sanitize(upgrade.commitMessage)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets exposed in commit message',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n upgrade.commitMessage = upgrade.commitMessage.trim(); // Trim exterior whitespace\n upgrade.commitMessage = upgrade.commitMessage.replace(regEx(/\\s+/g), ' '); // Trim extra whitespace inside string\n upgrade.commitMessage = upgrade.commitMessage.replace(\n regEx(/to vv(?<digit>\\d)/),\n 'to v$<digit>',\n );\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n // We only need to lowercase the first line\n const splitMessage = upgrade.commitMessage.split(newlineRegex);\n splitMessage[0] = splitMessage[0].toLowerCase();\n upgrade.commitMessage = splitMessage.join('\\n');\n }\n\n logger.trace(`commitMessage: ${JSON.stringify(upgrade.commitMessage)}`);\n return upgrade.commitMessage;\n}\n\nfunction compilePrTitle(\n upgrade: BranchUpgradeConfig,\n commitMessage: string,\n): void {\n if (upgrade.prTitle) {\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = withoutUrlCredentials(\n template\n .compile(upgrade.prTitle, upgrade)\n .trim()\n .replace(regEx(/\\s+/g), ' '),\n );\n // istanbul ignore if\n if (upgrade.prTitle !== sanitize(upgrade.prTitle)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets were exposed in PR title',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n upgrade.prTitle = upgrade.prTitle.toLowerCase();\n }\n } else {\n [upgrade.prTitle] = commitMessage.split(newlineRegex);\n }\n if (!upgrade.prTitleStrict) {\n upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';\n if (upgrade.isGroup) {\n const hasVersionInTitle = !!semver.coerce(\n template.compile(upgrade.commitMessageExtra ?? '', upgrade),\n );\n if (!hasVersionInTitle) {\n upgrade.prTitle +=\n upgrade.updateType === 'major' && upgrade.separateMajorMinor\n ? ' (major)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'minor' && upgrade.separateMinorPatch\n ? ' (minor)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'patch' && upgrade.separateMinorPatch\n ? ' (patch)'\n : '';\n }\n }\n }\n // Compile again to allow for nested templates\n upgrade.prTitle = withoutUrlCredentials(\n template.compile(upgrade.prTitle, upgrade),\n );\n logger.trace(`prTitle: ${JSON.stringify(upgrade.prTitle)}`);\n}\n\nfunction getMinimumGroupSize(upgrades: BranchUpgradeConfig[]): number {\n let minimumGroupSize = 1;\n const groupSizes = new Set<number>();\n\n for (const upg of upgrades) {\n if (upg.minimumGroupSize) {\n groupSizes.add(upg.minimumGroupSize);\n if (minimumGroupSize < upg.minimumGroupSize) {\n minimumGroupSize = upg.minimumGroupSize;\n }\n }\n }\n\n if (groupSizes.size > 1) {\n logger.debug(\n 'Multiple minimumGroupSize values found for this branch, using highest.',\n );\n }\n\n return minimumGroupSize;\n}\n\n// Sorted by priority, from low to high\nconst semanticCommitTypeByPriority = ['chore', 'ci', 'build', 'fix', 'feat'];\n\nexport function generateBranchConfig(\n upgrades: BranchUpgradeConfig[],\n): BranchConfig {\n let branchUpgrades = upgrades;\n if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {\n // If the branch isn't pending, then remove any upgrades within which *are*\n logger.debug(\n { branch: branchUpgrades[0].branchName },\n 'Branch is not pending, removing pending upgrades',\n );\n branchUpgrades = branchUpgrades.filter((upgrade) => !upgrade.pendingChecks);\n }\n logger.trace({ config: branchUpgrades }, 'generateBranchConfig');\n let config: BranchConfig = {\n upgrades: [],\n } as any;\n const hasGroupName = branchUpgrades[0].groupName !== null;\n logger.trace(`hasGroupName: ${hasGroupName}`);\n // Use group settings only if multiple upgrades or lazy grouping is disabled\n const depNames: string[] = [];\n const newValue: string[] = [];\n const toVersions: string[] = [];\n const toValues = new Set<string>();\n const depTypes = new Set<string>();\n for (const upg of branchUpgrades) {\n upg.recreateClosed = upg.recreateWhen === 'always';\n\n if (upg.currentDigest) {\n upg.currentDigestShort =\n upg.currentDigestShort ??\n upg.currentDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.newDigest) {\n upg.newDigestShort =\n upg.newDigestShort ??\n upg.newDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.isDigest || upg.isPinDigest) {\n upg.displayFrom = upg.currentDigestShort;\n upg.displayTo = upg.newDigestShort;\n } else if (upg.isLockfileUpdate) {\n upg.displayFrom = upg.currentVersion;\n upg.displayTo = upg.newVersion;\n } else if (!upg.isLockFileMaintenance) {\n upg.displayFrom = upg.currentValue;\n upg.displayTo = upg.newValue;\n }\n\n if (upg.isLockFileMaintenance) {\n upg.recreateClosed = upg.recreateWhen !== 'never';\n }\n upg.displayFrom ??= '';\n upg.displayTo ??= '';\n if (!depNames.includes(upg.depName!)) {\n depNames.push(upg.depName!);\n }\n if (!toVersions.includes(upg.newVersion!)) {\n toVersions.push(upg.newVersion!);\n }\n toValues.add(upg.newValue!);\n if (upg.depType) {\n depTypes.add(upg.depType);\n }\n // prettify newVersion and newMajor for printing\n if (upg.newVersion) {\n upg.prettyNewVersion = prettifyVersion(upg.newVersion);\n }\n if (upg.newMajor) {\n upg.prettyNewMajor = `v${upg.newMajor}`;\n }\n if (upg.commitMessageExtra) {\n const extra = template.compile(upg.commitMessageExtra, upg);\n if (!newValue.includes(extra)) {\n newValue.push(extra);\n }\n }\n }\n const hasMultipleValuesWithoutVersion = !toVersions[0] && newValue.length > 1;\n const groupEligible =\n depNames.length > 1 ||\n toVersions.length > 1 ||\n hasMultipleValuesWithoutVersion;\n\n const typesGroup =\n depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades);\n logger.trace(`groupEligible: ${groupEligible}`);\n const singleUpdateGroup =\n hasGroupName && !groupEligible && !branchUpgrades[0].sharedVariableName;\n logger.trace(`singleUpdateGroup: ${singleUpdateGroup}`);\n const groupSingleUpdate =\n singleUpdateGroup && branchUpgrades[0].groupSingleUpdates === true;\n const isGroupUsable = groupEligible || groupSingleUpdate;\n const useGroupSettings = hasGroupName && isGroupUsable;\n logger.trace(`useGroupSettings: ${useGroupSettings}`);\n let releaseTimestamp: Timestamp;\n\n if (depTypes.size) {\n config.depTypes = Array.from(depTypes).sort();\n }\n\n for (const branchUpgrade of branchUpgrades) {\n let upgrade: BranchUpgradeConfig = { ...branchUpgrade };\n\n upgrade.depTypes = config.depTypes;\n\n // needs to be done for each upgrade, as we reorder them below\n if (newValue.length > 1 && !groupEligible) {\n upgrade.commitMessageExtra = `to v${toVersions[0]}`;\n }\n\n const pendingVersionsLength = upgrade.pendingVersions?.length;\n if (pendingVersionsLength) {\n upgrade.displayPending = `\\`${upgrade.pendingVersions!.at(-1)!}\\``;\n if (pendingVersionsLength > 1) {\n upgrade.displayPending += ` (+${pendingVersionsLength - 1})`;\n }\n } else {\n upgrade.displayPending = '';\n }\n upgrade.prettyDepType =\n upgrade.prettyDepType ?? upgrade.depType ?? 'dependency';\n if (useGroupSettings) {\n // Now overwrite original config with group config\n upgrade = mergeChildConfig(upgrade, upgrade.group);\n upgrade.isGroup = true;\n if (singleUpdateGroup) {\n // Single update using group name instead of dependency name,\n // so remove version from commit message.\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n }\n } else {\n delete upgrade.groupName;\n }\n // Delete group config regardless of whether it was applied\n delete upgrade.group;\n\n const isDigestUpgrade =\n upgrade.isDigest === true || upgrade.isPinDigest === true;\n if (\n toVersions.length > 1 &&\n toValues.size > 1 &&\n newValue.length > 1 &&\n !typesGroup\n ) {\n logger.trace({ toVersions });\n logger.trace({ toValues });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (newValue.length > 1 && isDigestUpgrade) {\n logger.trace({ newValue });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (semver.valid(toVersions[0])) {\n upgrade.isRange = false;\n }\n config.upgrades.push(upgrade);\n if (upgrade.releaseTimestamp) {\n if (releaseTimestamp!) {\n const existingStamp = DateTime.fromISO(releaseTimestamp);\n const upgradeStamp = DateTime.fromISO(upgrade.releaseTimestamp);\n if (upgradeStamp > existingStamp) {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n } else {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n }\n }\n\n if (typesGroup) {\n if (config.upgrades[0].depName?.startsWith('@types/')) {\n logger.debug('Found @types - reversing upgrades to use depName in PR');\n sortTypesGroup(config.upgrades);\n config.upgrades[0].recreateClosed = false;\n config.hasTypes = true;\n }\n } else {\n config.upgrades.sort((a, b) => {\n if (a.fileReplacePosition && b.fileReplacePosition) {\n // This is because we need to replace from the bottom of the file up\n return a.fileReplacePosition > b.fileReplacePosition ? -1 : 1;\n }\n\n // make sure that ordering is consistent :\n // items without position will be first in the list.\n if (a.fileReplacePosition) {\n return 1;\n }\n if (b.fileReplacePosition) {\n return -1;\n }\n\n if (a.depName! < b.depName!) {\n return -1;\n }\n if (a.depName! > b.depName!) {\n return 1;\n }\n return 0;\n });\n }\n // Now assign first upgrade's config as branch config\n config = {\n ...config,\n ...config.upgrades[0],\n releaseTimestamp: releaseTimestamp!,\n }; // TODO: fixme (#9666)\n\n // Enable `semanticCommits` if one of the branches has it enabled\n if (\n config.upgrades.some((upgrade) => upgrade.semanticCommits === 'enabled')\n ) {\n config.semanticCommits = 'enabled';\n // Calculate the highest priority `semanticCommitType`\n let highestIndex = -1;\n for (const upgrade of config.upgrades) {\n if (upgrade.semanticCommits === 'enabled' && upgrade.semanticCommitType) {\n const priorityIndex = semanticCommitTypeByPriority.indexOf(\n upgrade.semanticCommitType,\n );\n\n if (priorityIndex > highestIndex) {\n highestIndex = priorityIndex;\n }\n }\n }\n\n if (highestIndex > -1) {\n config.semanticCommitType = semanticCommitTypeByPriority[highestIndex];\n }\n }\n\n // Use templates to generate strings\n const commitMessage = compileCommitMessage(config);\n compilePrTitle(config, commitMessage);\n\n config.dependencyDashboardApproval = config.upgrades.some(\n (upgrade) => upgrade.dependencyDashboardApproval,\n );\n config.dependencyDashboardPrApproval = config.upgrades.some(\n (upgrade) => upgrade.prCreation === 'approval',\n );\n config.prBodyColumns = [\n ...new Set(\n config.upgrades.reduce(\n (existing: string[], upgrade) =>\n existing.concat(upgrade.prBodyColumns!),\n [],\n ),\n ),\n ].filter(isNonEmptyString);\n // combine excludeCommitPaths for multiple manager experience\n const hasExcludeCommitPaths = config.upgrades.some(\n (u) => u.excludeCommitPaths && u.excludeCommitPaths.length > 0,\n );\n if (hasExcludeCommitPaths) {\n config.excludeCommitPaths = Object.keys(\n config.upgrades.reduce((acc: Record<string, boolean>, upgrade) => {\n if (upgrade.excludeCommitPaths) {\n upgrade.excludeCommitPaths.forEach((p) => {\n acc[p] = true;\n });\n }\n\n return acc;\n }, {}),\n );\n }\n\n config.automerge = config.upgrades.every((upgrade) => upgrade.automerge);\n // combine all labels\n config.labels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => coerceArray(upgrade.labels))\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n config.addLabels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => coerceArray(upgrade.addLabels))\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n\n if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {\n config.updateType = 'major';\n }\n\n config.isBreaking = config.upgrades.some((upgrade) => upgrade.isBreaking);\n\n // explicit set `isLockFileMaintenance` for the branch for groups\n if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n config.isLockFileMaintenance = true;\n // istanbul ignore if: should never happen\n if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {\n logger.warn(\n 'Grouping lockfile maintenance with other update types is not supported',\n );\n }\n }\n\n // a branch which updates a tool constraint should use its new value, i.e. when installing tools for `postUpgradeTasks` or artifact updates\n const constraintUpdates = config.upgrades.flatMap(\n ({ manager, depType, depName, currentValue, newValue }) =>\n manager === 'renovate-config' &&\n depType === 'tool-constraint' &&\n isConstraintName(depName) &&\n newValue\n ? [{ depName, currentValue, newValue }]\n : [],\n );\n for (const upgrade of config.upgrades) {\n for (const { depName, currentValue, newValue } of constraintUpdates) {\n // only replace the constraint being updated, not a different value which may have been configured i.e. via `packageRules`\n if (upgrade.constraints?.[depName] === currentValue) {\n upgrade.constraints = { ...upgrade.constraints, [depName]: newValue };\n }\n }\n }\n\n config.constraints = {};\n config.extractedConstraints = {};\n for (const upgrade of config.upgrades) {\n if (upgrade.constraints) {\n config.constraints = { ...config.constraints, ...upgrade.constraints };\n }\n if (upgrade.extractedConstraints) {\n config.extractedConstraints = {\n ...config.extractedConstraints,\n ...upgrade.extractedConstraints,\n };\n }\n }\n\n config.minimumGroupSize = getMinimumGroupSize(config.upgrades);\n // Set skipInstalls to false if any upgrade in the branch has it false\n config.skipInstalls = config.upgrades.every(\n (upgrade) => upgrade.skipInstalls !== false,\n );\n\n // Artifact updating will only be skipped if every upgrade wants to skip it.\n config.skipArtifactsUpdate = config.upgrades.every(\n (upgrade) => upgrade.skipArtifactsUpdate,\n );\n if (\n !config.skipArtifactsUpdate &&\n config.upgrades.some((upgrade) => upgrade.skipArtifactsUpdate)\n ) {\n logger.debug(\n {\n upgrades: config.upgrades.map((upgrade) => ({\n depName: upgrade.depName,\n skipArtifactsUpdate: upgrade.skipArtifactsUpdate,\n })),\n },\n 'Mixed `skipArtifactsUpdate` values in upgrades. Artifacts will be updated.',\n );\n }\n\n const tableRows = config.upgrades\n .map(getTableValues)\n .filter((x): x is string[] => isArray(x, isString));\n\n if (tableRows.length) {\n const table: string[][] = [];\n table.push(['datasource', 'package', 'from', 'to']);\n\n const seenRows = new Set<string>();\n\n for (const row of tableRows) {\n const key = safeStringify(row);\n if (seenRows.has(key)) {\n continue;\n }\n seenRows.add(key);\n table.push(row);\n }\n config.commitMessage += `\\n\\n${withoutUrlCredentials(markdownTable(table))}\\n`;\n }\n const additionalReviewers = uniq(\n config.upgrades\n .map((upgrade) => upgrade.additionalReviewers)\n .flat()\n .filter(isNonEmptyString),\n );\n if (additionalReviewers.length > 0) {\n config.additionalReviewers = additionalReviewers;\n }\n return config;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","names":["template.compile","template\n .compile"],"sources":["../../../../lib/workers/repository/updates/generate.ts"],"sourcesContent":["import { isArray, isNonEmptyString, isString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { markdownTable } from 'markdown-table';\nimport semver from 'semver';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { CONFIG_SECRETS_EXPOSED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { SharedConstraints } from '../../../modules/manager/types.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { isConstraintName } from '../../../util/exec/types.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { safeStringify } from '../../../util/stringify.ts';\nimport * as template from '../../../util/template/index.ts';\nimport type { Timestamp } from '../../../util/timestamp.ts';\nimport { uniq } from '../../../util/uniq.ts';\nimport { withoutUrlCredentials } from '../../../util/url.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../types.ts';\nimport {\n getSharedConstraints,\n updateSharedConstraints,\n} from '../extract/shared-constraints.ts';\nimport { CommitMessage } from '../model/commit-message.ts';\n\nfunction prettifyVersion(version: string): string {\n if (regEx(/^\\d/).test(version)) {\n return `v${version}`;\n }\n\n return version;\n}\n\nfunction isTypesGroup(branchUpgrades: BranchUpgradeConfig[]): boolean {\n return (\n branchUpgrades.some(({ depName }) => depName?.startsWith('@types/')) &&\n new Set(\n branchUpgrades.map(({ depName }) =>\n depName?.replace(regEx(/^@types\\//), ''),\n ),\n ).size === 1\n );\n}\n\nfunction sortTypesGroup(upgrades: BranchUpgradeConfig[]): void {\n function isTypesUpgrade({ depName }: BranchUpgradeConfig): boolean {\n return !!depName?.startsWith('@types/');\n }\n const regularUpgrades = upgrades.filter(\n (upgrade) => !isTypesUpgrade(upgrade),\n );\n const typesUpgrades = upgrades.filter(isTypesUpgrade);\n upgrades.splice(0, upgrades.length);\n upgrades.push(...regularUpgrades, ...typesUpgrades);\n}\n\nfunction getTableValues(upgrade: BranchUpgradeConfig): string[] | null {\n if (!upgrade.commitBodyTable) {\n return null;\n }\n const { datasource, packageName, depName, currentVersion, newVersion } =\n upgrade;\n if (datasource && packageName && currentVersion && newVersion) {\n return [datasource, packageName, currentVersion, newVersion];\n }\n logger.trace(\n {\n datasource,\n packageName,\n depName,\n currentVersion,\n newVersion,\n },\n 'Cannot determine table values',\n );\n return null;\n}\n\nfunction compileCommitMessage(upgrade: BranchUpgradeConfig): string {\n if (upgrade.semanticCommits === 'enabled' && !upgrade.commitMessagePrefix) {\n logger.trace('Upgrade has semantic commits enabled');\n let semanticPrefix = upgrade.semanticCommitType;\n if (upgrade.semanticCommitScope) {\n semanticPrefix += `(${template.compile(\n upgrade.semanticCommitScope,\n upgrade,\n )})`;\n }\n upgrade.commitMessagePrefix = CommitMessage.formatPrefix(semanticPrefix!);\n upgrade.toLowerCase =\n regEx(/[A-Z]/).exec(upgrade.semanticCommitType!) === null &&\n !upgrade.semanticCommitType!.startsWith(':');\n }\n\n // Compile a few times in case there are nested templates\n upgrade.commitMessage = template.compile(\n upgrade.commitMessage ?? '',\n upgrade,\n );\n upgrade.commitMessage = template.compile(upgrade.commitMessage, upgrade);\n upgrade.commitMessage = withoutUrlCredentials(\n template.compile(upgrade.commitMessage, upgrade),\n );\n // istanbul ignore if\n if (upgrade.commitMessage !== sanitize(upgrade.commitMessage)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets exposed in commit message',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n upgrade.commitMessage = upgrade.commitMessage.trim(); // Trim exterior whitespace\n upgrade.commitMessage = upgrade.commitMessage.replace(regEx(/\\s+/g), ' '); // Trim extra whitespace inside string\n upgrade.commitMessage = upgrade.commitMessage.replace(\n regEx(/to vv(?<digit>\\d)/),\n 'to v$<digit>',\n );\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n // We only need to lowercase the first line\n const splitMessage = upgrade.commitMessage.split(newlineRegex);\n splitMessage[0] = splitMessage[0].toLowerCase();\n upgrade.commitMessage = splitMessage.join('\\n');\n }\n\n logger.trace(`commitMessage: ${JSON.stringify(upgrade.commitMessage)}`);\n return upgrade.commitMessage;\n}\n\nfunction compilePrTitle(\n upgrade: BranchUpgradeConfig,\n commitMessage: string,\n): void {\n if (upgrade.prTitle) {\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = template.compile(upgrade.prTitle, upgrade);\n upgrade.prTitle = withoutUrlCredentials(\n template\n .compile(upgrade.prTitle, upgrade)\n .trim()\n .replace(regEx(/\\s+/g), ' '),\n );\n // istanbul ignore if\n if (upgrade.prTitle !== sanitize(upgrade.prTitle)) {\n logger.debug(\n { branchName: upgrade.branchName },\n 'Secrets were exposed in PR title',\n );\n throw new Error(CONFIG_SECRETS_EXPOSED);\n }\n if (upgrade.toLowerCase && upgrade.commitMessageLowerCase !== 'never') {\n upgrade.prTitle = upgrade.prTitle.toLowerCase();\n }\n } else {\n [upgrade.prTitle] = commitMessage.split(newlineRegex);\n }\n if (!upgrade.prTitleStrict) {\n upgrade.prTitle += upgrade.hasBaseBranches ? ' ({{baseBranch}})' : '';\n if (upgrade.isGroup) {\n const hasVersionInTitle = !!semver.coerce(\n template.compile(upgrade.commitMessageExtra ?? '', upgrade),\n );\n if (!hasVersionInTitle) {\n upgrade.prTitle +=\n upgrade.updateType === 'major' && upgrade.separateMajorMinor\n ? ' (major)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'minor' && upgrade.separateMinorPatch\n ? ' (minor)'\n : '';\n upgrade.prTitle +=\n upgrade.updateType === 'patch' && upgrade.separateMinorPatch\n ? ' (patch)'\n : '';\n }\n }\n }\n // Compile again to allow for nested templates\n upgrade.prTitle = withoutUrlCredentials(\n template.compile(upgrade.prTitle, upgrade),\n );\n logger.trace(`prTitle: ${JSON.stringify(upgrade.prTitle)}`);\n}\n\nfunction getMinimumGroupSize(upgrades: BranchUpgradeConfig[]): number {\n let minimumGroupSize = 1;\n const groupSizes = new Set<number>();\n\n for (const upg of upgrades) {\n if (upg.minimumGroupSize) {\n groupSizes.add(upg.minimumGroupSize);\n if (minimumGroupSize < upg.minimumGroupSize) {\n minimumGroupSize = upg.minimumGroupSize;\n }\n }\n }\n\n if (groupSizes.size > 1) {\n logger.debug(\n 'Multiple minimumGroupSize values found for this branch, using highest.',\n );\n }\n\n return minimumGroupSize;\n}\n\n// Sorted by priority, from low to high\nconst semanticCommitTypeByPriority = ['chore', 'ci', 'build', 'fix', 'feat'];\n\nexport function generateBranchConfig(\n upgrades: BranchUpgradeConfig[],\n sharedConstraints: SharedConstraints[] = [],\n): BranchConfig {\n let branchUpgrades = upgrades;\n if (!branchUpgrades.every((upgrade) => upgrade.pendingChecks)) {\n // If the branch isn't pending, then remove any upgrades within which *are*\n logger.debug(\n { branch: branchUpgrades[0].branchName },\n 'Branch is not pending, removing pending upgrades',\n );\n branchUpgrades = branchUpgrades.filter((upgrade) => !upgrade.pendingChecks);\n }\n logger.trace({ config: branchUpgrades }, 'generateBranchConfig');\n let config: BranchConfig = {\n upgrades: [],\n } as any;\n const hasGroupName = branchUpgrades[0].groupName !== null;\n logger.trace(`hasGroupName: ${hasGroupName}`);\n // Use group settings only if multiple upgrades or lazy grouping is disabled\n const depNames: string[] = [];\n const newValue: string[] = [];\n const toVersions: string[] = [];\n const toValues = new Set<string>();\n const depTypes = new Set<string>();\n for (const upg of branchUpgrades) {\n upg.recreateClosed = upg.recreateWhen === 'always';\n\n if (upg.currentDigest) {\n upg.currentDigestShort =\n upg.currentDigestShort ??\n upg.currentDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.newDigest) {\n upg.newDigestShort =\n upg.newDigestShort ??\n upg.newDigest.replace('sha256:', '').substring(0, 7);\n }\n if (upg.isDigest || upg.isPinDigest) {\n upg.displayFrom = upg.currentDigestShort;\n upg.displayTo = upg.newDigestShort;\n } else if (upg.isLockfileUpdate) {\n upg.displayFrom = upg.currentVersion;\n upg.displayTo = upg.newVersion;\n } else if (!upg.isLockFileMaintenance) {\n upg.displayFrom = upg.currentValue;\n upg.displayTo = upg.newValue;\n }\n\n if (upg.isLockFileMaintenance) {\n upg.recreateClosed = upg.recreateWhen !== 'never';\n }\n upg.displayFrom ??= '';\n upg.displayTo ??= '';\n if (!depNames.includes(upg.depName!)) {\n depNames.push(upg.depName!);\n }\n if (!toVersions.includes(upg.newVersion!)) {\n toVersions.push(upg.newVersion!);\n }\n toValues.add(upg.newValue!);\n if (upg.depType) {\n depTypes.add(upg.depType);\n }\n // prettify newVersion and newMajor for printing\n if (upg.newVersion) {\n upg.prettyNewVersion = prettifyVersion(upg.newVersion);\n }\n if (upg.newMajor) {\n upg.prettyNewMajor = `v${upg.newMajor}`;\n }\n if (upg.commitMessageExtra) {\n const extra = template.compile(upg.commitMessageExtra, upg);\n if (!newValue.includes(extra)) {\n newValue.push(extra);\n }\n }\n }\n const hasMultipleValuesWithoutVersion = !toVersions[0] && newValue.length > 1;\n const groupEligible =\n depNames.length > 1 ||\n toVersions.length > 1 ||\n hasMultipleValuesWithoutVersion;\n\n const typesGroup =\n depNames.length > 1 && !hasGroupName && isTypesGroup(branchUpgrades);\n logger.trace(`groupEligible: ${groupEligible}`);\n const singleUpdateGroup =\n hasGroupName && !groupEligible && !branchUpgrades[0].sharedVariableName;\n logger.trace(`singleUpdateGroup: ${singleUpdateGroup}`);\n const groupSingleUpdate =\n singleUpdateGroup && branchUpgrades[0].groupSingleUpdates === true;\n const isGroupUsable = groupEligible || groupSingleUpdate;\n const useGroupSettings = hasGroupName && isGroupUsable;\n logger.trace(`useGroupSettings: ${useGroupSettings}`);\n let releaseTimestamp: Timestamp;\n\n if (depTypes.size) {\n config.depTypes = Array.from(depTypes).sort();\n }\n\n for (const branchUpgrade of branchUpgrades) {\n let upgrade: BranchUpgradeConfig = { ...branchUpgrade };\n\n upgrade.depTypes = config.depTypes;\n\n // needs to be done for each upgrade, as we reorder them below\n if (newValue.length > 1 && !groupEligible) {\n upgrade.commitMessageExtra = `to v${toVersions[0]}`;\n }\n\n const pendingVersionsLength = upgrade.pendingVersions?.length;\n if (pendingVersionsLength) {\n upgrade.displayPending = `\\`${upgrade.pendingVersions!.at(-1)!}\\``;\n if (pendingVersionsLength > 1) {\n upgrade.displayPending += ` (+${pendingVersionsLength - 1})`;\n }\n } else {\n upgrade.displayPending = '';\n }\n upgrade.prettyDepType =\n upgrade.prettyDepType ?? upgrade.depType ?? 'dependency';\n if (useGroupSettings) {\n // Now overwrite original config with group config\n upgrade = mergeChildConfig(upgrade, upgrade.group);\n upgrade.isGroup = true;\n if (singleUpdateGroup) {\n // Single update using group name instead of dependency name,\n // so remove version from commit message.\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n }\n } else {\n delete upgrade.groupName;\n }\n // Delete group config regardless of whether it was applied\n delete upgrade.group;\n\n const isDigestUpgrade =\n upgrade.isDigest === true || upgrade.isPinDigest === true;\n if (\n toVersions.length > 1 &&\n toValues.size > 1 &&\n newValue.length > 1 &&\n !typesGroup\n ) {\n logger.trace({ toVersions });\n logger.trace({ toValues });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (newValue.length > 1 && isDigestUpgrade) {\n logger.trace({ newValue });\n delete upgrade.commitMessageExtra;\n upgrade.recreateClosed = upgrade.recreateWhen !== 'never';\n } else if (semver.valid(toVersions[0])) {\n upgrade.isRange = false;\n }\n config.upgrades.push(upgrade);\n if (upgrade.releaseTimestamp) {\n if (releaseTimestamp!) {\n const existingStamp = DateTime.fromISO(releaseTimestamp);\n const upgradeStamp = DateTime.fromISO(upgrade.releaseTimestamp);\n if (upgradeStamp > existingStamp) {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n } else {\n releaseTimestamp = upgrade.releaseTimestamp;\n }\n }\n }\n\n if (typesGroup) {\n if (config.upgrades[0].depName?.startsWith('@types/')) {\n logger.debug('Found @types - reversing upgrades to use depName in PR');\n sortTypesGroup(config.upgrades);\n config.upgrades[0].recreateClosed = false;\n config.hasTypes = true;\n }\n } else {\n config.upgrades.sort((a, b) => {\n if (a.fileReplacePosition && b.fileReplacePosition) {\n // This is because we need to replace from the bottom of the file up\n return a.fileReplacePosition > b.fileReplacePosition ? -1 : 1;\n }\n\n // make sure that ordering is consistent :\n // items without position will be first in the list.\n if (a.fileReplacePosition) {\n return 1;\n }\n if (b.fileReplacePosition) {\n return -1;\n }\n\n if (a.depName! < b.depName!) {\n return -1;\n }\n if (a.depName! > b.depName!) {\n return 1;\n }\n return 0;\n });\n }\n // Now assign first upgrade's config as branch config\n config = {\n ...config,\n ...config.upgrades[0],\n releaseTimestamp: releaseTimestamp!,\n }; // TODO: fixme (#9666)\n\n // Enable `semanticCommits` if one of the branches has it enabled\n if (\n config.upgrades.some((upgrade) => upgrade.semanticCommits === 'enabled')\n ) {\n config.semanticCommits = 'enabled';\n // Calculate the highest priority `semanticCommitType`\n let highestIndex = -1;\n for (const upgrade of config.upgrades) {\n if (upgrade.semanticCommits === 'enabled' && upgrade.semanticCommitType) {\n const priorityIndex = semanticCommitTypeByPriority.indexOf(\n upgrade.semanticCommitType,\n );\n\n if (priorityIndex > highestIndex) {\n highestIndex = priorityIndex;\n }\n }\n }\n\n if (highestIndex > -1) {\n config.semanticCommitType = semanticCommitTypeByPriority[highestIndex];\n }\n }\n\n // Use templates to generate strings\n const commitMessage = compileCommitMessage(config);\n compilePrTitle(config, commitMessage);\n\n config.dependencyDashboardApproval = config.upgrades.some(\n (upgrade) => upgrade.dependencyDashboardApproval,\n );\n config.dependencyDashboardPrApproval = config.upgrades.some(\n (upgrade) => upgrade.prCreation === 'approval',\n );\n config.prBodyColumns = [\n ...new Set(\n config.upgrades.reduce(\n (existing: string[], upgrade) =>\n existing.concat(upgrade.prBodyColumns!),\n [],\n ),\n ),\n ].filter(isNonEmptyString);\n // combine excludeCommitPaths for multiple manager experience\n const hasExcludeCommitPaths = config.upgrades.some(\n (u) => u.excludeCommitPaths && u.excludeCommitPaths.length > 0,\n );\n if (hasExcludeCommitPaths) {\n config.excludeCommitPaths = Object.keys(\n config.upgrades.reduce((acc: Record<string, boolean>, upgrade) => {\n if (upgrade.excludeCommitPaths) {\n upgrade.excludeCommitPaths.forEach((p) => {\n acc[p] = true;\n });\n }\n\n return acc;\n }, {}),\n );\n }\n\n config.automerge = config.upgrades.every((upgrade) => upgrade.automerge);\n // combine all labels\n config.labels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => coerceArray(upgrade.labels))\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n config.addLabels = [\n ...new Set(\n config.upgrades\n .map((upgrade) => coerceArray(upgrade.addLabels))\n .reduce((a, b) => a.concat(b), []),\n ),\n ];\n\n if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {\n config.updateType = 'major';\n }\n\n config.isBreaking = config.upgrades.some((upgrade) => upgrade.isBreaking);\n\n // explicit set `isLockFileMaintenance` for the branch for groups\n if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n config.isLockFileMaintenance = true;\n // istanbul ignore if: should never happen\n if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {\n logger.warn(\n 'Grouping lockfile maintenance with other update types is not supported',\n );\n }\n }\n\n // a branch which updates a tool constraint should use its new value, i.e. when installing tools for `postUpgradeTasks` or artifact updates\n const constraintUpdates = config.upgrades.flatMap(\n ({ manager, depType, depName, currentValue, newValue }) =>\n manager === 'renovate-config' &&\n depType === 'tool-constraint' &&\n isConstraintName(depName) &&\n newValue\n ? [{ depName, currentValue, newValue }]\n : [],\n );\n for (const upgrade of config.upgrades) {\n for (const { depName, currentValue, newValue } of constraintUpdates) {\n // only replace the constraint being updated, not a different value which may have been configured i.e. via `packageRules`\n if (upgrade.constraints?.[depName] === currentValue) {\n upgrade.constraints = { ...upgrade.constraints, [depName]: newValue };\n }\n }\n }\n\n // a branch which updates a shared constraint, like the version in a `rust-toolchain.toml` file, uses its new value\n const branchSharedConstraints = updateSharedConstraints(\n sharedConstraints,\n config.upgrades,\n );\n config.constraints = {};\n config.extractedConstraints = {};\n config.sharedConstraints = {};\n for (const upgrade of config.upgrades) {\n if (upgrade.constraints) {\n config.constraints = { ...config.constraints, ...upgrade.constraints };\n }\n // the constraints which other managers share for the directory of the package file, also on the upgrade, which the branch worker reads on its own\n const shared = getSharedConstraints(\n branchSharedConstraints,\n upgrade.manager,\n upgrade.packageFile ?? '',\n );\n if (Object.keys(shared).length) {\n upgrade.sharedConstraints = shared;\n config.sharedConstraints = { ...config.sharedConstraints, ...shared };\n }\n config.extractedConstraints = {\n ...config.extractedConstraints,\n ...upgrade.extractedConstraints,\n };\n }\n\n config.minimumGroupSize = getMinimumGroupSize(config.upgrades);\n // Set skipInstalls to false if any upgrade in the branch has it false\n config.skipInstalls = config.upgrades.every(\n (upgrade) => upgrade.skipInstalls !== false,\n );\n\n // Artifact updating will only be skipped if every upgrade wants to skip it.\n config.skipArtifactsUpdate = config.upgrades.every(\n (upgrade) => upgrade.skipArtifactsUpdate,\n );\n if (\n !config.skipArtifactsUpdate &&\n config.upgrades.some((upgrade) => upgrade.skipArtifactsUpdate)\n ) {\n logger.debug(\n {\n upgrades: config.upgrades.map((upgrade) => ({\n depName: upgrade.depName,\n skipArtifactsUpdate: upgrade.skipArtifactsUpdate,\n })),\n },\n 'Mixed `skipArtifactsUpdate` values in upgrades. Artifacts will be updated.',\n );\n }\n\n const tableRows = config.upgrades\n .map(getTableValues)\n .filter((x): x is string[] => isArray(x, isString));\n\n if (tableRows.length) {\n const table: string[][] = [];\n table.push(['datasource', 'package', 'from', 'to']);\n\n const seenRows = new Set<string>();\n\n for (const row of tableRows) {\n const key = safeStringify(row);\n if (seenRows.has(key)) {\n continue;\n }\n seenRows.add(key);\n table.push(row);\n }\n config.commitMessage += `\\n\\n${withoutUrlCredentials(markdownTable(table))}\\n`;\n }\n const additionalReviewers = uniq(\n config.upgrades\n .map((upgrade) => upgrade.additionalReviewers)\n .flat()\n .filter(isNonEmptyString),\n );\n if (additionalReviewers.length > 0) {\n config.additionalReviewers = additionalReviewers;\n }\n return config;\n}\n"],"mappings":"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"}
@@ -90,6 +90,8 @@ export interface BranchUpgradeConfig extends Merge<RenovateConfig, PackageDepend
90
90
  sourceRepoOrg?: string;
91
91
  sourceRepoName?: string;
92
92
  constraints?: Partial<Record<ConstraintName, string>>;
93
+ /** The constraints which other managers share for the directory of the package file, see `ToolConstraintsConfig` */
94
+ sharedConstraints?: Partial<Record<ConstraintName, string>>;
93
95
  }
94
96
  export type PrBlockedBy = 'BranchAutomerge' | 'NeedsApproval' | 'AwaitingTests' | 'RateLimited' | 'Error';
95
97
  export type BranchResult = 'already-existed' | 'automerged' | 'done' | 'error' | 'needs-approval' | 'needs-pr-approval' | 'not-scheduled' | 'no-work' | 'pending' | 'pr-created' | 'pr-edited' | 'pr-limit-reached' | 'commit-per-run-limit-reached' | 'commit-hourly-limit-reached' | 'branch-limit-reached' | 'rebase' | 'update-not-scheduled' | 'minimum-group-size-not-met';
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.216.6",
4
+ "version": "44.217.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 44.216.6 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 44.217.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "44.216.6",
5
+ "x-renovate-version": "44.217.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {