all files / src/hyperscript/ querySelectorAll.ts

90% Statements 18/20
87.5% Branches 7/8
66.67% Functions 2/3
100% Lines 15/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 35                                       
import { VNode } from '../types'
import { hasCssSelector } from './hasCssSelector'
 
export const querySelectorAll: QuerySelectorAll = function(cssSelector: string, vNode: VNode) {
  Iif (!vNode) return (_vNode: VNode) => _querySelectorAll(cssSelector, vNode)
 
  return _querySelectorAll(cssSelector, vNode)
} as QuerySelectorAll
 
function _querySelectorAll(cssSelector: string, vNode: VNode): Array<VNode> {
  const matches: Array<VNode> = []
  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)) matches.push(child)
 
    if (!child.children) continue
 
    children.push(...child.children)
  }
 
  return matches
}
 
export interface QuerySelectorAll {
  (cssSelector: string, vNode: VNode): Array<VNode>
  (cssSelector: string): (vNode: VNode) => Array<VNode>
}