diff options
Diffstat (limited to 'packages/renderers/renderer-react/server.js')
-rw-r--r-- | packages/renderers/renderer-react/server.js | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/packages/renderers/renderer-react/server.js b/packages/renderers/renderer-react/server.js index 56f2f5aa8..8ac177c7c 100644 --- a/packages/renderers/renderer-react/server.js +++ b/packages/renderers/renderer-react/server.js @@ -1,13 +1,37 @@ -import { createElement as h } from 'react'; +import { Component as BaseComponent, createElement as h } from 'react'; import { renderToStaticMarkup as renderToString } from 'react-dom/server.js'; import StaticHtml from './static-html.js'; +const reactTypeof = Symbol.for('react.element'); + function check(Component, props, children) { - try { - const { html } = renderToStaticMarkup(Component, props, children); - return Boolean(html); - } catch (e) {} - return false; + if(typeof Component !== 'function') return false; + + if(typeof Component.prototype.render === 'function') { + return BaseComponent.isPrototypeOf(Component); + } + + let error = null; + let isReactComponent = false; + function Tester(...args) { + try { + const vnode = Component(...args); + if(vnode && vnode['$$typeof'] === reactTypeof) { + isReactComponent = true; + } + } catch(err) { + error = err; + } + + return h('div'); + } + + renderToStaticMarkup(Tester, props, children); + + if(error) { + throw error; + } + return isReactComponent; } function renderToStaticMarkup(Component, props, children) { |