all files / src/ init.ts

100% Statements 23/23
100% Branches 6/6
100% Functions 2/2
100% Lines 22/22
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                103×   103×   103× 75×   28× 28×   28×   28×       103×   103×   103×      
import { ElementVNode, InsertHook, Module, VNode, VNodeEvents, VNodeProps } from './'
 
import { ModuleCallbacks } from './modules/ModuleCallbacks'
import { createElement } from './createElement'
import { patchVNode } from './patchVNode'
import { removeVNodes } from './removeVNodes'
import { vNodesAreEqual } from './helpers'
 
export function init(modules: Array<Module> = []) {
  const moduleCallbacks = new ModuleCallbacks(modules)
 
  return function patch<
    T extends Element,
    Props extends VNodeProps<T, VNodeEvents<T, ElementEventMap>>
  >(formerVNode: ElementVNode, vNode: VNode<T, Props>): ElementVNode<T>
  {
    const insertedVNodeQueue: Array<ElementVNode> = []
 
    moduleCallbacks.pre(vNode)
 
    if (vNodesAreEqual(formerVNode, vNode))
      patchVNode(formerVNode, vNode, moduleCallbacks, insertedVNodeQueue)
    else {
      const element = formerVNode.element
      const parentNode = element.parentNode
 
      vNode = createElement(vNode, moduleCallbacks, insertedVNodeQueue) as VNode
 
      if (parentNode) {
        parentNode.insertBefore(vNode.element as Element, element.nextSibling)
        removeVNodes(parentNode, [ formerVNode ], 0, 0, moduleCallbacks)
      }
    }
 
    for (let i = 0; i < insertedVNodeQueue.length; ++i)
      (insertedVNodeQueue[i].props.insert as InsertHook<Element>)(insertedVNodeQueue[i])
 
    moduleCallbacks.post(vNode as ElementVNode)
 
    return vNode as ElementVNode<T, Props>
  }
}