all files / src/hyperscript/ querySelector.ts

17.65% Statements 3/17
0% Branches 0/8
0% Functions 0/3
20% Lines 3/15
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                                                             
import { VNode } from '../types'
import { hasCssSelector } from './hasCssSelector'
 
export const querySelector: QuerySelector = ((cssSelector: string, vNode?: VNode) => vNode
  ? _querySelector(cssSelector, vNode)
  : (_vNode: VNode) => _querySelector(cssSelector, _vNode)) as QuerySelector
 
function _querySelector(cssSelector: string, vNode: VNode): VNode | null {
  const scope = vNode.scope
 
  const children: Array<VNode> = [ vNode ]
 
  while (children.length > 0) {
    const child = children.shift() as VNode
 
    if (child.scope !== scope)
      continue
 
    if (hasCssSelector(cssSelector, child))
      return child
 
    if (!child.children) continue
 
    children.push(...child.children)
  }
 
  return null
}
 
export interface QuerySelector {
  (cssSelector: string, vNode: VNode): VNode | null
  (cssSelector: string): (vNode: VNode) => VNode | null
}