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

93.75% Statements 15/16
92.31% Branches 12/13
100% Functions 1/1
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    14×   14×         14×   11×   11×   11×   11×            
import { VNode } from '../../'
import { parseSelector } from '../parseSelector'
 
export function matchBasicCssSelector(cssSelector: string, vNode: VNode) {
  const hasTagName = cssSelector[0] !== '#' && cssSelector[0] !== '.'
 
  const { tagName, className, id } =
    hasTagName ?
      parseSelector(cssSelector) :
      parseSelector(vNode.tagName + cssSelector)
 
  if (tagName !== vNode.tagName)
    return false
 
  const parsedClassNames = className && className.split(' ') || []
 
  const { props: { className: propsClassName = '', id: propsId } } = vNode
 
  const vNodeClassNames = propsClassName.split(' ')
 
  for (let i = 0; i < parsedClassNames.length; ++i) {
    const parsedClassName = parsedClassNames[i]
 
    if (vNodeClassNames.indexOf(parsedClassName) === -1)
      return false
  }
 
  Iif (id) return propsId === id
 
  return true
}