git-history-changelog
Version:
changelog builder framework from git history
66 lines (57 loc) • 2.4 kB
text/typescript
import * as ghc from '../index';
import * as fs from 'fs';
async function main() {
const store = await ghc.Store.openOrCreate('./changelog.json', './', 'autosave');
const parsedCommits = await ghc.parseUntrackedCommits(store);
const formatted = await ghc.formatParsedCommits(store, parsedCommits, async (x) => {
const messages = x.message.split(';').map(y => y.trim());
const categorized: ghc.ChangelogMessages<string[]> = {};
const defaultCategory = 'log';
for (const msg of messages) {
const [ category, text ] = msg.includes(':') ? msg.split(':') : [ defaultCategory, msg ];
if (!(category in categorized))
categorized[category] = [];
categorized[category].push(text.trim());
}
return categorized;
});
const formated2 = await Promise.all(formatted.map(async f => {
const packageFile = await ghc.fileContentString(store, f.commitHash, 'package.json');
const packageVersion: string = JSON.parse(packageFile).version;
return {
...f,
messages: {
[packageVersion]: f.messages
}
}
}));
const grouped = await ghc.reduceUnreleasedCommits(store, formated2);
const grouped2 = grouped.map(g => ({
...g,
messages: ghc.groupEveryKeyByKeys(g.messages)
}));
const changelog = await ghc.toChangelog(store, grouped2);
const rendered = (store.data.changelog as typeof changelog).sort((a, b) => b.datetimeUTC - a.datetimeUTC).map(entry => join_markdown([
`Branch: ${entry.branchName}, ${new Date(entry.datetimeUTC * 1000).toLocaleString()}`,
'',
Object.entries(entry.messages).map(([ packageVersion, categorized ]) => [
`# ${packageVersion}`,
Object.entries(categorized).map(([ category, messages ]) => [
`## ${category}`,
messages.map(message => `* ${message}`)
]),
''
])
])).join(' \n--- \n');
fs.writeFile('./changelog.md', rendered, 'utf8', err => {
if (err) console.error(err);
else console.log('ok');
});
}
main();
function join_markdown(x: any): string {
if (Array.isArray(x)) {
return x.map(join_markdown).join(' \n');
}
return x;
}