import { ParsedHistoryCommit, UnreleasedCommitMessages, UnreleasedChangelogCommit } from './types'; import { Store } from './store'; import { groupByKeys } from './utils'; /** works like in Array.filter(callback) */ export type FormatFunc = (c: ParsedHistoryCommit) => (false|UnreleasedCommitMessagesT)|Promise; /** * format commits * * `parsedCommits` - from git/parse function * * `filter` - filter out commits and pick categorised messages * * `onlyMarked` - pick commits only with `commitToUnreleasedChangelog=true` (all by default) */ export async function formatParsedCommits( store: Store, parsedCommits: ParsedHistoryCommit[], format: FormatFunc, onlyMarked?: false|'onlyMarked' ): Promise[]> { const commits: UnreleasedChangelogCommit[] = (await Promise.all(parsedCommits.map(async pc => { if (onlyMarked && !pc.commitToUnreleasedChangelog) return false; const messages = await format(pc); if (messages === false) return false; return ({ authorName: pc.authorName, datetimeUTC: pc.datetimeUTC, branchName: pc.branchName, commitHash: pc.commitHash, messages }) as UnreleasedChangelogCommit; }))).filter(x => x !== false) as any; // filter out mapped store.data.parsedHistory = store.data.parsedHistory.filter(x => commits.find(y => y.commitHash === x.commitHash) === null); store.data.unreleasedChangelog.push(...commits); await store.autoSave(); return commits; } export async function reduceUnreleasedCommits( store: Store, unreleasedCommits: UnreleasedChangelogCommit>[] ) { const branchNames = new Set(); unreleasedCommits.forEach(x => branchNames.add(x.branchName)); const grouped = Array.from(branchNames).map(branchName => { const groupedByBranch = unreleasedCommits.filter(c => c.branchName === branchName); const sortedByDate = groupedByBranch.sort((a, b) => b.datetimeUTC - a.datetimeUTC); const lastCommit = sortedByDate[0]; const messagesGroupedByCategory: { [categoryName: string]: any[] } = groupByKeys(sortedByDate.map(x => x.messages)); return { ...lastCommit, messages: messagesGroupedByCategory }; }); // filter out mapped store.data.unreleasedChangelog = store.data.unreleasedChangelog.filter(x => unreleasedCommits.find(y => y.commitHash === x.commitHash) === null); store.data.unreleasedChangelog.push(...grouped); await store.autoSave(); return grouped; }