mirror of
https://github.com/CorentinTh/it-tools.git
synced 2025-01-08 00:20:43 +08:00
54 lines
1.5 KiB
JavaScript
54 lines
1.5 KiB
JavaScript
import _ from 'lodash';
|
|
|
|
export { rawCommitsToMarkdown };
|
|
|
|
const commitScopesToHumanReadable = {
|
|
build: 'Build system',
|
|
chore: 'Chores',
|
|
ci: 'Continuous integration',
|
|
docs: 'Documentation',
|
|
feat: 'Features',
|
|
fix: 'Bug fixes',
|
|
infra: 'Infrastucture',
|
|
perf: 'Performance',
|
|
refactor: 'Refactoring',
|
|
test: 'Tests',
|
|
};
|
|
|
|
const commitTypesOrder = ['feat', 'fix', 'perf', 'refactor', 'test', 'build', 'ci', 'chore', 'other'];
|
|
|
|
const getCommitTypeSortIndex = (type) =>
|
|
commitTypesOrder.includes(type) ? commitTypesOrder.indexOf(type) : commitTypesOrder.length;
|
|
|
|
function parseCommitLine(commit) {
|
|
const [sha, ...splittedRawMessage] = commit.trim().split(' ');
|
|
const rawMessage = splittedRawMessage.join(' ');
|
|
const { type, scope, subject } = /^(?<type>.*?)(\((?<scope>.*)\))?: ?(?<subject>.+)$/.exec(rawMessage)?.groups ?? {};
|
|
|
|
return {
|
|
sha: sha.slice(0, 7),
|
|
type: type ?? 'other',
|
|
scope,
|
|
subject: subject ?? rawMessage,
|
|
};
|
|
}
|
|
|
|
function commitSectionsToMarkdown({ type, commits }) {
|
|
return [
|
|
`### ${commitScopesToHumanReadable[type] ?? _.capitalize(type)}`,
|
|
...commits.map(({ sha, scope, subject }) => ['-', scope ? `**${scope}**:` : '', subject, `(${sha})`].join(' ')),
|
|
].join('\n');
|
|
}
|
|
|
|
function rawCommitsToMarkdown({ rawCommits }) {
|
|
return _.chain(rawCommits)
|
|
.trim()
|
|
.split('\n')
|
|
.map(parseCommitLine)
|
|
.groupBy('type')
|
|
.map((commits, type) => ({ type, commits }))
|
|
.sortBy(({ type }) => getCommitTypeSortIndex(type))
|
|
.map(commitSectionsToMarkdown)
|
|
.join('\n\n')
|
|
.value();
|
|
}
|