import { Arr, Optional } from '@ephox/katamari'; import { SugarElement, SugarNode, Traverse } from '@ephox/sugar'; import * as SelectorEngine from './SelectorEngine'; type SizzleContext = Element | Document | DocumentFragment; const toOptionEl = (output: T[]): Optional> => output.length === 0 ? Optional.none() : Optional.from(output[0]).map(SugarElement.fromDom); const descendant = (sugarElement: SugarElement, selector: string): Optional> => { const siz = SelectorEngine.selectAll(selector, sugarElement.dom) as T[]; return toOptionEl(siz); }; const toArrayEl = (elements: T[]): SugarElement[] => Arr.map(elements, SugarElement.fromDom); const descendants = (sugarElement: SugarElement, selector: string): SugarElement[] => toArrayEl(SelectorEngine.selectAll(selector, sugarElement.dom) as T[]); const matches = (sugarElement: SugarElement, selector: string): sugarElement is SugarElement => SugarNode.isElement(sugarElement) && SelectorEngine.matchesSelector(sugarElement.dom, selector); const child = (sugarElement: SugarElement, selector: string): Optional> => { const children = Traverse.children(sugarElement); return Arr.find(children, (child): child is SugarElement => matches(child, selector)); }; const children = (sugarElement: SugarElement, selector: string): SugarElement[] => { const children = Traverse.children(sugarElement); return Arr.filter(children, (child): child is SugarElement => matches(child, selector)); }; export { descendant, descendants, matches, child, children };