>} />`);
});
+ it('reactElementToJSXString(
)', () => {
+ const renderJSX = jsx =>
+ reactElementToJSXString(jsx, {
+ showFunctions: (_, prop) => prop === 'children',
+ functionValue: fn => `() => ${renderJSX(fn())}`,
+ });
+ expect(renderJSX(
)).toEqual(
+ `
`
+ );
+ });
+
it('should not cause recursive loop when prop object contains an element', () => {
const Test = () =>
Test
;
diff --git a/src/options.js b/src/options.js
index ccb4a331f..38d6c27fe 100644
--- a/src/options.js
+++ b/src/options.js
@@ -5,8 +5,8 @@ import * as React from 'react';
export type Options = {|
filterProps: string[],
showDefaultProps: boolean,
- showFunctions: boolean,
- functionValue: Function,
+ showFunctions: boolean | ((fn: Function, prop: string) => boolean),
+ functionValue: (fn: Function, prop: string) => Function | string,
tabStop: number,
useBooleanShorthandSyntax: boolean,
useFragmentShortSyntax: boolean,
diff --git a/src/parser/parseReactElement.js b/src/parser/parseReactElement.js
index 773b1a98d..1b7c75063 100644
--- a/src/parser/parseReactElement.js
+++ b/src/parser/parseReactElement.js
@@ -5,6 +5,7 @@ import type { Options } from './../options';
import {
createStringTreeNode,
createNumberTreeNode,
+ createFunctionTreeNode,
createReactElementTreeNode,
createReactFragmentTreeNode,
} from './../tree';
@@ -67,9 +68,15 @@ const parseReactElement = (
}
const defaultProps = filterProps(element.type.defaultProps || {}, noChildren);
- const childrens = React.Children.toArray(element.props.children)
- .filter(onlyMeaningfulChildren)
- .map(child => parseReactElement(child, options));
+
+ let childrens;
+ if (typeof element.props.children === 'function') {
+ childrens = [createFunctionTreeNode(element.props.children)];
+ } else {
+ childrens = React.Children.toArray(element.props.children)
+ .filter(onlyMeaningfulChildren)
+ .map(child => parseReactElement(child, options));
+ }
if (supportFragment && element.type === Fragment) {
return createReactFragmentTreeNode(key, childrens);
diff --git a/src/parser/parseReactElement.spec.js b/src/parser/parseReactElement.spec.js
index a30188849..a911b2dea 100644
--- a/src/parser/parseReactElement.spec.js
+++ b/src/parser/parseReactElement.spec.js
@@ -182,4 +182,25 @@ describe('parseReactElement', () => {
],
});
});
+
+ it('should parse children function', () => {
+ const RenderProp = ({ children }) => children({});
+ const fun = () =>
;
+ expect(
+ parseReactElement(
{fun}, options)
+ ).toEqual({
+ type: 'ReactElement',
+ displayName: 'RenderProp',
+ defaultProps: {},
+ props: {
+ key: 'foo',
+ },
+ childrens: [
+ {
+ type: 'function',
+ value: fun,
+ },
+ ],
+ });
+ });
});
diff --git a/src/tree.js b/src/tree.js
index efbf254af..f7e936fd9 100644
--- a/src/tree.js
+++ b/src/tree.js
@@ -16,6 +16,11 @@ export type NumberTreeNode = {|
value: number,
|};
+export type FunctionTreeNode = {|
+ type: 'function',
+ value: Function,
+|};
+
export type ReactElementTreeNode = {|
type: 'ReactElement',
displayName: string,
@@ -33,6 +38,7 @@ export type ReactFragmentTreeNode = {|
export type TreeNode =
| StringTreeNode
| NumberTreeNode
+ | FunctionTreeNode
| ReactElementTreeNode
| ReactFragmentTreeNode;
@@ -46,6 +52,11 @@ export const createNumberTreeNode = (value: number): NumberTreeNode => ({
value,
});
+export const createFunctionTreeNode = (value: Function): FunctionTreeNode => ({
+ type: 'function',
+ value,
+});
+
export const createReactElementTreeNode = (
displayName: string,
props: PropsType,
diff --git a/src/tree.spec.js b/src/tree.spec.js
index febf01823..c6ba7a2ad 100644
--- a/src/tree.spec.js
+++ b/src/tree.spec.js
@@ -3,6 +3,7 @@
import {
createStringTreeNode,
createNumberTreeNode,
+ createFunctionTreeNode,
createReactElementTreeNode,
createReactFragmentTreeNode,
} from './tree';
@@ -25,6 +26,16 @@ describe('createNumberTreeNode', () => {
});
});
+describe('createFunctionTreeNode', () => {
+ it('generate a number typed node payload', () => {
+ const fun = () => null;
+ expect(createFunctionTreeNode(fun)).toEqual({
+ type: 'function',
+ value: fun,
+ });
+ });
+});
+
describe('createReactElementTreeNode', () => {
it('generate a react element typed node payload', () => {
expect(