all files / src/hyperscript/hasCssSelector/ matchesSelector.ts

86.67% Statements 13/15
78.57% Branches 11/14
100% Functions 1/1
86.67% Lines 13/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      103×     103×     103× 12×   91× 20×   71×     71×    
import { VNode } from '../../'
import { matchAttribute } from './matchAttribute'
import { matchBasicCssSelector } from './matchBasicCssSelector'
import { matchPsuedoSelector } from './matchPsuedoSelector'
 
const EMPTY: any = Object.freeze({})
 
export function matchesSelector(cssSelector: string, vNode: VNode): boolean {
  cssSelector = cssSelector.trim()
 
  // if working with an ElementVNode return use native implementation
  Iif (vNode.element && (vNode.element as Element).matches)
    return (vNode.element as Element).matches(cssSelector)
 
  if (cssSelector[0] === '[' && cssSelector[cssSelector.length - 1] === ']')
    return matchAttribute(cssSelector.slice(1, -1), vNode.props.attrs || EMPTY)
 
  if (cssSelector.indexOf(':') > -1)
    return matchPsuedoSelector(cssSelector, vNode)
 
  Iif (cssSelector.indexOf(' ') > -1)
    throw new Error('Basic CSS selectors can not contain spaces')
 
  return matchBasicCssSelector(cssSelector, vNode)
}