Skip to content

Commit a965472

Browse files
author
Andrei Toma
committed
Added forwardRef fix for displayName
1 parent 3d4c150 commit a965472

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

src/index.spec.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,27 @@ describe('reactElementToJSXString(ReactElement)', () => {
5757
delete AnonymousStatelessComponent.displayName;
5858
});
5959

60+
it('reactElementToJSXString forwardRef with a displayName', () => {
61+
const createReactComponent = tagName => {
62+
const createForwardRef = ReactComponent => {
63+
const forwardRef = (props, ref) => {
64+
return <ReactComponent {...props} forwardedRef={ref} />;
65+
};
66+
forwardRef.displayName = tagName;
67+
68+
return React.forwardRef(forwardRef);
69+
};
70+
71+
return createForwardRef(React.createElement(tagName));
72+
};
73+
74+
const MyComponent = createReactComponent('my-component');
75+
76+
expect(reactElementToJSXString(<MyComponent />)).toEqual(
77+
'<my-component />'
78+
);
79+
});
80+
6081
it("reactElementToJSXString(React.createElement('div'))", () => {
6182
expect(reactElementToJSXString(React.createElement('div'))).toEqual(
6283
'<div />'

src/parser/parseReactElement.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import React, { type Element as ReactElement, Fragment } from 'react';
44
import type { Options } from './../options';
5+
import * as ReactIs from 'react-is';
56
import {
67
createStringTreeNode,
78
createNumberTreeNode,
@@ -12,12 +13,16 @@ import type { TreeNode } from './../tree';
1213

1314
const supportFragment = Boolean(Fragment);
1415

15-
const getReactElementDisplayName = (element: ReactElement<*>): string =>
16-
element.type.displayName ||
17-
(element.type.name !== '_default' ? element.type.name : null) || // function name
18-
(typeof element.type === 'function' // function without a name, you should provide one
19-
? 'No Display Name'
20-
: element.type);
16+
const getReactElementDisplayName = (element: ReactElement<>): string => {
17+
return (
18+
element.type.displayName ||
19+
(element.type.name !== '_default' ? element.type.name : null) || // function name
20+
(ReactIs.isForwardRef(element) ? element.type.render.displayName : null) ||
21+
(typeof element.type === 'function' // function without a name, you should provide one
22+
? 'No Display Name'
23+
: element.type)
24+
);
25+
};
2126

2227
const noChildren = (propsValue, propName) => propName !== 'children';
2328

0 commit comments

Comments
 (0)