diff options
Diffstat (limited to 'thirdparty/preact/src/h.js')
-rw-r--r-- | thirdparty/preact/src/h.js | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/thirdparty/preact/src/h.js b/thirdparty/preact/src/h.js new file mode 100644 index 000000000..e57ce4bde --- /dev/null +++ b/thirdparty/preact/src/h.js @@ -0,0 +1,51 @@ +import { VNode } from './vnode'; +import options from './options'; + + +let stack = []; + + + +/** JSX/hyperscript reviver +* Benchmarks: https://esbench.com/bench/57ee8f8e330ab09900a1a1a0 + * @see http://jasonformat.com/wtf-is-jsx + * @public + * @example + * /** @jsx h *\/ + * import { render, h } from 'preact'; + * render(<span>foo</span>, document.body); + */ +export function h(nodeName, attributes) { + let children, lastSimple, child, simple, i; + for (i=arguments.length; i-- > 2; ) { + stack.push(arguments[i]); + } + if (attributes && attributes.children) { + if (!stack.length) stack.push(attributes.children); + delete attributes.children; + } + while (stack.length) { + if ((child = stack.pop()) instanceof Array) { + for (i=child.length; i--; ) stack.push(child[i]); + } + else if (child!=null && child!==false) { + if (typeof child=='number' || child===true) child = String(child); + simple = typeof child=='string'; + if (simple && lastSimple) { + children[children.length-1] += child; + } + else { + if (children) children.push(child); + else children = [child]; + lastSimple = simple; + } + } + } + + let p = new VNode(nodeName, attributes || undefined, children); + + // if a "vnode hook" is defined, pass every created VNode to it + if (options.vnode) options.vnode(p); + + return p; +} |