Socket
Socket
Sign inDemoInstall

jest-diff

Package Overview
Dependencies
13
Maintainers
6
Versions
229
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

    jest-diff

Display differences clearly so people can review changes confidently.


Version published
Weekly downloads
36M
increased by0.02%
Maintainers
6
Install size
436 kB
Created
Weekly downloads
 

Package description

What is jest-diff?

The jest-diff npm package is a utility primarily used to show differences between two values, typically used in testing environments to assert the equality of objects, arrays, or other data structures. It is part of the Jest testing framework but can be used independently for its diffing capabilities.

What are jest-diff's main functionalities?

Diffing two values

This feature allows you to compare two JavaScript objects and outputs a string that visually represents the differences between them. It is useful for debugging and in test assertions to see what exactly differs when a test fails.

const diff = require('jest-diff');
const a = { a: { b: { c: 5 } } };
const b = { a: { b: { c: 6 } } };
console.log(diff(a, b));

Customizing diff output

This feature allows customization of the diff output by passing options. You can specify annotations for the compared values, which helps in making the output more understandable and tailored to specific needs.

const diff = require('jest-diff');
const options = { aAnnotation: 'First', bAnnotation: 'Second' };
const a = [1, 2, 3];
const b = [2, 1, 3];
console.log(diff(a, b, options));

Other packages similar to jest-diff

Changelog

Source

28.0.0

Features

  • [babel-jest] Export createTransformer function (#12399)
  • [expect] Expose AsymmetricMatchers, MatcherFunction and MatcherFunctionWithState interfaces (#12363, #12376)
  • [jest-circus] Support error logging before retry (#12201)
  • [jest-circus, jest-jasmine2] Allowed classes and functions as describe and it/test names (#12484)
  • [jest-cli, jest-config] [BREAKING] Remove testURL config, use testEnvironmentOptions.url instead (#10797)
  • [jest-cli, jest-core] Add --shard parameter for distributed parallel test execution (#12546)
  • [jest-cli] [BREAKING] Remove undocumented --timers option (#12572)
  • [jest-config] [BREAKING] Stop shipping jest-environment-jsdom by default (#12354)
  • [jest-config] [BREAKING] Stop shipping jest-jasmine2 by default (#12355)
  • [jest-config, @jest/types] Add ci to GlobalConfig (#12378)
  • [jest-config] [BREAKING] Rename moduleLoader to runtime (#10817)
  • [jest-config] [BREAKING] Rename extraGlobals to sandboxInjectedGlobals (#10817)
  • [jest-config] [BREAKING] Throw an error instead of showing a warning if multiple configs are used (#12510)
  • [jest-config] [BREAKING] Do not normalize long deprecated configuration options preprocessorIgnorePatterns, scriptPreprocessor, setupTestFrameworkScriptFile and testPathDirs (#12701)
  • [jest-cli, jest-core] Add --ignoreProjects CLI argument to ignore test suites by project name (#12620)
  • [jest-core] Pass project config to globalSetup/globalTeardown function as second argument (#12440)
  • [jest-core] Stabilize test runners with event emitters (#12641)
  • [jest-core, jest-watcher] [BREAKING] Move TestWatcher class to jest-watcher package (#12652)
  • [jest-core] Allow using Summary Reporter as stand-alone reporter (#12687)
  • [jest-environment-jsdom] [BREAKING] Upgrade jsdom to 19.0.0 (#12290)
  • [jest-environment-jsdom] [BREAKING] Add default browser condition to exportConditions for jsdom environment (#11924)
  • [jest-environment-jsdom] [BREAKING] Pass global config to Jest environment constructor for jsdom environment (#12461)
  • [jest-environment-jsdom] [BREAKING] Second argument context to constructor is mandatory (#12469)
  • [jest-environment-node] [BREAKING] Add default node and node-addon conditions to exportConditions for node environment (#11924)
  • [jest-environment-node] [BREAKING] Pass global config to Jest environment constructor for node environment (#12461)
  • [jest-environment-node] [BREAKING] Second argument context to constructor is mandatory (#12469)
  • [jest-environment-node] Add all available globals to test globals, not just explicit ones (#12642, #12696)
  • [@jest/expect] New module which extends expect with jest-snapshot matchers (#12404, #12410, #12418)
  • [@jest/expect-utils] New module exporting utils for expect (#12323)
  • [@jest/fake-timers] [BREAKING] Rename timers configuration option to fakeTimers (#12572)
  • [@jest/fake-timers] [BREAKING] Allow jest.useFakeTimers() and projectConfig.fakeTimers to take an options bag (#12572)
  • [jest-haste-map] [BREAKING] HasteMap.create now returns a promise (#12008)
  • [jest-haste-map] Add support for dependencyExtractor written in ESM (#12008)
  • [jest-mock] [BREAKING] Rename exported utility types ClassLike, FunctionLike, ConstructorLikeKeys, MethodLikeKeys, PropertyLikeKeys; remove exports of utility types ArgumentsOf, ArgsType, ConstructorArgumentsOf - TS builtin utility types ConstructorParameters and Parameters should be used instead (#12435, #12489)
  • [jest-mock] Improve isMockFunction to infer types of passed function (#12442)
  • [jest-mock] [BREAKING] Improve the usage of jest.fn generic type argument (#12489)
  • [jest-mock] Add support for auto-mocking async generator functions (#11080)
  • [jest-mock] Add contexts member to mock functions (#12601)
  • [@jest/reporters] Add GitHub Actions reporter (#11320, #12658)
  • [@jest/reporters] Pass reporterContext to custom reporter constructors as third argument (#12657)
  • [jest-resolve] [BREAKING] Add support for package.json exports (#11961, #12373)
  • [jest-resolve] Support package self-reference (#12682)
  • [jest-resolve, jest-runtime] Add support for data: URI import and mock (#12392)
  • [jest-resolve, jest-runtime] Add support for async resolver (#11540)
  • [jest-resolve] [BREAKING] Remove browser?: boolean from resolver options, conditions: ['browser'] should be used instead (#12707)
  • [jest-resolve] Expose JestResolver, AsyncResolver, SyncResolver, PackageFilter, PathFilter and PackageJSON types (#12707, (#12712)
  • [jest-runner] Allow setupFiles module to export an async function (#12042)
  • [jest-runner] Allow passing testEnvironmentOptions via docblocks (#12470)
  • [jest-runner] Expose CallbackTestRunner, EmittingTestRunner abstract classes and CallbackTestRunnerInterface, EmittingTestRunnerInterface to help typing third party runners (#12646, #12715)
  • [jest-runner] Lock version of source-map-support to 0.5.13 (#12720)
  • [jest-runtime] [BREAKING] Runtime.createHasteMap now returns a promise (#12008)
  • [jest-runtime] Calling jest.resetModules function will clear FS and transform cache (#12531)
  • [jest-runtime] [BREAKING] Remove Context type export, it must be imported from @jest/test-result (#12685)
  • [jest-runtime] Add import.meta.jest (#12698)
  • [@jest/schemas] New module for JSON schemas for Jest's config (#12384)
  • [@jest/source-map] Migrate from source-map to @jridgewell/trace-mapping (#12692)
  • [jest-transform] [BREAKING] Make it required for process() and processAsync() methods to always return structured data (#12638)
  • [jest-test-result] Add duration property to JSON test output (#12518)
  • [jest-watcher] [BREAKING] Make PatternPrompt class to take entityName as third constructor parameter instead of this._entityName (#12591)
  • [jest-worker] [BREAKING] Allow only absolute workerPath (#12343)
  • [jest-worker] [BREAKING] Default to advanced serialization when using child process workers (#10983)
  • [pretty-format] New maxWidth parameter (#12402)

Fixes

  • [*] Use sha256 instead of md5 as hashing algorithm for compatibility with FIPS systems (#12722)
  • [babel-jest] [BREAKING] Pass rootDir as root in Babel's options (#12689)
  • [expect] Move typings of .not, .rejects and .resolves modifiers outside of Matchers interface (#12346)
  • [expect] Throw useful error if expect.extend is called with invalid matchers (#12488)
  • [expect] Fix iterableEquality ignores other properties (#8359)
  • [expect] Fix print for the closeTo matcher (#12626)
  • [jest-changed-files] Improve changedFilesWithAncestor pattern for Mercurial SCM (#12322)
  • [jest-circus, @jest/types] Disallow undefined value in TestContext type (#12507)
  • [jest-config] Correctly detect CI environment and update snapshots accordingly (#12378)
  • [jest-config] Pass moduleTypes to ts-node to enforce CJS when transpiling (#12397)
  • [jest-config] [BREAKING] Add mjs and cjs to default moduleFileExtensions config (#12578)
  • [jest-config, jest-haste-map] Allow searching for tests in node_modules by exposing retainAllFiles (#11084)
  • [jest-core] [BREAKING] Exit with status 1 if no tests are found with --findRelatedTests flag (#12487)
  • [jest-core] Do not report unref-ed subprocesses as open handles (#12705)
  • [jest-each] %# is not replaced with index of the test case (#12517)
  • [jest-each] Fixes error message with incorrect count of missing arguments (#12464)
  • [jest-environment-jsdom] Make jsdom accessible to extending environments again (#12232)
  • [jest-environment-jsdom] Log JSDOM errors more cleanly (#12386)
  • [jest-environment-node] Add MessageChannel, MessageEvent to globals (#12553)
  • [jest-environment-node] Add structuredClone to globals (#12631)
  • [@jest/expect-utils] [BREAKING] Fix false positives when looking for undefined prop (#8923)
  • [jest-haste-map] Don't use partial results if file crawl errors (#12420)
  • [jest-haste-map] Make watchman existence check lazy+async (#12675)
  • [jest-jasmine2, jest-types] [BREAKING] Move all jasmine specific types from @jest/types to its own package (#12125)
  • [jest-jasmine2] Do not set duration to 0 for skipped tests (#12518)
  • [jest-matcher-utils] Pass maxWidth to pretty-format to avoid printing every element in arrays by default (#12402)
  • [jest-mock] Fix function overloads for spyOn to allow more correct type inference in complex object (#12442)
  • [jest-mock] Handle overridden Function.name property (#12674)
  • [@jest/reporters] Notifications generated by the --notify flag are no longer persistent in GNOME Shell. (#11733)
  • [@jest/reporters] Move missing icon file which is needed for NotifyReporter class. (#12593)
  • [@jest/reporters] Update v8-to-istanbul (#12697)
  • [jest-resolver] Call custom resolver with core node.js modules (#12654)
  • [jest-runner] Correctly resolve source-map-support (#12706)
  • [jest-worker] Fix Farm execution results memory leak (#12497)

Chore & Maintenance

  • [*] [BREAKING] Drop support for Node v10 and v15 and target first LTS 16.13.0 (#12220)
  • [*] [BREAKING] Drop support for typescript@3.8, minimum version is now 4.3 (#11142, #12648)
  • [*] Bundle all .d.ts files into a single index.d.ts per module (#12345)
  • [*] Use globalThis instead of global (#12447)
  • [babel-jest] [BREAKING] Only export createTransformer (#12407)
  • [docs] Add note about not mixing done() with Promises (#11077)
  • [docs, examples] Update React examples to match with the new React guidelines for code examples (#12217)
  • [docs] Add clarity for module factory hoisting limitations (#12453)
  • [docs] Add more information about how code transformers work (#12407)
  • [docs] Add upgrading guide (#12633)
  • [expect] [BREAKING] Remove support for importing build/utils (#12323)
  • [expect] [BREAKING] Migrate to ESM (#12344)
  • [expect] [BREAKING] Snapshot matcher types are moved to @jest/expect (#12404)
  • [jest-cli] Update yargs to v17 (#12357)
  • [jest-config] [BREAKING] Remove getTestEnvironment export (#12353)
  • [jest-config] [BREAKING] Rename config option name to id (#11981)
  • [jest-create-cache-key-function] Added README.md file with basic usage instructions (#12492)
  • [@jest/core] Use index.ts instead of jest.ts as main export (#12329)
  • [jest-environment-jsdom] [BREAKING] Migrate to ESM (#12340)
  • [jest-environment-node] [BREAKING] Migrate to ESM (#12340)
  • [jest-haste-map] Remove legacy isRegExpSupported (#12676)
  • [@jest/fake-timers] Update @sinonjs/fake_timers to v9 (#12357)
  • [jest-jasmine2, jest-runtime] [BREAKING] Use Symbol to pass jest.setTimeout value instead of jasmine specific logic (#12124)
  • [jest-phabricator] [BREAKING] Migrate to ESM (#12341)
  • [jest-resolve] [BREAKING] Make requireResolveFunction argument mandatory (#12353)
  • [jest-runner] [BREAKING] Remove some type exports from @jest/test-result (#12353)
  • [jest-runner] [BREAKING] Second argument to constructor (Context) is not optional (#12640)
  • [jest-serializer] [BREAKING] Deprecate package in favour of using v8 APIs directly (#12391)
  • [jest-snapshot] [BREAKING] Migrate to ESM (#12342)
  • [jest-transform] Update write-file-atomic to v4 (#12357)
  • [jest-types] [BREAKING] Remove Config.Glob and Config.Path (#12406)
  • [jest] Use index.ts instead of jest.ts as main export (#12329)

Performance

  • [jest-haste-map] [BREAKING] Default to node crawler over shelling out to find if watchman is not enabled (#12320)

Readme

Source

jest-diff

Display differences clearly so people can review changes confidently.

The diff named export serializes JavaScript values, compares them line-by-line, and returns a string which includes comparison lines.

Two named exports compare strings character-by-character:

  • diffStringsUnified returns a string.
  • diffStringsRaw returns an array of Diff objects.

Three named exports compare arrays of strings line-by-line:

  • diffLinesUnified and diffLinesUnified2 return a string.
  • diffLinesRaw returns an array of Diff objects.

Installation

To add this package as a dependency of a project, run either of the following commands:

  • npm install jest-diff
  • yarn add jest-diff

Usage of diff()

Given JavaScript values, diff(a, b, options?) does the following:

  1. serialize the values as strings using the pretty-format package
  2. compare the strings line-by-line using the diff-sequences package
  3. format the changed or common lines using the chalk package

To use this function, write either of the following:

  • const {diff} = require('jest-diff'); in CommonJS modules
  • import {diff} from 'jest-diff'; in ECMAScript modules

Example of diff()

const a = ['delete', 'common', 'changed from'];
const b = ['common', 'changed to', 'insert'];

const difference = diff(a, b);

The returned string consists of:

  • annotation lines: describe the two change indicators with labels, and a blank line
  • comparison lines: similar to “unified” view on GitHub, but Expected lines are green, Received lines are red, and common lines are dim (by default, see Options)
- Expected
+ Received

  Array [
-   "delete",
    "common",
-   "changed from",
+   "changed to",
+   "insert",
  ]

Edge cases of diff()

Here are edge cases for the return value:

  • ' Comparing two different types of values. …' if the arguments have different types according to the jest-get-type package (instances of different classes have the same 'object' type)
  • 'Compared values have no visual difference.' if the arguments have either referential identity according to Object.is method or same serialization according to the pretty-format package
  • null if either argument is a so-called asymmetric matcher in Jasmine or Jest

Usage of diffStringsUnified

Given strings, diffStringsUnified(a, b, options?) does the following:

  1. compare the strings character-by-character using the diff-sequences package
  2. clean up small (often coincidental) common substrings, also known as chaff
  3. format the changed or common lines using the chalk package

Although the function is mainly for multiline strings, it compares any strings.

Write either of the following:

  • const {diffStringsUnified} = require('jest-diff'); in CommonJS modules
  • import {diffStringsUnified} from 'jest-diff'; in ECMAScript modules

Example of diffStringsUnified

const a = 'common\nchanged from';
const b = 'common\nchanged to';

const difference = diffStringsUnified(a, b);

The returned string consists of:

  • annotation lines: describe the two change indicators with labels, and a blank line
  • comparison lines: similar to “unified” view on GitHub, and changed substrings have inverse foreground and background colors (that is, from has white-on-green and to has white-on-red, which the following example does not show)
- Expected
+ Received

  common
- changed from
+ changed to

Performance of diffStringsUnified

To get the benefit of changed substrings within the comparison lines, a character-by-character comparison has a higher computational cost (in time and space) than a line-by-line comparison.

If the input strings can have arbitrary length, we recommend that the calling code set a limit, beyond which splits the strings, and then calls diffLinesUnified instead. For example, Jest falls back to line-by-line comparison if either string has length greater than 20K characters.

Usage of diffLinesUnified

Given arrays of strings, diffLinesUnified(aLines, bLines, options?) does the following:

  1. compare the arrays line-by-line using the diff-sequences package
  2. format the changed or common lines using the chalk package

You might call this function when strings have been split into lines and you do not need to see changed substrings within lines.

Example of diffLinesUnified

const aLines = ['delete', 'common', 'changed from'];
const bLines = ['common', 'changed to', 'insert'];

const difference = diffLinesUnified(aLines, bLines);
- Expected
+ Received

- delete
  common
- changed from
+ changed to
+ insert

Edge cases of diffLinesUnified or diffStringsUnified

Here are edge cases for arguments and return values:

  • both a and b are empty strings: no comparison lines
  • only a is empty string: all comparison lines have bColor and bIndicator (see Options)
  • only b is empty string: all comparison lines have aColor and aIndicator (see Options)
  • a and b are equal non-empty strings: all comparison lines have commonColor and commonIndicator (see Options)

Usage of diffLinesUnified2

Given two pairs of arrays of strings, diffLinesUnified2(aLinesDisplay, bLinesDisplay, aLinesCompare, bLinesCompare, options?) does the following:

  1. compare the pair of Compare arrays line-by-line using the diff-sequences package
  2. format the corresponding lines in the pair of Display arrays using the chalk package

Jest calls this function to consider lines as common instead of changed if the only difference is indentation.

You might call this function for case insensitive or Unicode equivalence comparison of lines.

Example of diffLinesUnified2

import {format} from 'pretty-format';

const a = {
  text: 'Ignore indentation in serialized object',
  time: '2019-09-19T12:34:56.000Z',
  type: 'CREATE_ITEM',
};
const b = {
  payload: {
    text: 'Ignore indentation in serialized object',
    time: '2019-09-19T12:34:56.000Z',
  },
  type: 'CREATE_ITEM',
};

const difference = diffLinesUnified2(
  // serialize with indentation to display lines
  format(a).split('\n'),
  format(b).split('\n'),
  // serialize without indentation to compare lines
  format(a, {indent: 0}).split('\n'),
  format(b, {indent: 0}).split('\n'),
);

The text and time properties are common, because their only difference is indentation:

- Expected
+ Received

  Object {
+   payload: Object {
      text: 'Ignore indentation in serialized object',
      time: '2019-09-19T12:34:56.000Z',
+   },
    type: 'CREATE_ITEM',
  }

The preceding example illustrates why (at least for indentation) it seems more intuitive that the function returns the common line from the bLinesDisplay array instead of from the aLinesDisplay array.

Usage of diffStringsRaw

Given strings and a boolean option, diffStringsRaw(a, b, cleanup) does the following:

  1. compare the strings character-by-character using the diff-sequences package
  2. optionally clean up small (often coincidental) common substrings, also known as chaff

Because diffStringsRaw returns the difference as data instead of a string, you can format it as your application requires (for example, enclosed in HTML markup for browser instead of escape sequences for console).

The returned array describes substrings as instances of the Diff class, which calling code can access like array tuples:

The value at index 0 is one of the following:

valuenamed exportdescription
0DIFF_EQUALin a and in b
-1DIFF_DELETEin a but not in b
1DIFF_INSERTin b but not in a

The value at index 1 is a substring of a or b or both.

Example of diffStringsRaw with cleanup

const diffs = diffStringsRaw('changed from', 'changed to', true);
idiffs[i][0]diffs[i][1]
00'changed '
1-1'from'
21'to'

Example of diffStringsRaw without cleanup

const diffs = diffStringsRaw('changed from', 'changed to', false);
idiffs[i][0]diffs[i][1]
00'changed '
1-1'fr'
21't'
30'o'
4-1'm'

Advanced import for diffStringsRaw

Here are all the named imports that you might need for the diffStringsRaw function:

  • const {DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, Diff, diffStringsRaw} = require('jest-diff'); in CommonJS modules
  • import {DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, Diff, diffStringsRaw} from 'jest-diff'; in ECMAScript modules

To write a formatting function, you might need the named constants (and Diff in TypeScript annotations).

If you write an application-specific cleanup algorithm, then you might need to call the Diff constructor:

const diffCommon = new Diff(DIFF_EQUAL, 'changed ');
const diffDelete = new Diff(DIFF_DELETE, 'from');
const diffInsert = new Diff(DIFF_INSERT, 'to');

Usage of diffLinesRaw

Given arrays of strings, diffLinesRaw(aLines, bLines) does the following:

  • compare the arrays line-by-line using the diff-sequences package

Because diffLinesRaw returns the difference as data instead of a string, you can format it as your application requires.

Example of diffLinesRaw

const aLines = ['delete', 'common', 'changed from'];
const bLines = ['common', 'changed to', 'insert'];

const diffs = diffLinesRaw(aLines, bLines);
idiffs[i][0]diffs[i][1]
0-1'delete'
10'common'
2-1'changed from'
31'changed to'
41'insert'

Edge case of diffLinesRaw

If you call string.split('\n') for an empty string:

  • the result is [''] an array which contains an empty string
  • instead of [] an empty array

Depending of your application, you might call diffLinesRaw with either array.

Example of split method

import {diffLinesRaw} from 'jest-diff';

const a = 'non-empty string';
const b = '';

const diffs = diffLinesRaw(a.split('\n'), b.split('\n'));
idiffs[i][0]diffs[i][1]
0-1'non-empty string'
11''

Which you might format as follows:

- Expected  - 1
+ Received  + 1

- non-empty string
+

Example of splitLines0 function

For edge case behavior like the diffLinesUnified function, you might define a splitLines0 function, which given an empty string, returns [] an empty array:

export const splitLines0 = string =>
  string.length === 0 ? [] : string.split('\n');
import {diffLinesRaw} from 'jest-diff';

const a = '';
const b = 'line 1\nline 2\nline 3';

const diffs = diffLinesRaw(a.split('\n'), b.split('\n'));
idiffs[i][0]diffs[i][1]
01'line 1'
11'line 2'
21'line 3'

Which you might format as follows:

- Expected  - 0
+ Received  + 3

+ line 1
+ line 2
+ line 3

In contrast to the diffLinesRaw function, the diffLinesUnified and diffLinesUnified2 functions automatically convert array arguments computed by string split method, so callers do not need a splitLine0 function.

Options

The default options are for the report when an assertion fails from the expect package used by Jest.

For other applications, you can provide an options object as a third argument:

  • diff(a, b, options)
  • diffStringsUnified(a, b, options)
  • diffLinesUnified(aLines, bLines, options)
  • diffLinesUnified2(aLinesDisplay, bLinesDisplay, aLinesCompare, bLinesCompare, options)

Properties of options object

namedefault
aAnnotation'Expected'
aColorchalk.green
aIndicator'-'
bAnnotation'Received'
bColorchalk.red
bIndicator'+'
changeColorchalk.inverse
changeLineTrailingSpaceColorstring => string
commonColorchalk.dim
commonIndicator' '
commonLineTrailingSpaceColorstring => string
compareKeysundefined
contextLines5
emptyFirstOrLastLinePlaceholder''
expandtrue
includeChangeCountsfalse
omitAnnotationLinesfalse
patchColorchalk.yellow

For more information about the options, see the following examples.

Example of options for labels

If the application is code modification, you might replace the labels:

const options = {
  aAnnotation: 'Original',
  bAnnotation: 'Modified',
};
- Original
+ Modified

  common
- changed from
+ changed to

The jest-diff package does not assume that the 2 labels have equal length.

Example of options for colors of changed lines

For consistency with most diff tools, you might exchange the colors:

import chalk = require('chalk');

const options = {
  aColor: chalk.red,
  bColor: chalk.green,
};

Example of option for color of changed substrings

Although the default inverse of foreground and background colors is hard to beat for changed substrings within lines, especially because it highlights spaces, if you want bold font weight on yellow background color:

import chalk = require('chalk');

const options = {
  changeColor: chalk.bold.bgYellowBright,
};

Example of option to format trailing spaces

Because diff() does not display substring differences within lines, formatting can help you see when lines differ by the presence or absence of trailing spaces found by /\s+$/ regular expression.

  • If change lines have a background color, then you can see trailing spaces.
  • If common lines have default dim color, then you cannot see trailing spaces. You might want yellowish background color to see them.
const options = {
  aColor: chalk.rgb(128, 0, 128).bgRgb(255, 215, 255), // magenta
  bColor: chalk.rgb(0, 95, 0).bgRgb(215, 255, 215), // green
  commonLineTrailingSpaceColor: chalk.bgYellow,
};

The value of a Color option is a function, which given a string, returns a string.

If you want to replace trailing spaces with middle dot characters:

const replaceSpacesWithMiddleDot = string => '·'.repeat(string.length);

const options = {
  changeLineTrailingSpaceColor: replaceSpacesWithMiddleDot,
  commonLineTrailingSpaceColor: replaceSpacesWithMiddleDot,
};

If you need the TypeScript type of a Color option:

import {DiffOptionsColor} from 'jest-diff';

Example of options for no colors

To store the difference in a file without escape codes for colors, provide an identity function:

const noColor = string => string;

const options = {
  aColor: noColor,
  bColor: noColor,
  changeColor: noColor,
  commonColor: noColor,
  patchColor: noColor,
};

Example of options for indicators

For consistency with the diff command, you might replace the indicators:

const options = {
  aIndicator: '<',
  bIndicator: '>',
};

The jest-diff package assumes (but does not enforce) that the 3 indicators have equal length.

Example of options to limit common lines

By default, the output includes all common lines.

To emphasize the changes, you might limit the number of common “context” lines:

const options = {
  contextLines: 1,
  expand: false,
};

A patch mark like @@ -12,7 +12,9 @@ accounts for omitted common lines.

Example of option for color of patch marks

If you want patch marks to have the same dim color as common lines:

import chalk = require('chalk');

const options = {
  expand: false,
  patchColor: chalk.dim,
};

Example of option to include change counts

To display the number of changed lines at the right of annotation lines:

const a = ['common', 'changed from'];
const b = ['common', 'changed to', 'insert'];

const options = {
  includeChangeCounts: true,
};

const difference = diff(a, b, options);
- Expected  - 1
+ Received  + 2

  Array [
    "common",
-   "changed from",
+   "changed to",
+   "insert",
  ]

Example of option to omit annotation lines

To display only the comparison lines:

const a = 'common\nchanged from';
const b = 'common\nchanged to';

const options = {
  omitAnnotationLines: true,
};

const difference = diffStringsUnified(a, b, options);
  common
- changed from
+ changed to

Example of option for empty first or last lines

If the first or last comparison line is empty, because the content is empty and the indicator is a space, you might not notice it.

The replacement option is a string whose default value is '' empty string.

Because Jest trims the report when a matcher fails, it deletes an empty last line.

Therefore, Jest uses as placeholder the downwards arrow with corner leftwards:

const options = {
  emptyFirstOrLastLinePlaceholder: '↵', // U+21B5
};

If a content line is empty, then the corresponding comparison line is automatically trimmed to remove the margin space (represented as a middle dot below) for the default indicators:

Indicatoruntrimmedtrimmed
aIndicator'-·''-'
bIndicator'+·''+'
commonIndicator' ·'''

Example of option for sorting object keys

When two objects are compared their keys are printed in alphabetical order by default. If this was not the original order of the keys the diff becomes harder to read as the keys are not in their original position.

Use compareKeys to pass a function which will be used when sorting the object keys.

const a = {c: 'c', b: 'b1', a: 'a'};
const b = {c: 'c', b: 'b2', a: 'a'};

const options = {
  // The keys will be in their original order
  compareKeys: () => 0,
};

const difference = diff(a, b, options);
- Expected
+ Received

  Object {
    "c": "c",
-   "b": "b1",
+   "b": "b2",
    "a": "a",
  }

Depending on the implementation of compareKeys any sort order can be used.

const a = {c: 'c', b: 'b1', a: 'a'};
const b = {c: 'c', b: 'b2', a: 'a'};

const options = {
  // The keys will be in reverse order
  compareKeys: (a, b) => (a > b ? -1 : 1),
};

const difference = diff(a, b, options);
- Expected
+ Received

  Object {
    "a": "a",
-   "b": "b1",
+   "b": "b2",
    "c": "c",
  }

FAQs

Last updated on 25 Apr 2022

Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc