diff --git a/dist/cjs/js/finder.js b/dist/cjs/js/finder.js index 48529320..843ce950 100644 --- a/dist/cjs/js/finder.js +++ b/dist/cjs/js/finder.js @@ -1,2 +1,2 @@ -var H=Object.create;var P=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var V=(x,a)=>{for(var e in a)P(x,e,{get:a[e],enumerable:!0})},I=(x,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let i of B(a))!q.call(x,i)&&i!==e&&P(x,i,{get:()=>a[i],enumerable:!(r=j(a,i))||r.enumerable});return x};var z=(x,a,e)=>(e=x!=null?H(G(x)):{},I(a||!x||!x.__esModule?P(e,"default",{value:x,enumerable:!0}):e,x)),X=x=>I(P({},"__esModule",{value:!0}),x);var K={};V(K,{Finder:()=>Y});module.exports=X(K);var W=z(require("is-potential-custom-element-name"),1),F=z(require("nwsapi"),1),A=require("./dom-util.js"),M=require("./matcher.js"),S=require("./parser.js"),f=require("./constant.js");const C="next",O="prev",L="all",$="first",R="lineal",D="self",U=f.SHOW_DOCUMENT|f.SHOW_DOCUMENT_FRAGMENT|f.SHOW_ELEMENT;class Y{#l;#r;#t;#f;#i;#n;#e;#c;#w;#o;#m;#s;#h;#u;#d;#b;#a;#p;constructor(a){this.#p=a,this.#i=a.document,this.#r=new WeakMap,this.#m=new WeakMap,this.#o=(0,F.default)({document:a.document,DOMException:a.DOMException}),this.#o.configure({LOGERRORS:!1})}_onError(a){if(!this.#w)if(a instanceof DOMException||a instanceof this.#p.DOMException)if(a.name===f.NOT_SUPPORTED_ERR)this.#a&&console.warn(a.message);else throw new this.#p.DOMException(a.message,a.name);else throw a}_setup(a,e,r={},i=!1){const{noexcept:s,warn:n}=r;return this.#w=!!s,this.#a=!!n,this.#e=e,[this.#t,this.#s]=(0,A.resolveContent)(e),this.#h=(0,A.isInShadowTree)(e),i||this._correspond(a),e}_correspond(a){const e=[];let r,i=this.#t&&this.#r.get(this.#t);if(this.#f=!1,this.#u=!1,i&&i.has(`${a}`)){const s=i.get(`${a}`);r=s.ast,this.#f=s.descendant,this.#u=s.sibling}if(r){const s=r.length;for(let n=0;n]$/.test(m)&&(o=!0),l.push({combo:h,leaves:(0,S.sortAST)(d)}),d.clear()}else if(h){let{name:w}=h;w&&typeof w=="string"&&(w=(0,S.unescapeSelector)(w),/[|:]/.test(w)&&(h.namespace=!0)),d.add(h)}if(t.length)h=t.shift();else{l.push({combo:null,leaves:(0,S.sortAST)(d)}),d.clear();break}}}r.push({branch:l,dir:null,filtered:!1,find:!1}),e[c]=[],c++}this.#t&&(i||(i=new Map),i.set(`${a}`,{ast:r,descendant:o,sibling:b}),this.#r.set(this.#t,i)),this.#f=o,this.#u=b}return this.#l=r,this.#c=e,[r,e]}_prepareTreeWalkers(a){return this.#b=this.#i.createTreeWalker(this.#s,U),this.#n=this.#i.createTreeWalker(a,U),this.#d=!1,[this.#b,this.#n]}_traverse(a={},e=this.#b){let r,i=e.currentNode;if(a.nodeType===f.ELEMENT_NODE&&i===a)r=i;else{if(i!==e.root)for(;i&&!(i===e.root||a.nodeType===f.ELEMENT_NODE&&i===a);)i=e.parentNode();if(a.nodeType===f.ELEMENT_NODE)for(;i;){if(i===a){r=i;break}i=e.nextNode()}else r=i}return r??null}_collectNthChild(a,e,r){const{a:i,b:s,reverse:n,selector:o}=a,{parentNode:b}=e,c=new Set;let t;if(o&&(this.#r.has(o)?t=this.#r.get(o):(t=(0,S.walkAST)(o),this.#r.set(o,t))),b){const l=this.#i.createTreeWalker(b,U);let h=0,d=l.firstChild();for(;d;)h++,d=l.nextSibling();d=this._traverse(b,l);const w=new Set;if(t)for(d=this._traverse(b,l),d=l.firstChild();d;){let m;for(const k of t)if(m=this._matchLeaves(k,d,r),!m)break;m&&w.add(d),d=l.nextSibling()}if(i===0){if(s>0&&s<=h){if(w.size){let m=0;for(d=this._traverse(b,l),n?d=l.lastChild():d=l.firstChild();d;){if(w.has(d)){if(m===s-1){c.add(d);break}m++}n?d=l.previousSibling():d=l.nextSibling()}}else if(!o){let m=0;for(d=this._traverse(b,l),n?d=l.lastChild():d=l.firstChild();d;){if(m===s-1){c.add(d);break}n?d=l.previousSibling():d=l.nextSibling(),m++}}}}else{let m=s-1;if(i>0)for(;m<0;)m+=i;if(m>=0&&m0?0:s-1;for(d=this._traverse(b,l),n?d=l.lastChild():d=l.firstChild();d&&(d&&m>=0&&m0?_++:_--):k===m&&(o||c.add(d),m+=i),n?d=l.previousSibling():d=l.nextSibling(),k++}}if(n&&c.size>1){const m=[...c];return new Set(m.reverse())}}else if(e===this.#s&&i+s===1)if(t){let l;for(const h of t)if(l=this._matchLeaves(h,e,r),l)break;l&&c.add(e)}else c.add(e);return c}_collectNthOfType(a,e){const{a:r,b:i,reverse:s}=a,{localName:n,parentNode:o,prefix:b}=e,c=new Set;if(o){const t=this.#i.createTreeWalker(o,U);let l=0,h=t.firstChild();for(;h;)l++,h=t.nextSibling();if(r===0){if(i>0&&i<=l){let d=0;for(h=this._traverse(o,t),s?h=t.lastChild():h=t.firstChild();h;){const{localName:w,prefix:m}=h;if(w===n&&m===b){if(d===i-1){c.add(h);break}d++}s?h=t.previousSibling():h=t.nextSibling()}}}else{let d=i-1;if(r>0)for(;d<0;)d+=r;if(d>=0&&d0?0:i-1;for(h=this._traverse(o,t),s?h=t.lastChild():h=t.firstChild();h;){const{localName:m,prefix:k}=h;if(m===n&&k===b){if(w===d&&(c.add(h),d+=r),d<0||d>=l)break;r>0?w++:w--}s?h=t.previousSibling():h=t.nextSibling()}}}if(s&&c.size>1){const d=[...c];return new Set(d.reverse())}}else e===this.#s&&r+i===1&&c.add(e);return c}_matchAnPlusB(a,e,r,i){const{nth:{a:s,b:n,name:o},selector:b}=a,c=(0,S.unescapeSelector)(o),t=new Map;if(c?(c==="even"?(t.set("a",2),t.set("b",0)):c==="odd"&&(t.set("a",2),t.set("b",1)),r.indexOf("last")>-1&&t.set("reverse",!0)):(typeof s=="string"&&/-?\d+/.test(s)?t.set("a",s*1):t.set("a",0),typeof n=="string"&&/-?\d+/.test(n)?t.set("b",n*1):t.set("b",0),r.indexOf("last")>-1&&t.set("reverse",!0)),/^nth-(?:last-)?child$/.test(r)){b&&t.set("selector",b);const l=Object.fromEntries(t);return this._collectNthChild(l,e,i)}else if(/^nth-(?:last-)?of-type$/.test(r)){const l=Object.fromEntries(t);return this._collectNthOfType(l,e)}return new Set}_matchDirectionPseudoClass(a,e){const r=(0,S.unescapeSelector)(a.name),i=(0,A.getDirectionality)(e);let s;return r===i&&(s=e),s??null}_matchLanguagePseudoClass(a,e){const r=(0,S.unescapeSelector)(a.name);let i;if(r==="*")if(e.hasAttribute("lang"))e.getAttribute("lang")&&(i=e);else{let s=e.parentNode;for(;s&&s.nodeType===f.ELEMENT_NODE;){if(s.hasAttribute("lang")){s.getAttribute("lang")&&(i=e);break}s=s.parentNode}}else if(r){const s=`(?:-${f.ALPHA_NUM})*`;if(new RegExp(`^(?:\\*-)?${f.ALPHA_NUM}${s}$`,"i").test(r)){let o;if(r.indexOf("-")>-1){const[b,c,...t]=r.split("-");let l;b==="*"?l=`${f.ALPHA_NUM}${s}`:l=`${b}${s}`;const h=`-${c}${s}`,d=t.length;let w="";if(d)for(let m=0;m0){let k=new Set([e]);for(let _=w-1;_>=0;_--){const y=d[_],u=[];r.dir=O;for(const p of k){const g=this._matchCombinator(y,p,r);g.size&&u.push(...g)}if(u.length)_===0?l=!0:k=new Set(u);else{l=!1;break}}}if(l)break}i==="not"?l||(b=e):l&&(b=e)}return b??null}_matchPseudoClassSelector(a,e,r={}){const{children:i}=a,{localName:s,parentNode:n}=e,{forgive:o,warn:b=this.#a}=r,c=(0,S.unescapeSelector)(a.name),t=new Set;if(f.REG_LOGICAL_PSEUDO.test(c)){let l;if(this.#r.has(a))l=this.#r.get(a);else{const d=(0,S.walkAST)(a),w=[],m=[];for(const[...k]of d){for(const p of k){const g=(0,S.generateCSS)(p);w.push(g)}const _=[],y=new Set;let u=k.shift();for(;u;)if(u.type===f.COMBINATOR?(_.push({combo:u,leaves:[...y]}),y.clear()):u&&y.add(u),k.length)u=k.shift();else{_.push({combo:null,leaves:[...y]}),y.clear();break}m.push(_)}l={astName:c,branches:d,twigBranches:m,selector:w.join(",")},this.#r.set(a,l)}const h=this._matchLogicalPseudoFunc(l,e,r);h&&t.add(h)}else if(Array.isArray(i)){const[l]=i;if(/^nth-(?:last-)?(?:child|of-type)$/.test(c))return this._matchAnPlusB(l,e,c,r);if(c==="dir"){const h=this._matchDirectionPseudoClass(l,e);h&&t.add(h)}else if(c==="lang"){const h=this._matchLanguagePseudoClass(l,e);h&&t.add(h)}else switch(c){case"current":case"nth-col":case"nth-last-col":{if(b){const h=`Unsupported pseudo-class :${c}()`;throw new DOMException(h,f.NOT_SUPPORTED_ERR)}break}case"host":case"host-context":break;default:if(!o){const h=`Unknown pseudo-class :${c}()`;throw new DOMException(h,f.SYNTAX_ERR)}}}else{const l=/^a(?:rea)?$/,h=/^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/,d=/^(?:(?:inpu|selec)t|button|form|textarea)$/,w=/^d(?:etails|ialog)$/,m=/^(?:checkbox|radio)$/,k=/^(?:date(?:time-local)?|month|time|week)$/,_=/(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/,y=/^(?:(?:emai|te|ur)l|number|password|search|text)$/;switch(c){case"any-link":case"link":{l.test(s)&&e.hasAttribute("href")&&t.add(e);break}case"local-link":{if(l.test(s)&&e.hasAttribute("href")){const{href:u,origin:p,pathname:g}=new URL(this.#t.URL),N=new URL(e.getAttribute("href"),u);N.origin===p&&N.pathname===g&&t.add(e)}break}case"visited":break;case"target":{const{hash:u}=new URL(this.#t.URL);e.id&&u===`#${e.id}`&&this.#t.contains(e)&&t.add(e);break}case"target-within":{const{hash:u}=new URL(this.#t.URL);if(u){const p=u.replace(/^#/,"");let g=this.#t.getElementById(p);for(;g;){if(g===e){t.add(e);break}g=g.parentNode}}break}case"scope":{this.#e.nodeType===f.ELEMENT_NODE?!this.#h&&e===this.#e&&t.add(e):e===this.#t.documentElement&&t.add(e);break}case"focus":{if(e===this.#t.activeElement){let u=!0,p=e;for(;p;){if(p.hasAttribute("hidden")){u=!1;break}else if(p.hasAttribute("style")){const{display:g,visibility:N}=p.style;if(u=!(g==="none"||N==="hidden"),!u)break}if(p.parentNode&&p.parentNode.nodeType===f.ELEMENT_NODE)p=p.parentNode;else break}u&&t.add(e)}break}case"focus-within":{let u,p=this.#t.activeElement;for(;p;){if(p===e){u=!0;break}p=p.parentNode}if(u){let g=!0,N=e;for(;N;){if(N.hasAttribute("hidden")){g=!1;break}else if(N.hasAttribute("style")){const{display:E,visibility:T}=N.style;if(g=!(E==="none"||T==="hidden"),!g)break}if(N.parentNode&&N.parentNode.nodeType===f.ELEMENT_NODE)N=N.parentNode;else break}g&&t.add(e)}break}case"open":{w.test(s)&&e.hasAttribute("open")&&t.add(e);break}case"closed":{w.test(s)&&!e.hasAttribute("open")&&t.add(e);break}case"disabled":{if(h.test(s)||(0,W.default)(s))if(e.disabled||e.hasAttribute("disabled"))t.add(e);else{let u=n;for(;u&&u.localName!=="fieldset";)u=u.parentNode;u&&n.localName!=="legend"&&u.hasAttribute("disabled")&&t.add(e)}break}case"enabled":{(h.test(s)||(0,W.default)(s))&&!(e.disabled&&e.hasAttribute("disabled"))&&t.add(e);break}case"read-only":{switch(s){case"textarea":{(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}case"input":{(!e.type||k.test(e.type)||y.test(e.type))&&(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}default:(0,A.isContentEditable)(e)||t.add(e)}break}case"read-write":{switch(s){case"textarea":{e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled")||t.add(e);break}case"input":{(!e.type||k.test(e.type)||y.test(e.type))&&!(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}default:(0,A.isContentEditable)(e)&&t.add(e)}break}case"placeholder-shown":{let u;s==="textarea"?u=e:s==="input"&&(e.hasAttribute("type")?y.test(e.getAttribute("type"))&&(u=e):u=e),u&&e.value===""&&e.hasAttribute("placeholder")&&e.getAttribute("placeholder").trim().length&&t.add(e);break}case"checked":{(e.checked&&s==="input"&&e.hasAttribute("type")&&m.test(e.getAttribute("type"))||e.selected&&s==="option")&&t.add(e);break}case"indeterminate":{if(e.indeterminate&&s==="input"&&e.type==="checkbox"||s==="progress"&&!e.hasAttribute("value"))t.add(e);else if(s==="input"&&e.type==="radio"&&!e.hasAttribute("checked")){const u=e.name;let p=e.parentNode;for(;p&&p.localName!=="form";)p=p.parentNode;p||(p=this.#t.documentElement);let g;const N=p.getElementsByTagName("input"),E=N.length;if(E)for(let T=0;T0;let c=new Set,t=!1;if(this.#h)t=!0;else switch(n){case f.SELECTOR_PSEUDO_ELEMENT:{(0,M.matchPseudoElementSelector)(o,r);break}case f.SELECTOR_ID:{if(this.#s.nodeType===f.ELEMENT_NODE)t=!0;else{const l=this.#s.getElementById(o);l&&l!==e&&e.contains(l)&&(b?this._matchLeaves(s,l,r)&&c.add(l):c.add(l))}break}case f.SELECTOR_CLASS:{const l=e.getElementsByClassName(o);c=this._matchHTMLCollection(l,{compound:b,filterLeaves:s});break}case f.SELECTOR_TYPE:{if(this.#t.contentType==="text/html"&&!/[*|]/.test(o)){const l=e.getElementsByTagName(o);c=this._matchHTMLCollection(l,{compound:b,filterLeaves:s})}else t=!0;break}default:t=!0}return{nodes:c,pending:t}}_matchCombinator(a,e,r={}){const{combo:i,leaves:s}=a,{name:n}=i,{dir:o}=r,b=new Set;if(o===C)switch(n){case"+":{const c=e.nextElementSibling;c&&this._matchLeaves(s,c,r)&&b.add(c);break}case"~":{const{parentNode:c}=e;if(c){const t=this.#i.createTreeWalker(c,f.SHOW_ELEMENT);let l=this._traverse(e,t);for(l===e&&(l=t.nextSibling());l;)this._matchLeaves(s,l,r)&&b.add(l),l=t.nextSibling()}break}case">":{const c=this.#i.createTreeWalker(e,f.SHOW_ELEMENT);let t=c.firstChild();for(;t;)this._matchLeaves(s,t,r)&&b.add(t),t=c.nextSibling();break}case" ":default:{const{nodes:c,pending:t}=this._findDescendantNodes(s,e);if(c.size)return c;if(t){const l=this.#i.createTreeWalker(e,f.SHOW_ELEMENT);let h=l.nextNode();for(;h;)this._matchLeaves(s,h,r)&&b.add(h),h=l.nextNode()}}}else switch(n){case"+":{const c=e.previousElementSibling;c&&this._matchLeaves(s,c,r)&&b.add(c);break}case"~":{const c=this.#i.createTreeWalker(e.parentNode,f.SHOW_ELEMENT);let t=c.firstChild();for(;t&&t!==e;)this._matchLeaves(s,t,r)&&b.add(t),t=c.nextSibling();break}case">":{const c=e.parentNode;c&&this._matchLeaves(s,c,r)&&b.add(c);break}case" ":default:{const c=[];let t=e.parentNode;for(;t;)this._matchLeaves(s,t,r)&&c.push(t),t=t.parentNode;if(c.length)return new Set(c.reverse())}}return b}_findNode(a,e={}){const{node:r}=e;let i,s=this._traverse(r,this.#n);if(s)for(s.nodeType!==f.ELEMENT_NODE?s=this.#n.nextNode():s===r&&s!==this.#s&&(s=this.#n.nextNode());s;){let n;if(this.#e.nodeType===f.ELEMENT_NODE?s===this.#e?n=!0:n=this.#e.contains(s):n=!0,n&&this._matchLeaves(a,s,{warn:this.#a})){i=s;break}s=this.#n.nextNode()}return i??null}_matchSelf(a){const e=[];let r=!1;return this._matchLeaves(a,this.#e,{warn:this.#a})&&(e.push(this.#e),r=!0),[e,r]}_findLineal(a,e={}){const{complex:r}=e,i=[];let s=!1,n=this._matchLeaves(a,this.#e,{warn:this.#a});if(n&&(i.push(this.#e),s=!0),!n||r){let o=this.#e.parentNode;for(;o&&(n=this._matchLeaves(a,o,{warn:this.#a}),n&&(i.push(o),s=!0),o.parentNode);)o=o.parentNode}return[i,s]}_findFirst(a){const e=[];let r=!1;const i=this._findNode(a,{node:this.#e});return i&&(e.push(i),r=!0),[e,r]}_findFromHTMLCollection(a,e={}){const{complex:r,compound:i,filterLeaves:s}=e;let n=[],o=!1,b=!1;const c=a.length;if(c)if(this.#e.nodeType===f.ELEMENT_NODE)for(let t=0;t0;let t=[],l=!1,h=!1;switch(o){case f.SELECTOR_PSEUDO_ELEMENT:{(0,M.matchPseudoElementSelector)(b,{warn:this.#a});break}case f.SELECTOR_ID:{if(e===D)[t,l]=this._matchSelf(i);else if(e===R)[t,l]=this._findLineal(i,{complex:r});else if(e===$&&this.#s.nodeType!==f.ELEMENT_NODE){const d=this.#s.getElementById(b);d&&(c?this._matchLeaves(n,d,{warn:this.#a})&&(t.push(d),l=!0):(t.push(d),l=!0))}else h=!0;break}case f.SELECTOR_CLASS:{if(e===D)[t,l]=this._matchSelf(i);else if(e===R)[t,l]=this._findLineal(i,{complex:r});else if(e===$)[t,l]=this._findFirst(i);else if(this.#s.nodeType===f.DOCUMENT_NODE){const d=this.#s.getElementsByClassName(b);[t,l,h]=this._findFromHTMLCollection(d,{complex:r,compound:c,filterLeaves:n})}else h=!0;break}case f.SELECTOR_TYPE:{if(e===D)[t,l]=this._matchSelf(i);else if(e===R)[t,l]=this._findLineal(i,{complex:r});else if(this.#t.contentType==="text/html"&&this.#s.nodeType===f.DOCUMENT_NODE&&!/[*|]/.test(b)){const d=this.#s.getElementsByTagName(b);[t,l,h]=this._findFromHTMLCollection(d,{complex:r,compound:c,filterLeaves:n})}else h=!0;break}default:if(e!==R&&f.REG_SHADOW_HOST.test(b)){if(this.#h&&this.#e.nodeType===f.DOCUMENT_FRAGMENT_NODE){const d=this._matchShadowHostPseudoClass(s,this.#e);d&&(t.push(d),l=!0)}}else e===D?[t,l]=this._matchSelf(i):e===R?[t,l]=this._findLineal(i,{complex:r}):e===$?[t,l]=this._findFirst(i):h=!0}return{compound:c,filtered:l,nodes:t,pending:h}}_getEntryTwig(a,e){const r=a.length,i=r>1,s=a[0];let n,o;if(i){const{combo:b,leaves:[{name:c,type:t}]}=s,l=a[r-1],{leaves:[{name:h,type:d}]}=l;if(d===f.SELECTOR_PSEUDO_ELEMENT||d===f.SELECTOR_ID)n=O,o=l;else if(t===f.SELECTOR_PSEUDO_ELEMENT||t===f.SELECTOR_ID)n=C,o=s;else if(e===L)if(c==="*"&&t===f.SELECTOR_TYPE)n=O,o=l;else if(h==="*"&&d===f.SELECTOR_TYPE)n=C,o=s;else if(r===2){const{name:w}=b;/^[+~]$/.test(w)?(n=O,o=l):(n=C,o=s)}else n=C,o=s;else if(h==="*"&&d===f.SELECTOR_TYPE)n=C,o=s;else if(c==="*"&&t===f.SELECTOR_TYPE)n=O,o=l;else{let w,m;for(const{combo:k,leaves:[_]}of a){const{type:y}=_,u=(0,S.unescapeSelector)(_.name);if(y===f.SELECTOR_PSEUDO_CLASS&&u==="dir"){w=!1;break}if(k&&!m){const{name:p}=k;/^[+~]$/.test(p)&&(w=!0,m=!0)}}w?(n=C,o=s):(n=O,o=l)}}else n=O,o=s;return{complex:i,dir:n,twig:o}}_collectNodes(a){const e=this.#l.values();if(a===L||a===$){const r=new Set;let i=0;for(const{branch:s}of e){const{complex:n,dir:o,twig:b}=this._getEntryTwig(s,a),{compound:c,filtered:t,nodes:l,pending:h}=this._findEntryNodes(b,a,n);l.length?(this.#l[i].find=!0,this.#c[i]=l):h&&r.add(new Map([["index",i],["twig",b]])),this.#l[i].dir=o,this.#l[i].filtered=t||!c,i++}if(r.size){let s,n;this.#e!==this.#s&&this.#e.nodeType===f.ELEMENT_NODE?(s=this.#e,n=this.#n):(s=this.#s,n=this.#b);let o=this._traverse(s,n);for(;o;){let b=!1;if(this.#e.nodeType===f.ELEMENT_NODE?o===this.#e?b=!0:b=this.#e.contains(o):b=!0,b)for(const c of r){const{leaves:t}=c.get("twig");if(this._matchLeaves(t,o,{warn:this.#a})){const h=c.get("index");this.#l[h].filtered=!0,this.#l[h].find=!0,this.#c[h].push(o)}}o=n.nextNode()}}}else{let r=0;for(const{branch:i}of e){const s=i[i.length-1],n=i.length>1,{compound:o,filtered:b,nodes:c}=this._findEntryNodes(s,a,n);c.length&&(this.#l[r].find=!0,this.#c[r]=c),this.#l[r].dir=O,this.#l[r].filtered=b||!o,r++}}return[this.#l,this.#c]}_matchNodes(a){const[...e]=this.#l,r=e.length;let i=new Set;for(let s=0;s1;if((a===L||a===$)&&this.#e.nodeType===f.ELEMENT_NODE)for(let m=0;m=0;y--){const u=n[y],p=[];for(const g of _){const N=this._matchCombinator(u,g,{dir:o,warn:this.#a});N.size&&p.push(...N)}if(p.length)y===0?(i.add(k),w=!0,a===L&&c>1&&i.size>1&&(this.#d=!0)):(_=new Set(p),w=!1);else{w=!1;break}}if(w&&a!==L)break}if(!w&&a===$){const[m]=[...t];let k=this._findNode(d,{node:m});for(;k;){let _=new Set([k]);for(let y=h-1;y>=0;y--){const u=n[y],p=[];for(const g of _){const N=this._matchCombinator(u,g,{dir:o,warn:this.#a});N.size&&p.push(...N)}if(p.length)y===0?(i.add(k),w=!0):(_=new Set(p),w=!1);else{w=!1;break}}if(w)break;k=this._findNode(d,{node:k}),_=new Set([k])}}}}}return i}_find(a){return this._collectNodes(a),this._matchNodes(a)}matches(a,e,r){let i;try{if(e.nodeType!==f.ELEMENT_NODE){const s=`Unexpected node ${e.nodeName}`;throw new TypeError(s)}this.#e=this._setup(a,e,r,!0),this.#i===this.#t&&(0,S.filterSelector)(a)?i=this.#o.match(a,e):(this._correspond(a),i=this._find(D).size)}catch(s){this._onError(s)}return!!i}closest(a,e,r){let i;try{if(e.nodeType!==f.ELEMENT_NODE){const s=`Unexpected node ${e.nodeName}`;throw new TypeError(s)}if(this.#e=this._setup(a,e,r,!0),this.#i===this.#t&&(0,S.filterSelector)(a))i=this.#o.closest(a,e);else{this._correspond(a);const s=this._find(R);if(s.size){let n=this.#e;for(;n;){if(s.has(n)){i=n;break}n=n.parentNode}}}}catch(s){this._onError(s)}return i??null}querySelector(a,e,r){let i;try{if(this.#e=this._setup(a,e,r),this.#i===this.#t&&this.#u&&!this.#f&&(0,S.filterSelector)(a))i=this.#o.first(a,e);else{this._prepareTreeWalkers(e);const s=this._find($);s.delete(this.#e),s.size&&([i]=(0,A.sortNodes)(s))}}catch(s){this._onError(s)}return i??null}querySelectorAll(a,e,r){let i;try{if(this.#e=this._setup(a,e,r),this.#i===this.#t&&!this.#f&&(0,S.filterSelector)(a))i=this.#o.select(a,e);else{this._prepareTreeWalkers(e);const s=this._find(L);s.delete(this.#e),s.size&&(this.#d?i=(0,A.sortNodes)(s):i=[...s])}}catch(s){this._onError(s)}return i??[]}}0&&(module.exports={Finder}); +var H=Object.create;var P=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var V=(x,a)=>{for(var e in a)P(x,e,{get:a[e],enumerable:!0})},I=(x,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let i of B(a))!q.call(x,i)&&i!==e&&P(x,i,{get:()=>a[i],enumerable:!(r=j(a,i))||r.enumerable});return x};var z=(x,a,e)=>(e=x!=null?H(G(x)):{},I(a||!x||!x.__esModule?P(e,"default",{value:x,enumerable:!0}):e,x)),X=x=>I(P({},"__esModule",{value:!0}),x);var K={};V(K,{Finder:()=>Y});module.exports=X(K);var W=z(require("is-potential-custom-element-name"),1),F=z(require("nwsapi"),1),A=require("./dom-util.js"),M=require("./matcher.js"),S=require("./parser.js"),f=require("./constant.js");const C="next",O="prev",L="all",$="first",R="lineal",D="self",U=f.SHOW_DOCUMENT|f.SHOW_DOCUMENT_FRAGMENT|f.SHOW_ELEMENT;class Y{#l;#r;#s;#f;#i;#n;#e;#c;#w;#o;#m;#t;#h;#u;#d;#b;#a;#p;constructor(a){this.#p=a,this.#i=a.document,this.#r=new WeakMap,this.#m=new WeakMap,this.#o=(0,F.default)({document:a.document,DOMException:a.DOMException}),this.#o.configure({LOGERRORS:!1})}_onError(a){if(!this.#w)if(a instanceof DOMException||a instanceof this.#p.DOMException)if(a.name===f.NOT_SUPPORTED_ERR)this.#a&&console.warn(a.message);else throw new this.#p.DOMException(a.message,a.name);else throw a}_setup(a,e,r={}){const{noexcept:i,warn:s}=r;return this.#w=!!i,this.#a=!!s,this.#e=e,[this.#s,this.#t]=(0,A.resolveContent)(e),this.#h=(0,A.isInShadowTree)(e),this._correspond(a),e}_correspond(a){const e=[];let r,i=this.#s&&this.#r.get(this.#s);if(this.#f=!1,this.#u=!1,i&&i.has(`${a}`)){const s=i.get(`${a}`);r=s.ast,this.#f=s.descendant,this.#u=s.sibling}if(r){const s=r.length;for(let c=0;c]$/.test(m)&&(o=!0),l.push({combo:h,leaves:(0,S.sortAST)(d)}),d.clear()}else if(h){let{name:w}=h;w&&typeof w=="string"&&(w=(0,S.unescapeSelector)(w),/[|:]/.test(w)&&(h.namespace=!0)),d.add(h)}if(t.length)h=t.shift();else{l.push({combo:null,leaves:(0,S.sortAST)(d)}),d.clear();break}}}r.push({branch:l,dir:null,filtered:!1,find:!1}),e[n]=[],n++}this.#s&&(i||(i=new Map),i.set(`${a}`,{ast:r,descendant:o,sibling:b}),this.#r.set(this.#s,i)),this.#f=o,this.#u=b}return this.#l=r,this.#c=e,[r,e]}_prepareTreeWalkers(a){return this.#b=this.#i.createTreeWalker(this.#t,U),this.#n=this.#i.createTreeWalker(a,U),this.#d=!1,[this.#b,this.#n]}_traverse(a={},e=this.#b){let r,i=e.currentNode;if(a.nodeType===f.ELEMENT_NODE&&i===a)r=i;else{if(i!==e.root)for(;i&&!(i===e.root||a.nodeType===f.ELEMENT_NODE&&i===a);)i=e.parentNode();if(a.nodeType===f.ELEMENT_NODE)for(;i;){if(i===a){r=i;break}i=e.nextNode()}else r=i}return r??null}_collectNthChild(a,e,r){const{a:i,b:s,reverse:c,selector:o}=a,{parentNode:b}=e,n=new Set;let t;if(o&&(this.#r.has(o)?t=this.#r.get(o):(t=(0,S.walkAST)(o),this.#r.set(o,t))),b){const l=this.#i.createTreeWalker(b,U);let h=0,d=l.firstChild();for(;d;)h++,d=l.nextSibling();d=this._traverse(b,l);const w=new Set;if(t)for(d=this._traverse(b,l),d=l.firstChild();d;){let m;for(const k of t)if(m=this._matchLeaves(k,d,r),!m)break;m&&w.add(d),d=l.nextSibling()}if(i===0){if(s>0&&s<=h){if(w.size){let m=0;for(d=this._traverse(b,l),c?d=l.lastChild():d=l.firstChild();d;){if(w.has(d)){if(m===s-1){n.add(d);break}m++}c?d=l.previousSibling():d=l.nextSibling()}}else if(!o){let m=0;for(d=this._traverse(b,l),c?d=l.lastChild():d=l.firstChild();d;){if(m===s-1){n.add(d);break}c?d=l.previousSibling():d=l.nextSibling(),m++}}}}else{let m=s-1;if(i>0)for(;m<0;)m+=i;if(m>=0&&m0?0:s-1;for(d=this._traverse(b,l),c?d=l.lastChild():d=l.firstChild();d&&(d&&m>=0&&m0?_++:_--):k===m&&(o||n.add(d),m+=i),c?d=l.previousSibling():d=l.nextSibling(),k++}}if(c&&n.size>1){const m=[...n];return new Set(m.reverse())}}else if(e===this.#t&&i+s===1)if(t){let l;for(const h of t)if(l=this._matchLeaves(h,e,r),l)break;l&&n.add(e)}else n.add(e);return n}_collectNthOfType(a,e){const{a:r,b:i,reverse:s}=a,{localName:c,parentNode:o,prefix:b}=e,n=new Set;if(o){const t=this.#i.createTreeWalker(o,U);let l=0,h=t.firstChild();for(;h;)l++,h=t.nextSibling();if(r===0){if(i>0&&i<=l){let d=0;for(h=this._traverse(o,t),s?h=t.lastChild():h=t.firstChild();h;){const{localName:w,prefix:m}=h;if(w===c&&m===b){if(d===i-1){n.add(h);break}d++}s?h=t.previousSibling():h=t.nextSibling()}}}else{let d=i-1;if(r>0)for(;d<0;)d+=r;if(d>=0&&d0?0:i-1;for(h=this._traverse(o,t),s?h=t.lastChild():h=t.firstChild();h;){const{localName:m,prefix:k}=h;if(m===c&&k===b){if(w===d&&(n.add(h),d+=r),d<0||d>=l)break;r>0?w++:w--}s?h=t.previousSibling():h=t.nextSibling()}}}if(s&&n.size>1){const d=[...n];return new Set(d.reverse())}}else e===this.#t&&r+i===1&&n.add(e);return n}_matchAnPlusB(a,e,r,i){const{nth:{a:s,b:c,name:o},selector:b}=a,n=(0,S.unescapeSelector)(o),t=new Map;if(n?(n==="even"?(t.set("a",2),t.set("b",0)):n==="odd"&&(t.set("a",2),t.set("b",1)),r.indexOf("last")>-1&&t.set("reverse",!0)):(typeof s=="string"&&/-?\d+/.test(s)?t.set("a",s*1):t.set("a",0),typeof c=="string"&&/-?\d+/.test(c)?t.set("b",c*1):t.set("b",0),r.indexOf("last")>-1&&t.set("reverse",!0)),/^nth-(?:last-)?child$/.test(r)){b&&t.set("selector",b);const l=Object.fromEntries(t);return this._collectNthChild(l,e,i)}else if(/^nth-(?:last-)?of-type$/.test(r)){const l=Object.fromEntries(t);return this._collectNthOfType(l,e)}return new Set}_matchDirectionPseudoClass(a,e){const r=(0,S.unescapeSelector)(a.name),i=(0,A.getDirectionality)(e);let s;return r===i&&(s=e),s??null}_matchLanguagePseudoClass(a,e){const r=(0,S.unescapeSelector)(a.name);let i;if(r==="*")if(e.hasAttribute("lang"))e.getAttribute("lang")&&(i=e);else{let s=e.parentNode;for(;s&&s.nodeType===f.ELEMENT_NODE;){if(s.hasAttribute("lang")){s.getAttribute("lang")&&(i=e);break}s=s.parentNode}}else if(r){const s=`(?:-${f.ALPHA_NUM})*`;if(new RegExp(`^(?:\\*-)?${f.ALPHA_NUM}${s}$`,"i").test(r)){let o;if(r.indexOf("-")>-1){const[b,n,...t]=r.split("-");let l;b==="*"?l=`${f.ALPHA_NUM}${s}`:l=`${b}${s}`;const h=`-${n}${s}`,d=t.length;let w="";if(d)for(let m=0;m0){let k=new Set([e]);for(let _=w-1;_>=0;_--){const y=d[_],u=[];r.dir=O;for(const p of k){const g=this._matchCombinator(y,p,r);g.size&&u.push(...g)}if(u.length)_===0?l=!0:k=new Set(u);else{l=!1;break}}}if(l)break}i==="not"?l||(b=e):l&&(b=e)}return b??null}_matchPseudoClassSelector(a,e,r={}){const{children:i}=a,{localName:s,parentNode:c}=e,{forgive:o,warn:b=this.#a}=r,n=(0,S.unescapeSelector)(a.name),t=new Set;if(f.REG_LOGICAL_PSEUDO.test(n)){let l;if(this.#r.has(a))l=this.#r.get(a);else{const d=(0,S.walkAST)(a),w=[],m=[];for(const[...k]of d){for(const p of k){const g=(0,S.generateCSS)(p);w.push(g)}const _=[],y=new Set;let u=k.shift();for(;u;)if(u.type===f.COMBINATOR?(_.push({combo:u,leaves:[...y]}),y.clear()):u&&y.add(u),k.length)u=k.shift();else{_.push({combo:null,leaves:[...y]}),y.clear();break}m.push(_)}l={astName:n,branches:d,twigBranches:m,selector:w.join(",")},this.#r.set(a,l)}const h=this._matchLogicalPseudoFunc(l,e,r);h&&t.add(h)}else if(Array.isArray(i)){const[l]=i;if(/^nth-(?:last-)?(?:child|of-type)$/.test(n))return this._matchAnPlusB(l,e,n,r);if(n==="dir"){const h=this._matchDirectionPseudoClass(l,e);h&&t.add(h)}else if(n==="lang"){const h=this._matchLanguagePseudoClass(l,e);h&&t.add(h)}else switch(n){case"current":case"nth-col":case"nth-last-col":{if(b){const h=`Unsupported pseudo-class :${n}()`;throw new DOMException(h,f.NOT_SUPPORTED_ERR)}break}case"host":case"host-context":break;default:if(!o){const h=`Unknown pseudo-class :${n}()`;throw new DOMException(h,f.SYNTAX_ERR)}}}else{const l=/^a(?:rea)?$/,h=/^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/,d=/^(?:(?:inpu|selec)t|button|form|textarea)$/,w=/^d(?:etails|ialog)$/,m=/^(?:checkbox|radio)$/,k=/^(?:date(?:time-local)?|month|time|week)$/,_=/(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/,y=/^(?:(?:emai|te|ur)l|number|password|search|text)$/;switch(n){case"any-link":case"link":{l.test(s)&&e.hasAttribute("href")&&t.add(e);break}case"local-link":{if(l.test(s)&&e.hasAttribute("href")){const{href:u,origin:p,pathname:g}=new URL(this.#s.URL),N=new URL(e.getAttribute("href"),u);N.origin===p&&N.pathname===g&&t.add(e)}break}case"visited":break;case"target":{const{hash:u}=new URL(this.#s.URL);e.id&&u===`#${e.id}`&&this.#s.contains(e)&&t.add(e);break}case"target-within":{const{hash:u}=new URL(this.#s.URL);if(u){const p=u.replace(/^#/,"");let g=this.#s.getElementById(p);for(;g;){if(g===e){t.add(e);break}g=g.parentNode}}break}case"scope":{this.#e.nodeType===f.ELEMENT_NODE?!this.#h&&e===this.#e&&t.add(e):e===this.#s.documentElement&&t.add(e);break}case"focus":{if(e===this.#s.activeElement){let u=!0,p=e;for(;p;){if(p.hasAttribute("hidden")){u=!1;break}else if(p.hasAttribute("style")){const{display:g,visibility:N}=p.style;if(u=!(g==="none"||N==="hidden"),!u)break}if(p.parentNode&&p.parentNode.nodeType===f.ELEMENT_NODE)p=p.parentNode;else break}u&&t.add(e)}break}case"focus-within":{let u,p=this.#s.activeElement;for(;p;){if(p===e){u=!0;break}p=p.parentNode}if(u){let g=!0,N=e;for(;N;){if(N.hasAttribute("hidden")){g=!1;break}else if(N.hasAttribute("style")){const{display:E,visibility:T}=N.style;if(g=!(E==="none"||T==="hidden"),!g)break}if(N.parentNode&&N.parentNode.nodeType===f.ELEMENT_NODE)N=N.parentNode;else break}g&&t.add(e)}break}case"open":{w.test(s)&&e.hasAttribute("open")&&t.add(e);break}case"closed":{w.test(s)&&!e.hasAttribute("open")&&t.add(e);break}case"disabled":{if(h.test(s)||(0,W.default)(s))if(e.disabled||e.hasAttribute("disabled"))t.add(e);else{let u=c;for(;u&&u.localName!=="fieldset";)u=u.parentNode;u&&c.localName!=="legend"&&u.hasAttribute("disabled")&&t.add(e)}break}case"enabled":{(h.test(s)||(0,W.default)(s))&&!(e.disabled&&e.hasAttribute("disabled"))&&t.add(e);break}case"read-only":{switch(s){case"textarea":{(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}case"input":{(!e.type||k.test(e.type)||y.test(e.type))&&(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}default:(0,A.isContentEditable)(e)||t.add(e)}break}case"read-write":{switch(s){case"textarea":{e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled")||t.add(e);break}case"input":{(!e.type||k.test(e.type)||y.test(e.type))&&!(e.readonly||e.hasAttribute("readonly")||e.disabled||e.hasAttribute("disabled"))&&t.add(e);break}default:(0,A.isContentEditable)(e)&&t.add(e)}break}case"placeholder-shown":{let u;s==="textarea"?u=e:s==="input"&&(e.hasAttribute("type")?y.test(e.getAttribute("type"))&&(u=e):u=e),u&&e.value===""&&e.hasAttribute("placeholder")&&e.getAttribute("placeholder").trim().length&&t.add(e);break}case"checked":{(e.checked&&s==="input"&&e.hasAttribute("type")&&m.test(e.getAttribute("type"))||e.selected&&s==="option")&&t.add(e);break}case"indeterminate":{if(e.indeterminate&&s==="input"&&e.type==="checkbox"||s==="progress"&&!e.hasAttribute("value"))t.add(e);else if(s==="input"&&e.type==="radio"&&!e.hasAttribute("checked")){const u=e.name;let p=e.parentNode;for(;p&&p.localName!=="form";)p=p.parentNode;p||(p=this.#s.documentElement);let g;const N=p.getElementsByTagName("input"),E=N.length;if(E)for(let T=0;T0;let n=new Set,t=!1;if(this.#h)t=!0;else switch(c){case f.SELECTOR_PSEUDO_ELEMENT:{(0,M.matchPseudoElementSelector)(o,r);break}case f.SELECTOR_ID:{if(this.#t.nodeType===f.ELEMENT_NODE)t=!0;else{const l=this.#t.getElementById(o);l&&l!==e&&e.contains(l)&&(b?this._matchLeaves(s,l,r)&&n.add(l):n.add(l))}break}case f.SELECTOR_CLASS:{const l=e.getElementsByClassName(o);n=this._matchHTMLCollection(l,{compound:b,filterLeaves:s});break}case f.SELECTOR_TYPE:{if(this.#s.contentType==="text/html"&&!/[*|]/.test(o)){const l=e.getElementsByTagName(o);n=this._matchHTMLCollection(l,{compound:b,filterLeaves:s})}else t=!0;break}default:t=!0}return{nodes:n,pending:t}}_matchCombinator(a,e,r={}){const{combo:i,leaves:s}=a,{name:c}=i,{dir:o}=r,b=new Set;if(o===C)switch(c){case"+":{const n=e.nextElementSibling;n&&this._matchLeaves(s,n,r)&&b.add(n);break}case"~":{const{parentNode:n}=e;if(n){const t=this.#i.createTreeWalker(n,f.SHOW_ELEMENT);let l=this._traverse(e,t);for(l===e&&(l=t.nextSibling());l;)this._matchLeaves(s,l,r)&&b.add(l),l=t.nextSibling()}break}case">":{const n=this.#i.createTreeWalker(e,f.SHOW_ELEMENT);let t=n.firstChild();for(;t;)this._matchLeaves(s,t,r)&&b.add(t),t=n.nextSibling();break}case" ":default:{const{nodes:n,pending:t}=this._findDescendantNodes(s,e);if(n.size)return n;if(t){const l=this.#i.createTreeWalker(e,f.SHOW_ELEMENT);let h=l.nextNode();for(;h;)this._matchLeaves(s,h,r)&&b.add(h),h=l.nextNode()}}}else switch(c){case"+":{const n=e.previousElementSibling;n&&this._matchLeaves(s,n,r)&&b.add(n);break}case"~":{const n=this.#i.createTreeWalker(e.parentNode,f.SHOW_ELEMENT);let t=n.firstChild();for(;t&&t!==e;)this._matchLeaves(s,t,r)&&b.add(t),t=n.nextSibling();break}case">":{const n=e.parentNode;n&&this._matchLeaves(s,n,r)&&b.add(n);break}case" ":default:{const n=[];let t=e.parentNode;for(;t;)this._matchLeaves(s,t,r)&&n.push(t),t=t.parentNode;if(n.length)return new Set(n.reverse())}}return b}_findNode(a,e={}){const{node:r}=e;let i,s=this._traverse(r,this.#n);if(s)for(s.nodeType!==f.ELEMENT_NODE?s=this.#n.nextNode():s===r&&s!==this.#t&&(s=this.#n.nextNode());s;){let c;if(this.#e.nodeType===f.ELEMENT_NODE?s===this.#e?c=!0:c=this.#e.contains(s):c=!0,c&&this._matchLeaves(a,s,{warn:this.#a})){i=s;break}s=this.#n.nextNode()}return i??null}_matchSelf(a){const e=[];let r=!1;return this._matchLeaves(a,this.#e,{warn:this.#a})&&(e.push(this.#e),r=!0),[e,r]}_findLineal(a,e={}){const{complex:r}=e,i=[];let s=!1,c=this._matchLeaves(a,this.#e,{warn:this.#a});if(c&&(i.push(this.#e),s=!0),!c||r){let o=this.#e.parentNode;for(;o&&(c=this._matchLeaves(a,o,{warn:this.#a}),c&&(i.push(o),s=!0),o.parentNode);)o=o.parentNode}return[i,s]}_findFirst(a){const e=[];let r=!1;const i=this._findNode(a,{node:this.#e});return i&&(e.push(i),r=!0),[e,r]}_findFromHTMLCollection(a,e={}){const{complex:r,compound:i,filterLeaves:s}=e;let c=[],o=!1,b=!1;const n=a.length;if(n)if(this.#e.nodeType===f.ELEMENT_NODE)for(let t=0;t0;let t=[],l=!1,h=!1;switch(o){case f.SELECTOR_PSEUDO_ELEMENT:{(0,M.matchPseudoElementSelector)(b,{warn:this.#a});break}case f.SELECTOR_ID:{if(e===D)[t,l]=this._matchSelf(i);else if(e===R)[t,l]=this._findLineal(i,{complex:r});else if(e===$&&this.#t.nodeType!==f.ELEMENT_NODE){const d=this.#t.getElementById(b);d&&(n?this._matchLeaves(c,d,{warn:this.#a})&&(t.push(d),l=!0):(t.push(d),l=!0))}else h=!0;break}case f.SELECTOR_CLASS:{if(e===D)[t,l]=this._matchSelf(i);else if(e===R)[t,l]=this._findLineal(i,{complex:r});else if(e===$)[t,l]=this._findFirst(i);else if(this.#t.nodeType===f.DOCUMENT_NODE){const d=this.#t.getElementsByClassName(b);[t,l,h]=this._findFromHTMLCollection(d,{complex:r,compound:n,filterLeaves:c})}else h=!0;break}case f.SELECTOR_TYPE:{if(e===D)[t,l]=this._matchSelf(i);else if(e===R)[t,l]=this._findLineal(i,{complex:r});else if(this.#s.contentType==="text/html"&&this.#t.nodeType===f.DOCUMENT_NODE&&!/[*|]/.test(b)){const d=this.#t.getElementsByTagName(b);[t,l,h]=this._findFromHTMLCollection(d,{complex:r,compound:n,filterLeaves:c})}else h=!0;break}default:if(e!==R&&f.REG_SHADOW_HOST.test(b)){if(this.#h&&this.#e.nodeType===f.DOCUMENT_FRAGMENT_NODE){const d=this._matchShadowHostPseudoClass(s,this.#e);d&&(t.push(d),l=!0)}}else e===D?[t,l]=this._matchSelf(i):e===R?[t,l]=this._findLineal(i,{complex:r}):e===$?[t,l]=this._findFirst(i):h=!0}return{compound:n,filtered:l,nodes:t,pending:h}}_getEntryTwig(a,e){const r=a.length,i=r>1,s=a[0];let c,o;if(i){const{combo:b,leaves:[{name:n,type:t}]}=s,l=a[r-1],{leaves:[{name:h,type:d}]}=l;if(d===f.SELECTOR_PSEUDO_ELEMENT||d===f.SELECTOR_ID)c=O,o=l;else if(t===f.SELECTOR_PSEUDO_ELEMENT||t===f.SELECTOR_ID)c=C,o=s;else if(e===L)if(n==="*"&&t===f.SELECTOR_TYPE)c=O,o=l;else if(h==="*"&&d===f.SELECTOR_TYPE)c=C,o=s;else if(r===2){const{name:w}=b;/^[+~]$/.test(w)?(c=O,o=l):(c=C,o=s)}else c=C,o=s;else if(h==="*"&&d===f.SELECTOR_TYPE)c=C,o=s;else if(n==="*"&&t===f.SELECTOR_TYPE)c=O,o=l;else{let w,m;for(const{combo:k,leaves:[_]}of a){const{type:y}=_,u=(0,S.unescapeSelector)(_.name);if(y===f.SELECTOR_PSEUDO_CLASS&&u==="dir"){w=!1;break}if(k&&!m){const{name:p}=k;/^[+~]$/.test(p)&&(w=!0,m=!0)}}w?(c=C,o=s):(c=O,o=l)}}else c=O,o=s;return{complex:i,dir:c,twig:o}}_collectNodes(a){const e=this.#l.values();if(a===L||a===$){const r=new Set;let i=0;for(const{branch:s}of e){const{complex:c,dir:o,twig:b}=this._getEntryTwig(s,a),{compound:n,filtered:t,nodes:l,pending:h}=this._findEntryNodes(b,a,c);l.length?(this.#l[i].find=!0,this.#c[i]=l):h&&r.add(new Map([["index",i],["twig",b]])),this.#l[i].dir=o,this.#l[i].filtered=t||!n,i++}if(r.size){let s,c;this.#e!==this.#t&&this.#e.nodeType===f.ELEMENT_NODE?(s=this.#e,c=this.#n):(s=this.#t,c=this.#b);let o=this._traverse(s,c);for(;o;){let b=!1;if(this.#e.nodeType===f.ELEMENT_NODE?o===this.#e?b=!0:b=this.#e.contains(o):b=!0,b)for(const n of r){const{leaves:t}=n.get("twig");if(this._matchLeaves(t,o,{warn:this.#a})){const h=n.get("index");this.#l[h].filtered=!0,this.#l[h].find=!0,this.#c[h].push(o)}}o=c.nextNode()}}}else{let r=0;for(const{branch:i}of e){const s=i[i.length-1],c=i.length>1,{compound:o,filtered:b,nodes:n}=this._findEntryNodes(s,a,c);n.length&&(this.#l[r].find=!0,this.#c[r]=n),this.#l[r].dir=O,this.#l[r].filtered=b||!o,r++}}return[this.#l,this.#c]}_matchNodes(a){const[...e]=this.#l,r=e.length;let i=new Set;for(let s=0;s1;if((a===L||a===$)&&this.#e.nodeType===f.ELEMENT_NODE)for(let m=0;m=0;y--){const u=c[y],p=[];for(const g of _){const N=this._matchCombinator(u,g,{dir:o,warn:this.#a});N.size&&p.push(...N)}if(p.length)y===0?(i.add(k),w=!0,a===L&&n>1&&i.size>1&&(this.#d=!0)):(_=new Set(p),w=!1);else{w=!1;break}}if(w&&a!==L)break}if(!w&&a===$){const[m]=[...t];let k=this._findNode(d,{node:m});for(;k;){let _=new Set([k]);for(let y=h-1;y>=0;y--){const u=c[y],p=[];for(const g of _){const N=this._matchCombinator(u,g,{dir:o,warn:this.#a});N.size&&p.push(...N)}if(p.length)y===0?(i.add(k),w=!0):(_=new Set(p),w=!1);else{w=!1;break}}if(w)break;k=this._findNode(d,{node:k}),_=new Set([k])}}}}}return i}_find(a){return this._collectNodes(a),this._matchNodes(a)}matches(a,e,r){let i;try{if(e.nodeType!==f.ELEMENT_NODE){const s=`Unexpected node ${e.nodeName}`;throw new TypeError(s)}(0,S.filterSelector)(a)?i=this.#o.match(a,e):(this.#e=this._setup(a,e,r),i=this._find(D).size)}catch(s){this._onError(s)}return!!i}closest(a,e,r){let i;try{if(e.nodeType!==f.ELEMENT_NODE){const s=`Unexpected node ${e.nodeName}`;throw new TypeError(s)}if((0,S.filterSelector)(a))i=this.#o.closest(a,e);else{this.#e=this._setup(a,e,r);const s=this._find(R);if(s.size){let c=this.#e;for(;c;){if(s.has(c)){i=c;break}c=c.parentNode}}}}catch(s){this._onError(s)}return i??null}querySelector(a,e,r){let i;try{if(this.#e=this._setup(a,e,r),this.#i===this.#s&&this.#u&&!this.#f&&(0,S.filterSelector)(a))i=this.#o.first(a,e);else{this._prepareTreeWalkers(e);const s=this._find($);s.delete(this.#e),s.size&&([i]=(0,A.sortNodes)(s))}}catch(s){this._onError(s)}return i??null}querySelectorAll(a,e,r){let i;try{if(this.#e=this._setup(a,e,r),this.#i===this.#s&&!this.#f&&(0,S.filterSelector)(a))i=this.#o.select(a,e);else{this._prepareTreeWalkers(e);const s=this._find(L);s.delete(this.#e),s.size&&(this.#d?i=(0,A.sortNodes)(s):i=[...s])}}catch(s){this._onError(s)}return i??[]}}0&&(module.exports={Finder}); //# sourceMappingURL=finder.js.map diff --git a/dist/cjs/js/finder.js.map b/dist/cjs/js/finder.js.map index 04d3e1f3..971f96f4 100644 --- a/dist/cjs/js/finder.js.map +++ b/dist/cjs/js/finder.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/js/finder.js"], - "sourcesContent": ["/**\n * finder.js\n */\n\n/* import */\nimport isCustomElementName from 'is-potential-custom-element-name';\nimport nwsapi from 'nwsapi';\nimport {\n getDirectionality, isContentEditable, isInclusive, isInShadowTree,\n resolveContent, sortNodes\n} from './dom-util.js';\nimport { matchPseudoElementSelector, matchSelector } from './matcher.js';\nimport {\n filterSelector, generateCSS, parseSelector, sortAST, unescapeSelector, walkAST\n} from './parser.js';\n\n/* constants */\nimport {\n ALPHA_NUM, COMBINATOR, DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE, ELEMENT_NODE,\n NOT_SUPPORTED_ERR, REG_LOGICAL_PSEUDO, REG_SHADOW_HOST, SELECTOR_CLASS,\n SELECTOR_ID, SELECTOR_PSEUDO_CLASS, SELECTOR_PSEUDO_ELEMENT, SELECTOR_TYPE,\n SHOW_ALL, SHOW_DOCUMENT, SHOW_DOCUMENT_FRAGMENT, SHOW_ELEMENT, SYNTAX_ERR,\n TEXT_NODE\n} from './constant.js';\nconst DIR_NEXT = 'next';\nconst DIR_PREV = 'prev';\nconst TARGET_ALL = 'all';\nconst TARGET_FIRST = 'first';\nconst TARGET_LINEAL = 'lineal';\nconst TARGET_SELF = 'self';\nconst WALKER_FILTER = SHOW_DOCUMENT | SHOW_DOCUMENT_FRAGMENT | SHOW_ELEMENT;\n\n/**\n * Finder\n * NOTE: #ast[i] corresponds to #nodes[i]\n * #ast: [\n * {\n * branch: branch[],\n * dir: string|null,\n * filtered: boolean,\n * find: boolean\n * },\n * {\n * branch: branch[],\n * dir: string|null,\n * filtered: boolean,\n * find: boolean\n * }\n * ]\n * #nodes: [\n * [node{}, node{}],\n * [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{}: CSSTree AST object\n * node{}: Element node\n */\nexport class Finder {\n /* private fields */\n #ast;\n #cache;\n #content;\n #descendant;\n #document;\n #finder;\n #node;\n #nodes;\n #noexcept;\n #nwsapi;\n #results;\n #root;\n #shadow;\n #sibling;\n #sort;\n #tree;\n #warn;\n #window;\n\n /**\n * construct\n * @param {object} window - window\n */\n constructor(window) {\n this.#window = window;\n this.#document = window.document;\n this.#cache = new WeakMap();\n this.#results = new WeakMap();\n this.#nwsapi = nwsapi({\n document: window.document,\n DOMException: window.DOMException\n });\n this.#nwsapi.configure({\n LOGERRORS: false\n });\n }\n\n /**\n * handle error\n * @private\n * @param {Error} e - Error\n * @throws Error\n * @returns {void}\n */\n _onError(e) {\n if (!this.#noexcept) {\n if (e instanceof DOMException ||\n e instanceof this.#window.DOMException) {\n if (e.name === NOT_SUPPORTED_ERR) {\n if (this.#warn) {\n console.warn(e.message);\n }\n } else {\n throw new this.#window.DOMException(e.message, e.name);\n }\n } else {\n throw e;\n }\n }\n }\n\n /**\n * setup finder\n * @private\n * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} opt - options\n * @param {boolean} [opt.noexcept] - no exception\n * @param {boolean} [opt.warn] - console warn\n * @param {boolean} skip - skip correspond\n * @returns {object} - node\n */\n _setup(selector, node, opt = {}, skip = false) {\n const { noexcept, warn } = opt;\n this.#noexcept = !!noexcept;\n this.#warn = !!warn;\n this.#node = node;\n [this.#content, this.#root] = resolveContent(node);\n this.#shadow = isInShadowTree(node);\n if (!skip) {\n this._correspond(selector);\n }\n return node;\n }\n\n /**\n * correspond ast and nodes\n * @private\n * @param {string} selector - CSS selector\n * @returns {Array.>} - array of ast and nodes\n */\n _correspond(selector) {\n const nodes = [];\n let ast;\n let cachedItem = this.#content && this.#cache.get(this.#content);\n this.#descendant = false;\n this.#sibling = false;\n if (cachedItem && cachedItem.has(`${selector}`)) {\n const item = cachedItem.get(`${selector}`);\n ast = item.ast;\n this.#descendant = item.descendant;\n this.#sibling = item.sibling;\n }\n if (ast) {\n const l = ast.length;\n for (let i = 0; i < l; i++) {\n ast[i].dir = null;\n ast[i].filtered = false;\n ast[i].find = false;\n nodes[i] = [];\n }\n } else {\n let cssAst;\n try {\n cssAst = parseSelector(selector);\n } catch (e) {\n this._onError(e);\n }\n const branches = walkAST(cssAst);\n ast = [];\n let descendant = false;\n let sibling = false;\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 selector ${selector}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n const itemName = unescapeSelector(item.name);\n if (itemName === '~') {\n sibling = true;\n } else if (/^[\\s>]$/.test(itemName)) {\n descendant = true;\n }\n branch.push({\n combo: item,\n leaves: sortAST(leaves)\n });\n leaves.clear();\n } else if (item) {\n let { name: itemName } = item;\n if (itemName && typeof itemName === 'string') {\n itemName = unescapeSelector(itemName);\n if (/[|:]/.test(itemName)) {\n item.namespace = true;\n }\n }\n leaves.add(item);\n }\n if (items.length) {\n item = items.shift();\n } else {\n branch.push({\n combo: null,\n leaves: sortAST(leaves)\n });\n leaves.clear();\n break;\n }\n }\n }\n ast.push({\n branch,\n dir: null,\n filtered: false,\n find: false\n });\n nodes[i] = [];\n i++;\n }\n if (this.#content) {\n if (!cachedItem) {\n cachedItem = new Map();\n }\n cachedItem.set(`${selector}`, {\n ast,\n descendant,\n sibling\n });\n this.#cache.set(this.#content, cachedItem);\n }\n this.#descendant = descendant;\n this.#sibling = sibling;\n }\n this.#ast = ast;\n this.#nodes = nodes;\n return [\n ast,\n nodes\n ];\n }\n\n /**\n * prepare tree walkers\n * @private\n * @param {object} node - Document, DocumentFragment, Element node\n * @returns {Array} - [#tree, #finder]\n */\n _prepareTreeWalkers(node) {\n this.#tree = this.#document.createTreeWalker(this.#root, WALKER_FILTER);\n this.#finder = this.#document.createTreeWalker(node, WALKER_FILTER);\n this.#sort = false;\n return [\n this.#tree,\n this.#finder\n ];\n }\n\n /**\n * traverse tree walker\n * @private\n * @param {object} [node] - Element node\n * @param {object} [walker] - tree walker\n * @returns {?object} - current node\n */\n _traverse(node = {}, walker = this.#tree) {\n let current;\n let refNode = walker.currentNode;\n if (node.nodeType === ELEMENT_NODE && refNode === node) {\n current = refNode;\n } else {\n if (refNode !== walker.root) {\n while (refNode) {\n if (refNode === walker.root ||\n (node.nodeType === ELEMENT_NODE && refNode === node)) {\n break;\n }\n refNode = walker.parentNode();\n }\n }\n if (node.nodeType === ELEMENT_NODE) {\n while (refNode) {\n if (refNode === node) {\n current = refNode;\n break;\n }\n refNode = walker.nextNode();\n }\n } else {\n current = refNode;\n }\n }\n return current ?? null;\n }\n\n /**\n * collect nth child\n * @private\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 * @param {object} opt - options\n * @returns {Set.} - collection of matched nodes\n */\n _collectNthChild(anb, node, opt) {\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 walker = this.#document.createTreeWalker(parentNode, WALKER_FILTER);\n let l = 0;\n let refNode = walker.firstChild();\n while (refNode) {\n l++;\n refNode = walker.nextSibling();\n }\n refNode = this._traverse(parentNode, walker);\n const selectorNodes = new Set();\n if (selectorBranches) {\n refNode = this._traverse(parentNode, walker);\n refNode = walker.firstChild();\n while (refNode) {\n let bool;\n for (const leaves of selectorBranches) {\n bool = this._matchLeaves(leaves, refNode, opt);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n selectorNodes.add(refNode);\n }\n refNode = walker.nextSibling();\n }\n }\n // :first-child, :last-child, :nth-child(b of S), :nth-last-child(b of S)\n if (a === 0) {\n if (b > 0 && b <= l) {\n if (selectorNodes.size) {\n let i = 0;\n refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n if (selectorNodes.has(refNode)) {\n if (i === b - 1) {\n matched.add(refNode);\n break;\n }\n i++;\n }\n if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\n }\n }\n } else if (!selector) {\n let i = 0;\n refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n if (i === b - 1) {\n matched.add(refNode);\n break;\n }\n if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\n }\n i++;\n }\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 i = 0;\n let j = a > 0 ? 0 : b - 1;\n refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n if (refNode && nth >= 0 && nth < l) {\n if (selectorNodes.size) {\n if (selectorNodes.has(refNode)) {\n if (j === nth) {\n matched.add(refNode);\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(refNode);\n }\n nth += a;\n }\n if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\n }\n i++;\n } else {\n break;\n }\n }\n }\n }\n if (reverse && matched.size > 1) {\n const m = [...matched];\n return new Set(m.reverse());\n }\n } else if (node === this.#root && (a + b) === 1) {\n if (selectorBranches) {\n let bool;\n for (const leaves of selectorBranches) {\n bool = this._matchLeaves(leaves, node, opt);\n if (bool) {\n break;\n }\n }\n if (bool) {\n matched.add(node);\n }\n } else {\n matched.add(node);\n }\n }\n return matched;\n }\n\n /**\n * collect nth of type\n * @private\n * @param {object} anb - An+B options\n * @param {number} anb.a - a\n * @param {number} anb.b - b\n * @param {boolean} [anb.reverse] - reverse order\n * @param {object} node - Element node\n * @returns {Set.} - 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 walker = this.#document.createTreeWalker(parentNode, WALKER_FILTER);\n let l = 0;\n let refNode = walker.firstChild();\n while (refNode) {\n l++;\n refNode = walker.nextSibling();\n }\n // :first-of-type, :last-of-type\n if (a === 0) {\n if (b > 0 && b <= l) {\n let j = 0;\n refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n const { localName: itemLocalName, prefix: itemPrefix } = refNode;\n if (itemLocalName === localName && itemPrefix === prefix) {\n if (j === b - 1) {\n matched.add(refNode);\n break;\n }\n j++;\n }\n if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\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 refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n const { localName: itemLocalName, prefix: itemPrefix } = refNode;\n if (itemLocalName === localName && itemPrefix === prefix) {\n if (j === nth) {\n matched.add(refNode);\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 if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\n }\n }\n }\n }\n if (reverse && matched.size > 1) {\n const m = [...matched];\n return new Set(m.reverse());\n }\n } else if (node === this.#root && (a + b) === 1) {\n matched.add(node);\n }\n return matched;\n }\n\n /**\n * match An+B\n * @private\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @param {string} nthName - nth pseudo-class name\n * @param {object} opt - options\n * @returns {Set.} - collection of matched nodes\n */\n _matchAnPlusB(ast, node, nthName, opt) {\n const {\n nth: {\n a,\n b,\n name: nthIdentName\n },\n selector\n } = ast;\n const identName = unescapeSelector(nthIdentName);\n const anbMap = new Map();\n if (identName) {\n if (identName === 'even') {\n anbMap.set('a', 2);\n anbMap.set('b', 0);\n } else if (identName === 'odd') {\n anbMap.set('a', 2);\n anbMap.set('b', 1);\n }\n if (nthName.indexOf('last') > -1) {\n anbMap.set('reverse', true);\n }\n } else {\n if (typeof a === 'string' && /-?\\d+/.test(a)) {\n anbMap.set('a', a * 1);\n } else {\n anbMap.set('a', 0);\n }\n if (typeof b === 'string' && /-?\\d+/.test(b)) {\n anbMap.set('b', b * 1);\n } else {\n anbMap.set('b', 0);\n }\n if (nthName.indexOf('last') > -1) {\n anbMap.set('reverse', true);\n }\n }\n 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, opt);\n return nodes;\n } else if (/^nth-(?:last-)?of-type$/.test(nthName)) {\n const anb = Object.fromEntries(anbMap);\n const nodes = this._collectNthOfType(anb, node);\n return nodes;\n }\n return new Set();\n }\n\n /**\n * match directionality pseudo-class - :dir()\n * @private\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 * @private\n * @see https://datatracker.ietf.org/doc/html/rfc4647#section-3.3.1\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchLanguagePseudoClass(ast, node) {\n const astName = unescapeSelector(ast.name);\n let res;\n if (astName === '*') {\n if (node.hasAttribute('lang')) {\n if (node.getAttribute('lang')) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.nodeType === ELEMENT_NODE) {\n if (parent.hasAttribute('lang')) {\n if (parent.getAttribute('lang')) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n }\n } else if (astName) {\n const langPart = `(?:-${ALPHA_NUM})*`;\n const regLang = new RegExp(`^(?:\\\\*-)?${ALPHA_NUM}${langPart}$`, 'i');\n if (regLang.test(astName)) {\n let regExtendedLang;\n if (astName.indexOf('-') > -1) {\n const [langMain, langSub, ...langRest] = astName.split('-');\n let extendedMain;\n if (langMain === '*') {\n extendedMain = `${ALPHA_NUM}${langPart}`;\n } else {\n extendedMain = `${langMain}${langPart}`;\n }\n const extendedSub = `-${langSub}${langPart}`;\n const len = langRest.length;\n let extendedRest = '';\n if (len) {\n for (let i = 0; i < len; i++) {\n extendedRest += `-${langRest[i]}${langPart}`;\n }\n }\n regExtendedLang =\n new RegExp(`^${extendedMain}${extendedSub}${extendedRest}$`, 'i');\n } else {\n regExtendedLang = new RegExp(`^${astName}${langPart}$`, 'i');\n }\n if (node.hasAttribute('lang')) {\n if (regExtendedLang.test(node.getAttribute('lang'))) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.nodeType === ELEMENT_NODE) {\n if (parent.hasAttribute('lang')) {\n const value = parent.getAttribute('lang');\n if (regExtendedLang.test(value)) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n }\n }\n }\n return res ?? null;\n }\n\n /**\n * match :has() pseudo-class function\n * @private\n * @param {Array.} leaves - AST leaves\n * @param {object} node - Element node\n * @param {object} opt - options\n * @returns {boolean} - result\n */\n _matchHasPseudoFunc(leaves, node, opt = {}) {\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 opt.dir = DIR_NEXT;\n const nodes = this._matchCombinator(twig, node, opt);\n if (nodes.size) {\n if (leaves.length) {\n for (const nextNode of nodes) {\n bool = this._matchHasPseudoFunc(Object.assign([], leaves),\n nextNode, opt);\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 * @private\n * @param {object} astData - AST data\n * @param {object} node - Element node\n * @param {object} opt - options\n * @returns {?object} - matched node\n */\n _matchLogicalPseudoFunc(astData, node, opt = {}) {\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 for (const leaves of branches) {\n bool = this._matchHasPseudoFunc(Object.assign([], leaves), node, opt);\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 opt.forgive = forgive;\n const l = twigBranches.length;\n let bool;\n for (let i = 0; i < l; i++) {\n const branch = twigBranches[i];\n const lastIndex = branch.length - 1;\n const { leaves } = branch[lastIndex];\n bool = this._matchLeaves(leaves, node, opt);\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 opt.dir = DIR_PREV;\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, opt);\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n bool = true;\n } else {\n nextNodes = new Set(arr);\n }\n } else {\n bool = false;\n break;\n }\n }\n }\n if (bool) {\n break;\n }\n }\n if (astName === 'not') {\n if (!bool) {\n res = node;\n }\n } else if (bool) {\n res = node;\n }\n }\n return res ?? null;\n }\n\n /**\n * match pseudo-class selector\n * @private\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] - forgive unknown pseudo-class\n * @param {boolean} [opt.warn] - warn unsupported pseudo-class\n * @returns {Set.} - collection of matched nodes\n */\n _matchPseudoClassSelector(ast, node, opt = {}) {\n const { children: astChildren } = ast;\n const { localName, parentNode } = node;\n const {\n forgive,\n warn = this.#warn\n } = opt;\n const astName = unescapeSelector(ast.name);\n const matched = new Set();\n // :has(), :is(), :not(), :where()\n if (REG_LOGICAL_PSEUDO.test(astName)) {\n let astData;\n if (this.#cache.has(ast)) {\n astData = this.#cache.get(ast);\n } else {\n const branches = walkAST(ast);\n const selectors = [];\n const twigBranches = [];\n for (const [...leaves] of branches) {\n for (const leaf of leaves) {\n const css = generateCSS(leaf);\n selectors.push(css);\n }\n const branch = [];\n const leavesSet = new Set();\n let item = leaves.shift();\n while (item) {\n if (item.type === COMBINATOR) {\n branch.push({\n combo: item,\n leaves: [...leavesSet]\n });\n leavesSet.clear();\n } else if (item) {\n leavesSet.add(item);\n }\n if (leaves.length) {\n item = leaves.shift();\n } else {\n branch.push({\n combo: null,\n leaves: [...leavesSet]\n });\n leavesSet.clear();\n break;\n }\n }\n twigBranches.push(branch);\n }\n astData = {\n astName,\n branches,\n twigBranches,\n selector: selectors.join(',')\n };\n this.#cache.set(ast, astData);\n }\n const res = this._matchLogicalPseudoFunc(astData, node, opt);\n if (res) {\n matched.add(res);\n }\n } else if (Array.isArray(astChildren)) {\n const [branch] = astChildren;\n // :nth-child(), :nth-last-child(), nth-of-type(), :nth-last-of-type()\n if (/^nth-(?:last-)?(?:child|of-type)$/.test(astName)) {\n const nodes = this._matchAnPlusB(branch, node, astName, opt);\n return nodes;\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 (warn) {\n const msg = `Unsupported pseudo-class :${astName}()`;\n throw new DOMException(msg, NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'host':\n case 'host-context': {\n // ignore\n break;\n }\n default: {\n if (!forgive) {\n const msg = `Unknown pseudo-class :${astName}()`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n }\n }\n }\n } else {\n const regAnchor = /^a(?:rea)?$/;\n const regFormCtrl =\n /^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/;\n const regFormValidity = /^(?:(?:inpu|selec)t|button|form|textarea)$/;\n const regInteract = /^d(?:etails|ialog)$/;\n const regTypeCheck = /^(?:checkbox|radio)$/;\n const regTypeDate = /^(?:date(?:time-local)?|month|time|week)$/;\n const regTypeRange =\n /(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/;\n const regTypeText = /^(?:(?:emai|te|ur)l|number|password|search|text)$/;\n switch (astName) {\n case 'any-link':\n case 'link': {\n if (regAnchor.test(localName) && node.hasAttribute('href')) {\n matched.add(node);\n }\n break;\n }\n case 'local-link': {\n if (regAnchor.test(localName) && node.hasAttribute('href')) {\n const { href, origin, pathname } = new URL(this.#content.URL);\n const attrURL = new URL(node.getAttribute('href'), href);\n if (attrURL.origin === origin && attrURL.pathname === pathname) {\n matched.add(node);\n }\n }\n break;\n }\n case 'visited': {\n // prevent fingerprinting\n break;\n }\n case 'target': {\n const { hash } = new URL(this.#content.URL);\n if (node.id && hash === `#${node.id}` &&\n this.#content.contains(node)) {\n matched.add(node);\n }\n break;\n }\n case 'target-within': {\n const { hash } = new URL(this.#content.URL);\n if (hash) {\n const id = hash.replace(/^#/, '');\n let current = this.#content.getElementById(id);\n while (current) {\n if (current === node) {\n matched.add(node);\n break;\n }\n current = current.parentNode;\n }\n }\n break;\n }\n case 'scope': {\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (!this.#shadow && node === this.#node) {\n matched.add(node);\n }\n } else if (node === this.#content.documentElement) {\n matched.add(node);\n }\n break;\n }\n case 'focus': {\n if (node === this.#content.activeElement) {\n let focus = true;\n let refNode = node;\n while (refNode) {\n if (refNode.hasAttribute('hidden')) {\n focus = false;\n break;\n } else if (refNode.hasAttribute('style')) {\n const { display, visibility } = refNode.style;\n focus = !(display === 'none' || visibility === 'hidden');\n if (!focus) {\n break;\n }\n }\n if (refNode.parentNode &&\n refNode.parentNode.nodeType === ELEMENT_NODE) {\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n if (focus) {\n matched.add(node);\n }\n }\n break;\n }\n case 'focus-within': {\n let active;\n let current = this.#content.activeElement;\n while (current) {\n if (current === node) {\n active = true;\n break;\n }\n current = current.parentNode;\n }\n if (active) {\n let focus = true;\n let refNode = node;\n while (refNode) {\n if (refNode.hasAttribute('hidden')) {\n focus = false;\n break;\n } else if (refNode.hasAttribute('style')) {\n const { display, visibility } = refNode.style;\n focus = !(display === 'none' || visibility === 'hidden');\n if (!focus) {\n break;\n }\n }\n if (refNode.parentNode &&\n refNode.parentNode.nodeType === ELEMENT_NODE) {\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n if (focus) {\n matched.add(node);\n }\n }\n break;\n }\n case 'open': {\n if (regInteract.test(localName) && node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'closed': {\n if (regInteract.test(localName) && !node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'disabled': {\n if (regFormCtrl.test(localName) || isCustomElementName(localName)) {\n if (node.disabled || node.hasAttribute('disabled')) {\n matched.add(node);\n } else {\n let parent = parentNode;\n while (parent) {\n if (parent.localName === 'fieldset') {\n break;\n }\n parent = parent.parentNode;\n }\n if (parent && parentNode.localName !== 'legend' &&\n parent.hasAttribute('disabled')) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'enabled': {\n if ((regFormCtrl.test(localName) || isCustomElementName(localName)) &&\n !(node.disabled && node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n case 'read-only': {\n switch (localName) {\n case 'textarea': {\n if (node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled')) {\n matched.add(node);\n }\n break;\n }\n case 'input': {\n if ((!node.type || regTypeDate.test(node.type) ||\n regTypeText.test(node.type)) &&\n (node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n default: {\n if (!isContentEditable(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'read-write': {\n switch (localName) {\n case 'textarea': {\n if (!(node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n case 'input': {\n if ((!node.type || regTypeDate.test(node.type) ||\n regTypeText.test(node.type)) &&\n !(node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n default: {\n if (isContentEditable(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'placeholder-shown': {\n let targetNode;\n if (localName === 'textarea') {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n if (regTypeText.test(node.getAttribute('type'))) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode && node.value === '' &&\n node.hasAttribute('placeholder') &&\n node.getAttribute('placeholder').trim().length) {\n matched.add(node);\n }\n break;\n }\n case 'checked': {\n if ((node.checked && localName === 'input' &&\n node.hasAttribute('type') &&\n regTypeCheck.test(node.getAttribute('type'))) ||\n (node.selected && localName === 'option')) {\n matched.add(node);\n }\n break;\n }\n case 'indeterminate': {\n if ((node.indeterminate && localName === 'input' &&\n node.type === 'checkbox') ||\n (localName === 'progress' && !node.hasAttribute('value'))) {\n matched.add(node);\n } else if (localName === 'input' && node.type === 'radio' &&\n !node.hasAttribute('checked')) {\n const nodeName = node.name;\n let parent = node.parentNode;\n while (parent) {\n if (parent.localName === 'form') {\n break;\n }\n parent = parent.parentNode;\n }\n if (!parent) {\n parent = this.#content.documentElement;\n }\n let checked;\n const items = parent.getElementsByTagName('input');\n const l = items.length;\n if (l) {\n for (let i = 0; i < l; i++) {\n const item = items[i];\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 }\n if (!checked) {\n matched.add(node);\n }\n }\n break;\n }\n case 'default': {\n const regTypeReset = /^(?:button|reset)$/;\n const regTypeSubmit = /^(?:image|submit)$/;\n // button[type=\"submit\"], input[type=\"submit\"], input[type=\"image\"]\n if ((localName === 'button' &&\n !(node.hasAttribute('type') &&\n regTypeReset.test(node.getAttribute('type')))) ||\n (localName === 'input' && node.hasAttribute('type') &&\n regTypeSubmit.test(node.getAttribute('type')))) {\n let form = node.parentNode;\n while (form) {\n if (form.localName === 'form') {\n break;\n }\n form = form.parentNode;\n }\n if (form) {\n const walker =\n this.#document.createTreeWalker(form, SHOW_ELEMENT);\n let nextNode = walker.firstChild();\n while (nextNode) {\n const nodeName = nextNode.localName;\n let m;\n if (nodeName === 'button') {\n m = !(nextNode.hasAttribute('type') &&\n regTypeReset.test(nextNode.getAttribute('type')));\n } else if (nodeName === 'input') {\n m = nextNode.hasAttribute('type') &&\n regTypeSubmit.test(nextNode.getAttribute('type'));\n }\n if (m) {\n if (nextNode === node) {\n matched.add(node);\n }\n break;\n }\n nextNode = walker.nextNode();\n }\n }\n // input[type=\"checkbox\"], input[type=\"radio\"]\n } else if (localName === 'input' && node.hasAttribute('type') &&\n regTypeCheck.test(node.getAttribute('type')) &&\n (node.checked || node.hasAttribute('checked'))) {\n matched.add(node);\n // option\n } else if (localName === 'option') {\n let isMultiple = false;\n let parent = parentNode;\n while (parent) {\n if (parent.localName === 'datalist') {\n break;\n } else if (parent.localName === 'select') {\n if (parent.multiple || parent.hasAttribute('multiple')) {\n isMultiple = true;\n }\n break;\n }\n parent = parent.parentNode;\n }\n if (isMultiple) {\n if (node.selected || node.hasAttribute('selected')) {\n matched.add(node);\n }\n } else {\n const defaultOpt = new Set();\n const walker =\n this.#document.createTreeWalker(parentNode, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n if (refNode.selected || refNode.hasAttribute('selected')) {\n defaultOpt.add(refNode);\n break;\n }\n refNode = walker.nextSibling();\n }\n if (defaultOpt.size) {\n if (defaultOpt.has(node)) {\n matched.add(node);\n }\n }\n }\n }\n break;\n }\n case 'valid': {\n if (regFormValidity.test(localName)) {\n if (node.checkValidity()) {\n matched.add(node);\n }\n } else if (localName === 'fieldset') {\n let bool;\n const walker = this.#document.createTreeWalker(node, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n if (regFormValidity.test(refNode.localName)) {\n bool = refNode.checkValidity();\n if (!bool) {\n break;\n }\n }\n refNode = walker.nextNode();\n }\n if (bool) {\n matched.add(node);\n }\n }\n break;\n }\n case 'invalid': {\n if (regFormValidity.test(localName)) {\n if (!node.checkValidity()) {\n matched.add(node);\n }\n } else if (localName === 'fieldset') {\n let bool;\n const walker = this.#document.createTreeWalker(node, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n if (regFormValidity.test(refNode.localName)) {\n bool = refNode.checkValidity();\n if (!bool) {\n break;\n }\n }\n refNode = walker.nextNode();\n }\n if (!bool) {\n matched.add(node);\n }\n }\n break;\n }\n case 'in-range': {\n if (localName === 'input' &&\n !(node.readonly || node.hasAttribute('readonly')) &&\n !(node.disabled || node.hasAttribute('disabled')) &&\n node.hasAttribute('type') &&\n regTypeRange.test(node.getAttribute('type')) &&\n !(node.validity.rangeUnderflow ||\n node.validity.rangeOverflow) &&\n (node.hasAttribute('min') || node.hasAttribute('max') ||\n node.getAttribute('type') === 'range')) {\n matched.add(node);\n }\n break;\n }\n case 'out-of-range': {\n if (localName === 'input' &&\n !(node.readonly || node.hasAttribute('readonly')) &&\n !(node.disabled || node.hasAttribute('disabled')) &&\n node.hasAttribute('type') &&\n regTypeRange.test(node.getAttribute('type')) &&\n (node.validity.rangeUnderflow || node.validity.rangeOverflow)) {\n matched.add(node);\n }\n break;\n }\n case 'required': {\n let targetNode;\n if (/^(?:select|textarea)$/.test(localName)) {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n const inputType = node.getAttribute('type');\n if (inputType === 'file' || regTypeCheck.test(inputType) ||\n regTypeDate.test(inputType) || regTypeText.test(inputType)) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode &&\n (node.required || node.hasAttribute('required'))) {\n matched.add(node);\n }\n break;\n }\n case 'optional': {\n let targetNode;\n if (/^(?:select|textarea)$/.test(localName)) {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n const inputType = node.getAttribute('type');\n if (inputType === 'file' || regTypeCheck.test(inputType) ||\n regTypeDate.test(inputType) || regTypeText.test(inputType)) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode &&\n !(node.required || node.hasAttribute('required'))) {\n matched.add(node);\n }\n break;\n }\n case 'root': {\n if (node === this.#content.documentElement) {\n matched.add(node);\n }\n break;\n }\n case 'empty': {\n if (node.hasChildNodes()) {\n let bool;\n const walker = this.#document.createTreeWalker(node, SHOW_ALL);\n let refNode = walker.firstChild();\n while (refNode) {\n bool = refNode.nodeType !== ELEMENT_NODE &&\n refNode.nodeType !== TEXT_NODE;\n if (!bool) {\n break;\n }\n refNode = walker.nextSibling();\n }\n if (bool) {\n matched.add(node);\n }\n } else {\n matched.add(node);\n }\n break;\n }\n case 'first-child': {\n if ((parentNode && node === parentNode.firstElementChild) ||\n node === this.#root) {\n matched.add(node);\n }\n break;\n }\n case 'last-child': {\n if ((parentNode && node === parentNode.lastElementChild) ||\n node === this.#root) {\n matched.add(node);\n }\n break;\n }\n case 'only-child': {\n if ((parentNode && node === parentNode.firstElementChild &&\n node === parentNode.lastElementChild) || node === this.#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 (node === this.#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 (node === this.#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 (node === this.#root) {\n matched.add(node);\n }\n break;\n }\n case 'host':\n case 'host-context': {\n // ignore\n break;\n }\n // legacy pseudo-elements\n case 'after':\n case 'before':\n case 'first-letter':\n case 'first-line': {\n if (warn) {\n const msg = `Unsupported pseudo-element ::${astName}`;\n throw new DOMException(msg, NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'active':\n case 'autofill':\n case 'blank':\n case 'buffering':\n case 'current':\n case 'defined':\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 (warn) {\n const msg = `Unsupported pseudo-class :${astName}`;\n throw new DOMException(msg, NOT_SUPPORTED_ERR);\n }\n break;\n }\n default: {\n if (astName.startsWith('-webkit-')) {\n if (warn) {\n const msg = `Unsupported pseudo-class :${astName}`;\n throw new DOMException(msg, NOT_SUPPORTED_ERR);\n }\n } else if (!forgive) {\n const msg = `Unknown pseudo-class :${astName}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n }\n }\n }\n return matched;\n }\n\n /**\n * match shadow host pseudo class\n * @private\n * @param {object} ast - AST\n * @param {object} node - DocumentFragment node\n * @returns {?object} - matched node\n */\n _matchShadowHostPseudoClass(ast, node) {\n const { children: astChildren } = ast;\n const astName = unescapeSelector(ast.name);\n let res;\n if (Array.isArray(astChildren)) {\n const [branch] = walkAST(astChildren[0]);\n const [...leaves] = branch;\n const { host } = node;\n if (astName === 'host') {\n let bool;\n for (const leaf of leaves) {\n const { type: leafType } = leaf;\n if (leafType === COMBINATOR) {\n const css = generateCSS(ast);\n const msg = `Invalid selector ${css}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n bool = this._matchSelector(leaf, host).has(host);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n res = node;\n }\n } else if (astName === 'host-context') {\n let bool;\n let parent = host;\n while (parent) {\n for (const leaf of leaves) {\n const { type: leafType } = leaf;\n if (leafType === COMBINATOR) {\n const css = generateCSS(ast);\n const msg = `Invalid selector ${css}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n bool = this._matchSelector(leaf, parent).has(parent);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n break;\n } else {\n parent = parent.parentNode;\n }\n }\n if (bool) {\n res = node;\n }\n }\n } else if (astName === 'host') {\n res = node;\n } else {\n const msg = `Invalid selector :${astName}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n return res ?? null;\n }\n\n /**\n * match selector\n * @private\n * @param {object} ast - AST\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} [opt] - options\n * @returns {Set.} - collection of matched nodes\n */\n _matchSelector(ast, node, opt) {\n const { type: astType } = ast;\n const astName = unescapeSelector(ast.name);\n const matched = new Set();\n if (node.nodeType === ELEMENT_NODE) {\n switch (astType) {\n case SELECTOR_PSEUDO_ELEMENT: {\n matchPseudoElementSelector(astName, opt);\n break;\n }\n case SELECTOR_ID: {\n if (node.id === astName) {\n matched.add(node);\n }\n break;\n }\n case SELECTOR_CLASS: {\n if (node.classList.contains(astName)) {\n matched.add(node);\n }\n break;\n }\n case SELECTOR_PSEUDO_CLASS: {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n return nodes;\n }\n default: {\n const res = matchSelector(ast, node, opt);\n if (res) {\n matched.add(res);\n }\n }\n }\n } else if (this.#shadow && astType === SELECTOR_PSEUDO_CLASS &&\n node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n if (astName !== 'has' && REG_LOGICAL_PSEUDO.test(astName)) {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n return nodes;\n } else if (REG_SHADOW_HOST.test(astName)) {\n const res = this._matchShadowHostPseudoClass(ast, node, opt);\n if (res) {\n matched.add(res);\n }\n }\n }\n return matched;\n }\n\n /**\n * match leaves\n * @private\n * @param {Array.} leaves - AST leaves\n * @param {object} node - node\n * @param {object} opt - options\n * @returns {boolean} - result\n */\n _matchLeaves(leaves, node, opt) {\n const { attributes, localName, nodeType } = node;\n let bool;\n let result = this.#results.get(leaves);\n if (result && result.has(node)) {\n const { attr, matched } = result.get(node);\n if (attributes?.length === attr) {\n bool = matched;\n }\n }\n if (typeof bool !== 'boolean') {\n const regForm = /^(?:(?:fieldse|inpu|selec)t|button|form|textarea)$/;\n let save;\n if (nodeType === ELEMENT_NODE && regForm.test(localName)) {\n save = false;\n } else {\n save = true;\n }\n for (const leaf of leaves) {\n const { name, type: leafType } = leaf;\n const leafName = unescapeSelector(name);\n if (leafType === SELECTOR_PSEUDO_CLASS && leafName === 'dir') {\n save = false;\n }\n bool = this._matchSelector(leaf, node, opt).has(node);\n if (!bool) {\n break;\n }\n }\n if (save) {\n if (!result) {\n result = new WeakMap();\n }\n result.set(node, {\n attr: attributes?.length,\n matched: bool\n });\n this.#results.set(leaves, result);\n }\n }\n return !!bool;\n }\n\n /**\n * match HTML collection\n * @private\n * @param {object} items - HTML collection\n * @param {object} opt - options\n * @returns {Set.} - matched nodes\n */\n _matchHTMLCollection(items, opt = {}) {\n const { compound, filterLeaves } = opt;\n const nodes = new Set();\n const l = items.length;\n if (l) {\n if (compound) {\n for (let i = 0; i < l; i++) {\n const item = items[i];\n const bool = this._matchLeaves(filterLeaves, item, opt);\n if (bool) {\n nodes.add(item);\n }\n }\n } else {\n const arr = [].slice.call(items);\n return new Set(arr);\n }\n }\n return nodes;\n }\n\n /**\n * find descendant nodes\n * @private\n * @param {Array.} leaves - AST leaves\n * @param {object} baseNode - base Element node\n * @param {object} opt - options\n * @returns {object} - collection of nodes and pending state\n */\n _findDescendantNodes(leaves, baseNode, opt) {\n const [leaf, ...filterLeaves] = leaves;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const compound = filterLeaves.length > 0;\n let nodes = new Set();\n let pending = false;\n if (this.#shadow) {\n pending = true;\n } else {\n switch (leafType) {\n case SELECTOR_PSEUDO_ELEMENT: {\n matchPseudoElementSelector(leafName, opt);\n break;\n }\n case SELECTOR_ID: {\n if (this.#root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n const node = this.#root.getElementById(leafName);\n if (node && node !== baseNode && baseNode.contains(node)) {\n if (compound) {\n const bool = this._matchLeaves(filterLeaves, node, opt);\n if (bool) {\n nodes.add(node);\n }\n } else {\n nodes.add(node);\n }\n }\n }\n break;\n }\n case SELECTOR_CLASS: {\n const items = baseNode.getElementsByClassName(leafName);\n nodes = this._matchHTMLCollection(items, {\n compound,\n filterLeaves\n });\n break;\n }\n case SELECTOR_TYPE: {\n if (this.#content.contentType === 'text/html' &&\n !/[*|]/.test(leafName)) {\n const items = baseNode.getElementsByTagName(leafName);\n nodes = this._matchHTMLCollection(items, {\n compound,\n filterLeaves\n });\n } else {\n pending = true;\n }\n break;\n }\n default: {\n pending = true;\n }\n }\n }\n return {\n nodes,\n pending\n };\n }\n\n /**\n * match combinator\n * @private\n * @param {object} twig - twig\n * @param {object} node - Element node\n * @param {object} opt - option\n * @returns {Set.} - collection of matched nodes\n */\n _matchCombinator(twig, node, opt = {}) {\n const { combo, leaves } = twig;\n const { name: comboName } = combo;\n const { dir } = opt;\n const matched = new Set();\n if (dir === DIR_NEXT) {\n switch (comboName) {\n case '+': {\n const refNode = node.nextElementSibling;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case '~': {\n const { parentNode } = node;\n if (parentNode) {\n const walker =\n this.#document.createTreeWalker(parentNode, SHOW_ELEMENT);\n let refNode = this._traverse(node, walker);\n if (refNode === node) {\n refNode = walker.nextSibling();\n }\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n refNode = walker.nextSibling();\n }\n }\n break;\n }\n case '>': {\n const walker = this.#document.createTreeWalker(node, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n refNode = walker.nextSibling();\n }\n break;\n }\n case ' ':\n default: {\n const { nodes, pending } = this._findDescendantNodes(leaves, node);\n if (nodes.size) {\n return nodes;\n }\n if (pending) {\n const walker = this.#document.createTreeWalker(node, SHOW_ELEMENT);\n let refNode = walker.nextNode();\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n refNode = walker.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, opt);\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case '~': {\n const walker =\n this.#document.createTreeWalker(node.parentNode, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n if (refNode === node) {\n break;\n } else {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n }\n refNode = walker.nextSibling();\n }\n break;\n }\n case '>': {\n const refNode = node.parentNode;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\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, opt);\n if (bool) {\n arr.push(refNode);\n }\n refNode = refNode.parentNode;\n }\n if (arr.length) {\n return new Set(arr.reverse());\n }\n }\n }\n }\n return matched;\n }\n\n /**\n * find matched node from finder\n * @private\n * @param {Array.} leaves - AST leaves\n * @param {object} [opt] - options\n * @param {object} [opt.node] - node to start from\n * @returns {?object} - matched node\n */\n _findNode(leaves, opt = {}) {\n const { node } = opt;\n let matchedNode;\n let refNode = this._traverse(node, this.#finder);\n if (refNode) {\n if (refNode.nodeType !== ELEMENT_NODE) {\n refNode = this.#finder.nextNode();\n } else if (refNode === node) {\n if (refNode !== this.#root) {\n refNode = this.#finder.nextNode();\n }\n }\n while (refNode) {\n let bool;\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (refNode === this.#node) {\n bool = true;\n } else {\n bool = this.#node.contains(refNode);\n }\n } else {\n bool = true;\n }\n if (bool) {\n const matched = this._matchLeaves(leaves, refNode, {\n warn: this.#warn\n });\n if (matched) {\n matchedNode = refNode;\n break;\n }\n }\n refNode = this.#finder.nextNode();\n }\n }\n return matchedNode ?? null;\n }\n\n /**\n * match self\n * @private\n * @param {Array} leaves - AST leaves\n * @returns {Array} - [nodes, filtered]\n */\n _matchSelf(leaves) {\n const nodes = [];\n let filtered = false;\n const bool = this._matchLeaves(leaves, this.#node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(this.#node);\n filtered = true;\n }\n return [nodes, filtered];\n }\n\n /**\n * find lineal\n * @private\n * @param {Array} leaves - AST leaves\n * @param {object} opt - options\n * @returns {Array} - [nodes, filtered]\n */\n _findLineal(leaves, opt = {}) {\n const { complex } = opt;\n const nodes = [];\n let filtered = false;\n let bool = this._matchLeaves(leaves, this.#node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(this.#node);\n filtered = true;\n }\n if (!bool || complex) {\n let refNode = this.#node.parentNode;\n while (refNode) {\n bool = this._matchLeaves(leaves, refNode, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(refNode);\n filtered = true;\n }\n if (refNode.parentNode) {\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n }\n return [nodes, filtered];\n }\n\n /**\n * find first\n * @private\n * @param {Array} leaves - AST leaves\n * @returns {Array} - [nodes, filtered]\n */\n _findFirst(leaves) {\n const nodes = [];\n let filtered = false;\n const node = this._findNode(leaves, {\n node: this.#node\n });\n if (node) {\n nodes.push(node);\n filtered = true;\n }\n return [nodes, filtered];\n }\n\n /**\n * find from HTML collection\n * @private\n * @param {object} items - HTML collection\n * @param {object} opt - options\n * @param {boolean} [opt.compound] - compound selector\n * @param {Array} [opt.filterLeaves] - filter leaves\n * @returns {Array} - [nodes, filtered]\n */\n _findFromHTMLCollection(items, opt = {}) {\n const { complex, compound, filterLeaves } = opt;\n let nodes = [];\n let filtered = false;\n let pending = false;\n const l = items.length;\n if (l) {\n if (this.#node.nodeType === ELEMENT_NODE) {\n for (let i = 0; i < l; i++) {\n const node = items[i];\n if (node === this.#node || isInclusive(node, this.#node)) {\n if (compound) {\n const bool = this._matchLeaves(filterLeaves, node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(node);\n filtered = true;\n }\n } else {\n nodes.push(node);\n filtered = true;\n }\n }\n }\n } else if (complex) {\n if (compound) {\n for (let i = 0; i < l; i++) {\n const node = items[i];\n const bool = this._matchLeaves(filterLeaves, node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(node);\n filtered = true;\n }\n }\n } else {\n nodes = [].slice.call(items);\n filtered = true;\n }\n } else if (compound) {\n pending = true;\n } else {\n nodes = [].slice.call(items);\n filtered = true;\n }\n }\n return [nodes, filtered, pending];\n }\n\n /**\n * find entry nodes\n * @private\n * @param {object} twig - twig\n * @param {string} targetType - target type\n * @param {boolean} complex - complex selector\n * @returns {object} - collection of nodes etc.\n */\n _findEntryNodes(twig, targetType, complex) {\n const { leaves } = twig;\n const [leaf, ...filterLeaves] = leaves;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const compound = filterLeaves.length > 0;\n let nodes = [];\n let filtered = false;\n let pending = false;\n switch (leafType) {\n case SELECTOR_PSEUDO_ELEMENT: {\n matchPseudoElementSelector(leafName, {\n warn: this.#warn\n });\n break;\n }\n case SELECTOR_ID: {\n if (targetType === TARGET_SELF) {\n [nodes, filtered] = this._matchSelf(leaves);\n } else if (targetType === TARGET_LINEAL) {\n [nodes, filtered] = this._findLineal(leaves, {\n complex\n });\n } else if (targetType === TARGET_FIRST &&\n this.#root.nodeType !== ELEMENT_NODE) {\n const node = this.#root.getElementById(leafName);\n if (node) {\n if (compound) {\n const bool = this._matchLeaves(filterLeaves, node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(node);\n filtered = true;\n }\n } else {\n nodes.push(node);\n filtered = true;\n }\n }\n } else {\n pending = true;\n }\n break;\n }\n case SELECTOR_CLASS: {\n if (targetType === TARGET_SELF) {\n [nodes, filtered] = this._matchSelf(leaves);\n } else if (targetType === TARGET_LINEAL) {\n [nodes, filtered] = this._findLineal(leaves, {\n complex\n });\n } else if (targetType === TARGET_FIRST) {\n [nodes, filtered] = this._findFirst(leaves);\n } else if (this.#root.nodeType === DOCUMENT_NODE) {\n const items = this.#root.getElementsByClassName(leafName);\n [nodes, filtered, pending] = this._findFromHTMLCollection(items, {\n complex,\n compound,\n filterLeaves\n });\n } else {\n pending = true;\n }\n break;\n }\n case SELECTOR_TYPE: {\n if (targetType === TARGET_SELF) {\n [nodes, filtered] = this._matchSelf(leaves);\n } else if (targetType === TARGET_LINEAL) {\n [nodes, filtered] = this._findLineal(leaves, {\n complex\n });\n } else if (this.#content.contentType === 'text/html' &&\n this.#root.nodeType === DOCUMENT_NODE &&\n !/[*|]/.test(leafName)) {\n const items = this.#root.getElementsByTagName(leafName);\n [nodes, filtered, pending] = this._findFromHTMLCollection(items, {\n complex,\n compound,\n filterLeaves\n });\n } else {\n pending = true;\n }\n break;\n }\n default: {\n if (targetType !== TARGET_LINEAL && REG_SHADOW_HOST.test(leafName)) {\n if (this.#shadow &&\n this.#node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const node = this._matchShadowHostPseudoClass(leaf, this.#node);\n if (node) {\n nodes.push(node);\n filtered = true;\n }\n }\n } else if (targetType === TARGET_SELF) {\n [nodes, filtered] = this._matchSelf(leaves);\n } else if (targetType === TARGET_LINEAL) {\n [nodes, filtered] = this._findLineal(leaves, {\n complex\n });\n } else if (targetType === TARGET_FIRST) {\n [nodes, filtered] = this._findFirst(leaves);\n } else {\n pending = true;\n }\n }\n }\n return {\n compound,\n filtered,\n nodes,\n pending\n };\n }\n\n /**\n * get entry twig\n * @private\n * @param {Array.} branch - AST branch\n * @param {string} targetType - target type\n * @returns {object} - direction and twig\n */\n _getEntryTwig(branch, targetType) {\n const branchLen = branch.length;\n const complex = branchLen > 1;\n const firstTwig = branch[0];\n let dir;\n let twig;\n if (complex) {\n const {\n combo: firstCombo,\n leaves: [{\n name: firstName,\n type: firstType\n }]\n } = firstTwig;\n const lastTwig = branch[branchLen - 1];\n const {\n leaves: [{\n name: lastName,\n type: lastType\n }]\n } = lastTwig;\n if (lastType === SELECTOR_PSEUDO_ELEMENT || lastType === SELECTOR_ID) {\n dir = DIR_PREV;\n twig = lastTwig;\n } else if (firstType === SELECTOR_PSEUDO_ELEMENT ||\n firstType === SELECTOR_ID) {\n dir = DIR_NEXT;\n twig = firstTwig;\n } else if (targetType === TARGET_ALL) {\n if (firstName === '*' && firstType === SELECTOR_TYPE) {\n dir = DIR_PREV;\n twig = lastTwig;\n } else if (lastName === '*' && lastType === SELECTOR_TYPE) {\n dir = DIR_NEXT;\n twig = firstTwig;\n } else if (branchLen === 2) {\n const { name: comboName } = firstCombo;\n if (/^[+~]$/.test(comboName)) {\n dir = DIR_PREV;\n twig = lastTwig;\n } else {\n dir = DIR_NEXT;\n twig = firstTwig;\n }\n } else {\n dir = DIR_NEXT;\n twig = firstTwig;\n }\n } else if (lastName === '*' && lastType === SELECTOR_TYPE) {\n dir = DIR_NEXT;\n twig = firstTwig;\n } else if (firstName === '*' && firstType === SELECTOR_TYPE) {\n dir = DIR_PREV;\n twig = lastTwig;\n } else {\n let bool;\n let sibling;\n for (const { combo, leaves: [leaf] } of branch) {\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n if (leafType === SELECTOR_PSEUDO_CLASS && leafName === 'dir') {\n bool = false;\n break;\n }\n if (combo && !sibling) {\n const { name: comboName } = combo;\n if (/^[+~]$/.test(comboName)) {\n bool = true;\n sibling = true;\n }\n }\n }\n if (bool) {\n dir = DIR_NEXT;\n twig = firstTwig;\n } else {\n dir = DIR_PREV;\n twig = lastTwig;\n }\n }\n } else {\n dir = DIR_PREV;\n twig = firstTwig;\n }\n return {\n complex,\n dir,\n twig\n };\n }\n\n /**\n * collect nodes\n * @private\n * @param {string} targetType - target type\n * @returns {Array.>} - #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 { complex, dir, twig } = this._getEntryTwig(branch, targetType);\n const {\n compound, filtered, nodes, pending\n } = this._findEntryNodes(twig, targetType, complex);\n if (nodes.length) {\n this.#ast[i].find = true;\n this.#nodes[i] = nodes;\n } else if (pending) {\n pendingItems.add(new Map([\n ['index', i],\n ['twig', twig]\n ]));\n }\n this.#ast[i].dir = dir;\n this.#ast[i].filtered = filtered || !compound;\n i++;\n }\n if (pendingItems.size) {\n let node;\n let walker;\n if (this.#node !== this.#root && this.#node.nodeType === ELEMENT_NODE) {\n node = this.#node;\n walker = this.#finder;\n } else {\n node = this.#root;\n walker = this.#tree;\n }\n let nextNode = this._traverse(node, walker);\n while (nextNode) {\n let bool = false;\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (nextNode === this.#node) {\n bool = true;\n } else {\n bool = this.#node.contains(nextNode);\n }\n } else {\n bool = true;\n }\n if (bool) {\n for (const pendingItem of pendingItems) {\n const { leaves } = pendingItem.get('twig');\n const matched = this._matchLeaves(leaves, nextNode, {\n warn: this.#warn\n });\n if (matched) {\n const index = pendingItem.get('index');\n this.#ast[index].filtered = true;\n this.#ast[index].find = true;\n this.#nodes[index].push(nextNode);\n }\n }\n }\n nextNode = walker.nextNode();\n }\n }\n } else {\n let i = 0;\n for (const { branch } of ast) {\n const twig = branch[branch.length - 1];\n const complex = branch.length > 1;\n const {\n compound, filtered, nodes\n } = this._findEntryNodes(twig, targetType, complex);\n if (nodes.length) {\n this.#ast[i].find = true;\n this.#nodes[i] = nodes;\n }\n this.#ast[i].dir = DIR_PREV;\n this.#ast[i].filtered = filtered || !compound;\n i++;\n }\n }\n return [\n this.#ast,\n this.#nodes\n ];\n }\n\n /**\n * match nodes\n * @private\n * @param {string} targetType - target type\n * @returns {Set.} - 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, dir, find } = branches[i];\n const branchLen = branch.length;\n if (branchLen && find) {\n const entryNodes = this.#nodes[i];\n const entryNodesLen = entryNodes.length;\n const lastIndex = branchLen - 1;\n if (lastIndex === 0) {\n const { leaves } = branch[0];\n const compound = leaves.length > 1;\n if ((targetType === TARGET_ALL || targetType === TARGET_FIRST) &&\n this.#node.nodeType === ELEMENT_NODE) {\n for (let j = 0; j < entryNodesLen; j++) {\n const node = entryNodes[j];\n if (node !== this.#node && this.#node.contains(node)) {\n nodes.add(node);\n if (targetType !== TARGET_ALL) {\n break;\n }\n }\n }\n } else if (compound) {\n for (let j = 0; j < entryNodesLen; j++) {\n const node = entryNodes[j];\n nodes.add(node);\n if (targetType !== TARGET_ALL) {\n break;\n }\n }\n } else if (targetType === TARGET_ALL) {\n if (nodes.size) {\n const n = [...nodes];\n nodes = new Set([...n, ...entryNodes]);\n this.#sort = true;\n } else {\n nodes = new Set([...entryNodes]);\n }\n } else {\n const [node] = [...entryNodes];\n nodes.add(node);\n }\n } else if (dir === DIR_NEXT) {\n let { combo, leaves: entryLeaves } = branch[0];\n let matched;\n for (let j = 0; j < entryNodesLen; j++) {\n const node = entryNodes[j];\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, {\n dir,\n warn: this.#warn\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === lastIndex) {\n if (targetType === TARGET_ALL) {\n if (nodes.size) {\n const n = [...nodes];\n nodes = new Set([...n, ...arr]);\n } else {\n nodes = new Set([...arr]);\n }\n this.#sort = true;\n } else {\n const [node] = sortNodes(arr);\n nodes.add(node);\n }\n matched = true;\n } else {\n combo = nextCombo;\n nextNodes = new Set(arr);\n matched = false;\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched && targetType !== TARGET_ALL) {\n break;\n }\n }\n if (!matched && targetType === TARGET_FIRST) {\n const [entryNode] = [...entryNodes];\n let refNode = this._findNode(entryLeaves, {\n node: entryNode\n });\n while (refNode) {\n let nextNodes = new Set([refNode]);\n for (let j = 1; j < branchLen; j++) {\n const { combo: nextCombo, leaves } = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const twig = {\n combo,\n leaves\n };\n const m = this._matchCombinator(twig, nextNode, {\n dir,\n warn: this.#warn\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === lastIndex) {\n const [node] = sortNodes(arr);\n nodes.add(node);\n matched = true;\n } else {\n combo = nextCombo;\n nextNodes = new Set(arr);\n matched = false;\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched) {\n break;\n }\n refNode = this._findNode(entryLeaves, {\n node: refNode\n });\n nextNodes = new Set([refNode]);\n }\n }\n } else {\n const { leaves: entryLeaves } = branch[lastIndex];\n let matched;\n for (let j = 0; j < entryNodesLen; j++) {\n const node = entryNodes[j];\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 dir,\n warn: this.#warn\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n nodes.add(node);\n matched = true;\n if (targetType === TARGET_ALL &&\n branchLen > 1 && nodes.size > 1) {\n this.#sort = true;\n }\n } else {\n nextNodes = new Set(arr);\n matched = false;\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched && targetType !== TARGET_ALL) {\n break;\n }\n }\n if (!matched && targetType === TARGET_FIRST) {\n const [entryNode] = [...entryNodes];\n let refNode = this._findNode(entryLeaves, {\n node: entryNode\n });\n while (refNode) {\n let nextNodes = new Set([refNode]);\n for (let j = lastIndex - 1; j >= 0; j--) {\n const twig = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, {\n dir,\n warn: this.#warn\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n nodes.add(refNode);\n matched = true;\n } else {\n nextNodes = new Set(arr);\n matched = false;\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched) {\n break;\n }\n refNode = this._findNode(entryLeaves, {\n node: refNode\n });\n nextNodes = new Set([refNode]);\n }\n }\n }\n }\n }\n return nodes;\n }\n\n /**\n * find matched nodes\n * @private\n * @param {string} targetType - target type\n * @returns {Set.} - collection of matched nodes\n */\n _find(targetType) {\n this._collectNodes(targetType);\n const nodes = this._matchNodes(targetType);\n return nodes;\n }\n\n /**\n * matches\n * @param {string} selector - CSS selector\n * @param {object} node - Element node\n * @param {object} opt - options\n * @returns {boolean} - `true` if matched `false` otherwise\n */\n matches(selector, node, opt) {\n let res;\n try {\n if (node.nodeType !== ELEMENT_NODE) {\n const msg = `Unexpected node ${node.nodeName}`;\n throw new TypeError(msg);\n }\n this.#node = this._setup(selector, node, opt, true);\n if (this.#document === this.#content && filterSelector(selector)) {\n res = this.#nwsapi.match(selector, node);\n } else {\n this._correspond(selector);\n const nodes = this._find(TARGET_SELF);\n res = nodes.size;\n }\n } catch (e) {\n this._onError(e);\n }\n return !!res;\n }\n\n /**\n * closest\n * @param {string} selector - CSS selector\n * @param {object} node - Element node\n * @param {object} opt - options\n * @returns {?object} - matched node\n */\n closest(selector, node, opt) {\n let res;\n try {\n if (node.nodeType !== ELEMENT_NODE) {\n const msg = `Unexpected node ${node.nodeName}`;\n throw new TypeError(msg);\n }\n this.#node = this._setup(selector, node, opt, true);\n if (this.#document === this.#content && filterSelector(selector)) {\n res = this.#nwsapi.closest(selector, node);\n } else {\n this._correspond(selector);\n const nodes = this._find(TARGET_LINEAL);\n if (nodes.size) {\n let refNode = this.#node;\n while (refNode) {\n if (nodes.has(refNode)) {\n res = refNode;\n break;\n }\n refNode = refNode.parentNode;\n }\n }\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? null;\n }\n\n /**\n * query selector\n * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} opt - options\n * @returns {?object} - matched node\n */\n querySelector(selector, node, opt) {\n let res;\n try {\n this.#node = this._setup(selector, node, opt);\n if (this.#document === this.#content && this.#sibling &&\n !this.#descendant && filterSelector(selector)) {\n res = this.#nwsapi.first(selector, node);\n } else {\n this._prepareTreeWalkers(node);\n const nodes = this._find(TARGET_FIRST);\n nodes.delete(this.#node);\n if (nodes.size) {\n [res] = sortNodes(nodes);\n }\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 * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} opt - options\n * @returns {Array.} - collection of matched nodes\n */\n querySelectorAll(selector, node, opt) {\n let res;\n try {\n this.#node = this._setup(selector, node, opt);\n if (this.#document === this.#content && !this.#descendant &&\n filterSelector(selector)) {\n res = this.#nwsapi.select(selector, node);\n } else {\n this._prepareTreeWalkers(node);\n const nodes = this._find(TARGET_ALL);\n nodes.delete(this.#node);\n if (nodes.size) {\n if (this.#sort) {\n res = sortNodes(nodes);\n } else {\n res = [...nodes];\n }\n }\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? [];\n }\n};\n"], - "mappings": "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", - "names": ["finder_exports", "__export", "Finder", "__toCommonJS", "import_is_potential_custom_element_name", "import_nwsapi", "import_dom_util", "import_matcher", "import_parser", "import_constant", "DIR_NEXT", "DIR_PREV", "TARGET_ALL", "TARGET_FIRST", "TARGET_LINEAL", "TARGET_SELF", "WALKER_FILTER", "#ast", "#cache", "#content", "#descendant", "#document", "#finder", "#node", "#nodes", "#noexcept", "#nwsapi", "#results", "#root", "#shadow", "#sibling", "#sort", "#tree", "#warn", "#window", "window", "nwsapi", "e", "selector", "node", "opt", "skip", "noexcept", "warn", "nodes", "ast", "cachedItem", "item", "l", "i", "cssAst", "branches", "descendant", "sibling", "items", "branch", "leaves", "nextItem", "msg", "itemName", "walker", "current", "refNode", "anb", "a", "b", "reverse", "parentNode", "matched", "selectorBranches", "selectorNodes", "bool", "nth", "j", "localName", "prefix", "itemLocalName", "itemPrefix", "m", "nthName", "nthIdentName", "identName", "anbMap", "astName", "dir", "res", "parent", "langPart", "regExtendedLang", "langMain", "langSub", "langRest", "extendedMain", "extendedSub", "len", "extendedRest", "value", "leaf", "leafType", "combo", "twigLeaves", "itemType", "twig", "nextNode", "astData", "twigBranches", "forgive", "lastIndex", "nextNodes", "arr", "astChildren", "selectors", "css", "leavesSet", "regAnchor", "regFormCtrl", "regFormValidity", "regInteract", "regTypeCheck", "regTypeDate", "regTypeRange", "regTypeText", "href", "origin", "pathname", "attrURL", "hash", "id", "focus", "display", "visibility", "active", "isCustomElementName", "targetNode", "nodeName", "checked", "regTypeReset", "regTypeSubmit", "form", "isMultiple", "defaultOpt", "inputType", "node1", "node2", "host", "astType", "attributes", "nodeType", "result", "attr", "regForm", "save", "name", "leafName", "compound", "filterLeaves", "baseNode", "pending", "comboName", "matchedNode", "filtered", "complex", "targetType", "branchLen", "firstTwig", "firstCombo", "firstName", "firstType", "lastTwig", "lastName", "lastType", "pendingItems", "pendingItem", "index", "find", "entryNodes", "entryNodesLen", "n", "entryLeaves", "nextCombo", "entryNode"] + "sourcesContent": ["/**\n * finder.js\n */\n\n/* import */\nimport isCustomElementName from 'is-potential-custom-element-name';\nimport nwsapi from 'nwsapi';\nimport {\n getDirectionality, isContentEditable, isInclusive, isInShadowTree,\n resolveContent, sortNodes\n} from './dom-util.js';\nimport { matchPseudoElementSelector, matchSelector } from './matcher.js';\nimport {\n filterSelector, generateCSS, parseSelector, sortAST, unescapeSelector, walkAST\n} from './parser.js';\n\n/* constants */\nimport {\n ALPHA_NUM, COMBINATOR, DOCUMENT_FRAGMENT_NODE, DOCUMENT_NODE, ELEMENT_NODE,\n NOT_SUPPORTED_ERR, REG_LOGICAL_PSEUDO, REG_SHADOW_HOST, SELECTOR_CLASS,\n SELECTOR_ID, SELECTOR_PSEUDO_CLASS, SELECTOR_PSEUDO_ELEMENT, SELECTOR_TYPE,\n SHOW_ALL, SHOW_DOCUMENT, SHOW_DOCUMENT_FRAGMENT, SHOW_ELEMENT, SYNTAX_ERR,\n TEXT_NODE\n} from './constant.js';\nconst DIR_NEXT = 'next';\nconst DIR_PREV = 'prev';\nconst TARGET_ALL = 'all';\nconst TARGET_FIRST = 'first';\nconst TARGET_LINEAL = 'lineal';\nconst TARGET_SELF = 'self';\nconst WALKER_FILTER = SHOW_DOCUMENT | SHOW_DOCUMENT_FRAGMENT | SHOW_ELEMENT;\n\n/**\n * Finder\n * NOTE: #ast[i] corresponds to #nodes[i]\n * #ast: [\n * {\n * branch: branch[],\n * dir: string|null,\n * filtered: boolean,\n * find: boolean\n * },\n * {\n * branch: branch[],\n * dir: string|null,\n * filtered: boolean,\n * find: boolean\n * }\n * ]\n * #nodes: [\n * [node{}, node{}],\n * [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{}: CSSTree AST object\n * node{}: Element node\n */\nexport class Finder {\n /* private fields */\n #ast;\n #cache;\n #content;\n #descendant;\n #document;\n #finder;\n #node;\n #nodes;\n #noexcept;\n #nwsapi;\n #results;\n #root;\n #shadow;\n #sibling;\n #sort;\n #tree;\n #warn;\n #window;\n\n /**\n * construct\n * @param {object} window - window\n */\n constructor(window) {\n this.#window = window;\n this.#document = window.document;\n this.#cache = new WeakMap();\n this.#results = new WeakMap();\n this.#nwsapi = nwsapi({\n document: window.document,\n DOMException: window.DOMException\n });\n this.#nwsapi.configure({\n LOGERRORS: false\n });\n }\n\n /**\n * handle error\n * @private\n * @param {Error} e - Error\n * @throws Error\n * @returns {void}\n */\n _onError(e) {\n if (!this.#noexcept) {\n if (e instanceof DOMException ||\n e instanceof this.#window.DOMException) {\n if (e.name === NOT_SUPPORTED_ERR) {\n if (this.#warn) {\n console.warn(e.message);\n }\n } else {\n throw new this.#window.DOMException(e.message, e.name);\n }\n } else {\n throw e;\n }\n }\n }\n\n /**\n * setup finder\n * @private\n * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} opt - options\n * @param {boolean} [opt.noexcept] - no exception\n * @param {boolean} [opt.warn] - console warn\n * @returns {object} - node\n */\n _setup(selector, node, opt = {}) {\n const { noexcept, warn } = opt;\n this.#noexcept = !!noexcept;\n this.#warn = !!warn;\n this.#node = node;\n [this.#content, this.#root] = resolveContent(node);\n this.#shadow = isInShadowTree(node);\n this._correspond(selector);\n return node;\n }\n\n /**\n * correspond ast and nodes\n * @private\n * @param {string} selector - CSS selector\n * @returns {Array.>} - array of ast and nodes\n */\n _correspond(selector) {\n const nodes = [];\n let ast;\n let cachedItem = this.#content && this.#cache.get(this.#content);\n this.#descendant = false;\n this.#sibling = false;\n if (cachedItem && cachedItem.has(`${selector}`)) {\n const item = cachedItem.get(`${selector}`);\n ast = item.ast;\n this.#descendant = item.descendant;\n this.#sibling = item.sibling;\n }\n if (ast) {\n const l = ast.length;\n for (let i = 0; i < l; i++) {\n ast[i].dir = null;\n ast[i].filtered = false;\n ast[i].find = false;\n nodes[i] = [];\n }\n } else {\n let cssAst;\n try {\n cssAst = parseSelector(selector);\n } catch (e) {\n this._onError(e);\n }\n const branches = walkAST(cssAst);\n ast = [];\n let descendant = false;\n let sibling = false;\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 selector ${selector}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n const itemName = unescapeSelector(item.name);\n if (itemName === '~') {\n sibling = true;\n } else if (/^[\\s>]$/.test(itemName)) {\n descendant = true;\n }\n branch.push({\n combo: item,\n leaves: sortAST(leaves)\n });\n leaves.clear();\n } else if (item) {\n let { name: itemName } = item;\n if (itemName && typeof itemName === 'string') {\n itemName = unescapeSelector(itemName);\n if (/[|:]/.test(itemName)) {\n item.namespace = true;\n }\n }\n leaves.add(item);\n }\n if (items.length) {\n item = items.shift();\n } else {\n branch.push({\n combo: null,\n leaves: sortAST(leaves)\n });\n leaves.clear();\n break;\n }\n }\n }\n ast.push({\n branch,\n dir: null,\n filtered: false,\n find: false\n });\n nodes[i] = [];\n i++;\n }\n if (this.#content) {\n if (!cachedItem) {\n cachedItem = new Map();\n }\n cachedItem.set(`${selector}`, {\n ast,\n descendant,\n sibling\n });\n this.#cache.set(this.#content, cachedItem);\n }\n this.#descendant = descendant;\n this.#sibling = sibling;\n }\n this.#ast = ast;\n this.#nodes = nodes;\n return [\n ast,\n nodes\n ];\n }\n\n /**\n * prepare tree walkers\n * @private\n * @param {object} node - Document, DocumentFragment, Element node\n * @returns {Array} - [#tree, #finder]\n */\n _prepareTreeWalkers(node) {\n this.#tree = this.#document.createTreeWalker(this.#root, WALKER_FILTER);\n this.#finder = this.#document.createTreeWalker(node, WALKER_FILTER);\n this.#sort = false;\n return [\n this.#tree,\n this.#finder\n ];\n }\n\n /**\n * traverse tree walker\n * @private\n * @param {object} [node] - Element node\n * @param {object} [walker] - tree walker\n * @returns {?object} - current node\n */\n _traverse(node = {}, walker = this.#tree) {\n let current;\n let refNode = walker.currentNode;\n if (node.nodeType === ELEMENT_NODE && refNode === node) {\n current = refNode;\n } else {\n if (refNode !== walker.root) {\n while (refNode) {\n if (refNode === walker.root ||\n (node.nodeType === ELEMENT_NODE && refNode === node)) {\n break;\n }\n refNode = walker.parentNode();\n }\n }\n if (node.nodeType === ELEMENT_NODE) {\n while (refNode) {\n if (refNode === node) {\n current = refNode;\n break;\n }\n refNode = walker.nextNode();\n }\n } else {\n current = refNode;\n }\n }\n return current ?? null;\n }\n\n /**\n * collect nth child\n * @private\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 * @param {object} opt - options\n * @returns {Set.} - collection of matched nodes\n */\n _collectNthChild(anb, node, opt) {\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 walker = this.#document.createTreeWalker(parentNode, WALKER_FILTER);\n let l = 0;\n let refNode = walker.firstChild();\n while (refNode) {\n l++;\n refNode = walker.nextSibling();\n }\n refNode = this._traverse(parentNode, walker);\n const selectorNodes = new Set();\n if (selectorBranches) {\n refNode = this._traverse(parentNode, walker);\n refNode = walker.firstChild();\n while (refNode) {\n let bool;\n for (const leaves of selectorBranches) {\n bool = this._matchLeaves(leaves, refNode, opt);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n selectorNodes.add(refNode);\n }\n refNode = walker.nextSibling();\n }\n }\n // :first-child, :last-child, :nth-child(b of S), :nth-last-child(b of S)\n if (a === 0) {\n if (b > 0 && b <= l) {\n if (selectorNodes.size) {\n let i = 0;\n refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n if (selectorNodes.has(refNode)) {\n if (i === b - 1) {\n matched.add(refNode);\n break;\n }\n i++;\n }\n if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\n }\n }\n } else if (!selector) {\n let i = 0;\n refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n if (i === b - 1) {\n matched.add(refNode);\n break;\n }\n if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\n }\n i++;\n }\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 i = 0;\n let j = a > 0 ? 0 : b - 1;\n refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n if (refNode && nth >= 0 && nth < l) {\n if (selectorNodes.size) {\n if (selectorNodes.has(refNode)) {\n if (j === nth) {\n matched.add(refNode);\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(refNode);\n }\n nth += a;\n }\n if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\n }\n i++;\n } else {\n break;\n }\n }\n }\n }\n if (reverse && matched.size > 1) {\n const m = [...matched];\n return new Set(m.reverse());\n }\n } else if (node === this.#root && (a + b) === 1) {\n if (selectorBranches) {\n let bool;\n for (const leaves of selectorBranches) {\n bool = this._matchLeaves(leaves, node, opt);\n if (bool) {\n break;\n }\n }\n if (bool) {\n matched.add(node);\n }\n } else {\n matched.add(node);\n }\n }\n return matched;\n }\n\n /**\n * collect nth of type\n * @private\n * @param {object} anb - An+B options\n * @param {number} anb.a - a\n * @param {number} anb.b - b\n * @param {boolean} [anb.reverse] - reverse order\n * @param {object} node - Element node\n * @returns {Set.} - 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 walker = this.#document.createTreeWalker(parentNode, WALKER_FILTER);\n let l = 0;\n let refNode = walker.firstChild();\n while (refNode) {\n l++;\n refNode = walker.nextSibling();\n }\n // :first-of-type, :last-of-type\n if (a === 0) {\n if (b > 0 && b <= l) {\n let j = 0;\n refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n const { localName: itemLocalName, prefix: itemPrefix } = refNode;\n if (itemLocalName === localName && itemPrefix === prefix) {\n if (j === b - 1) {\n matched.add(refNode);\n break;\n }\n j++;\n }\n if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\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 refNode = this._traverse(parentNode, walker);\n if (reverse) {\n refNode = walker.lastChild();\n } else {\n refNode = walker.firstChild();\n }\n while (refNode) {\n const { localName: itemLocalName, prefix: itemPrefix } = refNode;\n if (itemLocalName === localName && itemPrefix === prefix) {\n if (j === nth) {\n matched.add(refNode);\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 if (reverse) {\n refNode = walker.previousSibling();\n } else {\n refNode = walker.nextSibling();\n }\n }\n }\n }\n if (reverse && matched.size > 1) {\n const m = [...matched];\n return new Set(m.reverse());\n }\n } else if (node === this.#root && (a + b) === 1) {\n matched.add(node);\n }\n return matched;\n }\n\n /**\n * match An+B\n * @private\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @param {string} nthName - nth pseudo-class name\n * @param {object} opt - options\n * @returns {Set.} - collection of matched nodes\n */\n _matchAnPlusB(ast, node, nthName, opt) {\n const {\n nth: {\n a,\n b,\n name: nthIdentName\n },\n selector\n } = ast;\n const identName = unescapeSelector(nthIdentName);\n const anbMap = new Map();\n if (identName) {\n if (identName === 'even') {\n anbMap.set('a', 2);\n anbMap.set('b', 0);\n } else if (identName === 'odd') {\n anbMap.set('a', 2);\n anbMap.set('b', 1);\n }\n if (nthName.indexOf('last') > -1) {\n anbMap.set('reverse', true);\n }\n } else {\n if (typeof a === 'string' && /-?\\d+/.test(a)) {\n anbMap.set('a', a * 1);\n } else {\n anbMap.set('a', 0);\n }\n if (typeof b === 'string' && /-?\\d+/.test(b)) {\n anbMap.set('b', b * 1);\n } else {\n anbMap.set('b', 0);\n }\n if (nthName.indexOf('last') > -1) {\n anbMap.set('reverse', true);\n }\n }\n 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, opt);\n return nodes;\n } else if (/^nth-(?:last-)?of-type$/.test(nthName)) {\n const anb = Object.fromEntries(anbMap);\n const nodes = this._collectNthOfType(anb, node);\n return nodes;\n }\n return new Set();\n }\n\n /**\n * match directionality pseudo-class - :dir()\n * @private\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 * @private\n * @see https://datatracker.ietf.org/doc/html/rfc4647#section-3.3.1\n * @param {object} ast - AST\n * @param {object} node - Element node\n * @returns {?object} - matched node\n */\n _matchLanguagePseudoClass(ast, node) {\n const astName = unescapeSelector(ast.name);\n let res;\n if (astName === '*') {\n if (node.hasAttribute('lang')) {\n if (node.getAttribute('lang')) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.nodeType === ELEMENT_NODE) {\n if (parent.hasAttribute('lang')) {\n if (parent.getAttribute('lang')) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n }\n } else if (astName) {\n const langPart = `(?:-${ALPHA_NUM})*`;\n const regLang = new RegExp(`^(?:\\\\*-)?${ALPHA_NUM}${langPart}$`, 'i');\n if (regLang.test(astName)) {\n let regExtendedLang;\n if (astName.indexOf('-') > -1) {\n const [langMain, langSub, ...langRest] = astName.split('-');\n let extendedMain;\n if (langMain === '*') {\n extendedMain = `${ALPHA_NUM}${langPart}`;\n } else {\n extendedMain = `${langMain}${langPart}`;\n }\n const extendedSub = `-${langSub}${langPart}`;\n const len = langRest.length;\n let extendedRest = '';\n if (len) {\n for (let i = 0; i < len; i++) {\n extendedRest += `-${langRest[i]}${langPart}`;\n }\n }\n regExtendedLang =\n new RegExp(`^${extendedMain}${extendedSub}${extendedRest}$`, 'i');\n } else {\n regExtendedLang = new RegExp(`^${astName}${langPart}$`, 'i');\n }\n if (node.hasAttribute('lang')) {\n if (regExtendedLang.test(node.getAttribute('lang'))) {\n res = node;\n }\n } else {\n let parent = node.parentNode;\n while (parent) {\n if (parent.nodeType === ELEMENT_NODE) {\n if (parent.hasAttribute('lang')) {\n const value = parent.getAttribute('lang');\n if (regExtendedLang.test(value)) {\n res = node;\n }\n break;\n }\n parent = parent.parentNode;\n } else {\n break;\n }\n }\n }\n }\n }\n return res ?? null;\n }\n\n /**\n * match :has() pseudo-class function\n * @private\n * @param {Array.} leaves - AST leaves\n * @param {object} node - Element node\n * @param {object} opt - options\n * @returns {boolean} - result\n */\n _matchHasPseudoFunc(leaves, node, opt = {}) {\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 opt.dir = DIR_NEXT;\n const nodes = this._matchCombinator(twig, node, opt);\n if (nodes.size) {\n if (leaves.length) {\n for (const nextNode of nodes) {\n bool = this._matchHasPseudoFunc(Object.assign([], leaves),\n nextNode, opt);\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 * @private\n * @param {object} astData - AST data\n * @param {object} node - Element node\n * @param {object} opt - options\n * @returns {?object} - matched node\n */\n _matchLogicalPseudoFunc(astData, node, opt = {}) {\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 for (const leaves of branches) {\n bool = this._matchHasPseudoFunc(Object.assign([], leaves), node, opt);\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 opt.forgive = forgive;\n const l = twigBranches.length;\n let bool;\n for (let i = 0; i < l; i++) {\n const branch = twigBranches[i];\n const lastIndex = branch.length - 1;\n const { leaves } = branch[lastIndex];\n bool = this._matchLeaves(leaves, node, opt);\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 opt.dir = DIR_PREV;\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, opt);\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n bool = true;\n } else {\n nextNodes = new Set(arr);\n }\n } else {\n bool = false;\n break;\n }\n }\n }\n if (bool) {\n break;\n }\n }\n if (astName === 'not') {\n if (!bool) {\n res = node;\n }\n } else if (bool) {\n res = node;\n }\n }\n return res ?? null;\n }\n\n /**\n * match pseudo-class selector\n * @private\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] - forgive unknown pseudo-class\n * @param {boolean} [opt.warn] - warn unsupported pseudo-class\n * @returns {Set.} - collection of matched nodes\n */\n _matchPseudoClassSelector(ast, node, opt = {}) {\n const { children: astChildren } = ast;\n const { localName, parentNode } = node;\n const {\n forgive,\n warn = this.#warn\n } = opt;\n const astName = unescapeSelector(ast.name);\n const matched = new Set();\n // :has(), :is(), :not(), :where()\n if (REG_LOGICAL_PSEUDO.test(astName)) {\n let astData;\n if (this.#cache.has(ast)) {\n astData = this.#cache.get(ast);\n } else {\n const branches = walkAST(ast);\n const selectors = [];\n const twigBranches = [];\n for (const [...leaves] of branches) {\n for (const leaf of leaves) {\n const css = generateCSS(leaf);\n selectors.push(css);\n }\n const branch = [];\n const leavesSet = new Set();\n let item = leaves.shift();\n while (item) {\n if (item.type === COMBINATOR) {\n branch.push({\n combo: item,\n leaves: [...leavesSet]\n });\n leavesSet.clear();\n } else if (item) {\n leavesSet.add(item);\n }\n if (leaves.length) {\n item = leaves.shift();\n } else {\n branch.push({\n combo: null,\n leaves: [...leavesSet]\n });\n leavesSet.clear();\n break;\n }\n }\n twigBranches.push(branch);\n }\n astData = {\n astName,\n branches,\n twigBranches,\n selector: selectors.join(',')\n };\n this.#cache.set(ast, astData);\n }\n const res = this._matchLogicalPseudoFunc(astData, node, opt);\n if (res) {\n matched.add(res);\n }\n } else if (Array.isArray(astChildren)) {\n const [branch] = astChildren;\n // :nth-child(), :nth-last-child(), nth-of-type(), :nth-last-of-type()\n if (/^nth-(?:last-)?(?:child|of-type)$/.test(astName)) {\n const nodes = this._matchAnPlusB(branch, node, astName, opt);\n return nodes;\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 (warn) {\n const msg = `Unsupported pseudo-class :${astName}()`;\n throw new DOMException(msg, NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'host':\n case 'host-context': {\n // ignore\n break;\n }\n default: {\n if (!forgive) {\n const msg = `Unknown pseudo-class :${astName}()`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n }\n }\n }\n } else {\n const regAnchor = /^a(?:rea)?$/;\n const regFormCtrl =\n /^(?:(?:fieldse|inpu|selec)t|button|opt(?:group|ion)|textarea)$/;\n const regFormValidity = /^(?:(?:inpu|selec)t|button|form|textarea)$/;\n const regInteract = /^d(?:etails|ialog)$/;\n const regTypeCheck = /^(?:checkbox|radio)$/;\n const regTypeDate = /^(?:date(?:time-local)?|month|time|week)$/;\n const regTypeRange =\n /(?:(?:rang|tim)e|date(?:time-local)?|month|number|week)$/;\n const regTypeText = /^(?:(?:emai|te|ur)l|number|password|search|text)$/;\n switch (astName) {\n case 'any-link':\n case 'link': {\n if (regAnchor.test(localName) && node.hasAttribute('href')) {\n matched.add(node);\n }\n break;\n }\n case 'local-link': {\n if (regAnchor.test(localName) && node.hasAttribute('href')) {\n const { href, origin, pathname } = new URL(this.#content.URL);\n const attrURL = new URL(node.getAttribute('href'), href);\n if (attrURL.origin === origin && attrURL.pathname === pathname) {\n matched.add(node);\n }\n }\n break;\n }\n case 'visited': {\n // prevent fingerprinting\n break;\n }\n case 'target': {\n const { hash } = new URL(this.#content.URL);\n if (node.id && hash === `#${node.id}` &&\n this.#content.contains(node)) {\n matched.add(node);\n }\n break;\n }\n case 'target-within': {\n const { hash } = new URL(this.#content.URL);\n if (hash) {\n const id = hash.replace(/^#/, '');\n let current = this.#content.getElementById(id);\n while (current) {\n if (current === node) {\n matched.add(node);\n break;\n }\n current = current.parentNode;\n }\n }\n break;\n }\n case 'scope': {\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (!this.#shadow && node === this.#node) {\n matched.add(node);\n }\n } else if (node === this.#content.documentElement) {\n matched.add(node);\n }\n break;\n }\n case 'focus': {\n if (node === this.#content.activeElement) {\n let focus = true;\n let refNode = node;\n while (refNode) {\n if (refNode.hasAttribute('hidden')) {\n focus = false;\n break;\n } else if (refNode.hasAttribute('style')) {\n const { display, visibility } = refNode.style;\n focus = !(display === 'none' || visibility === 'hidden');\n if (!focus) {\n break;\n }\n }\n if (refNode.parentNode &&\n refNode.parentNode.nodeType === ELEMENT_NODE) {\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n if (focus) {\n matched.add(node);\n }\n }\n break;\n }\n case 'focus-within': {\n let active;\n let current = this.#content.activeElement;\n while (current) {\n if (current === node) {\n active = true;\n break;\n }\n current = current.parentNode;\n }\n if (active) {\n let focus = true;\n let refNode = node;\n while (refNode) {\n if (refNode.hasAttribute('hidden')) {\n focus = false;\n break;\n } else if (refNode.hasAttribute('style')) {\n const { display, visibility } = refNode.style;\n focus = !(display === 'none' || visibility === 'hidden');\n if (!focus) {\n break;\n }\n }\n if (refNode.parentNode &&\n refNode.parentNode.nodeType === ELEMENT_NODE) {\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n if (focus) {\n matched.add(node);\n }\n }\n break;\n }\n case 'open': {\n if (regInteract.test(localName) && node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'closed': {\n if (regInteract.test(localName) && !node.hasAttribute('open')) {\n matched.add(node);\n }\n break;\n }\n case 'disabled': {\n if (regFormCtrl.test(localName) || isCustomElementName(localName)) {\n if (node.disabled || node.hasAttribute('disabled')) {\n matched.add(node);\n } else {\n let parent = parentNode;\n while (parent) {\n if (parent.localName === 'fieldset') {\n break;\n }\n parent = parent.parentNode;\n }\n if (parent && parentNode.localName !== 'legend' &&\n parent.hasAttribute('disabled')) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'enabled': {\n if ((regFormCtrl.test(localName) || isCustomElementName(localName)) &&\n !(node.disabled && node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n case 'read-only': {\n switch (localName) {\n case 'textarea': {\n if (node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled')) {\n matched.add(node);\n }\n break;\n }\n case 'input': {\n if ((!node.type || regTypeDate.test(node.type) ||\n regTypeText.test(node.type)) &&\n (node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n default: {\n if (!isContentEditable(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'read-write': {\n switch (localName) {\n case 'textarea': {\n if (!(node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n case 'input': {\n if ((!node.type || regTypeDate.test(node.type) ||\n regTypeText.test(node.type)) &&\n !(node.readonly || node.hasAttribute('readonly') ||\n node.disabled || node.hasAttribute('disabled'))) {\n matched.add(node);\n }\n break;\n }\n default: {\n if (isContentEditable(node)) {\n matched.add(node);\n }\n }\n }\n break;\n }\n case 'placeholder-shown': {\n let targetNode;\n if (localName === 'textarea') {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n if (regTypeText.test(node.getAttribute('type'))) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode && node.value === '' &&\n node.hasAttribute('placeholder') &&\n node.getAttribute('placeholder').trim().length) {\n matched.add(node);\n }\n break;\n }\n case 'checked': {\n if ((node.checked && localName === 'input' &&\n node.hasAttribute('type') &&\n regTypeCheck.test(node.getAttribute('type'))) ||\n (node.selected && localName === 'option')) {\n matched.add(node);\n }\n break;\n }\n case 'indeterminate': {\n if ((node.indeterminate && localName === 'input' &&\n node.type === 'checkbox') ||\n (localName === 'progress' && !node.hasAttribute('value'))) {\n matched.add(node);\n } else if (localName === 'input' && node.type === 'radio' &&\n !node.hasAttribute('checked')) {\n const nodeName = node.name;\n let parent = node.parentNode;\n while (parent) {\n if (parent.localName === 'form') {\n break;\n }\n parent = parent.parentNode;\n }\n if (!parent) {\n parent = this.#content.documentElement;\n }\n let checked;\n const items = parent.getElementsByTagName('input');\n const l = items.length;\n if (l) {\n for (let i = 0; i < l; i++) {\n const item = items[i];\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 }\n if (!checked) {\n matched.add(node);\n }\n }\n break;\n }\n case 'default': {\n const regTypeReset = /^(?:button|reset)$/;\n const regTypeSubmit = /^(?:image|submit)$/;\n // button[type=\"submit\"], input[type=\"submit\"], input[type=\"image\"]\n if ((localName === 'button' &&\n !(node.hasAttribute('type') &&\n regTypeReset.test(node.getAttribute('type')))) ||\n (localName === 'input' && node.hasAttribute('type') &&\n regTypeSubmit.test(node.getAttribute('type')))) {\n let form = node.parentNode;\n while (form) {\n if (form.localName === 'form') {\n break;\n }\n form = form.parentNode;\n }\n if (form) {\n const walker =\n this.#document.createTreeWalker(form, SHOW_ELEMENT);\n let nextNode = walker.firstChild();\n while (nextNode) {\n const nodeName = nextNode.localName;\n let m;\n if (nodeName === 'button') {\n m = !(nextNode.hasAttribute('type') &&\n regTypeReset.test(nextNode.getAttribute('type')));\n } else if (nodeName === 'input') {\n m = nextNode.hasAttribute('type') &&\n regTypeSubmit.test(nextNode.getAttribute('type'));\n }\n if (m) {\n if (nextNode === node) {\n matched.add(node);\n }\n break;\n }\n nextNode = walker.nextNode();\n }\n }\n // input[type=\"checkbox\"], input[type=\"radio\"]\n } else if (localName === 'input' && node.hasAttribute('type') &&\n regTypeCheck.test(node.getAttribute('type')) &&\n (node.checked || node.hasAttribute('checked'))) {\n matched.add(node);\n // option\n } else if (localName === 'option') {\n let isMultiple = false;\n let parent = parentNode;\n while (parent) {\n if (parent.localName === 'datalist') {\n break;\n } else if (parent.localName === 'select') {\n if (parent.multiple || parent.hasAttribute('multiple')) {\n isMultiple = true;\n }\n break;\n }\n parent = parent.parentNode;\n }\n if (isMultiple) {\n if (node.selected || node.hasAttribute('selected')) {\n matched.add(node);\n }\n } else {\n const defaultOpt = new Set();\n const walker =\n this.#document.createTreeWalker(parentNode, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n if (refNode.selected || refNode.hasAttribute('selected')) {\n defaultOpt.add(refNode);\n break;\n }\n refNode = walker.nextSibling();\n }\n if (defaultOpt.size) {\n if (defaultOpt.has(node)) {\n matched.add(node);\n }\n }\n }\n }\n break;\n }\n case 'valid': {\n if (regFormValidity.test(localName)) {\n if (node.checkValidity()) {\n matched.add(node);\n }\n } else if (localName === 'fieldset') {\n let bool;\n const walker = this.#document.createTreeWalker(node, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n if (regFormValidity.test(refNode.localName)) {\n bool = refNode.checkValidity();\n if (!bool) {\n break;\n }\n }\n refNode = walker.nextNode();\n }\n if (bool) {\n matched.add(node);\n }\n }\n break;\n }\n case 'invalid': {\n if (regFormValidity.test(localName)) {\n if (!node.checkValidity()) {\n matched.add(node);\n }\n } else if (localName === 'fieldset') {\n let bool;\n const walker = this.#document.createTreeWalker(node, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n if (regFormValidity.test(refNode.localName)) {\n bool = refNode.checkValidity();\n if (!bool) {\n break;\n }\n }\n refNode = walker.nextNode();\n }\n if (!bool) {\n matched.add(node);\n }\n }\n break;\n }\n case 'in-range': {\n if (localName === 'input' &&\n !(node.readonly || node.hasAttribute('readonly')) &&\n !(node.disabled || node.hasAttribute('disabled')) &&\n node.hasAttribute('type') &&\n regTypeRange.test(node.getAttribute('type')) &&\n !(node.validity.rangeUnderflow ||\n node.validity.rangeOverflow) &&\n (node.hasAttribute('min') || node.hasAttribute('max') ||\n node.getAttribute('type') === 'range')) {\n matched.add(node);\n }\n break;\n }\n case 'out-of-range': {\n if (localName === 'input' &&\n !(node.readonly || node.hasAttribute('readonly')) &&\n !(node.disabled || node.hasAttribute('disabled')) &&\n node.hasAttribute('type') &&\n regTypeRange.test(node.getAttribute('type')) &&\n (node.validity.rangeUnderflow || node.validity.rangeOverflow)) {\n matched.add(node);\n }\n break;\n }\n case 'required': {\n let targetNode;\n if (/^(?:select|textarea)$/.test(localName)) {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n const inputType = node.getAttribute('type');\n if (inputType === 'file' || regTypeCheck.test(inputType) ||\n regTypeDate.test(inputType) || regTypeText.test(inputType)) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode &&\n (node.required || node.hasAttribute('required'))) {\n matched.add(node);\n }\n break;\n }\n case 'optional': {\n let targetNode;\n if (/^(?:select|textarea)$/.test(localName)) {\n targetNode = node;\n } else if (localName === 'input') {\n if (node.hasAttribute('type')) {\n const inputType = node.getAttribute('type');\n if (inputType === 'file' || regTypeCheck.test(inputType) ||\n regTypeDate.test(inputType) || regTypeText.test(inputType)) {\n targetNode = node;\n }\n } else {\n targetNode = node;\n }\n }\n if (targetNode &&\n !(node.required || node.hasAttribute('required'))) {\n matched.add(node);\n }\n break;\n }\n case 'root': {\n if (node === this.#content.documentElement) {\n matched.add(node);\n }\n break;\n }\n case 'empty': {\n if (node.hasChildNodes()) {\n let bool;\n const walker = this.#document.createTreeWalker(node, SHOW_ALL);\n let refNode = walker.firstChild();\n while (refNode) {\n bool = refNode.nodeType !== ELEMENT_NODE &&\n refNode.nodeType !== TEXT_NODE;\n if (!bool) {\n break;\n }\n refNode = walker.nextSibling();\n }\n if (bool) {\n matched.add(node);\n }\n } else {\n matched.add(node);\n }\n break;\n }\n case 'first-child': {\n if ((parentNode && node === parentNode.firstElementChild) ||\n node === this.#root) {\n matched.add(node);\n }\n break;\n }\n case 'last-child': {\n if ((parentNode && node === parentNode.lastElementChild) ||\n node === this.#root) {\n matched.add(node);\n }\n break;\n }\n case 'only-child': {\n if ((parentNode && node === parentNode.firstElementChild &&\n node === parentNode.lastElementChild) || node === this.#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 (node === this.#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 (node === this.#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 (node === this.#root) {\n matched.add(node);\n }\n break;\n }\n case 'host':\n case 'host-context': {\n // ignore\n break;\n }\n // legacy pseudo-elements\n case 'after':\n case 'before':\n case 'first-letter':\n case 'first-line': {\n if (warn) {\n const msg = `Unsupported pseudo-element ::${astName}`;\n throw new DOMException(msg, NOT_SUPPORTED_ERR);\n }\n break;\n }\n case 'active':\n case 'autofill':\n case 'blank':\n case 'buffering':\n case 'current':\n case 'defined':\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 (warn) {\n const msg = `Unsupported pseudo-class :${astName}`;\n throw new DOMException(msg, NOT_SUPPORTED_ERR);\n }\n break;\n }\n default: {\n if (astName.startsWith('-webkit-')) {\n if (warn) {\n const msg = `Unsupported pseudo-class :${astName}`;\n throw new DOMException(msg, NOT_SUPPORTED_ERR);\n }\n } else if (!forgive) {\n const msg = `Unknown pseudo-class :${astName}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n }\n }\n }\n return matched;\n }\n\n /**\n * match shadow host pseudo class\n * @private\n * @param {object} ast - AST\n * @param {object} node - DocumentFragment node\n * @returns {?object} - matched node\n */\n _matchShadowHostPseudoClass(ast, node) {\n const { children: astChildren } = ast;\n const astName = unescapeSelector(ast.name);\n let res;\n if (Array.isArray(astChildren)) {\n const [branch] = walkAST(astChildren[0]);\n const [...leaves] = branch;\n const { host } = node;\n if (astName === 'host') {\n let bool;\n for (const leaf of leaves) {\n const { type: leafType } = leaf;\n if (leafType === COMBINATOR) {\n const css = generateCSS(ast);\n const msg = `Invalid selector ${css}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n bool = this._matchSelector(leaf, host).has(host);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n res = node;\n }\n } else if (astName === 'host-context') {\n let bool;\n let parent = host;\n while (parent) {\n for (const leaf of leaves) {\n const { type: leafType } = leaf;\n if (leafType === COMBINATOR) {\n const css = generateCSS(ast);\n const msg = `Invalid selector ${css}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n bool = this._matchSelector(leaf, parent).has(parent);\n if (!bool) {\n break;\n }\n }\n if (bool) {\n break;\n } else {\n parent = parent.parentNode;\n }\n }\n if (bool) {\n res = node;\n }\n }\n } else if (astName === 'host') {\n res = node;\n } else {\n const msg = `Invalid selector :${astName}`;\n throw new DOMException(msg, SYNTAX_ERR);\n }\n return res ?? null;\n }\n\n /**\n * match selector\n * @private\n * @param {object} ast - AST\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} [opt] - options\n * @returns {Set.} - collection of matched nodes\n */\n _matchSelector(ast, node, opt) {\n const { type: astType } = ast;\n const astName = unescapeSelector(ast.name);\n const matched = new Set();\n if (node.nodeType === ELEMENT_NODE) {\n switch (astType) {\n case SELECTOR_PSEUDO_ELEMENT: {\n matchPseudoElementSelector(astName, opt);\n break;\n }\n case SELECTOR_ID: {\n if (node.id === astName) {\n matched.add(node);\n }\n break;\n }\n case SELECTOR_CLASS: {\n if (node.classList.contains(astName)) {\n matched.add(node);\n }\n break;\n }\n case SELECTOR_PSEUDO_CLASS: {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n return nodes;\n }\n default: {\n const res = matchSelector(ast, node, opt);\n if (res) {\n matched.add(res);\n }\n }\n }\n } else if (this.#shadow && astType === SELECTOR_PSEUDO_CLASS &&\n node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n if (astName !== 'has' && REG_LOGICAL_PSEUDO.test(astName)) {\n const nodes = this._matchPseudoClassSelector(ast, node, opt);\n return nodes;\n } else if (REG_SHADOW_HOST.test(astName)) {\n const res = this._matchShadowHostPseudoClass(ast, node, opt);\n if (res) {\n matched.add(res);\n }\n }\n }\n return matched;\n }\n\n /**\n * match leaves\n * @private\n * @param {Array.} leaves - AST leaves\n * @param {object} node - node\n * @param {object} opt - options\n * @returns {boolean} - result\n */\n _matchLeaves(leaves, node, opt) {\n const { attributes, localName, nodeType } = node;\n let bool;\n let result = this.#results.get(leaves);\n if (result && result.has(node)) {\n const { attr, matched } = result.get(node);\n if (attributes?.length === attr) {\n bool = matched;\n }\n }\n if (typeof bool !== 'boolean') {\n const regForm = /^(?:(?:fieldse|inpu|selec)t|button|form|textarea)$/;\n let save;\n if (nodeType === ELEMENT_NODE && regForm.test(localName)) {\n save = false;\n } else {\n save = true;\n }\n for (const leaf of leaves) {\n const { name, type: leafType } = leaf;\n const leafName = unescapeSelector(name);\n if (leafType === SELECTOR_PSEUDO_CLASS && leafName === 'dir') {\n save = false;\n }\n bool = this._matchSelector(leaf, node, opt).has(node);\n if (!bool) {\n break;\n }\n }\n if (save) {\n if (!result) {\n result = new WeakMap();\n }\n result.set(node, {\n attr: attributes?.length,\n matched: bool\n });\n this.#results.set(leaves, result);\n }\n }\n return !!bool;\n }\n\n /**\n * match HTML collection\n * @private\n * @param {object} items - HTML collection\n * @param {object} opt - options\n * @returns {Set.} - matched nodes\n */\n _matchHTMLCollection(items, opt = {}) {\n const { compound, filterLeaves } = opt;\n const nodes = new Set();\n const l = items.length;\n if (l) {\n if (compound) {\n for (let i = 0; i < l; i++) {\n const item = items[i];\n const bool = this._matchLeaves(filterLeaves, item, opt);\n if (bool) {\n nodes.add(item);\n }\n }\n } else {\n const arr = [].slice.call(items);\n return new Set(arr);\n }\n }\n return nodes;\n }\n\n /**\n * find descendant nodes\n * @private\n * @param {Array.} leaves - AST leaves\n * @param {object} baseNode - base Element node\n * @param {object} opt - options\n * @returns {object} - collection of nodes and pending state\n */\n _findDescendantNodes(leaves, baseNode, opt) {\n const [leaf, ...filterLeaves] = leaves;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const compound = filterLeaves.length > 0;\n let nodes = new Set();\n let pending = false;\n if (this.#shadow) {\n pending = true;\n } else {\n switch (leafType) {\n case SELECTOR_PSEUDO_ELEMENT: {\n matchPseudoElementSelector(leafName, opt);\n break;\n }\n case SELECTOR_ID: {\n if (this.#root.nodeType === ELEMENT_NODE) {\n pending = true;\n } else {\n const node = this.#root.getElementById(leafName);\n if (node && node !== baseNode && baseNode.contains(node)) {\n if (compound) {\n const bool = this._matchLeaves(filterLeaves, node, opt);\n if (bool) {\n nodes.add(node);\n }\n } else {\n nodes.add(node);\n }\n }\n }\n break;\n }\n case SELECTOR_CLASS: {\n const items = baseNode.getElementsByClassName(leafName);\n nodes = this._matchHTMLCollection(items, {\n compound,\n filterLeaves\n });\n break;\n }\n case SELECTOR_TYPE: {\n if (this.#content.contentType === 'text/html' &&\n !/[*|]/.test(leafName)) {\n const items = baseNode.getElementsByTagName(leafName);\n nodes = this._matchHTMLCollection(items, {\n compound,\n filterLeaves\n });\n } else {\n pending = true;\n }\n break;\n }\n default: {\n pending = true;\n }\n }\n }\n return {\n nodes,\n pending\n };\n }\n\n /**\n * match combinator\n * @private\n * @param {object} twig - twig\n * @param {object} node - Element node\n * @param {object} opt - option\n * @returns {Set.} - collection of matched nodes\n */\n _matchCombinator(twig, node, opt = {}) {\n const { combo, leaves } = twig;\n const { name: comboName } = combo;\n const { dir } = opt;\n const matched = new Set();\n if (dir === DIR_NEXT) {\n switch (comboName) {\n case '+': {\n const refNode = node.nextElementSibling;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case '~': {\n const { parentNode } = node;\n if (parentNode) {\n const walker =\n this.#document.createTreeWalker(parentNode, SHOW_ELEMENT);\n let refNode = this._traverse(node, walker);\n if (refNode === node) {\n refNode = walker.nextSibling();\n }\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n refNode = walker.nextSibling();\n }\n }\n break;\n }\n case '>': {\n const walker = this.#document.createTreeWalker(node, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n refNode = walker.nextSibling();\n }\n break;\n }\n case ' ':\n default: {\n const { nodes, pending } = this._findDescendantNodes(leaves, node);\n if (nodes.size) {\n return nodes;\n }\n if (pending) {\n const walker = this.#document.createTreeWalker(node, SHOW_ELEMENT);\n let refNode = walker.nextNode();\n while (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n refNode = walker.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, opt);\n if (bool) {\n matched.add(refNode);\n }\n }\n break;\n }\n case '~': {\n const walker =\n this.#document.createTreeWalker(node.parentNode, SHOW_ELEMENT);\n let refNode = walker.firstChild();\n while (refNode) {\n if (refNode === node) {\n break;\n } else {\n const bool = this._matchLeaves(leaves, refNode, opt);\n if (bool) {\n matched.add(refNode);\n }\n }\n refNode = walker.nextSibling();\n }\n break;\n }\n case '>': {\n const refNode = node.parentNode;\n if (refNode) {\n const bool = this._matchLeaves(leaves, refNode, opt);\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, opt);\n if (bool) {\n arr.push(refNode);\n }\n refNode = refNode.parentNode;\n }\n if (arr.length) {\n return new Set(arr.reverse());\n }\n }\n }\n }\n return matched;\n }\n\n /**\n * find matched node from finder\n * @private\n * @param {Array.} leaves - AST leaves\n * @param {object} [opt] - options\n * @param {object} [opt.node] - node to start from\n * @returns {?object} - matched node\n */\n _findNode(leaves, opt = {}) {\n const { node } = opt;\n let matchedNode;\n let refNode = this._traverse(node, this.#finder);\n if (refNode) {\n if (refNode.nodeType !== ELEMENT_NODE) {\n refNode = this.#finder.nextNode();\n } else if (refNode === node) {\n if (refNode !== this.#root) {\n refNode = this.#finder.nextNode();\n }\n }\n while (refNode) {\n let bool;\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (refNode === this.#node) {\n bool = true;\n } else {\n bool = this.#node.contains(refNode);\n }\n } else {\n bool = true;\n }\n if (bool) {\n const matched = this._matchLeaves(leaves, refNode, {\n warn: this.#warn\n });\n if (matched) {\n matchedNode = refNode;\n break;\n }\n }\n refNode = this.#finder.nextNode();\n }\n }\n return matchedNode ?? null;\n }\n\n /**\n * match self\n * @private\n * @param {Array} leaves - AST leaves\n * @returns {Array} - [nodes, filtered]\n */\n _matchSelf(leaves) {\n const nodes = [];\n let filtered = false;\n const bool = this._matchLeaves(leaves, this.#node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(this.#node);\n filtered = true;\n }\n return [nodes, filtered];\n }\n\n /**\n * find lineal\n * @private\n * @param {Array} leaves - AST leaves\n * @param {object} opt - options\n * @returns {Array} - [nodes, filtered]\n */\n _findLineal(leaves, opt = {}) {\n const { complex } = opt;\n const nodes = [];\n let filtered = false;\n let bool = this._matchLeaves(leaves, this.#node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(this.#node);\n filtered = true;\n }\n if (!bool || complex) {\n let refNode = this.#node.parentNode;\n while (refNode) {\n bool = this._matchLeaves(leaves, refNode, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(refNode);\n filtered = true;\n }\n if (refNode.parentNode) {\n refNode = refNode.parentNode;\n } else {\n break;\n }\n }\n }\n return [nodes, filtered];\n }\n\n /**\n * find first\n * @private\n * @param {Array} leaves - AST leaves\n * @returns {Array} - [nodes, filtered]\n */\n _findFirst(leaves) {\n const nodes = [];\n let filtered = false;\n const node = this._findNode(leaves, {\n node: this.#node\n });\n if (node) {\n nodes.push(node);\n filtered = true;\n }\n return [nodes, filtered];\n }\n\n /**\n * find from HTML collection\n * @private\n * @param {object} items - HTML collection\n * @param {object} opt - options\n * @param {boolean} [opt.compound] - compound selector\n * @param {Array} [opt.filterLeaves] - filter leaves\n * @returns {Array} - [nodes, filtered]\n */\n _findFromHTMLCollection(items, opt = {}) {\n const { complex, compound, filterLeaves } = opt;\n let nodes = [];\n let filtered = false;\n let pending = false;\n const l = items.length;\n if (l) {\n if (this.#node.nodeType === ELEMENT_NODE) {\n for (let i = 0; i < l; i++) {\n const node = items[i];\n if (node === this.#node || isInclusive(node, this.#node)) {\n if (compound) {\n const bool = this._matchLeaves(filterLeaves, node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(node);\n filtered = true;\n }\n } else {\n nodes.push(node);\n filtered = true;\n }\n }\n }\n } else if (complex) {\n if (compound) {\n for (let i = 0; i < l; i++) {\n const node = items[i];\n const bool = this._matchLeaves(filterLeaves, node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(node);\n filtered = true;\n }\n }\n } else {\n nodes = [].slice.call(items);\n filtered = true;\n }\n } else if (compound) {\n pending = true;\n } else {\n nodes = [].slice.call(items);\n filtered = true;\n }\n }\n return [nodes, filtered, pending];\n }\n\n /**\n * find entry nodes\n * @private\n * @param {object} twig - twig\n * @param {string} targetType - target type\n * @param {boolean} complex - complex selector\n * @returns {object} - collection of nodes etc.\n */\n _findEntryNodes(twig, targetType, complex) {\n const { leaves } = twig;\n const [leaf, ...filterLeaves] = leaves;\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n const compound = filterLeaves.length > 0;\n let nodes = [];\n let filtered = false;\n let pending = false;\n switch (leafType) {\n case SELECTOR_PSEUDO_ELEMENT: {\n matchPseudoElementSelector(leafName, {\n warn: this.#warn\n });\n break;\n }\n case SELECTOR_ID: {\n if (targetType === TARGET_SELF) {\n [nodes, filtered] = this._matchSelf(leaves);\n } else if (targetType === TARGET_LINEAL) {\n [nodes, filtered] = this._findLineal(leaves, {\n complex\n });\n } else if (targetType === TARGET_FIRST &&\n this.#root.nodeType !== ELEMENT_NODE) {\n const node = this.#root.getElementById(leafName);\n if (node) {\n if (compound) {\n const bool = this._matchLeaves(filterLeaves, node, {\n warn: this.#warn\n });\n if (bool) {\n nodes.push(node);\n filtered = true;\n }\n } else {\n nodes.push(node);\n filtered = true;\n }\n }\n } else {\n pending = true;\n }\n break;\n }\n case SELECTOR_CLASS: {\n if (targetType === TARGET_SELF) {\n [nodes, filtered] = this._matchSelf(leaves);\n } else if (targetType === TARGET_LINEAL) {\n [nodes, filtered] = this._findLineal(leaves, {\n complex\n });\n } else if (targetType === TARGET_FIRST) {\n [nodes, filtered] = this._findFirst(leaves);\n } else if (this.#root.nodeType === DOCUMENT_NODE) {\n const items = this.#root.getElementsByClassName(leafName);\n [nodes, filtered, pending] = this._findFromHTMLCollection(items, {\n complex,\n compound,\n filterLeaves\n });\n } else {\n pending = true;\n }\n break;\n }\n case SELECTOR_TYPE: {\n if (targetType === TARGET_SELF) {\n [nodes, filtered] = this._matchSelf(leaves);\n } else if (targetType === TARGET_LINEAL) {\n [nodes, filtered] = this._findLineal(leaves, {\n complex\n });\n } else if (this.#content.contentType === 'text/html' &&\n this.#root.nodeType === DOCUMENT_NODE &&\n !/[*|]/.test(leafName)) {\n const items = this.#root.getElementsByTagName(leafName);\n [nodes, filtered, pending] = this._findFromHTMLCollection(items, {\n complex,\n compound,\n filterLeaves\n });\n } else {\n pending = true;\n }\n break;\n }\n default: {\n if (targetType !== TARGET_LINEAL && REG_SHADOW_HOST.test(leafName)) {\n if (this.#shadow &&\n this.#node.nodeType === DOCUMENT_FRAGMENT_NODE) {\n const node = this._matchShadowHostPseudoClass(leaf, this.#node);\n if (node) {\n nodes.push(node);\n filtered = true;\n }\n }\n } else if (targetType === TARGET_SELF) {\n [nodes, filtered] = this._matchSelf(leaves);\n } else if (targetType === TARGET_LINEAL) {\n [nodes, filtered] = this._findLineal(leaves, {\n complex\n });\n } else if (targetType === TARGET_FIRST) {\n [nodes, filtered] = this._findFirst(leaves);\n } else {\n pending = true;\n }\n }\n }\n return {\n compound,\n filtered,\n nodes,\n pending\n };\n }\n\n /**\n * get entry twig\n * @private\n * @param {Array.} branch - AST branch\n * @param {string} targetType - target type\n * @returns {object} - direction and twig\n */\n _getEntryTwig(branch, targetType) {\n const branchLen = branch.length;\n const complex = branchLen > 1;\n const firstTwig = branch[0];\n let dir;\n let twig;\n if (complex) {\n const {\n combo: firstCombo,\n leaves: [{\n name: firstName,\n type: firstType\n }]\n } = firstTwig;\n const lastTwig = branch[branchLen - 1];\n const {\n leaves: [{\n name: lastName,\n type: lastType\n }]\n } = lastTwig;\n if (lastType === SELECTOR_PSEUDO_ELEMENT || lastType === SELECTOR_ID) {\n dir = DIR_PREV;\n twig = lastTwig;\n } else if (firstType === SELECTOR_PSEUDO_ELEMENT ||\n firstType === SELECTOR_ID) {\n dir = DIR_NEXT;\n twig = firstTwig;\n } else if (targetType === TARGET_ALL) {\n if (firstName === '*' && firstType === SELECTOR_TYPE) {\n dir = DIR_PREV;\n twig = lastTwig;\n } else if (lastName === '*' && lastType === SELECTOR_TYPE) {\n dir = DIR_NEXT;\n twig = firstTwig;\n } else if (branchLen === 2) {\n const { name: comboName } = firstCombo;\n if (/^[+~]$/.test(comboName)) {\n dir = DIR_PREV;\n twig = lastTwig;\n } else {\n dir = DIR_NEXT;\n twig = firstTwig;\n }\n } else {\n dir = DIR_NEXT;\n twig = firstTwig;\n }\n } else if (lastName === '*' && lastType === SELECTOR_TYPE) {\n dir = DIR_NEXT;\n twig = firstTwig;\n } else if (firstName === '*' && firstType === SELECTOR_TYPE) {\n dir = DIR_PREV;\n twig = lastTwig;\n } else {\n let bool;\n let sibling;\n for (const { combo, leaves: [leaf] } of branch) {\n const { type: leafType } = leaf;\n const leafName = unescapeSelector(leaf.name);\n if (leafType === SELECTOR_PSEUDO_CLASS && leafName === 'dir') {\n bool = false;\n break;\n }\n if (combo && !sibling) {\n const { name: comboName } = combo;\n if (/^[+~]$/.test(comboName)) {\n bool = true;\n sibling = true;\n }\n }\n }\n if (bool) {\n dir = DIR_NEXT;\n twig = firstTwig;\n } else {\n dir = DIR_PREV;\n twig = lastTwig;\n }\n }\n } else {\n dir = DIR_PREV;\n twig = firstTwig;\n }\n return {\n complex,\n dir,\n twig\n };\n }\n\n /**\n * collect nodes\n * @private\n * @param {string} targetType - target type\n * @returns {Array.>} - #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 { complex, dir, twig } = this._getEntryTwig(branch, targetType);\n const {\n compound, filtered, nodes, pending\n } = this._findEntryNodes(twig, targetType, complex);\n if (nodes.length) {\n this.#ast[i].find = true;\n this.#nodes[i] = nodes;\n } else if (pending) {\n pendingItems.add(new Map([\n ['index', i],\n ['twig', twig]\n ]));\n }\n this.#ast[i].dir = dir;\n this.#ast[i].filtered = filtered || !compound;\n i++;\n }\n if (pendingItems.size) {\n let node;\n let walker;\n if (this.#node !== this.#root && this.#node.nodeType === ELEMENT_NODE) {\n node = this.#node;\n walker = this.#finder;\n } else {\n node = this.#root;\n walker = this.#tree;\n }\n let nextNode = this._traverse(node, walker);\n while (nextNode) {\n let bool = false;\n if (this.#node.nodeType === ELEMENT_NODE) {\n if (nextNode === this.#node) {\n bool = true;\n } else {\n bool = this.#node.contains(nextNode);\n }\n } else {\n bool = true;\n }\n if (bool) {\n for (const pendingItem of pendingItems) {\n const { leaves } = pendingItem.get('twig');\n const matched = this._matchLeaves(leaves, nextNode, {\n warn: this.#warn\n });\n if (matched) {\n const index = pendingItem.get('index');\n this.#ast[index].filtered = true;\n this.#ast[index].find = true;\n this.#nodes[index].push(nextNode);\n }\n }\n }\n nextNode = walker.nextNode();\n }\n }\n } else {\n let i = 0;\n for (const { branch } of ast) {\n const twig = branch[branch.length - 1];\n const complex = branch.length > 1;\n const {\n compound, filtered, nodes\n } = this._findEntryNodes(twig, targetType, complex);\n if (nodes.length) {\n this.#ast[i].find = true;\n this.#nodes[i] = nodes;\n }\n this.#ast[i].dir = DIR_PREV;\n this.#ast[i].filtered = filtered || !compound;\n i++;\n }\n }\n return [\n this.#ast,\n this.#nodes\n ];\n }\n\n /**\n * match nodes\n * @private\n * @param {string} targetType - target type\n * @returns {Set.} - 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, dir, find } = branches[i];\n const branchLen = branch.length;\n if (branchLen && find) {\n const entryNodes = this.#nodes[i];\n const entryNodesLen = entryNodes.length;\n const lastIndex = branchLen - 1;\n if (lastIndex === 0) {\n const { leaves } = branch[0];\n const compound = leaves.length > 1;\n if ((targetType === TARGET_ALL || targetType === TARGET_FIRST) &&\n this.#node.nodeType === ELEMENT_NODE) {\n for (let j = 0; j < entryNodesLen; j++) {\n const node = entryNodes[j];\n if (node !== this.#node && this.#node.contains(node)) {\n nodes.add(node);\n if (targetType !== TARGET_ALL) {\n break;\n }\n }\n }\n } else if (compound) {\n for (let j = 0; j < entryNodesLen; j++) {\n const node = entryNodes[j];\n nodes.add(node);\n if (targetType !== TARGET_ALL) {\n break;\n }\n }\n } else if (targetType === TARGET_ALL) {\n if (nodes.size) {\n const n = [...nodes];\n nodes = new Set([...n, ...entryNodes]);\n this.#sort = true;\n } else {\n nodes = new Set([...entryNodes]);\n }\n } else {\n const [node] = [...entryNodes];\n nodes.add(node);\n }\n } else if (dir === DIR_NEXT) {\n let { combo, leaves: entryLeaves } = branch[0];\n let matched;\n for (let j = 0; j < entryNodesLen; j++) {\n const node = entryNodes[j];\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, {\n dir,\n warn: this.#warn\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === lastIndex) {\n if (targetType === TARGET_ALL) {\n if (nodes.size) {\n const n = [...nodes];\n nodes = new Set([...n, ...arr]);\n } else {\n nodes = new Set([...arr]);\n }\n this.#sort = true;\n } else {\n const [node] = sortNodes(arr);\n nodes.add(node);\n }\n matched = true;\n } else {\n combo = nextCombo;\n nextNodes = new Set(arr);\n matched = false;\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched && targetType !== TARGET_ALL) {\n break;\n }\n }\n if (!matched && targetType === TARGET_FIRST) {\n const [entryNode] = [...entryNodes];\n let refNode = this._findNode(entryLeaves, {\n node: entryNode\n });\n while (refNode) {\n let nextNodes = new Set([refNode]);\n for (let j = 1; j < branchLen; j++) {\n const { combo: nextCombo, leaves } = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const twig = {\n combo,\n leaves\n };\n const m = this._matchCombinator(twig, nextNode, {\n dir,\n warn: this.#warn\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === lastIndex) {\n const [node] = sortNodes(arr);\n nodes.add(node);\n matched = true;\n } else {\n combo = nextCombo;\n nextNodes = new Set(arr);\n matched = false;\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched) {\n break;\n }\n refNode = this._findNode(entryLeaves, {\n node: refNode\n });\n nextNodes = new Set([refNode]);\n }\n }\n } else {\n const { leaves: entryLeaves } = branch[lastIndex];\n let matched;\n for (let j = 0; j < entryNodesLen; j++) {\n const node = entryNodes[j];\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 dir,\n warn: this.#warn\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n nodes.add(node);\n matched = true;\n if (targetType === TARGET_ALL &&\n branchLen > 1 && nodes.size > 1) {\n this.#sort = true;\n }\n } else {\n nextNodes = new Set(arr);\n matched = false;\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched && targetType !== TARGET_ALL) {\n break;\n }\n }\n if (!matched && targetType === TARGET_FIRST) {\n const [entryNode] = [...entryNodes];\n let refNode = this._findNode(entryLeaves, {\n node: entryNode\n });\n while (refNode) {\n let nextNodes = new Set([refNode]);\n for (let j = lastIndex - 1; j >= 0; j--) {\n const twig = branch[j];\n const arr = [];\n for (const nextNode of nextNodes) {\n const m = this._matchCombinator(twig, nextNode, {\n dir,\n warn: this.#warn\n });\n if (m.size) {\n arr.push(...m);\n }\n }\n if (arr.length) {\n if (j === 0) {\n nodes.add(refNode);\n matched = true;\n } else {\n nextNodes = new Set(arr);\n matched = false;\n }\n } else {\n matched = false;\n break;\n }\n }\n if (matched) {\n break;\n }\n refNode = this._findNode(entryLeaves, {\n node: refNode\n });\n nextNodes = new Set([refNode]);\n }\n }\n }\n }\n }\n return nodes;\n }\n\n /**\n * find matched nodes\n * @private\n * @param {string} targetType - target type\n * @returns {Set.} - collection of matched nodes\n */\n _find(targetType) {\n this._collectNodes(targetType);\n const nodes = this._matchNodes(targetType);\n return nodes;\n }\n\n /**\n * matches\n * @param {string} selector - CSS selector\n * @param {object} node - Element node\n * @param {object} opt - options\n * @returns {boolean} - `true` if matched `false` otherwise\n */\n matches(selector, node, opt) {\n let res;\n try {\n if (node.nodeType !== ELEMENT_NODE) {\n const msg = `Unexpected node ${node.nodeName}`;\n throw new TypeError(msg);\n }\n if (filterSelector(selector)) {\n res = this.#nwsapi.match(selector, node);\n } else {\n this.#node = this._setup(selector, node, opt);\n const nodes = this._find(TARGET_SELF);\n res = nodes.size;\n }\n } catch (e) {\n this._onError(e);\n }\n return !!res;\n }\n\n /**\n * closest\n * @param {string} selector - CSS selector\n * @param {object} node - Element node\n * @param {object} opt - options\n * @returns {?object} - matched node\n */\n closest(selector, node, opt) {\n let res;\n try {\n if (node.nodeType !== ELEMENT_NODE) {\n const msg = `Unexpected node ${node.nodeName}`;\n throw new TypeError(msg);\n }\n if (filterSelector(selector)) {\n res = this.#nwsapi.closest(selector, node);\n } else {\n this.#node = this._setup(selector, node, opt);\n const nodes = this._find(TARGET_LINEAL);\n if (nodes.size) {\n let refNode = this.#node;\n while (refNode) {\n if (nodes.has(refNode)) {\n res = refNode;\n break;\n }\n refNode = refNode.parentNode;\n }\n }\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? null;\n }\n\n /**\n * query selector\n * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} opt - options\n * @returns {?object} - matched node\n */\n querySelector(selector, node, opt) {\n let res;\n try {\n this.#node = this._setup(selector, node, opt);\n if (this.#document === this.#content && this.#sibling &&\n !this.#descendant && filterSelector(selector)) {\n res = this.#nwsapi.first(selector, node);\n } else {\n this._prepareTreeWalkers(node);\n const nodes = this._find(TARGET_FIRST);\n nodes.delete(this.#node);\n if (nodes.size) {\n [res] = sortNodes(nodes);\n }\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 * @param {string} selector - CSS selector\n * @param {object} node - Document, DocumentFragment, Element node\n * @param {object} opt - options\n * @returns {Array.} - collection of matched nodes\n */\n querySelectorAll(selector, node, opt) {\n let res;\n try {\n this.#node = this._setup(selector, node, opt);\n if (this.#document === this.#content && !this.#descendant &&\n filterSelector(selector)) {\n res = this.#nwsapi.select(selector, node);\n } else {\n this._prepareTreeWalkers(node);\n const nodes = this._find(TARGET_ALL);\n nodes.delete(this.#node);\n if (nodes.size) {\n if (this.#sort) {\n res = sortNodes(nodes);\n } else {\n res = [...nodes];\n }\n }\n }\n } catch (e) {\n this._onError(e);\n }\n return res ?? [];\n }\n};\n"], + "mappings": "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", + "names": ["finder_exports", "__export", "Finder", "__toCommonJS", "import_is_potential_custom_element_name", "import_nwsapi", "import_dom_util", "import_matcher", "import_parser", "import_constant", "DIR_NEXT", "DIR_PREV", "TARGET_ALL", "TARGET_FIRST", "TARGET_LINEAL", "TARGET_SELF", "WALKER_FILTER", "#ast", "#cache", "#content", "#descendant", "#document", "#finder", "#node", "#nodes", "#noexcept", "#nwsapi", "#results", "#root", "#shadow", "#sibling", "#sort", "#tree", "#warn", "#window", "window", "nwsapi", "e", "selector", "node", "opt", "noexcept", "warn", "nodes", "ast", "cachedItem", "item", "l", "i", "cssAst", "branches", "descendant", "sibling", "items", "branch", "leaves", "nextItem", "msg", "itemName", "walker", "current", "refNode", "anb", "a", "b", "reverse", "parentNode", "matched", "selectorBranches", "selectorNodes", "bool", "nth", "j", "localName", "prefix", "itemLocalName", "itemPrefix", "m", "nthName", "nthIdentName", "identName", "anbMap", "astName", "dir", "res", "parent", "langPart", "regExtendedLang", "langMain", "langSub", "langRest", "extendedMain", "extendedSub", "len", "extendedRest", "value", "leaf", "leafType", "combo", "twigLeaves", "itemType", "twig", "nextNode", "astData", "twigBranches", "forgive", "lastIndex", "nextNodes", "arr", "astChildren", "selectors", "css", "leavesSet", "regAnchor", "regFormCtrl", "regFormValidity", "regInteract", "regTypeCheck", "regTypeDate", "regTypeRange", "regTypeText", "href", "origin", "pathname", "attrURL", "hash", "id", "focus", "display", "visibility", "active", "isCustomElementName", "targetNode", "nodeName", "checked", "regTypeReset", "regTypeSubmit", "form", "isMultiple", "defaultOpt", "inputType", "node1", "node2", "host", "astType", "attributes", "nodeType", "result", "attr", "regForm", "save", "name", "leafName", "compound", "filterLeaves", "baseNode", "pending", "comboName", "matchedNode", "filtered", "complex", "targetType", "branchLen", "firstTwig", "firstCombo", "firstName", "firstType", "lastTwig", "lastName", "lastType", "pendingItems", "pendingItem", "index", "find", "entryNodes", "entryNodesLen", "n", "entryLeaves", "nextCombo", "entryNode"] } diff --git a/dist/cjs/js/parser.js.map b/dist/cjs/js/parser.js.map index 22c2aa9b..ae8f8ebc 100644 --- a/dist/cjs/js/parser.js.map +++ b/dist/cjs/js/parser.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/js/parser.js"], - "sourcesContent": ["/**\n * parser.js\n */\n\n/* import */\nimport { findAll, parse, toPlainObject, walk } from 'css-tree';\n\n/* constants */\nimport {\n BIT_01, BIT_02, BIT_04, BIT_08, BIT_16, BIT_32, BIT_FFFF, BIT_HYPHEN,\n DUO, HEX, REG_LOGICAL_PSEUDO, REG_SHADOW_PSEUDO, SELECTOR, SELECTOR_ATTR,\n SELECTOR_CLASS, SELECTOR_ID, SELECTOR_PSEUDO_CLASS, SELECTOR_PSEUDO_ELEMENT,\n SELECTOR_TYPE, SYNTAX_ERR, TYPE_FROM, TYPE_TO, U_FFFD\n} from './constant.js';\n\n/**\n * unescape selector\n * @param {string} selector - CSS selector\n * @returns {?string} - unescaped selector\n */\nexport const unescapeSelector = (selector = '') => {\n if (typeof selector === 'string' && selector.indexOf('\\\\', 0) >= 0) {\n const arr = selector.split('\\\\');\n const l = arr.length;\n for (let i = 1; i < l; i++) {\n let item = arr[i];\n if (item === '' && i === l - 1) {\n item = U_FFFD;\n } else {\n const hexExists = /^([\\da-f]{1,6}\\s?)/i.exec(item);\n if (hexExists) {\n const [, hex] = hexExists;\n let str;\n try {\n const low = parseInt('D800', HEX);\n const high = parseInt('DFFF', HEX);\n const deci = parseInt(hex, HEX);\n if (deci === 0 || (deci >= low && deci <= high)) {\n str = U_FFFD;\n } else {\n str = String.fromCodePoint(deci);\n }\n } catch (e) {\n str = U_FFFD;\n }\n let postStr = '';\n if (item.length > hex.length) {\n postStr = item.substring(hex.length);\n }\n item = `${str}${postStr}`;\n // whitespace\n } else if (/^[\\n\\r\\f]/.test(item)) {\n item = '\\\\' + item;\n }\n }\n arr[i] = item;\n }\n selector = arr.join('');\n }\n return selector;\n};\n\n/**\n * preprocess\n * @see https://drafts.csswg.org/css-syntax-3/#input-preprocessing\n * @param {...*} args - arguments\n * @returns {string} - filtered selector string\n */\nexport const preprocess = (...args) => {\n if (!args.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n }\n let [selector] = args;\n if (typeof selector === 'string') {\n let index = 0;\n while (index >= 0) {\n index = selector.indexOf('#', index);\n if (index < 0) {\n break;\n }\n const preHash = selector.substring(0, index + 1);\n let postHash = selector.substring(index + 1);\n const codePoint = postHash.codePointAt(0);\n // @see https://drafts.csswg.org/selectors/#id-selectors\n // @see https://drafts.csswg.org/css-syntax-3/#ident-token-diagram\n if (codePoint === BIT_HYPHEN) {\n if (/^\\d$/.test(postHash.substring(1, 2))) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n // escape char above 0xFFFF\n } else if (codePoint > BIT_FFFF) {\n const str = `\\\\${codePoint.toString(HEX)} `;\n if (postHash.length === DUO) {\n postHash = str;\n } else {\n postHash = `${str}${postHash.substring(DUO)}`;\n }\n }\n selector = `${preHash}${postHash}`;\n index++;\n }\n selector = selector.replace(/\\f|\\r\\n?/g, '\\n')\n .replace(/[\\0\\uD800-\\uDFFF]|\\\\$/g, U_FFFD);\n } else if (selector === undefined || selector === null) {\n selector = Object.prototype.toString.call(selector)\n .slice(TYPE_FROM, TYPE_TO).toLowerCase();\n } else if (Array.isArray(selector)) {\n selector = selector.join(',');\n } else if (Object.prototype.hasOwnProperty.call(selector, 'toString')) {\n selector = selector.toString();\n } else {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n return selector;\n};\n\n/**\n * create AST from CSS selector\n * @param {string} selector - CSS selector\n * @returns {object} - AST\n */\nexport const parseSelector = selector => {\n selector = preprocess(selector);\n // invalid selectors\n if (/^$|^\\s*>|,\\s*$/.test(selector)) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n let res;\n try {\n const ast = parse(selector, {\n context: 'selectorList',\n parseCustomProperty: true\n });\n res = toPlainObject(ast);\n } catch (e) {\n // workaround for https://github.com/csstree/csstree/issues/265\n // NOTE: still throws on `:lang(\"\")`;\n const regLang = /(:lang\\(\\s*(\"[A-Za-z\\d\\-*]+\")\\s*\\))/;\n if (e.message === 'Identifier is expected' && regLang.test(selector)) {\n const [, lang, range] = regLang.exec(selector);\n const escapedRange =\n range.replaceAll('*', '\\\\*').replace(/^\"/, '').replace(/\"$/, '');\n const escapedLang = lang.replace(range, escapedRange);\n res = parseSelector(selector.replace(lang, escapedLang));\n } else if (e.message === '\"]\" is expected' && !selector.endsWith(']')) {\n res = parseSelector(`${selector}]`);\n } else if (e.message === '\")\" is expected' && !selector.endsWith(')')) {\n res = parseSelector(`${selector})`);\n } else {\n throw new DOMException(e.message, SYNTAX_ERR);\n }\n }\n return res;\n};\n\n/**\n * walk AST\n * @param {object} ast - AST\n * @returns {Array.} - collection of AST branches\n */\nexport const walkAST = (ast = {}) => {\n const branches = new Set();\n let hasPseudoFunc;\n const opt = {\n enter: node => {\n if (node.type === SELECTOR) {\n branches.add(node.children);\n } else if ((node.type === SELECTOR_PSEUDO_CLASS &&\n REG_LOGICAL_PSEUDO.test(node.name)) ||\n (node.type === SELECTOR_PSEUDO_ELEMENT &&\n REG_SHADOW_PSEUDO.test(node.name))) {\n hasPseudoFunc = true;\n }\n }\n };\n walk(ast, opt);\n if (hasPseudoFunc) {\n findAll(ast, (node, item, list) => {\n if (list) {\n if (node.type === SELECTOR_PSEUDO_CLASS &&\n REG_LOGICAL_PSEUDO.test(node.name)) {\n const itemList = list.filter(i => {\n const { name, type } = i;\n const res =\n type === SELECTOR_PSEUDO_CLASS && REG_LOGICAL_PSEUDO.test(name);\n return res;\n });\n for (const { children } of itemList) {\n // SelectorList\n for (const { children: grandChildren } of children) {\n // Selector\n for (const { children: greatGrandChildren } of grandChildren) {\n if (branches.has(greatGrandChildren)) {\n branches.delete(greatGrandChildren);\n }\n }\n }\n }\n } else if (node.type === SELECTOR_PSEUDO_ELEMENT &&\n REG_SHADOW_PSEUDO.test(node.name)) {\n const itemList = list.filter(i => {\n const { name, type } = i;\n const res =\n type === SELECTOR_PSEUDO_ELEMENT && REG_SHADOW_PSEUDO.test(name);\n return res;\n });\n for (const { children } of itemList) {\n // Selector\n for (const { children: grandChildren } of children) {\n if (branches.has(grandChildren)) {\n branches.delete(grandChildren);\n }\n }\n }\n }\n }\n });\n }\n return [...branches];\n};\n\n/**\n * sort AST\n * @param {Array.} asts - collection of AST\n * @returns {Array.} - collection of sorted AST\n */\nexport const sortAST = asts => {\n const arr = [...asts];\n if (arr.length > 1) {\n const order = new Map([\n [SELECTOR_PSEUDO_ELEMENT, BIT_01],\n [SELECTOR_ID, BIT_02],\n [SELECTOR_CLASS, BIT_04],\n [SELECTOR_TYPE, BIT_08],\n [SELECTOR_ATTR, BIT_16],\n [SELECTOR_PSEUDO_CLASS, BIT_32]\n ]);\n arr.sort((a, b) => {\n const { type: typeA } = a;\n const { type: typeB } = b;\n const bitA = order.get(typeA);\n const bitB = order.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 * parse AST name - e.g. ns|E -> { prefix: ns, localName: E }\n * @private\n * @param {string} selector - type selector\n * @returns {object} - node properties\n */\nexport const parseAstName = selector => {\n let prefix;\n let localName;\n if (selector && typeof selector === 'string') {\n if (selector.indexOf('|') > -1) {\n [prefix, localName] = selector.split('|');\n } else {\n prefix = '*';\n localName = selector;\n }\n } else {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n return {\n prefix,\n localName\n };\n};\n\n/**\n * filter selector (for nwsapi)\n * @private\n * @param {string} selector - type selector\n * @returns {boolean} - result\n */\nexport const filterSelector = selector => {\n if (!selector || typeof selector !== 'string') {\n return false;\n }\n // filter namespaced selectors, e.g. ns|E, pseudo-element selectors\n // and attribute selectors with case flag i.e. [attr i], [attr s]\n if (/\\||::|\\s[is]\\s*\\]/i.test(selector)) {\n return false;\n }\n // filter pseudo-class selectors\n if (selector.includes(':')) {\n // passing only child-indexed pseudo-classes, e.g. :nth-child(), and :not()\n if (/:(?!(?:nth(?:-last)?|first|last|only)-(?:of-type|child)|not)/.test(selector)) {\n return false;\n }\n // filter :nth-child(an+b of selector), :nth-last-child(an+b of selector)\n if (selector.includes(':nth') &&\n /:nth-(?:last-)?child\\(.{1,255}\\sof.{1,255}\\)/.test(selector)) {\n return false;\n }\n // filter :not(complex selector)\n // type selector: *, tag\n // \\*|[\\w-]{1,255}\n // subclass selector: attr, class, id, pseudo-class\n // \\[.{1,255}\\]|[.#:][\\w-]{1,255}\n // compound selector:\n // (?:\\*|[\\w-]{1,255}|(?:\\*|[\\w-]{1,255})?(?:\\[.{1,255}\\]|[.#:][\\w-]{1,255})+)\n // :not() that only contains compound selectors:\n // :not\\(\\s*(?:${compound}(?:\\s*,\\s*${compound})*)\\s*\\)\n if (selector.includes(':not') &&\n !/:not\\(\\s*(?:\\*|[\\w-]{1,255}|(?:\\*|[\\w-]{1,255})?(?:\\[.{1,255}\\]|[.#:][\\w-]{1,255}){1,255})(?:\\s*,\\s*(?:\\*|[\\w-]{1,255}|(?:\\*|[\\w-]{1,255})?(?:\\[.{1,255}\\]|[.#:][\\w-]{1,255}){1,255})){0,255}\\s*\\)/.test(selector)) {\n return false;\n }\n }\n return true;\n};\n\n/* export */\nexport { generate as generateCSS } from 'css-tree';\n"], + "sourcesContent": ["/**\n * parser.js\n */\n\n/* import */\nimport { findAll, parse, toPlainObject, walk } from 'css-tree';\n\n/* constants */\nimport {\n BIT_01, BIT_02, BIT_04, BIT_08, BIT_16, BIT_32, BIT_FFFF, BIT_HYPHEN,\n DUO, HEX, REG_LOGICAL_PSEUDO, REG_SHADOW_PSEUDO, SELECTOR, SELECTOR_ATTR,\n SELECTOR_CLASS, SELECTOR_ID, SELECTOR_PSEUDO_CLASS, SELECTOR_PSEUDO_ELEMENT,\n SELECTOR_TYPE, SYNTAX_ERR, TYPE_FROM, TYPE_TO, U_FFFD\n} from './constant.js';\n\n/**\n * unescape selector\n * @param {string} selector - CSS selector\n * @returns {?string} - unescaped selector\n */\nexport const unescapeSelector = (selector = '') => {\n if (typeof selector === 'string' && selector.indexOf('\\\\', 0) >= 0) {\n const arr = selector.split('\\\\');\n const l = arr.length;\n for (let i = 1; i < l; i++) {\n let item = arr[i];\n if (item === '' && i === l - 1) {\n item = U_FFFD;\n } else {\n const hexExists = /^([\\da-f]{1,6}\\s?)/i.exec(item);\n if (hexExists) {\n const [, hex] = hexExists;\n let str;\n try {\n const low = parseInt('D800', HEX);\n const high = parseInt('DFFF', HEX);\n const deci = parseInt(hex, HEX);\n if (deci === 0 || (deci >= low && deci <= high)) {\n str = U_FFFD;\n } else {\n str = String.fromCodePoint(deci);\n }\n } catch (e) {\n str = U_FFFD;\n }\n let postStr = '';\n if (item.length > hex.length) {\n postStr = item.substring(hex.length);\n }\n item = `${str}${postStr}`;\n // whitespace\n } else if (/^[\\n\\r\\f]/.test(item)) {\n item = '\\\\' + item;\n }\n }\n arr[i] = item;\n }\n selector = arr.join('');\n }\n return selector;\n};\n\n/**\n * preprocess\n * @see https://drafts.csswg.org/css-syntax-3/#input-preprocessing\n * @param {...*} args - arguments\n * @returns {string} - filtered selector string\n */\nexport const preprocess = (...args) => {\n if (!args.length) {\n throw new TypeError('1 argument required, but only 0 present.');\n }\n let [selector] = args;\n if (typeof selector === 'string') {\n let index = 0;\n while (index >= 0) {\n index = selector.indexOf('#', index);\n if (index < 0) {\n break;\n }\n const preHash = selector.substring(0, index + 1);\n let postHash = selector.substring(index + 1);\n const codePoint = postHash.codePointAt(0);\n // @see https://drafts.csswg.org/selectors/#id-selectors\n // @see https://drafts.csswg.org/css-syntax-3/#ident-token-diagram\n if (codePoint === BIT_HYPHEN) {\n if (/^\\d$/.test(postHash.substring(1, 2))) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n // escape char above 0xFFFF\n } else if (codePoint > BIT_FFFF) {\n const str = `\\\\${codePoint.toString(HEX)} `;\n if (postHash.length === DUO) {\n postHash = str;\n } else {\n postHash = `${str}${postHash.substring(DUO)}`;\n }\n }\n selector = `${preHash}${postHash}`;\n index++;\n }\n selector = selector.replace(/\\f|\\r\\n?/g, '\\n')\n .replace(/[\\0\\uD800-\\uDFFF]|\\\\$/g, U_FFFD);\n } else if (selector === undefined || selector === null) {\n selector = Object.prototype.toString.call(selector)\n .slice(TYPE_FROM, TYPE_TO).toLowerCase();\n } else if (Array.isArray(selector)) {\n selector = selector.join(',');\n } else if (Object.prototype.hasOwnProperty.call(selector, 'toString')) {\n selector = selector.toString();\n } else {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n return selector;\n};\n\n/**\n * create AST from CSS selector\n * @param {string} selector - CSS selector\n * @returns {object} - AST\n */\nexport const parseSelector = selector => {\n selector = preprocess(selector);\n // invalid selectors\n if (/^$|^\\s*>|,\\s*$/.test(selector)) {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n let res;\n try {\n const ast = parse(selector, {\n context: 'selectorList',\n parseCustomProperty: true\n });\n res = toPlainObject(ast);\n } catch (e) {\n // workaround for https://github.com/csstree/csstree/issues/265\n // NOTE: still throws on `:lang(\"\")`;\n const regLang = /(:lang\\(\\s*(\"[A-Za-z\\d\\-*]+\")\\s*\\))/;\n if (e.message === 'Identifier is expected' && regLang.test(selector)) {\n const [, lang, range] = regLang.exec(selector);\n const escapedRange =\n range.replaceAll('*', '\\\\*').replace(/^\"/, '').replace(/\"$/, '');\n const escapedLang = lang.replace(range, escapedRange);\n res = parseSelector(selector.replace(lang, escapedLang));\n } else if (e.message === '\"]\" is expected' && !selector.endsWith(']')) {\n res = parseSelector(`${selector}]`);\n } else if (e.message === '\")\" is expected' && !selector.endsWith(')')) {\n res = parseSelector(`${selector})`);\n } else {\n throw new DOMException(e.message, SYNTAX_ERR);\n }\n }\n return res;\n};\n\n/**\n * walk AST\n * @param {object} ast - AST\n * @returns {Array.} - collection of AST branches\n */\nexport const walkAST = (ast = {}) => {\n const branches = new Set();\n let hasPseudoFunc;\n const opt = {\n enter: node => {\n if (node.type === SELECTOR) {\n branches.add(node.children);\n } else if ((node.type === SELECTOR_PSEUDO_CLASS &&\n REG_LOGICAL_PSEUDO.test(node.name)) ||\n (node.type === SELECTOR_PSEUDO_ELEMENT &&\n REG_SHADOW_PSEUDO.test(node.name))) {\n hasPseudoFunc = true;\n }\n }\n };\n walk(ast, opt);\n if (hasPseudoFunc) {\n findAll(ast, (node, item, list) => {\n if (list) {\n if (node.type === SELECTOR_PSEUDO_CLASS &&\n REG_LOGICAL_PSEUDO.test(node.name)) {\n const itemList = list.filter(i => {\n const { name, type } = i;\n const res =\n type === SELECTOR_PSEUDO_CLASS && REG_LOGICAL_PSEUDO.test(name);\n return res;\n });\n for (const { children } of itemList) {\n // SelectorList\n for (const { children: grandChildren } of children) {\n // Selector\n for (const { children: greatGrandChildren } of grandChildren) {\n if (branches.has(greatGrandChildren)) {\n branches.delete(greatGrandChildren);\n }\n }\n }\n }\n } else if (node.type === SELECTOR_PSEUDO_ELEMENT &&\n REG_SHADOW_PSEUDO.test(node.name)) {\n const itemList = list.filter(i => {\n const { name, type } = i;\n const res =\n type === SELECTOR_PSEUDO_ELEMENT && REG_SHADOW_PSEUDO.test(name);\n return res;\n });\n for (const { children } of itemList) {\n // Selector\n for (const { children: grandChildren } of children) {\n if (branches.has(grandChildren)) {\n branches.delete(grandChildren);\n }\n }\n }\n }\n }\n });\n }\n return [...branches];\n};\n\n/**\n * sort AST\n * @param {Array.} asts - collection of AST\n * @returns {Array.} - collection of sorted AST\n */\nexport const sortAST = asts => {\n const arr = [...asts];\n if (arr.length > 1) {\n const order = new Map([\n [SELECTOR_PSEUDO_ELEMENT, BIT_01],\n [SELECTOR_ID, BIT_02],\n [SELECTOR_CLASS, BIT_04],\n [SELECTOR_TYPE, BIT_08],\n [SELECTOR_ATTR, BIT_16],\n [SELECTOR_PSEUDO_CLASS, BIT_32]\n ]);\n arr.sort((a, b) => {\n const { type: typeA } = a;\n const { type: typeB } = b;\n const bitA = order.get(typeA);\n const bitB = order.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 * parse AST name - e.g. ns|E -> { prefix: ns, localName: E }\n * @private\n * @param {string} selector - type selector\n * @returns {object} - node properties\n */\nexport const parseAstName = selector => {\n let prefix;\n let localName;\n if (selector && typeof selector === 'string') {\n if (selector.indexOf('|') > -1) {\n [prefix, localName] = selector.split('|');\n } else {\n prefix = '*';\n localName = selector;\n }\n } else {\n throw new DOMException(`Invalid selector ${selector}`, SYNTAX_ERR);\n }\n return {\n prefix,\n localName\n };\n};\n\n/**\n * filter selector (for nwsapi)\n * @private\n * @param {string} selector - selector\n * @returns {boolean} - result\n */\nexport const filterSelector = selector => {\n if (!selector || typeof selector !== 'string') {\n return false;\n }\n // filter namespaced selectors, e.g. ns|E, pseudo-element selectors\n // and attribute selectors with case flag, i.e. [attr i], [attr s]\n if (/\\||::|\\s[is]\\s*\\]/i.test(selector)) {\n return false;\n }\n // filter pseudo-class selectors\n if (selector.includes(':')) {\n // filter pseudos other than child-indexed, e.g. :nth-child(), and :not()\n if (/:(?!(?:nth(?:-last)?|first|last|only)-(?:of-type|child)|not)/.test(selector)) {\n return false;\n }\n // filter :nth-child(an+b of selector), :nth-last-child(an+b of selector)\n if (selector.includes(':nth') &&\n /:nth-(?:last-)?child\\(.{1,255}\\sof.{1,255}\\)/.test(selector)) {\n return false;\n }\n // filter :not(complex selector)\n // type selector: *, tag\n // \\*|[\\w-]{1,255}\n // subclass selector: attr, class, id, pseudo-class\n // \\[.{1,255}\\]|[.#:][\\w-]{1,255}\n // compound selector:\n // (?:\\*|[\\w-]{1,255}|(?:\\*|[\\w-]{1,255})?(?:\\[.{1,255}\\]|[.#:][\\w-]{1,255}){1,255})\n // :not() that only contains compound selectors:\n // :not\\(\\s*(?:${compound}(?:\\s*,\\s*${compound})*)\\s*\\)\n if (selector.includes(':not') &&\n !/:not\\(\\s*(?:\\*|[\\w-]{1,255}|(?:\\*|[\\w-]{1,255})?(?:\\[.{1,255}\\]|[.#:][\\w-]{1,255}){1,255})(?:\\s*,\\s*(?:\\*|[\\w-]{1,255}|(?:\\*|[\\w-]{1,255})?(?:\\[.{1,255}\\]|[.#:][\\w-]{1,255}){1,255})){0,255}\\s*\\)/.test(selector)) {\n return false;\n }\n }\n return true;\n};\n\n/* export */\nexport { generate as generateCSS } from 'css-tree';\n"], "mappings": "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", "names": ["parser_exports", "__export", "filterSelector", "parseAstName", "parseSelector", "preprocess", "sortAST", "unescapeSelector", "walkAST", "__toCommonJS", "import_css_tree", "import_constant", "selector", "arr", "l", "item", "hexExists", "hex", "str", "low", "high", "deci", "postStr", "args", "index", "preHash", "postHash", "codePoint", "res", "ast", "e", "regLang", "lang", "range", "escapedRange", "escapedLang", "branches", "hasPseudoFunc", "node", "list", "itemList", "i", "name", "type", "children", "grandChildren", "greatGrandChildren", "asts", "order", "a", "b", "typeA", "typeB", "bitA", "bitB", "prefix", "localName"] } diff --git a/package.json b/package.json index 8f891ce4..0ab9f1a0 100644 --- a/package.json +++ b/package.json @@ -60,5 +60,5 @@ "tsc": "npx tsc", "update-wpt": "git submodule update --init --recursive --remote" }, - "version": "4.0.0" + "version": "4.0.1" }