Project: unifiedjs/unified-diff

Package: unified-diff@4.0.1

  1. Dependents: 0
  2. unified plugin to ignore unrelated messages
  1. remark 199
  2. unified 175
  3. plugin 132
  4. rehype 89
  5. retext 36
  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 12.20+, 14.14+, 16.0+, or 18.0+), install with npm:

npm install unified-diff

In Deno with esm.sh:

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

In browsers with esm.sh:

<script type="module">
  import unifiedDiff from 'https://esm.sh/unified-diff@4?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 {read} from 'to-vfile'
import {reporter} from 'vfile-reporter'
import {unified} from 'unified'
import unifiedDiff from 'unified-diff'
import remarkParse from 'remark-parse'
import remarkStringify from 'remark-stringify'
import remarkRetext from 'remark-retext'
import retextEnglish from 'retext-english'
import retextRepeatedWords from 'retext-repeated-words'
import retextIndefiniteArticle from 'retext-indefinite-article'

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

process.exit(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!


This package is fully typed with TypeScript. There are no additional exported types.


Projects maintained by the unified collective are compatible with all maintained versions of Node.js. As of now, that is Node.js 12.20+, 14.14+, 16.0+, and 18.0+. Our projects sometimes work with older versions, but this is not guaranteed.


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