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

changelog-tools

v1.8.0

Published

A set of tools for changelog parsing and generation

Downloads

418

Readme

Changelog Tools

This package provides changelog-oriented tools for use in CLI, Node and browser scripts.

Features:

  • Parse CHANGELOG.md files compatible with https://keepachangelog.com/en/1.1.0/ into JSON structure
  • Filter output based on semver range, or custom filter conditions
  • Combine multiple versions into a single structure, grouped by type of change (Added, Fixed etc.)
  • Compatible with both browser and node environments
  • Add new entries into changelog with CLI

The parsing algorithm was initially based on the changelog-parser package, but it was updated to provide a more object-oriented approach.

CLI API

parse

changelog-tools parse path-to-changelog.md

Parses the changelog and returns it in JSON format

Parameters

| Param | Alias | Default | Description | | --------------- | ----- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | --help | -h | | | | --version | -v | | | | --new-line | -n | AUTO | AUTO\|LF\|CRLF\|CR - Define what should be newline character for output data. AUTO will try to detect the line endings from the document. | | --consolidate | -c | false | Merge multiple versions into one entry, groupiung the same ypes of changes together | | --semver | -s | '' | filter versions by semver range syntax. E.g. -s '>=1.0.0' | | --filter | -f | | Filter entries based on provided statement. Use this to access version data. Statement needs to return a boolean. Example: -f 'this.version === "1.0.0"' |

Examples

Parse changelog and output a JSON structure representing the document.
changelog-tools CHANGELOG.md
Find all versions in the changelog between 1.0.0 and 1.1.0 and group Added, Fixed etc entries together.
changelog-tools -cs '~1.0.0' CHANGELOG.md

add

changelog-tools add path-to-changelog.md -t 'Title of new version' [-o output file]

Adds a new version to the changelog.

Parameters

| Param | Alias | Default | Description | | ----------------- | ----- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | --help | -h | | | | --version | -v | | | | --new-line | -n | AUTO | AUTO\|LF\|CRLF\|CR - Define what should be newline character for output data. AUTO will try to detect the line endings from the document. | | --title | -t | | (Required) Title of the version to add (e.g. -t '1.0.0 (2020-01-01) - My Version Title') | | --added | -a | | ### Added entries (e.g. -a 'new feature' -a 'new feature 2') | | --changed | -c | | ### Changed entries (e.g. -c 'format 1' -c 'api description') | | --deprecated | -d | | ### Deprecated entries (e.g. -d 'old feature' -d 'old feature 2'). | | --removed | -r | | ### Removed entries (e.g. -r 'old feature' -r 'old feature 2') | | --fixed | -f | | ### Fixed entries (e.g. -f 'bug 1' -f 'bug 2') | | --new-changelog | | | Raw changelog text (including ### section headers) to be parsed and merged with other sections (e.g. --new-changelog "### Added\n* Something new") | | --list-bullet | -l | | Character to be used for list items (e.g. -l '*') | | --output | -o | stdout | Output file |

Examples

Add a new version with a single 'Added' entry
changelog-tools add CHANGELOG.md -t 'v1.5.0 - 2022-01-01' -a 'New command `add`'

output on CLI:

# Changelog Tools

## v1.5.0 - 2022-01-01
### Added
- New command `add`

<!-- ... previous versions -->
Add a new version with a single 'Added' entry and save it to the same file as input
changelog-tools add CHANGELOG.md -t 'v1.5.0 - 2022-01-01' -a 'New command `add`' -o CHANGELOG.md

JavaScript (Node and browser)

Loading parser class

CommonJS:

const { ChangelogParser } = require("changelog-tools");

ES Modules:

import { ChangelogParser } from "changelog-tools";

Creating parser

// Empty parser:
const changelogParser = new ChangelogParser();

// Parser with preloaded changelog text:
const changelogParser = new ChangelogParser({
  text: changelogContent
});

Parsing

// If text was already preloaded
const changelog = changelogParser.parse();

// With new changelog content:
const changelog = changelogParser.parse(changelogContent);

.parse() method will return an instance of the Changelog class.

An example structure of this object can be seen below:

{
  "title": "Changelog title",
  "description": "This is a sample changelog",
  "versions": [
    {
      "version": "1.1.0",
      "line": 4,
      "date": "2022-12-20",
      "title": "v1.1.0 - 2022-12-20",
      "parsed": {
        "_": ["Removed 1", "Changed 2"],
        "Removed": ["Removed 1"],
        "Changed": ["Changed 2"]
      },
      "body": "### Removed \n\n- Removed 1\n\n### Changed\n\n-Changed 2"
    },
    {
      "version": "1.0.0",
      "line": 12,
      "date": "2022-12-12",
      "title": "v1.0.0 - 2022-12-12",
      "parsed": {
        "_": ["Added 1", "Changed 1"],
        "Added": ["Added 1"],
        "Changed": ["Changed 1"]
      },
      "body": "### Added \n\n- Added 1\n\n### Changed\n\n-Changed 1"
    }
  ]
}

Filtering results

const filteredChangelog = changelog.filter((v) => v.version === '1.0.0' || v.title.includes('Unversioned'))

.filter() method will also return an instance of the Changelog class.

Consolidate versions from the changelog

const changeSummary = changelog.consolidate();

This is best used to summarize all changes from multiple versions. E.g. the script below will gather all changes from versions 1.1.X.

const changeSummary = changelog.filter((v) => v.version.startsWith('1.1')).consolidate();

The result will be provided as an object like below:

{
  "Added": [
    {
      "text": "Added 2",
      "version": "0.0.3"
    },
    {
      "text": "Added 1",
      "version": "0.0.1"
    }
  ],
  "Removed": [
    {
      "text": "Removed 1",
      "version": "0.0.2"
    }
  ]
}

Examples

See the ./examples folder to check for examples of use cases.