Turn a ReactElement into the corresponding JSX string
Permalink
Failed to load latest commit information.
src test(reactElementToJsxString): move owner test case to index.spec.js Oct 9, 2018
tests test(reactElementToJsxString): move owner test case to index.spec.js Oct 9, 2018
.babelrc chrore(dependency): Remove `lodash` as unused dependency Oct 30, 2017
.eslintignore qa(formatting): Create a prettier config file to allow IDE to guess t… Dec 14, 2017
.eslintrc.js Rewrote parsing (#107) Jul 20, 2017
.flowconfig chore(deps): Update dependency flow-bin to version 0.51.0 Oct 1, 2017
.gitignore Rewrote parsing (#107) Jul 20, 2017
.npmignore fix(flow): export flow definitions in the released bundle and fix the… Jul 24, 2017
.prettierignore qa(formatting): Create a prettier config file to allow IDE to guess t… Dec 14, 2017
.prettierrc qa(formatting): Create a prettier config file to allow IDE to guess t… Dec 14, 2017
.travis.yml fix(build): missing babel helpers, true esm modules, simplify (#290) Jun 20, 2018
CHANGELOG.md 14.0.2 Oct 10, 2018
LICENSE First commit Oct 15, 2015
README.md feature(format): support react fragment (#265) Mar 14, 2018
commitlint.config.js test(logs): Configure commintlint status checks on PR submission (#231) Nov 7, 2017
package.json chore(deps): update dependency eslint-plugin-jest to v21.25.0 Oct 14, 2018
release.sh chore(release): fix script (#291) Jun 20, 2018
renovate.json Create renovate.json Jan 19, 2018
rollup.config.js fix(build): missing babel helpers, true esm modules, simplify (#290) Jun 20, 2018
yarn.lock chore(deps): update dependency eslint-plugin-jest to v21.25.0 Oct 14, 2018

README.md

react-element-to-jsx-string

Version Build Status License Downloads

Turn a ReactElement into the corresponding JSX string.

Useful for unit testing and any other need you may think of.

Features:

  • supports nesting and deep nesting like <div a={{b: {c: {d: <div />}}}} />
  • props: supports string, number, function (inlined as prop={function noRefCheck() {}}), object, ReactElement (inlined), regex, booleans (with or without shorthand syntax), ...
  • order props alphabetically
  • sort object keys in a deterministic order (o={{a: 1, b:2}} === o={{b:2, a:1}})
  • handle ref and key attributes, they are always on top of props
  • React's documentation indent style for JSX

Table of Contents generated with DocToc

Setup

yarn add react-element-to-jsx-string [--dev]

Usage

import React from 'react';
import reactElementToJSXString from 'react-element-to-jsx-string';

console.log(reactElementToJSXString(<div a="1" b="2">Hello, world!</div>));
// <div
//   a="1"
//   b="2"
// >
//   Hello, world!
// </div>

API

reactElementToJSXString(ReactElement[, options])

options.displayName: function(ReactElement)

Provide a different algorithm in charge of finding the right display name (name of the underlying Class) for your element.

Just return the name you want for the provided ReactElement, as a string.

options.filterProps: array, default []

Provide an array of props to filter for every component. For example ['key'] will suppress the key="" prop from being added.

options.showDefaultProps: boolean, default true

If true, default props shown.

If false, default props are omitted unless they differ from from the default value.

options.showFunctions: boolean, default false

If true, functions bodies are shown.

If false, functions bodies are replaced with function noRefCheck() {}.

options.functionValue: function, default (fn) => fn

Allows you to override the default formatting of function values.

functionValue receives the original function reference as input and should send any value as output.

options.tabStop: number, default 2

Provide a different number of columns for indentation.

options.useBooleanShorthandSyntax: boolean, default true

If true, Boolean prop values will be omitted for shorthand syntax.

If false, Boolean prop values will be explicitly output like prop={true} and prop={false}

options.maxInlineAttributesLineLength: number, default undefined

Allows to render multiple attributes on the same line and control the behaviour.

You can provide the max number of characters to render inline with the tag name. If the number of characters on the line (including spacing and the tag name) exceeds this number, then all attributes will be rendered on a separate line. The default value of this option is undefined. If this option is undefined then if there is more than one attribute on an element, they will render on their own line. Note: Objects passed as attribute values are always rendered on multiple lines

options.sortProps: boolean, default true

Either to sort or not props. If you use this lib to make some isomorphic rendering you should set it to false, otherwise this would lead to react invalid checksums as the prop order is part of react isomorphic checksum algorithm.

options.useFragmentShortSyntax: boolean, default true

If true, fragment will be represented with the JSX short syntax <>...</> (when possible).

If false, fragment will always be represented with the JSX explicit syntax <React.Fragment>...</React.Fragment>.

According to the specs:

  • A keyed fragment will always use the explicit syntax: <React.Fragment key={...}>...</React.Fragment>
  • An empty fragment will always use the explicit syntax: <React.Fragment />

Note: to use fragment you must use React >= 16.2

Environment requirements

The environment you use to use react-element-to-jsx-string should have ES2015 support.

Use the Babel polyfill or any other method that will make you environment behave like an ES2015 environment.

Test

yarn test
yarn test:watch

Build

yarn build
yarn build:watch

Release

Decide if this is a patch, minor or major release, look at http://semver.org/

npm run release [major|minor|patch|x.x.x]

Thanks

alexlande/react-to-jsx was a good source of inspiration.

We built our own module because we had some needs like ordering props in alphabetical order.