npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@priestine/versions

v1.13.1

Published

A tool for automating Semantic Versioning on your project

Downloads

49

Readme

||l

lint ava

Maintainability codecov

XO code style code style: prettier @priestine/versions

A tool for automating Semantic Versioning on your project.

Check out the roadmap for the project.

🔑 Table of Contents

✨ Features

  • ✅ Compatible with GitHub releases. GitLab releases and direct git tagging (hello, BitBucket) on the way!
  • ⚙️ Bump versions for the code written in any programming language with no configuration - only git matters
  • 📝 Automatically generated list of changes that is put into the release body. An option to also write to a file will also be available!
  • 🤔 Works with gitmoji commits convention, but you can configure it to your heart's content (see Conventions).

🏁 Getting Started

Using @priestine/versions is quite simple. You need Node installed and with that in place, you just npx @priestine/versions. Take a look at the examples provided below.

Local Machine Example

Go to the folder where your project lives and:

npx @priestine/versions --token=$TOKEN --repository=$OWNER/$REPO

GitHub Actions Example

# The name may be anything you like
name: Priestine Versioning
on:
 push:
  # The workflow will run when a push lands on the master branch
  branches: [master]
jobs:
 # This name may also be arbitrary
 versioning:
  # I didn't test it on Windows but it should be ok
  runs-on: ubuntu-latest
  steps:
   # Use checkout action to get the code
   - uses: actions/checkout@v2
     with:
      # Full depth is important because by default checkout action only fetches one commit
      fetch-depth: 0
   # Install Node to make @priestine/versions work
   - name: Setup Node
     uses: actions/setup-node@v1
     with:
      node-version: '12.x'
   # Do stuff
   - name: Publish new version if applicable
     run: npx @priestine/versions --token=${{ secrets.PRIESTINE_VERSIONS_TOKEN }} --repository=$GITHUB_REPOSITORY

📝 Docs

Common

JavaScript

⚙️ Configuration

The provided configuration means have the following precedence:

  1. Configuration files are checked first and provided values replace defaults
  2. Environment variables are checked second and provided values replace defaults and configuration file values
  3. CLI options are checked last and provided values replace defaults, configuration file values and enviroment variable values

All options that accept true or false as a value are false by default.

Overview

| Option | CLI Usage Example | Environment Usage Example | Default | | ----------------------------------------- | -------------------------------------------- | ------------------------------------------------------------ | --------- | | Config File | --config-file=PATH | PRIESTINE_VERSIONS_CONFIG_FILE=PATH | "" | | Token | --token=$SOME_TOKEN | PRIESTINE_VERSIONS_TOKEN=$SOME_TOKEN | "" | | Repository | --repository=octocat/github | PRIESTINE_VERSIONS_REPOSITORY=octocat/github | "" | | Latest Version | --latest-version=0.0.0 | PRIESTINE_VERSIONS_LATEST_VERSION=0.0.0 | "" | | Prefix | --prefix=v | PRIESTINE_VERSIONS_PREFIX=v | "" | | Pre-Release | --pre-release=$(git rev-parse HEAD) | PRIESTINE_VERSIONS_PRE_RELEAS=$(git rev-parse HEAD) | "" | | Build Metadata | --build-metadata=$(date) | PRIESTINE_VERSIONS_BUILD_METADATA=$(date) | "" | | Custom URL | --custom-url=https://api.mygh.com/repos/ | PRIESTINE_VERSIONS_CUSTOM_URL=https://api.mygh.com/repos | "" | | Merges | --merges=<include | exclude | only> | PRIESTINE_VERSIONS_MERGES=<include | exclude | only> | exclude | | Bump Patch | --bump-patch[=<true | false>] | PRIESTINE_VERSIONS_BUMP_PATCH=<true | false> | false | | Bump Minor | --bump-minor[=<true | false>] | PRIESTINE_VERSIONS_BUMP_MINOR=<true | false> | false | | Bump Major | --bump-patch[=<true | false>] | PRIESTINE_VERSIONS_BUMP_MAJOR=<true | false> | false | | Public | --public[=<true | false>] | PRIESTINE_VERSIONS_PUBLIC=<true | false> | false | | Prefix Reset | --prefix-reset[=<true | false>] | PRIESTINE_VERSIONS_PREFIX_RESET=<true | false> | false | | No Trailing Zeroes | --no-trailing-zeroes[=<true | false>] | PRIESTINE_VERSIONS_NO_TRAILING_ZEROES=<true | false> | false | | Dry Run | --dry-run[=<true | false>] | PRIESTINE_VERSIONS_DRY_RUN=<true | false> | false | | Show Changelog | --show-changelog[=<true | false>] | PRIESTINE_VERSIONS_SHOW_CHANGELOG=[=<true | false>] | false |

With CLI options that accept boolean values, providing those values is optional. --bump-patch and --bump-patch=true are completely the same.

With environment variables that accept boolean values, providing those values is required.

Detailed description

Config File

You can provide a custom config file that contains application setup. Supported file formats are JSON, YAML and TOML. The files are allowed to provide any of the configuration for the app, including additional options that cannot be provided by other means.

Token

Token is used to publish the tag with associated release using GitHub API. For some reason, the $GITHUB_TOKEN that is automatically provided by GitHub Actions didn't work for me. So, for now, a custom token is needed. To make it work, you can just issue a token yourself. The token needs read/write access to the repository.

Repository

You MUST provide --repository=$REPOSITORY option that is usually available in CI tools already, e.g. $GITHUB_REPOSITORY in GitHub Actions. Internally, it is a part of the repository URL containing the owner and the repo name, e.g. priestine/versions for the @priestine/versions repository. Even if your CI tool doesn't provide it, it's not too complicated so you can put it yourself.

Latest Version

You can customize the tag from which @priestine/versions should start checking commits. NOTE - in this case, the version that will be produced by @priestine/versions may already be in place. Use carefully.

Prefix

Allows prefixing versions with things like v (e.g., v1.0.0). This is a common pattern as it enables easier glob matching for tags, but keep in mind that using a prefix makes the version non-compliant with Semantic Versioning.

Pre-Release

Allows setting SemVer pre-releases, e.g. rc or alpha. Do not add - at the beginning. @priestine/versions adds .1 at the end of the pre-release. If you specify --pre-release=rc, the pre-release on the version will look like -rc.1. @priestine/versions automatically checks if there is a pair of the same X.Y.Z version and pre-release. If it does exist, @priestine/versions automatically bumps the number at the end (-rc.1 -> -rc.2). This is done to prevent potential clashes in versions from different sources that represent candidates with the same potential version and pre-release.

Build Metadata

You can specify custom build metadata that will be appended to the version. Do not add the + at the beginning. @priestine/versions does not apply any modifications to build metadata so it is your responsibility to ensure their uniqueness.

Custom URL

You can specify custom URL of the API where the release should be published. This is useful for on-premise.

Merges

This option configures the usage of merge commits. If you want to use merge commits as the main source information about codebase changes, you may set up this option to only to avoid evaluating other commits. By default, merge commits are excluded.

Bump Patch

If, for some reason, you want to force bumping the patch version, even if it is not needed based on the types of commits you've made since the previous release, you can provide the --bump-patch. Keep in mind that this may negatively affect the appearance of your changelog.

Bump Minor

If, for some reason, you want to force bumping the minor version, even if it is not needed based on the types of commits you've made since the previous release, you can provide the --bump-minor. Keep in mind that this may negatively affect the appearance of your changelog.

Bump Major

If, for some reason, you want to force bumping the major version, even if it is not needed based on the types of commits you've made since the previous release, you can provide the --bump-major. Keep in mind that this may negatively affect the appearance of your changelog.

Public

According to the Semantic Versioning specification, releases that have a MAJOR version of 0 are not considered stable. Breaking changes for these releases bump MINOR version instead of the MAJOR one. These rules also apply if you use @priestine/versions - by default, your versions will have MAJOR version of 0. The changelog is created with MAJOR changes separate from MINOR ones, though. You can provide this option to exit the experimental stage. The closest release will be 1.0.0, thus declaring public API.

Applying this option is irreversible. This option is only applicable if you don't have releases with MAJOR version higher than 0. Otherwise, your project is considered to have public API declared already and you cannot publish 0.x.x versions anymore.

Prefix Reset

Setting this option to true will reset major version to 1 if the prefix changes. This option does not affect the versioning process if prefix is not provided. This option requires declaring public API. If major version was 0, this option will force it to be set to 1.

No Trailing Zeroes

Remove trailing zeroes in the new version, e.g. 14.0.0 -> 14 or 10.15.0 -> 10.15. NOTE: this is not compliant with Semantic Versioning. This option may be useful for creating new versions under the scheme Apple uses for their software. Alternatively, it can be applied to prettify CalVer-like versions.

Dry Run

Execute the command but skip publishing the release. May be useful for debugging or just to check what version your application is going to have next.

Show Changelog

Provide this option to include changelog in the console output. It is disabled by default as it may take quite a lot of space. This option can be helpful when setting up conventions, checking for commit message misspeling or commit type errors, or just to be able to say what you did yesterday during the daily scrum.

Conventions

Conventions can only be set up in config files. The conventions outline the process of finding commit types, binding those types to SemVer versions (major, minor or patch) and specify how the changes should be displayed in the change log. It is an array of objects of the following type:

/**
 * Convention for defining how to get commit type, what version this
 * type should bump, and how to display the change in the change log.
 */
export interface IConvention {
	/**
	 * An array of strings containing RegExp that is used to check commit
	 * descriptions.
	 */
	match: string[]

	/**
	 * Title for the group of commits of this type in the changelog.
	 */
	groupTitleFormat: string

	/**
	 * Optional description for the group.
	 */
	groupDescription: string

	/**
	 * A template describing how the commits of this type should be
	 * displayed in the changelog. Here you can use the following
	 * placeholders that will be replaced with the actual contents of the
	 * commit:
	 *
	 * - %commit.type%
	 * - %commit.description%
	 * - %commit.author.name%
	 * - %commit.author.email%
	 * - %commit.abbrevHash%
	 * - %commit.hash%
	 */
	itemDescriptionFormat: string

	/**
	 * A template describing how the body of commits of this type should
	 * be displayed in the changelog (if it exists). Here you can use the
	 * %commit.body% placeholder that will be replaced with the actual
	 * contents of the commit body.
	 */
	itemBodyFormat: string

	/**
	 * Semantic Version part that must be bumped if a commit of this type
	 * is found since previous version.
	 */
	bumps: 'patch' | 'minor' | 'major' | null
}

NOTE that @priestine/semantics only adds line breaks (\n) between commits within a group.

You can see the default configuration for @priestine/versions below in the examples for config files.

Config Files

The files must have appropriate extensions:

  • .json for JSON
  • .yml or .yaml for YAML
  • .toml for TOML

Config files allow deeper configuration than env variables and CLI options. Specifically, config files allow provision of conventions.

Here is a JSON example with the default settings for @priestine/versions. You can do the same with YAML and TOML as well.

{
  "token": "",
  "repository": "",
  "latestVersion": "",
  "prefix": "",
  "preRelease": "",
  "buildMetadata": "",
  "customUrl": "",
  "merges": "exclude",
  "bumpPatch": false,
  "bumpMinor": false,
  "bumpMajor": false,
  "public": false,
  "prefixReset": false,
  "noTrailingZeroes": false,
  "dryRun": false,
  "showChangelog": false,
  "conventions": [
    {
      "match": ["^:ambulance:", "^:bug:", "^:lock:"],
      "bumps": "patch",
      "groupTitleFormat": "\n\n## :bug: ∘ :ambulance: ∘ :lock: Fixes\n",
      "groupDescription": "",
      "itemDescriptionFormat": "- %commit.description% (%commit.abbrevHash%)",
      "itemBodyFormat": "> %commit.body%\n",
    },
    {
      "match": ["^:sparkles:"],
      "bumps": "minor",
      "groupTitleFormat": "\n\n## :sparkles: Features\n",
      "groupDescription": "",
      "itemDescriptionFormat": "- %commit.description% (%commit.abbrevHash%)",
      "itemBodyFormat": "> %commit.body%\n",
    },
    {
      "match": ["^:boom:"],
      "bumps": "major",
      "groupTitleFormat": "\n\n## :boom: Breaking Changes\n",
      "groupDescription": "",
      "itemDescriptionFormat": "- %commit.description% (%commit.abbrevHash%)",
      "itemBodyFormat": "> %commit.body%\n",
    }
]

🗺 How it works

This intentionally over-complicated diagram depicts the application execution process:

execution process

🚫 Caveats

  • Help needed - for some reason, $GITHUB_TOKEN did not work for me when I tried to use it for creating releases from GitHub Actions. I am not very skilled with this tool so there's probably me doing something wrong.
  • Currently, @priestine/versions only works with GitHub (on-premise solutions not supported yet) and gitmoji as a commit convention.
  • There might be a problem with using @priestine/versions with git repositories that have multiple unrelated histories merged. Specifically, when there are no previous Semantic Version tags and the tool tries to check commits since the initial commit. The problem is that in this case there will be multiple initial commits. Current workaround is to manually tag the commit that is desired to be used as the initial one, with a tag like '0.0.0' and then execute @priestine/semantics with --latest-version=0.0.0.