Skip to content

Commit 78b45d4

Browse files
author
Gabriela Seabra
committed
feat(formatting) add FunctionTreeNode
1 parent dbbd9e5 commit 78b45d4

File tree

6 files changed

+77
-3
lines changed

6 files changed

+77
-3
lines changed

src/formatter/formatTreeNode.js

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

33
import formatReactElementNode from './formatReactElementNode';
44
import formatReactFragmentNode from './formatReactFragmentNode';
5+
import formatFunction from './formatFunction';
56
import type { Options } from './../options';
67
import type { TreeNode } from './../tree';
78

@@ -46,6 +47,10 @@ export default (
4647
: '';
4748
}
4849

50+
if (node.type === 'function') {
51+
return `{${formatFunction(node.value, options)}}`;
52+
}
53+
4954
if (node.type === 'ReactElement') {
5055
return formatReactElementNode(node, inline, lvl, options);
5156
}

src/formatter/formatTreeNode.spec.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,25 @@ describe('formatTreeNode', () => {
1919
);
2020
});
2121

22+
it('should format function tree node', () => {
23+
function fun(a) {
24+
return a + 1;
25+
}
26+
expect(
27+
formatTreeNode(
28+
{
29+
type: 'function',
30+
value: fun,
31+
},
32+
true,
33+
0,
34+
{
35+
showFunctions: true,
36+
}
37+
)
38+
).toBe('{function fun(a) {return a + 1;}}');
39+
});
40+
2241
it('should format react element tree node', () => {
2342
expect(
2443
formatTreeNode(

src/parser/parseReactElement.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { Options } from './../options';
55
import {
66
createStringTreeNode,
77
createNumberTreeNode,
8+
createFunctionTreeNode,
89
createReactElementTreeNode,
910
createReactFragmentTreeNode,
1011
} from './../tree';
@@ -67,9 +68,15 @@ const parseReactElement = (
6768
}
6869

6970
const defaultProps = filterProps(element.type.defaultProps || {}, noChildren);
70-
const childrens = React.Children.toArray(element.props.children)
71-
.filter(onlyMeaningfulChildren)
72-
.map(child => parseReactElement(child, options));
71+
72+
let childrens;
73+
if (typeof element.props.children === 'function') {
74+
childrens = [createFunctionTreeNode(element.props.children)];
75+
} else {
76+
childrens = React.Children.toArray(element.props.children)
77+
.filter(onlyMeaningfulChildren)
78+
.map(child => parseReactElement(child, options));
79+
}
7380

7481
if (supportFragment && element.type === Fragment) {
7582
return createReactFragmentTreeNode(key, childrens);

src/parser/parseReactElement.spec.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,25 @@ describe('parseReactElement', () => {
182182
],
183183
});
184184
});
185+
186+
it('should parse children function', () => {
187+
const RenderProp = ({ children }) => children({});
188+
const fun = () => <div />;
189+
expect(
190+
parseReactElement(<RenderProp key="foo">{fun}</RenderProp>, options)
191+
).toEqual({
192+
type: 'ReactElement',
193+
displayName: 'RenderProp',
194+
defaultProps: {},
195+
props: {
196+
key: 'foo',
197+
},
198+
childrens: [
199+
{
200+
type: 'function',
201+
value: fun,
202+
},
203+
],
204+
});
205+
});
185206
});

src/tree.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ export type NumberTreeNode = {|
1616
value: number,
1717
|};
1818

19+
export type FunctionTreeNode = {|
20+
type: 'function',
21+
value: Function,
22+
|};
23+
1924
export type ReactElementTreeNode = {|
2025
type: 'ReactElement',
2126
displayName: string,
@@ -33,6 +38,7 @@ export type ReactFragmentTreeNode = {|
3338
export type TreeNode =
3439
| StringTreeNode
3540
| NumberTreeNode
41+
| FunctionTreeNode
3642
| ReactElementTreeNode
3743
| ReactFragmentTreeNode;
3844

@@ -46,6 +52,11 @@ export const createNumberTreeNode = (value: number): NumberTreeNode => ({
4652
value,
4753
});
4854

55+
export const createFunctionTreeNode = (value: Function): FunctionTreeNode => ({
56+
type: 'function',
57+
value,
58+
});
59+
4960
export const createReactElementTreeNode = (
5061
displayName: string,
5162
props: PropsType,

src/tree.spec.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import {
44
createStringTreeNode,
55
createNumberTreeNode,
6+
createFunctionTreeNode,
67
createReactElementTreeNode,
78
createReactFragmentTreeNode,
89
} from './tree';
@@ -25,6 +26,16 @@ describe('createNumberTreeNode', () => {
2526
});
2627
});
2728

29+
describe('createFunctionTreeNode', () => {
30+
it('generate a number typed node payload', () => {
31+
const fun = () => null;
32+
expect(createFunctionTreeNode(fun)).toEqual({
33+
type: 'function',
34+
value: fun,
35+
});
36+
});
37+
});
38+
2839
describe('createReactElementTreeNode', () => {
2940
it('generate a react element typed node payload', () => {
3041
expect(

0 commit comments

Comments
 (0)