-
Notifications
You must be signed in to change notification settings - Fork 0
/
changelog.ts
57 lines (49 loc) · 2.32 KB
/
changelog.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { UnreleasedChangelogCommit, UnreleasedCommitMessages, ChangelogMessages, ChangelogEntry } from './types';
import { Store } from './store';
export async function toChangelog<MessagesT = string[]>(store: Store, commits: UnreleasedChangelogCommit<UnreleasedCommitMessages<MessagesT>>[]): Promise<ChangelogEntry<ChangelogMessages<MessagesT>>[]> {
const mapped: ChangelogEntry<ChangelogMessages<MessagesT>>[] = commits.map(c => ({
datetimeUTC: c.datetimeUTC,
branchName: c.branchName,
messages: c.messages
}));
store.data.unreleasedChangelog = store.data.unreleasedChangelog.filter(x => commits.find(y => y.commitHash === x.commitHash) === null);
store.data.changelog.push(...mapped);
await store.autoSave();
return mapped;
}
export type RenderChangelogMessageFunc = (category: string, message: string) => string
export type RenderedMessages = { [categoryName: string]: string[] };
export type RenderChangelogFunc = (messages: RenderedMessages) => string
export function renderChangelog(store: Store, {
entries,
categories,
messageRenderer = renderChangelogMessage,
changelogRenderer = renderChangelogMessages
}: {
entries: ChangelogEntry<ChangelogMessages<string[]>>[],
categories: 'all'|string[],
messageRenderer?: RenderChangelogMessageFunc,
changelogRenderer?: RenderChangelogFunc
}): string {
const rendered: { [categoryName: string]: string[] } = {};
for(const entry of entries) {
for(const [ category, messages ] of Object.entries(entry.messages)) {
if (categories === 'all' || categories.includes(category)) {
if (messages.length !== 0 && !rendered[category]) rendered[category] = [];
for (const message of messages) {
const renderedMsg = messageRenderer(category, message);
rendered[category].push(renderedMsg);
}
}
}
}
return changelogRenderer(rendered);
}
export function renderChangelogMessage(category: string, message: string): string {
return `* ${message}`;
}
export function renderChangelogMessages(messages: RenderedMessages): string {
return Object.entries(messages).map(([ category, renderedMessage ]) => {
return [ `# ${category}`, renderedMessage.join(' \n') ].join(' \n');
}).join(' \n');
}