@conventional-changelog/git-client
Version:
Simple git client for conventional changelog packages.
125 lines • 8.19 kB
JavaScript
import semver from 'semver';
import { firstFromStream } from '@simple-libs/stream-utils';
import { GitClient } from './GitClient.js';
/**
* Helper to get package tag prefix.
* @param packageName
* @returns Tag prefix.
*/
export function packagePrefix(packageName) {
if (!packageName) {
return /^.+@/;
}
return `${packageName}@`;
}
/**
* Wrapper around Git CLI with conventional commits support.
*/
export class ConventionalGitClient extends GitClient {
deps = null;
loadDeps() {
// eslint-disable-next-line @typescript-eslint/no-misused-promises
if (this.deps) {
return this.deps;
}
this.deps = Promise.all([
import('conventional-commits-parser')
.then(({ parseCommits }) => parseCommits),
import('conventional-commits-filter')
.then(({ filterRevertedCommits }) => filterRevertedCommits)
]);
return this.deps;
}
/**
* Get parsed commits stream.
* @param params
* @param params.path - Read commits from specific path.
* @param params.from - Start commits range.
* @param params.to - End commits range.
* @param params.format - Commits format.
* @param parserOptions - Commit parser options.
* @yields Raw commits data.
*/
async *getCommits(params = {}, parserOptions = {}) {
const { filterReverts, ...gitLogParams } = params;
const [parseCommits, filterRevertedCommits] = await this.loadDeps();
if (filterReverts) {
yield* filterRevertedCommits(this.getCommits(gitLogParams, parserOptions));
return;
}
const parse = parseCommits(parserOptions);
const commitsStream = this.getRawCommits(gitLogParams);
yield* parse(commitsStream);
}
/**
* Get semver tags stream.
* @param params
* @param params.prefix - Get semver tags with specific prefix.
* @param params.skipUnstable - Skip semver tags with unstable versions.
* @param params.clean - Clean version from prefix and trash.
* @yields Semver tags.
*/
async *getSemverTags(params = {}) {
const { prefix, skipUnstable, clean } = params;
const tagsStream = this.getTags();
const unstableTagRegex = /\d+\.\d+\.\d+-.+/;
const cleanTag = clean
? (tag, unprefixed) => semver.clean(unprefixed || tag)
: (tag) => tag;
let unprefixed;
let tag;
for await (tag of tagsStream) {
if (skipUnstable && unstableTagRegex.test(tag)) {
continue;
}
if (prefix) {
const isPrefixed = typeof prefix === 'string'
? tag.startsWith(prefix)
: prefix.test(tag);
if (isPrefixed) {
unprefixed = tag.replace(prefix, '');
if (semver.valid(unprefixed)) {
tag = cleanTag(tag, unprefixed);
if (tag) {
yield tag;
}
}
}
}
else if (semver.valid(tag)) {
tag = cleanTag(tag);
if (tag) {
yield tag;
}
}
}
}
/**
* Get last semver tag.
* @param params - getSemverTags params.
* @returns Last semver tag, `null` if not found.
*/
async getLastSemverTag(params = {}) {
return firstFromStream(this.getSemverTags(params));
}
/**
* Get current sematic version from git tags.
* @param params - Additional git params.
* @returns Current sematic version, `null` if not found.
*/
async getVersionFromTags(params = {}) {
const semverTagsStream = this.getSemverTags({
clean: true,
...params
});
const semverTags = [];
for await (const tag of semverTagsStream) {
semverTags.push(tag);
}
if (!semverTags.length) {
return null;
}
return semverTags.sort(semver.rcompare)[0] || null;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udmVudGlvbmFsR2l0Q2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0NvbnZlbnRpb25hbEdpdENsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBSzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUUxQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxXQUFvQjtJQUNoRCxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ2hCLE9BQU8sTUFBTSxDQUFBO0tBQ2Q7SUFFRCxPQUFPLEdBQUcsV0FBVyxHQUFHLENBQUE7QUFDMUIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFNBQVM7SUFDMUMsSUFBSSxHQUF3RSxJQUFJLENBQUE7SUFFaEYsUUFBUTtRQUNkLGtFQUFrRTtRQUNsRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUE7U0FDakI7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDdEIsTUFBTSxDQUFDLDZCQUE2QixDQUFDO2lCQUNsQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDM0MsTUFBTSxDQUFDLDZCQUE2QixDQUFDO2lCQUNsQyxJQUFJLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixDQUFDO1NBQzlELENBQUMsQ0FBQTtRQUVGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFBLENBQUUsVUFBVSxDQUNmLFNBQTJCLEVBQUUsRUFDN0IsZ0JB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