@asamuzakjp/dom-selector 1.0.3 → 1.0.4
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 +36 -32
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/js/matcher.js +1 -1
- package/dist/cjs/js/matcher.js.map +3 -3
- package/package.json +1 -1
- package/src/index.js +1 -1
- package/src/js/matcher.js +12 -11
package/README.md
CHANGED
|
@@ -233,38 +233,38 @@ const dom = new JSDOM('', {
|
|
|
233
233
|
|
|
234
234
|
|Method / Selector|Jsdom|Patched-jsdom|Result|
|
|
235
235
|
|:----------------|:----------------|:----------------|:----------------|
|
|
236
|
-
|matches('.container.box')|
|
|
237
|
-
|matches('.container:not(.box)')|
|
|
238
|
-
|matches('.box + .box')|
|
|
239
|
-
|matches('.box ~ .box')|
|
|
240
|
-
|matches('.box > .block')|1,
|
|
241
|
-
|matches('.box .content')|
|
|
242
|
-
|matches('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner > .content')|
|
|
243
|
-
|matches('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner:has(> .content)')|N/A|
|
|
244
|
-
|closest('.container.box')|
|
|
245
|
-
|closest('.container:not(.box)')|
|
|
246
|
-
|closest('.box + .box')|
|
|
247
|
-
|closest('.box ~ .box')|
|
|
248
|
-
|closest('.box > .block')|
|
|
249
|
-
|closest('.box .content')|
|
|
250
|
-
|closest('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner > .content')|
|
|
251
|
-
|closest('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner:has(> .content)')|N/A|
|
|
252
|
-
|querySelector('.container.box')|
|
|
253
|
-
|querySelector('.container:not(.box)')|
|
|
254
|
-
|querySelector('.box + .box')|
|
|
255
|
-
|jsdom querySelector('.box ~ .box')|
|
|
256
|
-
|querySelector('.box > .block')|
|
|
257
|
-
|querySelector('.box .content')|
|
|
258
|
-
|querySelector('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner > .content')|
|
|
259
|
-
|querySelector('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner:has(> .content)')|N/A|
|
|
260
|
-
|querySelectorAll('.container.box')|
|
|
261
|
-
|querySelectorAll('.container:not(.box)')|
|
|
262
|
-
|querySelectorAll('.box + .box')|
|
|
263
|
-
|querySelectorAll('.box ~ .box')|
|
|
264
|
-
|jsdom querySelectorAll('.box > .block')|
|
|
265
|
-
|querySelectorAll('.box .content')|
|
|
266
|
-
|querySelectorAll('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner > .content')|
|
|
267
|
-
|querySelectorAll('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner:has(> .content)')|N/A|
|
|
236
|
+
|matches('.container.box')|2,103,531 ops/sec ±16.53%|113,370 ops/sec ±9.63%|jsdom is 18.6 times faster. patched-jsdom took 0.009msec.|
|
|
237
|
+
|matches('.container:not(.box)')|1,103,421 ops/sec ±0.13%|75,746 ops/sec ±0.14%|jsdom is 14.6 times faster. patched-jsdom took 0.013msec.|
|
|
238
|
+
|matches('.box + .box')|2,023,891 ops/sec ±0.36%|106,495 ops/sec ±1.39%|jsdom is 19.0 times faster. patched-jsdom took 0.009msec.|
|
|
239
|
+
|matches('.box ~ .box')|2,013,003 ops/sec ±0.21%|110,622 ops/sec ±0.14%|jsdom is 18.2 times faster. patched-jsdom took 0.009msec.|
|
|
240
|
+
|matches('.box > .block')|1,969,215 ops/sec ±0.28%|110,591 ops/sec ±0.13%|jsdom is 17.8 times faster. patched-jsdom took 0.009msec.|
|
|
241
|
+
|matches('.box .content')|300,820 ops/sec ±0.23%|53,400 ops/sec ±1.03%|jsdom is 5.6 times faster. patched-jsdom took 0.019msec.|
|
|
242
|
+
|matches('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner > .content')|132,861 ops/sec ±0.18%|10,889 ops/sec ±3.40%|jsdom is 12.2 times faster. patched-jsdom took 0.092msec.|
|
|
243
|
+
|matches('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner:has(> .content)')|N/A|35,323 ops/sec ±0.22%|jsdom throws. patched-jsdom took 0.028msec.|
|
|
244
|
+
|closest('.container.box')|393,527 ops/sec ±0.13%|51,058 ops/sec ±0.14%|jsdom is 7.7 times faster. patched-jsdom took 0.020msec.|
|
|
245
|
+
|closest('.container:not(.box)')|217,890 ops/sec ±4.31%|32,496 ops/sec ±6.77%|jsdom is 6.7 times faster. patched-jsdom took 0.031msec.|
|
|
246
|
+
|closest('.box + .box')|346,812 ops/sec ±2.50%|50,913 ops/sec ±0.13%|jsdom is 6.8 times faster. patched-jsdom took 0.020msec.|
|
|
247
|
+
|closest('.box ~ .box')|141,015 ops/sec ±0.14%|29,432 ops/sec ±0.14%|jsdom is 4.8 times faster. patched-jsdom took 0.034msec.|
|
|
248
|
+
|closest('.box > .block')|390,585 ops/sec ±0.12%|47,152 ops/sec ±1.52%|jsdom is 8.3 times faster. patched-jsdom took 0.021msec.|
|
|
249
|
+
|closest('.box .content')|292,276 ops/sec ±1.48%|37,460 ops/sec ±1.93%|jsdom is 7.8 times faster. patched-jsdom took 0.027msec.|
|
|
250
|
+
|closest('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner > .content')|121,479 ops/sec ±1.97%|9,877 ops/sec ±1.68%|jsdom is 12.3 times faster. patched-jsdom took 0.101msec.|
|
|
251
|
+
|closest('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner:has(> .content)')|N/A|8,379 ops/sec ±0.65%|jsdom throws. patched-jsdom took 0.119msec.|
|
|
252
|
+
|querySelector('.container.box')|80,132 ops/sec ±1.31%|23,699 ops/sec ±1.43%|jsdom is 3.4 times faster. patched-jsdom took 0.042msec.|
|
|
253
|
+
|querySelector('.container:not(.box)')|69,928 ops/sec ±1.42%|17,739 ops/sec ±1.21%|jsdom is 3.9 times faster. patched-jsdom took 0.056msec.|
|
|
254
|
+
|querySelector('.box + .box')|65,958 ops/sec ±1.35%|18,716 ops/sec ±1.41%|jsdom is 3.5 times faster. patched-jsdom took 0.053msec.|
|
|
255
|
+
|jsdom querySelector('.box ~ .box')|67,535 ops/sec ±1.53%|8,419 ops/sec ±1.24%|jsdom is 8.0 times faster. patched-jsdom took 0.119msec.|
|
|
256
|
+
|querySelector('.box > .block')|1,039 ops/sec ±1.61%|2,782 ops/sec ±0.84%|patched-jsdom is 2.7 times faster. patched-jsdom took 0.359msec.|
|
|
257
|
+
|querySelector('.box .content')|492 ops/sec ±1.52%|259 ops/sec ±1.19%|jsdom is 1.9 times faster. patched-jsdom took 3.867msec.|
|
|
258
|
+
|querySelector('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner > .content')|202 ops/sec ±1.21%|430 ops/sec ±0.86%|patched-jsdom is 2.1 times faster. patched-jsdom took 2.323msec.|
|
|
259
|
+
|querySelector('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner:has(> .content)')|N/A|366 ops/sec ±1.41%|jsdom throws. patched-jsdom took 2.730msec.|
|
|
260
|
+
|querySelectorAll('.container.box')|92,026 ops/sec ±0.12%|20,885 ops/sec ±0.15%|jsdom is 4.4 times faster. patched-jsdom took 0.048msec.|
|
|
261
|
+
|querySelectorAll('.container:not(.box)')|81,439 ops/sec ±1.22%|16,083 ops/sec ±1.86%|jsdom is 5.1 times faster. patched-jsdom took 0.062msec.|
|
|
262
|
+
|querySelectorAll('.box + .box')|80,091 ops/sec ±1.29%|18,897 ops/sec ±0.09%|jsdom is 4.2 times faster. patched-jsdom took 0.053msec.|
|
|
263
|
+
|querySelectorAll('.box ~ .box')|80,555 ops/sec ±0.11%|8,200 ops/sec ±1.90%|jsdom is 9.8 times faster. patched-jsdom took 0.122msec.|
|
|
264
|
+
|jsdom querySelectorAll('.box > .block')|937 ops/sec ±1.40%|2,378 ops/sec ±0.97%|patched-jsdom is 2.5 times faster. patched-jsdom took 0.421msec.|
|
|
265
|
+
|querySelectorAll('.box .content')|480 ops/sec ±1.08%|240 ops/sec ±1.03%|jsdom is 2.0 times faster. patched-jsdom took 4.160msec.|
|
|
266
|
+
|querySelectorAll('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner > .content')|202 ops/sec ±1.25%|427 ops/sec ±0.86%|patched-jsdom is 2.1 times faster. patched-jsdom took 2.342msec.|
|
|
267
|
+
|querySelectorAll('.box:first-child ~ .box:nth-of-type(4n+1) + .box .block.inner:has(> .content)')|N/A|365 ops/sec ±0.81%|jsdom throws. patched-jsdom took 2.737msec.|
|
|
268
268
|
|
|
269
269
|
|
|
270
270
|
## Acknowledgments
|
|
@@ -275,6 +275,10 @@ The following resources have been of great help in the development of the DOM Se
|
|
|
275
275
|
- [selery](https://github.com/danburzo/selery)
|
|
276
276
|
|
|
277
277
|
|
|
278
|
+
---
|
|
279
|
+
Copyright (c) 2023 [asamuzaK (Kazz)](https://github.com/asamuzaK/)
|
|
280
|
+
|
|
281
|
+
|
|
278
282
|
[1]: #matches
|
|
279
283
|
[2]: #parameters
|
|
280
284
|
[3]: #closest
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var l=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var q=(t,e)=>{for(var o in e)l(t,o,{get:e[o],enumerable:!0})},u=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of p(e))!m.call(t,r)&&r!==o&&l(t,r,{get:()=>e[r],enumerable:!(s=n(e,r))||s.enumerable});return t};var w=t=>u(l({},"__esModule",{value:!0}),t);var h={};q(h,{closest:()=>y,matches:()=>x,querySelector:()=>S,querySelectorAll:()=>a});module.exports=w(h);var c=require("./js/matcher.js");/*!
|
|
2
|
-
* DOM Selector -
|
|
2
|
+
* DOM Selector - Gets the DOM node that matches the CSS selector.
|
|
3
3
|
* @license MIT
|
|
4
4
|
* @copyright asamuzaK (Kazz)
|
|
5
5
|
* @see {@link https://github.com/asamuzaK/domSelector/blob/main/LICENSE}
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.js"],
|
|
4
|
-
"sourcesContent": ["/*!\n * DOM Selector -
|
|
4
|
+
"sourcesContent": ["/*!\n * DOM Selector - Gets the DOM node that matches the CSS selector.\n * @license MIT\n * @copyright asamuzaK (Kazz)\n * @see {@link https://github.com/asamuzaK/domSelector/blob/main/LICENSE}\n */\n\n/* import */\nimport { Matcher } from './js/matcher.js';\n\n/**\n * matches\n * @param {string} selector - CSS selector\n * @param {object} node - Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.warn] - console warn e.g. unsupported pseudo-class\n * @returns {boolean} - `true` if matched `false` otherwise\n */\nexport const matches = (selector, node, opt) =>\n new Matcher(selector, node, opt).matches();\n\n/**\n * closest\n * @param {string} selector - CSS selector\n * @param {object} node - Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.warn] - console warn e.g. unsupported pseudo-class\n * @returns {?object} - matched node\n */\nexport const closest = (selector, node, opt) =>\n new Matcher(selector, node, opt).closest();\n\n/**\n * querySelector\n * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment or Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.warn] - console warn e.g. unsupported pseudo-class\n * @returns {?object} - matched node\n */\nexport const querySelector = (selector, node, opt) =>\n new Matcher(selector, node, opt).querySelector();\n\n/**\n * querySelectorAll\n * NOTE: returns Array, not NodeList\n * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment or Element node\n * @param {object} [opt] - options\n * @param {boolean} [opt.sort] - sort matched nodes\n * @param {boolean} [opt.warn] - console warn e.g. unsupported pseudo-class\n * @returns {Array.<object|undefined>} - array of matched nodes\n */\nexport const querySelectorAll = (selector, node, opt) =>\n new Matcher(selector, node, opt).querySelectorAll();\n"],
|
|
5
5
|
"mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,YAAAC,EAAA,kBAAAC,EAAA,qBAAAC,IAAA,eAAAC,EAAAN,GAQA,IAAAO,EAAwB,2BARxB;AAAA;AAAA;AAAA;AAAA;AAAA,GAkBO,MAAMJ,EAAU,CAACK,EAAUC,EAAMC,IACtC,IAAI,UAAQF,EAAUC,EAAMC,CAAG,EAAE,QAAQ,EAU9BR,EAAU,CAACM,EAAUC,EAAMC,IACtC,IAAI,UAAQF,EAAUC,EAAMC,CAAG,EAAE,QAAQ,EAU9BN,EAAgB,CAACI,EAAUC,EAAMC,IAC5C,IAAI,UAAQF,EAAUC,EAAMC,CAAG,EAAE,cAAc,EAYpCL,EAAmB,CAACG,EAAUC,EAAMC,IAC/C,IAAI,UAAQF,EAAUC,EAAMC,CAAG,EAAE,iBAAiB",
|
|
6
6
|
"names": ["src_exports", "__export", "closest", "matches", "querySelector", "querySelectorAll", "__toCommonJS", "import_matcher", "selector", "node", "opt"]
|
|
7
7
|
}
|
package/dist/cjs/js/matcher.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var j=Object.create;var L=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var Y=(y,a)=>{for(var e in a)L(y,e,{get:a[e],enumerable:!0})},R=(y,a,e,o)=>{if(a&&typeof a=="object"||typeof a=="function")for(let h of W(a))!G.call(y,h)&&h!==e&&L(y,h,{get:()=>a[h],enumerable:!(o=H(a,h))||o.enumerable});return y};var X=(y,a,e)=>(e=y!=null?j(q(y)):{},R(a||!y||!y.__esModule?L(e,"default",{value:y,enumerable:!0}):e,y)),Z=y=>R(L({},"__esModule",{value:!0}),y);var ee={};Y(ee,{Matcher:()=>Q});module.exports=Z(ee);var D=X(require("is-potential-custom-element-name"),1),k=require("./dom-util.js"),g=require("./parser.js"),b=require("./constant.js");const $="all",T="first",v="lineal",S="self",U=/^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/,C=/^(?:(?:(?:in|out)pu|selec)t|button|form|textarea)$/,M=/^a(?:rea)?$/,B=/^d(?:etails|ialog)$/,O=/^(?:checkbox|radio)$/,x=/^(?:(?:emai|te|ur)l|number|password|search|text)$/,z=/(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/,F=/^(?:button|reset)$/,V=/^(?:image|submit)$/,I=/^(?:date(?:time-local)?|month|time|week)$/,K=/^(?:(?:ha|i)s|not|where)$/,J=/^nth-(?:last-)?(?:child|of-type)$/;class Q{#s;#l;#a;#e;#r;#t;#o;#c;#i;constructor(a,e,o={}){const{sort:h,warn:c}=o;this.#l=new Map([[b.PSEUDO_ELEMENT_SELECTOR,b.BIT_1],[b.ID_SELECTOR,b.BIT_10],[b.CLASS_SELECTOR,b.BIT_100],[b.TYPE_SELECTOR,b.BIT_1000],[b.ATTRIBUTE_SELECTOR,b.BIT_10000],[b.PSEUDO_CLASS_SELECTOR,b.BIT_100000]]),this.#a=new WeakMap,this.#o=a,this.#e=e,this.#c=!!h,this.#i=!!c,[this.#s,this.#r]=this._prepare(a),this.#t=this._getRoot(e)}_onError(a){if(a instanceof DOMException&&a.name===b.NOT_SUPPORTED_ERR)this.#i&&console.warn(a.message);else throw a}_getRoot(a=this.#e){let e,o;switch(a.nodeType){case b.DOCUMENT_NODE:{e=a,o=a;break}case b.DOCUMENT_FRAGMENT_NODE:{e=a.ownerDocument,o=a;break}case b.ELEMENT_NODE:{if((0,k.isSameOrDescendant)(a))e=a.ownerDocument,o=a.ownerDocument;else{let h=a;for(;h&&h.parentNode;)h=h.parentNode;e=h.ownerDocument,o=h}break}default:throw new TypeError(`Unexpected node ${a.nodeName}`)}return{document:e,root:o}}_sortLeaves(a){const e=[...a];return e.length>1&&e.sort((o,h)=>{const{type:c}=o,{type:d}=h,p=this.#l.get(c),u=this.#l.get(d);let t;return p===u?t=0:p>u?t=1:t=-1,t}),e}_prepare(a=this.#o){const e=(0,g.parseSelector)(a),o=(0,g.walkAST)(e),h=[],c=[];let d=0;for(const[...p]of o){const u=[];let t=p.shift();if(t&&t.type!==b.COMBINATOR){const l=new Set;for(;t;){if(t.type===b.COMBINATOR){const[n]=p;if(n.type===b.COMBINATOR){const f=`Invalid combinator ${t.name}${n.name}`;throw new DOMException(f,b.SYNTAX_ERR)}u.push({combo:t,leaves:this._sortLeaves(l)}),l.clear()}else t&&l.add(t);if(p.length)t=p.shift();else{u.push({combo:null,leaves:this._sortLeaves(l)}),l.clear();break}}}h.push({branch:u,find:null,skip:!1}),c[d]=new Set,d++}return[h,c]}_collectNthChild(a,e){const{a:o,b:h,reverse:c,selector:d}=a,{parentNode:p}=e,u=new Set;let t;if(d&&(this.#a.has(d)?t=this.#a.get(d):(t=(0,g.walkAST)(d),this.#a.set(d,t))),p){const l=[...p.children],n=l.length;if(n){const f=new Set;if(t){const r=t.length;for(const s of l){let i;for(let m=0;m<r;m++){const N=t[m];if(i=this._matchLeaves(N,s),!i)break}i&&f.add(s)}}if(c&&l.reverse(),o===0){if(h>0&&h<=n){if(f.size)for(let r=0;r<n;r++){const s=l[r];if(f.has(s)){u.add(s);break}}else if(!d){const r=l[h-1];u.add(r)}}}else{let r=h-1;if(o>0)for(;r<0;)r+=o;if(r>=0&&r<n){let s=o>0?0:h-1;for(let i=0;i<n&&r>=0&&r<n;i++){const m=l[i];f.size?f.has(m)&&(s===r&&(u.add(m),r+=o),o>0?s++:s--):i===r&&(d||u.add(m),r+=o)}}}}}else{const{root:l}=this.#t;if(l.nodeType===b.ELEMENT_NODE&&e===l&&o+h===1)if(t){const n=t.length;let f;for(let r=0;r<n;r++){const s=t[r];if(f=this._matchLeaves(s,e),f)break}f&&u.add(e)}else u.add(e)}return u}_collectNthOfType(a,e){const{a:o,b:h,reverse:c}=a,{localName:d,parentNode:p,prefix:u}=e,t=new Set;if(p){const l=[...p.children],n=l.length;if(n)if(c&&l.reverse(),o===0){if(h>0&&h<=n){let f=0;for(let r=0;r<n;r++){const s=l[r],{localName:i,prefix:m}=s;if(i===d&&m===u){if(f===h-1){t.add(s);break}f++}}}}else{let f=h-1;if(o>0)for(;f<0;)f+=o;if(f>=0&&f<n){let r=o>0?0:h-1;for(let s=0;s<n;s++){const i=l[s],{localName:m,prefix:N}=i;if(m===d&&N===u){if(r===f&&(t.add(i),f+=o),f<0||f>=n)break;o>0?r++:r--}}}}}else{const{root:l}=this.#t;l.nodeType===b.ELEMENT_NODE&&e===l&&o+h===1&&t.add(e)}return t}_matchAnPlusB(a,e,o){const{nth:{a:h,b:c,name:d},selector:p}=a,u=(0,g.unescapeSelector)(d),t=new Map;u?(u==="even"?(t.set("a",2),t.set("b",0)):u==="odd"&&(t.set("a",2),t.set("b",1)),/last/.test(o)&&t.set("reverse",!0)):(typeof h=="string"&&/-?\d+/.test(h)?t.set("a",h*1):t.set("a",0),typeof c=="string"&&/-?\d+/.test(c)?t.set("b",c*1):t.set("b",0),/last/.test(o)&&t.set("reverse",!0));let l=new Set;if(t.has("a")&&t.has("b")){if(/^nth-(?:last-)?child$/.test(o)){p&&t.set("selector",p);const n=Object.fromEntries(t),f=this._collectNthChild(n,e);f.size&&(l=f)}else if(/^nth-(?:last-)?of-type$/.test(o)){const n=Object.fromEntries(t),f=this._collectNthOfType(n,e);f.size&&(l=f)}}return l}_matchPseudoElementSelector(a,e={}){const{forgive:o}=e;switch(a){case"after":case"backdrop":case"before":case"cue":case"cue-region":case"first-letter":case"first-line":case"file-selector-button":case"marker":case"part":case"placeholder":case"selection":case"slotted":case"target-text":{if(this.#i)throw new DOMException(`Unsupported pseudo-element ::${a}`,b.NOT_SUPPORTED_ERR);break}default:if(a.startsWith("-webkit-")){if(this.#i)throw new DOMException(`Unsupported pseudo-element ::${a}`,b.NOT_SUPPORTED_ERR)}else if(!o)throw new DOMException(`Unknown pseudo-element ::${a}`,b.SYNTAX_ERR)}}_matchDirectionPseudoClass(a,e){const o=(0,g.unescapeSelector)(a.name),h=(0,k.getDirectionality)(e);let c;return o===h&&(c=e),c??null}_matchLanguagePseudoClass(a,e){const o=(0,g.unescapeSelector)(a.name);let h;if(o){if(o==="*")if(e.hasAttribute("lang"))e.getAttribute("lang")&&(h=e);else{let c=e.parentNode;for(;c;){if(c.hasAttribute("lang")){c.getAttribute("lang")&&(h=e);break}c=c.parentNode}}else if(/[A-Z\d-]+/i.test(o)){const c="[A-Z\\d]+",d=`(?:-${c})*`;let p;if(/-/.test(o)){const[u,t,...l]=o.split("-");let n;u==="*"?n=`${c}${d}`:n=`${u}${d}`;const f=`-${t}${d}`,r=l.length;let s="";if(r)for(let i=0;i<r;i++)s+=`-${l[i]}${d}`;p=new RegExp(`^${n}${f}${s}$`,"i")}else p=new RegExp(`^${o}${d}$`,"i");if(e.hasAttribute("lang"))p.test(e.getAttribute("lang"))&&(h=e);else{let u=e.parentNode;for(;u;){if(u.hasAttribute("lang")){const t=u.getAttribute("lang");p.test(t)&&(h=e);break}u=u.parentNode}}}}return h??null}_matchHasPseudoFunc(a,e){let o;if(Array.isArray(a)&&a.length){const[h]=a,{type:c}=h;let d;c===b.COMBINATOR?d=a.shift():d={name:" ",type:b.COMBINATOR};const p=[];for(;a.length;){const[l]=a,{type:n}=l;if(n===b.COMBINATOR)break;p.push(a.shift())}const u={combo:d,leaves:p},t=this._matchCombinator(u,e,{find:"next"});if(t.size)if(a.length){for(const l of t)if(o=this._matchHasPseudoFunc(Object.assign([],a),l),o)break}else o=!0}return!!o}_matchLogicalPseudoFunc(a,e){const{astName:o="",branches:h=[],selector:c="",twigBranches:d=[]}=a;let p;if(o==="has")if(c.includes(":has("))p=null;else{let u;const t=h.length;for(let l=0;l<t;l++){const n=h[l];if(u=this._matchHasPseudoFunc(Object.assign([],n),e),u)break}u&&(p=e)}else{const u=/^(?:is|where)$/.test(o);let t;const l=d.length;for(let n=0;n<l;n++){const f=d[n],r=f.length-1,{leaves:s}=f[r];if(t=this._matchLeaves(s,e,{forgive:u}),t&&r>0){let i=new Set([e]);for(let m=r-1;m>=0;m--){const N=f[m],w=[];for(const _ of i){const A=this._matchCombinator(N,_,{forgive:u,find:"prev"});A.size&&w.push(...A)}const E=new Set(w);if(E.size)if(m===0){t=!0;break}else i=E;else{t=!1;break}}}if(t)break}o==="not"?t||(p=e):t&&(p=e)}return p??null}_matchPseudoClassSelector(a,e,o={}){const{children:h}=a,{localName:c,parentNode:d}=e,{forgive:p}=o,u=(0,g.unescapeSelector)(a.name);let t=new Set;if(K.test(u)){let l;if(this.#a.has(a))l=this.#a.get(a);else{const f=(0,g.walkAST)(a),r=[],s=[];for(const[...i]of f){for(const E of i){const _=(0,g.generateCSS)(E);r.push(_)}const m=[],N=new Set;let w=i.shift();for(;w;)if(w.type===b.COMBINATOR?(m.push({combo:w,leaves:[...N]}),N.clear()):w&&N.add(w),i.length)w=i.shift();else{m.push({combo:null,leaves:[...N]}),N.clear();break}s.push(m)}l={astName:u,branches:f,twigBranches:s,selector:r.join(",")},this.#a.set(a,l)}const n=this._matchLogicalPseudoFunc(l,e);n&&t.add(n)}else if(Array.isArray(h)){const[l]=h;if(J.test(u)){const n=this._matchAnPlusB(l,e,u);n.size&&(t=n)}else if(u==="dir"){const n=this._matchDirectionPseudoClass(l,e);n&&t.add(n)}else if(u==="lang"){const n=this._matchLanguagePseudoClass(l,e);n&&t.add(n)}else switch(u){case"current":case"nth-col":case"nth-last-col":{if(this.#i)throw new DOMException(`Unsupported pseudo-class :${u}()`,b.NOT_SUPPORTED_ERR);break}default:if(!p)throw new DOMException(`Unknown pseudo-class :${u}()`,b.SYNTAX_ERR)}}else{const{document:l,root:n}=this.#t,{documentElement:f}=l,r=new URL(l.URL);switch(u){case"any-link":case"link":{M.test(c)&&e.hasAttribute("href")&&t.add(e);break}case"local-link":{if(M.test(c)&&e.hasAttribute("href")){const s=new URL(e.getAttribute("href"),r.href);s.origin===r.origin&&s.pathname===r.pathname&&t.add(e)}break}case"visited":break;case"target":{(0,k.isSameOrDescendant)(e)&&r.hash&&e.id&&r.hash===`#${e.id}`&&t.add(e);break}case"target-within":{if(r.hash){const s=r.hash.replace(/^#/,"");let i=l.getElementById(s);for(;i;){if(i===e){t.add(e);break}i=i.parentNode}}break}case"scope":{this.#e.nodeType===b.ELEMENT_NODE?e===this.#e&&t.add(e):e===f&&t.add(e);break}case"focus":{e===l.activeElement&&t.add(e);break}case"focus-within":{let s=l.activeElement;for(;s;){if(s===e){t.add(e);break}s=s.parentNode}break}case"open":{B.test(c)&&e.hasAttribute("open")&&t.add(e);break}case"closed":{B.test(c)&&!e.hasAttribute("open")&&t.add(e);break}case"disabled":{if(U.test(c)||(0,D.default)(c))if(e.disabled||e.hasAttribute("disabled"))t.add(e);else{let s=d;for(;s&&s.localName!=="fieldset";)s=s.parentNode;s&&s.hasAttribute("disabled")&&d.localName!=="legend"&&t.add(e)}break}case"enabled":{(U.test(c)||(0,D.default)(c))&&!(e.disabled&&e.hasAttribute("disabled"))&&t.add(e);break}case"read-only":{switch(c){case"textarea":{(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}case"input":{(!e.type||x.test(e.type)||I.test(e.type))&&(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}default:(0,k.isContentEditable)(e)||t.add(e)}break}case"read-write":{switch(c){case"textarea":{e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled")||t.add(e);break}case"input":{(!e.type||x.test(e.type)||I.test(e.type))&&!(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}default:(0,k.isContentEditable)(e)&&t.add(e)}break}case"placeholder-shown":{let s;c==="textarea"?s=e:c==="input"&&(e.hasAttribute("type")?x.test(e.getAttribute("type"))&&(s=e):s=e),s&&e.hasAttribute("placeholder")&&e.getAttribute("placeholder").trim().length&&e.value===""&&t.add(e);break}case"checked":{(c==="input"&&e.hasAttribute("type")&&O.test(e.getAttribute("type"))&&e.checked||c==="option"&&e.selected)&&t.add(e);break}case"indeterminate":{if(c==="input"&&e.type==="checkbox"&&e.indeterminate||c==="progress"&&!e.hasAttribute("value"))t.add(e);else if(c==="input"&&e.type==="radio"&&!e.hasAttribute("checked")){const s=e.name;let i=e.parentNode;for(;i&&i.localName!=="form";)i=i.parentNode;i||(i=f);const m=[...i.getElementsByTagName("input")];let N;for(const w of m)if(w.getAttribute("type")==="radio"&&(s?w.getAttribute("name")===s&&(N=!!w.checked):w.hasAttribute("name")||(N=!!w.checked),N))break;N||t.add(e)}break}case"default":{if(c==="button"&&!(e.hasAttribute("type")&&F.test(e.getAttribute("type")))||c==="input"&&e.hasAttribute("type")&&V.test(e.getAttribute("type"))){let s=e.parentNode;for(;s&&s.localName!=="form";)s=s.parentNode;if(s){const i=l.createNodeIterator(s,b.SHOW_ELEMENT);let m=i.nextNode();for(;m;){const N=m.localName;let w;if(N==="button"?w=!(m.hasAttribute("type")&&F.test(m.getAttribute("type"))):N==="input"&&(w=m.hasAttribute("type")&&V.test(m.getAttribute("type"))),w){m===e&&t.add(e);break}m=i.nextNode()}}}else if(c==="input"&&e.hasAttribute("type")&&O.test(e.getAttribute("type"))&&(e.checked||e.hasAttribute("checked")))t.add(e);else if(c==="option"){let s=!1,i=d;for(;i&&i.localName!=="datalist";){if(i.localName==="select"){(i.multiple||i.hasAttribute("multiple"))&&(s=!0);break}i=i.parentNode}if(s)(e.selected||e.hasAttribute("selected"))&&t.add(e);else{const m=d.firstElementChild,N=new Set;let w=m;for(;w;){if(w.selected||w.hasAttribute("selected")){N.add(w);break}w=w.nextElementSibling}N.size||N.add(m),N.has(e)&&t.add(e)}}break}case"valid":{if(C.test(c))e.checkValidity()&&t.add(e);else if(/^fieldset$/.test(c)){const s=l.createNodeIterator(e,b.SHOW_ELEMENT);let i=s.nextNode();i===e&&(i=s.nextNode());let m;for(;i&&!(C.test(i.localName)&&(m=i.checkValidity(),!m));)i=s.nextNode();m&&t.add(e)}break}case"invalid":{if(C.test(c))e.checkValidity()||t.add(e);else if(/^fieldset$/.test(c)){const s=l.createNodeIterator(e,b.SHOW_ELEMENT);let i=s.nextNode();i===e&&(i=s.nextNode());let m;for(;i&&!(C.test(i.localName)&&(m=i.checkValidity(),!m));)i=s.nextNode();m||t.add(e)}break}case"in-range":{c==="input"&&!(e.readonly||e.hasAttribute("readonly"))&&!(e.disabled||e.hasAttribute("disabled"))&&e.hasAttribute("type")&&z.test(e.getAttribute("type"))&&!(e.validity.rangeUnderflow||e.validity.rangeOverflow)&&(e.hasAttribute("min")||e.hasAttribute("max")||e.getAttribute("type")==="range")&&t.add(e);break}case"out-of-range":{c==="input"&&!(e.readonly||e.hasAttribute("readonly"))&&!(e.disabled||e.hasAttribute("disabled"))&&e.hasAttribute("type")&&z.test(e.getAttribute("type"))&&(e.validity.rangeUnderflow||e.validity.rangeOverflow)&&t.add(e);break}case"required":{let s;if(/^(?:select|textarea)$/.test(c))s=e;else if(c==="input")if(e.hasAttribute("type")){const i=e.getAttribute("type");(x.test(i)||O.test(i)||I.test(i)||i==="file")&&(s=e)}else s=e;s&&(e.required||e.hasAttribute("required"))&&t.add(e);break}case"optional":{let s;if(/^(?:select|textarea)$/.test(c))s=e;else if(c==="input")if(e.hasAttribute("type")){const i=e.getAttribute("type");(x.test(i)||O.test(i)||I.test(i)||i==="file")&&(s=e)}else s=e;s&&!(e.required||e.hasAttribute("required"))&&t.add(e);break}case"root":{e===f&&t.add(e);break}case"empty":{if(e.hasChildNodes()){const s=e.childNodes.values();let i;for(const m of s)if(i=m.nodeType!==b.ELEMENT_NODE&&m.nodeType!==b.TEXT_NODE,!i)break;i&&t.add(e)}else t.add(e);break}case"first-child":{(d&&e===d.firstElementChild||n.nodeType===b.ELEMENT_NODE&&e===n)&&t.add(e);break}case"last-child":{(d&&e===d.lastElementChild||n.nodeType===b.ELEMENT_NODE&&e===n)&&t.add(e);break}case"only-child":{(d&&e===d.firstElementChild&&e===d.lastElementChild||n.nodeType===b.ELEMENT_NODE&&e===n)&&t.add(e);break}case"first-of-type":{if(d){const[s]=this._collectNthOfType({a:0,b:1},e);s&&t.add(s)}else n.nodeType===b.ELEMENT_NODE&&e===n&&t.add(e);break}case"last-of-type":{if(d){const[s]=this._collectNthOfType({a:0,b:1,reverse:!0},e);s&&t.add(s)}else n.nodeType===b.ELEMENT_NODE&&e===n&&t.add(e);break}case"only-of-type":{if(d){const[s]=this._collectNthOfType({a:0,b:1},e);if(s===e){const[i]=this._collectNthOfType({a:0,b:1,reverse:!0},e);i===e&&t.add(e)}}else n.nodeType===b.ELEMENT_NODE&&e===n&&t.add(e);break}case"after":case"before":case"first-letter":case"first-line":{if(this.#i)throw new DOMException(`Unsupported pseudo-element ::${u}`,b.NOT_SUPPORTED_ERR);break}case"active":case"autofill":case"blank":case"buffering":case"current":case"focus-visible":case"fullscreen":case"future":case"hover":case"modal":case"muted":case"past":case"paused":case"picture-in-picture":case"playing":case"seeking":case"stalled":case"user-invalid":case"user-valid":case"volume-locked":case"-webkit-autofill":{if(this.#i)throw new DOMException(`Unsupported pseudo-class :${u}`,b.NOT_SUPPORTED_ERR);break}default:if(u.startsWith("-webkit-")){if(this.#i)throw new DOMException(`Unsupported pseudo-class :${u}`,b.NOT_SUPPORTED_ERR)}else if(!p)throw new DOMException(`Unknown pseudo-class :${u}`,b.SYNTAX_ERR)}}return t}_matchAttributeSelector(a,e){const{flags:o,matcher:h,name:c,value:d}=a;if(typeof o=="string"&&!/^[is]$/i.test(o))throw new DOMException("Invalid attribute selector",b.SYNTAX_ERR);const{attributes:p}=e;let u;if(p&&p.length){const{document:t}=this.#t;let l;t.contentType==="text/html"?typeof o=="string"&&/^s$/i.test(o)?l=!1:l=!0:typeof o=="string"&&/^i$/i.test(o)?l=!0:l=!1;let{name:n}=c;n=(0,g.unescapeSelector)(n),l&&(n=n.toLowerCase());const f=new Set;if(/\|/.test(n)){const{prefix:r,tagName:s}=(0,k.selectorToNodeProps)(n);for(let{name:i,value:m}of p)switch(l&&(i=i.toLowerCase(),m=m.toLowerCase()),r){case"":{s===i&&f.add(m);break}case"*":{/:/.test(i)?i.endsWith(`:${s}`)&&f.add(m):s===i&&f.add(m);break}default:if(/:/.test(i)){const[N,w]=i.split(":");r===N&&s===w&&(0,k.isNamespaceDeclared)(r,e)&&f.add(m)}}}else for(let{name:r,value:s}of p)if(l&&(r=r.toLowerCase(),s=s.toLowerCase()),/:/.test(r)){const[i,m]=r.split(":");if(i==="xml"&&m==="lang")continue;n===m&&f.add(s)}else n===r&&f.add(s);if(f.size){const{name:r,value:s}=d||{};let i;switch(r?l?i=r.toLowerCase():i=r:s?l?i=s.toLowerCase():i=s:s===""&&(i=s),h){case"=":{typeof i=="string"&&f.has(i)&&(u=e);break}case"~=":{if(i&&typeof i=="string"){for(const m of f)if(new Set(m.split(/\s+/)).has(i)){u=e;break}}break}case"|=":{if(i&&typeof i=="string"){let m;for(const N of f)if(N===i||N.startsWith(`${i}-`)){m=N;break}m&&(u=e)}break}case"^=":{if(i&&typeof i=="string"){let m;for(const N of f)if(N.startsWith(`${i}`)){m=N;break}m&&(u=e)}break}case"$=":{if(i&&typeof i=="string"){let m;for(const N of f)if(N.endsWith(`${i}`)){m=N;break}m&&(u=e)}break}case"*=":{if(i&&typeof i=="string"){let m;for(const N of f)if(N.includes(`${i}`)){m=N;break}m&&(u=e)}break}case null:default:u=e}}}return u??null}_matchClassSelector(a,e){const o=(0,g.unescapeSelector)(a.name);let h;return e.classList.contains(o)&&(h=e),h??null}_matchIDSelector(a,e){const{id:o}=e,h=(0,g.unescapeSelector)(a.name);let c;return h===o&&(c=e),c??null}_matchTypeSelector(a,e){const o=(0,g.unescapeSelector)(a.name),{localName:h,prefix:c}=e,{document:d}=this.#t;let{prefix:p,tagName:u}=(0,k.selectorToNodeProps)(o,e);d.contentType==="text/html"&&(p=p.toLowerCase(),u=u.toLowerCase());let t,l;/:/.test(h)?[t,l]=h.split(":"):(t=c||"",l=h);let n;return p===""&&t===""?e.namespaceURI===null&&(u==="*"||u===l)&&(n=e):p==="*"?(u==="*"||u===l)&&(n=e):p===t&&(0,k.isNamespaceDeclared)(p,e)&&(u==="*"||u===l)&&(n=e),n??null}_matchSelector(a,e,o){const{type:h}=a;let c=new Set;if(e.nodeType===b.ELEMENT_NODE)switch(h){case b.ATTRIBUTE_SELECTOR:{const d=this._matchAttributeSelector(a,e);d&&c.add(d);break}case b.CLASS_SELECTOR:{const d=this._matchClassSelector(a,e);d&&c.add(d);break}case b.ID_SELECTOR:{const d=this._matchIDSelector(a,e);d&&c.add(d);break}case b.PSEUDO_CLASS_SELECTOR:{const d=this._matchPseudoClassSelector(a,e,o);d.size&&(c=d);break}case b.PSEUDO_ELEMENT_SELECTOR:{const d=(0,g.unescapeSelector)(a.name);this._matchPseudoElementSelector(d,o);break}case b.TYPE_SELECTOR:default:{const d=this._matchTypeSelector(a,e);d&&c.add(d)}}return c}_matchLeaves(a,e,o){let h;for(const c of a)if(h=this._matchSelector(c,e,o).has(e),!h)break;return!!h}_findDescendantNodes(a,e){const[o,...h]=a,{type:c}=o,d=(0,g.unescapeSelector)(o.name),p=h.length>0,u=new Set;let t=!1;switch(c){case b.ID_SELECTOR:{const{root:l}=this.#t;if(l.nodeType===b.ELEMENT_NODE)t=!0;else{const n=l.getElementById(d);if(n&&n!==e){const f=(0,k.isSameOrDescendant)(n,e);let r;f&&(r=n),r&&(p?this._matchLeaves(h,r)&&u.add(r):u.add(r))}}break}case b.PSEUDO_ELEMENT_SELECTOR:{this._matchPseudoElementSelector(d);break}default:t=!0}return{nodes:u,pending:t}}_matchCombinator(a,e,o={}){const{combo:h,leaves:c}=a,{name:d}=h,{find:p,forgive:u}=o;let t=new Set;if(p==="next")switch(d){case"+":{const l=e.nextElementSibling;l&&this._matchLeaves(c,l,{forgive:u})&&t.add(l);break}case"~":{let l=e.nextElementSibling;for(;l;)this._matchLeaves(c,l,{forgive:u})&&t.add(l),l=l.nextElementSibling;break}case">":{const l=[...e.children];for(const n of l)this._matchLeaves(c,n,{forgive:u})&&t.add(n);break}case" ":default:{const{nodes:l,pending:n}=this._findDescendantNodes(c,e);if(l.size)t=l;else if(n){const{document:f}=this.#t,r=f.createNodeIterator(e,b.SHOW_ELEMENT);let s=r.nextNode();for(s===e&&(s=r.nextNode());s;)this._matchLeaves(c,s,{forgive:u})&&t.add(s),s=r.nextNode()}}}else switch(d){case"+":{const l=e.previousElementSibling;l&&this._matchLeaves(c,l,{forgive:u})&&t.add(l);break}case"~":{const l=[];let n=e.previousElementSibling;for(;n;)this._matchLeaves(c,n,{forgive:u})&&l.push(n),n=n.previousElementSibling;l.length&&(t=new Set(l.reverse()));break}case">":{const l=e.parentNode;l&&this._matchLeaves(c,l,{forgive:u})&&t.add(l);break}case" ":default:{const l=[];let n=e.parentNode;for(;n;)this._matchLeaves(c,n,{forgive:u})&&l.push(n),n=n.parentNode;l.length&&(t=new Set(l.reverse()))}}return t}_findNodes(a,e){const{leaves:[o,...h]}=a,{type:c}=o,d=(0,g.unescapeSelector)(o.name),p=h.length>0,{document:u,root:t}=this.#t;let l=new Set,n=!1;switch(c){case b.ID_SELECTOR:{let f;if(e===S)this._matchLeaves([o],this.#e)&&(f=this.#e);else if(e===v){let r=this.#e;for(;r;){if(this._matchLeaves([o],r)){f=r;break}r=r.parentNode}}else t.nodeType===b.ELEMENT_NODE?n=!0:f=t.getElementById(d);f&&(p?this._matchLeaves(h,f)&&l.add(f):l.add(f));break}case b.CLASS_SELECTOR:{const f=[];if(e===S)this.#e.nodeType===b.ELEMENT_NODE&&this.#e.classList.contains(d)&&f.push(this.#e);else if(e===v){let r=this.#e;for(;r&&r.nodeType===b.ELEMENT_NODE;)r.classList.contains(d)&&f.push(r),r=r.parentNode}else if(t.nodeType===b.DOCUMENT_FRAGMENT_NODE){const r=[...t.children];for(const s of r){s.classList.contains(d)&&f.push(s);const i=[...s.getElementsByClassName(d)];f.push(...i)}}else{const r=[...t.getElementsByClassName(d)];f.push(...r)}if(f.length)if(p)for(const r of f)this._matchLeaves(h,r)&&l.add(r);else l=new Set(f);break}case b.TYPE_SELECTOR:{const f=[];if(e===S)this.#e.nodeType===b.ELEMENT_NODE&&this._matchLeaves([o],this.#e)&&f.push(this.#e);else if(e===v){let r=this.#e;for(;r&&r.nodeType===b.ELEMENT_NODE;)this._matchLeaves([o],r)&&f.push(r),r=r.parentNode}else if(u.contentType!=="text/html"||/[*|]/.test(d))n=!0;else if(t.nodeType===b.DOCUMENT_FRAGMENT_NODE){const r=d.toLowerCase(),s=[...t.children];for(const i of s){i.localName===r&&f.push(i);const m=[...i.getElementsByTagName(d)];f.push(...m)}}else{const r=[...t.getElementsByTagName(d)];f.push(...r)}if(f.length)if(p)for(const r of f)this._matchLeaves(h,r)&&l.add(r);else l=new Set(f);break}case b.PSEUDO_ELEMENT_SELECTOR:{this._matchPseudoElementSelector(d);break}default:{const f=[];if(e===S)this._matchLeaves([o],this.#e)&&f.push(this.#e);else if(e===v){let r=this.#e;for(;r;)this._matchLeaves([o],r)&&f.push(r),r=r.parentNode}else n=!0;if(f.length)if(p)for(const r of f)this._matchLeaves(h,r)&&l.add(r);else l=new Set(f)}}return{nodes:l,pending:n}}_getFirstTwig(a){const e=a.length-1,o=a[0];let h,c;if(e){const d=a[e],{leaves:[{type:p}]}=d;p===b.PSEUDO_ELEMENT_SELECTOR||p===b.ID_SELECTOR?(h="prev",c=d):(h="next",c=o)}else h="prev",c=o;return{find:h,twig:c}}_collectNodes(a){const e=this.#s.values();if(a===$||a===T){const o=new Set;let h=0;for(const{branch:c}of e){const{find:d,twig:p}=this._getFirstTwig(c),{nodes:u,pending:t}=this._findNodes(p,a);u.size?this.#r[h]=u:t?o.add(new Map([["index",h],["twig",p]])):this.#s[h].skip=!0,this.#s[h].find=d,h++}if(o.size){const{document:c,root:d}=this.#t,p=c.createNodeIterator(d,b.SHOW_ELEMENT);let u=p.nextNode();for(;u;){let t=!1;if(this.#e.nodeType===b.ELEMENT_NODE?t=(0,k.isSameOrDescendant)(u,this.#e):t=!0,t)for(const l of o){const{leaves:n}=l.get("twig");if(this._matchLeaves(n,u)){const r=l.get("index");this.#r[r].add(u)}}u=p.nextNode()}}}else{let o=0;for(const{branch:h}of e){const c=h[h.length-1],{nodes:d}=this._findNodes(c,a);d.size?this.#r[o]=d:this.#s[o].skip=!0,this.#s[o].find="prev",o++}}return[this.#s,this.#r]}_matchNodes(a){const[...e]=this.#s,o=e.length;let h=new Set;for(let c=0;c<o;c++){const{branch:d,find:p,skip:u}=e[c],t=d.length;if(!u&&t){const l=this.#r[c],n=t-1;if(n===0)if((a===$||a===T)&&this.#e.nodeType===b.ELEMENT_NODE){for(const f of l)if(f!==this.#e&&(0,k.isSameOrDescendant)(f,this.#e)&&(h.add(f),a===T))break}else if(a===T){const[f]=[...l];h.add(f)}else{const f=[...h],r=[...l];h=new Set([...f,...r])}else if(p==="next"){let{combo:f}=d[0];for(const r of l){let s=new Set([r]);for(let i=1;i<t;i++){const{combo:m,leaves:N}=d[i],w=[];for(const _ of s){const A={combo:f,leaves:N},P=this._matchCombinator(A,_,{find:p});P.size&&w.push(...P)}const E=new Set(w);if(E.size)if(i===n){if(a===T){const[_]=[...E];h.add(_)}else{const _=[...h],A=[...E];h=new Set([..._,...A])}break}else f=m,s=E;else break}}}else for(const f of l){let r=new Set([f]),s;for(let i=n-1;i>=0;i--){const m=d[i],N=[];for(const E of r){const _=this._matchCombinator(m,E,{find:p});_.size&&N.push(..._)}const w=new Set(N);if(w.size)if(s=!0,i===0){h.add(f);break}else r=w;else{s=!1;break}}if(s&&a!==$)break}}}return h}_find(a){return this._collectNodes(a),this._matchNodes(a)}_sortNodes(a){const e=[...a];return e.length>1&&e.sort((o,h)=>{let c;const d=o.compareDocumentPosition(h);return d&b.DOCUMENT_POSITION_PRECEDING||d&b.DOCUMENT_POSITION_CONTAINS?c=1:c=-1,c}),e}matches(){if(this.#e.nodeType!==b.ELEMENT_NODE)throw new TypeError(`Unexpected node ${this.#e.nodeName}`);let a;try{a=this._find(S).has(this.#e)}catch(e){this._onError(e)}return!!a}closest(){if(this.#e.nodeType!==b.ELEMENT_NODE)throw new TypeError(`Unexpected node ${this.#e.nodeName}`);let a;try{const e=this._find(v);let o=this.#e;for(;o;){if(e.has(o)){a=o;break}o=o.parentNode}}catch(e){this._onError(e)}return a??null}querySelector(){let a;try{const e=this._find(T);e.delete(this.#e),e.size>1?[a]=this._sortNodes(e):e.size&&([a]=[...e])}catch(e){this._onError(e)}return a??null}querySelectorAll(){const a=[];try{const e=this._find($);e.delete(this.#e),e.size>1&&this.#c?a.push(...this._sortNodes(e)):e.size&&a.push(...e)}catch(e){this._onError(e)}return a}}0&&(module.exports={Matcher});
|
|
1
|
+
var G=Object.create;var $=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var K=(_,a)=>{for(var e in a)$(_,e,{get:a[e],enumerable:!0})},U=(_,a,e,c)=>{if(a&&typeof a=="object"||typeof a=="function")for(let h of q(a))!X.call(_,h)&&h!==e&&$(_,h,{get:()=>a[h],enumerable:!(c=W(a,h))||c.enumerable});return _};var Z=(_,a,e)=>(e=_!=null?G(Y(_)):{},U(a||!_||!_.__esModule?$(e,"default",{value:_,enumerable:!0}):e,_)),J=_=>U($({},"__esModule",{value:!0}),_);var ie={};K(ie,{Matcher:()=>se});module.exports=J(ie);var R=Z(require("is-potential-custom-element-name"),1),k=require("./dom-util.js"),g=require("./parser.js"),b=require("./constant.js");const P="[A-Z\\d]+",T=`(?:-${P})*`,C="all",v="first",x="lineal",S="self",B=/^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/,O=/^(?:(?:(?:in|out)pu|selec)t|button|form|textarea)$/,z=/^a(?:rea)?$/,F=/^d(?:etails|ialog)$/,I=/^(?:checkbox|radio)$/,L=/^(?:(?:emai|te|ur)l|number|password|search|text)$/,V=/(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/,j=/^(?:button|reset)$/,H=/^(?:image|submit)$/,D=/^(?:date(?:time-local)?|month|time|week)$/,Q=/^(?:(?:ha|i)s|not|where)$/,ee=/^nth-(?:last-)?(?:child|of-type)$/,te=new RegExp(`^(?:\\*-)?${P}${T}$`,"i");class se{#s;#l;#a;#e;#r;#t;#o;#c;#i;constructor(a,e,c={}){const{sort:h,warn:o}=c;this.#l=new Map([[b.PSEUDO_ELEMENT_SELECTOR,b.BIT_1],[b.ID_SELECTOR,b.BIT_10],[b.CLASS_SELECTOR,b.BIT_100],[b.TYPE_SELECTOR,b.BIT_1000],[b.ATTRIBUTE_SELECTOR,b.BIT_10000],[b.PSEUDO_CLASS_SELECTOR,b.BIT_100000]]),this.#a=new WeakMap,this.#o=a,this.#e=e,this.#c=!!h,this.#i=!!o,[this.#s,this.#r]=this._prepare(a),this.#t=this._getRoot(e)}_onError(a){if(a instanceof DOMException&&a.name===b.NOT_SUPPORTED_ERR)this.#i&&console.warn(a.message);else throw a}_getRoot(a=this.#e){let e,c;switch(a.nodeType){case b.DOCUMENT_NODE:{e=a,c=a;break}case b.DOCUMENT_FRAGMENT_NODE:{e=a.ownerDocument,c=a;break}case b.ELEMENT_NODE:{if((0,k.isSameOrDescendant)(a))e=a.ownerDocument,c=a.ownerDocument;else{let h=a;for(;h&&h.parentNode;)h=h.parentNode;e=h.ownerDocument,c=h}break}default:throw new TypeError(`Unexpected node ${a.nodeName}`)}return{document:e,root:c}}_sortLeaves(a){const e=[...a];return e.length>1&&e.sort((c,h)=>{const{type:o}=c,{type:d}=h,p=this.#l.get(o),u=this.#l.get(d);let t;return p===u?t=0:p>u?t=1:t=-1,t}),e}_prepare(a=this.#o){const e=(0,g.parseSelector)(a),c=(0,g.walkAST)(e),h=[],o=[];let d=0;for(const[...p]of c){const u=[];let t=p.shift();if(t&&t.type!==b.COMBINATOR){const l=new Set;for(;t;){if(t.type===b.COMBINATOR){const[f]=p;if(f.type===b.COMBINATOR){const n=`Invalid combinator ${t.name}${f.name}`;throw new DOMException(n,b.SYNTAX_ERR)}u.push({combo:t,leaves:this._sortLeaves(l)}),l.clear()}else t&&l.add(t);if(p.length)t=p.shift();else{u.push({combo:null,leaves:this._sortLeaves(l)}),l.clear();break}}}h.push({branch:u,find:null,skip:!1}),o[d]=new Set,d++}return[h,o]}_collectNthChild(a,e){const{a:c,b:h,reverse:o,selector:d}=a,{parentNode:p}=e,u=new Set;let t;if(d&&(this.#a.has(d)?t=this.#a.get(d):(t=(0,g.walkAST)(d),this.#a.set(d,t))),p){const l=[...p.children],f=l.length;if(f){const n=new Set;if(t){const s=t.length;for(const i of l){let r;for(let m=0;m<s;m++){const N=t[m];if(r=this._matchLeaves(N,i),!r)break}r&&n.add(i)}}if(o&&l.reverse(),c===0){if(h>0&&h<=f){if(n.size)for(let s=0;s<f;s++){const i=l[s];if(n.has(i)){u.add(i);break}}else if(!d){const s=l[h-1];u.add(s)}}}else{let s=h-1;if(c>0)for(;s<0;)s+=c;if(s>=0&&s<f){let i=c>0?0:h-1;for(let r=0;r<f&&s>=0&&s<f;r++){const m=l[r];n.size?n.has(m)&&(i===s&&(u.add(m),s+=c),c>0?i++:i--):r===s&&(d||u.add(m),s+=c)}}}}}else{const{root:l}=this.#t;if(l.nodeType===b.ELEMENT_NODE&&e===l&&c+h===1)if(t){const f=t.length;let n;for(let s=0;s<f;s++){const i=t[s];if(n=this._matchLeaves(i,e),n)break}n&&u.add(e)}else u.add(e)}return u}_collectNthOfType(a,e){const{a:c,b:h,reverse:o}=a,{localName:d,parentNode:p,prefix:u}=e,t=new Set;if(p){const l=[...p.children],f=l.length;if(f)if(o&&l.reverse(),c===0){if(h>0&&h<=f){let n=0;for(let s=0;s<f;s++){const i=l[s],{localName:r,prefix:m}=i;if(r===d&&m===u){if(n===h-1){t.add(i);break}n++}}}}else{let n=h-1;if(c>0)for(;n<0;)n+=c;if(n>=0&&n<f){let s=c>0?0:h-1;for(let i=0;i<f;i++){const r=l[i],{localName:m,prefix:N}=r;if(m===d&&N===u){if(s===n&&(t.add(r),n+=c),n<0||n>=f)break;c>0?s++:s--}}}}}else{const{root:l}=this.#t;l.nodeType===b.ELEMENT_NODE&&e===l&&c+h===1&&t.add(e)}return t}_matchAnPlusB(a,e,c){const{nth:{a:h,b:o,name:d},selector:p}=a,u=(0,g.unescapeSelector)(d),t=new Map;u?(u==="even"?(t.set("a",2),t.set("b",0)):u==="odd"&&(t.set("a",2),t.set("b",1)),/last/.test(c)&&t.set("reverse",!0)):(typeof h=="string"&&/-?\d+/.test(h)?t.set("a",h*1):t.set("a",0),typeof o=="string"&&/-?\d+/.test(o)?t.set("b",o*1):t.set("b",0),/last/.test(c)&&t.set("reverse",!0));let l=new Set;if(t.has("a")&&t.has("b")){if(/^nth-(?:last-)?child$/.test(c)){p&&t.set("selector",p);const f=Object.fromEntries(t),n=this._collectNthChild(f,e);n.size&&(l=n)}else if(/^nth-(?:last-)?of-type$/.test(c)){const f=Object.fromEntries(t),n=this._collectNthOfType(f,e);n.size&&(l=n)}}return l}_matchPseudoElementSelector(a,e={}){const{forgive:c}=e;switch(a){case"after":case"backdrop":case"before":case"cue":case"cue-region":case"first-letter":case"first-line":case"file-selector-button":case"marker":case"part":case"placeholder":case"selection":case"slotted":case"target-text":{if(this.#i)throw new DOMException(`Unsupported pseudo-element ::${a}`,b.NOT_SUPPORTED_ERR);break}default:if(a.startsWith("-webkit-")){if(this.#i)throw new DOMException(`Unsupported pseudo-element ::${a}`,b.NOT_SUPPORTED_ERR)}else if(!c)throw new DOMException(`Unknown pseudo-element ::${a}`,b.SYNTAX_ERR)}}_matchDirectionPseudoClass(a,e){const c=(0,g.unescapeSelector)(a.name),h=(0,k.getDirectionality)(e);let o;return c===h&&(o=e),o??null}_matchLanguagePseudoClass(a,e){const c=(0,g.unescapeSelector)(a.name);let h;if(c){if(c==="*")if(e.hasAttribute("lang"))e.getAttribute("lang")&&(h=e);else{let o=e.parentNode;for(;o;){if(o.hasAttribute("lang")){o.getAttribute("lang")&&(h=e);break}o=o.parentNode}}else if(te.test(c)){let o;if(/-/.test(c)){const[d,p,...u]=c.split("-");let t;d==="*"?t=`${P}${T}`:t=`${d}${T}`;const l=`-${p}${T}`,f=u.length;let n="";if(f)for(let s=0;s<f;s++)n+=`-${u[s]}${T}`;o=new RegExp(`^${t}${l}${n}$`,"i")}else o=new RegExp(`^${c}${T}$`,"i");if(e.hasAttribute("lang"))o.test(e.getAttribute("lang"))&&(h=e);else{let d=e.parentNode;for(;d;){if(d.hasAttribute("lang")){const p=d.getAttribute("lang");o.test(p)&&(h=e);break}d=d.parentNode}}}}return h??null}_matchHasPseudoFunc(a,e){let c;if(Array.isArray(a)&&a.length){const[h]=a,{type:o}=h;let d;o===b.COMBINATOR?d=a.shift():d={name:" ",type:b.COMBINATOR};const p=[];for(;a.length;){const[l]=a,{type:f}=l;if(f===b.COMBINATOR)break;p.push(a.shift())}const u={combo:d,leaves:p},t=this._matchCombinator(u,e,{find:"next"});if(t.size)if(a.length){for(const l of t)if(c=this._matchHasPseudoFunc(Object.assign([],a),l),c)break}else c=!0}return!!c}_matchLogicalPseudoFunc(a,e){const{astName:c="",branches:h=[],selector:o="",twigBranches:d=[]}=a;let p;if(c==="has")if(o.includes(":has("))p=null;else{let u;const t=h.length;for(let l=0;l<t;l++){const f=h[l];if(u=this._matchHasPseudoFunc(Object.assign([],f),e),u)break}u&&(p=e)}else{const u=/^(?:is|where)$/.test(c);let t;const l=d.length;for(let f=0;f<l;f++){const n=d[f],s=n.length-1,{leaves:i}=n[s];if(t=this._matchLeaves(i,e,{forgive:u}),t&&s>0){let r=new Set([e]);for(let m=s-1;m>=0;m--){const N=n[m],w=[];for(const y of r){const A=this._matchCombinator(N,y,{forgive:u,find:"prev"});A.size&&w.push(...A)}const E=new Set(w);if(E.size)if(m===0){t=!0;break}else r=E;else{t=!1;break}}}if(t)break}c==="not"?t||(p=e):t&&(p=e)}return p??null}_matchPseudoClassSelector(a,e,c={}){const{children:h}=a,{localName:o,parentNode:d}=e,{forgive:p}=c,u=(0,g.unescapeSelector)(a.name);let t=new Set;if(Q.test(u)){let l;if(this.#a.has(a))l=this.#a.get(a);else{const n=(0,g.walkAST)(a),s=[],i=[];for(const[...r]of n){for(const E of r){const y=(0,g.generateCSS)(E);s.push(y)}const m=[],N=new Set;let w=r.shift();for(;w;)if(w.type===b.COMBINATOR?(m.push({combo:w,leaves:[...N]}),N.clear()):w&&N.add(w),r.length)w=r.shift();else{m.push({combo:null,leaves:[...N]}),N.clear();break}i.push(m)}l={astName:u,branches:n,twigBranches:i,selector:s.join(",")},this.#a.set(a,l)}const f=this._matchLogicalPseudoFunc(l,e);f&&t.add(f)}else if(Array.isArray(h)){const[l]=h;if(ee.test(u)){const f=this._matchAnPlusB(l,e,u);f.size&&(t=f)}else if(u==="dir"){const f=this._matchDirectionPseudoClass(l,e);f&&t.add(f)}else if(u==="lang"){const f=this._matchLanguagePseudoClass(l,e);f&&t.add(f)}else switch(u){case"current":case"nth-col":case"nth-last-col":{if(this.#i)throw new DOMException(`Unsupported pseudo-class :${u}()`,b.NOT_SUPPORTED_ERR);break}default:if(!p)throw new DOMException(`Unknown pseudo-class :${u}()`,b.SYNTAX_ERR)}}else{const{document:l,root:f}=this.#t,{documentElement:n}=l,s=new URL(l.URL);switch(u){case"any-link":case"link":{z.test(o)&&e.hasAttribute("href")&&t.add(e);break}case"local-link":{if(z.test(o)&&e.hasAttribute("href")){const i=new URL(e.getAttribute("href"),s.href);i.origin===s.origin&&i.pathname===s.pathname&&t.add(e)}break}case"visited":break;case"target":{(0,k.isSameOrDescendant)(e)&&s.hash&&e.id&&s.hash===`#${e.id}`&&t.add(e);break}case"target-within":{if(s.hash){const i=s.hash.replace(/^#/,"");let r=l.getElementById(i);for(;r;){if(r===e){t.add(e);break}r=r.parentNode}}break}case"scope":{this.#e.nodeType===b.ELEMENT_NODE?e===this.#e&&t.add(e):e===n&&t.add(e);break}case"focus":{e===l.activeElement&&t.add(e);break}case"focus-within":{let i=l.activeElement;for(;i;){if(i===e){t.add(e);break}i=i.parentNode}break}case"open":{F.test(o)&&e.hasAttribute("open")&&t.add(e);break}case"closed":{F.test(o)&&!e.hasAttribute("open")&&t.add(e);break}case"disabled":{if(B.test(o)||(0,R.default)(o))if(e.disabled||e.hasAttribute("disabled"))t.add(e);else{let i=d;for(;i&&i.localName!=="fieldset";)i=i.parentNode;i&&i.hasAttribute("disabled")&&d.localName!=="legend"&&t.add(e)}break}case"enabled":{(B.test(o)||(0,R.default)(o))&&!(e.disabled&&e.hasAttribute("disabled"))&&t.add(e);break}case"read-only":{switch(o){case"textarea":{(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}case"input":{(!e.type||L.test(e.type)||D.test(e.type))&&(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}default:(0,k.isContentEditable)(e)||t.add(e)}break}case"read-write":{switch(o){case"textarea":{e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled")||t.add(e);break}case"input":{(!e.type||L.test(e.type)||D.test(e.type))&&!(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}default:(0,k.isContentEditable)(e)&&t.add(e)}break}case"placeholder-shown":{let i;o==="textarea"?i=e:o==="input"&&(e.hasAttribute("type")?L.test(e.getAttribute("type"))&&(i=e):i=e),i&&e.hasAttribute("placeholder")&&e.getAttribute("placeholder").trim().length&&e.value===""&&t.add(e);break}case"checked":{(o==="input"&&e.hasAttribute("type")&&I.test(e.getAttribute("type"))&&e.checked||o==="option"&&e.selected)&&t.add(e);break}case"indeterminate":{if(o==="input"&&e.type==="checkbox"&&e.indeterminate||o==="progress"&&!e.hasAttribute("value"))t.add(e);else if(o==="input"&&e.type==="radio"&&!e.hasAttribute("checked")){const i=e.name;let r=e.parentNode;for(;r&&r.localName!=="form";)r=r.parentNode;r||(r=n);const m=[...r.getElementsByTagName("input")];let N;for(const w of m)if(w.getAttribute("type")==="radio"&&(i?w.getAttribute("name")===i&&(N=!!w.checked):w.hasAttribute("name")||(N=!!w.checked),N))break;N||t.add(e)}break}case"default":{if(o==="button"&&!(e.hasAttribute("type")&&j.test(e.getAttribute("type")))||o==="input"&&e.hasAttribute("type")&&H.test(e.getAttribute("type"))){let i=e.parentNode;for(;i&&i.localName!=="form";)i=i.parentNode;if(i){const r=l.createNodeIterator(i,b.SHOW_ELEMENT);let m=r.nextNode();for(;m;){const N=m.localName;let w;if(N==="button"?w=!(m.hasAttribute("type")&&j.test(m.getAttribute("type"))):N==="input"&&(w=m.hasAttribute("type")&&H.test(m.getAttribute("type"))),w){m===e&&t.add(e);break}m=r.nextNode()}}}else if(o==="input"&&e.hasAttribute("type")&&I.test(e.getAttribute("type"))&&(e.checked||e.hasAttribute("checked")))t.add(e);else if(o==="option"){let i=!1,r=d;for(;r&&r.localName!=="datalist";){if(r.localName==="select"){(r.multiple||r.hasAttribute("multiple"))&&(i=!0);break}r=r.parentNode}if(i)(e.selected||e.hasAttribute("selected"))&&t.add(e);else{const m=d.firstElementChild,N=new Set;let w=m;for(;w;){if(w.selected||w.hasAttribute("selected")){N.add(w);break}w=w.nextElementSibling}N.size||N.add(m),N.has(e)&&t.add(e)}}break}case"valid":{if(O.test(o))e.checkValidity()&&t.add(e);else if(/^fieldset$/.test(o)){const i=l.createNodeIterator(e,b.SHOW_ELEMENT);let r=i.nextNode();r===e&&(r=i.nextNode());let m;for(;r&&!(O.test(r.localName)&&(m=r.checkValidity(),!m));)r=i.nextNode();m&&t.add(e)}break}case"invalid":{if(O.test(o))e.checkValidity()||t.add(e);else if(/^fieldset$/.test(o)){const i=l.createNodeIterator(e,b.SHOW_ELEMENT);let r=i.nextNode();r===e&&(r=i.nextNode());let m;for(;r&&!(O.test(r.localName)&&(m=r.checkValidity(),!m));)r=i.nextNode();m||t.add(e)}break}case"in-range":{o==="input"&&!(e.readonly||e.hasAttribute("readonly"))&&!(e.disabled||e.hasAttribute("disabled"))&&e.hasAttribute("type")&&V.test(e.getAttribute("type"))&&!(e.validity.rangeUnderflow||e.validity.rangeOverflow)&&(e.hasAttribute("min")||e.hasAttribute("max")||e.getAttribute("type")==="range")&&t.add(e);break}case"out-of-range":{o==="input"&&!(e.readonly||e.hasAttribute("readonly"))&&!(e.disabled||e.hasAttribute("disabled"))&&e.hasAttribute("type")&&V.test(e.getAttribute("type"))&&(e.validity.rangeUnderflow||e.validity.rangeOverflow)&&t.add(e);break}case"required":{let i;if(/^(?:select|textarea)$/.test(o))i=e;else if(o==="input")if(e.hasAttribute("type")){const r=e.getAttribute("type");(L.test(r)||I.test(r)||D.test(r)||r==="file")&&(i=e)}else i=e;i&&(e.required||e.hasAttribute("required"))&&t.add(e);break}case"optional":{let i;if(/^(?:select|textarea)$/.test(o))i=e;else if(o==="input")if(e.hasAttribute("type")){const r=e.getAttribute("type");(L.test(r)||I.test(r)||D.test(r)||r==="file")&&(i=e)}else i=e;i&&!(e.required||e.hasAttribute("required"))&&t.add(e);break}case"root":{e===n&&t.add(e);break}case"empty":{if(e.hasChildNodes()){const i=e.childNodes.values();let r;for(const m of i)if(r=m.nodeType!==b.ELEMENT_NODE&&m.nodeType!==b.TEXT_NODE,!r)break;r&&t.add(e)}else t.add(e);break}case"first-child":{(d&&e===d.firstElementChild||f.nodeType===b.ELEMENT_NODE&&e===f)&&t.add(e);break}case"last-child":{(d&&e===d.lastElementChild||f.nodeType===b.ELEMENT_NODE&&e===f)&&t.add(e);break}case"only-child":{(d&&e===d.firstElementChild&&e===d.lastElementChild||f.nodeType===b.ELEMENT_NODE&&e===f)&&t.add(e);break}case"first-of-type":{if(d){const[i]=this._collectNthOfType({a:0,b:1},e);i&&t.add(i)}else f.nodeType===b.ELEMENT_NODE&&e===f&&t.add(e);break}case"last-of-type":{if(d){const[i]=this._collectNthOfType({a:0,b:1,reverse:!0},e);i&&t.add(i)}else f.nodeType===b.ELEMENT_NODE&&e===f&&t.add(e);break}case"only-of-type":{if(d){const[i]=this._collectNthOfType({a:0,b:1},e);if(i===e){const[r]=this._collectNthOfType({a:0,b:1,reverse:!0},e);r===e&&t.add(e)}}else f.nodeType===b.ELEMENT_NODE&&e===f&&t.add(e);break}case"after":case"before":case"first-letter":case"first-line":{if(this.#i)throw new DOMException(`Unsupported pseudo-element ::${u}`,b.NOT_SUPPORTED_ERR);break}case"active":case"autofill":case"blank":case"buffering":case"current":case"focus-visible":case"fullscreen":case"future":case"hover":case"modal":case"muted":case"past":case"paused":case"picture-in-picture":case"playing":case"seeking":case"stalled":case"user-invalid":case"user-valid":case"volume-locked":case"-webkit-autofill":{if(this.#i)throw new DOMException(`Unsupported pseudo-class :${u}`,b.NOT_SUPPORTED_ERR);break}default:if(u.startsWith("-webkit-")){if(this.#i)throw new DOMException(`Unsupported pseudo-class :${u}`,b.NOT_SUPPORTED_ERR)}else if(!p)throw new DOMException(`Unknown pseudo-class :${u}`,b.SYNTAX_ERR)}}return t}_matchAttributeSelector(a,e){const{flags:c,matcher:h,name:o,value:d}=a;if(typeof c=="string"&&!/^[is]$/i.test(c))throw new DOMException("Invalid attribute selector",b.SYNTAX_ERR);const{attributes:p}=e;let u;if(p&&p.length){const{document:t}=this.#t;let l;t.contentType==="text/html"?typeof c=="string"&&/^s$/i.test(c)?l=!1:l=!0:typeof c=="string"&&/^i$/i.test(c)?l=!0:l=!1;let{name:f}=o;f=(0,g.unescapeSelector)(f),l&&(f=f.toLowerCase());const n=new Set;if(/\|/.test(f)){const{prefix:s,tagName:i}=(0,k.selectorToNodeProps)(f);for(let{name:r,value:m}of p)switch(l&&(r=r.toLowerCase(),m=m.toLowerCase()),s){case"":{i===r&&n.add(m);break}case"*":{/:/.test(r)?r.endsWith(`:${i}`)&&n.add(m):i===r&&n.add(m);break}default:if(/:/.test(r)){const[N,w]=r.split(":");s===N&&i===w&&(0,k.isNamespaceDeclared)(s,e)&&n.add(m)}}}else for(let{name:s,value:i}of p)if(l&&(s=s.toLowerCase(),i=i.toLowerCase()),/:/.test(s)){const[r,m]=s.split(":");if(r==="xml"&&m==="lang")continue;f===m&&n.add(i)}else f===s&&n.add(i);if(n.size){const{name:s,value:i}=d||{};let r;switch(s?l?r=s.toLowerCase():r=s:i?l?r=i.toLowerCase():r=i:i===""&&(r=i),h){case"=":{typeof r=="string"&&n.has(r)&&(u=e);break}case"~=":{if(r&&typeof r=="string"){for(const m of n)if(new Set(m.split(/\s+/)).has(r)){u=e;break}}break}case"|=":{if(r&&typeof r=="string"){let m;for(const N of n)if(N===r||N.startsWith(`${r}-`)){m=N;break}m&&(u=e)}break}case"^=":{if(r&&typeof r=="string"){let m;for(const N of n)if(N.startsWith(`${r}`)){m=N;break}m&&(u=e)}break}case"$=":{if(r&&typeof r=="string"){let m;for(const N of n)if(N.endsWith(`${r}`)){m=N;break}m&&(u=e)}break}case"*=":{if(r&&typeof r=="string"){let m;for(const N of n)if(N.includes(`${r}`)){m=N;break}m&&(u=e)}break}case null:default:u=e}}}return u??null}_matchClassSelector(a,e){const c=(0,g.unescapeSelector)(a.name);let h;return e.classList.contains(c)&&(h=e),h??null}_matchIDSelector(a,e){const{id:c}=e,h=(0,g.unescapeSelector)(a.name);let o;return h===c&&(o=e),o??null}_matchTypeSelector(a,e){const c=(0,g.unescapeSelector)(a.name),{localName:h,prefix:o}=e,{document:d}=this.#t;let{prefix:p,tagName:u}=(0,k.selectorToNodeProps)(c,e);d.contentType==="text/html"&&(p=p.toLowerCase(),u=u.toLowerCase());let t,l;/:/.test(h)?[t,l]=h.split(":"):(t=o||"",l=h);let f;return p===""&&t===""?e.namespaceURI===null&&(u==="*"||u===l)&&(f=e):p==="*"?(u==="*"||u===l)&&(f=e):p===t&&(0,k.isNamespaceDeclared)(p,e)&&(u==="*"||u===l)&&(f=e),f??null}_matchSelector(a,e,c){const{type:h}=a;let o=new Set;if(e.nodeType===b.ELEMENT_NODE)switch(h){case b.ATTRIBUTE_SELECTOR:{const d=this._matchAttributeSelector(a,e);d&&o.add(d);break}case b.CLASS_SELECTOR:{const d=this._matchClassSelector(a,e);d&&o.add(d);break}case b.ID_SELECTOR:{const d=this._matchIDSelector(a,e);d&&o.add(d);break}case b.PSEUDO_CLASS_SELECTOR:{const d=this._matchPseudoClassSelector(a,e,c);d.size&&(o=d);break}case b.PSEUDO_ELEMENT_SELECTOR:{const d=(0,g.unescapeSelector)(a.name);this._matchPseudoElementSelector(d,c);break}case b.TYPE_SELECTOR:default:{const d=this._matchTypeSelector(a,e);d&&o.add(d)}}return o}_matchLeaves(a,e,c){let h;for(const o of a)if(h=this._matchSelector(o,e,c).has(e),!h)break;return!!h}_findDescendantNodes(a,e){const[c,...h]=a,{type:o}=c,d=(0,g.unescapeSelector)(c.name),p=h.length>0,u=new Set;let t=!1;switch(o){case b.ID_SELECTOR:{const{root:l}=this.#t;if(l.nodeType===b.ELEMENT_NODE)t=!0;else{const f=l.getElementById(d);if(f&&f!==e){const n=(0,k.isSameOrDescendant)(f,e);let s;n&&(s=f),s&&(p?this._matchLeaves(h,s)&&u.add(s):u.add(s))}}break}case b.PSEUDO_ELEMENT_SELECTOR:{this._matchPseudoElementSelector(d);break}default:t=!0}return{nodes:u,pending:t}}_matchCombinator(a,e,c={}){const{combo:h,leaves:o}=a,{name:d}=h,{find:p,forgive:u}=c;let t=new Set;if(p==="next")switch(d){case"+":{const l=e.nextElementSibling;l&&this._matchLeaves(o,l,{forgive:u})&&t.add(l);break}case"~":{let l=e.nextElementSibling;for(;l;)this._matchLeaves(o,l,{forgive:u})&&t.add(l),l=l.nextElementSibling;break}case">":{const l=[...e.children];for(const f of l)this._matchLeaves(o,f,{forgive:u})&&t.add(f);break}case" ":default:{const{nodes:l,pending:f}=this._findDescendantNodes(o,e);if(l.size)t=l;else if(f){const{document:n}=this.#t,s=n.createNodeIterator(e,b.SHOW_ELEMENT);let i=s.nextNode();for(i===e&&(i=s.nextNode());i;)this._matchLeaves(o,i,{forgive:u})&&t.add(i),i=s.nextNode()}}}else switch(d){case"+":{const l=e.previousElementSibling;l&&this._matchLeaves(o,l,{forgive:u})&&t.add(l);break}case"~":{const l=[];let f=e.previousElementSibling;for(;f;)this._matchLeaves(o,f,{forgive:u})&&l.push(f),f=f.previousElementSibling;l.length&&(t=new Set(l.reverse()));break}case">":{const l=e.parentNode;l&&this._matchLeaves(o,l,{forgive:u})&&t.add(l);break}case" ":default:{const l=[];let f=e.parentNode;for(;f;)this._matchLeaves(o,f,{forgive:u})&&l.push(f),f=f.parentNode;l.length&&(t=new Set(l.reverse()))}}return t}_findNodes(a,e){const{leaves:[c,...h]}=a,{type:o}=c,d=(0,g.unescapeSelector)(c.name),p=h.length>0,{document:u,root:t}=this.#t;let l=new Set,f=!1;switch(o){case b.ID_SELECTOR:{let n;if(e===S)this._matchLeaves([c],this.#e)&&(n=this.#e);else if(e===x){let s=this.#e;for(;s;){if(this._matchLeaves([c],s)){n=s;break}s=s.parentNode}}else t.nodeType===b.ELEMENT_NODE?f=!0:n=t.getElementById(d);n&&(p?this._matchLeaves(h,n)&&l.add(n):l.add(n));break}case b.CLASS_SELECTOR:{const n=[];if(e===S)this.#e.nodeType===b.ELEMENT_NODE&&this.#e.classList.contains(d)&&n.push(this.#e);else if(e===x){let s=this.#e;for(;s&&s.nodeType===b.ELEMENT_NODE;)s.classList.contains(d)&&n.push(s),s=s.parentNode}else if(t.nodeType===b.DOCUMENT_FRAGMENT_NODE){const s=[...t.children];for(const i of s){i.classList.contains(d)&&n.push(i);const r=[...i.getElementsByClassName(d)];n.push(...r)}}else{const s=[...t.getElementsByClassName(d)];n.push(...s)}if(n.length)if(p)for(const s of n)this._matchLeaves(h,s)&&l.add(s);else l=new Set(n);break}case b.TYPE_SELECTOR:{const n=[];if(e===S)this.#e.nodeType===b.ELEMENT_NODE&&this._matchLeaves([c],this.#e)&&n.push(this.#e);else if(e===x){let s=this.#e;for(;s&&s.nodeType===b.ELEMENT_NODE;)this._matchLeaves([c],s)&&n.push(s),s=s.parentNode}else if(u.contentType!=="text/html"||/[*|]/.test(d))f=!0;else if(t.nodeType===b.DOCUMENT_FRAGMENT_NODE){const s=d.toLowerCase(),i=[...t.children];for(const r of i){r.localName===s&&n.push(r);const m=[...r.getElementsByTagName(d)];n.push(...m)}}else{const s=[...t.getElementsByTagName(d)];n.push(...s)}if(n.length)if(p)for(const s of n)this._matchLeaves(h,s)&&l.add(s);else l=new Set(n);break}case b.PSEUDO_ELEMENT_SELECTOR:{this._matchPseudoElementSelector(d);break}default:{const n=[];if(e===S)this._matchLeaves([c],this.#e)&&n.push(this.#e);else if(e===x){let s=this.#e;for(;s;)this._matchLeaves([c],s)&&n.push(s),s=s.parentNode}else f=!0;if(n.length)if(p)for(const s of n)this._matchLeaves(h,s)&&l.add(s);else l=new Set(n)}}return{nodes:l,pending:f}}_getFirstTwig(a){const e=a.length-1,c=a[0];let h,o;if(e){const d=a[e],{leaves:[{type:p}]}=d;p===b.PSEUDO_ELEMENT_SELECTOR||p===b.ID_SELECTOR?(h="prev",o=d):(h="next",o=c)}else h="prev",o=c;return{find:h,twig:o}}_collectNodes(a){const e=this.#s.values();if(a===C||a===v){const c=new Set;let h=0;for(const{branch:o}of e){const{find:d,twig:p}=this._getFirstTwig(o),{nodes:u,pending:t}=this._findNodes(p,a);u.size?this.#r[h]=u:t?c.add(new Map([["index",h],["twig",p]])):this.#s[h].skip=!0,this.#s[h].find=d,h++}if(c.size){const{document:o,root:d}=this.#t,p=o.createNodeIterator(d,b.SHOW_ELEMENT);let u=p.nextNode();for(;u;){let t=!1;if(this.#e.nodeType===b.ELEMENT_NODE?t=(0,k.isSameOrDescendant)(u,this.#e):t=!0,t)for(const l of c){const{leaves:f}=l.get("twig");if(this._matchLeaves(f,u)){const s=l.get("index");this.#r[s].add(u)}}u=p.nextNode()}}}else{let c=0;for(const{branch:h}of e){const o=h[h.length-1],{nodes:d}=this._findNodes(o,a);d.size?this.#r[c]=d:this.#s[c].skip=!0,this.#s[c].find="prev",c++}}return[this.#s,this.#r]}_matchNodes(a){const[...e]=this.#s,c=e.length;let h=new Set;for(let o=0;o<c;o++){const{branch:d,find:p,skip:u}=e[o],t=d.length;if(!u&&t){const l=this.#r[o],f=t-1;if(f===0)if((a===C||a===v)&&this.#e.nodeType===b.ELEMENT_NODE){for(const n of l)if(n!==this.#e&&(0,k.isSameOrDescendant)(n,this.#e)&&(h.add(n),a===v))break}else if(a===v){const[n]=[...l];h.add(n)}else{const n=[...h],s=[...l];h=new Set([...n,...s])}else if(p==="next"){let{combo:n}=d[0];for(const s of l){let i=new Set([s]);for(let r=1;r<t;r++){const{combo:m,leaves:N}=d[r],w=[];for(const y of i){const A={combo:n,leaves:N},M=this._matchCombinator(A,y,{find:p});M.size&&w.push(...M)}const E=new Set(w);if(E.size)if(r===f){if(a===v){const[y]=[...E];h.add(y)}else{const y=[...h],A=[...E];h=new Set([...y,...A])}break}else n=m,i=E;else break}}}else for(const n of l){let s=new Set([n]),i;for(let r=f-1;r>=0;r--){const m=d[r],N=[];for(const E of s){const y=this._matchCombinator(m,E,{find:p});y.size&&N.push(...y)}const w=new Set(N);if(w.size)if(i=!0,r===0){h.add(n);break}else s=w;else{i=!1;break}}if(i&&a!==C)break}}}return h}_find(a){return this._collectNodes(a),this._matchNodes(a)}_sortNodes(a){const e=[...a];return e.length>1&&e.sort((c,h)=>{let o;const d=c.compareDocumentPosition(h);return d&b.DOCUMENT_POSITION_PRECEDING||d&b.DOCUMENT_POSITION_CONTAINS?o=1:o=-1,o}),e}matches(){if(this.#e.nodeType!==b.ELEMENT_NODE)throw new TypeError(`Unexpected node ${this.#e.nodeName}`);let a;try{a=this._find(S).has(this.#e)}catch(e){this._onError(e)}return!!a}closest(){if(this.#e.nodeType!==b.ELEMENT_NODE)throw new TypeError(`Unexpected node ${this.#e.nodeName}`);let a;try{const e=this._find(x);let c=this.#e;for(;c;){if(e.has(c)){a=c;break}c=c.parentNode}}catch(e){this._onError(e)}return a??null}querySelector(){let a;try{const e=this._find(v);e.delete(this.#e),e.size>1?[a]=this._sortNodes(e):e.size&&([a]=[...e])}catch(e){this._onError(e)}return a??null}querySelectorAll(){const a=[];try{const e=this._find(C);e.delete(this.#e),e.size>1&&this.#c?a.push(...this._sortNodes(e)):e.size&&a.push(...e)}catch(e){this._onError(e)}return a}}0&&(module.exports={Matcher});
|
|
2
2
|
//# sourceMappingURL=matcher.js.map
|
|
@@ -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, isNamespaceDeclared, isSameOrDescendant,\n selectorToNodeProps\n} from './dom-util.js';\nimport {\n generateCSS, parseSelector, unescapeSelector, walkAST\n} from './parser.js';\n\n/* constants */\nimport {\n ATTRIBUTE_SELECTOR, BIT_1, BIT_10, BIT_100, BIT_1000, BIT_10000, BIT_100000,\n CLASS_SELECTOR, COMBINATOR, DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE,\n DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_PRECEDING, ELEMENT_NODE,\n ID_SELECTOR, NOT_SUPPORTED_ERR, PSEUDO_CLASS_SELECTOR,\n PSEUDO_ELEMENT_SELECTOR, SHOW_ELEMENT, SYNTAX_ERR, TEXT_NODE, TYPE_SELECTOR\n} from './constant.js';\nconst TARGET_ALL = 'all';\nconst TARGET_FIRST = 'first';\nconst TARGET_LINEAL = 'lineal';\nconst TARGET_SELF = 'self';\n\n/* regexp */\nconst FORM_PARTS =\n /^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/;\nconst FORM_VALIDITY = /^(?:(?:(?:in|out)pu|selec)t|button|form|textarea)$/;\nconst HTML_ANCHOR = /^a(?:rea)?$/;\nconst HTML_INTERACT = /^d(?:etails|ialog)$/;\nconst INPUT_CHECK = /^(?:checkbox|radio)$/;\nconst INPUT_EDIT = /^(?:(?:emai|te|ur)l|number|password|search|text)$/;\nconst INPUT_RANGE = /(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/;\nconst INPUT_RESET = /^(?:button|reset)$/;\nconst INPUT_SUBMIT = /^(?:image|submit)$/;\nconst INPUT_TIME = /^(?:date(?:time-local)?|month|time|week)$/;\nconst PSEUDO_FUNC = /^(?:(?:ha|i)s|not|where)$/;\nconst PSEUDO_NTH = /^nth-(?:last-)?(?:child|of-type)$/;\n\n/**\n * Matcher\n * NOTE: #ast[i] corresponds to #nodes[i]\n * #ast: [\n * {\n * branch: branch[],\n * skip: boolean\n * },\n * {\n * branch: branch[],\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 #sort;\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.sort] - sort results of querySelectorAll()\n * @param {boolean} [opt.warn] - console warn\n */\n constructor(selector, node, opt = {}) {\n const { sort, warn } = opt;\n this.#bit = new Map([\n [PSEUDO_ELEMENT_SELECTOR, BIT_1],\n [ID_SELECTOR, BIT_10],\n [CLASS_SELECTOR, BIT_100],\n [TYPE_SELECTOR, BIT_1000],\n [ATTRIBUTE_SELECTOR, BIT_10000],\n [PSEUDO_CLASS_SELECTOR, BIT_100000]\n ]);\n this.#cache = new WeakMap();\n this.#selector = selector;\n this.#node = node;\n this.#sort = !!sort;\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 (isSameOrDescendant(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 return {\n document,\n root\n };\n }\n\n /**\n * sort AST leaves\n * @param {Array.<object>} leaves - 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 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 {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 = [...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 (root.nodeType === ELEMENT_NODE && node === root && (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 {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 = [...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 (root.nodeType === ELEMENT_NODE && node === root && (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 {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 (/last/.test(nthName)) {\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 (/last/.test(nthName)) {\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 'part':\n case 'placeholder':\n case 'selection':\n case 'slotted':\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 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 (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.hasAttribute('lang')) {\n if (parent.getAttribute('lang')) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n }\n }\n } else if (/[A-Z\\d-]+/i.test(astName)) {\n const alphaNum = '[A-Z\\\\d]+';\n const codePart = `(?:-${alphaNum})*`;\n let reg;\n if (/-/.test(astName)) {\n const [langMain, langSub, ...langRest] = astName.split('-');\n let extendedMain;\n if (langMain === '*') {\n extendedMain = `${alphaNum}${codePart}`;\n } else {\n extendedMain = `${langMain}${codePart}`;\n }\n const extendedSub = `-${langSub}${codePart}`;\n const len = langRest.length;\n let extendedRest = '';\n if (len) {\n for (let i = 0; i < len; i++) {\n extendedRest += `-${langRest[i]}${codePart}`;\n }\n }\n reg =\n new RegExp(`^${extendedMain}${extendedSub}${extendedRest}$`, 'i');\n } else {\n reg = new RegExp(`^${astName}${codePart}$`, 'i');\n }\n if (node.hasAttribute('lang')) {\n if (reg.test(node.getAttribute('lang'))) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.hasAttribute('lang')) {\n const value = parent.getAttribute('lang');\n if (reg.test(value)) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\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: '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 let bool;\n const l = branches.length;\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 let bool;\n const l = twigBranches.length;\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, {\n forgive\n });\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: 'prev'\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n const matchedNodes = new Set(arr);\n if (matchedNodes.size) {\n if (j === 0) {\n bool = true;\n break;\n } else {\n nextNodes = matchedNodes;\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 {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 (PSEUDO_FUNC.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 (PSEUDO_NTH.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 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 { documentElement } = document;\n const docURL = new URL(document.URL);\n switch (astName) {\n case 'any-link':\n case 'link': {\n if (HTML_ANCHOR.test(localName) && node.hasAttribute('href')) {\n matched.add(node);\n }\n break;\n }\n case 'local-link': {\n if (HTML_ANCHOR.test(localName) && node.hasAttribute('href')) {\n const attrURL = new URL(node.getAttribute('href'), docURL.href);\n if (attrURL.origin === docURL.origin &&\n attrURL.pathname === docURL.pathname) {\n matched.add(node);\n }\n }\n break;\n }\n case 'visited': {\n // prevent fingerprinting\n break;\n }\n case 'target': {\n if (isSameOrDescendant(node) && docURL.hash &&\n node.id && docURL.hash === `#${node.id}`) {\n matched.add(node);\n }\n break;\n }\n case 'target-within': {\n if (docURL.hash) {\n const hash = docURL.hash.replace(/^#/, '');\n let current = document.getElementById(hash);\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 === 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 (HTML_INTERACT.test(localName) && node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'closed': {\n if (HTML_INTERACT.test(localName) && !node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'disabled': {\n if (FORM_PARTS.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 && parent.hasAttribute('disabled') &&\n parentNode.localName !== 'legend') {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'enabled': {\n if ((FORM_PARTS.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 ||\n INPUT_EDIT.test(node.type) || INPUT_TIME.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 ||\n INPUT_EDIT.test(node.type) || INPUT_TIME.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 (INPUT_EDIT.test(node.getAttribute('type'))) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode && node.hasAttribute('placeholder') &&\n node.getAttribute('placeholder').trim().length &&\n node.value === '') {\n matched.add(node);\n }\n break;\n }\n case 'checked': {\n if ((localName === 'input' && node.hasAttribute('type') &&\n INPUT_CHECK.test(node.getAttribute('type')) &&\n node.checked) ||\n (localName === 'option' && node.selected)) {\n matched.add(node);\n }\n break;\n }\n case 'indeterminate': {\n if ((localName === 'input' && node.type === 'checkbox' &&\n node.indeterminate) ||\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 = documentElement;\n }\n const nodes = [...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 // button[type=\"submit\"], input[type=\"submit\"], input[type=\"image\"]\n if ((localName === 'button' &&\n !(node.hasAttribute('type') &&\n INPUT_RESET.test(node.getAttribute('type')))) ||\n (localName === 'input' && node.hasAttribute('type') &&\n INPUT_SUBMIT.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 INPUT_RESET.test(nextNode.getAttribute('type')));\n } else if (nodeName === 'input') {\n m = nextNode.hasAttribute('type') &&\n INPUT_SUBMIT.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 INPUT_CHECK.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 (FORM_VALIDITY.test(localName)) {\n if (node.checkValidity()) {\n matched.add(node);\n }\n } else if (/^fieldset$/.test(localName)) {\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 (FORM_VALIDITY.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 (FORM_VALIDITY.test(localName)) {\n if (!node.checkValidity()) {\n matched.add(node);\n }\n } else if (/^fieldset$/.test(localName)) {\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 (FORM_VALIDITY.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 INPUT_RANGE.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 INPUT_RANGE.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 (INPUT_EDIT.test(inputType) || INPUT_CHECK.test(inputType) ||\n INPUT_TIME.test(inputType) || inputType === 'file') {\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 (INPUT_EDIT.test(inputType) || INPUT_CHECK.test(inputType) ||\n INPUT_TIME.test(inputType) || inputType === 'file') {\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 === 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 (root.nodeType === ELEMENT_NODE && node === root)) {\n matched.add(node);\n }\n break;\n }\n case 'last-child': {\n if ((parentNode && node === parentNode.lastElementChild) ||\n (root.nodeType === ELEMENT_NODE && node === root)) {\n matched.add(node);\n }\n break;\n }\n case 'only-child': {\n if ((parentNode &&\n node === parentNode.firstElementChild &&\n node === parentNode.lastElementChild) ||\n (root.nodeType === ELEMENT_NODE && node === root)) {\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 (root.nodeType === ELEMENT_NODE && node === root) {\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 (root.nodeType === ELEMENT_NODE && node === root) {\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 (root.nodeType === ELEMENT_NODE && node === root) {\n matched.add(node);\n }\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 throw new DOMException('Invalid attribute selector', 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 { name: astAttrName } = astName;\n astAttrName = unescapeSelector(astAttrName);\n if (caseInsensitive) {\n astAttrName = astAttrName.toLowerCase();\n }\n const attrValues = new Set();\n // namespaced\n if (/\\|/.test(astAttrName)) {\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 (/:/.test(itemName)) {\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 (/:/.test(itemName)) {\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 (/:/.test(itemName)) {\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 { id } = node;\n const astName = unescapeSelector(ast.name);\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 * @returns {?object} - matched node\n */\n _matchTypeSelector(ast, node) {\n const astName = unescapeSelector(ast.name);\n const { localName, prefix } = node;\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 (/:/.test(localName)) {\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 isNamespaceDeclared(astPrefix, node)) {\n if (astNodeName === '*' || astNodeName === nodeName) {\n res = node;\n }\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 {object} - collection of matched nodes\n */\n _matchSelector(ast, node, opt) {\n const { type } = ast;\n let matched = new Set();\n if (node.nodeType === ELEMENT_NODE) {\n switch (type) {\n case ATTRIBUTE_SELECTOR: {\n const res = this._matchAttributeSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case CLASS_SELECTOR: {\n const res = this._matchClassSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case ID_SELECTOR: {\n const res = this._matchIDSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case PSEUDO_CLASS_SELECTOR: {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n if (nodes.size) {\n matched = nodes;\n }\n break;\n }\n case PSEUDO_ELEMENT_SELECTOR: {\n const astName = unescapeSelector(ast.name);\n this._matchPseudoElementSelector(astName, opt);\n break;\n }\n case TYPE_SELECTOR:\n default: {\n const res = this._matchTypeSelector(ast, node);\n if (res) {\n matched.add(res);\n }\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} - result\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 nodes = new Set();\n let pending = false;\n switch (leafType) {\n case ID_SELECTOR: {\n const { root } = this.#root;\n if (root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n const elm = root.getElementById(leafName);\n if (elm && elm !== baseNode) {\n const bool = isSameOrDescendant(elm, baseNode);\n let node;\n if (bool) {\n node = elm;\n }\n if (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 }\n break;\n }\n case PSEUDO_ELEMENT_SELECTOR: {\n this._matchPseudoElementSelector(leafName);\n break;\n }\n default: {\n pending = true;\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 {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 === '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.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 and pending state\n */\n _findNodes(twig, targetType) {\n const { leaves: [leaf, ...items] } = twig;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const matchItems = items.length > 0;\n const { document, root } = this.#root;\n let nodes = new Set();\n let pending = false;\n switch (leafType) {\n case ID_SELECTOR: {\n let node;\n if (targetType === TARGET_SELF) {\n const bool = this._matchLeaves([leaf], this.#node);\n if (bool) {\n node = 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 node = refNode;\n break;\n }\n refNode = refNode.parentNode;\n }\n } else if (root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n node = root.getElementById(leafName);\n }\n if (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 break;\n }\n case CLASS_SELECTOR: {\n const arr = [];\n if (targetType === TARGET_SELF) {\n if (this.#node.nodeType === ELEMENT_NODE &&\n this.#node.classList.contains(leafName)) {\n arr.push(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 arr.push(refNode);\n }\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n } else if (root.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const childNodes = [...root.children];\n for (const node of childNodes) {\n if (node.classList.contains(leafName)) {\n arr.push(node);\n }\n const a = [...node.getElementsByClassName(leafName)];\n arr.push(...a);\n }\n } else {\n const a = [...root.getElementsByClassName(leafName)];\n arr.push(...a);\n }\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 TYPE_SELECTOR: {\n const arr = [];\n if (targetType === TARGET_SELF) {\n const bool = this.#node.nodeType === ELEMENT_NODE &&\n this._matchLeaves([leaf], this.#node);\n if (bool) {\n arr.push(this.#node);\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 arr.push(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 = [...root.children];\n for (const node of childNodes) {\n if (node.localName === tagName) {\n arr.push(node);\n }\n const a = [...node.getElementsByTagName(leafName)];\n arr.push(...a);\n }\n } else {\n const a = [...root.getElementsByTagName(leafName)];\n arr.push(...a);\n }\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 PSEUDO_ELEMENT_SELECTOR: {\n this._matchPseudoElementSelector(leafName);\n break;\n }\n default: {\n const arr = [];\n if (targetType === TARGET_SELF) {\n const bool = this._matchLeaves([leaf], this.#node);\n if (bool) {\n arr.push(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 arr.push(refNode);\n }\n refNode = refNode.parentNode;\n }\n } else {\n pending = true;\n }\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 }\n }\n return {\n nodes,\n pending\n };\n }\n\n /**\n * get first twig\n * @param {Array.<object>} branch - AST branch\n * @returns {object} - find direction and twig\n */\n _getFirstTwig(branch) {\n const lastIndex = branch.length - 1;\n const firstTwig = branch[0];\n let find;\n let twig;\n if (lastIndex) {\n const lastTwig = branch[lastIndex];\n const { leaves: [{ type: lastType }] } = lastTwig;\n if (lastType === PSEUDO_ELEMENT_SELECTOR || lastType === ID_SELECTOR) {\n find = 'prev';\n twig = lastTwig;\n } else {\n find = 'next';\n twig = firstTwig;\n }\n } else {\n 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._getFirstTwig(branch);\n const { 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].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 bool = isSameOrDescendant(nextNode, this.#node);\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 }\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 { 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].find = 'prev';\n i++;\n }\n }\n return [\n this.#ast,\n this.#nodes\n ];\n }\n\n /**\n * match nodes\n * @param {string} targetType - target type\n * @returns {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, find, skip } = branches[i];\n const branchLen = branch.length;\n if (skip) {\n continue;\n } else if (branchLen) {\n const matched = this.#nodes[i];\n const lastIndex = branchLen - 1;\n if (lastIndex === 0) {\n if ((targetType === TARGET_ALL || targetType === TARGET_FIRST) &&\n this.#node.nodeType === ELEMENT_NODE) {\n for (const node of matched) {\n if (node !== this.#node) {\n if (isSameOrDescendant(node, this.#node)) {\n nodes.add(node);\n if (targetType === TARGET_FIRST) {\n break;\n }\n }\n }\n }\n } else if (targetType === TARGET_FIRST) {\n const [node] = [...matched];\n nodes.add(node);\n } else {\n const n = [...nodes];\n const m = [...matched];\n nodes = new Set([...n, ...m]);\n }\n } else if (find === 'next') {\n let { combo } = branch[0];\n for (const node of matched) {\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 const matchedNodes = new Set(arr);\n if (matchedNodes.size) {\n if (j === lastIndex) {\n if (targetType === TARGET_FIRST) {\n const [node] = [...matchedNodes];\n nodes.add(node);\n } else {\n const n = [...nodes];\n const m = [...matchedNodes];\n nodes = new Set([...n, ...m]);\n }\n break;\n } else {\n combo = nextCombo;\n nextNodes = matchedNodes;\n }\n } else {\n break;\n }\n }\n }\n } else {\n for (const node of matched) {\n let nextNodes = new Set([node]);\n let bool;\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 const matchedNodes = new Set(arr);\n if (matchedNodes.size) {\n bool = true;\n if (j === 0) {\n nodes.add(node);\n break;\n } else {\n nextNodes = matchedNodes;\n }\n } else {\n bool = false;\n break;\n }\n }\n if (bool && 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 {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 * sort nodes\n * @param {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 const posBit = a.compareDocumentPosition(b);\n if (posBit & DOCUMENT_POSITION_PRECEDING ||\n posBit & DOCUMENT_POSITION_CONTAINS) {\n res = 1;\n } else {\n res = -1;\n }\n return res;\n });\n }\n return arr;\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 res = nodes.has(this.#node);\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 > 1) {\n [res] = this._sortNodes(nodes);\n } else if (nodes.size) {\n [res] = [...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 const res = [];\n try {\n const nodes = this._find(TARGET_ALL);\n nodes.delete(this.#node);\n if (nodes.size > 1 && this.#sort) {\n res.push(...this._sortNodes(nodes));\n } else if (nodes.size) {\n res.push(...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", "TARGET_ALL", "TARGET_FIRST", "TARGET_LINEAL", "TARGET_SELF", "
|
|
4
|
+
"sourcesContent": ["/**\n * matcher.js\n */\n\n/* import */\nimport isCustomElementName from 'is-potential-custom-element-name';\nimport {\n getDirectionality, isContentEditable, isNamespaceDeclared, isSameOrDescendant,\n selectorToNodeProps\n} from './dom-util.js';\nimport {\n generateCSS, parseSelector, unescapeSelector, walkAST\n} from './parser.js';\n\n/* constants */\nimport {\n ATTRIBUTE_SELECTOR, BIT_1, BIT_10, BIT_100, BIT_1000, BIT_10000, BIT_100000,\n CLASS_SELECTOR, COMBINATOR, DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE,\n DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_PRECEDING, ELEMENT_NODE,\n ID_SELECTOR, NOT_SUPPORTED_ERR, PSEUDO_CLASS_SELECTOR,\n PSEUDO_ELEMENT_SELECTOR, SHOW_ELEMENT, SYNTAX_ERR, TEXT_NODE, TYPE_SELECTOR\n} from './constant.js';\nconst ALPHA_NUM = '[A-Z\\\\d]+';\nconst LANG_PART = `(?:-${ALPHA_NUM})*`;\nconst TARGET_ALL = 'all';\nconst TARGET_FIRST = 'first';\nconst TARGET_LINEAL = 'lineal';\nconst TARGET_SELF = 'self';\n\n/* regexp */\nconst FORM_ITEM =\n /^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/;\nconst FORM_VALIDITY = /^(?:(?:(?:in|out)pu|selec)t|button|form|textarea)$/;\nconst HTML_ANCHOR = /^a(?:rea)?$/;\nconst HTML_INTERACT = /^d(?:etails|ialog)$/;\nconst INPUT_CHECK = /^(?:checkbox|radio)$/;\nconst INPUT_EDIT = /^(?:(?:emai|te|ur)l|number|password|search|text)$/;\nconst INPUT_RANGE = /(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/;\nconst INPUT_RESET = /^(?:button|reset)$/;\nconst INPUT_SUBMIT = /^(?:image|submit)$/;\nconst INPUT_TIME = /^(?:date(?:time-local)?|month|time|week)$/;\nconst PSEUDO_FUNC = /^(?:(?:ha|i)s|not|where)$/;\nconst PSEUDO_NTH = /^nth-(?:last-)?(?:child|of-type)$/;\nconst LANG_CODE = new RegExp(`^(?:\\\\*-)?${ALPHA_NUM}${LANG_PART}$`, 'i');\n\n/**\n * Matcher\n * NOTE: #ast[i] corresponds to #nodes[i]\n * #ast: [\n * {\n * branch: branch[],\n * skip: boolean\n * },\n * {\n * branch: branch[],\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 #sort;\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.sort] - sort results of querySelectorAll()\n * @param {boolean} [opt.warn] - console warn\n */\n constructor(selector, node, opt = {}) {\n const { sort, warn } = opt;\n this.#bit = new Map([\n [PSEUDO_ELEMENT_SELECTOR, BIT_1],\n [ID_SELECTOR, BIT_10],\n [CLASS_SELECTOR, BIT_100],\n [TYPE_SELECTOR, BIT_1000],\n [ATTRIBUTE_SELECTOR, BIT_10000],\n [PSEUDO_CLASS_SELECTOR, BIT_100000]\n ]);\n this.#cache = new WeakMap();\n this.#selector = selector;\n this.#node = node;\n this.#sort = !!sort;\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 (isSameOrDescendant(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 return {\n document,\n root\n };\n }\n\n /**\n * sort AST leaves\n * @param {Array.<object>} leaves - 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 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 {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 = [...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 (root.nodeType === ELEMENT_NODE && node === root && (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 {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 = [...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 (root.nodeType === ELEMENT_NODE && node === root && (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 {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 (/last/.test(nthName)) {\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 (/last/.test(nthName)) {\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 'part':\n case 'placeholder':\n case 'selection':\n case 'slotted':\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 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 (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.hasAttribute('lang')) {\n if (parent.getAttribute('lang')) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n }\n }\n } else if (LANG_CODE.test(astName)) {\n let reg;\n if (/-/.test(astName)) {\n const [langMain, langSub, ...langRest] = astName.split('-');\n let extendedMain;\n if (langMain === '*') {\n extendedMain = `${ALPHA_NUM}${LANG_PART}`;\n } else {\n extendedMain = `${langMain}${LANG_PART}`;\n }\n const extendedSub = `-${langSub}${LANG_PART}`;\n const len = langRest.length;\n let extendedRest = '';\n if (len) {\n for (let i = 0; i < len; i++) {\n extendedRest += `-${langRest[i]}${LANG_PART}`;\n }\n }\n reg =\n new RegExp(`^${extendedMain}${extendedSub}${extendedRest}$`, 'i');\n } else {\n reg = new RegExp(`^${astName}${LANG_PART}$`, 'i');\n }\n if (node.hasAttribute('lang')) {\n if (reg.test(node.getAttribute('lang'))) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.hasAttribute('lang')) {\n const value = parent.getAttribute('lang');\n if (reg.test(value)) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\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: '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 let bool;\n const l = branches.length;\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 let bool;\n const l = twigBranches.length;\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, {\n forgive\n });\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: 'prev'\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n const matchedNodes = new Set(arr);\n if (matchedNodes.size) {\n if (j === 0) {\n bool = true;\n break;\n } else {\n nextNodes = matchedNodes;\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 {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 (PSEUDO_FUNC.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 (PSEUDO_NTH.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 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 { documentElement } = document;\n const docURL = new URL(document.URL);\n switch (astName) {\n case 'any-link':\n case 'link': {\n if (HTML_ANCHOR.test(localName) && node.hasAttribute('href')) {\n matched.add(node);\n }\n break;\n }\n case 'local-link': {\n if (HTML_ANCHOR.test(localName) && node.hasAttribute('href')) {\n const attrURL = new URL(node.getAttribute('href'), docURL.href);\n if (attrURL.origin === docURL.origin &&\n attrURL.pathname === docURL.pathname) {\n matched.add(node);\n }\n }\n break;\n }\n case 'visited': {\n // prevent fingerprinting\n break;\n }\n case 'target': {\n if (isSameOrDescendant(node) && docURL.hash &&\n node.id && docURL.hash === `#${node.id}`) {\n matched.add(node);\n }\n break;\n }\n case 'target-within': {\n if (docURL.hash) {\n const hash = docURL.hash.replace(/^#/, '');\n let current = document.getElementById(hash);\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 === 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 (HTML_INTERACT.test(localName) && node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'closed': {\n if (HTML_INTERACT.test(localName) && !node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'disabled': {\n if (FORM_ITEM.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 && parent.hasAttribute('disabled') &&\n parentNode.localName !== 'legend') {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'enabled': {\n if ((FORM_ITEM.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 ||\n INPUT_EDIT.test(node.type) || INPUT_TIME.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 ||\n INPUT_EDIT.test(node.type) || INPUT_TIME.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 (INPUT_EDIT.test(node.getAttribute('type'))) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode && node.hasAttribute('placeholder') &&\n node.getAttribute('placeholder').trim().length &&\n node.value === '') {\n matched.add(node);\n }\n break;\n }\n case 'checked': {\n if ((localName === 'input' && node.hasAttribute('type') &&\n INPUT_CHECK.test(node.getAttribute('type')) &&\n node.checked) ||\n (localName === 'option' && node.selected)) {\n matched.add(node);\n }\n break;\n }\n case 'indeterminate': {\n if ((localName === 'input' && node.type === 'checkbox' &&\n node.indeterminate) ||\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 = documentElement;\n }\n const nodes = [...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 // button[type=\"submit\"], input[type=\"submit\"], input[type=\"image\"]\n if ((localName === 'button' &&\n !(node.hasAttribute('type') &&\n INPUT_RESET.test(node.getAttribute('type')))) ||\n (localName === 'input' && node.hasAttribute('type') &&\n INPUT_SUBMIT.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 INPUT_RESET.test(nextNode.getAttribute('type')));\n } else if (nodeName === 'input') {\n m = nextNode.hasAttribute('type') &&\n INPUT_SUBMIT.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 INPUT_CHECK.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 (FORM_VALIDITY.test(localName)) {\n if (node.checkValidity()) {\n matched.add(node);\n }\n } else if (/^fieldset$/.test(localName)) {\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 (FORM_VALIDITY.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 (FORM_VALIDITY.test(localName)) {\n if (!node.checkValidity()) {\n matched.add(node);\n }\n } else if (/^fieldset$/.test(localName)) {\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 (FORM_VALIDITY.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 INPUT_RANGE.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 INPUT_RANGE.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 (INPUT_EDIT.test(inputType) || INPUT_CHECK.test(inputType) ||\n INPUT_TIME.test(inputType) || inputType === 'file') {\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 (INPUT_EDIT.test(inputType) || INPUT_CHECK.test(inputType) ||\n INPUT_TIME.test(inputType) || inputType === 'file') {\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 === 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 (root.nodeType === ELEMENT_NODE && node === root)) {\n matched.add(node);\n }\n break;\n }\n case 'last-child': {\n if ((parentNode && node === parentNode.lastElementChild) ||\n (root.nodeType === ELEMENT_NODE && node === root)) {\n matched.add(node);\n }\n break;\n }\n case 'only-child': {\n if ((parentNode &&\n node === parentNode.firstElementChild &&\n node === parentNode.lastElementChild) ||\n (root.nodeType === ELEMENT_NODE && node === root)) {\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 (root.nodeType === ELEMENT_NODE && node === root) {\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 (root.nodeType === ELEMENT_NODE && node === root) {\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 (root.nodeType === ELEMENT_NODE && node === root) {\n matched.add(node);\n }\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 throw new DOMException('Invalid attribute selector', 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 { name: astAttrName } = astName;\n astAttrName = unescapeSelector(astAttrName);\n if (caseInsensitive) {\n astAttrName = astAttrName.toLowerCase();\n }\n const attrValues = new Set();\n // namespaced\n if (/\\|/.test(astAttrName)) {\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 (/:/.test(itemName)) {\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 (/:/.test(itemName)) {\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 (/:/.test(itemName)) {\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 { id } = node;\n const astName = unescapeSelector(ast.name);\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 * @returns {?object} - matched node\n */\n _matchTypeSelector(ast, node) {\n const astName = unescapeSelector(ast.name);\n const { localName, prefix } = node;\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 (/:/.test(localName)) {\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 isNamespaceDeclared(astPrefix, node)) {\n if (astNodeName === '*' || astNodeName === nodeName) {\n res = node;\n }\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 {object} - collection of matched nodes\n */\n _matchSelector(ast, node, opt) {\n const { type } = ast;\n let matched = new Set();\n if (node.nodeType === ELEMENT_NODE) {\n switch (type) {\n case ATTRIBUTE_SELECTOR: {\n const res = this._matchAttributeSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case CLASS_SELECTOR: {\n const res = this._matchClassSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case ID_SELECTOR: {\n const res = this._matchIDSelector(ast, node);\n if (res) {\n matched.add(res);\n }\n break;\n }\n case PSEUDO_CLASS_SELECTOR: {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n if (nodes.size) {\n matched = nodes;\n }\n break;\n }\n case PSEUDO_ELEMENT_SELECTOR: {\n const astName = unescapeSelector(ast.name);\n this._matchPseudoElementSelector(astName, opt);\n break;\n }\n case TYPE_SELECTOR:\n default: {\n const res = this._matchTypeSelector(ast, node);\n if (res) {\n matched.add(res);\n }\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} - result\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 nodes = new Set();\n let pending = false;\n switch (leafType) {\n case ID_SELECTOR: {\n const { root } = this.#root;\n if (root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n const elm = root.getElementById(leafName);\n if (elm && elm !== baseNode) {\n const bool = isSameOrDescendant(elm, baseNode);\n let node;\n if (bool) {\n node = elm;\n }\n if (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 }\n break;\n }\n case PSEUDO_ELEMENT_SELECTOR: {\n this._matchPseudoElementSelector(leafName);\n break;\n }\n default: {\n pending = true;\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 {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 === '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.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 and pending state\n */\n _findNodes(twig, targetType) {\n const { leaves: [leaf, ...items] } = twig;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const matchItems = items.length > 0;\n const { document, root } = this.#root;\n let nodes = new Set();\n let pending = false;\n switch (leafType) {\n case ID_SELECTOR: {\n let node;\n if (targetType === TARGET_SELF) {\n const bool = this._matchLeaves([leaf], this.#node);\n if (bool) {\n node = 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 node = refNode;\n break;\n }\n refNode = refNode.parentNode;\n }\n } else if (root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n node = root.getElementById(leafName);\n }\n if (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 break;\n }\n case CLASS_SELECTOR: {\n const arr = [];\n if (targetType === TARGET_SELF) {\n if (this.#node.nodeType === ELEMENT_NODE &&\n this.#node.classList.contains(leafName)) {\n arr.push(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 arr.push(refNode);\n }\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n } else if (root.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const childNodes = [...root.children];\n for (const node of childNodes) {\n if (node.classList.contains(leafName)) {\n arr.push(node);\n }\n const a = [...node.getElementsByClassName(leafName)];\n arr.push(...a);\n }\n } else {\n const a = [...root.getElementsByClassName(leafName)];\n arr.push(...a);\n }\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 TYPE_SELECTOR: {\n const arr = [];\n if (targetType === TARGET_SELF) {\n const bool = this.#node.nodeType === ELEMENT_NODE &&\n this._matchLeaves([leaf], this.#node);\n if (bool) {\n arr.push(this.#node);\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 arr.push(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 = [...root.children];\n for (const node of childNodes) {\n if (node.localName === tagName) {\n arr.push(node);\n }\n const a = [...node.getElementsByTagName(leafName)];\n arr.push(...a);\n }\n } else {\n const a = [...root.getElementsByTagName(leafName)];\n arr.push(...a);\n }\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 PSEUDO_ELEMENT_SELECTOR: {\n this._matchPseudoElementSelector(leafName);\n break;\n }\n default: {\n const arr = [];\n if (targetType === TARGET_SELF) {\n const bool = this._matchLeaves([leaf], this.#node);\n if (bool) {\n arr.push(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 arr.push(refNode);\n }\n refNode = refNode.parentNode;\n }\n } else {\n pending = true;\n }\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 }\n }\n return {\n nodes,\n pending\n };\n }\n\n /**\n * get first twig\n * @param {Array.<object>} branch - AST branch\n * @returns {object} - find direction and twig\n */\n _getFirstTwig(branch) {\n const lastIndex = branch.length - 1;\n const firstTwig = branch[0];\n let find;\n let twig;\n if (lastIndex) {\n const lastTwig = branch[lastIndex];\n const { leaves: [{ type: lastType }] } = lastTwig;\n if (lastType === PSEUDO_ELEMENT_SELECTOR || lastType === ID_SELECTOR) {\n find = 'prev';\n twig = lastTwig;\n } else {\n find = 'next';\n twig = firstTwig;\n }\n } else {\n 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._getFirstTwig(branch);\n const { 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].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 bool = isSameOrDescendant(nextNode, this.#node);\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 }\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 { 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].find = 'prev';\n i++;\n }\n }\n return [\n this.#ast,\n this.#nodes\n ];\n }\n\n /**\n * match nodes\n * @param {string} targetType - target type\n * @returns {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, find, skip } = branches[i];\n const branchLen = branch.length;\n if (skip) {\n continue;\n } else if (branchLen) {\n const matched = this.#nodes[i];\n const lastIndex = branchLen - 1;\n if (lastIndex === 0) {\n if ((targetType === TARGET_ALL || targetType === TARGET_FIRST) &&\n this.#node.nodeType === ELEMENT_NODE) {\n for (const node of matched) {\n if (node !== this.#node) {\n if (isSameOrDescendant(node, this.#node)) {\n nodes.add(node);\n if (targetType === TARGET_FIRST) {\n break;\n }\n }\n }\n }\n } else if (targetType === TARGET_FIRST) {\n const [node] = [...matched];\n nodes.add(node);\n } else {\n const n = [...nodes];\n const m = [...matched];\n nodes = new Set([...n, ...m]);\n }\n } else if (find === 'next') {\n let { combo } = branch[0];\n for (const node of matched) {\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 const matchedNodes = new Set(arr);\n if (matchedNodes.size) {\n if (j === lastIndex) {\n if (targetType === TARGET_FIRST) {\n const [node] = [...matchedNodes];\n nodes.add(node);\n } else {\n const n = [...nodes];\n const m = [...matchedNodes];\n nodes = new Set([...n, ...m]);\n }\n break;\n } else {\n combo = nextCombo;\n nextNodes = matchedNodes;\n }\n } else {\n break;\n }\n }\n }\n } else {\n for (const node of matched) {\n let nextNodes = new Set([node]);\n let bool;\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 const matchedNodes = new Set(arr);\n if (matchedNodes.size) {\n bool = true;\n if (j === 0) {\n nodes.add(node);\n break;\n } else {\n nextNodes = matchedNodes;\n }\n } else {\n bool = false;\n break;\n }\n }\n if (bool && 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 {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 * sort nodes\n * @param {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 const posBit = a.compareDocumentPosition(b);\n if (posBit & DOCUMENT_POSITION_PRECEDING ||\n posBit & DOCUMENT_POSITION_CONTAINS) {\n res = 1;\n } else {\n res = -1;\n }\n return res;\n });\n }\n return arr;\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 res = nodes.has(this.#node);\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 > 1) {\n [res] = this._sortNodes(nodes);\n } else if (nodes.size) {\n [res] = [...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 const res = [];\n try {\n const nodes = this._find(TARGET_ALL);\n nodes.delete(this.#node);\n if (nodes.size > 1 && this.#sort) {\n res.push(...this._sortNodes(nodes));\n } else if (nodes.size) {\n res.push(...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", "ALPHA_NUM", "LANG_PART", "TARGET_ALL", "TARGET_FIRST", "TARGET_LINEAL", "TARGET_SELF", "FORM_ITEM", "FORM_VALIDITY", "HTML_ANCHOR", "HTML_INTERACT", "INPUT_CHECK", "INPUT_EDIT", "INPUT_RANGE", "INPUT_RESET", "INPUT_SUBMIT", "INPUT_TIME", "PSEUDO_FUNC", "PSEUDO_NTH", "LANG_CODE", "#ast", "#bit", "#cache", "#node", "#nodes", "#root", "#selector", "#sort", "#warn", "selector", "node", "opt", "sort", "warn", "e", "document", "root", "parent", "leaves", "arr", "a", "b", "typeA", "typeB", "bitA", "bitB", "res", "ast", "branches", "tree", "nodes", "i", "items", "branch", "item", "nextItem", "msg", "anb", "reverse", "parentNode", "matched", "selectorBranches", "l", "selectorNodes", "branchesLen", "refNode", "bool", "current", "nth", "j", "localName", "prefix", "itemLocalName", "itemPrefix", "nthName", "nthIdentName", "identName", "anbMap", "astName", "forgive", "dir", "reg", "langMain", "langSub", "langRest", "extendedMain", "extendedSub", "len", "extendedRest", "value", "leaf", "leafType", "combo", "twigLeaves", "itemType", "twig", "nextNode", "astData", "twigBranches", "lastIndex", "nextNodes", "m", "matchedNodes", "astChildren", "selectors", "css", "leavesSet", "documentElement", "docURL", "attrURL", "hash", "isCustomElementName", "targetNode", "nodeName", "checked", "form", "iterator", "isMultiple", "firstOpt", "defaultOpt", "inputType", "node1", "node2", "astFlags", "astMatcher", "astValue", "attributes", "caseInsensitive", "astAttrName", "attrValues", "astAttrPrefix", "astAttrLocalName", "itemName", "itemValue", "itemNamePrefix", "itemNameLocalName", "astAttrIdentValue", "astAttrStringValue", "attrValue", "id", "astPrefix", "astNodeName", "nodePrefix", "type", "baseNode", "leafName", "matchItems", "pending", "elm", "comboName", "find", "childNodes", "targetType", "tagName", "firstTwig", "lastTwig", "lastType", "pendingItems", "pendingItem", "index", "skip", "branchLen", "nextCombo", "n", "posBit"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/src/index.js
CHANGED
package/src/js/matcher.js
CHANGED
|
@@ -20,13 +20,15 @@ import {
|
|
|
20
20
|
ID_SELECTOR, NOT_SUPPORTED_ERR, PSEUDO_CLASS_SELECTOR,
|
|
21
21
|
PSEUDO_ELEMENT_SELECTOR, SHOW_ELEMENT, SYNTAX_ERR, TEXT_NODE, TYPE_SELECTOR
|
|
22
22
|
} from './constant.js';
|
|
23
|
+
const ALPHA_NUM = '[A-Z\\d]+';
|
|
24
|
+
const LANG_PART = `(?:-${ALPHA_NUM})*`;
|
|
23
25
|
const TARGET_ALL = 'all';
|
|
24
26
|
const TARGET_FIRST = 'first';
|
|
25
27
|
const TARGET_LINEAL = 'lineal';
|
|
26
28
|
const TARGET_SELF = 'self';
|
|
27
29
|
|
|
28
30
|
/* regexp */
|
|
29
|
-
const
|
|
31
|
+
const FORM_ITEM =
|
|
30
32
|
/^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/;
|
|
31
33
|
const FORM_VALIDITY = /^(?:(?:(?:in|out)pu|selec)t|button|form|textarea)$/;
|
|
32
34
|
const HTML_ANCHOR = /^a(?:rea)?$/;
|
|
@@ -39,6 +41,7 @@ const INPUT_SUBMIT = /^(?:image|submit)$/;
|
|
|
39
41
|
const INPUT_TIME = /^(?:date(?:time-local)?|month|time|week)$/;
|
|
40
42
|
const PSEUDO_FUNC = /^(?:(?:ha|i)s|not|where)$/;
|
|
41
43
|
const PSEUDO_NTH = /^nth-(?:last-)?(?:child|of-type)$/;
|
|
44
|
+
const LANG_CODE = new RegExp(`^(?:\\*-)?${ALPHA_NUM}${LANG_PART}$`, 'i');
|
|
42
45
|
|
|
43
46
|
/**
|
|
44
47
|
* Matcher
|
|
@@ -603,30 +606,28 @@ export class Matcher {
|
|
|
603
606
|
parent = parent.parentNode;
|
|
604
607
|
}
|
|
605
608
|
}
|
|
606
|
-
} else if (
|
|
607
|
-
const alphaNum = '[A-Z\\d]+';
|
|
608
|
-
const codePart = `(?:-${alphaNum})*`;
|
|
609
|
+
} else if (LANG_CODE.test(astName)) {
|
|
609
610
|
let reg;
|
|
610
611
|
if (/-/.test(astName)) {
|
|
611
612
|
const [langMain, langSub, ...langRest] = astName.split('-');
|
|
612
613
|
let extendedMain;
|
|
613
614
|
if (langMain === '*') {
|
|
614
|
-
extendedMain = `${
|
|
615
|
+
extendedMain = `${ALPHA_NUM}${LANG_PART}`;
|
|
615
616
|
} else {
|
|
616
|
-
extendedMain = `${langMain}${
|
|
617
|
+
extendedMain = `${langMain}${LANG_PART}`;
|
|
617
618
|
}
|
|
618
|
-
const extendedSub = `-${langSub}${
|
|
619
|
+
const extendedSub = `-${langSub}${LANG_PART}`;
|
|
619
620
|
const len = langRest.length;
|
|
620
621
|
let extendedRest = '';
|
|
621
622
|
if (len) {
|
|
622
623
|
for (let i = 0; i < len; i++) {
|
|
623
|
-
extendedRest += `-${langRest[i]}${
|
|
624
|
+
extendedRest += `-${langRest[i]}${LANG_PART}`;
|
|
624
625
|
}
|
|
625
626
|
}
|
|
626
627
|
reg =
|
|
627
628
|
new RegExp(`^${extendedMain}${extendedSub}${extendedRest}$`, 'i');
|
|
628
629
|
} else {
|
|
629
|
-
reg = new RegExp(`^${astName}${
|
|
630
|
+
reg = new RegExp(`^${astName}${LANG_PART}$`, 'i');
|
|
630
631
|
}
|
|
631
632
|
if (node.hasAttribute('lang')) {
|
|
632
633
|
if (reg.test(node.getAttribute('lang'))) {
|
|
@@ -979,7 +980,7 @@ export class Matcher {
|
|
|
979
980
|
break;
|
|
980
981
|
}
|
|
981
982
|
case 'disabled': {
|
|
982
|
-
if (
|
|
983
|
+
if (FORM_ITEM.test(localName) || isCustomElementName(localName)) {
|
|
983
984
|
if (node.disabled || node.hasAttribute('disabled')) {
|
|
984
985
|
matched.add(node);
|
|
985
986
|
} else {
|
|
@@ -999,7 +1000,7 @@ export class Matcher {
|
|
|
999
1000
|
break;
|
|
1000
1001
|
}
|
|
1001
1002
|
case 'enabled': {
|
|
1002
|
-
if ((
|
|
1003
|
+
if ((FORM_ITEM.test(localName) || isCustomElementName(localName)) &&
|
|
1003
1004
|
!(node.disabled && node.hasAttribute('disabled'))) {
|
|
1004
1005
|
matched.add(node);
|
|
1005
1006
|
}
|