all files / src/ removeVNodes.ts

100% Statements 27/27
100% Branches 14/14
100% Functions 3/3
100% Lines 21/21
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                    16× 25×   25×   24× 21×   21×   21× 21×   21× 19×           67×     43×   43×   43×   43×   43×   22×    
import { ElementVNode, VNode } from './'
import { ModuleCallbacks } from './modules/ModuleCallbacks'
 
export function removeVNodes(
  parentNode: Node,
  vNodes: Array<VNode>,
  startIndex: number,
  endIndex: number,
  moduleCallbacks: ModuleCallbacks
)
{
  for (; startIndex <= endIndex; ++startIndex) {
    const vNode = vNodes[startIndex]
 
    if (!vNode) continue
 
    if (isElementVNode(vNode)) {
      const { props } = vNode
 
      invokeDestroyHook(vNode, moduleCallbacks)
 
      const removeElement = moduleCallbacks.createRemoveElementFn(vNode.element)
      moduleCallbacks.remove(vNode, removeElement)
 
      if (props.remove) props.remove(vNode, removeElement)
      else removeElement()
    } else {
      parentNode.removeChild(vNode.element)
    }
  }
}
 
function isElementVNode(vNode: VNode): vNode is ElementVNode {
  return vNode.tagName && vNode.element
}
 
function invokeDestroyHook(vNode: VNode, moduleCallbacks: ModuleCallbacks) {
  const props = vNode.props
 
  if (props.destroy) props.destroy(vNode)
 
  if (isElementVNode(vNode)) moduleCallbacks.destroy(vNode)
 
  const children = vNode.children
 
  if (!children) return
 
  for (let i = 0; i < children.length; ++i) invokeDestroyHook(children[i], moduleCallbacks)
}