all files / src/ createElement.ts

100% Statements 26/26
100% Branches 16/16
100% Functions 1/1
100% Lines 26/26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56                273×   273×   273×   273× 266×       266×   266×   266×   266× 40×   40× 167×       266× 218×   266×   266×   266×   266×          
import { ElementVNode, TextVNode, VNode } from './'
 
import { ModuleCallbacks } from './modules/ModuleCallbacks'
import { SCOPE_ATTRIBUTE } from './dom-scope-attribute'
 
export function createElement(
  vNode: VNode,
  moduleCallbacks: ModuleCallbacks,
  insertedVNodeQueue: Array<ElementVNode>): ElementVNode | TextVNode
{
  const props = vNode.props
 
  moduleCallbacks.init(vNode)
 
  if (props.init)
    props.init(vNode)
 
  if (vNode.tagName) {
    const element = vNode.namespace
      ? document.createElementNS(vNode.namespace, vNode.tagName)
      : document.createElement(vNode.tagName)
 
    if (vNode.scope)
      element.setAttribute(SCOPE_ATTRIBUTE, vNode.scope)
 
    vNode.element = element
 
    const children = vNode.children
 
    if (children) {
      const childCount = children.length
 
      for (let i = 0; i < childCount; ++i)
        element.appendChild(
          createElement(children[i], moduleCallbacks, insertedVNodeQueue).element as Node)
    }
 
    if (vNode.text)
      element.appendChild(document.createTextNode(vNode.text))
 
    moduleCallbacks.create(vNode as ElementVNode)
 
    if (props.create)
      props.create(vNode as ElementVNode)
 
    if (props.insert)
      insertedVNodeQueue.push(vNode as ElementVNode)
 
    return vNode as ElementVNode
  }
 
  vNode.element = document.createTextNode(vNode.text as string)
 
  return vNode as TextVNode
}