Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

@theo.gravity/changelog-version

theogravity398MIT2.1.11

Creates / updates a changelog with customizable options, including version / timestamp / CI support.

changelog, readme, version, ci, generate, semver, publish, automation, cli, changelog-ci, changelog-tool, release, circle-ci, travis-ci, semantic-release, changes, automatic

readme

changelog-version

CircleCI npm version JavaScript Style Guide

Creates / updates a changelog with customizable options, including version / timestamp / CI support.

What it offers

  • Changelog file name
  • Where to find your version data
  • What your unreleased text for replacement should be (eg [UNRELEASED], *version*, etc)
  • What your release tag should look like (via the {date}, {version} tags)
  • Date formatting via the dateformat library
  • Use a custom config file with additional callback handlers
  • Helper command included to create a changelog file + stamp it with the unreleased text
  • Examples on how to auto-increment your logs and publish to npm in your CI

Turn this (the format can be customized):

# Changelog

## [UNRELEASED]

- I have a change!

into this:

# Changelog

## 1.2.3 - Wed May 04 2016 04:27:29

- I have a change!

What it will not do

  • Version bumping package.json. version-bump can do that job. Your package.json file must have the new version you want to stamp the changelog with before running changelog-version release.
  • Commit changes to your VCS.

Contents

Install

npm install -g @theo.gravity/changelog-version

Quick start usage

Mark a new unreleased entry into the changelog

changelog-version prepare

Stamp the changelog with the current version + time from package.json

changelog-version release

CLI Usage

$ changelog-version

  Usage: changelog-version <command> [options]

  Utility for creating and updating a changelog file.
  Use "<command> --help" for additional options.

  Options:

    -V, --version               output the version number
    --configFile [fileName]     Name of the optional config file, relative to projectRoot.
                                        Default is ".changelog.js".
    --projectRoot [path]        The project root where the package.json and changelog file is found.
                                        Default is process.cwd().
    --changelogFile [fileName]  The relative path to the changelog file from projectRoot.
                                        Default is "CHANGELOG.md".
    -h, --help                  output usage information

  Commands:

    prepare [options]           Stamp the changelog with an unreleased marker.
      Optionally to be used prior to the "release" command.
      A new file (defined by --changelogFile) will be created if one does not exist.
    release [options]           Stamp the changelog with the version / date info.

      You do *NOT* have to use "changelog-version prepare" before using this command.
    verify [options]            Verifies that the changelog contains the unreleasedTag.
      Returns with an error status if the changelog does not have it.

      Useful to run as part of a pre-commit hook.

  Examples:

    $ changelog-version prepare --newUnreleasedText "## [VERSION_GOES_HERE]\n\n"
    $ changelog-version release --unreleasedTag "[VERSION_GOES_HERE]" --unreleasedTagFormat "{version}"
    $ changelog-version verify

prepare

$ changelog-version prepare --help

  Usage: prepare [options]

  Stamp the changelog with an unreleased marker.
  Optionally to be used prior to the "release" command.
  A new file (defined by --changelogFile) will be created if one does not exist.

  Options:

    --newUnreleasedText [textToPrepend]  The text to prepend to the log file.
                                           Default is "# [UNRELEASED]\n\n".
    -h, --help                           output usage information

Example 1

Running changelog-version prepare in an empty directory will create the file CHANGELOG.md with the following:

# [UNRELEASED]

Example 2

You have a CHANGELOG.md with the following content:

# 1.2.3

- New release

Running changelog-version prepare will update CHANGELOG.md with:

# [UNRELEASED]

# 1.2.3

- New release

release

$ changelog-version release --help

  Usage: release [options]

  Stamp the changelog with the version / date info.

  You do *NOT* have to use "changelog-version prepare" before using this command.

  Options:

    --requireUnreleasedEntry                    If present, will exit with an error code if the
                                        unreleasedTag is not found in the changelog file.
    --requireUnreleasedEntryFailMsg [failText]  Message to display if requireUnreleasedEntry
                                        is enabled and the validation check fails
    --packageFile [fileName]                    The relative path to package.json, or a JSON file that
                                        contains the "version" field from projectRoot.
                                        Default is "package.json".
    --unreleasedTag [textToReplace]             The text to find in the changelog which would get
                                        replaced with the version / time.
                                        Default is "[UNRELEASED]".
    --unreleasedTagFormat [format]              Format to replace unreleasedTag with.
                                        Available tags are "{version}" and "{date}".
                                        Default is '{version} - {date}'.
    --dateFormat [format]                       Date mask to use from the "dateformat" library when
                                        replacing the versionTag.
                                        Default is "default".
    -h, --help                                  output usage information

Example

  • You used changelog-version prepare in the prior step and added in your release notes
  • You have a package.json that contains {"version": "1.2.3"}

current CHANGELOG.md:

# [UNRELEASED]

* New feature!

Running changelog-version release will update CHANGELOG.md with:

# 1.2.3 - <current date>

* New feature!

verify

$ changelog-version verify --help

  Usage: verify [options]

  Verifies that the changelog contains the unreleasedTag.
  Returns with an error status if the changelog does not have it.

  Useful to run as part of a pre-commit hook.

  Options:

    --unreleasedTag [textToLookFor]  The text to find in the changelog.
                                        Default is "[UNRELEASED]".
    --requireUnreleasedEntryFailMsg [failText]  Message to display if requireUnreleasedEntry
                                        is enabled and the validation check fails
    -h, --help                       output usage information

Custom configuration file

To spare yourself from having to specify command line options each time, you can use a custom config file.

Place .changelog.js in the root of your project.

(The file name can be configured with the --configFile option, which is relative to --projectRoot.)

If detected, changelog-version will derive options from this file.

With the exception of projectRoot, options defined on the command line will take precedence.

// This is an optional configuration file
// you can use with changelog-version.
// If specified, any command line args has priority over the
// values returned in this file.

// All values are optional.
// Do not use the ES6 export default
// since the file is imported using require()
// See command line options for additional available properties
module.exports = {
  /**
   * This is called before doing the version stamping.
   * @returns {Promise<void>}
   */
  onBeforeRelease: async () => {},
  /**
   * This is called after the version stamping is complete.
   * @param {string} version Release version that the changelog stamp used
   * @param {string} date Formatted date that the changelog stamp used
   * @param {string} releaseStamp Release text that the changelog was stamped with
   * @returns {Promise<void>}
   */
  onAfterRelease: async ({ version, date, releaseStamp } = {}) => {},

  // Values can either be text
  // or a (async) function that returns text

  // ==== Common options ====
  // If specified here, this will have priority
  // over the command line option projectRoot
  // once this file is read.
  projectRoot: () => {
    return process.cwd()
  },
  changelogFile: () => {
    return 'CHANGELOG.md'
  },
  // ==== Options specific to prepare ====
  newUnreleasedText: '# UNRELEASED\n\n',

  // ==== Options specific to release ====
  packageFile: async () => {
    return 'package.json'
  },
  // see https://www.npmjs.com/package/dateformat
  // for options
  dateFormat: 'default',
  unreleasedTag: () => {
    return 'UNRELEASED'
  },
  unreleasedTagFormat: '{date} - {version}'
}

Additional properties

Aside from the command line options, the config file offers additional properties:

Release properties

async onBeforeRelease

Called before the release. Use this to do any pre-setup that you need to do.

async onAfterRelease({ version, date, releaseStamp })

Called after the changelog has been updated.

   * @param {string} version Release version that the changelog stamp used
   * @param {string} date Formatted date that the changelog stamp used
   * @param {string} releaseStamp Release text that the changelog was stamped with

API

  • See src for the API.
  • See the test directory for API usage samples.

CI Integration

Auto-versioning + publishing in your CI

Make sure you have changelog-version.

Install:

npm install @theo.gravity/version-bump @theo.gravity/changelog-version version-bump-plugin-git --dev

CircleCI

This repo uses CircleCI to automatically version stamp the CHANGELOG.md file and publish to npm with the new version.

See the .circleci/ directory for auto release log stamping, version bumping and npm publishing.

The following package.json script is used in conjunction with the CircleCI flow:

{
  "scripts": {
      "release-log": "changelog-version release",
      "prepare-publish": "version-bump git-commit-msg && npm run release-log"
  }
}

changelog

2.1.11 - Sun May 09 2021 20:07:23

Update deps.

2.1.10 - Tue Aug 06 2019 01:32:06

Update NPM dev deps to fix audit issues.

2.1.8 - Thu Sep 20 2018 08:05:15

CI fixes

2.1.6 - Thu Sep 20 2018 07:47:58

CI fixes

2.1.4 - Thu Sep 20 2018 05:53:39

Update readme with new package version recommendation.

2.1.1 - Wed May 30 2018 20:00:10

  • Added --requireUnreleasedEntryFailMsg to allow the specification of a custom fail message when using --requireUnreleasedEntry or the validate command

2.1.0 - Wed May 30 2018 08:05:44

The ability to exit with an error code if the changelog lacks the unreleasedTag is now available.

  • Added new flag: --requireUnreleasedEntry
  • Added new command: changelog-version verify

2.0.12 - Sun May 27 2018 21:42:16

  • Fix CI builds

2.0.9 - Sun May 27 2018 21:26:39

  • Add CI automation to automatically build and publish the package
  • Add CI instructions

2.0.8 - Sun May 27 2018 03:39:17

  • More documentation

2.0.1 - Sun May 27 2018 02:28:42

  • Fix unit tests
  • Use new Date() for the date formatter instead of Date.now()

2.0.0 - Sun May 27 2018 00:23:19

New major version

The cli now has sub-commands:

  • prepare: Creates a changelog file if it does not exist, and prepend in the customizable unreleased line.
  • release: Finds the unreleased tag and stamps it with actual release info.

1.0.8 - Tue May 22 2018 16:57:05

  • Add a fail status code on cli failure

1.0.7 - Tue May 22 2018 15:07:07

  • First version