@asamuzakjp/dom-selector 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -32
- package/dist/cjs/js/constant.js +1 -1
- package/dist/cjs/js/constant.js.map +3 -3
- package/dist/cjs/js/matcher.js +1 -1
- package/dist/cjs/js/matcher.js.map +3 -3
- package/package.json +3 -3
- package/src/js/constant.js +2 -0
- package/src/js/matcher.js +390 -144
- package/types/js/constant.d.ts +2 -0
- package/types/js/matcher.d.ts +9 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/js/matcher.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * matcher.js\n */\n\n/* import */\nimport isCustomElementName from 'is-potential-custom-element-name';\nimport {\n getDirectionality, isContentEditable, isInclusive, isInShadowTree,\n isNamespaceDeclared, isPreceding, selectorToNodeProps\n} from './dom-util.js';\nimport {\n generateCSS, parseSelector, unescapeSelector, walkAST\n} from './parser.js';\n\n/* constants */\nimport {\n ALPHA_NUM, BIT_01, BIT_02, BIT_04, BIT_08, BIT_16, BIT_32, COMBINATOR,\n DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE, ELEMENT_NODE, NOT_SUPPORTED_ERR,\n REG_LOGICAL_PSEUDO, REG_SHADOW_HOST, SELECTOR_ATTR, SELECTOR_CLASS,\n SELECTOR_ID, SELECTOR_PSEUDO_CLASS, SELECTOR_PSEUDO_ELEMENT, SELECTOR_TYPE,\n SHOW_ELEMENT, SYNTAX_ERR, TEXT_NODE\n} from './constant.js';\nconst FIND_NEXT = 'next';\nconst FIND_PREV = 'prev';\nconst TARGET_ALL = 'all';\nconst TARGET_FIRST = 'first';\nconst TARGET_LINEAL = 'lineal';\nconst TARGET_SELF = 'self';\n\n/**\n * Matcher\n * NOTE: #ast[i] corresponds to #nodes[i]\n * #ast: [\n * {\n * branch: branch[],\n * filtered: boolean,\n * find: string,\n * skip: boolean\n * },\n * {\n * branch: branch[],\n * filtered: boolean,\n * find: string,\n * skip: boolean\n * }\n * ]\n * #nodes: [\n * Set([node{}, node{}]),\n * Set([node{}, node{}, node{}])\n * ]\n * branch[]: [twig{}, twig{}]\n * twig{}: {\n * combo: leaf{}|null,\n * leaves: leaves[]\n * }\n * leaves[]: [leaf{}, leaf{}, leaf{}]\n * leaf{}: AST leaf\n * node{}: Element node\n */\nexport class Matcher {\n /* private fields */\n #ast;\n #bit;\n #cache;\n #node;\n #nodes;\n #root;\n #selector;\n #warn;\n\n /**\n * construct\n * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.warn] - console warn\n */\n constructor(selector, node, opt = {}) {\n const { warn } = opt;\n this.#bit = new Map([\n [SELECTOR_PSEUDO_ELEMENT, BIT_01],\n [SELECTOR_ID, BIT_02],\n [SELECTOR_CLASS, BIT_04],\n [SELECTOR_TYPE, BIT_08],\n [SELECTOR_ATTR, BIT_16],\n [SELECTOR_PSEUDO_CLASS, BIT_32]\n ]);\n this.#cache = new WeakMap();\n this.#selector = selector;\n this.#node = node;\n this.#warn = !!warn;\n [this.#ast, this.#nodes] = this._prepare(selector);\n this.#root = this._getRoot(node);\n }\n\n /**\n * handle error\n * @param {Error} e - Error\n * @throws Error\n * @returns {void}\n */\n _onError(e) {\n if (e instanceof DOMException && e.name === NOT_SUPPORTED_ERR) {\n if (this.#warn) {\n console.warn(e.message);\n }\n } else {\n throw e;\n }\n }\n\n /**\n * get root\n * @param {object} node - Document, DocumentFragment, Element node\n * @returns {object} - root object\n */\n _getRoot(node = this.#node) {\n let document;\n let root;\n switch (node.nodeType) {\n case DOCUMENT_NODE: {\n document = node;\n root = node;\n break;\n }\n case DOCUMENT_FRAGMENT_NODE: {\n document = node.ownerDocument;\n root = node;\n break;\n }\n case ELEMENT_NODE: {\n if (node.ownerDocument.contains(node)) {\n document = node.ownerDocument;\n root = node.ownerDocument;\n } else {\n let parent = node;\n while (parent) {\n if (parent.parentNode) {\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n document = parent.ownerDocument;\n root = parent;\n }\n break;\n }\n default: {\n throw new TypeError(`Unexpected node ${node.nodeName}`);\n }\n }\n const shadow = isInShadowTree(node);\n return {\n document,\n root,\n shadow\n };\n }\n\n /**\n * sort AST leaves\n * @param {Array.<object>} leaves - collection of AST leaves\n * @returns {Array.<object>} - sorted leaves\n */\n _sortLeaves(leaves) {\n const arr = [...leaves];\n if (arr.length > 1) {\n arr.sort((a, b) => {\n const { type: typeA } = a;\n const { type: typeB } = b;\n const bitA = this.#bit.get(typeA);\n const bitB = this.#bit.get(typeB);\n let res;\n if (bitA === bitB) {\n res = 0;\n } else if (bitA > bitB) {\n res = 1;\n } else {\n res = -1;\n }\n return res;\n });\n }\n return arr;\n }\n\n /**\n * prepare ast and nodes\n * @param {string} selector - CSS selector\n * @returns {Array.<Array.<object|undefined>>} - array of ast and nodes\n */\n _prepare(selector = this.#selector) {\n const ast = parseSelector(selector);\n const branches = walkAST(ast);\n const tree = [];\n const nodes = [];\n let i = 0;\n for (const [...items] of branches) {\n const branch = [];\n let item = items.shift();\n if (item && item.type !== COMBINATOR) {\n const leaves = new Set();\n while (item) {\n if (item.type === COMBINATOR) {\n const [nextItem] = items;\n if (nextItem.type === COMBINATOR) {\n const msg = `Invalid combinator ${item.name}${nextItem.name}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n branch.push({\n combo: item,\n leaves: this._sortLeaves(leaves)\n });\n leaves.clear();\n } else if (item) {\n leaves.add(item);\n }\n if (items.length) {\n item = items.shift();\n } else {\n branch.push({\n combo: null,\n leaves: this._sortLeaves(leaves)\n });\n leaves.clear();\n break;\n }\n }\n }\n tree.push({\n branch,\n filtered: false,\n find: null,\n skip: false\n });\n nodes[i] = new Set();\n i++;\n }\n return [\n tree,\n nodes\n ];\n }\n\n /**\n * collect nth child\n * @param {object} anb - An+B options\n * @param {number} anb.a - a\n * @param {number} anb.b - b\n * @param {boolean} [anb.reverse] - reverse order\n * @param {object} [anb.selector] - AST\n * @param {object} node - Element node\n * @returns {Set.<object>} - collection of matched nodes\n */\n _collectNthChild(anb, node) {\n const { a, b, reverse, selector } = anb;\n const { parentNode } = node;\n const matched = new Set();\n let selectorBranches;\n if (selector) {\n if (this.#cache.has(selector)) {\n selectorBranches = this.#cache.get(selector);\n } else {\n selectorBranches = walkAST(selector);\n this.#cache.set(selector, selectorBranches);\n }\n }\n if (parentNode) {\n const arr = [].slice.call(parentNode.children);\n const l = arr.length;\n if (l) {\n const selectorNodes = new Set();\n if (selectorBranches) {\n const branchesLen = selectorBranches.length;\n for (const refNode of arr) {\n let bool;\n for (let i = 0; i < branchesLen; i++) {\n const leaves = selectorBranches[i];\n bool = this._matchLeaves(leaves, refNode);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n selectorNodes.add(refNode);\n }\n }\n }\n if (reverse) {\n arr.reverse();\n }\n // :first-child, :last-child, :nth-child(0 of S)\n if (a === 0) {\n if (b > 0 && b <= l) {\n if (selectorNodes.size) {\n for (let i = 0; i < l; i++) {\n const current = arr[i];\n if (selectorNodes.has(current)) {\n matched.add(current);\n break;\n }\n }\n } else if (!selector) {\n const current = arr[b - 1];\n matched.add(current);\n }\n }\n // :nth-child()\n } else {\n let nth = b - 1;\n if (a > 0) {\n while (nth < 0) {\n nth += a;\n }\n }\n if (nth >= 0 && nth < l) {\n let j = a > 0 ? 0 : b - 1;\n for (let i = 0; i < l && nth >= 0 && nth < l; i++) {\n const current = arr[i];\n if (selectorNodes.size) {\n if (selectorNodes.has(current)) {\n if (j === nth) {\n matched.add(current);\n nth += a;\n }\n if (a > 0) {\n j++;\n } else {\n j--;\n }\n }\n } else if (i === nth) {\n if (!selector) {\n matched.add(current);\n }\n nth += a;\n }\n }\n }\n }\n }\n } else {\n const { root } = this.#root;\n if (node === root && root.nodeType === ELEMENT_NODE && (a + b) === 1) {\n if (selectorBranches) {\n const branchesLen = selectorBranches.length;\n let bool;\n for (let i = 0; i < branchesLen; i++) {\n const leaves = selectorBranches[i];\n bool = this._matchLeaves(leaves, node);\n if (bool) {\n break;\n }\n }\n if (bool) {\n matched.add(node);\n }\n } else {\n matched.add(node);\n }\n }\n }\n return matched;\n }\n\n /**\n * collect nth of type\n * @param {object} anb - An+B options\n * @param {number} anb.a - a\n * @param {number} anb.b - b\n * @param {boolean} [anb.reverse] - reverse order\n * @param {object} node - Element node\n * @returns {Set.<object>} - collection of matched nodes\n */\n _collectNthOfType(anb, node) {\n const { a, b, reverse } = anb;\n const { localName, parentNode, prefix } = node;\n const matched = new Set();\n if (parentNode) {\n const arr = [].slice.call(parentNode.children);\n const l = arr.length;\n if (l) {\n if (reverse) {\n arr.reverse();\n }\n // :first-of-type, :last-of-type\n if (a === 0) {\n if (b > 0 && b <= l) {\n let j = 0;\n for (let i = 0; i < l; i++) {\n const current = arr[i];\n const { localName: itemLocalName, prefix: itemPrefix } = current;\n if (itemLocalName === localName && itemPrefix === prefix) {\n if (j === b - 1) {\n matched.add(current);\n break;\n }\n j++;\n }\n }\n }\n // :nth-of-type()\n } else {\n let nth = b - 1;\n if (a > 0) {\n while (nth < 0) {\n nth += a;\n }\n }\n if (nth >= 0 && nth < l) {\n let j = a > 0 ? 0 : b - 1;\n for (let i = 0; i < l; i++) {\n const current = arr[i];\n const { localName: itemLocalName, prefix: itemPrefix } = current;\n if (itemLocalName === localName && itemPrefix === prefix) {\n if (j === nth) {\n matched.add(current);\n nth += a;\n }\n if (nth < 0 || nth >= l) {\n break;\n } else if (a > 0) {\n j++;\n } else {\n j--;\n }\n }\n }\n }\n }\n }\n } else {\n const { root } = this.#root;\n if (node === root && root.nodeType === ELEMENT_NODE && (a + b) === 1) {\n matched.add(node);\n }\n }\n return matched;\n }\n\n /**\n * match An+B\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @param {string} nthName - nth pseudo-class name\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchAnPlusB(ast, node, nthName) {\n const {\n nth: {\n a,\n b,\n name: nthIdentName\n },\n selector\n } = ast;\n const identName = unescapeSelector(nthIdentName);\n const anbMap = new Map();\n if (identName) {\n if (identName === 'even') {\n anbMap.set('a', 2);\n anbMap.set('b', 0);\n } else if (identName === 'odd') {\n anbMap.set('a', 2);\n anbMap.set('b', 1);\n }\n if (nthName.indexOf('last') > -1) {\n anbMap.set('reverse', true);\n }\n } else {\n if (typeof a === 'string' && /-?\\d+/.test(a)) {\n anbMap.set('a', a * 1);\n } else {\n anbMap.set('a', 0);\n }\n if (typeof b === 'string' && /-?\\d+/.test(b)) {\n anbMap.set('b', b * 1);\n } else {\n anbMap.set('b', 0);\n }\n if (nthName.indexOf('last') > -1) {\n anbMap.set('reverse', true);\n }\n }\n let matched = new Set();\n if (anbMap.has('a') && anbMap.has('b')) {\n if (/^nth-(?:last-)?child$/.test(nthName)) {\n if (selector) {\n anbMap.set('selector', selector);\n }\n const anb = Object.fromEntries(anbMap);\n const nodes = this._collectNthChild(anb, node);\n if (nodes.size) {\n matched = nodes;\n }\n } else if (/^nth-(?:last-)?of-type$/.test(nthName)) {\n const anb = Object.fromEntries(anbMap);\n const nodes = this._collectNthOfType(anb, node);\n if (nodes.size) {\n matched = nodes;\n }\n }\n }\n return matched;\n }\n\n /**\n * match pseudo element selector\n * @param {string} astName - AST name\n * @param {object} [opt] - options\n * @param {boolean} [opt.forgive] - is forgiving selector list\n * @throws {DOMException}\n * @returns {void}\n */\n _matchPseudoElementSelector(astName, opt = {}) {\n const { forgive } = opt;\n switch (astName) {\n case 'after':\n case 'backdrop':\n case 'before':\n case 'cue':\n case 'cue-region':\n case 'first-letter':\n case 'first-line':\n case 'file-selector-button':\n case 'marker':\n case 'placeholder':\n case 'selection':\n case 'target-text': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-element ::${astName}`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'part':\n case 'slotted': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-element ::${astName}()`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n default: {\n if (astName.startsWith('-webkit-')) {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-element ::${astName}`,\n NOT_SUPPORTED_ERR);\n }\n } else if (!forgive) {\n throw new DOMException(`Unknown pseudo-element ::${astName}`,\n SYNTAX_ERR);\n }\n }\n }\n }\n\n /**\n * match directionality pseudo-class - :dir()\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchDirectionPseudoClass(ast, node) {\n const astName = unescapeSelector(ast.name);\n const dir = getDirectionality(node);\n let res;\n if (astName === dir) {\n res = node;\n }\n return res ?? null;\n }\n\n /**\n * match language pseudo-class - :lang()\n * @see https://datatracker.ietf.org/doc/html/rfc4647#section-3.3.1\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchLanguagePseudoClass(ast, node) {\n const astName = unescapeSelector(ast.name);\n let res;\n if (astName === '*') {\n if (node.hasAttribute('lang')) {\n if (node.getAttribute('lang')) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.nodeType === ELEMENT_NODE) {\n if (parent.hasAttribute('lang')) {\n if (parent.getAttribute('lang')) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n }\n } else if (astName) {\n const langPart = `(?:-${ALPHA_NUM})*`;\n const regLang = new RegExp(`^(?:\\\\*-)?${ALPHA_NUM}${langPart}$`, 'i');\n if (regLang.test(astName)) {\n let regExtendedLang;\n if (astName.indexOf('-') > -1) {\n const [langMain, langSub, ...langRest] = astName.split('-');\n let extendedMain;\n if (langMain === '*') {\n extendedMain = `${ALPHA_NUM}${langPart}`;\n } else {\n extendedMain = `${langMain}${langPart}`;\n }\n const extendedSub = `-${langSub}${langPart}`;\n const len = langRest.length;\n let extendedRest = '';\n if (len) {\n for (let i = 0; i < len; i++) {\n extendedRest += `-${langRest[i]}${langPart}`;\n }\n }\n regExtendedLang =\n new RegExp(`^${extendedMain}${extendedSub}${extendedRest}$`, 'i');\n } else {\n regExtendedLang = new RegExp(`^${astName}${langPart}$`, 'i');\n }\n if (node.hasAttribute('lang')) {\n if (regExtendedLang.test(node.getAttribute('lang'))) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.nodeType === ELEMENT_NODE) {\n if (parent.hasAttribute('lang')) {\n const value = parent.getAttribute('lang');\n if (regExtendedLang.test(value)) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n }\n }\n }\n return res ?? null;\n }\n\n /**\n * match :has() pseudo-class function\n * @param {Array.<object>} leaves - AST leaves\n * @param {object} node - Element node\n * @returns {boolean} - result\n */\n _matchHasPseudoFunc(leaves, node) {\n let bool;\n if (Array.isArray(leaves) && leaves.length) {\n const [leaf] = leaves;\n const { type: leafType } = leaf;\n let combo;\n if (leafType === COMBINATOR) {\n combo = leaves.shift();\n } else {\n combo = {\n name: ' ',\n type: COMBINATOR\n };\n }\n const twigLeaves = [];\n while (leaves.length) {\n const [item] = leaves;\n const { type: itemType } = item;\n if (itemType === COMBINATOR) {\n break;\n } else {\n twigLeaves.push(leaves.shift());\n }\n }\n const twig = {\n combo,\n leaves: twigLeaves\n };\n const nodes = this._matchCombinator(twig, node, {\n find: FIND_NEXT\n });\n if (nodes.size) {\n if (leaves.length) {\n for (const nextNode of nodes) {\n bool =\n this._matchHasPseudoFunc(Object.assign([], leaves), nextNode);\n if (bool) {\n break;\n }\n }\n } else {\n bool = true;\n }\n }\n }\n return !!bool;\n }\n\n /**\n * match logical pseudo-class functions - :has(), :is(), :not(), :where()\n * @param {object} astData - AST data\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchLogicalPseudoFunc(astData, node) {\n const {\n astName = '', branches = [], selector = '', twigBranches = []\n } = astData;\n let res;\n if (astName === 'has') {\n if (selector.includes(':has(')) {\n res = null;\n } else {\n const l = branches.length;\n let bool;\n for (let i = 0; i < l; i++) {\n const leaves = branches[i];\n bool = this._matchHasPseudoFunc(Object.assign([], leaves), node);\n if (bool) {\n break;\n }\n }\n if (bool) {\n res = node;\n }\n }\n } else {\n const forgive = /^(?:is|where)$/.test(astName);\n const l = twigBranches.length;\n let bool;\n for (let i = 0; i < l; i++) {\n const branch = twigBranches[i];\n const lastIndex = branch.length - 1;\n const { leaves } = branch[lastIndex];\n bool = this._matchLeaves(leaves, node, { forgive });\n if (bool && lastIndex > 0) {\n let nextNodes = new Set([node]);\n for (let j = lastIndex - 1; j >= 0; j--) {\n const twig = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, {\n forgive,\n find: FIND_PREV\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n bool = true;\n break;\n } else {\n nextNodes = new Set(arr);\n }\n } else {\n bool = false;\n break;\n }\n }\n }\n if (bool) {\n break;\n }\n }\n if (astName === 'not') {\n if (!bool) {\n res = node;\n }\n } else if (bool) {\n res = node;\n }\n }\n return res ?? null;\n }\n\n /**\n * match pseudo-class selector\n * @see https://html.spec.whatwg.org/#pseudo-classes\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.forgive] - is forgiving selector list\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchPseudoClassSelector(ast, node, opt = {}) {\n const { children: astChildren } = ast;\n const { localName, parentNode } = node;\n const { forgive } = opt;\n const astName = unescapeSelector(ast.name);\n let matched = new Set();\n // :has(), :is(), :not(), :where()\n if (REG_LOGICAL_PSEUDO.test(astName)) {\n let astData;\n if (this.#cache.has(ast)) {\n astData = this.#cache.get(ast);\n } else {\n const branches = walkAST(ast);\n const selectors = [];\n const twigBranches = [];\n for (const [...leaves] of branches) {\n for (const leaf of leaves) {\n const css = generateCSS(leaf);\n selectors.push(css);\n }\n const branch = [];\n const leavesSet = new Set();\n let item = leaves.shift();\n while (item) {\n if (item.type === COMBINATOR) {\n branch.push({\n combo: item,\n leaves: [...leavesSet]\n });\n leavesSet.clear();\n } else if (item) {\n leavesSet.add(item);\n }\n if (leaves.length) {\n item = leaves.shift();\n } else {\n branch.push({\n combo: null,\n leaves: [...leavesSet]\n });\n leavesSet.clear();\n break;\n }\n }\n twigBranches.push(branch);\n }\n astData = {\n astName,\n branches,\n twigBranches,\n selector: selectors.join(',')\n };\n this.#cache.set(ast, astData);\n }\n const res = this._matchLogicalPseudoFunc(astData, node);\n if (res) {\n matched.add(res);\n }\n } else if (Array.isArray(astChildren)) {\n const [branch] = astChildren;\n // :nth-child(), :nth-last-child(), nth-of-type(), :nth-last-of-type()\n if (/^nth-(?:last-)?(?:child|of-type)$/.test(astName)) {\n const nodes = this._matchAnPlusB(branch, node, astName);\n if (nodes.size) {\n matched = nodes;\n }\n // :dir()\n } else if (astName === 'dir') {\n const res = this._matchDirectionPseudoClass(branch, node);\n if (res) {\n matched.add(res);\n }\n // :lang()\n } else if (astName === 'lang') {\n const res = this._matchLanguagePseudoClass(branch, node);\n if (res) {\n matched.add(res);\n }\n } else {\n switch (astName) {\n case 'current':\n case 'nth-col':\n case 'nth-last-col': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-class :${astName}()`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'host':\n case 'host-context': {\n // ignore\n break;\n }\n default: {\n if (!forgive) {\n throw new DOMException(`Unknown pseudo-class :${astName}()`,\n SYNTAX_ERR);\n }\n }\n }\n }\n } else {\n const { document, root } = this.#root;\n const regAnchor = /^a(?:rea)?$/;\n const regFormCtrl =\n /^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/;\n const regFormValidity = /^(?:(?:inpu|selec)t|button|form|textarea)$/;\n const regInteract = /^d(?:etails|ialog)$/;\n const regTypeCheck = /^(?:checkbox|radio)$/;\n const regTypeDate = /^(?:date(?:time-local)?|month|time|week)$/;\n const regTypeRange =\n /(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/;\n const regTypeText = /^(?:(?:emai|te|ur)l|number|password|search|text)$/;\n switch (astName) {\n case 'any-link':\n case 'link': {\n if (regAnchor.test(localName) && node.hasAttribute('href')) {\n matched.add(node);\n }\n break;\n }\n case 'local-link': {\n if (regAnchor.test(localName) && node.hasAttribute('href')) {\n const { href, origin, pathname } = new URL(document.URL);\n const attrURL = new URL(node.getAttribute('href'), href);\n if (attrURL.origin === origin && attrURL.pathname === pathname) {\n matched.add(node);\n }\n }\n break;\n }\n case 'visited': {\n // prevent fingerprinting\n break;\n }\n case 'target': {\n const { hash } = new URL(document.URL);\n if (node.id && hash === `#${node.id}` && document.contains(node)) {\n matched.add(node);\n }\n break;\n }\n case 'target-within': {\n const { hash } = new URL(document.URL);\n if (hash) {\n const id = hash.replace(/^#/, '');\n let current = document.getElementById(id);\n while (current) {\n if (current === node) {\n matched.add(node);\n break;\n }\n current = current.parentNode;\n }\n }\n break;\n }\n case 'scope': {\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (node === this.#node) {\n matched.add(node);\n }\n } else if (node === document.documentElement) {\n matched.add(node);\n }\n break;\n }\n case 'focus': {\n if (node === document.activeElement) {\n matched.add(node);\n }\n break;\n }\n case 'focus-within': {\n let current = document.activeElement;\n while (current) {\n if (current === node) {\n matched.add(node);\n break;\n }\n current = current.parentNode;\n }\n break;\n }\n case 'open': {\n if (regInteract.test(localName) && node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'closed': {\n if (regInteract.test(localName) && !node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'disabled': {\n if (regFormCtrl.test(localName) || isCustomElementName(localName)) {\n if (node.disabled || node.hasAttribute('disabled')) {\n matched.add(node);\n } else {\n let parent = parentNode;\n while (parent) {\n if (parent.localName === 'fieldset') {\n break;\n }\n parent = parent.parentNode;\n }\n if (parent && parentNode.localName !== 'legend' &&\n parent.hasAttribute('disabled')) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'enabled': {\n if ((regFormCtrl.test(localName) || isCustomElementName(localName)) &&\n !(node.disabled && node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n case 'read-only': {\n switch (localName) {\n case 'textarea': {\n if (node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled')) {\n matched.add(node);\n }\n break;\n }\n case 'input': {\n if ((!node.type || regTypeDate.test(node.type) ||\n regTypeText.test(node.type)) &&\n (node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n default: {\n if (!isContentEditable(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'read-write': {\n switch (localName) {\n case 'textarea': {\n if (!(node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n case 'input': {\n if ((!node.type || regTypeDate.test(node.type) ||\n regTypeText.test(node.type)) &&\n !(node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n default: {\n if (isContentEditable(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'placeholder-shown': {\n let targetNode;\n if (localName === 'textarea') {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n if (regTypeText.test(node.getAttribute('type'))) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode && node.value === '' &&\n node.hasAttribute('placeholder') &&\n node.getAttribute('placeholder').trim().length) {\n matched.add(node);\n }\n break;\n }\n case 'checked': {\n if ((node.checked && localName === 'input' &&\n node.hasAttribute('type') &&\n regTypeCheck.test(node.getAttribute('type'))) ||\n (node.selected && localName === 'option')) {\n matched.add(node);\n }\n break;\n }\n case 'indeterminate': {\n if ((node.indeterminate && localName === 'input' &&\n node.type === 'checkbox') ||\n (localName === 'progress' && !node.hasAttribute('value'))) {\n matched.add(node);\n } else if (localName === 'input' && node.type === 'radio' &&\n !node.hasAttribute('checked')) {\n const nodeName = node.name;\n let parent = node.parentNode;\n while (parent) {\n if (parent.localName === 'form') {\n break;\n }\n parent = parent.parentNode;\n }\n if (!parent) {\n parent = document.documentElement;\n }\n const nodes = [].slice.call(parent.getElementsByTagName('input'));\n let checked;\n for (const item of nodes) {\n if (item.getAttribute('type') === 'radio') {\n if (nodeName) {\n if (item.getAttribute('name') === nodeName) {\n checked = !!item.checked;\n }\n } else if (!item.hasAttribute('name')) {\n checked = !!item.checked;\n }\n if (checked) {\n break;\n }\n }\n }\n if (!checked) {\n matched.add(node);\n }\n }\n break;\n }\n case 'default': {\n const regTypeReset = /^(?:button|reset)$/;\n const regTypeSubmit = /^(?:image|submit)$/;\n // button[type=\"submit\"], input[type=\"submit\"], input[type=\"image\"]\n if ((localName === 'button' &&\n !(node.hasAttribute('type') &&\n regTypeReset.test(node.getAttribute('type')))) ||\n (localName === 'input' && node.hasAttribute('type') &&\n regTypeSubmit.test(node.getAttribute('type')))) {\n let form = node.parentNode;\n while (form) {\n if (form.localName === 'form') {\n break;\n }\n form = form.parentNode;\n }\n if (form) {\n const iterator = document.createNodeIterator(form, SHOW_ELEMENT);\n let nextNode = iterator.nextNode();\n while (nextNode) {\n const nodeName = nextNode.localName;\n let m;\n if (nodeName === 'button') {\n m = !(nextNode.hasAttribute('type') &&\n regTypeReset.test(nextNode.getAttribute('type')));\n } else if (nodeName === 'input') {\n m = nextNode.hasAttribute('type') &&\n regTypeSubmit.test(nextNode.getAttribute('type'));\n }\n if (m) {\n if (nextNode === node) {\n matched.add(node);\n }\n break;\n }\n nextNode = iterator.nextNode();\n }\n }\n // input[type=\"checkbox\"], input[type=\"radio\"]\n } else if (localName === 'input' && node.hasAttribute('type') &&\n regTypeCheck.test(node.getAttribute('type')) &&\n (node.checked || node.hasAttribute('checked'))) {\n matched.add(node);\n // option\n } else if (localName === 'option') {\n let isMultiple = false;\n let parent = parentNode;\n while (parent) {\n if (parent.localName === 'datalist') {\n break;\n } else if (parent.localName === 'select') {\n if (parent.multiple || parent.hasAttribute('multiple')) {\n isMultiple = true;\n }\n break;\n }\n parent = parent.parentNode;\n }\n if (isMultiple) {\n if (node.selected || node.hasAttribute('selected')) {\n matched.add(node);\n }\n } else {\n const firstOpt = parentNode.firstElementChild;\n const defaultOpt = new Set();\n let opt = firstOpt;\n while (opt) {\n if (opt.selected || opt.hasAttribute('selected')) {\n defaultOpt.add(opt);\n break;\n }\n opt = opt.nextElementSibling;\n }\n if (!defaultOpt.size) {\n defaultOpt.add(firstOpt);\n }\n if (defaultOpt.has(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'valid': {\n if (regFormValidity.test(localName)) {\n if (node.checkValidity()) {\n matched.add(node);\n }\n } else if (localName === 'fieldset') {\n const iterator = document.createNodeIterator(node, SHOW_ELEMENT);\n let refNode = iterator.nextNode();\n if (refNode === node) {\n refNode = iterator.nextNode();\n }\n let bool;\n while (refNode) {\n if (regFormValidity.test(refNode.localName)) {\n bool = refNode.checkValidity();\n if (!bool) {\n break;\n }\n }\n refNode = iterator.nextNode();\n }\n if (bool) {\n matched.add(node);\n }\n }\n break;\n }\n case 'invalid': {\n if (regFormValidity.test(localName)) {\n if (!node.checkValidity()) {\n matched.add(node);\n }\n } else if (localName === 'fieldset') {\n const iterator = document.createNodeIterator(node, SHOW_ELEMENT);\n let refNode = iterator.nextNode();\n if (refNode === node) {\n refNode = iterator.nextNode();\n }\n let bool;\n while (refNode) {\n if (regFormValidity.test(refNode.localName)) {\n bool = refNode.checkValidity();\n if (!bool) {\n break;\n }\n }\n refNode = iterator.nextNode();\n }\n if (!bool) {\n matched.add(node);\n }\n }\n break;\n }\n case 'in-range': {\n if (localName === 'input' &&\n !(node.readonly || node.hasAttribute('readonly')) &&\n !(node.disabled || node.hasAttribute('disabled')) &&\n node.hasAttribute('type') &&\n regTypeRange.test(node.getAttribute('type')) &&\n !(node.validity.rangeUnderflow ||\n node.validity.rangeOverflow) &&\n (node.hasAttribute('min') || node.hasAttribute('max') ||\n node.getAttribute('type') === 'range')) {\n matched.add(node);\n }\n break;\n }\n case 'out-of-range': {\n if (localName === 'input' &&\n !(node.readonly || node.hasAttribute('readonly')) &&\n !(node.disabled || node.hasAttribute('disabled')) &&\n node.hasAttribute('type') &&\n regTypeRange.test(node.getAttribute('type')) &&\n (node.validity.rangeUnderflow || node.validity.rangeOverflow)) {\n matched.add(node);\n }\n break;\n }\n case 'required': {\n let targetNode;\n if (/^(?:select|textarea)$/.test(localName)) {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n const inputType = node.getAttribute('type');\n if (inputType === 'file' || regTypeCheck.test(inputType) ||\n regTypeDate.test(inputType) || regTypeText.test(inputType)) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode &&\n (node.required || node.hasAttribute('required'))) {\n matched.add(node);\n }\n break;\n }\n case 'optional': {\n let targetNode;\n if (/^(?:select|textarea)$/.test(localName)) {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n const inputType = node.getAttribute('type');\n if (inputType === 'file' || regTypeCheck.test(inputType) ||\n regTypeDate.test(inputType) || regTypeText.test(inputType)) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode &&\n !(node.required || node.hasAttribute('required'))) {\n matched.add(node);\n }\n break;\n }\n case 'root': {\n if (node === document.documentElement) {\n matched.add(node);\n }\n break;\n }\n case 'empty': {\n if (node.hasChildNodes()) {\n const nodes = node.childNodes.values();\n let bool;\n for (const refNode of nodes) {\n bool = refNode.nodeType !== ELEMENT_NODE &&\n refNode.nodeType !== TEXT_NODE;\n if (!bool) {\n break;\n }\n }\n if (bool) {\n matched.add(node);\n }\n } else {\n matched.add(node);\n }\n break;\n }\n case 'first-child': {\n if ((parentNode && node === parentNode.firstElementChild) ||\n (node === root && root.nodeType === ELEMENT_NODE)) {\n matched.add(node);\n }\n break;\n }\n case 'last-child': {\n if ((parentNode && node === parentNode.lastElementChild) ||\n (node === root && root.nodeType === ELEMENT_NODE)) {\n matched.add(node);\n }\n break;\n }\n case 'only-child': {\n if ((parentNode &&\n node === parentNode.firstElementChild &&\n node === parentNode.lastElementChild) ||\n (node === root && root.nodeType === ELEMENT_NODE)) {\n matched.add(node);\n }\n break;\n }\n case 'first-of-type': {\n if (parentNode) {\n const [node1] = this._collectNthOfType({\n a: 0,\n b: 1\n }, node);\n if (node1) {\n matched.add(node1);\n }\n } else if (node === root && root.nodeType === ELEMENT_NODE) {\n matched.add(node);\n }\n break;\n }\n case 'last-of-type': {\n if (parentNode) {\n const [node1] = this._collectNthOfType({\n a: 0,\n b: 1,\n reverse: true\n }, node);\n if (node1) {\n matched.add(node1);\n }\n } else if (node === root && root.nodeType === ELEMENT_NODE) {\n matched.add(node);\n }\n break;\n }\n case 'only-of-type': {\n if (parentNode) {\n const [node1] = this._collectNthOfType({\n a: 0,\n b: 1\n }, node);\n if (node1 === node) {\n const [node2] = this._collectNthOfType({\n a: 0,\n b: 1,\n reverse: true\n }, node);\n if (node2 === node) {\n matched.add(node);\n }\n }\n } else if (node === root && root.nodeType === ELEMENT_NODE) {\n matched.add(node);\n }\n break;\n }\n case 'host':\n case 'host-context': {\n // ignore\n break;\n }\n // legacy pseudo-elements\n case 'after':\n case 'before':\n case 'first-letter':\n case 'first-line': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-element ::${astName}`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'active':\n case 'autofill':\n case 'blank':\n case 'buffering':\n case 'current':\n case 'focus-visible':\n case 'fullscreen':\n case 'future':\n case 'hover':\n case 'modal':\n case 'muted':\n case 'past':\n case 'paused':\n case 'picture-in-picture':\n case 'playing':\n case 'seeking':\n case 'stalled':\n case 'user-invalid':\n case 'user-valid':\n case 'volume-locked':\n case '-webkit-autofill': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-class :${astName}`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n default: {\n if (astName.startsWith('-webkit-')) {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-class :${astName}`,\n NOT_SUPPORTED_ERR);\n }\n } else if (!forgive) {\n throw new DOMException(`Unknown pseudo-class :${astName}`,\n SYNTAX_ERR);\n }\n }\n }\n }\n return matched;\n }\n\n /**\n * match attribute selector\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchAttributeSelector(ast, node) {\n const {\n flags: astFlags, matcher: astMatcher, name: astName, value: astValue\n } = ast;\n if (typeof astFlags === 'string' && !/^[is]$/i.test(astFlags)) {\n const css = generateCSS(ast);\n throw new DOMException(`Invalid selector ${css}`, SYNTAX_ERR);\n }\n const { attributes } = node;\n let res;\n if (attributes && attributes.length) {\n const { document } = this.#root;\n let caseInsensitive;\n if (document.contentType === 'text/html') {\n if (typeof astFlags === 'string' && /^s$/i.test(astFlags)) {\n caseInsensitive = false;\n } else {\n caseInsensitive = true;\n }\n } else if (typeof astFlags === 'string' && /^i$/i.test(astFlags)) {\n caseInsensitive = true;\n } else {\n caseInsensitive = false;\n }\n let astAttrName = unescapeSelector(astName.name);\n if (caseInsensitive) {\n astAttrName = astAttrName.toLowerCase();\n }\n const attrValues = new Set();\n // namespaced\n if (astAttrName.indexOf('|') > -1) {\n const {\n prefix: astAttrPrefix, tagName: astAttrLocalName\n } = selectorToNodeProps(astAttrName);\n for (let { name: itemName, value: itemValue } of attributes) {\n if (caseInsensitive) {\n itemName = itemName.toLowerCase();\n itemValue = itemValue.toLowerCase();\n }\n switch (astAttrPrefix) {\n case '': {\n if (astAttrLocalName === itemName) {\n attrValues.add(itemValue);\n }\n break;\n }\n case '*': {\n if (itemName.indexOf(':') > -1) {\n if (itemName.endsWith(`:${astAttrLocalName}`)) {\n attrValues.add(itemValue);\n }\n } else if (astAttrLocalName === itemName) {\n attrValues.add(itemValue);\n }\n break;\n }\n default: {\n if (itemName.indexOf(':') > -1) {\n const [itemNamePrefix, itemNameLocalName] = itemName.split(':');\n if (astAttrPrefix === itemNamePrefix &&\n astAttrLocalName === itemNameLocalName &&\n isNamespaceDeclared(astAttrPrefix, node)) {\n attrValues.add(itemValue);\n }\n }\n }\n }\n }\n } else {\n for (let { name: itemName, value: itemValue } of attributes) {\n if (caseInsensitive) {\n itemName = itemName.toLowerCase();\n itemValue = itemValue.toLowerCase();\n }\n if (itemName.indexOf(':') > -1) {\n const [itemNamePrefix, itemNameLocalName] = itemName.split(':');\n // ignore xml:lang\n if (itemNamePrefix === 'xml' && itemNameLocalName === 'lang') {\n continue;\n } else if (astAttrName === itemNameLocalName) {\n attrValues.add(itemValue);\n }\n } else if (astAttrName === itemName) {\n attrValues.add(itemValue);\n }\n }\n }\n if (attrValues.size) {\n const {\n name: astAttrIdentValue, value: astAttrStringValue\n } = astValue || {};\n let attrValue;\n if (astAttrIdentValue) {\n if (caseInsensitive) {\n attrValue = astAttrIdentValue.toLowerCase();\n } else {\n attrValue = astAttrIdentValue;\n }\n } else if (astAttrStringValue) {\n if (caseInsensitive) {\n attrValue = astAttrStringValue.toLowerCase();\n } else {\n attrValue = astAttrStringValue;\n }\n } else if (astAttrStringValue === '') {\n attrValue = astAttrStringValue;\n }\n switch (astMatcher) {\n case '=': {\n if (typeof attrValue === 'string' && attrValues.has(attrValue)) {\n res = node;\n }\n break;\n }\n case '~=': {\n if (attrValue && typeof attrValue === 'string') {\n for (const value of attrValues) {\n const item = new Set(value.split(/\\s+/));\n if (item.has(attrValue)) {\n res = node;\n break;\n }\n }\n }\n break;\n }\n case '|=': {\n if (attrValue && typeof attrValue === 'string') {\n let item;\n for (const value of attrValues) {\n if (value === attrValue || value.startsWith(`${attrValue}-`)) {\n item = value;\n break;\n }\n }\n if (item) {\n res = node;\n }\n }\n break;\n }\n case '^=': {\n if (attrValue && typeof attrValue === 'string') {\n let item;\n for (const value of attrValues) {\n if (value.startsWith(`${attrValue}`)) {\n item = value;\n break;\n }\n }\n if (item) {\n res = node;\n }\n }\n break;\n }\n case '$=': {\n if (attrValue && typeof attrValue === 'string') {\n let item;\n for (const value of attrValues) {\n if (value.endsWith(`${attrValue}`)) {\n item = value;\n break;\n }\n }\n if (item) {\n res = node;\n }\n }\n break;\n }\n case '*=': {\n if (attrValue && typeof attrValue === 'string') {\n let item;\n for (const value of attrValues) {\n if (value.includes(`${attrValue}`)) {\n item = value;\n break;\n }\n }\n if (item) {\n res = node;\n }\n }\n break;\n }\n case null:\n default: {\n res = node;\n }\n }\n }\n }\n return res ?? null;\n }\n\n /**\n * match class selector\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchClassSelector(ast, node) {\n const astName = unescapeSelector(ast.name);\n let res;\n if (node.classList.contains(astName)) {\n res = node;\n }\n return res ?? null;\n }\n\n /**\n * match ID selector\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchIDSelector(ast, node) {\n const astName = unescapeSelector(ast.name);\n const { id } = node;\n let res;\n if (astName === id) {\n res = node;\n }\n return res ?? null;\n }\n\n /**\n * match type selector\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.forgive] - is forgiving selector list\n * @returns {?object} - matched node\n */\n _matchTypeSelector(ast, node, opt = {}) {\n const astName = unescapeSelector(ast.name);\n const { localName, prefix } = node;\n const { forgive } = opt;\n const { document } = this.#root;\n let {\n prefix: astPrefix, tagName: astNodeName\n } = selectorToNodeProps(astName, node);\n if (document.contentType === 'text/html') {\n astPrefix = astPrefix.toLowerCase();\n astNodeName = astNodeName.toLowerCase();\n }\n let nodePrefix;\n let nodeName;\n // just in case that the namespaced content is parsed as text/html\n if (localName.indexOf(':') > -1) {\n [nodePrefix, nodeName] = localName.split(':');\n } else {\n nodePrefix = prefix || '';\n nodeName = localName;\n }\n let res;\n if (astPrefix === '' && nodePrefix === '') {\n if (node.namespaceURI === null &&\n (astNodeName === '*' || astNodeName === nodeName)) {\n res = node;\n }\n } else if (astPrefix === '*') {\n if (astNodeName === '*' || astNodeName === nodeName) {\n res = node;\n }\n } else if (astPrefix === nodePrefix) {\n if (isNamespaceDeclared(astPrefix, node)) {\n if (astNodeName === '*' || astNodeName === nodeName) {\n res = node;\n }\n } else if (!forgive) {\n throw new DOMException(`Undeclared namespace ${astPrefix}`, SYNTAX_ERR);\n }\n } else if (astPrefix && !forgive && !isNamespaceDeclared(astPrefix, node)) {\n throw new DOMException(`Undeclared namespace ${astPrefix}`, SYNTAX_ERR);\n }\n return res ?? null;\n };\n\n /**\n * match shadow host pseudo class\n * @param {object} ast - AST\n * @param {object} node - DocumentFragment node\n * @returns {?object} - matched node\n */\n _matchShadowHostPseudoClass(ast, node) {\n const { children: astChildren } = ast;\n const astName = unescapeSelector(ast.name);\n let res;\n if (Array.isArray(astChildren)) {\n const [branch] = walkAST(astChildren[0]);\n const [...leaves] = branch;\n const { host } = node;\n if (astName === 'host') {\n let bool;\n for (const leaf of leaves) {\n const { type: leafType } = leaf;\n if (leafType === COMBINATOR) {\n const css = generateCSS(ast);\n throw new DOMException(`Invalid selector ${css}`, SYNTAX_ERR);\n }\n bool = this._matchSelector(leaf, host).has(host);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n res = node;\n }\n } else if (astName === 'host-context') {\n let parent = host;\n let bool;\n while (parent) {\n for (const leaf of leaves) {\n const { type: leafType } = leaf;\n if (leafType === COMBINATOR) {\n const css = generateCSS(ast);\n throw new DOMException(`Invalid selector ${css}`, SYNTAX_ERR);\n }\n bool = this._matchSelector(leaf, parent).has(parent);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n break;\n } else {\n parent = parent.parentNode;\n }\n }\n if (bool) {\n res = node;\n }\n }\n } else if (astName === 'host') {\n res = node;\n } else {\n throw new DOMException(`Invalid selector :${astName}`, SYNTAX_ERR);\n }\n return res ?? null;\n }\n\n /**\n * match selector\n * @param {object} ast - AST\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} [opt] - options\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchSelector(ast, node, opt) {\n const { type: astType } = ast;\n const astName = unescapeSelector(ast.name);\n const { shadow } = this.#root;\n let matched = new Set();\n if (node.nodeType === ELEMENT_NODE) {\n switch (astType) {\n case SELECTOR_ATTR: {\n const res = this._matchAttributeSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case SELECTOR_CLASS: {\n const res = this._matchClassSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case SELECTOR_ID: {\n const res = this._matchIDSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case SELECTOR_PSEUDO_CLASS: {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n if (nodes.size) {\n matched = nodes;\n }\n break;\n }\n case SELECTOR_PSEUDO_ELEMENT: {\n this._matchPseudoElementSelector(astName, opt);\n break;\n }\n case SELECTOR_TYPE:\n default: {\n const res = this._matchTypeSelector(ast, node, opt);\n if (res) {\n matched.add(res);\n }\n }\n }\n } else if (shadow && astType === SELECTOR_PSEUDO_CLASS &&\n node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n if (astName !== 'has' && REG_LOGICAL_PSEUDO.test(astName)) {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n if (nodes.size) {\n matched = nodes;\n }\n } else if (REG_SHADOW_HOST.test(astName)) {\n const res = this._matchShadowHostPseudoClass(ast, node);\n if (res) {\n matched.add(res);\n }\n }\n }\n return matched;\n }\n\n /**\n * match leaves\n * @param {Array.<object>} leaves - AST leaves\n * @param {object} node - node\n * @param {object} [opt] - options\n * @returns {boolean} - result\n */\n _matchLeaves(leaves, node, opt) {\n let bool;\n for (const leaf of leaves) {\n bool = this._matchSelector(leaf, node, opt).has(node);\n if (!bool) {\n break;\n }\n }\n return !!bool;\n }\n\n /**\n * find descendant nodes\n * @param {Array.<object>} leaves - AST leaves\n * @param {object} baseNode - base Element node\n * @returns {object} - collection of nodes and pending state\n */\n _findDescendantNodes(leaves, baseNode) {\n const [leaf, ...items] = leaves;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const matchItems = items.length > 0;\n const { document, root, shadow } = this.#root;\n let nodes = new Set();\n let pending = false;\n if (shadow) {\n pending = true;\n } else {\n switch (leafType) {\n case SELECTOR_ID: {\n if (root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n const node = root.getElementById(leafName);\n if (node && node !== baseNode && baseNode.contains(node)) {\n if (matchItems) {\n const bool = this._matchLeaves(items, node);\n if (bool) {\n nodes.add(node);\n }\n } else {\n nodes.add(node);\n }\n }\n }\n break;\n }\n case SELECTOR_CLASS: {\n const arr = [].slice.call(baseNode.getElementsByClassName(leafName));\n if (arr.length) {\n if (matchItems) {\n for (const node of arr) {\n const bool = this._matchLeaves(items, node);\n if (bool) {\n nodes.add(node);\n }\n }\n } else {\n nodes = new Set(arr);\n }\n }\n break;\n }\n case SELECTOR_TYPE: {\n if (document.contentType === 'text/html' && !/[*|]/.test(leafName)) {\n const arr = [].slice.call(baseNode.getElementsByTagName(leafName));\n if (arr.length) {\n if (matchItems) {\n for (const node of arr) {\n const bool = this._matchLeaves(items, node);\n if (bool) {\n nodes.add(node);\n }\n }\n } else {\n nodes = new Set(arr);\n }\n }\n } else {\n pending = true;\n }\n break;\n }\n case SELECTOR_PSEUDO_ELEMENT: {\n this._matchPseudoElementSelector(leafName);\n break;\n }\n default: {\n pending = true;\n }\n }\n }\n return {\n nodes,\n pending\n };\n }\n\n /**\n * match combinator\n * @param {object} twig - twig\n * @param {object} node - Element node\n * @param {object} [opt] - option\n * @param {string} [opt.find] - 'prev'|'next', which nodes to find\n * @param {boolean} [opt.forgive] - is forgiving selector list\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchCombinator(twig, node, opt = {}) {\n const { combo, leaves } = twig;\n const { name: comboName } = combo;\n const { find, forgive } = opt;\n let matched = new Set();\n if (find === FIND_NEXT) {\n switch (comboName) {\n case '+': {\n const refNode = node.nextElementSibling;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case '~': {\n let refNode = node.nextElementSibling;\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n refNode = refNode.nextElementSibling;\n }\n break;\n }\n case '>': {\n const childNodes = [].slice.call(node.children);\n for (const refNode of childNodes) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case ' ':\n default: {\n const { nodes, pending } = this._findDescendantNodes(leaves, node);\n if (nodes.size) {\n matched = nodes;\n } else if (pending) {\n const { document } = this.#root;\n const iterator = document.createNodeIterator(node, SHOW_ELEMENT);\n let refNode = iterator.nextNode();\n if (refNode === node) {\n refNode = iterator.nextNode();\n }\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n refNode = iterator.nextNode();\n }\n }\n }\n }\n } else {\n switch (comboName) {\n case '+': {\n const refNode = node.previousElementSibling;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case '~': {\n const arr = [];\n let refNode = node.previousElementSibling;\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n arr.push(refNode);\n }\n refNode = refNode.previousElementSibling;\n }\n if (arr.length) {\n matched = new Set(arr.reverse());\n }\n break;\n }\n case '>': {\n const refNode = node.parentNode;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case ' ':\n default: {\n const arr = [];\n let refNode = node.parentNode;\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n arr.push(refNode);\n }\n refNode = refNode.parentNode;\n }\n if (arr.length) {\n matched = new Set(arr.reverse());\n }\n }\n }\n }\n return matched;\n }\n\n /**\n * find nodes\n * @param {object} twig - twig\n * @param {string} targetType - target type\n * @returns {object} - collection of nodes etc.\n */\n _findNodes(twig, targetType) {\n const { leaves: [leaf, ...items] } = twig;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const { document, root, shadow } = this.#root;\n let nodes = new Set();\n let pending = false;\n switch (leafType) {\n case SELECTOR_ID: {\n if (targetType === TARGET_SELF) {\n const bool = this._matchLeaves([leaf], this.#node);\n if (bool) {\n nodes.add(this.#node);\n }\n } else if (targetType === TARGET_LINEAL) {\n let refNode = this.#node;\n while (refNode) {\n const bool = this._matchLeaves([leaf], refNode);\n if (bool) {\n nodes.add(refNode);\n break;\n }\n refNode = refNode.parentNode;\n }\n } else if (targetType === TARGET_ALL ||\n root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n const node = root.getElementById(leafName);\n if (node) {\n nodes.add(node);\n }\n }\n break;\n }\n case SELECTOR_CLASS: {\n if (targetType === TARGET_SELF) {\n if (this.#node.nodeType === ELEMENT_NODE &&\n this.#node.classList.contains(leafName)) {\n nodes.add(this.#node);\n }\n } else if (targetType === TARGET_LINEAL) {\n let refNode = this.#node;\n while (refNode) {\n if (refNode.nodeType === ELEMENT_NODE) {\n if (refNode.classList.contains(leafName)) {\n nodes.add(refNode);\n }\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n } else if (root.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const childNodes = [].slice.call(root.children);\n const arr = [];\n for (const node of childNodes) {\n if (node.classList.contains(leafName)) {\n arr.push(node);\n }\n const a = [].slice.call(node.getElementsByClassName(leafName));\n arr.push(...a);\n }\n if (arr.length) {\n nodes = new Set(arr);\n }\n } else {\n const arr = [].slice.call(root.getElementsByClassName(leafName));\n if (this.#node.nodeType === ELEMENT_NODE) {\n for (const node of arr) {\n if (node === this.#node || isInclusive(node, this.#node)) {\n nodes.add(node);\n }\n }\n } else if (arr.length) {\n nodes = new Set(arr);\n }\n }\n break;\n }\n case SELECTOR_TYPE: {\n if (targetType === TARGET_SELF) {\n if (this.#node.nodeType === ELEMENT_NODE) {\n const bool = this._matchLeaves([leaf], this.#node);\n if (bool) {\n nodes.add(this.#node);\n }\n }\n } else if (targetType === TARGET_LINEAL) {\n let refNode = this.#node;\n while (refNode) {\n if (refNode.nodeType === ELEMENT_NODE) {\n const bool = this._matchLeaves([leaf], refNode);\n if (bool) {\n nodes.add(refNode);\n }\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n } else if (document.contentType !== 'text/html' ||\n /[*|]/.test(leafName)) {\n pending = true;\n } else if (root.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const tagName = leafName.toLowerCase();\n const childNodes = [].slice.call(root.children);\n const arr = [];\n for (const node of childNodes) {\n if (node.localName === tagName) {\n arr.push(node);\n }\n const a = [].slice.call(node.getElementsByTagName(leafName));\n arr.push(...a);\n }\n if (arr.length) {\n nodes = new Set(arr);\n }\n } else {\n const arr = [].slice.call(root.getElementsByTagName(leafName));\n if (this.#node.nodeType === ELEMENT_NODE) {\n for (const node of arr) {\n if (node === this.#node || isInclusive(node, this.#node)) {\n nodes.add(node);\n }\n }\n } else if (arr.length) {\n nodes = new Set(arr);\n }\n }\n break;\n }\n case SELECTOR_PSEUDO_ELEMENT: {\n // throws\n this._matchPseudoElementSelector(leafName);\n break;\n }\n default: {\n if (targetType !== TARGET_LINEAL && REG_SHADOW_HOST.test(leafName)) {\n if (shadow && this.#node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const node = this._matchShadowHostPseudoClass(leaf, this.#node);\n if (node) {\n nodes.add(node);\n }\n }\n } else if (targetType === TARGET_SELF) {\n const bool = this._matchLeaves([leaf], this.#node);\n if (bool) {\n nodes.add(this.#node);\n }\n } else if (targetType === TARGET_LINEAL) {\n let refNode = this.#node;\n while (refNode) {\n const bool = this._matchLeaves([leaf], refNode);\n if (bool) {\n nodes.add(refNode);\n }\n refNode = refNode.parentNode;\n }\n } else {\n pending = true;\n }\n }\n }\n const itemsLen = items.length;\n // check last leaf if node not found, not pending and leaves left\n if (!nodes.size && !pending && itemsLen) {\n const lastLeaf = items[itemsLen - 1];\n const { type: lastLeafType } = lastLeaf;\n if (lastLeafType === SELECTOR_PSEUDO_CLASS) {\n let node;\n if (root.nodeType === ELEMENT_NODE) {\n node = root;\n } else {\n node = root.firstElementChild;\n }\n // throws if unknown pseudo-class\n this._matchPseudoClassSelector(lastLeaf, node);\n }\n }\n return {\n compound: itemsLen > 0,\n nodes,\n pending\n };\n }\n\n /**\n * get entry twig\n * @param {Array.<object>} branch - AST branch\n * @param {string} targetType - target type\n * @returns {object} - find direction and twig\n */\n _getEntryTwig(branch, targetType) {\n const branchLen = branch.length;\n const firstTwig = branch[0];\n let find;\n let twig;\n if (branchLen > 1) {\n const { leaves: [{ type: firstType }] } = firstTwig;\n const lastTwig = branch[branchLen - 1];\n const { leaves: [{ type: lastType }] } = lastTwig;\n if (lastType === SELECTOR_PSEUDO_ELEMENT || lastType === SELECTOR_ID) {\n find = FIND_PREV;\n twig = lastTwig;\n } else if (firstType === SELECTOR_PSEUDO_ELEMENT ||\n firstType === SELECTOR_ID) {\n find = FIND_NEXT;\n twig = firstTwig;\n } else if (targetType === TARGET_FIRST && branchLen < BIT_04) {\n find = FIND_PREV;\n twig = lastTwig;\n } else {\n find = FIND_NEXT;\n twig = firstTwig;\n }\n } else {\n find = FIND_PREV;\n twig = firstTwig;\n }\n return {\n find,\n twig\n };\n }\n\n /**\n * collect nodes\n * @param {string} targetType - target type\n * @returns {Array.<Array.<object|undefined>>} - #ast and #nodes\n */\n _collectNodes(targetType) {\n const ast = this.#ast.values();\n if (targetType === TARGET_ALL || targetType === TARGET_FIRST) {\n const pendingItems = new Set();\n let i = 0;\n for (const { branch } of ast) {\n const { find, twig } = this._getEntryTwig(branch, targetType);\n const { compound, nodes, pending } = this._findNodes(twig, targetType);\n if (nodes.size) {\n this.#nodes[i] = nodes;\n } else if (pending) {\n pendingItems.add(new Map([\n ['index', i],\n ['twig', twig]\n ]));\n } else {\n this.#ast[i].skip = true;\n }\n this.#ast[i].filtered = !compound;\n this.#ast[i].find = find;\n i++;\n }\n if (pendingItems.size) {\n const { document, root } = this.#root;\n const iterator = document.createNodeIterator(root, SHOW_ELEMENT);\n let nextNode = iterator.nextNode();\n while (nextNode) {\n let bool = false;\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (nextNode === this.#node) {\n bool = true;\n } else {\n bool = this.#node.contains(nextNode);\n }\n } else {\n bool = true;\n }\n if (bool) {\n for (const pendingItem of pendingItems) {\n const { leaves } = pendingItem.get('twig');\n const matched = this._matchLeaves(leaves, nextNode);\n if (matched) {\n const index = pendingItem.get('index');\n this.#nodes[index].add(nextNode);\n if (!this.#ast[index].filtered) {\n this.#ast[index].filtered = true;\n }\n }\n }\n }\n nextNode = iterator.nextNode();\n }\n }\n } else {\n let i = 0;\n for (const { branch } of ast) {\n const twig = branch[branch.length - 1];\n const { compound, nodes } = this._findNodes(twig, targetType);\n if (nodes.size) {\n this.#nodes[i] = nodes;\n } else {\n this.#ast[i].skip = true;\n }\n this.#ast[i].filtered = !compound;\n this.#ast[i].find = FIND_PREV;\n i++;\n }\n }\n return [\n this.#ast,\n this.#nodes\n ];\n }\n\n /**\n * sort nodes\n * @param {Array.<object>|Set.<object>} nodes - collection of nodes\n * @returns {Array.<object|undefined>} - collection of sorted nodes\n */\n _sortNodes(nodes) {\n const arr = [...nodes];\n if (arr.length > 1) {\n arr.sort((a, b) => {\n let res;\n if (isPreceding(b, a)) {\n res = 1;\n } else {\n res = -1;\n }\n return res;\n });\n }\n return arr;\n }\n\n /**\n * match nodes\n * @param {string} targetType - target type\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchNodes(targetType) {\n const [...branches] = this.#ast;\n const l = branches.length;\n let nodes = new Set();\n for (let i = 0; i < l; i++) {\n const { branch, filtered, find, skip } = branches[i];\n const branchLen = branch.length;\n if (skip) {\n continue;\n } else if (branchLen) {\n const collectedNodes = this.#nodes[i];\n const lastIndex = branchLen - 1;\n if (lastIndex === 0) {\n const { leaves: [, ...filterLeaves] } = branch[0];\n if ((targetType === TARGET_ALL || targetType === TARGET_FIRST) &&\n this.#node.nodeType === ELEMENT_NODE) {\n for (const node of collectedNodes) {\n const bool = filtered || this._matchLeaves(filterLeaves, node);\n if (bool && node !== this.#node && this.#node.contains(node)) {\n nodes.add(node);\n if (targetType !== TARGET_ALL) {\n break;\n }\n }\n }\n } else if (!filterLeaves.length) {\n if (targetType === TARGET_ALL) {\n const n = [...nodes];\n nodes = new Set([...n, ...collectedNodes]);\n } else {\n const [node] = [...collectedNodes];\n nodes.add(node);\n }\n } else {\n for (const node of collectedNodes) {\n const bool = filtered || this._matchLeaves(filterLeaves, node);\n if (bool) {\n nodes.add(node);\n if (targetType !== TARGET_ALL) {\n break;\n }\n }\n }\n }\n } else if (find === FIND_NEXT) {\n let { combo, leaves: [, ...filterLeaves] } = branch[0];\n for (const node of collectedNodes) {\n const bool = filtered || this._matchLeaves(filterLeaves, node);\n let matched;\n if (bool) {\n let nextNodes = new Set([node]);\n for (let j = 1; j < branchLen; j++) {\n const { combo: nextCombo, leaves } = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const twig = {\n combo,\n leaves\n };\n const m = this._matchCombinator(twig, nextNode, { find });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === lastIndex) {\n if (targetType === TARGET_FIRST) {\n const [node] = this._sortNodes(arr);\n nodes.add(node);\n } else {\n const n = [...nodes];\n nodes = new Set([...n, ...arr]);\n }\n matched = true;\n break;\n } else {\n matched = false;\n combo = nextCombo;\n nextNodes = new Set(arr);\n }\n } else {\n matched = false;\n break;\n }\n }\n } else {\n matched = false;\n }\n if (matched && targetType !== TARGET_ALL) {\n break;\n }\n }\n } else {\n const { leaves: [, ...filterLeaves] } = branch[lastIndex];\n for (const node of collectedNodes) {\n const bool = filtered || this._matchLeaves(filterLeaves, node);\n let matched;\n if (bool) {\n let nextNodes = new Set([node]);\n for (let j = lastIndex - 1; j >= 0; j--) {\n const twig = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, { find });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n nodes.add(node);\n matched = true;\n break;\n } else {\n matched = false;\n nextNodes = new Set(arr);\n }\n } else {\n matched = false;\n break;\n }\n }\n } else {\n matched = false;\n }\n if (matched && targetType !== TARGET_ALL) {\n break;\n }\n }\n }\n }\n }\n return nodes;\n }\n\n /**\n * find matched nodes\n * @param {string} targetType - target type\n * @returns {Set.<object>} - collection of matched nodes\n */\n _find(targetType) {\n this._collectNodes(targetType);\n const nodes = this._matchNodes(targetType);\n return nodes;\n }\n\n /**\n * matches\n * @returns {boolean} - `true` if matched `false` otherwise\n */\n matches() {\n if (this.#node.nodeType !== ELEMENT_NODE) {\n throw new TypeError(`Unexpected node ${this.#node.nodeName}`);\n }\n let res;\n try {\n const nodes = this._find(TARGET_SELF);\n if (nodes.size) {\n res = nodes.has(this.#node);\n }\n } catch (e) {\n this._onError(e);\n }\n return !!res;\n }\n\n /**\n * closest\n * @returns {?object} - matched node\n */\n closest() {\n if (this.#node.nodeType !== ELEMENT_NODE) {\n throw new TypeError(`Unexpected node ${this.#node.nodeName}`);\n }\n let res;\n try {\n const nodes = this._find(TARGET_LINEAL);\n let node = this.#node;\n while (node) {\n if (nodes.has(node)) {\n res = node;\n break;\n }\n node = node.parentNode;\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? null;\n }\n\n /**\n * query selector\n * @returns {?object} - matched node\n */\n querySelector() {\n let res;\n try {\n const nodes = this._find(TARGET_FIRST);\n nodes.delete(this.#node);\n if (nodes.size) {\n [res] = this._sortNodes(nodes);\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? null;\n }\n\n /**\n * query selector all\n * NOTE: returns Array, not NodeList\n * @returns {Array.<object|undefined>} - collection of matched nodes\n */\n querySelectorAll() {\n let res;\n try {\n const nodes = this._find(TARGET_ALL);\n nodes.delete(this.#node);\n if (nodes.size) {\n res = this._sortNodes(nodes);\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? [];\n }\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["matcher_exports", "__export", "Matcher", "__toCommonJS", "import_is_potential_custom_element_name", "import_dom_util", "import_parser", "import_constant", "FIND_NEXT", "FIND_PREV", "TARGET_ALL", "TARGET_FIRST", "TARGET_LINEAL", "TARGET_SELF", "#ast", "#bit", "#cache", "#node", "#nodes", "#root", "#
|
|
4
|
+
"sourcesContent": ["/**\n * matcher.js\n */\n\n/* import */\nimport isCustomElementName from 'is-potential-custom-element-name';\nimport {\n getDirectionality, isContentEditable, isInclusive, isInShadowTree,\n isNamespaceDeclared, isPreceding, selectorToNodeProps\n} from './dom-util.js';\nimport {\n generateCSS, parseSelector, unescapeSelector, walkAST\n} from './parser.js';\n\n/* constants */\nimport {\n ALPHA_NUM, BIT_01, BIT_02, BIT_04, BIT_08, BIT_16, BIT_32, COMBINATOR,\n DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE, ELEMENT_NODE, NOT_SUPPORTED_ERR,\n REG_LOGICAL_PSEUDO, REG_SHADOW_HOST, SELECTOR_ATTR, SELECTOR_CLASS,\n SELECTOR_ID, SELECTOR_PSEUDO_CLASS, SELECTOR_PSEUDO_ELEMENT, SELECTOR_TYPE,\n SHOW_DOCUMENT, SHOW_DOCUMENT_FRAGMENT, SHOW_ELEMENT, SYNTAX_ERR, TEXT_NODE\n} from './constant.js';\nconst FIND_NEXT = 'next';\nconst FIND_PREV = 'prev';\nconst TARGET_ALL = 'all';\nconst TARGET_FIRST = 'first';\nconst TARGET_LINEAL = 'lineal';\nconst TARGET_SELF = 'self';\n\n/**\n * Matcher\n * NOTE: #ast[i] corresponds to #nodes[i]\n * #ast: [\n * {\n * branch: branch[],\n * filtered: boolean,\n * find: string,\n * skip: boolean\n * },\n * {\n * branch: branch[],\n * filtered: boolean,\n * find: string,\n * skip: boolean\n * }\n * ]\n * #nodes: [\n * Set([node{}, node{}]),\n * Set([node{}, node{}, node{}])\n * ]\n * branch[]: [twig{}, twig{}]\n * twig{}: {\n * combo: leaf{}|null,\n * leaves: leaves[]\n * }\n * leaves[]: [leaf{}, leaf{}, leaf{}]\n * leaf{}: AST leaf\n * node{}: Element node\n */\nexport class Matcher {\n /* private fields */\n #ast;\n #bit;\n #cache;\n #document;\n #node;\n #nodes;\n #root;\n #shadow;\n #subtree;\n #tree;\n #warn;\n\n /**\n * construct\n * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.warn] - console warn\n */\n constructor(selector, node, opt = {}) {\n const { warn } = opt;\n this.#bit = new Map([\n [SELECTOR_PSEUDO_ELEMENT, BIT_01],\n [SELECTOR_ID, BIT_02],\n [SELECTOR_CLASS, BIT_04],\n [SELECTOR_TYPE, BIT_08],\n [SELECTOR_ATTR, BIT_16],\n [SELECTOR_PSEUDO_CLASS, BIT_32]\n ]);\n this.#cache = new WeakMap();\n [this.#ast, this.#nodes] = this._prepare(selector);\n this.#node = node;\n [this.#document, this.#root, this.#tree] = this._setup(node);\n this.#shadow = isInShadowTree(node);\n this.#warn = !!warn;\n }\n\n /**\n * handle error\n * @param {Error} e - Error\n * @throws Error\n * @returns {void}\n */\n _onError(e) {\n if (e instanceof DOMException && e.name === NOT_SUPPORTED_ERR) {\n if (this.#warn) {\n console.warn(e.message);\n }\n } else {\n throw e;\n }\n }\n\n /**\n * set up document, root, walker\n * @param {object} node - Document, DocumentFragment, Element node\n * @returns {Array.<object>} - document, root, walker\n */\n _setup(node) {\n let document;\n let root;\n switch (node.nodeType) {\n case DOCUMENT_NODE: {\n document = node;\n root = node;\n break;\n }\n case DOCUMENT_FRAGMENT_NODE: {\n document = node.ownerDocument;\n root = node;\n break;\n }\n case ELEMENT_NODE: {\n if (node.ownerDocument.contains(node)) {\n document = node.ownerDocument;\n root = node.ownerDocument;\n } else {\n let parent = node;\n while (parent) {\n if (parent.parentNode) {\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n document = parent.ownerDocument;\n root = parent;\n }\n break;\n }\n default: {\n throw new TypeError(`Unexpected node ${node.nodeName}`);\n }\n }\n const filter = SHOW_DOCUMENT | SHOW_DOCUMENT_FRAGMENT | SHOW_ELEMENT;\n const walker = document.createTreeWalker(root, filter);\n return [\n document,\n root,\n walker\n ];\n }\n\n /**\n * sort AST leaves\n * @param {Array.<object>} leaves - collection of AST leaves\n * @returns {Array.<object>} - sorted leaves\n */\n _sortLeaves(leaves) {\n const arr = [...leaves];\n if (arr.length > 1) {\n arr.sort((a, b) => {\n const { type: typeA } = a;\n const { type: typeB } = b;\n const bitA = this.#bit.get(typeA);\n const bitB = this.#bit.get(typeB);\n let res;\n if (bitA === bitB) {\n res = 0;\n } else if (bitA > bitB) {\n res = 1;\n } else {\n res = -1;\n }\n return res;\n });\n }\n return arr;\n }\n\n /**\n * prepare ast and nodes\n * @param {string} selector - CSS selector\n * @returns {Array.<Array.<object|undefined>>} - array of ast and nodes\n */\n _prepare(selector) {\n const ast = parseSelector(selector);\n const branches = walkAST(ast);\n const tree = [];\n const nodes = [];\n let i = 0;\n for (const [...items] of branches) {\n const branch = [];\n let item = items.shift();\n if (item && item.type !== COMBINATOR) {\n const leaves = new Set();\n while (item) {\n if (item.type === COMBINATOR) {\n const [nextItem] = items;\n if (nextItem.type === COMBINATOR) {\n const msg = `Invalid combinator ${item.name}${nextItem.name}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n branch.push({\n combo: item,\n leaves: this._sortLeaves(leaves)\n });\n leaves.clear();\n } else if (item) {\n leaves.add(item);\n }\n if (items.length) {\n item = items.shift();\n } else {\n branch.push({\n combo: null,\n leaves: this._sortLeaves(leaves)\n });\n leaves.clear();\n break;\n }\n }\n }\n tree.push({\n branch,\n filtered: false,\n find: null,\n skip: false\n });\n nodes[i] = new Set();\n i++;\n }\n return [\n tree,\n nodes\n ];\n }\n\n /**\n * traverse tree walker\n * @param {object} [node] - Element node\n * @param {object} [tree] - tree walker\n * @returns {?object} - node\n */\n _traverse(node = {}, tree = this.#tree) {\n let current;\n let refNode = tree.currentNode;\n if (node.nodeType === ELEMENT_NODE && refNode === node) {\n current = refNode;\n } else {\n if (refNode !== tree.root) {\n while (refNode) {\n if (refNode === tree.root ||\n (node.nodeType === ELEMENT_NODE && refNode === node)) {\n break;\n }\n refNode = tree.parentNode();\n }\n }\n if (node.nodeType === ELEMENT_NODE) {\n while (refNode) {\n if (refNode === node) {\n current = refNode;\n break;\n }\n refNode = tree.nextNode();\n }\n } else {\n current = refNode;\n }\n }\n return current ?? null;\n }\n\n /**\n * collect nth child\n * @param {object} anb - An+B options\n * @param {number} anb.a - a\n * @param {number} anb.b - b\n * @param {boolean} [anb.reverse] - reverse order\n * @param {object} [anb.selector] - AST\n * @param {object} node - Element node\n * @returns {Set.<object>} - collection of matched nodes\n */\n _collectNthChild(anb, node) {\n const { a, b, reverse, selector } = anb;\n const { parentNode } = node;\n const matched = new Set();\n let selectorBranches;\n if (selector) {\n if (this.#cache.has(selector)) {\n selectorBranches = this.#cache.get(selector);\n } else {\n selectorBranches = walkAST(selector);\n this.#cache.set(selector, selectorBranches);\n }\n }\n if (parentNode) {\n const arr = [].slice.call(parentNode.childNodes)\n .filter(n => n.nodeType === ELEMENT_NODE);\n const l = arr.length;\n if (l) {\n const selectorNodes = new Set();\n if (selectorBranches) {\n for (const refNode of arr) {\n let bool;\n for (const leaves of selectorBranches) {\n bool = this._matchLeaves(leaves, refNode);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n selectorNodes.add(refNode);\n }\n }\n }\n if (reverse) {\n arr.reverse();\n }\n // :first-child, :last-child, :nth-child(0 of S)\n if (a === 0) {\n if (b > 0 && b <= l) {\n if (selectorNodes.size) {\n for (const current of arr) {\n if (selectorNodes.has(current)) {\n matched.add(current);\n break;\n }\n }\n } else if (!selector) {\n const current = arr[b - 1];\n matched.add(current);\n }\n }\n // :nth-child()\n } else {\n let nth = b - 1;\n if (a > 0) {\n while (nth < 0) {\n nth += a;\n }\n }\n if (nth >= 0 && nth < l) {\n let j = a > 0 ? 0 : b - 1;\n for (let i = 0; i < l && nth >= 0 && nth < l; i++) {\n const current = arr[i];\n if (selectorNodes.size) {\n if (selectorNodes.has(current)) {\n if (j === nth) {\n matched.add(current);\n nth += a;\n }\n if (a > 0) {\n j++;\n } else {\n j--;\n }\n }\n } else if (i === nth) {\n if (!selector) {\n matched.add(current);\n }\n nth += a;\n }\n }\n }\n }\n }\n } else {\n if (node === this.#root && this.#root.nodeType === ELEMENT_NODE &&\n (a + b) === 1) {\n if (selectorBranches) {\n let bool;\n for (const leaves of selectorBranches) {\n bool = this._matchLeaves(leaves, node);\n if (bool) {\n break;\n }\n }\n if (bool) {\n matched.add(node);\n }\n } else {\n matched.add(node);\n }\n }\n }\n return matched;\n }\n\n /**\n * collect nth of type\n * @param {object} anb - An+B options\n * @param {number} anb.a - a\n * @param {number} anb.b - b\n * @param {boolean} [anb.reverse] - reverse order\n * @param {object} node - Element node\n * @returns {Set.<object>} - collection of matched nodes\n */\n _collectNthOfType(anb, node) {\n const { a, b, reverse } = anb;\n const { localName, parentNode, prefix } = node;\n const matched = new Set();\n if (parentNode) {\n const arr = [].slice.call(parentNode.childNodes)\n .filter(n => n.nodeType === ELEMENT_NODE);\n const l = arr.length;\n if (l) {\n if (reverse) {\n arr.reverse();\n }\n // :first-of-type, :last-of-type\n if (a === 0) {\n if (b > 0 && b <= l) {\n let j = 0;\n for (const current of arr) {\n const { localName: itemLocalName, prefix: itemPrefix } = current;\n if (itemLocalName === localName && itemPrefix === prefix) {\n if (j === b - 1) {\n matched.add(current);\n break;\n }\n j++;\n }\n }\n }\n // :nth-of-type()\n } else {\n let nth = b - 1;\n if (a > 0) {\n while (nth < 0) {\n nth += a;\n }\n }\n if (nth >= 0 && nth < l) {\n let j = a > 0 ? 0 : b - 1;\n for (const current of arr) {\n const { localName: itemLocalName, prefix: itemPrefix } = current;\n if (itemLocalName === localName && itemPrefix === prefix) {\n if (j === nth) {\n matched.add(current);\n nth += a;\n }\n if (nth < 0 || nth >= l) {\n break;\n } else if (a > 0) {\n j++;\n } else {\n j--;\n }\n }\n }\n }\n }\n }\n } else {\n if (node === this.#root && this.#root.nodeType === ELEMENT_NODE &&\n (a + b) === 1) {\n matched.add(node);\n }\n }\n return matched;\n }\n\n /**\n * match An+B\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @param {string} nthName - nth pseudo-class name\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchAnPlusB(ast, node, nthName) {\n const {\n nth: {\n a,\n b,\n name: nthIdentName\n },\n selector\n } = ast;\n const identName = unescapeSelector(nthIdentName);\n const anbMap = new Map();\n if (identName) {\n if (identName === 'even') {\n anbMap.set('a', 2);\n anbMap.set('b', 0);\n } else if (identName === 'odd') {\n anbMap.set('a', 2);\n anbMap.set('b', 1);\n }\n if (nthName.indexOf('last') > -1) {\n anbMap.set('reverse', true);\n }\n } else {\n if (typeof a === 'string' && /-?\\d+/.test(a)) {\n anbMap.set('a', a * 1);\n } else {\n anbMap.set('a', 0);\n }\n if (typeof b === 'string' && /-?\\d+/.test(b)) {\n anbMap.set('b', b * 1);\n } else {\n anbMap.set('b', 0);\n }\n if (nthName.indexOf('last') > -1) {\n anbMap.set('reverse', true);\n }\n }\n let matched = new Set();\n if (anbMap.has('a') && anbMap.has('b')) {\n if (/^nth-(?:last-)?child$/.test(nthName)) {\n if (selector) {\n anbMap.set('selector', selector);\n }\n const anb = Object.fromEntries(anbMap);\n const nodes = this._collectNthChild(anb, node);\n if (nodes.size) {\n matched = nodes;\n }\n } else if (/^nth-(?:last-)?of-type$/.test(nthName)) {\n const anb = Object.fromEntries(anbMap);\n const nodes = this._collectNthOfType(anb, node);\n if (nodes.size) {\n matched = nodes;\n }\n }\n }\n return matched;\n }\n\n /**\n * match pseudo element selector\n * @param {string} astName - AST name\n * @param {object} [opt] - options\n * @param {boolean} [opt.forgive] - is forgiving selector list\n * @throws {DOMException}\n * @returns {void}\n */\n _matchPseudoElementSelector(astName, opt = {}) {\n const { forgive } = opt;\n switch (astName) {\n case 'after':\n case 'backdrop':\n case 'before':\n case 'cue':\n case 'cue-region':\n case 'first-letter':\n case 'first-line':\n case 'file-selector-button':\n case 'marker':\n case 'placeholder':\n case 'selection':\n case 'target-text': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-element ::${astName}`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'part':\n case 'slotted': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-element ::${astName}()`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n default: {\n if (astName.startsWith('-webkit-')) {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-element ::${astName}`,\n NOT_SUPPORTED_ERR);\n }\n } else if (!forgive) {\n throw new DOMException(`Unknown pseudo-element ::${astName}`,\n SYNTAX_ERR);\n }\n }\n }\n }\n\n /**\n * match directionality pseudo-class - :dir()\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchDirectionPseudoClass(ast, node) {\n const astName = unescapeSelector(ast.name);\n const dir = getDirectionality(node);\n let res;\n if (astName === dir) {\n res = node;\n }\n return res ?? null;\n }\n\n /**\n * match language pseudo-class - :lang()\n * @see https://datatracker.ietf.org/doc/html/rfc4647#section-3.3.1\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchLanguagePseudoClass(ast, node) {\n const astName = unescapeSelector(ast.name);\n let res;\n if (astName === '*') {\n if (node.hasAttribute('lang')) {\n if (node.getAttribute('lang')) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.nodeType === ELEMENT_NODE) {\n if (parent.hasAttribute('lang')) {\n if (parent.getAttribute('lang')) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n }\n } else if (astName) {\n const langPart = `(?:-${ALPHA_NUM})*`;\n const regLang = new RegExp(`^(?:\\\\*-)?${ALPHA_NUM}${langPart}$`, 'i');\n if (regLang.test(astName)) {\n let regExtendedLang;\n if (astName.indexOf('-') > -1) {\n const [langMain, langSub, ...langRest] = astName.split('-');\n let extendedMain;\n if (langMain === '*') {\n extendedMain = `${ALPHA_NUM}${langPart}`;\n } else {\n extendedMain = `${langMain}${langPart}`;\n }\n const extendedSub = `-${langSub}${langPart}`;\n const len = langRest.length;\n let extendedRest = '';\n if (len) {\n for (let i = 0; i < len; i++) {\n extendedRest += `-${langRest[i]}${langPart}`;\n }\n }\n regExtendedLang =\n new RegExp(`^${extendedMain}${extendedSub}${extendedRest}$`, 'i');\n } else {\n regExtendedLang = new RegExp(`^${astName}${langPart}$`, 'i');\n }\n if (node.hasAttribute('lang')) {\n if (regExtendedLang.test(node.getAttribute('lang'))) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.nodeType === ELEMENT_NODE) {\n if (parent.hasAttribute('lang')) {\n const value = parent.getAttribute('lang');\n if (regExtendedLang.test(value)) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n }\n }\n }\n return res ?? null;\n }\n\n /**\n * match :has() pseudo-class function\n * @param {Array.<object>} leaves - AST leaves\n * @param {object} node - Element node\n * @returns {boolean} - result\n */\n _matchHasPseudoFunc(leaves, node) {\n let bool;\n if (Array.isArray(leaves) && leaves.length) {\n const [leaf] = leaves;\n const { type: leafType } = leaf;\n let combo;\n if (leafType === COMBINATOR) {\n combo = leaves.shift();\n } else {\n combo = {\n name: ' ',\n type: COMBINATOR\n };\n }\n const twigLeaves = [];\n while (leaves.length) {\n const [item] = leaves;\n const { type: itemType } = item;\n if (itemType === COMBINATOR) {\n break;\n } else {\n twigLeaves.push(leaves.shift());\n }\n }\n const twig = {\n combo,\n leaves: twigLeaves\n };\n const nodes = this._matchCombinator(twig, node, {\n find: FIND_NEXT\n });\n if (nodes.size) {\n if (leaves.length) {\n for (const nextNode of nodes) {\n bool =\n this._matchHasPseudoFunc(Object.assign([], leaves), nextNode);\n if (bool) {\n break;\n }\n }\n } else {\n bool = true;\n }\n }\n }\n return !!bool;\n }\n\n /**\n * match logical pseudo-class functions - :has(), :is(), :not(), :where()\n * @param {object} astData - AST data\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchLogicalPseudoFunc(astData, node) {\n const {\n astName = '', branches = [], selector = '', twigBranches = []\n } = astData;\n let res;\n if (astName === 'has') {\n if (selector.includes(':has(')) {\n res = null;\n } else {\n const l = branches.length;\n let bool;\n for (let i = 0; i < l; i++) {\n const leaves = branches[i];\n bool = this._matchHasPseudoFunc(Object.assign([], leaves), node);\n if (bool) {\n break;\n }\n }\n if (bool) {\n res = node;\n }\n }\n } else {\n const forgive = /^(?:is|where)$/.test(astName);\n const l = twigBranches.length;\n let bool;\n for (let i = 0; i < l; i++) {\n const branch = twigBranches[i];\n const lastIndex = branch.length - 1;\n const { leaves } = branch[lastIndex];\n bool = this._matchLeaves(leaves, node, { forgive });\n if (bool && lastIndex > 0) {\n let nextNodes = new Set([node]);\n for (let j = lastIndex - 1; j >= 0; j--) {\n const twig = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, {\n forgive,\n find: FIND_PREV\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n bool = true;\n break;\n } else {\n nextNodes = new Set(arr);\n }\n } else {\n bool = false;\n break;\n }\n }\n }\n if (bool) {\n break;\n }\n }\n if (astName === 'not') {\n if (!bool) {\n res = node;\n }\n } else if (bool) {\n res = node;\n }\n }\n return res ?? null;\n }\n\n /**\n * match pseudo-class selector\n * @see https://html.spec.whatwg.org/#pseudo-classes\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.forgive] - is forgiving selector list\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchPseudoClassSelector(ast, node, opt = {}) {\n const { children: astChildren } = ast;\n const { localName, parentNode } = node;\n const { forgive } = opt;\n const astName = unescapeSelector(ast.name);\n let matched = new Set();\n // :has(), :is(), :not(), :where()\n if (REG_LOGICAL_PSEUDO.test(astName)) {\n let astData;\n if (this.#cache.has(ast)) {\n astData = this.#cache.get(ast);\n } else {\n const branches = walkAST(ast);\n const selectors = [];\n const twigBranches = [];\n for (const [...leaves] of branches) {\n for (const leaf of leaves) {\n const css = generateCSS(leaf);\n selectors.push(css);\n }\n const branch = [];\n const leavesSet = new Set();\n let item = leaves.shift();\n while (item) {\n if (item.type === COMBINATOR) {\n branch.push({\n combo: item,\n leaves: [...leavesSet]\n });\n leavesSet.clear();\n } else if (item) {\n leavesSet.add(item);\n }\n if (leaves.length) {\n item = leaves.shift();\n } else {\n branch.push({\n combo: null,\n leaves: [...leavesSet]\n });\n leavesSet.clear();\n break;\n }\n }\n twigBranches.push(branch);\n }\n astData = {\n astName,\n branches,\n twigBranches,\n selector: selectors.join(',')\n };\n this.#cache.set(ast, astData);\n }\n const res = this._matchLogicalPseudoFunc(astData, node);\n if (res) {\n matched.add(res);\n }\n } else if (Array.isArray(astChildren)) {\n const [branch] = astChildren;\n // :nth-child(), :nth-last-child(), nth-of-type(), :nth-last-of-type()\n if (/^nth-(?:last-)?(?:child|of-type)$/.test(astName)) {\n const nodes = this._matchAnPlusB(branch, node, astName);\n if (nodes.size) {\n matched = nodes;\n }\n // :dir()\n } else if (astName === 'dir') {\n const res = this._matchDirectionPseudoClass(branch, node);\n if (res) {\n matched.add(res);\n }\n // :lang()\n } else if (astName === 'lang') {\n const res = this._matchLanguagePseudoClass(branch, node);\n if (res) {\n matched.add(res);\n }\n } else {\n switch (astName) {\n case 'current':\n case 'nth-col':\n case 'nth-last-col': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-class :${astName}()`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'host':\n case 'host-context': {\n // ignore\n break;\n }\n default: {\n if (!forgive) {\n throw new DOMException(`Unknown pseudo-class :${astName}()`,\n SYNTAX_ERR);\n }\n }\n }\n }\n } else {\n const regAnchor = /^a(?:rea)?$/;\n const regFormCtrl =\n /^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/;\n const regFormValidity = /^(?:(?:inpu|selec)t|button|form|textarea)$/;\n const regInteract = /^d(?:etails|ialog)$/;\n const regTypeCheck = /^(?:checkbox|radio)$/;\n const regTypeDate = /^(?:date(?:time-local)?|month|time|week)$/;\n const regTypeRange =\n /(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/;\n const regTypeText = /^(?:(?:emai|te|ur)l|number|password|search|text)$/;\n switch (astName) {\n case 'any-link':\n case 'link': {\n if (regAnchor.test(localName) && node.hasAttribute('href')) {\n matched.add(node);\n }\n break;\n }\n case 'local-link': {\n if (regAnchor.test(localName) && node.hasAttribute('href')) {\n const { href, origin, pathname } = new URL(this.#document.URL);\n const attrURL = new URL(node.getAttribute('href'), href);\n if (attrURL.origin === origin && attrURL.pathname === pathname) {\n matched.add(node);\n }\n }\n break;\n }\n case 'visited': {\n // prevent fingerprinting\n break;\n }\n case 'target': {\n const { hash } = new URL(this.#document.URL);\n if (node.id && hash === `#${node.id}` &&\n this.#document.contains(node)) {\n matched.add(node);\n }\n break;\n }\n case 'target-within': {\n const { hash } = new URL(this.#document.URL);\n if (hash) {\n const id = hash.replace(/^#/, '');\n let current = this.#document.getElementById(id);\n while (current) {\n if (current === node) {\n matched.add(node);\n break;\n }\n current = current.parentNode;\n }\n }\n break;\n }\n case 'scope': {\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (node === this.#node) {\n matched.add(node);\n }\n } else if (node === this.#document.documentElement) {\n matched.add(node);\n }\n break;\n }\n case 'focus': {\n if (node === this.#document.activeElement) {\n matched.add(node);\n }\n break;\n }\n case 'focus-within': {\n let current = this.#document.activeElement;\n while (current) {\n if (current === node) {\n matched.add(node);\n break;\n }\n current = current.parentNode;\n }\n break;\n }\n case 'open': {\n if (regInteract.test(localName) && node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'closed': {\n if (regInteract.test(localName) && !node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'disabled': {\n if (regFormCtrl.test(localName) || isCustomElementName(localName)) {\n if (node.disabled || node.hasAttribute('disabled')) {\n matched.add(node);\n } else {\n let parent = parentNode;\n while (parent) {\n if (parent.localName === 'fieldset') {\n break;\n }\n parent = parent.parentNode;\n }\n if (parent && parentNode.localName !== 'legend' &&\n parent.hasAttribute('disabled')) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'enabled': {\n if ((regFormCtrl.test(localName) || isCustomElementName(localName)) &&\n !(node.disabled && node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n case 'read-only': {\n switch (localName) {\n case 'textarea': {\n if (node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled')) {\n matched.add(node);\n }\n break;\n }\n case 'input': {\n if ((!node.type || regTypeDate.test(node.type) ||\n regTypeText.test(node.type)) &&\n (node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n default: {\n if (!isContentEditable(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'read-write': {\n switch (localName) {\n case 'textarea': {\n if (!(node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n case 'input': {\n if ((!node.type || regTypeDate.test(node.type) ||\n regTypeText.test(node.type)) &&\n !(node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n default: {\n if (isContentEditable(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'placeholder-shown': {\n let targetNode;\n if (localName === 'textarea') {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n if (regTypeText.test(node.getAttribute('type'))) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode && node.value === '' &&\n node.hasAttribute('placeholder') &&\n node.getAttribute('placeholder').trim().length) {\n matched.add(node);\n }\n break;\n }\n case 'checked': {\n if ((node.checked && localName === 'input' &&\n node.hasAttribute('type') &&\n regTypeCheck.test(node.getAttribute('type'))) ||\n (node.selected && localName === 'option')) {\n matched.add(node);\n }\n break;\n }\n case 'indeterminate': {\n if ((node.indeterminate && localName === 'input' &&\n node.type === 'checkbox') ||\n (localName === 'progress' && !node.hasAttribute('value'))) {\n matched.add(node);\n } else if (localName === 'input' && node.type === 'radio' &&\n !node.hasAttribute('checked')) {\n const nodeName = node.name;\n let parent = node.parentNode;\n while (parent) {\n if (parent.localName === 'form') {\n break;\n }\n parent = parent.parentNode;\n }\n if (!parent) {\n parent = this.#document.documentElement;\n }\n const nodes = [].slice.call(parent.getElementsByTagName('input'));\n let checked;\n for (const item of nodes) {\n if (item.getAttribute('type') === 'radio') {\n if (nodeName) {\n if (item.getAttribute('name') === nodeName) {\n checked = !!item.checked;\n }\n } else if (!item.hasAttribute('name')) {\n checked = !!item.checked;\n }\n if (checked) {\n break;\n }\n }\n }\n if (!checked) {\n matched.add(node);\n }\n }\n break;\n }\n case 'default': {\n const regTypeReset = /^(?:button|reset)$/;\n const regTypeSubmit = /^(?:image|submit)$/;\n // button[type=\"submit\"], input[type=\"submit\"], input[type=\"image\"]\n if ((localName === 'button' &&\n !(node.hasAttribute('type') &&\n regTypeReset.test(node.getAttribute('type')))) ||\n (localName === 'input' && node.hasAttribute('type') &&\n regTypeSubmit.test(node.getAttribute('type')))) {\n let form = node.parentNode;\n while (form) {\n if (form.localName === 'form') {\n break;\n }\n form = form.parentNode;\n }\n if (form) {\n const iterator =\n this.#document.createNodeIterator(form, SHOW_ELEMENT);\n let nextNode = iterator.nextNode();\n while (nextNode) {\n const nodeName = nextNode.localName;\n let m;\n if (nodeName === 'button') {\n m = !(nextNode.hasAttribute('type') &&\n regTypeReset.test(nextNode.getAttribute('type')));\n } else if (nodeName === 'input') {\n m = nextNode.hasAttribute('type') &&\n regTypeSubmit.test(nextNode.getAttribute('type'));\n }\n if (m) {\n if (nextNode === node) {\n matched.add(node);\n }\n break;\n }\n nextNode = iterator.nextNode();\n }\n }\n // input[type=\"checkbox\"], input[type=\"radio\"]\n } else if (localName === 'input' && node.hasAttribute('type') &&\n regTypeCheck.test(node.getAttribute('type')) &&\n (node.checked || node.hasAttribute('checked'))) {\n matched.add(node);\n // option\n } else if (localName === 'option') {\n let isMultiple = false;\n let parent = parentNode;\n while (parent) {\n if (parent.localName === 'datalist') {\n break;\n } else if (parent.localName === 'select') {\n if (parent.multiple || parent.hasAttribute('multiple')) {\n isMultiple = true;\n }\n break;\n }\n parent = parent.parentNode;\n }\n if (isMultiple) {\n if (node.selected || node.hasAttribute('selected')) {\n matched.add(node);\n }\n } else {\n const firstOpt = parentNode.firstElementChild;\n const defaultOpt = new Set();\n let opt = firstOpt;\n while (opt) {\n if (opt.selected || opt.hasAttribute('selected')) {\n defaultOpt.add(opt);\n break;\n }\n opt = opt.nextElementSibling;\n }\n if (!defaultOpt.size) {\n defaultOpt.add(firstOpt);\n }\n if (defaultOpt.has(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'valid': {\n if (regFormValidity.test(localName)) {\n if (node.checkValidity()) {\n matched.add(node);\n }\n } else if (localName === 'fieldset') {\n let refNode = this._traverse(node);\n if (refNode === node) {\n refNode = this.#tree.nextNode();\n }\n let bool;\n while (refNode) {\n if (regFormValidity.test(refNode.localName)) {\n bool = refNode.checkValidity();\n if (!bool) {\n break;\n }\n }\n refNode = this.#tree.nextNode();\n }\n if (bool) {\n matched.add(node);\n }\n }\n break;\n }\n case 'invalid': {\n if (regFormValidity.test(localName)) {\n if (!node.checkValidity()) {\n matched.add(node);\n }\n } else if (localName === 'fieldset') {\n let refNode = this._traverse(node);\n if (refNode === node) {\n refNode = this.#tree.nextNode();\n }\n let bool;\n while (refNode) {\n if (regFormValidity.test(refNode.localName)) {\n bool = refNode.checkValidity();\n if (!bool) {\n break;\n }\n }\n refNode = this.#tree.nextNode();\n }\n if (!bool) {\n matched.add(node);\n }\n }\n break;\n }\n case 'in-range': {\n if (localName === 'input' &&\n !(node.readonly || node.hasAttribute('readonly')) &&\n !(node.disabled || node.hasAttribute('disabled')) &&\n node.hasAttribute('type') &&\n regTypeRange.test(node.getAttribute('type')) &&\n !(node.validity.rangeUnderflow ||\n node.validity.rangeOverflow) &&\n (node.hasAttribute('min') || node.hasAttribute('max') ||\n node.getAttribute('type') === 'range')) {\n matched.add(node);\n }\n break;\n }\n case 'out-of-range': {\n if (localName === 'input' &&\n !(node.readonly || node.hasAttribute('readonly')) &&\n !(node.disabled || node.hasAttribute('disabled')) &&\n node.hasAttribute('type') &&\n regTypeRange.test(node.getAttribute('type')) &&\n (node.validity.rangeUnderflow || node.validity.rangeOverflow)) {\n matched.add(node);\n }\n break;\n }\n case 'required': {\n let targetNode;\n if (/^(?:select|textarea)$/.test(localName)) {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n const inputType = node.getAttribute('type');\n if (inputType === 'file' || regTypeCheck.test(inputType) ||\n regTypeDate.test(inputType) || regTypeText.test(inputType)) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode &&\n (node.required || node.hasAttribute('required'))) {\n matched.add(node);\n }\n break;\n }\n case 'optional': {\n let targetNode;\n if (/^(?:select|textarea)$/.test(localName)) {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n const inputType = node.getAttribute('type');\n if (inputType === 'file' || regTypeCheck.test(inputType) ||\n regTypeDate.test(inputType) || regTypeText.test(inputType)) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode &&\n !(node.required || node.hasAttribute('required'))) {\n matched.add(node);\n }\n break;\n }\n case 'root': {\n if (node === this.#document.documentElement) {\n matched.add(node);\n }\n break;\n }\n case 'empty': {\n if (node.hasChildNodes()) {\n const nodes = node.childNodes.values();\n let bool;\n for (const refNode of nodes) {\n bool = refNode.nodeType !== ELEMENT_NODE &&\n refNode.nodeType !== TEXT_NODE;\n if (!bool) {\n break;\n }\n }\n if (bool) {\n matched.add(node);\n }\n } else {\n matched.add(node);\n }\n break;\n }\n case 'first-child': {\n if ((parentNode && node === parentNode.firstElementChild) ||\n (node === this.#root && this.#root.nodeType === ELEMENT_NODE)) {\n matched.add(node);\n }\n break;\n }\n case 'last-child': {\n if ((parentNode && node === parentNode.lastElementChild) ||\n (node === this.#root && this.#root.nodeType === ELEMENT_NODE)) {\n matched.add(node);\n }\n break;\n }\n case 'only-child': {\n if ((parentNode &&\n node === parentNode.firstElementChild &&\n node === parentNode.lastElementChild) ||\n (node === this.#root && this.#root.nodeType === ELEMENT_NODE)) {\n matched.add(node);\n }\n break;\n }\n case 'first-of-type': {\n if (parentNode) {\n const [node1] = this._collectNthOfType({\n a: 0,\n b: 1\n }, node);\n if (node1) {\n matched.add(node1);\n }\n } else if (node === this.#root &&\n this.#root.nodeType === ELEMENT_NODE) {\n matched.add(node);\n }\n break;\n }\n case 'last-of-type': {\n if (parentNode) {\n const [node1] = this._collectNthOfType({\n a: 0,\n b: 1,\n reverse: true\n }, node);\n if (node1) {\n matched.add(node1);\n }\n } else if (node === this.#root &&\n this.#root.nodeType === ELEMENT_NODE) {\n matched.add(node);\n }\n break;\n }\n case 'only-of-type': {\n if (parentNode) {\n const [node1] = this._collectNthOfType({\n a: 0,\n b: 1\n }, node);\n if (node1 === node) {\n const [node2] = this._collectNthOfType({\n a: 0,\n b: 1,\n reverse: true\n }, node);\n if (node2 === node) {\n matched.add(node);\n }\n }\n } else if (node === this.#root &&\n this.#root.nodeType === ELEMENT_NODE) {\n matched.add(node);\n }\n break;\n }\n case 'host':\n case 'host-context': {\n // ignore\n break;\n }\n // legacy pseudo-elements\n case 'after':\n case 'before':\n case 'first-letter':\n case 'first-line': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-element ::${astName}`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'active':\n case 'autofill':\n case 'blank':\n case 'buffering':\n case 'current':\n case 'focus-visible':\n case 'fullscreen':\n case 'future':\n case 'hover':\n case 'modal':\n case 'muted':\n case 'past':\n case 'paused':\n case 'picture-in-picture':\n case 'playing':\n case 'seeking':\n case 'stalled':\n case 'user-invalid':\n case 'user-valid':\n case 'volume-locked':\n case '-webkit-autofill': {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-class :${astName}`,\n NOT_SUPPORTED_ERR);\n }\n break;\n }\n default: {\n if (astName.startsWith('-webkit-')) {\n if (this.#warn) {\n throw new DOMException(`Unsupported pseudo-class :${astName}`,\n NOT_SUPPORTED_ERR);\n }\n } else if (!forgive) {\n throw new DOMException(`Unknown pseudo-class :${astName}`,\n SYNTAX_ERR);\n }\n }\n }\n }\n return matched;\n }\n\n /**\n * match attribute selector\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchAttributeSelector(ast, node) {\n const {\n flags: astFlags, matcher: astMatcher, name: astName, value: astValue\n } = ast;\n if (typeof astFlags === 'string' && !/^[is]$/i.test(astFlags)) {\n const css = generateCSS(ast);\n throw new DOMException(`Invalid selector ${css}`, SYNTAX_ERR);\n }\n const { attributes } = node;\n let res;\n if (attributes && attributes.length) {\n let caseInsensitive;\n if (this.#document.contentType === 'text/html') {\n if (typeof astFlags === 'string' && /^s$/i.test(astFlags)) {\n caseInsensitive = false;\n } else {\n caseInsensitive = true;\n }\n } else if (typeof astFlags === 'string' && /^i$/i.test(astFlags)) {\n caseInsensitive = true;\n } else {\n caseInsensitive = false;\n }\n let astAttrName = unescapeSelector(astName.name);\n if (caseInsensitive) {\n astAttrName = astAttrName.toLowerCase();\n }\n const attrValues = new Set();\n // namespaced\n if (astAttrName.indexOf('|') > -1) {\n const {\n prefix: astAttrPrefix, tagName: astAttrLocalName\n } = selectorToNodeProps(astAttrName);\n for (let { name: itemName, value: itemValue } of attributes) {\n if (caseInsensitive) {\n itemName = itemName.toLowerCase();\n itemValue = itemValue.toLowerCase();\n }\n switch (astAttrPrefix) {\n case '': {\n if (astAttrLocalName === itemName) {\n attrValues.add(itemValue);\n }\n break;\n }\n case '*': {\n if (itemName.indexOf(':') > -1) {\n if (itemName.endsWith(`:${astAttrLocalName}`)) {\n attrValues.add(itemValue);\n }\n } else if (astAttrLocalName === itemName) {\n attrValues.add(itemValue);\n }\n break;\n }\n default: {\n if (itemName.indexOf(':') > -1) {\n const [itemNamePrefix, itemNameLocalName] = itemName.split(':');\n if (astAttrPrefix === itemNamePrefix &&\n astAttrLocalName === itemNameLocalName &&\n isNamespaceDeclared(astAttrPrefix, node)) {\n attrValues.add(itemValue);\n }\n }\n }\n }\n }\n } else {\n for (let { name: itemName, value: itemValue } of attributes) {\n if (caseInsensitive) {\n itemName = itemName.toLowerCase();\n itemValue = itemValue.toLowerCase();\n }\n if (itemName.indexOf(':') > -1) {\n const [itemNamePrefix, itemNameLocalName] = itemName.split(':');\n // ignore xml:lang\n if (itemNamePrefix === 'xml' && itemNameLocalName === 'lang') {\n continue;\n } else if (astAttrName === itemNameLocalName) {\n attrValues.add(itemValue);\n }\n } else if (astAttrName === itemName) {\n attrValues.add(itemValue);\n }\n }\n }\n if (attrValues.size) {\n const {\n name: astAttrIdentValue, value: astAttrStringValue\n } = astValue || {};\n let attrValue;\n if (astAttrIdentValue) {\n if (caseInsensitive) {\n attrValue = astAttrIdentValue.toLowerCase();\n } else {\n attrValue = astAttrIdentValue;\n }\n } else if (astAttrStringValue) {\n if (caseInsensitive) {\n attrValue = astAttrStringValue.toLowerCase();\n } else {\n attrValue = astAttrStringValue;\n }\n } else if (astAttrStringValue === '') {\n attrValue = astAttrStringValue;\n }\n switch (astMatcher) {\n case '=': {\n if (typeof attrValue === 'string' && attrValues.has(attrValue)) {\n res = node;\n }\n break;\n }\n case '~=': {\n if (attrValue && typeof attrValue === 'string') {\n for (const value of attrValues) {\n const item = new Set(value.split(/\\s+/));\n if (item.has(attrValue)) {\n res = node;\n break;\n }\n }\n }\n break;\n }\n case '|=': {\n if (attrValue && typeof attrValue === 'string') {\n let item;\n for (const value of attrValues) {\n if (value === attrValue || value.startsWith(`${attrValue}-`)) {\n item = value;\n break;\n }\n }\n if (item) {\n res = node;\n }\n }\n break;\n }\n case '^=': {\n if (attrValue && typeof attrValue === 'string') {\n let item;\n for (const value of attrValues) {\n if (value.startsWith(`${attrValue}`)) {\n item = value;\n break;\n }\n }\n if (item) {\n res = node;\n }\n }\n break;\n }\n case '$=': {\n if (attrValue && typeof attrValue === 'string') {\n let item;\n for (const value of attrValues) {\n if (value.endsWith(`${attrValue}`)) {\n item = value;\n break;\n }\n }\n if (item) {\n res = node;\n }\n }\n break;\n }\n case '*=': {\n if (attrValue && typeof attrValue === 'string') {\n let item;\n for (const value of attrValues) {\n if (value.includes(`${attrValue}`)) {\n item = value;\n break;\n }\n }\n if (item) {\n res = node;\n }\n }\n break;\n }\n case null:\n default: {\n res = node;\n }\n }\n }\n }\n return res ?? null;\n }\n\n /**\n * match class selector\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchClassSelector(ast, node) {\n const astName = unescapeSelector(ast.name);\n let res;\n if (node.classList.contains(astName)) {\n res = node;\n }\n return res ?? null;\n }\n\n /**\n * match ID selector\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchIDSelector(ast, node) {\n const astName = unescapeSelector(ast.name);\n const { id } = node;\n let res;\n if (astName === id) {\n res = node;\n }\n return res ?? null;\n }\n\n /**\n * match type selector\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.forgive] - is forgiving selector list\n * @returns {?object} - matched node\n */\n _matchTypeSelector(ast, node, opt = {}) {\n const astName = unescapeSelector(ast.name);\n const { localName, prefix } = node;\n const { forgive } = opt;\n let {\n prefix: astPrefix, tagName: astNodeName\n } = selectorToNodeProps(astName, node);\n if (this.#document.contentType === 'text/html') {\n astPrefix = astPrefix.toLowerCase();\n astNodeName = astNodeName.toLowerCase();\n }\n let nodePrefix;\n let nodeName;\n // just in case that the namespaced content is parsed as text/html\n if (localName.indexOf(':') > -1) {\n [nodePrefix, nodeName] = localName.split(':');\n } else {\n nodePrefix = prefix || '';\n nodeName = localName;\n }\n let res;\n if (astPrefix === '' && nodePrefix === '') {\n if (node.namespaceURI === null &&\n (astNodeName === '*' || astNodeName === nodeName)) {\n res = node;\n }\n } else if (astPrefix === '*') {\n if (astNodeName === '*' || astNodeName === nodeName) {\n res = node;\n }\n } else if (astPrefix === nodePrefix) {\n if (isNamespaceDeclared(astPrefix, node)) {\n if (astNodeName === '*' || astNodeName === nodeName) {\n res = node;\n }\n } else if (!forgive) {\n throw new DOMException(`Undeclared namespace ${astPrefix}`, SYNTAX_ERR);\n }\n } else if (astPrefix && !forgive && !isNamespaceDeclared(astPrefix, node)) {\n throw new DOMException(`Undeclared namespace ${astPrefix}`, SYNTAX_ERR);\n }\n return res ?? null;\n };\n\n /**\n * match shadow host pseudo class\n * @param {object} ast - AST\n * @param {object} node - DocumentFragment node\n * @returns {?object} - matched node\n */\n _matchShadowHostPseudoClass(ast, node) {\n const { children: astChildren } = ast;\n const astName = unescapeSelector(ast.name);\n let res;\n if (Array.isArray(astChildren)) {\n const [branch] = walkAST(astChildren[0]);\n const [...leaves] = branch;\n const { host } = node;\n if (astName === 'host') {\n let bool;\n for (const leaf of leaves) {\n const { type: leafType } = leaf;\n if (leafType === COMBINATOR) {\n const css = generateCSS(ast);\n throw new DOMException(`Invalid selector ${css}`, SYNTAX_ERR);\n }\n bool = this._matchSelector(leaf, host).has(host);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n res = node;\n }\n } else if (astName === 'host-context') {\n let parent = host;\n let bool;\n while (parent) {\n for (const leaf of leaves) {\n const { type: leafType } = leaf;\n if (leafType === COMBINATOR) {\n const css = generateCSS(ast);\n throw new DOMException(`Invalid selector ${css}`, SYNTAX_ERR);\n }\n bool = this._matchSelector(leaf, parent).has(parent);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n break;\n } else {\n parent = parent.parentNode;\n }\n }\n if (bool) {\n res = node;\n }\n }\n } else if (astName === 'host') {\n res = node;\n } else {\n throw new DOMException(`Invalid selector :${astName}`, SYNTAX_ERR);\n }\n return res ?? null;\n }\n\n /**\n * match selector\n * @param {object} ast - AST\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} [opt] - options\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchSelector(ast, node, opt) {\n const { type: astType } = ast;\n const astName = unescapeSelector(ast.name);\n let matched = new Set();\n if (node.nodeType === ELEMENT_NODE) {\n switch (astType) {\n case SELECTOR_ATTR: {\n const res = this._matchAttributeSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case SELECTOR_CLASS: {\n const res = this._matchClassSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case SELECTOR_ID: {\n const res = this._matchIDSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case SELECTOR_PSEUDO_CLASS: {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n if (nodes.size) {\n matched = nodes;\n }\n break;\n }\n case SELECTOR_PSEUDO_ELEMENT: {\n this._matchPseudoElementSelector(astName, opt);\n break;\n }\n case SELECTOR_TYPE:\n default: {\n const res = this._matchTypeSelector(ast, node, opt);\n if (res) {\n matched.add(res);\n }\n }\n }\n } else if (this.#shadow && astType === SELECTOR_PSEUDO_CLASS &&\n node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n if (astName !== 'has' && REG_LOGICAL_PSEUDO.test(astName)) {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n if (nodes.size) {\n matched = nodes;\n }\n } else if (REG_SHADOW_HOST.test(astName)) {\n const res = this._matchShadowHostPseudoClass(ast, node);\n if (res) {\n matched.add(res);\n }\n }\n }\n return matched;\n }\n\n /**\n * match leaves\n * @param {Array.<object>} leaves - AST leaves\n * @param {object} node - node\n * @param {object} [opt] - options\n * @returns {boolean} - result\n */\n _matchLeaves(leaves, node, opt) {\n let bool;\n for (const leaf of leaves) {\n bool = this._matchSelector(leaf, node, opt).has(node);\n if (!bool) {\n break;\n }\n }\n return !!bool;\n }\n\n /**\n * find descendant nodes\n * @param {Array.<object>} leaves - AST leaves\n * @param {object} baseNode - base Element node\n * @returns {object} - collection of nodes and pending state\n */\n _findDescendantNodes(leaves, baseNode) {\n const [leaf, ...items] = leaves;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const matchItems = items.length > 0;\n let nodes = new Set();\n let pending = false;\n if (this.#shadow) {\n pending = true;\n } else {\n switch (leafType) {\n case SELECTOR_ID: {\n if (this.#root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n const node = this.#root.getElementById(leafName);\n if (node && node !== baseNode && baseNode.contains(node)) {\n if (matchItems) {\n const bool = this._matchLeaves(items, node);\n if (bool) {\n nodes.add(node);\n }\n } else {\n nodes.add(node);\n }\n }\n }\n break;\n }\n case SELECTOR_CLASS: {\n const arr = [].slice.call(baseNode.getElementsByClassName(leafName));\n if (arr.length) {\n if (matchItems) {\n for (const node of arr) {\n const bool = this._matchLeaves(items, node);\n if (bool) {\n nodes.add(node);\n }\n }\n } else {\n nodes = new Set(arr);\n }\n }\n break;\n }\n case SELECTOR_TYPE: {\n if (this.#document.contentType === 'text/html' &&\n !/[*|]/.test(leafName)) {\n const arr = [].slice.call(baseNode.getElementsByTagName(leafName));\n if (arr.length) {\n if (matchItems) {\n for (const node of arr) {\n const bool = this._matchLeaves(items, node);\n if (bool) {\n nodes.add(node);\n }\n }\n } else {\n nodes = new Set(arr);\n }\n }\n } else {\n pending = true;\n }\n break;\n }\n case SELECTOR_PSEUDO_ELEMENT: {\n this._matchPseudoElementSelector(leafName);\n break;\n }\n default: {\n pending = true;\n }\n }\n }\n return {\n nodes,\n pending\n };\n }\n\n /**\n * match combinator\n * @param {object} twig - twig\n * @param {object} node - Element node\n * @param {object} [opt] - option\n * @param {string} [opt.find] - 'prev'|'next', which nodes to find\n * @param {boolean} [opt.forgive] - is forgiving selector list\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchCombinator(twig, node, opt = {}) {\n const { combo, leaves } = twig;\n const { name: comboName } = combo;\n const { find, forgive } = opt;\n let matched = new Set();\n if (find === FIND_NEXT) {\n switch (comboName) {\n case '+': {\n const refNode = node.nextElementSibling;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case '~': {\n let refNode = node.nextElementSibling;\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n refNode = refNode.nextElementSibling;\n }\n break;\n }\n case '>': {\n const childNodes = node.childNodes.values();\n for (const refNode of childNodes) {\n if (refNode.nodeType === ELEMENT_NODE) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n }\n }\n break;\n }\n case ' ':\n default: {\n const { nodes, pending } = this._findDescendantNodes(leaves, node);\n if (nodes.size) {\n matched = nodes;\n } else if (pending) {\n let refNode = this._traverse(node);\n if (refNode === node) {\n refNode = this.#tree.nextNode();\n }\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n refNode = this.#tree.nextNode();\n }\n }\n }\n }\n } else {\n switch (comboName) {\n case '+': {\n const refNode = node.previousElementSibling;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case '~': {\n const arr = [];\n let refNode = node.previousElementSibling;\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n arr.push(refNode);\n }\n refNode = refNode.previousElementSibling;\n }\n if (arr.length) {\n matched = new Set(arr.reverse());\n }\n break;\n }\n case '>': {\n const refNode = node.parentNode;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case ' ':\n default: {\n const arr = [];\n let refNode = node.parentNode;\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, { forgive });\n if (bool) {\n arr.push(refNode);\n }\n refNode = refNode.parentNode;\n }\n if (arr.length) {\n matched = new Set(arr.reverse());\n }\n }\n }\n }\n return matched;\n }\n\n /**\n * find matched node from tree walker\n * @param {Array.<object>} leaves - AST leaves\n * @param {object} [opt] - options\n * @param {object} [opt.node] - node to start from\n * @param {string} [opt.targetType] - target type\n * @param {object} [opt.tree] - tree walker\n * @returns {?object} - matched node\n */\n _findNode(leaves, opt = {}) {\n let { node, targetType, tree } = opt;\n if (!tree) {\n tree = this.#tree;\n }\n let refNode = this._traverse(node);\n if (refNode.nodeType !== ELEMENT_NODE || refNode === node) {\n refNode = tree.nextNode();\n }\n let matchedNode;\n while (refNode) {\n let bool;\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (refNode === this.#node) {\n bool = true;\n } else {\n bool = this.#node.contains(refNode);\n }\n } else {\n bool = true;\n }\n if (bool) {\n const matched = this._matchLeaves(leaves, refNode);\n if (matched) {\n matchedNode = refNode;\n break;\n }\n }\n if (targetType === TARGET_LINEAL) {\n refNode = tree.parentNode();\n } else {\n refNode = tree.nextNode();\n }\n }\n return matchedNode ?? null;\n }\n\n /**\n * find entry nodes\n * @param {object} twig - twig\n * @param {string} targetType - target type\n * @returns {object} - collection of nodes etc.\n */\n _findEntryNodes(twig, targetType) {\n const { leaves } = twig;\n const [leaf, ...filterLeaves] = leaves;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const compound = filterLeaves.length > 0;\n let nodes = new Set();\n let filtered = false;\n let pending = false;\n switch (leafType) {\n case SELECTOR_ID: {\n if (targetType === TARGET_SELF) {\n const bool = this._matchLeaves(leaves, this.#node);\n if (bool) {\n nodes.add(this.#node);\n filtered = true;\n }\n } else if (targetType === TARGET_LINEAL) {\n let refNode = this.#node;\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode);\n if (bool) {\n nodes.add(refNode);\n filtered = true;\n }\n refNode = refNode.parentNode;\n }\n } else if (targetType === TARGET_ALL ||\n this.#root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n const node = this.#root.getElementById(leafName);\n if (node) {\n nodes.add(node);\n filtered = true;\n }\n }\n break;\n }\n case SELECTOR_CLASS: {\n if (targetType === TARGET_SELF) {\n if (this.#node.nodeType === ELEMENT_NODE &&\n this.#node.classList.contains(leafName)) {\n nodes.add(this.#node);\n }\n } else if (targetType === TARGET_LINEAL) {\n let refNode = this.#node;\n while (refNode) {\n if (refNode.nodeType === ELEMENT_NODE) {\n if (refNode.classList.contains(leafName)) {\n nodes.add(refNode);\n }\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n } else if (targetType === TARGET_FIRST) {\n const node = this._findNode(leaves, {\n node: this.#node,\n targetType,\n tree: this.#subtree\n });\n if (node) {\n nodes.add(node);\n filtered = true;\n break;\n }\n } else if (this.#root.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const childNodes = this.#root.childNodes.values();\n const arr = [];\n for (const node of childNodes) {\n if (node.nodeType === ELEMENT_NODE) {\n if (node.classList.contains(leafName)) {\n arr.push(node);\n }\n const a = [].slice.call(node.getElementsByClassName(leafName));\n arr.push(...a);\n }\n }\n if (arr.length) {\n nodes = new Set(arr);\n }\n } else {\n const arr =\n [].slice.call(this.#root.getElementsByClassName(leafName));\n if (this.#node.nodeType === ELEMENT_NODE) {\n for (const node of arr) {\n if (node === this.#node || isInclusive(node, this.#node)) {\n nodes.add(node);\n }\n }\n } else if (arr.length) {\n nodes = new Set(arr);\n }\n }\n break;\n }\n case SELECTOR_TYPE: {\n if (targetType === TARGET_SELF) {\n if (this.#node.nodeType === ELEMENT_NODE) {\n const bool = this._matchLeaves(leaves, this.#node);\n if (bool) {\n nodes.add(this.#node);\n filtered = true;\n }\n }\n } else if (targetType === TARGET_LINEAL) {\n let refNode = this.#node;\n while (refNode) {\n if (refNode.nodeType === ELEMENT_NODE) {\n const bool = this._matchLeaves(leaves, refNode);\n if (bool) {\n nodes.add(refNode);\n filtered = true;\n }\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n } else if (targetType === TARGET_FIRST) {\n const node = this._findNode(leaves, {\n node: this.#node,\n targetType,\n tree: this.#subtree\n });\n if (node) {\n nodes.add(node);\n filtered = true;\n break;\n }\n } else if (this.#document.contentType !== 'text/html' ||\n /[*|]/.test(leafName)) {\n pending = true;\n } else if (this.#root.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const tagName = leafName.toLowerCase();\n const childNodes = this.#root.childNodes.values();\n const arr = [];\n for (const node of childNodes) {\n if (node.nodeType === ELEMENT_NODE) {\n if (node.localName === tagName) {\n arr.push(node);\n }\n const a = [].slice.call(node.getElementsByTagName(leafName));\n arr.push(...a);\n }\n }\n if (arr.length) {\n nodes = new Set(arr);\n }\n } else {\n const arr = [].slice.call(this.#root.getElementsByTagName(leafName));\n if (this.#node.nodeType === ELEMENT_NODE) {\n for (const node of arr) {\n if (node === this.#node || isInclusive(node, this.#node)) {\n nodes.add(node);\n }\n }\n } else if (arr.length) {\n nodes = new Set(arr);\n }\n }\n break;\n }\n case SELECTOR_PSEUDO_ELEMENT: {\n // throws\n this._matchPseudoElementSelector(leafName);\n break;\n }\n default: {\n if (targetType !== TARGET_LINEAL && REG_SHADOW_HOST.test(leafName)) {\n if (this.#shadow && this.#node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const node = this._matchShadowHostPseudoClass(leaf, this.#node);\n if (node) {\n nodes.add(node);\n }\n }\n } else if (targetType === TARGET_SELF) {\n const bool = this._matchLeaves(leaves, this.#node);\n if (bool) {\n nodes.add(this.#node);\n filtered = true;\n }\n } else if (targetType === TARGET_LINEAL) {\n let refNode = this.#node;\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode);\n if (bool) {\n nodes.add(refNode);\n filtered = true;\n }\n refNode = refNode.parentNode;\n }\n } else if (targetType === TARGET_FIRST) {\n const node = this._findNode(leaves, {\n node: this.#node,\n targetType,\n tree: this.#subtree\n });\n if (node) {\n nodes.add(node);\n filtered = true;\n break;\n }\n } else {\n pending = true;\n }\n }\n }\n // check last leaf if node not found, not pending and leaves left\n if (!nodes.size && !pending && compound) {\n const lastLeaf = filterLeaves[filterLeaves.length - 1];\n const { type: lastLeafType } = lastLeaf;\n if (lastLeafType === SELECTOR_PSEUDO_CLASS) {\n let node;\n if (this.#root.nodeType === ELEMENT_NODE) {\n node = this.#root;\n } else {\n node = this.#root.firstElementChild;\n }\n // throws if unknown pseudo-class\n this._matchPseudoClassSelector(lastLeaf, node);\n }\n }\n return {\n compound,\n filtered,\n nodes,\n pending\n };\n }\n\n /**\n * get entry twig\n * @param {Array.<object>} branch - AST branch\n * @param {string} targetType - target type\n * @returns {object} - find direction and twig\n */\n _getEntryTwig(branch, targetType) {\n const branchLen = branch.length;\n const complex = branchLen > 1;\n const firstTwig = branch[0];\n let find;\n let twig;\n if (complex) {\n const { leaves: [{ type: firstType }] } = firstTwig;\n const lastTwig = branch[branchLen - 1];\n const { leaves: [{ type: lastType }] } = lastTwig;\n if (lastType === SELECTOR_PSEUDO_ELEMENT ||\n lastType === SELECTOR_ID) {\n find = FIND_PREV;\n twig = lastTwig;\n } else if (firstType === SELECTOR_PSEUDO_ELEMENT ||\n firstType === SELECTOR_ID) {\n find = FIND_NEXT;\n twig = firstTwig;\n } else {\n let bool;\n for (const { combo, leaves: [leaf] } of branch) {\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n if (leafType === SELECTOR_PSEUDO_CLASS && leafName === 'dir') {\n bool = false;\n break;\n }\n if (combo) {\n const { name: comboName } = combo;\n if (targetType === TARGET_ALL || /^[+~]$/.test(comboName)) {\n bool = true;\n }\n }\n }\n if (bool) {\n find = FIND_NEXT;\n twig = firstTwig;\n } else {\n find = FIND_PREV;\n twig = lastTwig;\n }\n }\n } else {\n find = FIND_PREV;\n twig = firstTwig;\n }\n return {\n complex,\n find,\n twig\n };\n }\n\n /**\n * collect nodes\n * @param {string} targetType - target type\n * @returns {Array.<Array.<object|undefined>>} - #ast and #nodes\n */\n _collectNodes(targetType) {\n const ast = this.#ast.values();\n if (targetType === TARGET_ALL || targetType === TARGET_FIRST) {\n if (targetType === TARGET_FIRST) {\n if (this.#node.nodeType === ELEMENT_NODE) {\n this.#subtree =\n this.#document.createTreeWalker(this.#node, SHOW_ELEMENT);\n } else {\n this.#subtree = this.#tree;\n }\n }\n const pendingItems = new Set();\n let i = 0;\n for (const { branch } of ast) {\n const { find, twig } = this._getEntryTwig(branch, targetType);\n const {\n compound, filtered, nodes, pending\n } = this._findEntryNodes(twig, targetType);\n if (nodes.size) {\n this.#nodes[i] = nodes;\n } else if (pending) {\n pendingItems.add(new Map([\n ['index', i],\n ['twig', twig]\n ]));\n } else {\n this.#ast[i].skip = true;\n }\n this.#ast[i].filtered = filtered || !compound;\n this.#ast[i].find = find;\n i++;\n }\n if (pendingItems.size) {\n let nextNode = this._traverse();\n while (nextNode) {\n let bool = false;\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (nextNode === this.#node) {\n bool = true;\n } else {\n bool = this.#node.contains(nextNode);\n }\n } else {\n bool = true;\n }\n if (bool) {\n for (const pendingItem of pendingItems) {\n const { leaves } = pendingItem.get('twig');\n const matched = this._matchLeaves(leaves, nextNode);\n if (matched) {\n const index = pendingItem.get('index');\n this.#nodes[index].add(nextNode);\n this.#ast[index].filtered = true;\n }\n }\n }\n nextNode = this.#tree.nextNode();\n }\n }\n } else {\n let i = 0;\n for (const { branch } of ast) {\n const twig = branch[branch.length - 1];\n const {\n compound, filtered, nodes\n } = this._findEntryNodes(twig, targetType);\n if (nodes.size) {\n this.#nodes[i] = nodes;\n } else {\n this.#ast[i].skip = true;\n }\n this.#ast[i].filtered = filtered || !compound;\n this.#ast[i].find = FIND_PREV;\n i++;\n }\n }\n return [\n this.#ast,\n this.#nodes\n ];\n }\n\n /**\n * sort nodes\n * @param {Array.<object>|Set.<object>} nodes - collection of nodes\n * @returns {Array.<object|undefined>} - collection of sorted nodes\n */\n _sortNodes(nodes) {\n const arr = [...nodes];\n if (arr.length > 1) {\n arr.sort((a, b) => {\n let res;\n if (isPreceding(b, a)) {\n res = 1;\n } else {\n res = -1;\n }\n return res;\n });\n }\n return arr;\n }\n\n /**\n * match nodes\n * @param {string} targetType - target type\n * @returns {Set.<object>} - collection of matched nodes\n */\n _matchNodes(targetType) {\n const [...branches] = this.#ast;\n const l = branches.length;\n let nodes = new Set();\n for (let i = 0; i < l; i++) {\n const { branch, filtered, find, skip } = branches[i];\n const branchLen = branch.length;\n if (skip) {\n continue;\n } else if (branchLen) {\n const entryNodes = this.#nodes[i];\n const lastIndex = branchLen - 1;\n if (lastIndex === 0) {\n const { leaves: [, ...filterLeaves] } = branch[0];\n if ((targetType === TARGET_ALL || targetType === TARGET_FIRST) &&\n this.#node.nodeType === ELEMENT_NODE) {\n for (const node of entryNodes) {\n const bool = filtered || this._matchLeaves(filterLeaves, node);\n if (bool && node !== this.#node && this.#node.contains(node)) {\n nodes.add(node);\n if (targetType !== TARGET_ALL) {\n break;\n }\n }\n }\n } else if (!filterLeaves.length) {\n if (targetType === TARGET_ALL) {\n const n = [...nodes];\n nodes = new Set([...n, ...entryNodes]);\n } else {\n const [node] = [...entryNodes];\n nodes.add(node);\n }\n } else {\n for (const node of entryNodes) {\n const bool = filtered || this._matchLeaves(filterLeaves, node);\n if (bool) {\n nodes.add(node);\n if (targetType !== TARGET_ALL) {\n break;\n }\n }\n }\n }\n } else if (find === FIND_NEXT) {\n let { combo, leaves: entryLeaves } = branch[0];\n const [, ...filterLeaves] = entryLeaves;\n let matched;\n for (const node of entryNodes) {\n const bool = filtered || this._matchLeaves(filterLeaves, node);\n if (bool) {\n let nextNodes = new Set([node]);\n for (let j = 1; j < branchLen; j++) {\n const { combo: nextCombo, leaves } = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const twig = {\n combo,\n leaves\n };\n const m = this._matchCombinator(twig, nextNode, { find });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === lastIndex) {\n if (targetType === TARGET_FIRST) {\n const [node] = this._sortNodes(arr);\n nodes.add(node);\n } else {\n const n = [...nodes];\n nodes = new Set([...n, ...arr]);\n }\n matched = true;\n break;\n } else {\n matched = false;\n combo = nextCombo;\n nextNodes = new Set(arr);\n }\n } else {\n matched = false;\n break;\n }\n }\n } else {\n matched = false;\n }\n if (matched && targetType !== TARGET_ALL) {\n break;\n }\n }\n if (!matched && targetType === TARGET_FIRST) {\n const [entryNode] = [...entryNodes];\n let refNode = this._findNode(entryLeaves, {\n targetType,\n node: entryNode,\n tree: this.#subtree\n });\n while (refNode) {\n let nextNodes = new Set([refNode]);\n for (let j = 1; j < branchLen; j++) {\n const { combo: nextCombo, leaves } = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const twig = {\n combo,\n leaves\n };\n const m = this._matchCombinator(twig, nextNode, { find });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === lastIndex) {\n const [node] = this._sortNodes(arr);\n nodes.add(node);\n matched = true;\n break;\n } else {\n matched = false;\n combo = nextCombo;\n nextNodes = new Set(arr);\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched) {\n break;\n }\n refNode = this._findNode(entryLeaves, {\n targetType,\n node: refNode,\n tree: this.#subtree\n });\n nextNodes = new Set([refNode]);\n }\n }\n } else {\n const { leaves: entryLeaves } = branch[lastIndex];\n const [, ...filterLeaves] = entryLeaves;\n let matched;\n for (const node of entryNodes) {\n const bool = filtered || this._matchLeaves(filterLeaves, node);\n if (bool) {\n let nextNodes = new Set([node]);\n for (let j = lastIndex - 1; j >= 0; j--) {\n const twig = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, { find });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n nodes.add(node);\n matched = true;\n break;\n } else {\n matched = false;\n nextNodes = new Set(arr);\n }\n } else {\n matched = false;\n break;\n }\n }\n }\n if (matched && targetType !== TARGET_ALL) {\n break;\n }\n }\n if (!matched && targetType === TARGET_FIRST) {\n const [entryNode] = [...entryNodes];\n let refNode = this._findNode(entryLeaves, {\n targetType,\n node: entryNode,\n tree: this.#subtree\n });\n while (refNode) {\n let nextNodes = new Set([refNode]);\n for (let j = lastIndex - 1; j >= 0; j--) {\n const twig = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, { find });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n nodes.add(refNode);\n matched = true;\n break;\n } else {\n matched = false;\n nextNodes = new Set(arr);\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched) {\n break;\n }\n refNode = this._findNode(entryLeaves, {\n targetType,\n node: refNode,\n tree: this.#subtree\n });\n nextNodes = new Set([refNode]);\n }\n }\n }\n }\n }\n return nodes;\n }\n\n /**\n * find matched nodes\n * @param {string} targetType - target type\n * @returns {Set.<object>} - collection of matched nodes\n */\n _find(targetType) {\n this._collectNodes(targetType);\n const nodes = this._matchNodes(targetType);\n return nodes;\n }\n\n /**\n * matches\n * @returns {boolean} - `true` if matched `false` otherwise\n */\n matches() {\n if (this.#node.nodeType !== ELEMENT_NODE) {\n throw new TypeError(`Unexpected node ${this.#node.nodeName}`);\n }\n let res;\n try {\n const nodes = this._find(TARGET_SELF);\n if (nodes.size) {\n res = nodes.has(this.#node);\n }\n } catch (e) {\n this._onError(e);\n }\n return !!res;\n }\n\n /**\n * closest\n * @returns {?object} - matched node\n */\n closest() {\n if (this.#node.nodeType !== ELEMENT_NODE) {\n throw new TypeError(`Unexpected node ${this.#node.nodeName}`);\n }\n let res;\n try {\n const nodes = this._find(TARGET_LINEAL);\n let node = this.#node;\n while (node) {\n if (nodes.has(node)) {\n res = node;\n break;\n }\n node = node.parentNode;\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? null;\n }\n\n /**\n * query selector\n * @returns {?object} - matched node\n */\n querySelector() {\n let res;\n try {\n const nodes = this._find(TARGET_FIRST);\n nodes.delete(this.#node);\n if (nodes.size) {\n [res] = this._sortNodes(nodes);\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? null;\n }\n\n /**\n * query selector all\n * NOTE: returns Array, not NodeList\n * @returns {Array.<object|undefined>} - collection of matched nodes\n */\n querySelectorAll() {\n let res;\n try {\n const nodes = this._find(TARGET_ALL);\n nodes.delete(this.#node);\n if (nodes.size) {\n res = this._sortNodes(nodes);\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? [];\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["matcher_exports", "__export", "Matcher", "__toCommonJS", "import_is_potential_custom_element_name", "import_dom_util", "import_parser", "import_constant", "FIND_NEXT", "FIND_PREV", "TARGET_ALL", "TARGET_FIRST", "TARGET_LINEAL", "TARGET_SELF", "#ast", "#bit", "#cache", "#document", "#node", "#nodes", "#root", "#shadow", "#subtree", "#tree", "#warn", "selector", "node", "opt", "warn", "e", "document", "root", "parent", "filter", "walker", "leaves", "arr", "a", "b", "typeA", "typeB", "bitA", "bitB", "res", "ast", "branches", "tree", "nodes", "i", "items", "branch", "item", "nextItem", "msg", "current", "refNode", "anb", "reverse", "parentNode", "matched", "selectorBranches", "n", "l", "selectorNodes", "bool", "nth", "j", "localName", "prefix", "itemLocalName", "itemPrefix", "nthName", "nthIdentName", "identName", "anbMap", "astName", "forgive", "dir", "langPart", "regExtendedLang", "langMain", "langSub", "langRest", "extendedMain", "extendedSub", "len", "extendedRest", "value", "leaf", "leafType", "combo", "twigLeaves", "itemType", "twig", "nextNode", "astData", "twigBranches", "lastIndex", "nextNodes", "m", "astChildren", "selectors", "css", "leavesSet", "regAnchor", "regFormCtrl", "regFormValidity", "regInteract", "regTypeCheck", "regTypeDate", "regTypeRange", "regTypeText", "href", "origin", "pathname", "attrURL", "hash", "id", "isCustomElementName", "targetNode", "nodeName", "checked", "regTypeReset", "regTypeSubmit", "form", "iterator", "isMultiple", "firstOpt", "defaultOpt", "inputType", "node1", "node2", "astFlags", "astMatcher", "astValue", "attributes", "caseInsensitive", "astAttrName", "attrValues", "astAttrPrefix", "astAttrLocalName", "itemName", "itemValue", "itemNamePrefix", "itemNameLocalName", "astAttrIdentValue", "astAttrStringValue", "attrValue", "astPrefix", "astNodeName", "nodePrefix", "host", "astType", "baseNode", "leafName", "matchItems", "pending", "comboName", "find", "childNodes", "targetType", "matchedNode", "filterLeaves", "compound", "filtered", "tagName", "lastLeaf", "lastLeafType", "branchLen", "complex", "firstTwig", "firstType", "lastTwig", "lastType", "pendingItems", "pendingItem", "index", "skip", "entryNodes", "entryLeaves", "nextCombo", "entryNode"]
|
|
7
7
|
}
|