createShallowRenderer(/* options */) { const renderer = new ShallowRenderer(); let isDOM = false; let cachedNode = null; return { render(el, context) { cachedNode = el; /* eslint consistent-return: 0 */ if (typeof el.type === 'string') { isDOM = true; } else { isDOM = false; return withSetStateAllowed(() => renderer.render(el, context)); } }, unmount() { renderer.unmount(); }, getNode() { if (isDOM) { return elementToTree(cachedNode); } const output = renderer.getRenderOutput(); return { nodeType: nodeTypeFromType(cachedNode.type), type: cachedNode.type, props: cachedNode.props, key: cachedNode.key || undefined, ref: cachedNode.ref, instance: renderer._instance, rendered: Array.isArray(output) ? flatten(output).map(elementToTree) : elementToTree(output), }; }, simulateEvent(node, event, ...args) { const handler = node.props[propFromEvent(event)]; if (handler) { withSetStateAllowed(() => { // TODO(lmr): create/use synthetic events // TODO(lmr): emulate React's event propagation // ReactDOM.unstable_batchedUpdates(() => { handler(...args); // }); }); } }, batchedUpdates(fn) { return fn(); // return ReactDOM.unstable_batchedUpdates(fn); }, }; }
elementToNode(element) { return elementToTree(element); }