@@ -31,26 +31,48 @@ export function formatElement(
31
31
const { children, ...props } = element . props ;
32
32
const childrenToDisplay = typeof children === 'string' ? [ children ] : undefined ;
33
33
34
- return prettyFormat (
35
- {
36
- // This prop is needed persuade the prettyFormat that the element is
37
- // a ReactTestRendererJSON instance, so it is formatted as JSX.
38
- $$typeof : Symbol . for ( 'react.test.json' ) ,
39
- type : `${ element . type } ` ,
40
- props : mapProps ? mapProps ( props ) : props ,
41
- children : childrenToDisplay ,
42
- } ,
43
- // See: https://www.npmjs.com/package/pretty-format#usage-with-options
44
- {
45
- plugins : [ plugins . ReactTestComponent , plugins . ReactElement ] ,
46
- printFunctionName : false ,
47
- printBasicPrototype : false ,
48
- highlight : highlight ,
49
- min : compact ,
50
- } ,
34
+ return (
35
+ ( typeof element . type === 'string' ? '' : 'composite ' ) +
36
+ prettyFormat (
37
+ {
38
+ // This prop is needed persuade the prettyFormat that the element is
39
+ // a ReactTestRendererJSON instance, so it is formatted as JSX.
40
+ $$typeof : Symbol . for ( 'react.test.json' ) ,
41
+ type : formatElementName ( element . type ) ,
42
+ props : mapProps ? mapProps ( props ) : props ,
43
+ children : childrenToDisplay ,
44
+ } ,
45
+ // See: https://www.npmjs.com/package/pretty-format#usage-with-options
46
+ {
47
+ plugins : [ plugins . ReactTestComponent , plugins . ReactElement ] ,
48
+ printFunctionName : false ,
49
+ printBasicPrototype : false ,
50
+ highlight : highlight ,
51
+ min : compact ,
52
+ } ,
53
+ )
51
54
) ;
52
55
}
53
56
57
+ function formatElementName ( type : ReactTestInstance [ 'type' ] ) {
58
+ if ( typeof type === 'function' ) {
59
+ return type . displayName ?? type . name ;
60
+ }
61
+
62
+ if ( typeof type === 'object' ) {
63
+ if ( 'type' in type ) {
64
+ // @ts -expect-error: despite typing this can happen for React.memo.
65
+ return formatElementName ( type . type ) ;
66
+ }
67
+ if ( 'render' in type ) {
68
+ // @ts -expect-error: despite typing this can happen for React.forwardRefs.
69
+ return formatElementName ( type . render ) ;
70
+ }
71
+ }
72
+
73
+ return `${ type } ` ;
74
+ }
75
+
54
76
export function formatElementList ( elements : ReactTestInstance [ ] , options ?: FormatElementOptions ) {
55
77
if ( elements . length === 0 ) {
56
78
return '(no elements)' ;
0 commit comments