pretty-format

Stringify any JavaScript value.

Installation

sh $ yarn add pretty-format

Usage

js const {format: prettyFormat} = require('pretty-format'); // CommonJS

js import {format as prettyFormat} from 'pretty-format'; // ES2015 modules

```js const val = {object: {}}; val.circularReference = val; val[Symbol('foo')] = 'foo'; val.map = new Map([['prop', 'value']]); val.array = [-0, Infinity, NaN];

console.log(prettyFormat(val)); / Object { "array": Array [ -0, Infinity, NaN, ], "circularReference": [Circular], "map": Map { "prop" => "value", }, "object": Object {}, Symbol(foo): "foo", } / ```

Usage with options

```js function onClick() {}

console.log(prettyFormat(onClick)); / [Function onClick] /

const options = { printFunctionName: false, }; console.log(prettyFormat(onClick, options)); / [Function] / ```

| key | type | default | description | | :-------------------- | :--------------- | :---------- | :-------------------------------------------------------------------------------------- | | callToJSON | boolean | true | call toJSON method (if it exists) on objects | | compareKeys | function\|null | undefined | compare function used when sorting object keys, null can be used to skip over sorting | | escapeRegex | boolean | false | escape special characters in regular expressions | | escapeString | boolean | true | escape special characters in strings | | highlight | boolean | false | highlight syntax with colors in terminal (some plugins) | | indent | number | 2 | spaces in each level of indentation | | maxDepth | number | Infinity | levels to print in arrays, objects, elements, and so on | | maxWidth | number | Infinity | number of elements to print in arrays, sets, and so on | | min | boolean | false | minimize added space: no indentation nor line breaks | | plugins | array | [] | plugins to serialize application-specific data types | | printBasicPrototype | boolean | false | print the prototype for plain objects and arrays | | printFunctionName | boolean | true | include or omit the name of a function | | theme | object | | colors to highlight syntax in terminal |

Property values of theme are from ansi-styles colors

js const DEFAULT_THEME = { comment: 'gray', content: 'reset', prop: 'yellow', tag: 'cyan', value: 'green', };

Usage with plugins

The pretty-format package provides some built-in plugins, including:

```js // CommonJS const React = require('react'); const renderer = require('react-test-renderer'); const {format: prettyFormat, plugins} = require('pretty-format');

const {ReactElement, ReactTestComponent} = plugins; ```

```js // ES2015 modules and destructuring assignment import React from 'react'; import renderer from 'react-test-renderer'; import {plugins, format as prettyFormat} from 'pretty-format';

const {ReactElement, ReactTestComponent} = plugins; ```

```js const onClick = () => {}; const element = React.createElement('button', {onClick}, 'Hello World');

const formatted1 = prettyFormat(element, { plugins: [ReactElement], printFunctionName: false, }); const formatted2 = prettyFormat(renderer.create(element).toJSON(), { plugins: [ReactTestComponent], printFunctionName: false, }); /* <button onClick=[Function]

Hello World */ ```

Usage in Jest

For snapshot tests, Jest uses pretty-format with options that include some of its built-in plugins. For this purpose, plugins are also known as snapshot serializers.

To serialize application-specific data types, you can add modules to devDependencies of a project, and then:

In an individual test file, you can add a module as follows. It precedes any modules from Jest configuration.

```js import serializer from 'my-serializer-module'; expect.addSnapshotSerializer(serializer);

// tests which have expect(value).toMatchSnapshot() assertions ```

For all test files, you can specify modules in Jest configuration. They precede built-in plugins for React, HTML, and Immutable.js data types. For example, in a package.json file:

json { "jest": { "snapshotSerializers": ["my-serializer-module"] } }

Writing plugins

A plugin is a JavaScript object.

If options has a plugins array: for the first plugin whose test(val) method returns a truthy value, then prettyFormat(val, options) returns the result from either:

test

Write test so it can receive val argument of any type. To serialize objects which have certain properties, then a guarded expression like val != null && … or more concise val && … prevents the following errors:

For example, test method of built-in ReactElement plugin:

js const elementSymbol = Symbol.for('react.element'); const test = val => val && val.$$typeof === elementSymbol;

Pay attention to efficiency in test because pretty-format calls it often.

serialize

The improved interface is available in version 21 or later.

Write serialize to return a string, given the arguments:

config

| key | type | description | | :------------------ | :--------------- | :-------------------------------------------------------------------------------------- | | callToJSON | boolean | call toJSON method (if it exists) on objects | | compareKeys | function\|null | compare function used when sorting object keys, null can be used to skip over sorting | | colors | Object | escape codes for colors to highlight syntax | | escapeRegex | boolean | escape special characters in regular expressions | | escapeString | boolean | escape special characters in strings | | indent | string | spaces in each level of indentation | | maxDepth | number | levels to print in arrays, objects, elements, and so on | | min | boolean | minimize added space: no indentation nor line breaks | | plugins | array | plugins to serialize application-specific data types | | printFunctionName | boolean | include or omit the name of a function | | spacingInner | string | spacing to separate items in a list | | spacingOuter | string | spacing to enclose a list of items |

Each property of colors in config corresponds to a property of theme in options:

Some properties in config are derived from min in options:

Example of serialize and test

This plugin is a pattern you can apply to serialize composite data types. Side note: pretty-format does not need a plugin to serialize arrays.

```js // We reused more code when we factored out a function for child items // that is independent of depth, name, and enclosing punctuation (see below). const SEPARATOR = ','; function serializeItems(items, config, indentation, depth, refs, printer) { if (items.length === 0) { return ''; } const indentationItems = indentation + config.indent; return ( config.spacingOuter + items .map( item => indentationItems + printer(item, config, indentationItems, depth, refs), // callback ) .join(SEPARATOR + config.spacingInner) + (config.min ? '' : SEPARATOR) + // following the last item config.spacingOuter + indentation ); }

const plugin = { test(val) { return Array.isArray(val); }, serialize(array, config, indentation, depth, refs, printer) { const name = array.constructor.name; return ++depth > config.maxDepth ? [${name}] : ${config.min ? '' :${name} }[${serializeItems( array, config, indentation, depth, refs, printer, )}]; }, }; ```

js const val = { filter: 'completed', items: [ { text: 'Write test', completed: true, }, { text: 'Write serialize', completed: true, }, ], };

js console.log( prettyFormat(val, { plugins: [plugin], }), ); /* Object { "filter": "completed", "items": Array [ Object { "completed": true, "text": "Write test", }, Object { "completed": true, "text": "Write serialize", }, ], } */

js console.log( prettyFormat(val, { indent: 4, plugins: [plugin], }), ); /* Object { "filter": "completed", "items": Array [ Object { "completed": true, "text": "Write test", }, Object { "completed": true, "text": "Write serialize", }, ], } */

js console.log( prettyFormat(val, { maxDepth: 1, plugins: [plugin], }), ); /* Object { "filter": "completed", "items": [Array], } */

js console.log( prettyFormat(val, { min: true, plugins: [plugin], }), ); /* {"filter": "completed", "items": [{"completed": true, "text": "Write test"}, {"completed": true, "text": "Write serialize"}]} */

print

The original interface is adequate for plugins:

Write print to return a string, given the arguments:

The 3 properties of config are min in options and:

Each property of colors corresponds to a property of theme in options:

Example of print and test

This plugin prints functions with the number of named arguments excluding rest argument.

js const plugin = { print(val) { return `[Function ${val.name || 'anonymous'} ${val.length}]`; }, test(val) { return typeof val === 'function'; }, };

```js const val = { onClick(event) {}, render() {}, };

prettyFormat(val, { plugins: [plugin], }); / Object { "onClick": [Function onClick 1], "render": [Function render 0], } /

prettyFormat(val); / Object { "onClick": [Function onClick], "render": [Function render], } / ```

This plugin ignores the printFunctionName option. That limitation of the original print interface is a reason to use the improved serialize interface, described above.

```js prettyFormat(val, { plugins: [pluginOld], printFunctionName: false, }); / Object { "onClick": [Function onClick 1], "render": [Function render 0], } /

prettyFormat(val, { printFunctionName: false, }); / Object { "onClick": [Function], "render": [Function], } / ```