Skip to main content

@nest-toolbox/version-generator

npm version

A CLI tool that generates semantic version strings from git branch names and commit SHAs — perfect for CI/CD pipelines.

Installation

npm install @nest-toolbox/version-generator

Or install globally:

npm install -g @nest-toolbox/version-generator

Quick Start

# On master branch with a tag
npx version-generator -v 1.2.0 --commit-sha abc1234
# → 1.2.0.abc1234

# On develop branch
npx version-generator -v 1.2.0 --commit-sha abc1234
# → 1.2.0-beta.abc1234

# On a feature branch
npx version-generator -v 1.2.0 --commit-sha abc1234
# → 1.2.0-alpha.abc1234

Features

  • 🏷️ Branch-aware versioning — generates different version formats for master, develop, and feature branches
  • 🔧 Fully configurable — customize branch identifiers, labels, and separators
  • 📦 Reads package.json — optionally extract version from package.json instead of CLI args
  • 🏗️ CI/CD ready — outputs a single version string to stdout for piping into build scripts
  • 🔀 Tag support — treats tagged commits as master/release versions

API Reference

CLI Usage

version-generator [options]

CLI Options

OptionTypeDefaultDescription
-v, --versionstringBase version (e.g., 1.2.0). Required unless --package-json is set
--commit-shastringGit commit SHA. Required
--package-jsonstringPath to package.json to read version from
--tagbooleanfalseTreat as a tagged release (master version format)
--masterstring'master'Branch identifier for master/main branch
--developstring'develop'Branch identifier for develop branch
--featurestring'feature'Branch identifier for feature branches
--develop-labelstring'beta'Label for develop branch versions
--alpha-labelstring'alpha'Label for feature branch versions
--label-separatorstring'-'Separator between version and label
--commit-id-separatorstring'.'Separator between label and commit SHA

Programmatic API

You can also use the version generation functions directly:

import {
generate_version,
generate_master_version,
generate_develop_version,
generate_feature_version,
} from '@nest-toolbox/version-generator/lib/lib';

generate_version(options, branch)

Main function — determines branch type and generates the appropriate version.

import { generate_version } from '@nest-toolbox/version-generator/lib/lib';

const version = generate_version(
{
version: '1.5.0',
commitSha: 'abc1234def',
master: 'master',
develop: 'develop',
feature: 'feature',
developLabel: 'beta',
alphaLabel: 'alpha',
labelSeparator: '-',
commitIdSeparator: '.',
tag: false,
},
'develop',
);
// → "1.5.0-beta.abc1234"

Returns 'latest' if the branch doesn't match any known pattern.

generate_master_version(options)

Generate a version for production/master branch.

generate_master_version({
version: '1.5.0',
commitSha: 'abc1234def',
commitIdSeparator: '.',
});
// → "1.5.0.abc1234"

Format: {version}{commitIdSeparator}{commitSha[0:7]}

generate_develop_version(options)

Generate a version for the develop branch.

generate_develop_version({
version: '1.5.0',
commitSha: 'abc1234def',
developLabel: 'beta',
labelSeparator: '-',
commitIdSeparator: '.',
});
// → "1.5.0-beta.abc1234"

Format: {version}{labelSeparator}{developLabel}{commitIdSeparator}{commitSha[0:7]}

generate_feature_version(options)

Generate a version for feature branches.

generate_feature_version({
version: '1.5.0',
commitSha: 'abc1234def',
alphaLabel: 'alpha',
labelSeparator: '-',
commitIdSeparator: '.',
});
// → "1.5.0-alpha.abc1234"

Format: {version}{labelSeparator}{alphaLabel}{commitIdSeparator}{commitSha[0:7]}

Branch Detection Functions

import { isMaster, isDevelop, isFeature } from '@nest-toolbox/version-generator/lib/lib';

isMaster({ options: { master: 'master', tag: false }, branch: 'master' }); // true
isMaster({ options: { master: 'main', tag: false }, branch: 'main' }); // true
isMaster({ options: { tag: true }, branch: 'anything' }); // true (tags are master)

isDevelop({ options: { develop: 'develop', tag: false }, branch: 'develop' }); // true
isFeature({ options: { feature: 'feature', tag: false }, branch: 'feature/add-auth' }); // true

Options Interface

interface Options {
master: string; // Branch identifier for master
develop: string; // Branch identifier for develop
feature: string; // Branch identifier for feature
commitSha: string; // Git commit SHA
tag: boolean | string; // Whether this is a tagged release
packageJson: string; // Path to package.json
developLabel: string; // Label for develop versions
alphaLabel: string; // Label for feature versions
labelSeparator: string; // Separator between version and label
commitIdSeparator: string; // Separator between label and commit SHA
version: string; // Base semantic version
}

Examples

CI/CD pipeline (GitHub Actions)

- name: Generate version
run: |
VERSION=$(npx version-generator \
-v $(node -p "require('./package.json').version") \
--commit-sha ${{ github.sha }})
echo "VERSION=$VERSION" >> $GITHUB_ENV

- name: Build Docker image
run: docker build -t myapp:${{ env.VERSION }} .

Reading version from package.json

npx version-generator --package-json ./package.json --commit-sha abc1234

Custom branch naming conventions

# Using 'main' instead of 'master', 'dev' instead of 'develop'
npx version-generator \
-v 2.0.0 \
--commit-sha abc1234 \
--master main \
--develop dev \
--feature feat

Custom labels and separators

# Using '+' as commit separator (SemVer build metadata style)
npx version-generator \
-v 1.0.0 \
--commit-sha abc1234 \
--commit-id-separator '+' \
--develop-label rc \
--alpha-label dev
# develop → 1.0.0-rc+abc1234
# feature → 1.0.0-dev+abc1234

Version output by branch type

BranchTagOutput
masterfalse1.0.0.abc1234
anytrue1.0.0.abc1234
developfalse1.0.0-beta.abc1234
feature/authfalse1.0.0-alpha.abc1234
hotfix/bugfalselatest