diff --git a/lib/util/template/index.ts b/lib/util/template/index.ts index 1e3ab8e9c9518288efd39b2fad1eed64040baa42..c7a4b453ed614709650dca72d59323fc61e34a40 100644 --- a/lib/util/template/index.ts +++ b/lib/util/template/index.ts @@ -147,6 +147,7 @@ export const exposedConfigOptions = [ 'semanticCommitType', 'separateMajorMinor', 'separateMinorPatch', + 'sourceDirectory', ]; export const allowedFields = { diff --git a/lib/workers/repository/updates/flatten.spec.ts b/lib/workers/repository/updates/flatten.spec.ts index 402efb5d6833b2e64326af96883a6dca210a81b6..42cd3a7b3b6fe7ef5cdea73af0d7b717572eeec0 100644 --- a/lib/workers/repository/updates/flatten.spec.ts +++ b/lib/workers/repository/updates/flatten.spec.ts @@ -29,6 +29,11 @@ describe('workers/repository/updates/flatten', () => { enabled: false, }, }, + { + matchPackageNames: ['@monorepo/package'], + sourceUrl: 'https://github.com/some/monorepo', + sourceDirectory: "subfolder/{{ lookup (split packageName '/') 1 }}", + }, ]; config.remediations = { 'package-lock.json': [ @@ -65,6 +70,17 @@ describe('workers/repository/updates/flatten', () => { }, ], }, + { + depName: '@monorepo/package', + updates: [ + { + newValue: '2.0.0', + sourceUrl: 'https://github.com/some/monorepo', + sourceDirectory: + "subfolder/{{ lookup (split depName '/') 1 }}", + }, + ], + }, { updateTypes: ['pin'], updates: [{ newValue: '2.0.0' }], @@ -144,7 +160,7 @@ describe('workers/repository/updates/flatten', () => { ], }; const res = await flattenUpdates(config, packageFiles); - expect(res).toHaveLength(14); + expect(res).toHaveLength(15); expect( res.every( (upgrade) => @@ -178,16 +194,29 @@ describe('workers/repository/updates/flatten', () => { res.filter((update) => update.sourceRepoName)[1].sourceRepoName, ).toBe('repo'); expect( - res.filter((update) => update.sourceRepoSlug)[2].sourceRepoSlug, + res.filter((update) => update.depName === '@monorepo/package')[0], + ).toEqual( + expect.objectContaining({ + depName: '@monorepo/package', + sourceRepoOrg: 'some', + sourceRepoName: 'monorepo', + sourceRepo: 'some/monorepo', + sourceRepoSlug: 'some-monorepo', + sourceUrl: 'https://github.com/some/monorepo', + sourceDirectory: 'subfolder/package', + }), + ); + expect( + res.filter((update) => update.sourceRepoSlug)[3].sourceRepoSlug, ).toBe('nodejs-node'); - expect(res.filter((update) => update.sourceRepo)[2].sourceRepo).toBe( + expect(res.filter((update) => update.sourceRepo)[3].sourceRepo).toBe( 'nodejs/node', ); expect( - res.filter((update) => update.sourceRepoOrg)[2].sourceRepoOrg, + res.filter((update) => update.sourceRepoOrg)[3].sourceRepoOrg, ).toBe('nodejs'); expect( - res.filter((update) => update.sourceRepoName)[2].sourceRepoName, + res.filter((update) => update.sourceRepoName)[3].sourceRepoName, ).toBe('node'); expect( res.filter( diff --git a/lib/workers/repository/updates/flatten.ts b/lib/workers/repository/updates/flatten.ts index 1ff393b4abeff8b7eb2313661391bbb0d8298f09..93b1d51c8556c48307fea4232b84b74c356016fd 100644 --- a/lib/workers/repository/updates/flatten.ts +++ b/lib/workers/repository/updates/flatten.ts @@ -9,6 +9,7 @@ import { get } from '../../../modules/manager'; import { detectSemanticCommits } from '../../../util/git/semantic'; import { applyPackageRules } from '../../../util/package-rules'; import { regEx } from '../../../util/regex'; +import * as template from '../../../util/template'; import { parseUrl } from '../../../util/url'; import type { BranchUpgradeConfig } from '../../types'; import { generateBranchName } from './branch-name'; @@ -57,6 +58,12 @@ export function applyUpdateConfig(input: BranchUpgradeConfig): any { ); // remove everything up to the last slash } } + if (updateConfig.sourceDirectory) { + updateConfig.sourceDirectory = template.compile( + updateConfig.sourceDirectory, + updateConfig, + ); + } generateBranchName(updateConfig); return updateConfig; }