/** * Given a CSS selector, returns the first matching node, if any. * @param {string} css the CSS selector to query * @param {Document | DocumentFragment | Element} [root] the optional parent node to query * @returns {Element?} the found element, if any */ const $ = (css, root = document) => root.querySelector(css); /** * Given a CSS selector, returns a list of all matching nodes. * @param {string} css the CSS selector to query * @param {Document | DocumentFragment | Element} [root] the optional parent node to query * @returns {Element[]} a list of found nodes */ const $$ = (css, root = document) => [...root.querySelectorAll(css)]; /** * Given a XPath selector, returns a list of all matching nodes. * @param {string} path the XPath selector to evaluate * @param {Document | DocumentFragment | Element} [root] the optional parent node to query * @returns {Node[]} a list of found nodes (elements, attributes, text, comments) */ const $x = (path, root = document) => { const expression = (new XPathEvaluator).createExpression(path); const xpath = expression.evaluate(root, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE); const result = []; for (let i = 0, {snapshotLength} = xpath; i < snapshotLength; i++) result.push(xpath.snapshotItem(i)); return result; }; export { $, $$, $x };