From 1fa3f709a957b00f957c680a88d0edfbacc3022a Mon Sep 17 00:00:00 2001 From: Mike Penz Date: Fri, 12 Nov 2021 11:36:29 +0100 Subject: [PATCH] - add ability to provide an `empty` string in case the regex does not match - FIX https://github.com/mikepenz/release-changelog-builder-action/issues/576 --- __tests__/transform.test.ts | 29 +++++++++++++++++++++++++++++ src/configuration.ts | 1 + src/transform.ts | 11 +++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/__tests__/transform.test.ts b/__tests__/transform.test.ts index 5dbb254..c3c977d 100644 --- a/__tests__/transform.test.ts +++ b/__tests__/transform.test.ts @@ -18,6 +18,10 @@ configuration.categories = [ { title: '## ๐Ÿงช Tests', labels: ['[Test]'] + }, + { + title: '## ๐Ÿงช Others', + labels: ['[Other]'] } ] @@ -192,6 +196,31 @@ it('Extract label from title, match multiple', async () => { ) }) +it('Extract label from title, match multiple, custon non matching label', async () => { + configuration.label_extractor = [ + { + pattern: '\\[Feature\\]|\\[Issue\\]', + on_property: 'title', + method: 'match', + on_empty: '[Other]' + } + ] + + const resultChangelog = buildChangelog(mergedPullRequests, { + owner: 'mikepenz', + repo: 'test-repo', + fromTag: '1.0.0', + toTag: '2.0.0', + failOnError: false, + commitMode: false, + configuration + }) + + expect(resultChangelog).toStrictEqual( + `## ๐Ÿš€ Features\n\n- [Feature][AB-1234] - this is a PR 1 title message\n - PR: #1\n- [Issue][Feature][AB-1234321] - this is a PR 3 title message\n - PR: #3\n\n## ๐Ÿ› Fixes\n\n- [Issue][AB-4321] - this is a PR 2 title message\n - PR: #2\n- [Issue][Feature][AB-1234321] - this is a PR 3 title message\n - PR: #3\n\n## ๐Ÿงช Others\n\n- [AB-404] - not found label\n - PR: #4\n\n` + ) +}) + // test set of PRs with lables predefined const pullRequestsWithLabels: PullRequestInfo[] = [] pullRequestsWithLabels.push( diff --git a/src/configuration.ts b/src/configuration.ts index dbe653f..7341b98 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -34,6 +34,7 @@ export interface Transformer extends Regex { export interface Extractor extends Transformer { on_property?: 'title' | 'author' | 'milestone' | 'body' | undefined // retrieve the property to extract the value from method?: 'replace' | 'match' | undefined // the method to use to extract the value, `match` will not use the `target` property + on_empty?: string | undefined // in case the regex results in an empty string, this value is gonna be used instead (only for label_extractor currently) } export interface TagResolver { diff --git a/src/transform.ts b/src/transform.ts index b0408db..15b4275 100644 --- a/src/transform.ts +++ b/src/transform.ts @@ -302,9 +302,11 @@ export function validateTransformer( try { let onProperty = undefined let method = undefined + let onEmpty = undefined if (transformer.hasOwnProperty('on_property')) { onProperty = (transformer as Extractor).on_property method = (transformer as Extractor).method + onEmpty = (transformer as Extractor).on_empty } return { @@ -314,7 +316,8 @@ export function validateTransformer( ), target: transformer.target || '', onProperty, - method + method, + onEmpty } } catch (e) { core.warning(`โš ๏ธ Bad replacer regex: ${transformer.pattern}`) @@ -347,7 +350,7 @@ function extractValues( if (extractor.method === 'match') { const lables = onValue.match(extractor.pattern) - if (lables !== null) { + if (lables !== null && lables.length > 0) { return lables.map(label => label.toLocaleLowerCase('en')) } } else { @@ -356,6 +359,9 @@ function extractValues( return [label.toLocaleLowerCase('en')] } } + if (extractor.onEmpty !== undefined) { + return [extractor.onEmpty.toLocaleLowerCase('en')] + } return null } @@ -364,4 +370,5 @@ export interface RegexTransformer { target: string onProperty?: 'title' | 'author' | 'milestone' | 'body' | undefined method?: 'replace' | 'match' | undefined + onEmpty?: string | undefined }