Project: unifiedjs/unified-diff

Package: unified-diff@4.0.1

  1. unified plugin to ignore unrelated messages
  1. remark 215
  2. unified 183
  3. plugin 139
  4. rehype 91
  5. retext 42
  6. unified-plugin 6
  7. diff 2


Build Coverage Downloads Sponsors Backers Chat

unified plugin to ignore unrelated messages in GitHub Actions and Travis.


What is this?

This package is a unified plugin to ignore unrelated lint messages in a CI.

unified is a project that transforms content with abstract syntax trees (ASTs). vfile is the virtual file interface used in unified which manages messages. This is a unified plugin that filters messages on the vfile.

When should I use this?

You can use this plugin when you are dealing with a large, existing project.

Using tools that check whether things follow a style guide is typically very useful. However, it can be hard to start using something in a large existing project. This plugin helps, because it ignores messages that occur in lines that are not touched by a PR in a CI. When this plugin is used outside of a supported CIs, it doesn’t do anything.


This package is ESM only. In Node.js (version 16+), install with npm:

npm install unified-diff

In Deno with esm.sh:

import unifiedDiff from 'https://esm.sh/unified-diff@5'

In browsers with esm.sh:

<script type="module">
  import unifiedDiff from 'https://esm.sh/unified-diff@5?bundle'


Say our document example.md contains:

This is an an example.

👉 Note: an an is a typo.

…and our module example.js looks as follows:

import process from 'node:process'
import remarkParse from 'remark-parse'
import remarkRetext from 'remark-retext'
import remarkStringify from 'remark-stringify'
import retextEnglish from 'retext-english'
import retextIndefiniteArticle from 'retext-indefinite-article'
import retextRepeatedWords from 'retext-repeated-words'
import {read} from 'to-vfile'
import {unified} from 'unified'
import unifiedDiff from 'unified-diff'
import {reporter} from 'vfile-reporter'

const file = await unified()
  .process(await read('example.md'))

process.exitCode = file.messages.length > 0 ? 1 : 0

…and our Travis configuration .travis.yml contains:

# …
- npm test
- node example.js
# …

👉 Note: an equivalent GH Actions workflow file is also supported.

Then, say someone creates a PR which adds the following diff:

diff --git a/example.md b/example.md
index 360b225..5a96b86 100644
--- a/example.md
+++ b/example.md
@@ -1 +1,3 @@
 This is an an example.
+Some more more text. A error.

👉 Note: more more and A before error are typos.

When run in CI, we’ll see the following printed on stderr(4).

   3:6-3:15  warning  Expected `more` once, not twice   retext-repeated-words      retext-repeated-words
  3:22-3:23  warning  Use `An` before `error`, not `A`  retext-indefinite-article  retext-indefinite-article

⚠ 2 warnings

👉 Note: an an on L1 is not included because it’s unrelated to this PR.

The build exits with 1 as there are messages, thus failing CI. The user sees this and amends the PR to the following:

diff --git a/example.md b/example.md
index 360b225..5a96b86 100644
--- a/example.md
+++ b/example.md
@@ -1 +1,3 @@
 This is an an example.
+Some more text. An error.

This time our lint task exits successfully, even though L1 would normally emit an error, but it’s unrelated to the PR.


This package exports no identifiers. The default export is unifiedDiff.


Ignore unrelated messages in GitHub Actions and Travis.

There are no options. If there’s a TRAVIS_COMMIT_RANGE, GITHUB_BASE_REF and GITHUB_HEAD_REF, or GITHUB_SHA environment variable, then this plugin runs, otherwise it does nothing.

To do

PRs welcome!


Transform (Transformer).


This package is fully typed with TypeScript. It exports no additional types.


Projects maintained by the unified collective are compatible with maintained versions of Node.js.

When we cut a new major release, we drop support for unmaintained versions of Node. This means we try to keep the current release line, unified-diff@^5, compatible with Node.js 16.


See contributing.md in unifiedjs/.github for ways to get started. See support.md for ways to get help.

This project has a code of conduct. By interacting with this repository, organization, or community you agree to abide by its terms.


MIT © Titus Wormer