Skip to content

Commit cfb5593

Browse files
committed
fix: extractAndNormalizePrefixes
1 parent 3e5f996 commit cfb5593

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

.github/scripts/release-notes.js

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -52,48 +52,46 @@ function capitalizePrefix(prefix) {
5252
.join("/");
5353
}
5454

55-
// --- Extract and normalize all prefixes in title ---
56-
function extractPrefixes(title) {
57-
const bracketMatch = title.match(/^\s*\[([^\]]+)\]/);
58-
if (bracketMatch) {
59-
const raw = bracketMatch[1]
60-
.split(/[,]+/)
61-
.map((p) => p.trim())
62-
.filter(Boolean);
63-
return raw.map((p) => `[${capitalizePrefix(p)}]`);
55+
// --- Extract and normalize all prefixes in title (merged into one [..] if multiple) ---
56+
function extractAndNormalizePrefixes(title) {
57+
// 1️⃣ Находим все подряд идущие [Префикс]
58+
const matches = [...title.matchAll(/\[([^\]]+)\]/g)];
59+
if (matches.length) {
60+
const combined = matches
61+
.map(m => m[1].split(',').map(p => p.trim()).filter(Boolean).map(capitalizePrefix))
62+
.flat();
63+
return {
64+
prefix: `[${combined.join(', ')}]`,
65+
cleanTitle: title.replace(/^(\s*\[[^\]]+\]\s*)+/, '').trim(),
66+
};
6467
}
6568

66-
const match = title.match(
69+
// 2️⃣ Если префикс в виде "✅ chore:" или "Feat:"
70+
const singleMatch = title.match(
6771
/^([^\w]*)(bug|feat|enhancement|refactor|docs|test|chore|task|composite|ux\/ui|proposal|idea|discussion)[:\-\s]/i
6872
);
69-
if (match) {
70-
return [`[${capitalizePrefix(match[2])}]`];
73+
if (singleMatch) {
74+
const normalized = capitalizePrefix(singleMatch[2]);
75+
return { prefix: `[${normalized}]`, cleanTitle: title.replace(singleMatch[0], '').trim() };
7176
}
7277

73-
return [];
78+
return { prefix: '', cleanTitle: title };
7479
}
7580

76-
// --- Normalize title: make sure prefix becomes [Prefix] ---
81+
// --- Normalize title ---
7782
function normalizeTitlePrefixes(title) {
78-
const prefixes = extractPrefixes(title);
79-
if (!prefixes.length) return title.trim();
80-
81-
let clean = title
82-
.replace(/^\s*(?:\[([^\]]+)\]|([^\s:]+))\s*:?\s*/i, "")
83-
.trim();
84-
return `${prefixes.join(", ")} ${clean}`;
83+
const { prefix, cleanTitle } = extractAndNormalizePrefixes(title);
84+
return prefix ? `${prefix} ${cleanTitle}` : cleanTitle;
8585
}
8686

8787
// --- Classify title ---
8888
function classifyTitle(title) {
89-
const prefixes = extractPrefixes(title);
90-
if (!prefixes.length) return "Other";
89+
const { prefix } = extractAndNormalizePrefixes(title);
90+
if (!prefix) return "Other";
9191

92-
for (const prefix of prefixes) {
93-
const clean = prefix.replace(/[\[\]]/g, "").toLowerCase();
94-
if (PREFIX_MAP[clean]) return PREFIX_MAP[clean];
95-
}
96-
return "Other";
92+
// Берём первый префикс для классификации
93+
const firstPrefix = prefix.split(',')[0].replace(/[\[\]]/g, '').toLowerCase();
94+
return PREFIX_MAP[firstPrefix] || "Other";
9795
}
9896

9997
// --- Fetch all closed PRs ---

0 commit comments

Comments
 (0)