@@ -34,6 +34,20 @@ const TYPE_TO_PREFIX = {
3434 refactor : "Refactored" ,
3535} ;
3636
37+ /**
38+ * Maps changelog prefixes to verb forms that should be removed from title starts
39+ * to avoid duplicated wording like "Added added ...".
40+ */
41+ const PREFIX_TO_LEADING_VERB_REGEX = {
42+ added : / ^ ( a d d | a d d s | a d d e d | a d d i n g ) \b [ \s : - ] * / i,
43+ changed : / ^ ( c h a n g e | c h a n g e s | c h a n g e d | c h a n g i n g ) \b [ \s : - ] * / i,
44+ deprecated : / ^ ( d e p r e c a t e | d e p r e c a t e s | d e p r e c a t e d | d e p r e c a t i n g ) \b [ \s : - ] * / i,
45+ fixed : / ^ ( f i x | f i x e s | f i x e d | f i x i n g ) \b [ \s : - ] * / i,
46+ refactored : / ^ ( r e f a c t o r | r e f a c t o r s | r e f a c t o r e d | r e f a c t o r i n g ) \b [ \s : - ] * / i,
47+ removed : / ^ ( r e m o v e | r e m o v e s | r e m o v e d | r e m o v i n g ) \b [ \s : - ] * / i,
48+ reverted : / ^ ( r e v e r t | r e v e r t s | r e v e r t e d | r e v e r t i n g ) \b [ \s : - ] * / i,
49+ } ;
50+
3751/**
3852 * Indentation used for PR description lines nested under a changelog list item 2 spaces.
3953 */
@@ -296,7 +310,26 @@ function buildEntry(
296310 prBody ,
297311) {
298312 const prefix = TYPE_TO_PREFIX [ type ] ?? section ;
299- return `- ${ prefix } ${ cleanedTitle } ([#${ prNumber } ](${ prUrl } )) by @${ prAuthor } ${ formatPRDescription ( prBody ) } \n<!-- end -->` ;
313+ const dedupedTitle = removeLeadingDuplicateVerb ( prefix , cleanedTitle ) ;
314+ const titlePart = dedupedTitle ? ` ${ dedupedTitle } ` : ` ${ cleanedTitle . trim ( ) } ` ;
315+ return `- ${ prefix } ${ titlePart } ([#${ prNumber } ](${ prUrl } )) by @${ prAuthor } ${ formatPRDescription ( prBody ) } \n<!-- end -->` ;
316+ }
317+
318+ /**
319+ * Removes duplicated leading verbs based on the resolved changelog prefix.
320+ * Example: prefix "Added" + title "added support for x" => "support for x"
321+ * @param {string } prefix - Resolved changelog entry prefix
322+ * @param {string } title - Cleaned PR title
323+ * @returns {string } - Title without duplicated leading verb
324+ */
325+ function removeLeadingDuplicateVerb ( prefix , title ) {
326+ const trimmedTitle = title . trim ( ) ;
327+ if ( ! trimmedTitle ) return "" ;
328+
329+ const pattern = PREFIX_TO_LEADING_VERB_REGEX [ prefix . toLowerCase ( ) ] ;
330+ if ( ! pattern ) return trimmedTitle ;
331+
332+ return trimmedTitle . replace ( pattern , "" ) . trimStart ( ) ;
300333}
301334
302335/**
0 commit comments