react-element-to-jsx-string
Advanced tools
Comparing version
@@ -0,1 +1,6 @@ | ||
<a name="3.1.1"></a> | ||
## [3.1.1](https://github.com/algolia/react-element-to-jsx-string/compare/v3.1.0...v3.1.1) (2016-07-12) | ||
<a name="3.1.0"></a> | ||
@@ -2,0 +7,0 @@ # [3.1.0](https://github.com/algolia/react-element-to-jsx-string/compare/v3.0.0...v3.1.0) (2016-06-28) |
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports['default'] = reactElementToJSXString; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; | ||
exports.default = reactElementToJSXString; | ||
var _react = require('react'); | ||
@@ -36,6 +37,8 @@ | ||
var _lodashArrayFill = require('lodash/array/fill'); | ||
var _fill = require('lodash/array/fill'); | ||
var _lodashArrayFill2 = _interopRequireDefault(_lodashArrayFill); | ||
var _fill2 = _interopRequireDefault(_fill); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function reactElementToJSXString(ReactElement) { | ||
@@ -63,3 +66,3 @@ var _ref = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; | ||
} else if (!(0, _reactAddonsTestUtils.isElement)(Element)) { | ||
throw new Error('react-element-to-jsx-string: Expected a ReactElement, ' + 'got `' + typeof Element + '`'); | ||
throw new Error('react-element-to-jsx-string: Expected a ReactElement,\ngot `' + (typeof Element === 'undefined' ? 'undefined' : _typeof(Element)) + '`'); | ||
} | ||
@@ -72,3 +75,3 @@ | ||
var attributes = []; | ||
var children = _react2['default'].Children.toArray(Element.props.children).filter(onlyMeaningfulChildren); | ||
var children = _react2.default.Children.toArray(Element.props.children).filter(onlyMeaningfulChildren); | ||
@@ -135,3 +138,3 @@ if (Element.ref !== null) { | ||
function formatProps(props, defaultProps) { | ||
var formated = Object.keys(props).filter(noChildren).filter(function (key) { | ||
var formatted = Object.keys(props).filter(noChildren).filter(function (key) { | ||
return noFalse(props[key]); | ||
@@ -141,8 +144,8 @@ }); | ||
if (!showDefaultProps) { | ||
formated = formated.filter(function (key, value) { | ||
return defaultProps[key] ? defaultProps[key] === value : true; | ||
formatted = formatted.filter(function (key) { | ||
return defaultProps[key] ? defaultProps[key] !== props[key] : true; | ||
}); | ||
} | ||
return formated.sort().map(function (propName) { | ||
return formatted.sort().map(function (propName) { | ||
return getJSXAttribute(propName, props[propName]); | ||
@@ -168,2 +171,4 @@ }); | ||
function formatValue(value) { | ||
var wrapper = '__reactElementToJSXString__Wrapper__'; | ||
if (typeof value === 'function') { | ||
@@ -179,5 +184,5 @@ return function noRefCheck() {}; | ||
// otherwise, the element would be surrounded by quotes: <div a={{b: '<div />'}} /> | ||
return '<__reactElementToJSXString__Wrapper__>' + toJSXString({ ReactElement: value, inline: true }) + '</__reactElementToJSXString__Wrapper__>'; | ||
} else if ((0, _isPlainObject2['default'])(value) || Array.isArray(value)) { | ||
return '<__reactElementToJSXString__Wrapper__>' + stringifyObject(value) + '</__reactElementToJSXString__Wrapper__>'; | ||
return '<' + wrapper + '>' + toJSXString({ ReactElement: value, inline: true }) + '</' + wrapper + '>'; | ||
} else if ((0, _isPlainObject2.default)(value) || Array.isArray(value)) { | ||
return '<' + wrapper + '>' + stringifyObject(value) + '</' + wrapper + '>'; | ||
} | ||
@@ -199,3 +204,4 @@ | ||
if (Object.keys(obj).length > 0 || obj.length > 0) { | ||
obj = (0, _traverse2['default'])(obj).map(function (value) { | ||
// eslint-disable-next-line array-callback-return | ||
obj = (0, _traverse2.default)(obj).map(function (value) { | ||
if ((0, _reactAddonsTestUtils.isElement)(value) || this.isLeaf) { | ||
@@ -206,6 +212,6 @@ this.update(formatValue(value)); | ||
obj = (0, _sortobject2['default'])(obj); | ||
obj = (0, _sortobject2.default)(obj); | ||
} | ||
return (0, _collapseWhiteSpace2['default'])((0, _stringifyObject2['default'])(obj)).replace(/{ /g, '{').replace(/ }/g, '}').replace(/\[ /g, '[').replace(/ \]/g, ']'); | ||
return (0, _collapseWhiteSpace2.default)((0, _stringifyObject2.default)(obj)).replace(/{ /g, '{').replace(/ }/g, '}').replace(/\[ /g, '[').replace(/ \]/g, ']'); | ||
} | ||
@@ -228,3 +234,3 @@ } | ||
if (typeof cur === 'number') { | ||
cur = '' + cur; | ||
cur = String(cur); | ||
} | ||
@@ -242,3 +248,3 @@ | ||
function spacer(times) { | ||
return (0, _lodashArrayFill2['default'])(new Array(times), ' ').join(''); | ||
return (0, _fill2.default)(new Array(times), ' ').join(''); | ||
} | ||
@@ -257,2 +263,1 @@ | ||
} | ||
module.exports = exports['default']; |
/* eslint-env mocha */ | ||
/* eslint react/no-multi-comp:0 */ | ||
/* eslint react/prop-types:0 */ | ||
/* eslint-disable react/no-multi-comp, react/prop-types */ | ||
@@ -22,22 +21,22 @@ import React from 'react'; | ||
describe(`reactElementToJSXString(ReactElement)`, () => { | ||
it(`reactElementToJSXString(<TestComponent/>)`, () => { | ||
describe('reactElementToJSXString(ReactElement)', () => { | ||
it('reactElementToJSXString(<TestComponent/>)', () => { | ||
expect( | ||
reactElementToJSXString(<TestComponent/>) | ||
).toEqual(`<TestComponent />`); | ||
).toEqual('<TestComponent />'); | ||
}); | ||
it(`reactElementToJSXString(<NamedStatelessComponent/>)`, () => { | ||
it('reactElementToJSXString(<NamedStatelessComponent/>)', () => { | ||
expect( | ||
reactElementToJSXString(<NamedStatelessComponent/>) | ||
).toEqual(`<NamedStatelessComponent />`); | ||
).toEqual('<NamedStatelessComponent />'); | ||
}); | ||
it(`reactElementToJSXString(<AnonymousStatelessComponent/>)`, () => { | ||
it('reactElementToJSXString(<AnonymousStatelessComponent/>)', () => { | ||
expect( | ||
reactElementToJSXString(<AnonymousStatelessComponent/>) | ||
).toEqual(`<No Display Name />`); | ||
).toEqual('<No Display Name />'); | ||
}); | ||
it(`reactElementToJSXString(<AnonymousStatelessComponent/>) with a displayName`, () => { | ||
it('reactElementToJSXString(<AnonymousStatelessComponent/>) with a displayName', () => { | ||
AnonymousStatelessComponent.displayName = 'I have a name!'; | ||
@@ -47,3 +46,3 @@ | ||
reactElementToJSXString(<AnonymousStatelessComponent/>) | ||
).toEqual(`<I have a name! />`); | ||
).toEqual('<I have a name! />'); | ||
@@ -53,63 +52,63 @@ delete AnonymousStatelessComponent.displayName; | ||
it(`reactElementToJSXString(React.createElement('div'))`, () => { | ||
it('reactElementToJSXString(React.createElement(\'div\'))', () => { | ||
expect( | ||
reactElementToJSXString(React.createElement('div')) | ||
).toEqual(`<div />`); | ||
).toEqual('<div />'); | ||
}); | ||
it(`reactElementToJSXString(<div/>)`, () => { | ||
it('reactElementToJSXString(<div/>)', () => { | ||
expect( | ||
reactElementToJSXString(<div/>) | ||
).toEqual(`<div />`); | ||
).toEqual('<div />'); | ||
}); | ||
it(`reactElementToJSXString(<div fn={() => {}}/>)`, () => { | ||
it('reactElementToJSXString(<div fn={() => {}}/>)', () => { | ||
expect( | ||
reactElementToJSXString(<div fn={() => {}}/>) | ||
).toEqual(`<div fn={function noRefCheck() {}} />`); | ||
).toEqual('<div fn={function noRefCheck() {}} />'); | ||
}); | ||
it(`reactElementToJSXString(<div fn={function hello(){}}/>)`, () => { | ||
it('reactElementToJSXString(<div fn={function hello(){}}/>)', () => { | ||
expect( | ||
reactElementToJSXString(<div fn={function hello() {}}/>) | ||
).toEqual(`<div fn={function noRefCheck() {}} />`); | ||
).toEqual('<div fn={function noRefCheck() {}} />'); | ||
}); | ||
it(`reactElementToJSXString(<div co={<div a="1" />} />)`, () => { | ||
it('reactElementToJSXString(<div co={<div a="1" />} />)', () => { | ||
expect( | ||
reactElementToJSXString(<div co={<div a="1" />}/>) | ||
).toEqual(`<div co={<div a="1" />} />`); | ||
).toEqual('<div co={<div a="1" />} />'); | ||
}); | ||
it(`reactElementToJSXString(<div re={/^Hello world$/} />)`, () => { | ||
it('reactElementToJSXString(<div re={/^Hello world$/} />)', () => { | ||
expect( | ||
reactElementToJSXString(<div re={/^Hello world$/}/>) | ||
).toEqual(`<div re={/^Hello world$/} />`); | ||
).toEqual('<div re={/^Hello world$/} />'); | ||
}); | ||
it(`reactElementToJSXString(<div int={8}/>)`, () => { | ||
it('reactElementToJSXString(<div int={8}/>)', () => { | ||
expect( | ||
reactElementToJSXString(<div int={8}/>) | ||
).toEqual(`<div int={8} />`); | ||
).toEqual('<div int={8} />'); | ||
}); | ||
it(`reactElementToJSXString(<div obj={{hello: 'world'}}/>)`, () => { | ||
it('reactElementToJSXString(<div obj={{hello: \'world\'}}/>)', () => { | ||
expect( | ||
reactElementToJSXString(<div obj={{hello: 'world'}}/>) | ||
).toEqual(`<div obj={{hello: 'world'}} />`); | ||
).toEqual('<div obj={{hello: \'world\'}} />'); | ||
}); | ||
it(`reactElementToJSXString(<div obj={{hello: [1, 2], world: {nested: true}}}/>)`, () => { | ||
it('reactElementToJSXString(<div obj={{hello: [1, 2], world: {nested: true}}}/>)', () => { | ||
expect( | ||
reactElementToJSXString(<div obj={{hello: [1, 2], world: {nested: true}}}/>) | ||
).toEqual(`<div obj={{hello: [1, 2], world: {nested: true}}} />`); | ||
).toEqual('<div obj={{hello: [1, 2], world: {nested: true}}} />'); | ||
}); | ||
it(`reactElementToJSXString(<div></div>)`, () => { | ||
it('reactElementToJSXString(<div></div>)', () => { | ||
expect( | ||
reactElementToJSXString(<div></div>) | ||
).toEqual(`<div />`); | ||
).toEqual('<div />'); | ||
}); | ||
it(`reactElementToJSXString(<div z="3" a="1" b="2"/>)`, () => { | ||
it('reactElementToJSXString(<div z="3" a="1" b="2"/>)', () => { | ||
/* eslint react/jsx-sort-props: 0 */ | ||
@@ -126,3 +125,3 @@ expect( | ||
it(`reactElementToJSXString(<div a="1">Hello</div>)`, () => { | ||
it('reactElementToJSXString(<div a="1">Hello</div>)', () => { | ||
expect( | ||
@@ -136,3 +135,3 @@ reactElementToJSXString(<div a="1">Hello</div>) | ||
it(`reactElementToJSXString(<div a="1" b="5">Hello</div>)`, () => { | ||
it('reactElementToJSXString(<div a="1" b="5">Hello</div>)', () => { | ||
expect( | ||
@@ -149,3 +148,3 @@ reactElementToJSXString(<div a="1" b="5">Hello</div>) | ||
it(`reactElementToJSXString(<div>Hello</div>)`, () => { | ||
it('reactElementToJSXString(<div>Hello</div>)', () => { | ||
expect( | ||
@@ -159,3 +158,3 @@ reactElementToJSXString(<div>Hello</div>) | ||
it(`reactElementToJSXString(<div><div>Hello</div></div>)`, () => { | ||
it('reactElementToJSXString(<div><div>Hello</div></div>)', () => { | ||
expect( | ||
@@ -171,3 +170,3 @@ reactElementToJSXString(<div><div>Hello</div></div>) | ||
it(`reactElementToJSXString(<div a="1" b="2"><div>Hello</div></div>)`, () => { | ||
it('reactElementToJSXString(<div a="1" b="2"><div>Hello</div></div>)', () => { | ||
expect( | ||
@@ -186,3 +185,3 @@ reactElementToJSXString(<div a="1" b="2"><div>Hello</div></div>) | ||
it(`reactElementToJSXString()`, () => { | ||
it('reactElementToJSXString()', () => { | ||
expect(() => { | ||
@@ -193,3 +192,3 @@ reactElementToJSXString(); | ||
it(`reactElementToJSXString(null)`, () => { | ||
it('reactElementToJSXString(null)', () => { | ||
expect(() => { | ||
@@ -200,3 +199,3 @@ reactElementToJSXString(null); | ||
it(`ignores object keys order (sortobject)`, () => { | ||
it('ignores object keys order (sortobject)', () => { | ||
expect( | ||
@@ -209,3 +208,3 @@ reactElementToJSXString(<div o={{a: 1, b: 2}}/>) | ||
it(`reactElementToJSXString(<div a={null} />`, () => { | ||
it('reactElementToJSXString(<div a={null} />', () => { | ||
expect( | ||
@@ -218,3 +217,3 @@ reactElementToJSXString(<div a={null} />) | ||
it(`reactElementToJSXString(<div a={undefined} />`, () => { | ||
it('reactElementToJSXString(<div a={undefined} />', () => { | ||
expect( | ||
@@ -227,28 +226,28 @@ reactElementToJSXString(<div a={undefined} />) | ||
it(`reactElementToJSXString(<div a={{b: function hello() {}}} />`, () => { | ||
it('reactElementToJSXString(<div a={{b: function hello() {}}} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={{b: function hello() {}}} />) | ||
).toEqual(`<div a={{b: function noRefCheck() {}}} />`); | ||
).toEqual('<div a={{b: function noRefCheck() {}}} />'); | ||
}); | ||
it(`reactElementToJSXString(<div a={{b: {c: {d: <div />, e: null}}}} />`, () => { | ||
it('reactElementToJSXString(<div a={{b: {c: {d: <div />, e: null}}}} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={{b: {c: {d: <div />, e: null}}}} />) | ||
).toEqual(`<div a={{b: {c: {d: <div />, e: null}}}} />`); | ||
).toEqual('<div a={{b: {c: {d: <div />, e: null}}}} />'); | ||
}); | ||
it(`reactElementToJSXString(<div a={{b: {}}} />`, () => { | ||
it('reactElementToJSXString(<div a={{b: {}}} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={{b: {}}} />) | ||
).toEqual(`<div a={{b: {}}} />`); | ||
).toEqual('<div a={{b: {}}} />'); | ||
}); | ||
it(`reactElementToJSXString(<div a={{}} />`, () => { | ||
it('reactElementToJSXString(<div a={{}} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={{}} />) | ||
).toEqual(`<div a={{}} />`); | ||
).toEqual('<div a={{}} />'); | ||
}); | ||
it(`reactElementToJSXString(<div><span /><span /></div>)`, () => { | ||
it('reactElementToJSXString(<div><span /><span /></div>)', () => { | ||
expect( | ||
@@ -262,3 +261,3 @@ reactElementToJSXString(<div><span /><span /></div>) | ||
it(`reactElementToJSXString(<div>foo<div /></div>)`, () => { | ||
it('reactElementToJSXString(<div>foo<div /></div>)', () => { | ||
expect( | ||
@@ -272,39 +271,39 @@ reactElementToJSXString(<div>foo<div /></div>) | ||
it(`reactElementToJSXString(<div a={[1, 2, 3, 4]} />`, () => { | ||
it('reactElementToJSXString(<div a={[1, 2, 3, 4]} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={[1, 2, 3, 4]} />) | ||
).toEqual(`<div a={[1, 2, 3, 4]} />`); | ||
).toEqual('<div a={[1, 2, 3, 4]} />'); | ||
}); | ||
it(`reactElementToJSXString(<div a={[1, 2, 3, 4]} />`, () => { | ||
it('reactElementToJSXString(<div a={[1, 2, 3, 4]} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={[{Hello: ', world!'}]} />) | ||
).toEqual(`<div a={[{Hello: ', world!'}]} />`); | ||
).toEqual('<div a={[{Hello: \', world!\'}]} />'); | ||
}); | ||
it(`reactElementToJSXString(<div a={[{}]} />`, () => { | ||
it('reactElementToJSXString(<div a={[{}]} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={[{}]} />) | ||
).toEqual(`<div a={[{}]} />`); | ||
).toEqual('<div a={[{}]} />'); | ||
}); | ||
it(`reactElementToJSXString(<div a={[]} />`, () => { | ||
it('reactElementToJSXString(<div a={[]} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={[]} />) | ||
).toEqual(`<div a={[]} />`); | ||
).toEqual('<div a={[]} />'); | ||
}); | ||
it(`reactElementToJSXString(<div a={[]} />`, () => { | ||
it('reactElementToJSXString(<div a={[]} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={[]} />) | ||
).toEqual(`<div a={[]} />`); | ||
).toEqual('<div a={[]} />'); | ||
}); | ||
it(`reactElementToJSXString(<div a={[<div><span /></div>]} />`, () => { | ||
it('reactElementToJSXString(<div a={[<div><span /></div>]} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={[<div><span /></div>]} />) | ||
).toEqual(`<div a={[<div><span /></div>]} />`); | ||
).toEqual('<div a={[<div><span /></div>]} />'); | ||
}); | ||
it(`reactElementToJSXString(decorator(<span />)`, () => { | ||
it('reactElementToJSXString(decorator(<span />)', () => { | ||
function myDecorator(ComposedComponent) { | ||
@@ -320,8 +319,8 @@ class MyDecorator extends React.Component { | ||
} | ||
MyDecorator.displayName = ComposedComponent.name + '-Decorated'; | ||
MyDecorator.displayName = `${ComposedComponent.name}-Decorated`; | ||
return MyDecorator; | ||
} | ||
var NestedSpan = myDecorator(<span />); | ||
var renderer = createRenderer(); | ||
const NestedSpan = myDecorator(<span />); | ||
const renderer = createRenderer(); | ||
renderer.render(<NestedSpan />); | ||
@@ -335,3 +334,3 @@ expect( | ||
it(`reactElementToJSXString(<div>Hello {this.props.name}</div>`, () => { | ||
it('reactElementToJSXString(<div>Hello {this.props.name}</div>', () => { | ||
class InlineProps extends React.Component { | ||
@@ -343,5 +342,5 @@ render() { | ||
let renderer = createRenderer(); | ||
const renderer = createRenderer(); | ||
renderer.render(<InlineProps name="John" />); | ||
let actualElement = renderer.getRenderOutput(); | ||
const actualElement = renderer.getRenderOutput(); | ||
expect(reactElementToJSXString(actualElement)) | ||
@@ -354,9 +353,9 @@ .toEqual( | ||
it(`reactElementToJSXString(<div a={[<div><span /></div>]} />`, () => { | ||
it('reactElementToJSXString(<div a={[<div><span /></div>]} />', () => { | ||
expect( | ||
reactElementToJSXString(<div a={[<div><span /></div>]} />) | ||
).toEqual(`<div a={[<div><span /></div>]} />`); | ||
).toEqual('<div a={[<div><span /></div>]} />'); | ||
}); | ||
it(`reactElementToJSXString(<div aprop="test" ref="yes" />`, () => { | ||
it('reactElementToJSXString(<div aprop="test" ref="yes" />', () => { | ||
expect( | ||
@@ -371,3 +370,3 @@ reactElementToJSXString(<div aprop="test" ref="yes" />) | ||
it(`reactElementToJSXString(<div aprop="a" ref="yes"><span ref="wee" zprop="z"/></div>`, () => { | ||
it('reactElementToJSXString(<div aprop="a" ref="yes"><span ref="wee" zprop="z"/></div>', () => { | ||
expect( | ||
@@ -387,3 +386,3 @@ reactElementToJSXString(<div aprop="a" ref="yes"><span ref="wee" zprop="z"/></div>) | ||
it(`reactElementToJSXString(<div aprop="test" key="yes" />`, () => { | ||
it('reactElementToJSXString(<div aprop="test" key="yes" />', () => { | ||
expect( | ||
@@ -398,23 +397,23 @@ reactElementToJSXString(<div aprop="test" key="yes" />) | ||
it(`reactElementToJSXString(<div>\\n {null}\\n</div>`, () => { | ||
let element = (<div> | ||
it('reactElementToJSXString(<div>\\n {null}\\n</div>', () => { | ||
const element = <div> | ||
{null} | ||
</div>); | ||
</div>; | ||
expect(reactElementToJSXString(element)).toEqual(`<div />`); | ||
expect(reactElementToJSXString(element)).toEqual('<div />'); | ||
}); | ||
it(`reactElementToJSXString(<div>{true}</div>)`, () => { | ||
it('reactElementToJSXString(<div>{true}</div>)', () => { | ||
expect( | ||
reactElementToJSXString(<div>{true}</div>) | ||
).toEqual(`<div />`); | ||
).toEqual('<div />'); | ||
}); | ||
it(`reactElementToJSXString(<div>{false}</div>)`, () => { | ||
it('reactElementToJSXString(<div>{false}</div>)', () => { | ||
expect( | ||
reactElementToJSXString(<div>{false}</div>) | ||
).toEqual(`<div />`); | ||
).toEqual('<div />'); | ||
}); | ||
it(`reactElementToJSXString(<div>{false}</div>)`, () => { | ||
it('reactElementToJSXString(<div>{false}</div>)', () => { | ||
expect( | ||
@@ -434,6 +433,6 @@ reactElementToJSXString(<div> | ||
</div>) | ||
).toEqual(`<div />`); | ||
).toEqual('<div />'); | ||
}); | ||
it(`reactElementToJSXString(<div> {false} </div>)`, () => { | ||
it('reactElementToJSXString(<div> {false} </div>)', () => { | ||
expect( | ||
@@ -444,9 +443,9 @@ reactElementToJSXString(<div> {false} </div>) | ||
it(`reactElementToJSXString(<div>{null}</div>)`, () => { | ||
it('reactElementToJSXString(<div>{null}</div>)', () => { | ||
expect( | ||
reactElementToJSXString(<div>{null}</div>) | ||
).toEqual(`<div />`); | ||
).toEqual('<div />'); | ||
}); | ||
it(`reactElementToJSXString(<div>{123}</div>)`, () => { | ||
it('reactElementToJSXString(<div>{123}</div>)', () => { | ||
expect( | ||
@@ -459,3 +458,3 @@ reactElementToJSXString(<div>{123}</div>) | ||
it(`reactElementToJSXString(<div>{''}</div>)`, () => { | ||
it('reactElementToJSXString(<div>{\'\'}</div>)', () => { | ||
expect( | ||
@@ -466,3 +465,3 @@ reactElementToJSXString(<div>{''}</div>) | ||
it(`reactElementToJSXString(<div>String with {1} js expression</div>)`, () => { | ||
it('reactElementToJSXString(<div>String with {1} js expression</div>)', () => { | ||
expect( | ||
@@ -475,8 +474,8 @@ reactElementToJSXString(<div>String with {1} js number</div>) | ||
it(`reactElementToJSXString(<TestComponent />, { displayName: toUpper })`, () => { | ||
it('reactElementToJSXString(<TestComponent />, { displayName: toUpper })', () => { | ||
expect( | ||
reactElementToJSXString(<TestComponent />, { | ||
displayName: (element) => element.type.name.toUpperCase() | ||
displayName: element => element.type.name.toUpperCase() | ||
}) | ||
).toEqual(`<TESTCOMPONENT />`); | ||
).toEqual('<TESTCOMPONENT />'); | ||
}); | ||
@@ -487,3 +486,3 @@ | ||
reactElementToJSXString(<DefaultPropsComponent />) | ||
).toEqual(`<DefaultPropsComponent test="test" />`); | ||
).toEqual('<DefaultPropsComponent test="test" />'); | ||
}); | ||
@@ -494,19 +493,25 @@ | ||
reactElementToJSXString(<DefaultPropsComponent />, {showDefaultProps: false}) | ||
).toEqual(`<DefaultPropsComponent />`); | ||
).toEqual('<DefaultPropsComponent />'); | ||
}); | ||
it(`reactElementToJSXString(<div co={<div a="1" />} />, { displayName: toUpper })`, () => { | ||
it('should render props that differ from their defaults if "showDefaultProps" option is false', () => { | ||
expect( | ||
reactElementToJSXString(<DefaultPropsComponent test="foo" />, {showDefaultProps: false}) | ||
).toEqual('<DefaultPropsComponent test="foo" />'); | ||
}); | ||
it('reactElementToJSXString(<div co={<div a="1" />} />, { displayName: toUpper })', () => { | ||
expect( | ||
reactElementToJSXString(<div co={<div a="1" />} />, { | ||
displayName: (element) => element.type.toUpperCase() | ||
displayName: element => element.type.toUpperCase() | ||
}) | ||
).toEqual(`<DIV co={<DIV a="1" />} />`); | ||
).toEqual('<DIV co={<DIV a="1" />} />'); | ||
}); | ||
it(`reactElementToJSXString(<div co={{a: <div a="1" />}} />, { displayName: toUpper })`, () => { | ||
it('reactElementToJSXString(<div co={{a: <div a="1" />}} />, { displayName: toUpper })', () => { | ||
expect( | ||
reactElementToJSXString(<div co={{a: <div a="1" />}} />, { | ||
displayName: (element) => element.type.toUpperCase() | ||
displayName: element => element.type.toUpperCase() | ||
}) | ||
).toEqual(`<DIV co={{a: <DIV a="1" />}} />`); | ||
).toEqual('<DIV co={{a: <DIV a="1" />}} />'); | ||
}); | ||
@@ -516,3 +521,3 @@ it('should omit true as value', () => { | ||
reactElementToJSXString(<div primary={true} />) // eslint-disable-line react/jsx-boolean-value | ||
).toEqual(`<div primary />`); | ||
).toEqual('<div primary />'); | ||
}); | ||
@@ -522,4 +527,4 @@ it('should omit attributes with false as value', () => { | ||
reactElementToJSXString(<div primary={false} />) // eslint-disable-line react/jsx-boolean-value | ||
).toEqual(`<div />`); | ||
).toEqual('<div />'); | ||
}); | ||
}); |
57
index.js
@@ -11,3 +11,3 @@ import React from 'react'; | ||
export default function reactElementToJSXString(ReactElement, {displayName, showDefaultProps = true} = {}) { | ||
let getDisplayName = displayName || getDefaultDisplayName; | ||
const getDisplayName = displayName || getDefaultDisplayName; | ||
@@ -20,12 +20,14 @@ return toJSXString({ReactElement}); | ||
} else if (!isElement(Element)) { | ||
throw new Error('react-element-to-jsx-string: Expected a ReactElement, ' + | ||
'got `' + (typeof Element) + '`'); | ||
throw new Error( | ||
`react-element-to-jsx-string: Expected a ReactElement, | ||
got \`${typeof Element}\`` | ||
); | ||
} | ||
let tagName = getDisplayName(Element); | ||
const tagName = getDisplayName(Element); | ||
let out = `<${tagName}`; | ||
let props = formatProps(Element.props, getDefaultProps(Element)); | ||
const props = formatProps(Element.props, getDefaultProps(Element)); | ||
let attributes = []; | ||
let children = React.Children.toArray(Element.props.children) | ||
const children = React.Children.toArray(Element.props.children) | ||
.filter(onlyMeaningfulChildren); | ||
@@ -39,3 +41,3 @@ | ||
// React automatically add key=".X" when there are some children | ||
!/^\./.test(Element.key)) { | ||
!(/^\./).test(Element.key)) { | ||
attributes.push(getJSXAttribute('key', Element.key)); | ||
@@ -48,3 +50,3 @@ } | ||
if (attributes.length === 1 || inline) { | ||
out += ` `; | ||
out += ' '; | ||
} else { | ||
@@ -66,3 +68,3 @@ out += `\n${spacer(lvl + 1)}`; | ||
if (children.length > 0) { | ||
out += `>`; | ||
out += '>'; | ||
lvl++; | ||
@@ -81,3 +83,3 @@ if (!inline) { | ||
recurse({lvl, inline}) | ||
).join('\n' + spacer(lvl)); | ||
).join(`\n${spacer(lvl)}`); | ||
} | ||
@@ -91,3 +93,3 @@ if (!inline) { | ||
if (attributes.length <= 1) { | ||
out += ` `; | ||
out += ' '; | ||
} | ||
@@ -102,3 +104,3 @@ | ||
function formatProps(props, defaultProps) { | ||
let formated = Object | ||
let formatted = Object | ||
.keys(props) | ||
@@ -109,12 +111,8 @@ .filter(noChildren) | ||
if (!showDefaultProps) { | ||
formated = formated.filter((key, value) => { | ||
return defaultProps[key] ? defaultProps[key] === value : true; | ||
}); | ||
formatted = formatted.filter(key => defaultProps[key] ? defaultProps[key] !== props[key] : true); | ||
} | ||
return formated | ||
return formatted | ||
.sort() | ||
.map(propName => { | ||
return getJSXAttribute(propName, props[propName]); | ||
}); | ||
.map(propName => getJSXAttribute(propName, props[propName])); | ||
} | ||
@@ -140,2 +138,4 @@ | ||
function formatValue(value) { | ||
const wrapper = '__reactElementToJSXString__Wrapper__'; | ||
if (typeof value === 'function') { | ||
@@ -151,9 +151,5 @@ return function noRefCheck() {}; | ||
// otherwise, the element would be surrounded by quotes: <div a={{b: '<div />'}} /> | ||
return '<__reactElementToJSXString__Wrapper__>' + | ||
toJSXString({ReactElement: value, inline: true}) + | ||
'</__reactElementToJSXString__Wrapper__>'; | ||
return `<${wrapper}>${toJSXString({ReactElement: value, inline: true})}</${wrapper}>`; | ||
} else if (isPlainObject(value) || Array.isArray(value)) { | ||
return '<__reactElementToJSXString__Wrapper__>' + | ||
stringifyObject(value) + | ||
'</__reactElementToJSXString__Wrapper__>'; | ||
return `<${wrapper}>${stringifyObject(value)}</${wrapper}>`; | ||
} | ||
@@ -165,5 +161,3 @@ | ||
function recurse({lvl, inline}) { | ||
return Element => { | ||
return toJSXString({ReactElement: Element, lvl, inline}); | ||
}; | ||
return Element => toJSXString({ReactElement: Element, lvl, inline}); | ||
} | ||
@@ -173,2 +167,3 @@ | ||
if (Object.keys(obj).length > 0 || obj.length > 0) { | ||
// eslint-disable-next-line array-callback-return | ||
obj = traverse(obj).map(function(value) { | ||
@@ -205,6 +200,6 @@ if (isElement(value) || this.isLeaf) { | ||
function mergePlainStringChildren(prev, cur) { | ||
var lastItem = prev[prev.length - 1]; | ||
const lastItem = prev[prev.length - 1]; | ||
if (typeof cur === 'number') { | ||
cur = '' + cur; | ||
cur = String(cur); | ||
} | ||
@@ -222,3 +217,3 @@ | ||
function spacer(times) { | ||
return fill(new Array(times), ` `).join(``); | ||
return fill(new Array(times), ' ').join(''); | ||
} | ||
@@ -225,0 +220,0 @@ |
{ | ||
"name": "react-element-to-jsx-string", | ||
"version": "3.1.0", | ||
"version": "3.1.1", | ||
"description": "Turn a ReactElement into the corresponding JSX string.", | ||
@@ -17,9 +17,8 @@ "main": "index-dist.js", | ||
"devDependencies": { | ||
"babel": "^5.8.29", | ||
"babel-eslint": "^4.1.8", | ||
"eslint": "^1.10.3", | ||
"eslint-config-airbnb": "^1.0.0", | ||
"eslint-config-algolia": "^4.6.0", | ||
"eslint-plugin-algolia": "^1.5.0", | ||
"eslint-plugin-react": "^4.2.3", | ||
"babel-cli": "^6.10.1", | ||
"babel-preset-es2015": "^6.9.0", | ||
"babel-preset-react": "^6.11.1", | ||
"babel-preset-stage-2": "^6.11.0", | ||
"babel-register": "^6.9.0", | ||
"eslint-config-algolia": "^5.1.0", | ||
"expect": "^1.14.0", | ||
@@ -26,0 +25,0 @@ "lodash.fill": "^3.3.4", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
40532
1.2%10
-9.09%14
7.69%