Product
Introducing Enhanced Alert Actions and Triage Functionality
Socket now supports four distinct alert actions instead of the previous two, and alert triaging allows users to override the actions taken for all individual alerts.
jest-diff
Advanced tools
Package description
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.
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));
Deep-diff is a library that provides a detailed analysis of differences between any two JavaScript objects. It is more granular than jest-diff as it provides more detailed information about the type of change (edit, delete, add), which can be useful for more complex diffing needs.
The 'diff' package is another popular choice for computing differences between texts. It is not limited to JavaScript objects and can handle strings effectively, making it suitable for applications like text editors or any scenario where text comparison is needed. Unlike jest-diff, it does not provide a structured view for object differences.
Changelog
28.0.0
[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)[*]
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)[*]
[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)[jest-haste-map]
[BREAKING] Default to node
crawler over shelling out to find
if watchman
is not enabled (#12320)Readme
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.To add this package as a dependency of a project, run either of the following commands:
npm install jest-diff
yarn add jest-diff
diff()
Given JavaScript values, diff(a, b, options?)
does the following:
pretty-format
packagediff-sequences
packagechalk
packageTo use this function, write either of the following:
const {diff} = require('jest-diff');
in CommonJS modulesimport {diff} from 'jest-diff';
in ECMAScript modulesdiff()
const a = ['delete', 'common', 'changed from'];
const b = ['common', 'changed to', 'insert'];
const difference = diff(a, b);
The returned string consists of:
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",
]
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
packagenull
if either argument is a so-called asymmetric matcher in Jasmine or JestGiven strings, diffStringsUnified(a, b, options?)
does the following:
diff-sequences
packagechalk
packageAlthough the function is mainly for multiline strings, it compares any strings.
Write either of the following:
const {diffStringsUnified} = require('jest-diff');
in CommonJS modulesimport {diffStringsUnified} from 'jest-diff';
in ECMAScript modulesconst a = 'common\nchanged from';
const b = 'common\nchanged to';
const difference = diffStringsUnified(a, b);
The returned string consists of:
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
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.
Given arrays of strings, diffLinesUnified(aLines, bLines, options?)
does the following:
diff-sequences
packagechalk
packageYou might call this function when strings have been split into lines and you do not need to see changed substrings within lines.
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
Here are edge cases for arguments and return values:
a
and b
are empty strings: no comparison linesa
is empty string: all comparison lines have bColor
and bIndicator
(see Options)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)Given two pairs of arrays of strings, diffLinesUnified2(aLinesDisplay, bLinesDisplay, aLinesCompare, bLinesCompare, options?)
does the following:
Compare
arrays line-by-line using the diff-sequences
packageDisplay
arrays using the chalk
packageJest 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.
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.
Given strings and a boolean option, diffStringsRaw(a, b, cleanup)
does the following:
diff-sequences
packageBecause 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:
value | named export | description |
---|---|---|
0 | DIFF_EQUAL | in a and in b |
-1 | DIFF_DELETE | in a but not in b |
1 | DIFF_INSERT | in b but not in a |
The value at index 1
is a substring of a
or b
or both.
const diffs = diffStringsRaw('changed from', 'changed to', true);
i | diffs[i][0] | diffs[i][1] |
---|---|---|
0 | 0 | 'changed ' |
1 | -1 | 'from' |
2 | 1 | 'to' |
const diffs = diffStringsRaw('changed from', 'changed to', false);
i | diffs[i][0] | diffs[i][1] |
---|---|---|
0 | 0 | 'changed ' |
1 | -1 | 'fr' |
2 | 1 | 't' |
3 | 0 | 'o' |
4 | -1 | 'm' |
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 modulesimport {DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, Diff, diffStringsRaw} from 'jest-diff';
in ECMAScript modulesTo 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');
Given arrays of strings, diffLinesRaw(aLines, bLines)
does the following:
diff-sequences
packageBecause diffLinesRaw
returns the difference as data instead of a string, you can format it as your application requires.
const aLines = ['delete', 'common', 'changed from'];
const bLines = ['common', 'changed to', 'insert'];
const diffs = diffLinesRaw(aLines, bLines);
i | diffs[i][0] | diffs[i][1] |
---|---|---|
0 | -1 | 'delete' |
1 | 0 | 'common' |
2 | -1 | 'changed from' |
3 | 1 | 'changed to' |
4 | 1 | 'insert' |
If you call string.split('\n')
for an empty string:
['']
an array which contains an empty string[]
an empty arrayDepending of your application, you might call diffLinesRaw
with either array.
import {diffLinesRaw} from 'jest-diff';
const a = 'non-empty string';
const b = '';
const diffs = diffLinesRaw(a.split('\n'), b.split('\n'));
i | diffs[i][0] | diffs[i][1] |
---|---|---|
0 | -1 | 'non-empty string' |
1 | 1 | '' |
Which you might format as follows:
- Expected - 1
+ Received + 1
- non-empty string
+
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'));
i | diffs[i][0] | diffs[i][1] |
---|---|---|
0 | 1 | 'line 1' |
1 | 1 | 'line 2' |
2 | 1 | '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.
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)
name | default |
---|---|
aAnnotation | 'Expected' |
aColor | chalk.green |
aIndicator | '-' |
bAnnotation | 'Received' |
bColor | chalk.red |
bIndicator | '+' |
changeColor | chalk.inverse |
changeLineTrailingSpaceColor | string => string |
commonColor | chalk.dim |
commonIndicator | ' ' |
commonLineTrailingSpaceColor | string => string |
compareKeys | undefined |
contextLines | 5 |
emptyFirstOrLastLinePlaceholder | '' |
expand | true |
includeChangeCounts | false |
omitAnnotationLines | false |
patchColor | chalk.yellow |
For more information about the options, see the following examples.
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.
For consistency with most diff tools, you might exchange the colors:
import chalk = require('chalk');
const options = {
aColor: chalk.red,
bColor: chalk.green,
};
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,
};
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.
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';
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,
};
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.
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.
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,
};
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",
]
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
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:
Indicator | untrimmed | trimmed |
---|---|---|
aIndicator | '-·' | '-' |
bIndicator | '+·' | '+' |
commonIndicator | ' ·' | '' |
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
Display differences clearly so people can review changes confidently.
The npm package jest-diff receives a total of 34,667,666 weekly downloads. As such, jest-diff popularity was classified as popular.
We found that jest-diff demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers collaborating on the project.
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.
Product
Socket now supports four distinct alert actions instead of the previous two, and alert triaging allows users to override the actions taken for all individual alerts.
Security News
Polyfill.io has been serving malware for months via its CDN, after the project's open source maintainer sold the service to a company based in China.
Security News
OpenSSF is warning open source maintainers to stay vigilant against reputation farming on GitHub, where users artificially inflate their status by manipulating interactions on closed issues and PRs.