@whenessel/seql-js 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +168 -0
- package/dist/seql-js.d.ts +1215 -0
- package/dist/seql-js.js +2 -0
- package/dist/seql-js.js.map +1 -0
- package/dist/seql-js.umd.cjs +2 -0
- package/dist/seql-js.umd.cjs.map +1 -0
- package/package.json +63 -0
package/dist/seql-js.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const t="1.0",e=10,s=.4,r=.3,n=.2,i=.1,a=.5,o=.3,c=.1,l=.1,h=.05,u=5,d=.05,g=.3,f=.7,m=["form","main","nav","section","article","footer","header"],p=["form","navigation","main","region","contentinfo","complementary","banner","search"],b=["article","aside","details","figcaption","figure","footer","header","main","mark","nav","section","summary","time","button","datalist","fieldset","form","input","label","legend","meter","optgroup","option","output","progress","select","textarea","a","audio","video","canvas","dialog","menu","blockquote","dd","dl","dt","hr","li","ol","ul","p","pre","h1","h2","h3","h4","h5","h6","caption","col","colgroup","table","tbody","td","tfoot","th","thead","tr","svg","path","circle","rect","line","polyline","polygon","ellipse","g","text","use"],y=["rect","path","circle","line","polyline","polygon","ellipse","g","text","use","defs","clipPath","mask"],x=["aria-label","aria-labelledby","aria-describedby","name","type","data-testid","data-qa","data-test","href","title","placeholder","alt"],S={"data-testid":100,"data-qa":99,"data-cy":98,"data-test":97,"data-test-id":96,"aria-label":90,"aria-labelledby":85,"aria-describedby":80,name:75,href:70,src:70,type:65,role:60,alt:55,title:50,for:45,placeholder:40,"data-*":30,"aria-*":25},A=/* @__PURE__ */new Set(["id","class","style","xmlns","tabindex","contenteditable"]),C={maxPathDepth:10,enableSvgFingerprint:!0,confidenceThreshold:.1,fallbackToBody:!0,includeUtilityClasses:!1,source:"dom-dsl"},w={strictMode:!1,enableFallback:!0,maxCandidates:20};function $(t){return!!/^[a-z]+-\d+$/i.test(t)||(!!/^\d+$/.test(t)||(!!/^:[a-z0-9]+:$/i.test(t)||(!!/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(t)||(!(!/^[a-z]{1,3}[A-Za-z0-9]{8,}$/.test(t)||!/\d/.test(t)&&!/[A-Z]/.test(t))||(!!/^radix-/.test(t)||!!/^mui-\d+$/.test(t))))))}class v{constructor(t,e){this.maxDepth=t.maxPathDepth??10,this.cache=e}findAnchor(t){if(this.cache){const e=this.cache.getAnchor(t);if(void 0!==e)return e}let e=t.parentElement,s=0,r=null;for(;e&&s<this.maxDepth;){if("body"===e.tagName.toLowerCase())return r||{element:e,score:g,tier:"C",depth:s};const t=this.scoreAnchor(e);if(t>0){const n=this.applyDepthPenalty(t,s),i=this.getTier(e),a={element:e,score:n,tier:i,depth:s};if("A"===i)return a;(!r||n>r.score)&&(r=a)}e=e.parentElement,s++}const n=r;return this.cache&&this.cache.setAnchor(t,n),n}scoreAnchor(t){let e=0;const s=t.tagName.toLowerCase();m.includes(s)&&(e+=a);const r=t.getAttribute("role");r&&p.includes(r)&&(e+=o),(t.hasAttribute("aria-label")||t.hasAttribute("aria-labelledby"))&&(e+=c);const n=t.id;return n&&!$(n)&&(e+=l),(t.hasAttribute("data-testid")||t.hasAttribute("data-qa")||t.hasAttribute("data-test"))&&(e+=h),Math.min(e,1)}applyDepthPenalty(t,e){if(e<=u)return t;const s=(e-u)*d;return Math.max(0,t-s)}getTier(t){const e=t.tagName.toLowerCase();if(m.includes(e))return"A";const s=t.getAttribute("role");return s&&p.includes(s)?"B":"C"}}const M=[/^css-[a-z0-9]+$/i,/^sc-[a-z0-9]+-\d+$/i,/^[a-z]{5,8}$/i,/^Mui[A-Z]\w+-\w+-\w+/,/^makeStyles-\w+-\d+$/,/^jss\d+$/,/^(emotion|linaria)-[a-z0-9]+/i,/^(chakra|tw-|ant-)[a-z0-9]+-\w+/i,/-[a-f0-9]{6,}$/i,/^_[a-z0-9]{5,}$/i,/\d{5,}/],q=[/^\[/,/^(first|last|odd|even|only|first-of-type|last-of-type|only-of-type):/,/^(hover|focus|active|disabled|enabled|checked|indeterminate|default|required|valid|invalid|in-range|out-of-range|placeholder-shown|autofill|read-only):/,/^(focus-within|focus-visible|visited|target|open):/,/^(sm|md|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl):/,/^dark:/,/^(rtl|ltr):/,/^(group|peer)(-hover|-focus|-active)?:/,/\/([\d.]+|full|auto|screen)$/,/^(inset|top|right|bottom|left)(-|$)/,/^(flex|inline-flex|grid|block|inline|inline-block|hidden|visible)$/,/^(absolute|relative|fixed|sticky|static)$/,/^(items|justify|content|self|place)-/,/^flex-(row|col|wrap|nowrap|1|auto|initial|none)/,/^grid-(cols|rows|flow)/,/^(gap|space)-/,/^[mp][trblxy]?-(\d+|auto|px)$/,/^(w|h|min-w|min-h|max-w|max-h|size)-/,/^text-(center|left|right|justify|start|end|xs|sm|base|lg|xl|2xl|3xl|4xl|5xl|6xl|7xl|8xl|9xl)$/,/^text-(uppercase|lowercase|capitalize|normal-case|underline|line-through|no-underline)$/,/^text-(truncate|ellipsis|clip)$/,/^(bg|border|ring|shadow|outline)-/,/^rounded(-|$)/,/^(font|leading|tracking|whitespace|break|truncate)-/,/^(uppercase|lowercase|capitalize|normal-case)$/,/^(transform|transition|duration|delay|ease|animate)-/,/^(scale|rotate|translate|skew)-/,/^transform$/,/^backdrop-blur-/,/^motion-/,/^(fade|slide|zoom|bounce|pulse|spin|ping)-/,/^(overflow|overscroll|scroll)-/,/^(cursor|pointer-events|select|resize)-/,/^(opacity|z)-/,/^(visible|invisible|collapse)$/,/^d-(none|inline|inline-block|block|grid|table|flex)$/,/^(float|clearfix|text)-(left|right|center|justify|start|end)$/,/^(m|p)[trblxy]?-[0-5]$/,/^(w|h)-(25|50|75|100|auto)$/,/^btn-(sm|lg|block)$/,/^text-(muted|primary|success|danger|warning|info|light|dark|white)$/,/^bg-(primary|secondary|success|danger|warning|info|light|dark|white|transparent)$/,/^border(-top|-bottom|-left|-right)?(-0)?$/,/^rounded(-top|-bottom|-left|-right|-circle|-pill|-0)?$/,/^shadow(-sm|-lg|-none)?$/,/^(align|justify|order|flex)-(start|end|center|between|around|fill|grow|shrink)$/,/^col(-sm|-md|-lg|-xl)?(-\d+|-auto)?$/,/^row(-cols)?(-\d+)?$/,/^g[xy]?-[0-5]$/,/^(show|hide|invisible|visible)$/,/^(position|top|bottom|start|end)-(static|relative|absolute|fixed|sticky|-\d+)$/,/^(row|col)$/,/^clearfix$/,/^pull-(left|right)$/,/^float-(left|right|none)$/],T=[/^(nav|menu|header|footer|sidebar|topbar|navbar|breadcrumb)/,/(navigation|dropdown|megamenu)$/,/^(btn|button|link|card|modal|dialog|popup|tooltip|alert|badge|chip)/,/^(form|input|select|checkbox|radio|textarea|label|fieldset)/,/^(table|list|item|row|cell|column)/,/^(accordion|tab|carousel|slider|gallery)/,/^(content|main|article|post|comment|title|subtitle|description|caption)/,/^(hero|banner|jumbotron|section|wrapper|box)/,/^(user|profile|avatar|account|auth)/,/^(product|item|price|cart|checkout|order)/,/^(page|layout|panel|widget|block)/,/-(primary|secondary|tertiary|success|error|warning|info|danger)$/,/-(active|inactive|disabled|enabled|selected|highlighted|focused)$/,/-(open|closed|expanded|collapsed|visible|hidden)$/,/-(large|medium|small|tiny|xs|sm|md|lg|xl)$/,/^(submit|cancel|close|delete|edit|save|back|next|prev|search)/,/^(loading|pending|complete|failed|draft|published)/];function N(t){return M.some(e=>e.test(t))}function k(t){return t.length<=2||(!!/^\d/.test(t)||q.some(e=>e.test(t)))}function E(t){return t.filter(t=>{return!N(e=t)&&!k(e);var e})}function H(t){if(N(t)||k(t))return 0;let e=.5;return function(t){return!N(t)&&!k(t)&&T.some(e=>e.test(t))}(t)&&(e=.8),t.length<3?e*=.3:t.length<5&&(e*=.6),/\d/.test(t)&&(e*=.7),Math.min(e,1)}function z(t){const e=[],s=[];for(const r of t)k(r)||N(r)?s.push(r):e.push(r);return{semantic:e,utility:s}}function j(t){return k(t)||N(t)}function D(t){return H(t)}const F=t=>t.replace(/([#:.[\]@])/g,"\\$1");class L{constructor(t,e){this.maxDepth=t.maxPathDepth??10,this.cache=e}buildPath(t,e,s){const r=[];let n=e.parentElement;for(;n&&n!==t&&r.length<this.maxDepth;)r.unshift(n),n=n.parentElement;const i=r.length>=this.maxDepth&&n!==t;let a=this.filterNoise(r);a=this.ensureUniqueness(r,a,t,e,s);return{path:a.map(t=>{const e=t.parentElement;let r;if(e){const s=Array.from(e.children).indexOf(t);-1!==s&&(r=s+1)}return{tag:t.tagName.toLowerCase(),semantics:s.extract(t),score:s.scoreElement(t),nthChild:r}}),degraded:i,degradationReason:i?"path-depth-overflow":void 0}}buildPathNodes(t,e,s){return this.buildPath(t,e,s).path}ensureUniqueness(t,e,s,r,n){const i=this.buildTestSelector(s,e,r);try{const a=r.ownerDocument;if(!a)return e;let o;if(this.cache){const t=this.cache.getSelectorResults(i);void 0!==t?o=t:(o=Array.from(a.querySelectorAll(i)),this.cache.setSelectorResults(i,o))}else o=a.querySelectorAll(i);if(o.length<=1)return e;const c=t.filter(t=>!e.includes(t));for(const i of c){if(n.scoreElement(i)<f)continue;const c=this.insertNodeInOrder(e,i,t),l=this.buildTestSelector(s,c,r);try{let t;if(this.cache){const e=this.cache.getSelectorResults(l);void 0!==e?t=e:(t=Array.from(a.querySelectorAll(l)),this.cache.setSelectorResults(l,t))}else t=a.querySelectorAll(l);if(1===t.length)return c;t.length<o.length&&(e=c)}catch{}}return e}catch{return e}}insertNodeInOrder(t,e,s){const r=s.indexOf(e),n=[...t];let i=0;for(let a=0;a<n.length;a++){if(s.indexOf(n[a])>r)break;i=a+1}return n.splice(i,0,e),n}buildTestSelector(t,e,s){const r=[];r.push(this.elementToSelector(t));for(const n of e)r.push(this.elementToSelector(n));return r.push(this.elementToSelector(s)),r.join(" ")}elementToSelector(t){let e=t.tagName.toLowerCase();t.id&&!$(t.id)&&(e+=`#${F(t.id)}`);for(const s of Array.from(t.classList))j(s)||(e+=`.${F(s)}`);return e}filterNoise(t){return t.filter(t=>this.shouldInclude(t))}shouldInclude(t){const e=t.tagName.toLowerCase();return!!b.includes(e)||("div"===e||"span"===e)&&this.hasSemanticFeatures(t)}hasSemanticFeatures(t){if(t.hasAttribute("role"))return!0;for(const s of Array.from(t.attributes))if(s.name.startsWith("aria-"))return!0;if(t.classList.length>0)for(const s of Array.from(t.classList))if(!j(s))return!0;if(t.hasAttribute("data-testid")||t.hasAttribute("data-qa")||t.hasAttribute("data-test"))return!0;const e=t.id;return!(!e||$(e))}}function U(t){return t?t.trim().replace(/[\n\t\r]/g," ").replace(/\s+/g," "):""}const R={preserveQueryForAbsolute:!0,removeDynamicHashes:!0};function P(t,e,s={}){if(!e)return e;const r={...R,...s};return"href"===t||"src"===t?function(t,e){if(!t)return t;const s=t.startsWith("http://")||t.startsWith("https://");let[r,n]=t.split("#");const[i,a]=r.split("?");let o=i;return s&&e.preserveQueryForAbsolute&&a&&(o+=`?${a}`),n&&(e.removeDynamicHashes&&function(t){return!!t&&[/\d{5,}/,/[a-f0-9]{8,}/i,/(session|token|temp|random|timestamp|nonce|cache)/i,/^\d+$/,/^[a-f0-9-]{32,}$/i].some(e=>e.test(t))}(n)||(o+=`#${n}`)),o}(e,r):e}class O{constructor(t,e){this.includeUtilityClasses=t.includeUtilityClasses??!1,this.cache=e}extract(t){if(this.cache){const e=this.cache.getSemantics(t);if(void 0!==e)return e}const e={},s=t.id;if(s&&!$(s)&&(e.id=s),t.classList.length>0){const s=Array.from(t.classList);if(this.includeUtilityClasses)e.classes=s;else{const{semantic:t}=z(s);t.length>0&&(e.classes=t)}}const r=this.extractAttributes(t);Object.keys(r).length>0&&(e.attributes=r);const n=t.getAttribute("role");if(n&&(e.role=n),this.shouldExtractText(t)){const s=this.extractText(t);s&&(e.text=s)}return this.cache&&this.cache.setSemantics(t,e),e}scoreElement(t){let e=.5;const s=this.extract(t);return s.id&&(e+=.15),s.classes&&s.classes.length>0&&(e+=.1),s.attributes&&Object.keys(s.attributes).length>0&&(e+=.1),s.role&&(e+=.1),s.text&&(e+=.05),Math.min(e,1)}shouldIgnoreAttribute(t){return!!A.has(t)||(!!t.startsWith("on")||(!(!t.startsWith("ng-")&&!t.startsWith("_ng"))||(!(!t.startsWith("data-reactid")&&!t.startsWith("data-react"))||!!t.startsWith("data-v-"))))}getAttributePriority(t){return void 0!==S[t]?S[t]:t.startsWith("data-")?S["data-*"]:t.startsWith("aria-")?S["aria-*"]:0}isDynamicValue(t){return[/^[a-f0-9]{32,}$/i,/^\d{10,}$/,/^(undefined|null|\[object)/,/^{{.*}}$/].some(e=>e.test(t))}extractAttributes(t){const e={};for(const s of Array.from(t.attributes)){const t=s.name;if(this.shouldIgnoreAttribute(t))continue;if(0===this.getAttributePriority(t))continue;const r="href"===t||"src"===t?P(t,s.value):s.value;r&&""!==r.trim()&&(this.isDynamicValue(r)||(e[t]=r))}return e}extractText(t){const e=this.getDirectTextContent(t);if(!e)return null;const s=U(e);if(!s)return null;const r=100;return{raw:e.length>r?e.slice(0,r)+"...":e,normalized:s.length>r?s.slice(0,r)+"...":s}}getDirectTextContent(t){const e=[];for(const s of Array.from(t.childNodes))if(s.nodeType===Node.TEXT_NODE&&s.textContent){const t=s.textContent.trim();t&&e.push(t)}return e.length>0?e.join(" "):t.textContent??null}shouldExtractText(t){const e=t.tagName.toLowerCase();return["button","a","label","h1","h2","h3","h4","h5","h6","p","span","li","th","td","dt","dd","legend","figcaption","summary"].includes(e)}}class I{fingerprint(t){const e=t.tagName.toLowerCase(),s=this.getShape(e),r={shape:s,hasAnimation:this.hasAnimation(t)};if("path"===s){const e=t.getAttribute("d");e&&(r.dHash=this.computePathHash(e))}else["circle","rect","ellipse","line"].includes(s)&&(r.geomHash=this.computeGeomHash(t,s));const n=t.getAttribute("role");n&&(r.role=n);const i=t.querySelector("title");return i?.textContent&&(r.titleText=i.textContent.trim()),r}computePathHash(t){const e=this.normalizePathData(t);return this.simpleHash(e)}getShape(t){return["path","circle","rect","line","polyline","polygon","ellipse","g","text","use","svg"].find(e=>e===t)??"path"}normalizePathData(t){return(t.match(/[MLHVCSQTAZ][^MLHVCSQTAZ]*/gi)??[]).slice(0,5).map(t=>t.trim().replace(/(-?\d+\.?\d*)/g,t=>parseFloat(t).toFixed(1))).join(" ")}computeGeomHash(t,e){const s=[];switch(e){case"circle":s.push(`r=${t.getAttribute("r")??"0"}`);break;case"rect":{const e=parseFloat(t.getAttribute("width")??"0"),r=parseFloat(t.getAttribute("height")??"0");e>0&&r>0&&s.push(`ratio=${(e/r).toFixed(2)}`)}break;case"ellipse":{const e=parseFloat(t.getAttribute("rx")??"0"),r=parseFloat(t.getAttribute("ry")??"0");e>0&&r>0&&s.push(`ratio=${(e/r).toFixed(2)}`)}break;case"line":{const e=parseFloat(t.getAttribute("x1")??"0"),r=parseFloat(t.getAttribute("y1")??"0"),n=parseFloat(t.getAttribute("x2")??"0"),i=parseFloat(t.getAttribute("y2")??"0"),a=Math.atan2(i-r,n-e);s.push(`angle=${a.toFixed(2)}`)}}return this.simpleHash(s.join(";"))}hasAnimation(t){if(t.querySelector("animate, animateTransform, animateMotion"))return!0;const e=t.ownerDocument;if(e?.defaultView)try{const s=e.defaultView.getComputedStyle(t);if("none"!==s.animationName||"all"!==s.transitionProperty&&"none"!==s.transitionProperty)return!0}catch{}return!1}simpleHash(t){let e=0;for(let s=0;s<t.length;s++){e=(e<<5)-e+t.charCodeAt(s),e&=e}return Math.abs(e).toString(16).padStart(8,"0")}}function W(t,e=0){const a=t.anchor.score,o=t.path.length>0?t.path.reduce((t,e)=>t+e.score,0)/t.path.length:.5,c=t.target.score,l=a*s+o*r+c*n+e*i,h=t.anchor.degraded?.2:0;return Math.max(0,Math.min(1,l-h))}function B(t,e,s){let r=.5;return e&&(r+=.2),s&&(r+=.15),r+=Math.min(.05*t,.15),Math.min(r,1)}class Q{constructor(t){this.cache=/* @__PURE__ */new Map,this.maxSize=t}get(t){if(!this.cache.has(t))return;const e=this.cache.get(t);return this.cache.delete(t),this.cache.set(t,e),e}set(t,e){if(this.cache.has(t))this.cache.delete(t);else if(this.cache.size>=this.maxSize){const t=this.cache.keys().next().value;void 0!==t&&this.cache.delete(t)}this.cache.set(t,e)}has(t){return this.cache.has(t)}delete(t){this.cache.delete(t)}clear(){this.cache.clear()}get size(){return this.cache.size}}class Z{constructor(t={}){this.eidCache=/* @__PURE__ */new WeakMap,this.selectorResultCache=new Q(t.maxSelectorCacheSize??1e3),this.anchorCache=/* @__PURE__ */new WeakMap,this.semanticsCache=/* @__PURE__ */new WeakMap,this.stats={eidHits:0,eidMisses:0,selectorHits:0,selectorMisses:0,anchorHits:0,anchorMisses:0,semanticsHits:0,semanticsMisses:0,selectorCacheSize:0,maxSelectorCacheSize:t.maxSelectorCacheSize??1e3}}getEID(t){const e=this.eidCache.get(t);if(void 0!==e)return this.stats.eidHits++,e;this.stats.eidMisses++}setEID(t,e){this.eidCache.set(t,e)}getSelectorResults(t){const e=this.selectorResultCache.get(t);if(void 0!==e)return this.stats.selectorHits++,this.stats.selectorCacheSize=this.selectorResultCache.size,e;this.stats.selectorMisses++,this.stats.selectorCacheSize=this.selectorResultCache.size}setSelectorResults(t,e){this.selectorResultCache.set(t,e),this.stats.selectorCacheSize=this.selectorResultCache.size}getAnchor(t){if(this.anchorCache.has(t))return this.stats.anchorHits++,this.anchorCache.get(t);this.stats.anchorMisses++}setAnchor(t,e){this.anchorCache.set(t,e)}getSemantics(t){const e=this.semanticsCache.get(t);if(void 0!==e)return this.stats.semanticsHits++,e;this.stats.semanticsMisses++}setSemantics(t,e){this.semanticsCache.set(t,e)}clear(){this.selectorResultCache.clear(),this.stats.selectorCacheSize=0,this.stats={eidHits:0,eidMisses:0,selectorHits:0,selectorMisses:0,anchorHits:0,anchorMisses:0,semanticsHits:0,semanticsMisses:0,selectorCacheSize:0,maxSelectorCacheSize:this.stats.maxSelectorCacheSize}}invalidateElement(t){}invalidateSelector(t){this.selectorResultCache.delete(t),this.stats.selectorCacheSize=this.selectorResultCache.size}getStats(){return{...this.stats,selectorCacheSize:this.selectorResultCache.size}}getEIDHitRate(){const t=this.stats.eidHits+this.stats.eidMisses;return t>0?this.stats.eidHits/t:0}getSelectorHitRate(){const t=this.stats.selectorHits+this.stats.selectorMisses;return t>0?this.stats.selectorHits/t:0}getAnchorHitRate(){const t=this.stats.anchorHits+this.stats.anchorMisses;return t>0?this.stats.anchorHits/t:0}getSemanticsHitRate(){const t=this.stats.semanticsHits+this.stats.semanticsMisses;return t>0?this.stats.semanticsHits/t:0}getOverallHitRate(){const t=this.stats.eidHits+this.stats.selectorHits+this.stats.anchorHits+this.stats.semanticsHits,e=t+(this.stats.eidMisses+this.stats.selectorMisses+this.stats.anchorMisses+this.stats.semanticsMisses);return e>0?t/e:0}}function V(t){return new Z(t)}let G=null;function _(){return G||(G=V()),G}function J(){G=null}function X(e,s={}){if(!e||!e.ownerDocument)return null;if(!e.isConnected)return null;const r={...C,...s},n=r.cache??_(),i=n.getEID(e);if(void 0!==i)return i;const a=new v(r,n),o=new L(r,n),c=new O(r,n),l=new I,h=a.findAnchor(e);if(!h&&!r.fallbackToBody)return null;const u=h?.element??e.ownerDocument?.body??null;if(!u)return null;const d=!h||"C"===h.tier,f=c.extract(u),m={tag:u.tagName.toLowerCase(),semantics:f,score:h?.score??g,degraded:d},p=o.buildPath(u,e,c),b=c.extract(e);var y;r.enableSvgFingerprint&&("http://www.w3.org/2000/svg"===(y=e).namespaceURI||"svg"===y.tagName.toLowerCase()||y instanceof SVGElement)&&(b.svg=l.fingerprint(e));const x=e.parentElement;let S;if(x){const t=Array.from(x.children).indexOf(e);-1!==t&&(S=t+1)}const A={tag:e.tagName.toLowerCase(),semantics:b,score:c.scoreElement(e),nthChild:S},w=m.degraded||p.degraded,$=function(t,e){if(t&&e.degraded)return"anchor-and-path-degraded";if(t)return"no-semantic-anchor";if(e.degraded)return e.degradationReason;return}(m.degraded,p),M={version:t,anchor:m,path:p.path,target:A,constraints:[],fallback:{onMultiple:"best-score",onMissing:"anchor-only",maxDepth:3},meta:{confidence:0,generatedAt:/* @__PURE__ */(new Date).toISOString(),generator:`dom-eid@${t}`,source:r.source,degraded:w,degradationReason:$}};return M.meta.confidence=W(M),M.meta.confidence<r.confidenceThreshold?null:(n.setEID(e,M),M)}class K{buildSelector(t,e){if(0===t.path.length&&t.anchor.tag===t.target.tag&&JSON.stringify(t.anchor.semantics)===JSON.stringify(t.target.semantics)){const s=this.buildNodeSelector(t.target.tag,t.target.semantics,{excludeClasses:!1});return e?.ensureUnique?this.ensureUniqueSelector(s,t,e):s}const s=[],r=e?.ensureUnique?this.ensureUniqueAnchor(t,e.root??document):this.buildNodeSelector(t.anchor.tag,t.anchor.semantics);s.push(r);for(const l of t.path){let t=this.buildNodeSelector(l.tag,l.semantics);if(void 0!==l.nthChild){["tr","td","th","thead","tbody","tfoot"].includes(l.tag);t+=`:nth-child(${l.nthChild})`}s.push(t)}let n=this.buildNodeSelector(t.target.tag,t.target.semantics,{excludeClasses:e?.ensureUnique});if(void 0!==t.target.nthChild){["tr","td","th","thead","tbody","tfoot"].includes(t.target.tag);n+=`:nth-child(${t.target.nthChild})`}s.push(n);const i=this.isSvgChildElement(t.target.tag),a=t.path.some(t=>"svg"===t.tag);let o;if(i&&a){const e=t.path.findIndex(t=>"svg"===t.tag);if(-1!==e){const t=e+1,r=s.slice(0,t+1),n=s.slice(t+1,-1),i=s[s.length-1];o=n.length>0?r.join(" ")+" > "+n.join(" > ")+" > "+i:r.join(" ")+" > "+i}else o=s.join(" ")}else o=s.join(" ");if(!e?.ensureUnique)return o;const c=this.querySelectorSafe(o,e.root??document);if(1===c.length)return{selector:o,isUnique:!0,usedNthOfType:o.includes(":nth-"),extraClassesAdded:0};if(0===c.length||c.length>1){const s=this.buildFullDomPathSelector(t,t.target.semantics,e.root??document);if(s&&this.isUnique(s,e.root??document))return{selector:s,isUnique:!0,usedNthOfType:s.includes(":nth-"),extraClassesAdded:0}}return this.ensureUniqueSelector(o,t,e)}buildAnchorSelector(t){return this.buildNodeSelector(t.anchor.tag,t.anchor.semantics)}ensureUniqueSelector(t,e,s){const r=s.root??document,n=s.maxClasses??4,i=e.target.tag,a=e.target.semantics;let o=t,c=0,l=!1;if(0===this.querySelectorSafe(o,r).length){const t=this.buildFullDomPathSelector(e,a,r);if(t&&(o=t,this.isUnique(o,r)))return{selector:o,isUnique:!0,usedNthOfType:!1,extraClassesAdded:0}}if(this.isUnique(o,r))return{selector:o,isUnique:!0,usedNthOfType:!1,extraClassesAdded:0};const h=E(a.classes??[]);for(let d=0;d<Math.min(h.length,n);d++){const t=h[d];if(o+=`.${this.escapeCSS(t)}`,c++,this.isUnique(o,r))return{selector:o,isUnique:!0,usedNthOfType:!1,extraClassesAdded:c}}if(!this.isUnique(o,r)){const t=this.buildFullDomPathSelector(e,a,r);if(t&&this.isUnique(t,r))return{selector:t,isUnique:!0,usedNthOfType:t.includes(":nth-of-type("),extraClassesAdded:c}}const u=this.findNthElementByText(o,a,r);return u&&(o+=this.getNthSelector(u,i),l=!0),{selector:o,isUnique:this.isUnique(o,r),usedNthOfType:l,extraClassesAdded:c}}buildFullDomPathSelector(t,e,s){const r=this.buildNodeSelector(t.anchor.tag,t.anchor.semantics),n=this.querySelectorSafe(r,s);if(0===n.length)return null;for(const i of n){const r=this.findTargetWithinAnchor(i,t.target.tag,e);if(0===r.length)continue;const n=r.map(e=>({element:e,score:this.scorePathMatch(e,i,t.path)}));n.sort((t,e)=>e.score-t.score);for(const{element:e}of n){const r=this.buildPathFromAnchorToTarget(i,e,t,s);if(r&&this.isUnique(r,s))return r}}return null}scorePathMatch(t,e,s){const r=[];let n=t.parentElement;for(;n&&n!==e;)r.unshift(n),n=n.parentElement;let i=0;const a=Math.min(r.length,s.length);for(let o=0;o<a;o++){const t=r[o],e=s[o];if(t.tagName.toLowerCase()===e.tag){if(i+=10,void 0!==e.nthChild){const s=t.parentElement;if(s){Array.from(s.children).indexOf(t)+1===e.nthChild?i+=20:i-=10}}}else i-=5;if(e.semantics.classes&&e.semantics.classes.length>0){i+=2*e.semantics.classes.filter(e=>t.classList.contains(e)).length}if(e.semantics.attributes){i+=3*Object.entries(e.semantics.attributes).filter(([e,s])=>t.getAttribute(e)===s).length}}return i-=2*Math.abs(r.length-s.length),i}findTargetWithinAnchor(t,e,s){return Array.from(t.querySelectorAll(e)).filter(t=>{if(s.text){const e=t.textContent?.trim()||"",r=s.text.normalized;if(!e.includes(r)&&!r.includes(e))return!1}if(s.classes&&s.classes.length>0){if(s.classes.every(e=>t.classList.contains(e)))return!0}if(s.attributes){if(Object.entries(s.attributes).every(([e,s])=>{const r=t.getAttribute(e);return"href"===e||"src"===e?P(e,r||"")===P(e,s):r===s}))return!0}return!!s.text})}disambiguateParent(t,e,s,r,n){if(s?.semantics?.attributes){const t=this.buildNodeSelector(e,s.semantics,{excludeClasses:!0}),i=[...r,e].join(" > "),a=this.querySelectorSafe(i,n),o=[...r,t].join(" > "),c=this.querySelectorSafe(o,n);if(c.length>0&&c.length<a.length)return t}if(s?.semantics?.classes){const t=E(s.semantics.classes);if(t.length>0){const s=`${e}.${this.escapeCSS(t[0])}`,i=[...r,e].join(" > "),a=this.querySelectorSafe(i,n),o=[...r,s].join(" > "),c=this.querySelectorSafe(o,n);if(c.length>0&&c.length<a.length)return s}}const i=t.parentElement;if(i){if(Array.from(i.children).filter(t=>t.tagName.toLowerCase()===e).length>1)return`${e}${this.getNthSelector(t,e)}`}return e}buildPathFromAnchorToTarget(t,e,s,r){const n=[];let i=e;for(;i&&i!==t;)n.unshift(i),i=i.parentElement;if(i!==t)return null;const a=[()=>{const t=this.buildNodeSelector(s.anchor.tag,s.anchor.semantics),e=s.target.tag,n=s.target.semantics,i=[];for(const r of s.path)i.push(r.tag);const a=[t,...i,e].filter(Boolean).join(" ");if(this.isUnique(a,r))return a;const o=this.buildNodeSelector(e,n,{excludeClasses:!0}),c=[t,...i.slice(0,-1),o].join(" ");return this.isUnique(c,r)?c:null},()=>{const t=[this.buildNodeSelector(s.anchor.tag,s.anchor.semantics)],e=/* @__PURE__ */new Map;let i=0;for(let r=0;r<n.length-1;r++){const t=n[r],a=t.tagName.toLowerCase();i<s.path.length&&s.path[i].tag===a?(e.set(t,s.path[i]),i++):e.set(t,null)}for(let o=0;o<n.length;o++){const i=n[o],a=i.tagName.toLowerCase();if(o<n.length-1){const s=e.get(i)||null,n=this.disambiguateParent(i,a,s,t,r);t.push(n);continue}const c=this.buildNodeSelector(s.target.tag,s.target.semantics,{excludeClasses:!0}),l=i.parentElement;if(l&&["td","th","tr","thead","tbody","tfoot"].includes(a)){Array.from(l.children).filter(t=>t.tagName.toLowerCase()===a).length>1?t.push(`${c}${this.getNthSelector(i,a)}`):t.push(c)}else t.push(c)}const a=t.join(" > ");return this.isUnique(a,r)?a:null},()=>{const t=[this.buildNodeSelector(s.anchor.tag,s.anchor.semantics)];for(let a=0;a<n.length-1;a++){const e=n[a].tagName.toLowerCase(),i=s.path[a]||null,o=t.join(" ")+" "+e;if(this.querySelectorSafe(o,r).length>1){if(i?.semantics?.attributes){const n=this.buildNodeSelector(e,i.semantics,{excludeClasses:!0}),a=t.join(" ")+" "+n;if(1===this.querySelectorSafe(a,r).length||1===this.querySelectorSafe(a+" "+s.target.tag,r).length){t.push(n);continue}}if(i?.semantics?.classes){const n=E(i.semantics.classes);if(n.length>0){const i=`${e}.${this.escapeCSS(n[0])}`,a=t.join(" ")+" "+i;if(1===this.querySelectorSafe(a,r).length||1===this.querySelectorSafe(a+" "+s.target.tag,r).length){t.push(i);continue}}}const o=n[a],c=o.parentElement;if(c){if(Array.from(c.children).filter(t=>t.tagName.toLowerCase()===e).length>1){t.push(`${e}${this.getNthSelector(o,e)}`);continue}}}t.push(e)}const e=this.buildNodeSelector(s.target.tag,s.target.semantics,{excludeClasses:!0});t.push(e);const i=t.join(" ");return this.isUnique(i,r)?i:null},()=>{const t=this.buildNodeSelector(s.anchor.tag,s.anchor.semantics),e=[];for(const r of s.path)e.push(r.tag);if(0===E(s.target.semantics.classes??[]).length)return null;const n=this.buildNodeSelector(s.target.tag,s.target.semantics,{maxClasses:1}),i=[t,...e.slice(0,-1),n].join(" ");return this.isUnique(i,r)?i:null},()=>{const t=this.buildNodeSelector(s.anchor.tag,s.anchor.semantics),e=[];for(const r of s.path)e.push(r.tag);const i=n[n.length-1],a=i.parentElement;if(!a)return null;if(Array.from(a.children).filter(t=>t.tagName.toLowerCase()===s.target.tag).length<=1)return null;const o=this.buildNodeSelector(s.target.tag,s.target.semantics,{excludeClasses:!0})+this.getNthSelector(i,s.target.tag),c=[t,...e.slice(0,-1),o].join(" ");return this.isUnique(c,r)?c:null}];for(const o of a){const t=o();if(t)return t}return null}buildElementSelector(t){const e=t.tagName.toLowerCase();let s=e;if(t.id&&!this.isDynamicId(t.id))return`${e}#${this.escapeCSS(t.id)}`;const r=E(Array.from(t.classList));r.length>0&&(s+=r.slice(0,2).map(t=>`.${this.escapeCSS(t)}`).join(""));const n=t.getAttribute("role");return n&&(s+=`[role="${this.escapeAttr(n)}"]`),s}isDynamicId(t){return[/^[a-f0-9]{8,}$/i,/^\d{5,}$/,/^(r|react|ember|vue)[\d_]/i,/:r\d+:$/].some(e=>e.test(t))}querySelectorSafe(t,e){try{return Array.from(e.querySelectorAll(t))}catch{return[]}}findNthElementByText(t,e,s){const r=this.querySelectorSafe(t,s);if(r.length<=1)return null;if(e.text){const t=e.text.normalized;for(const e of r){const s=e.textContent?.trim()||"";if(s===t||s.includes(t)||t.includes(s))return e}}return null}isUnique(t,e){try{return 1===e.querySelectorAll(t).length}catch{return!1}}getNthOfTypeIndex(t,e){const s=t.parentElement;if(!s)return null;const r=Array.from(s.children).filter(t=>t.tagName.toLowerCase()===e).indexOf(t);return-1!==r?r+1:null}ensureUniqueAnchor(t,e){const s=t.anchor.tag,r=t.anchor.semantics;if(this.isUnique(s,e))return s;if(r.classes&&r.classes.length>0){const t=E(r.classes);if(t.length>0){const r=`${s}.${this.escapeCSS(t[0])}`;if(this.isUnique(r,e))return r}}if(r.attributes){const t=this.getSortedAttributes(r.attributes);for(const{name:r,value:n}of t){const t="href"===r||"src"===r?P(r,n):n;if(t){const n=`${s}[${r}="${this.escapeAttr(t)}"]`;if(this.isUnique(n,e))return n}}}const n=Array.from(e.querySelectorAll(s));if(n.length>1){const t=this.findElementBySemantics(n,r);if(t){const e=this.getNthOfTypeIndex(t,s);if(e)return`${s}:nth-of-type(${e})`}}return s}findElementBySemantics(t,e){return e.classes&&e.classes.length>0||e.attributes&&Object.keys(e.attributes).length>0||e.text?t.find(t=>{if(e.classes&&e.classes.length>0){if(e.classes.every(e=>t.classList.contains(e)))return!0}if(e.attributes){if(Object.entries(e.attributes).every(([e,s])=>t.getAttribute(e)===s))return!0}if(e.text){const s=t.textContent?.trim()||"",r=e.text.normalized;if(s.includes(r)||r.includes(s))return!0}return!1})||null:t.length>0?t[0]:null}getNthSelector(t,e){const s=t.parentElement;if(!s)return"";const r=Array.from(s.children),n=r.indexOf(t)+1;if(["tr","td","th","thead","tbody","tfoot"].includes(e))return`:nth-child(${n})`;return`:nth-of-type(${r.filter(t=>t.tagName.toLowerCase()===e).indexOf(t)+1})`}getAttributePriority(t){return void 0!==S[t]?S[t]:t.startsWith("data-")?S["data-*"]:t.startsWith("aria-")?S["aria-*"]:0}shouldIgnoreAttribute(t){return!!A.has(t)||(!!t.startsWith("on")||(!(!t.startsWith("ng-")&&!t.startsWith("_ng"))||(!(!t.startsWith("data-reactid")&&!t.startsWith("data-react"))||!!t.startsWith("data-v-"))))}getSortedAttributes(t){return Object.entries(t).filter(([t])=>!this.shouldIgnoreAttribute(t)).map(([t,e])=>({name:t,value:e,priority:this.getAttributePriority(t)})).filter(t=>t.priority>0).sort((t,e)=>e.priority-t.priority)}buildNodeSelector(t,e,s){let r=t;if(e.id)return r+=`#${this.escapeCSS(e.id)}`,r;if(e.attributes){const t=this.getSortedAttributes(e.attributes);for(const{name:e,value:s}of t){const t="href"===e||"src"===e?P(e,s):s;t&&(r+=`[${e}="${this.escapeAttr(t)}"]`)}}if(e.role&&!e.attributes?.role&&(r+=`[role="${this.escapeAttr(e.role)}"]`),!s?.excludeClasses&&e.classes&&e.classes.length>0){const t=E(e.classes);r+=(void 0!==s?.maxClasses?t.slice(0,s.maxClasses):t).map(t=>`.${this.escapeCSS(t)}`).join("")}return r}escapeCSS(t){return t.replace(/([!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~])/g,"\\$1")}escapeAttr(t){return t.replace(/"/g,'\\"').replace(/\\/g,"\\\\")}isSvgChildElement(t){return y.includes(t)}}class Y{match(t,e){return t.filter(t=>this.matchElement(t,e))}matchElement(t,e){return!(e.text&&!this.matchText(t,e.text))&&(!(e.attributes&&!this.matchAttributes(t,e.attributes))&&!(e.svg&&!this.matchSvgFingerprint(t,e.svg)))}matchText(t,e){const s=Array.from(t.childNodes).filter(t=>t.nodeType===Node.TEXT_NODE).map(t=>t.textContent?.trim()??"").join(" ")||(t.textContent?.trim()??"");if(!s)return!1;const r=U(s);return"partial"===e.matchMode?r.includes(e.normalized):r===e.normalized}matchAttributes(t,e){for(const[s,r]of Object.entries(e)){if(t.getAttribute(s)!==r)return!1}return!0}matchSvgFingerprint(t,e){if(t.tagName.toLowerCase()!==e.shape)return!1;if(e.dHash&&"path"===e.shape){const s=t.getAttribute("d");if(s){if(this.computePathHash(s)!==e.dHash)return!1}}if(e.geomHash&&["circle","rect","ellipse","line"].includes(e.shape)){if(this.computeGeomHash(t,e.shape)!==e.geomHash)return!1}if(e.titleText){const s=t.querySelector("title");if(s?.textContent?.trim()!==e.titleText)return!1}return!0}computePathHash(t){const e=(t.match(/[MLHVCSQTAZ][^MLHVCSQTAZ]*/gi)??[]).slice(0,5).map(t=>t.trim().replace(/(-?\d+\.?\d*)/g,t=>parseFloat(t).toFixed(1))).join(" ");return this.simpleHash(e)}computeGeomHash(t,e){const s=[];switch(e){case"circle":s.push(`r=${t.getAttribute("r")??"0"}`);break;case"rect":{const e=parseFloat(t.getAttribute("width")??"0"),r=parseFloat(t.getAttribute("height")??"0");e>0&&r>0&&s.push(`ratio=${(e/r).toFixed(2)}`);break}case"ellipse":{const e=parseFloat(t.getAttribute("rx")??"0"),r=parseFloat(t.getAttribute("ry")??"0");e>0&&r>0&&s.push(`ratio=${(e/r).toFixed(2)}`);break}case"line":{const e=parseFloat(t.getAttribute("x1")??"0"),r=parseFloat(t.getAttribute("y1")??"0"),n=parseFloat(t.getAttribute("x2")??"0"),i=parseFloat(t.getAttribute("y2")??"0"),a=Math.atan2(i-r,n-e);s.push(`angle=${a.toFixed(2)}`);break}}return this.simpleHash(s.join(";"))}simpleHash(t){let e=0;for(let s=0;s<t.length;s++){e=(e<<5)-e+t.charCodeAt(s),e&=e}return Math.abs(e).toString(16).padStart(8,"0")}}class tt{applyConstraint(t,e){switch(e.type){case"text-proximity":return this.applyTextProximity(t,e.params);case"position":return this.applyPosition(t,e.params);default:return t}}applyTextProximity(t,e){return t.filter(t=>{const s=t.textContent?.trim()??"";return this.levenshteinDistance(s,e.reference)<=e.maxDistance})}applyPosition(t,e){if(t.length<=1)return t;switch(e.strategy){case"first-in-dom":default:return[t[0]];case"top-most":return[this.getTopMost(t)];case"left-most":return[this.getLeftMost(t)]}}getTopMost(t){return t.reduce((t,e)=>{try{const s=t.getBoundingClientRect();return e.getBoundingClientRect().top<s.top?e:t}catch{return t}})}getLeftMost(t){return t.reduce((t,e)=>{try{const s=t.getBoundingClientRect();return e.getBoundingClientRect().left<s.left?e:t}catch{return t}})}levenshteinDistance(t,e){if(t===e)return 0;if(0===t.length)return e.length;if(0===e.length)return t.length;const s=Array.from({length:e.length+1},(t,e)=>e);for(let r=1;r<=t.length;r++){let n=r;for(let i=1;i<=e.length;i++){const a=t[r-1]===e[i-1]?s[i-1]:Math.min(s[i-1],n,s[i])+1;s[i-1]=n,n=a}s[e.length]=n}return s[e.length]}}class et{constructor(){this.cssGenerator=new K}handleFallback(t,e){const{onMissing:s}=t.fallback;switch(s){case"anchor-only":return this.fallbackToAnchor(t,e);case"strict":return{status:"error",elements:[],warnings:["Element not found (strict mode)"],confidence:0,meta:{degraded:!0,degradationReason:"strict-not-found"}};default:return{status:"error",elements:[],warnings:["Element not found"],confidence:0,meta:{degraded:!0,degradationReason:"not-found"}}}}fallbackToAnchor(t,e){const s=this.cssGenerator.buildAnchorSelector(t),r=e instanceof Document?e:e.ownerDocument??e;try{const e=r.querySelector(s);if(e)return{status:"degraded-fallback",elements:[e],warnings:["Target not found, returning anchor"],confidence:.3*t.meta.confidence,meta:{degraded:!0,degradationReason:"anchor-fallback"}}}catch(n){return{status:"error",elements:[],warnings:[`Invalid anchor selector: ${n instanceof Error?n.message:"Unknown selector error"}`],confidence:0,meta:{degraded:!0,degradationReason:"invalid-anchor-selector"}}}return{status:"error",elements:[],warnings:["Anchor also not found"],confidence:0,meta:{degraded:!0,degradationReason:"anchor-not-found"}}}handleAmbiguous(t,e){const{onMultiple:s}=e.fallback;switch(s){case"first":return{status:"success",elements:[t[0]],warnings:["Multiple matches, returning first"],confidence:.7*e.meta.confidence,meta:{degraded:!0,degradationReason:"first-of-multiple"}};case"best-score":return this.selectBestScoring(t,e);default:return{status:"ambiguous",elements:t,warnings:[`Multiple matches: ${t.length}`],confidence:.5*e.meta.confidence,meta:{degraded:!0,degradationReason:"multiple-matches"}}}}selectBestScoring(t,e){const s=e.target.semantics;let r=t[0],n=-1;for(const i of t){const t=this.scoreElementMatch(i,s);t>n&&(n=t,r=i)}return{status:"success",elements:[r],warnings:[`Multiple matches (${t.length}), selected best-scoring element`],confidence:e.meta.confidence*(.7+.2*n),meta:{degraded:!0,degradationReason:"best-of-multiple"}}}scoreElementMatch(t,e){let s=0,r=0;if(e.id&&(r+=.3,t.id===e.id&&(s+=.3)),e.classes&&e.classes.length>0){r+=.25;const n=Array.from(t.classList);s+=e.classes.filter(t=>n.includes(t)).length/e.classes.length*.25}if(e.attributes){const n=Object.entries(e.attributes);if(n.length>0){r+=.2;let e=0;for(const[s,r]of n)t.getAttribute(s)===r&&e++;s+=e/n.length*.2}}if(e.role&&(r+=.15,t.getAttribute("role")===e.role&&(s+=.15)),e.text){r+=.1;const n=U(t.textContent);n===e.text.normalized?s+=.1:n.includes(e.text.normalized)&&(s+=.05)}return r>0?s/r:0}}function st(t,e,s={}){const r={...w,...s},n=new K,i=new Y,a=new tt,o=new et,c=e instanceof Document?e:e.ownerDocument??e,l=n.buildSelector(t,{ensureUnique:!1,root:c});let h;try{h=Array.from(c.querySelectorAll(l))}catch(m){return{status:"error",elements:[],warnings:[`Invalid CSS selector: ${l}`,`Error: ${m instanceof Error?m.message:"Unknown selector error"}`],confidence:0,meta:{degraded:!0,degradationReason:"invalid-selector"}}}h.length>r.maxCandidates&&(h=h.slice(0,r.maxCandidates));const u=i.match(h,t.target.semantics);if(1===u.length)return{status:"success",elements:u,warnings:[],confidence:t.meta.confidence,meta:{degraded:!1}};if(0===u.length)return r.enableFallback?o.handleFallback(t,c):{status:"error",elements:[],warnings:["No matching elements found"],confidence:0,meta:{degraded:!0,degradationReason:"not-found"}};let d=u;const g=(f=t.constraints,[...f].sort((t,e)=>e.priority-t.priority));var f;for(const p of g){if(d=a.applyConstraint(d,p),1===d.length)return{status:"success",elements:d,warnings:[],confidence:.9*t.meta.confidence,meta:{degraded:!1}};if(0===d.length)return r.enableFallback?o.handleFallback(t,c):{status:"error",elements:[],warnings:["Constraints eliminated all candidates"],confidence:0,meta:{degraded:!0,degradationReason:"over-constrained"}}}return r.strictMode?{status:"ambiguous",elements:d,warnings:[`Non-unique resolution: ${d.length} matches`],confidence:.7*t.meta.confidence,meta:{degraded:!0,degradationReason:"ambiguous"}}:o.handleAmbiguous(d,t)}function rt(t){const e=[],s=[];if(t.version?"1.0"!==t.version&&s.push(`Unknown version: ${t.version}`):e.push("Missing version field"),t.anchor?(t.anchor.tag||e.push("Anchor missing tag"),"number"!=typeof t.anchor.score&&e.push("Anchor missing score"),t.anchor.semantics||e.push("Anchor missing semantics")):e.push("Missing anchor field"),t.target?(t.target.tag||e.push("Target missing tag"),"number"!=typeof t.target.score&&e.push("Target missing score"),t.target.semantics||e.push("Target missing semantics")):e.push("Missing target field"),Array.isArray(t.path))for(let r=0;r<t.path.length;r++){const s=t.path[r];s.tag||e.push(`Path node ${r} missing tag`),s.semantics||e.push(`Path node ${r} missing semantics`)}else e.push("Path must be an array");return t.meta?("number"!=typeof t.meta.confidence&&s.push("Missing confidence score"),t.meta.generatedAt||s.push("Missing generatedAt timestamp")):e.push("Missing meta field"),Array.isArray(t.constraints)||s.push("Constraints should be an array"),t.fallback||s.push("Missing fallback rules"),{valid:0===e.length,errors:e,warnings:s}}function nt(t){if(!t||"object"!=typeof t)return!1;const e=t;return"string"==typeof e.version&&"object"==typeof e.anchor&&Array.isArray(e.path)&&"object"==typeof e.target}const it={maxClasses:2,maxAttributes:5,includeText:!0,maxTextLength:50,simplifyTarget:!0,includeConstraints:!0};function at(t){return"id"===t?101:void 0!==S[t]?S[t]:t.startsWith("data-")?S["data-*"]:t.startsWith("aria-")?S["aria-*"]:0}function ot(t){return["id","data-testid","data-qa","data-cy","href","text","role"].includes(t)}function ct(t,e){const s={...it,...e},r=`v${t.version}`,n=ht(t.anchor,!1,s),i=t.path.length>0?t.path.map(t=>ht(t,!1,s)).join(" > ")+" > ":"",a=ht(t.target,!0,s),o=s.includeConstraints?function(t){if(!t.constraints||0===t.constraints.length)return"";const e=[];for(const s of t.constraints)switch(s.type){case"uniqueness":e.push("unique=true");break;case"position":s.params&&s.params.strategy&&e.push(`pos=${s.params.strategy}`);break;case"text-proximity":if(s.params&&s.params.reference){const t=dt(String(s.params.reference));e.push(`text="${t}"`)}}if(0===e.length)return"";return` {${e.join(",")}}`}(t):"";return`${r}: ${n} :: ${i}${a}${o}`}function lt(t){const e=(t=t.trim()).match(/^v(\d+(?:\.\d+)?)\s*:\s*/);if(!e)throw new Error('Invalid SEQL Selector: missing version prefix (expected "v1:")');const s=e[1];if("1.0"!==s&&"1"!==s)throw new Error(`Unsupported SEQL Selector version: v${s} (only v1.0 is supported)`);let r=t.slice(e[0].length);const n=r.match(/^(.+?)\s*::\s*/);if(!n)throw new Error('Invalid SEQL Selector: missing anchor separator "::"');const i=n[1].trim();r=r.slice(n[0].length);const a=r.match(/\s*\{([^}]+)\}\s*$/);let o="";a&&(o=a[1],r=r.slice(0,a.index));const c=r.split(/\s*>\s*/).map(t=>t.trim()).filter(t=>t);if(0===c.length)throw new Error("Invalid SEQL Selector: missing target node");const l=c[c.length-1],h=c.slice(0,-1),u=ut(i,!0),d=h.map(t=>ut(t,!1)),g=ut(l,!1),f=function(t){if(!t.trim())return[];const e=[],s=t.split(",").map(t=>t.trim());for(const r of s){const[t,s]=r.split("=").map(t=>t.trim());switch(t){case"unique":"true"===s&&e.push({type:"uniqueness",params:{mode:"strict"},priority:90});break;case"pos":e.push({type:"position",params:{strategy:s},priority:70});break;case"text":const t=s.replace(/^"(.*)"$/,"$1");e.push({type:"text-proximity",params:{reference:gt(t),maxDistance:5},priority:60})}}return e}(o);return{version:"1.0",anchor:u,path:d,target:g,constraints:f,fallback:{onMultiple:"best-score",onMissing:"anchor-only",maxDepth:10},meta:{confidence:.7,generatedAt:/* @__PURE__ */(new Date).toISOString(),generator:"seql-parser@1.0",source:"seql-string",degraded:!1}}}function ht(t,e=!1,s=it){const{tag:r,semantics:n}=t;let i=r;const a=[],o={...n.attributes};n.id&&(o.id=n.id),n.role&&!o.role&&(o.role=n.role);const c=Object.entries(o).map(([t,e])=>{const s=at(t);return{name:t,value:"href"===t||"src"===t?P(t,e):e,priority:s}}).filter(t=>!["style","xmlns","tabindex","contenteditable"].includes(t.name)&&(t.priority>0||"role"===t.name||"id"===t.name));c.sort((t,e)=>e.priority-t.priority);const l=c.slice(0,s.maxAttributes);l.sort((t,e)=>t.name.localeCompare(e.name));for(const{name:u,value:d}of l)a.push(`${u}="${dt(d)}"`);if(s.includeText&&n.text&&(h=n.text.normalized,!(/@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/.test(h)||/(\+?\d{1,3}[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}/.test(h)||/\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}/.test(h)))){const t=n.text.normalized;t.length>0&&t.length<=s.maxTextLength&&a.push(`text="${dt(t)}"`)}var h;if(a.length>0){let t=a;e&&s.simplifyTarget&&n.id&&(t=a.filter(t=>{const e=t.split("=")[0];return at(e)>=60||"text"===e||"id"===e||"role"===e})),t.length>0&&(t.sort((t,e)=>t.localeCompare(e)),i+=`[${t.join(",")}]`)}if(n.classes&&n.classes.length>0){const t=E(n.classes),r=!!n.id||a.some(t=>t.startsWith("href=")||t.startsWith("data-testid=")||t.startsWith("text=")||t.startsWith("role="));if(!(e&&s.simplifyTarget&&r)&&t.length>0){i+=t.sort().slice(0,s.maxClasses).map(t=>`.${t}`).join("")}}if("nthChild"in t&&t.nthChild){const r=!!n.id||n.attributes&&Object.keys(n.attributes).some(ot);e&&s.simplifyTarget&&r||(i+=`#${t.nthChild}`)}return i}function ut(t,e){let s=t;const r={},n=s.match(/^([a-z][a-z0-9-]*)/);if(!n)throw new Error(`Invalid node: missing tag name in "${t}"`);const i=n[1];s=s.slice(i.length);const a=[];let o;for(;o=s.match(/^\.([a-zA-Z][a-zA-Z0-9-_]*)/);)a.push(o[1]),s=s.slice(o[0].length);a.length>0&&(r.classes=a);const c=s.match(/^\[([^\]]+)\]/);if(c){const t={},e=function(t){const e=[];let s="",r=!1;for(let n=0;n<t.length;n++){const i=t[n];'"'!==i||0!==n&&"\\"===t[n-1]?","!==i||r?s+=i:(s.trim()&&e.push(s.trim()),s=""):(r=!r,s+=i)}s.trim()&&e.push(s.trim());return e}(c[1]);for(const s of e){const e=s.match(/^([a-z][a-z0-9-]*)(?:=|~=)"((?:[^"\\]|\\.)*)"/);if(e){const[,s,r]=e;t[s]=gt(r)}}Object.keys(t).length>0&&(t.text&&(r.text={raw:t.text,normalized:t.text},delete t.text),t.id&&(r.id=t.id,delete t.id),t.role&&(r.role=t.role,delete t.role),Object.keys(t).length>0&&(r.attributes=t)),s=s.slice(c[0].length)}let l;const h=s.match(/^#(\d+)/);if(h&&(l=parseInt(h[1],10),s=s.slice(h[0].length)),s.trim())throw new Error(`Invalid node: unexpected content "${s}" in "${t}"`);return e?{tag:i,semantics:r,score:.7,degraded:!1}:{tag:i,semantics:r,score:.7,nthChild:l}}function dt(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/>/g,"\\>").replace(/:/g,"\\:")}function gt(t){return t.replace(/\\\\/g,"\0").replace(/\\"/g,'"').replace(/\\>/g,">").replace(/\\:/g,":").replace(/\x00/g,"\\")}function ft(t,e,s){const r=X(t,e);return r?ct(r,s):null}function mt(t,e,s){try{const r=lt(t);return st(r,e,s).elements||[]}catch(r){return console.error("Failed to resolve SEQL Selector:",r),[]}}const pt=/* @__PURE__ */new Set(["script","style","noscript","meta","link","head","title"]);function bt(t){return t.id&&!$(t.id)?3:t.hasAttribute("role")||t.hasAttribute("aria-label")||t.hasAttribute("aria-labelledby")||t.hasAttribute("data-testid")||t.hasAttribute("data-qa")||t.hasAttribute("data-test")?2:1}function yt(t,e){const s=t.tagName.toLowerCase();if(pt.has(s))return!0;if(e){if(1===bt(t)){if(!["form","main","nav","section","article","footer","header","button","a","input","label","select","textarea"].includes(s))return!0}}return!1}function xt(t){return[...t].sort((t,e)=>{const s=bt(t);return bt(e)-s})}function St(t={}){const e=performance.now(),{root:s=("undefined"!=typeof document?document.body:void 0),filter:r="*",limit:n=1/0,onProgress:i,progressInterval:a=100,skipNonSemantic:o=!0,generatorOptions:c={},cache:l,signal:h}=t;if(!s)throw new Error("Root element or document is required");const u=l??_(),d={...c,cache:u};let g;try{g=(Document,Array.from(s.querySelectorAll(r)))}catch(v){return{results:[],failed:[],stats:{totalElements:0,successful:0,failed:0,skipped:0,totalTimeMs:0,avgTimePerElementMs:0,cacheHitRate:0}}}const f=xt(g.filter(t=>!yt(t,o))).slice(0,n),m=[],p=[];let b=0;const y=f.length;let x=0;for(let M=0;M<f.length&&!h?.aborted;M++){const t=f[M],e=u.getEID(t);if(e)m.push({element:t,eid:e,generationTimeMs:0});else{const e=performance.now();try{const s=X(t,d),r=performance.now()-e;s?m.push({element:t,eid:s,generationTimeMs:r}):b++}catch(v){p.push({element:t,error:v instanceof Error?v.message:String(v)})}}i&&M-x>=a&&(i(M+1,y),x=M)}i&&i(y,y);const S=performance.now()-e,A=u.getStats(),C=A.eidHits+A.eidMisses+A.selectorHits+A.selectorMisses,w=A.eidHits+A.selectorHits,$=C>0?w/C:0;return{results:m,failed:p,stats:{totalElements:y,successful:m.length,failed:p.length,skipped:b,totalTimeMs:S,avgTimePerElementMs:m.length>0?S/m.length:0,cacheHitRate:$}}}function At(t,e={}){const s=performance.now(),{limit:r=1/0,onProgress:n,progressInterval:i=100,skipNonSemantic:a=!0,generatorOptions:o={},cache:c,signal:l}=e,h=c??_(),u={...o,cache:h},d=xt(t.filter(t=>!yt(t,a))).slice(0,r),g=[],f=[];let m=0;const p=d.length;let b=0;for(let $=0;$<d.length&&!l?.aborted;$++){const t=d[$],e=h.getEID(t);if(e)g.push({element:t,eid:e,generationTimeMs:0});else{const e=performance.now();try{const s=X(t,u),r=performance.now()-e;s?g.push({element:t,eid:s,generationTimeMs:r}):m++}catch(w){f.push({element:t,error:w instanceof Error?w.message:String(w)})}}n&&$-b>=i&&(n($+1,p),b=$)}n&&n(p,p);const y=performance.now()-s,x=h.getStats(),S=x.eidHits+x.eidMisses+x.selectorHits+x.selectorMisses,A=x.eidHits+x.selectorHits,C=S>0?A/S:0;return{results:g,failed:f,stats:{totalElements:p,successful:g.length,failed:f.length,skipped:m,totalTimeMs:y,avgTimePerElementMs:g.length>0?y/g.length:0,cacheHitRate:C}}}export{v as AnchorFinder,tt as ConstraintsEvaluator,K as CssGenerator,C as DEFAULT_GENERATOR_OPTIONS,w as DEFAULT_RESOLVER_OPTIONS,Z as EIDCache,t as EID_VERSION,et as FallbackHandler,e as MAX_PATH_DEPTH,L as PathBuilder,p as ROLE_ANCHOR_VALUES,m as SEMANTIC_ANCHOR_TAGS,x as SEMANTIC_ATTRIBUTES,b as SEMANTIC_TAGS,O as SemanticExtractor,Y as SemanticsMatcher,I as SvgFingerprinter,W as calculateConfidence,B as calculateElementScore,V as createEIDCache,z as filterClasses,X as generateEID,St as generateEIDBatch,At as generateEIDForElements,ft as generateSEQL,D as getClassScore,_ as getGlobalCache,nt as isEID,j as isUtilityClass,U as normalizeText,lt as parseSEQL,J as resetGlobalCache,st as resolve,mt as resolveSEQL,ct as stringifySEQL,rt as validateEID};
|
|
2
|
+
//# sourceMappingURL=seql-js.js.map
|