aria-ease 7.5.0 → 7.8.1

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.
Files changed (57) hide show
  1. package/README.md +66 -81
  2. package/dist/ToggleComponentStrategy-TMRNXFSL.js +1 -0
  3. package/dist/cli.cjs +63 -63
  4. package/dist/cli.js +1 -1
  5. package/dist/contractTestRunnerPlaywright-CHCVW7VO.js +46 -0
  6. package/dist/contractTestRunnerPlaywright-FECB4HSX.js +46 -0
  7. package/dist/index.cjs +36 -36
  8. package/dist/index.d.cts +18 -19
  9. package/dist/index.d.ts +18 -19
  10. package/dist/index.js +10 -10
  11. package/dist/src/{Types.d-D96FYkCN.d.cts → Types.d-BjBTlIzl.d.cts} +18 -8
  12. package/dist/src/{Types.d-D96FYkCN.d.ts → Types.d-BjBTlIzl.d.ts} +18 -8
  13. package/dist/src/accordion/index.cjs +1 -1
  14. package/dist/src/accordion/index.d.cts +1 -1
  15. package/dist/src/accordion/index.d.ts +1 -1
  16. package/dist/src/accordion/index.js +1 -1
  17. package/dist/src/block/index.d.cts +1 -1
  18. package/dist/src/block/index.d.ts +1 -1
  19. package/dist/src/checkbox/index.cjs +1 -1
  20. package/dist/src/checkbox/index.d.cts +1 -1
  21. package/dist/src/checkbox/index.d.ts +1 -1
  22. package/dist/src/checkbox/index.js +1 -1
  23. package/dist/src/combobox/index.cjs +1 -1
  24. package/dist/src/combobox/index.d.cts +1 -1
  25. package/dist/src/combobox/index.d.ts +1 -1
  26. package/dist/src/combobox/index.js +1 -1
  27. package/dist/src/menu/index.cjs +1 -1
  28. package/dist/src/menu/index.d.cts +1 -1
  29. package/dist/src/menu/index.d.ts +1 -1
  30. package/dist/src/menu/index.js +1 -1
  31. package/dist/src/radio/index.cjs +1 -1
  32. package/dist/src/radio/index.d.cts +1 -1
  33. package/dist/src/radio/index.d.ts +1 -1
  34. package/dist/src/radio/index.js +1 -1
  35. package/dist/src/tabs/index.cjs +1 -1
  36. package/dist/src/tabs/index.d.cts +1 -2
  37. package/dist/src/tabs/index.d.ts +1 -2
  38. package/dist/src/tabs/index.js +1 -1
  39. package/dist/src/toggle/index.cjs +1 -1
  40. package/dist/src/toggle/index.d.cts +2 -7
  41. package/dist/src/toggle/index.d.ts +2 -7
  42. package/dist/src/toggle/index.js +1 -1
  43. package/dist/src/utils/test/ToggleComponentStrategy-UOGYK2U4.js +1 -0
  44. package/dist/src/utils/test/contractTestRunnerPlaywright-7ERFIHCM.js +46 -0
  45. package/dist/src/utils/test/dsl/index.cjs +1 -1
  46. package/dist/src/utils/test/dsl/index.d.cts +0 -5
  47. package/dist/src/utils/test/dsl/index.d.ts +0 -5
  48. package/dist/src/utils/test/dsl/index.js +1 -1
  49. package/dist/src/utils/test/index.cjs +29 -29
  50. package/dist/src/utils/test/index.d.cts +4 -3
  51. package/dist/src/utils/test/index.d.ts +4 -3
  52. package/dist/src/utils/test/index.js +1 -1
  53. package/dist/{test-FURQN5KO.js → test-CMD6E5YF.js} +1 -1
  54. package/package.json +1 -1
  55. package/dist/contractTestRunnerPlaywright-75NI6SN7.js +0 -46
  56. package/dist/contractTestRunnerPlaywright-VLOD5IB3.js +0 -46
  57. package/dist/src/utils/test/contractTestRunnerPlaywright-FSZDW7IR.js +0 -46
@@ -1,12 +1,12 @@
1
- 'use strict';var playwright=require('playwright'),Pe=require('path'),Le=require('fs-extra'),test=require('@playwright/test'),url=require('url'),fs=require('fs'),L=require('chalk'),jt=require('readline');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Pe__default=/*#__PURE__*/_interopDefault(Pe);var Le__default=/*#__PURE__*/_interopDefault(Le);var L__default=/*#__PURE__*/_interopDefault(L);var jt__default=/*#__PURE__*/_interopDefault(jt);var Ct=Object.defineProperty;var E=(c,e)=>()=>(c&&(e=c(c=0)),e);var z=(c,e)=>{for(var t in e)Ct(c,t,{get:e[t],enumerable:true});};async function At(){return re||(re=await playwright.chromium.launch({headless:true,args:["--disable-extensions","--disable-blink-features=AutomationControlled"]})),re}async function Rt(){return ie||(ie=await(await At()).newContext({permissions:[],ignoreHTTPSErrors:true})),ie}async function Oe(){return await(await Rt()).newPage()}async function qe(){ie&&(await ie.close(),ie=null),re&&(await re.close(),re=null);}var re,ie,be=E(()=>{re=null,ie=null;});function Z(c){return c==="required"||c==="recommended"||c==="optional"?c:xt}function ce(c){return c==="minimal"||c==="balanced"||c==="strict"||c==="paranoid"?c:"balanced"}function _e(c,e){return {minimal:{required:"error",recommended:"ignore",optional:"ignore"},balanced:{required:"error",recommended:"warning",optional:"ignore"},strict:{required:"error",recommended:"error",optional:"warning"},paranoid:{required:"error",recommended:"error",optional:"error"}}[e][c]}var xt,Te=E(()=>{xt="required";});var ze={};z(ze,{loadConfig:()=>Pt});function Mt(c){let e=[];if(!c||typeof c!="object")return e.push("Config must be an object"),{valid:false,errors:e};let t=c;if(t.audit!==void 0){if(typeof t.audit!="object"||t.audit===null)e.push("audit must be an object");else if(t.audit.urls!==void 0&&(Array.isArray(t.audit.urls)?t.audit.urls.some(r=>typeof r!="string")&&e.push("audit.urls must contain only strings"):e.push("audit.urls must be an array")),t.audit.output!==void 0)if(typeof t.audit.output!="object")e.push("audit.output must be an object");else {let r=t.audit.output;r.format!==void 0&&(["json","csv","html","all"].includes(r.format)||e.push("audit.output.format must be one of: json, csv, html, all")),r.out!==void 0&&typeof r.out!="string"&&e.push("audit.output.out must be a string");}}if(t.test!==void 0)if(typeof t.test!="object"||t.test===null)e.push("test must be an object");else {t.test.disableTimeouts!==void 0&&typeof t.test.disableTimeouts!="boolean"&&e.push("test.disableTimeouts must be a boolean when provided");let r=["actionTimeoutMs","assertionTimeoutMs","navigationTimeoutMs","componentReadyTimeoutMs"];for(let i of r){let n=t.test[i];n!==void 0&&(typeof n!="number"||!Number.isFinite(n)||n<0)&&e.push(`test.${i} must be a non-negative number when provided`);}t.test.components!==void 0&&(Array.isArray(t.test.components)?t.test.components.forEach((i,n)=>{if(typeof i!="object"||i===null)e.push(`test.components[${n}] must be an object`);else {typeof i.name!="string"&&e.push(`test.components[${n}].name must be a string`),i.contractPath!==void 0&&typeof i.contractPath!="string"&&e.push(`test.components[${n}].contractPath must be a string when provided`),i.strategyPath!==void 0&&typeof i.strategyPath!="string"&&e.push(`test.components[${n}].strategyPath must be a string when provided`),i.strictness!==void 0&&!["minimal","balanced","strict","paranoid"].includes(i.strictness)&&e.push(`test.components[${n}].strictness must be one of: minimal, balanced, strict, paranoid`),i.disableTimeouts!==void 0&&typeof i.disableTimeouts!="boolean"&&e.push(`test.components[${n}].disableTimeouts must be a boolean when provided`);let a=["actionTimeoutMs","assertionTimeoutMs","navigationTimeoutMs","componentReadyTimeoutMs"];for(let o of a){let f=i[o];f!==void 0&&(typeof f!="number"||!Number.isFinite(f)||f<0)&&e.push(`test.components[${n}].${o} must be a non-negative number when provided`);}}}):e.push("test.components must be an array")),t.test.strictness!==void 0&&(["minimal","balanced","strict","paranoid"].includes(t.test.strictness)||e.push("test.strictness must be one of: minimal, balanced, strict, paranoid"));}return t.contracts!==void 0&&(Array.isArray(t.contracts)?t.contracts.forEach((r,i)=>{typeof r!="object"||r===null?e.push(`contracts[${i}] must be an object`):(typeof r.src!="string"&&e.push(`contracts[${i}].src is required and must be a string`),r.out!==void 0&&typeof r.out!="string"&&e.push(`contracts[${i}].out must be a string`));}):e.push("contracts must be an array")),{valid:e.length===0,errors:e}}async function Et(c){try{let e=Pe__default.default.extname(c);if(e===".json"){let t=await Le__default.default.readFile(c,"utf-8");return JSON.parse(t)}else if([".js",".mjs",".cjs",".ts"].includes(e)){let t=await import(c);return t.default||t}return null}catch{return null}}async function Pt(c=process.cwd()){let e=["ariaease.config.js","ariaease.config.mjs","ariaease.config.cjs","ariaease.config.json","ariaease.config.ts"],t=null,r=null,i=[];for(let n of e){let a=Pe__default.default.resolve(c,n);if(await Le__default.default.pathExists(a)){if(r=a,t=await Et(a),t===null){i.push(`Found config at ${n} but failed to load it. Check for syntax errors.`);continue}let o=Mt(t);if(!o.valid){i.push(`Config validation failed in ${n}:`),i.push(...o.errors.map(f=>` - ${f}`)),t=null;continue}break}}return {config:t||{},configPath:t?r:null,errors:i}}var Ge=E(()=>{});var Ne={};z(Ne,{MenuComponentStrategy:()=>$e});var $e,Ye=E(()=>{$e=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.popup)return;let t=this.selectors.popup,r=e.locator(t).first();if(!await r.isVisible().catch(()=>false))return;let n=false,a=this.selectors.main;if(a&&(await e.locator(a).first().focus(),await e.keyboard.press("Escape"),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),!n&&this.selectors.main&&(await e.locator(this.selectors.main).first().click({timeout:this.actionTimeoutMs}),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),n||(await e.mouse.click(10,10),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),!n)throw new Error(`\u274C FATAL: Cannot close menu between tests. Menu remains visible after trying:
1
+ 'use strict';var playwright=require('playwright'),Be=require('path'),Fe=require('fs-extra'),test=require('@playwright/test'),url=require('url'),fs=require('fs'),L=require('chalk'),Jt=require('readline');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Be__default=/*#__PURE__*/_interopDefault(Be);var Fe__default=/*#__PURE__*/_interopDefault(Fe);var L__default=/*#__PURE__*/_interopDefault(L);var Jt__default=/*#__PURE__*/_interopDefault(Jt);var Et=Object.defineProperty;var x=(c,e)=>()=>(c&&(e=c(c=0)),e);var q=(c,e)=>{for(var t in e)Et(c,t,{get:e[t],enumerable:true});};async function Bt(){return se||(se=await playwright.chromium.launch({headless:true,args:["--disable-extensions","--disable-blink-features=AutomationControlled"]})),se}async function It(){return re||(re=await(await Bt()).newContext({permissions:[],ignoreHTTPSErrors:true})),re}async function _e(){return await(await It()).newPage()}async function Je(){re&&(await re.close(),re=null),se&&(await se.close(),se=null);}var se,re,be=x(()=>{se=null,re=null;});function ie(c){return c==="required"||c==="recommended"||c==="optional"?c:Lt}function ae(c){return c==="minimal"||c==="balanced"||c==="strict"||c==="paranoid"?c:"balanced"}function Ke(c,e){return {minimal:{required:"error",recommended:"ignore",optional:"ignore"},balanced:{required:"error",recommended:"warning",optional:"ignore"},strict:{required:"error",recommended:"error",optional:"warning"},paranoid:{required:"error",recommended:"error",optional:"error"}}[e][c]}var Lt,Te=x(()=>{Lt="required";});var Ne={};q(Ne,{loadConfig:()=>Ut});function Ft(c){let e=[];if(!c||typeof c!="object")return e.push("Config must be an object"),{valid:false,errors:e};let t=c;if(t.audit!==void 0){if(typeof t.audit!="object"||t.audit===null)e.push("audit must be an object");else if(t.audit.urls!==void 0&&(Array.isArray(t.audit.urls)?t.audit.urls.some(r=>typeof r!="string")&&e.push("audit.urls must contain only strings"):e.push("audit.urls must be an array")),t.audit.output!==void 0)if(typeof t.audit.output!="object")e.push("audit.output must be an object");else {let r=t.audit.output;r.format!==void 0&&(["json","csv","html","all"].includes(r.format)||e.push("audit.output.format must be one of: json, csv, html, all")),r.out!==void 0&&typeof r.out!="string"&&e.push("audit.output.out must be a string");}}if(t.test!==void 0)if(typeof t.test!="object"||t.test===null)e.push("test must be an object");else {t.test.disableTimeouts!==void 0&&typeof t.test.disableTimeouts!="boolean"&&e.push("test.disableTimeouts must be a boolean when provided");let r=["actionTimeoutMs","assertionTimeoutMs","navigationTimeoutMs","componentReadyTimeoutMs"];for(let i of r){let n=t.test[i];n!==void 0&&(typeof n!="number"||!Number.isFinite(n)||n<0)&&e.push(`test.${i} must be a non-negative number when provided`);}t.test.components!==void 0&&(Array.isArray(t.test.components)?t.test.components.forEach((i,n)=>{if(typeof i!="object"||i===null)e.push(`test.components[${n}] must be an object`);else {typeof i.name!="string"&&e.push(`test.components[${n}].name must be a string`),i.contractPath!==void 0&&typeof i.contractPath!="string"&&e.push(`test.components[${n}].contractPath must be a string when provided`),i.strategyPath!==void 0&&typeof i.strategyPath!="string"&&e.push(`test.components[${n}].strategyPath must be a string when provided`),i.strictness!==void 0&&!["minimal","balanced","strict","paranoid"].includes(i.strictness)&&e.push(`test.components[${n}].strictness must be one of: minimal, balanced, strict, paranoid`),i.disableTimeouts!==void 0&&typeof i.disableTimeouts!="boolean"&&e.push(`test.components[${n}].disableTimeouts must be a boolean when provided`);let a=["actionTimeoutMs","assertionTimeoutMs","navigationTimeoutMs","componentReadyTimeoutMs"];for(let o of a){let p=i[o];p!==void 0&&(typeof p!="number"||!Number.isFinite(p)||p<0)&&e.push(`test.components[${n}].${o} must be a non-negative number when provided`);}}}):e.push("test.components must be an array")),t.test.strictness!==void 0&&(["minimal","balanced","strict","paranoid"].includes(t.test.strictness)||e.push("test.strictness must be one of: minimal, balanced, strict, paranoid"));}return t.contracts!==void 0&&(Array.isArray(t.contracts)?t.contracts.forEach((r,i)=>{typeof r!="object"||r===null?e.push(`contracts[${i}] must be an object`):(typeof r.src!="string"&&e.push(`contracts[${i}].src is required and must be a string`),r.out!==void 0&&typeof r.out!="string"&&e.push(`contracts[${i}].out must be a string`));}):e.push("contracts must be an array")),{valid:e.length===0,errors:e}}async function Vt(c){try{let e=Be__default.default.extname(c);if(e===".json"){let t=await Fe__default.default.readFile(c,"utf-8");return JSON.parse(t)}else if([".js",".mjs",".cjs",".ts"].includes(e)){let t=await import(c);return t.default||t}return null}catch{return null}}async function Ut(c=process.cwd()){let e=["ariaease.config.js","ariaease.config.mjs","ariaease.config.cjs","ariaease.config.json","ariaease.config.ts"],t=null,r=null,i=[];for(let n of e){let a=Be__default.default.resolve(c,n);if(await Fe__default.default.pathExists(a)){if(r=a,t=await Vt(a),t===null){i.push(`Found config at ${n} but failed to load it. Check for syntax errors.`);continue}let o=Ft(t);if(!o.valid){i.push(`Config validation failed in ${n}:`),i.push(...o.errors.map(p=>` - ${p}`)),t=null;continue}break}}return {config:t||{},configPath:t?r:null,errors:i}}var Ye=x(()=>{});var Qe={};q(Qe,{MenuComponentStrategy:()=>$e});var $e,Xe=x(()=>{$e=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.popup)return;let t=this.selectors.popup,r=e.locator(t).first();if(!await r.isVisible().catch(()=>false))return;let n=false,a=this.selectors.main;if(a&&(await e.locator(a).first().focus(),await e.keyboard.press("Escape"),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),!n&&this.selectors.main&&(await e.locator(this.selectors.main).first().click({timeout:this.actionTimeoutMs}),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),n||(await e.mouse.click(10,10),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),!n)throw new Error(`\u274C FATAL: Cannot close menu between tests. Menu remains visible after trying:
2
2
  1. Escape key
3
3
  2. Clicking trigger
4
4
  3. Clicking outside
5
- This indicates a problem with the menu component's close functionality.`);this.selectors.input&&await e.locator(this.selectors.input).first().clear(),this.selectors.main&&await e.locator(this.selectors.main).first().focus();}async shouldSkipTest(e,t){if(!(e.action.some(a=>a.target==="submenu"||a.target==="submenuTrigger"||a.target==="submenuItems")||e.assertions.some(a=>a.target==="submenu"||a.target==="submenuTrigger"||a.target==="submenuItems")))return false;let i=this.selectors.submenuTrigger;return i?await t.locator(i).count()===0:true}getMainSelector(){return this.mainSelector}};});var Qe={};z(Qe,{AccordionComponentStrategy:()=>Ce});var Ce,Xe=E(()=>{Ce=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.panel||!this.selectors.trigger)return;let t=this.selectors.trigger,r=this.selectors.panel;if(!t||!r)return;let i=await e.locator(t).all();for(let n of i){let a=await n.getAttribute("aria-expanded")==="true",o=await n.getAttribute("aria-controls");if(a&&o){await n.click({timeout:this.actionTimeoutMs});let f=e.locator(`#${o}`);await test.expect(f).toBeHidden({timeout:this.assertionTimeoutMs}).catch(()=>{});}}}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var Ze={};z(Ze,{ComboboxComponentStrategy:()=>Ae});var Ae,et=E(()=>{Ae=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.popup)return;let t=this.selectors.popup,r=e.locator(t).first();if(!await r.isVisible().catch(()=>false))return;let n=false,a=this.selectors.main;if(a&&(await e.locator(a).first().focus(),await e.keyboard.press("Escape"),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),!n&&this.selectors.button&&(await e.locator(this.selectors.button).first().click({timeout:this.actionTimeoutMs}),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),n||(await e.mouse.click(10,10),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),!n)throw new Error(`\u274C FATAL: Cannot close combobox popup between tests. Popup remains visible after trying:
5
+ This indicates a problem with the menu component's close functionality.`);this.selectors.input&&await e.locator(this.selectors.input).first().clear(),this.selectors.main&&await e.locator(this.selectors.main).first().focus();}async shouldSkipTest(e,t){if(!(e.action.some(a=>a.target==="submenu"||a.target==="submenuTrigger"||a.target==="submenuItems")||e.assertions.some(a=>a.target==="submenu"||a.target==="submenuTrigger"||a.target==="submenuItems")))return false;let i=this.selectors.submenuTrigger;return i?await t.locator(i).count()===0:true}getMainSelector(){return this.mainSelector}};});var Ze={};q(Ze,{AccordionComponentStrategy:()=>Ce});var Ce,et=x(()=>{Ce=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.panel||!this.selectors.trigger)return;let t=this.selectors.trigger,r=this.selectors.panel;if(!t||!r)return;let i=await e.locator(t).all();for(let n of i){let a=await n.getAttribute("aria-expanded")==="true",o=await n.getAttribute("aria-controls");if(a&&o){await n.click({timeout:this.actionTimeoutMs});let p=e.locator(`#${o}`);await test.expect(p).toBeHidden({timeout:this.assertionTimeoutMs}).catch(()=>{});}}}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var tt={};q(tt,{ComboboxComponentStrategy:()=>Ae});var Ae,st=x(()=>{Ae=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.popup)return;let t=this.selectors.popup,r=e.locator(t).first();if(!await r.isVisible().catch(()=>false))return;let n=false,a=this.selectors.main;if(a&&(await e.locator(a).first().focus(),await e.keyboard.press("Escape"),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),!n&&this.selectors.button&&(await e.locator(this.selectors.button).first().click({timeout:this.actionTimeoutMs}),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),n||(await e.mouse.click(10,10),n=await test.expect(r).toBeHidden({timeout:this.assertionTimeoutMs}).then(()=>true).catch(()=>false)),!n)throw new Error(`\u274C FATAL: Cannot close combobox popup between tests. Popup remains visible after trying:
6
6
  1. Escape key
7
7
  2. Clicking button
8
8
  3. Clicking outside
9
- This indicates a problem with the combobox component's close functionality.`);this.selectors.input&&await e.locator(this.selectors.input).first().clear();}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var tt={};z(tt,{TabsComponentStrategy:()=>Re});var Re,st=E(()=>{Re=class{constructor(e,t){this.mainSelector=e;this.selectors=t;}async resetState(){}async shouldSkipTest(e,t){if(e.orientation!==void 0&&this.selectors.tablist){let r=this.selectors.tablist,n=await t.locator(r).first().getAttribute("aria-orientation");if(e.orientation!==n)return true}return false}getMainSelector(){return this.mainSelector}};});var rt={};z(rt,{RadioComponentStrategy:()=>xe});var xe,it=E(()=>{xe=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.radio||!this.selectors.relative)return;let t=this.selectors.radio;if(!t)return;let r=await e.locator(t).all();for(let i of r)if(await i.getAttribute("aria-checked")==="true"){await i.evaluate(o=>o.setAttribute("aria-checked","false"),{timeout:this.actionTimeoutMs});let a=e.locator(`#${i}`);await test.expect(a).toHaveAttribute("aria-checked","false",{timeout:this.assertionTimeoutMs}).catch(()=>{});}}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var nt={};z(nt,{CheckboxComponentStrategy:()=>Me});var Me,ot=E(()=>{Me=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.checkbox||!this.selectors.relative)return;let t=this.selectors.checkbox;if(!t)return;let r=await e.locator(t).all();for(let i of r)if(await i.getAttribute("aria-checked")==="true"){await i.click({timeout:this.actionTimeoutMs});let a=e.locator(`#${i}`);await test.expect(a).toHaveAttribute("aria-checked","false",{timeout:this.assertionTimeoutMs}).catch(()=>{});}}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var fe,ct=E(()=>{fe=class{builtInStrategies=new Map;constructor(){this.registerBuiltInStrategies();}registerBuiltInStrategies(){this.builtInStrategies.set("menu",()=>Promise.resolve().then(()=>(Ye(),Ne)).then(e=>e.MenuComponentStrategy)),this.builtInStrategies.set("accordion",()=>Promise.resolve().then(()=>(Xe(),Qe)).then(e=>e.AccordionComponentStrategy)),this.builtInStrategies.set("combobox",()=>Promise.resolve().then(()=>(et(),Ze)).then(e=>e.ComboboxComponentStrategy)),this.builtInStrategies.set("tabs",()=>Promise.resolve().then(()=>(st(),tt)).then(e=>e.TabsComponentStrategy)),this.builtInStrategies.set("radio",()=>Promise.resolve().then(()=>(it(),rt)).then(e=>e.RadioComponentStrategy)),this.builtInStrategies.set("checkbox",()=>Promise.resolve().then(()=>(ot(),nt)).then(e=>e.CheckboxComponentStrategy));}async loadStrategy(e,t,r){try{if(t)try{let n=Pe__default.default.isAbsolute(t)?t:Pe__default.default.resolve(r||process.cwd(),t),a=await import(url.pathToFileURL(n).href),o=a.default||a;if(!o)throw new Error(`No default export found in ${t}`);return o}catch(n){throw new Error(`Failed to load custom strategy from ${t}: ${n instanceof Error?n.message:String(n)}`)}let i=this.builtInStrategies.get(e);return i?i():null}catch(i){throw new Error(`Strategy loading failed for ${e}: ${i instanceof Error?i.message:String(i)}`)}}has(e,t){return !!t||this.builtInStrategies.has(e)}};});var ge,lt=E(()=>{ct();ge=class{static strategyRegistry=new fe;static isComponentConfig(e){return typeof e=="object"&&e!==null}static async detect(e,t,r=400,i=400,n){let a=this.isComponentConfig(t)?t:void 0,o=a?.contractPath;if(!o)throw new Error(`Contract path not found for component: ${e}`);let f=(()=>{if(Pe__default.default.isAbsolute(o))return o;if(n){let ue=Pe__default.default.resolve(n,o);try{return fs.readFileSync(ue,"utf-8"),ue}catch{}}let ee=Pe__default.default.resolve(process.cwd(),o);try{return fs.readFileSync(ee,"utf-8"),ee}catch{return new URL(o,(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).pathname}})(),$=fs.readFileSync(f,"utf-8"),P=JSON.parse($).selectors,B=await this.strategyRegistry.loadStrategy(e,a?.strategyPath,n);if(!B)return null;let G=P.main;return e==="tabs"?new B(G,P):new B(G,P,r,i)}};});var de,ut=E(()=>{de=class{startTime=0;componentName="";staticPasses=0;staticFailures=0;staticWarnings=0;dynamicResults=[];totalTests=0;skipped=0;warnings=0;isPlaywright=false;isCustomContract=false;apgUrl="https://www.w3.org/WAI/ARIA/apg/";hasPrintedStaticSection=false;hasPrintedDynamicSection=false;constructor(e=false,t=false){this.isPlaywright=e,this.isCustomContract=t;}log(e){process.stderr.write(e+`
9
+ This indicates a problem with the combobox component's close functionality.`);this.selectors.input&&await e.locator(this.selectors.input).first().clear();}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var rt={};q(rt,{TabsComponentStrategy:()=>Re});var Re,it=x(()=>{Re=class{constructor(e,t){this.mainSelector=e;this.selectors=t;}async resetState(){}async shouldSkipTest(e,t){if(e.orientation!==void 0&&this.selectors.tablist){let r=this.selectors.tablist,n=await t.locator(r).first().getAttribute("aria-orientation");if(e.orientation!==n)return true}return false}getMainSelector(){return this.mainSelector}};});var nt={};q(nt,{RadioComponentStrategy:()=>Me});var Me,ot=x(()=>{Me=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.radio||!this.selectors.relative)return;let t=this.selectors.radio;if(!t)return;let r=await e.locator(t).all();for(let i of r)if(await i.getAttribute("aria-checked")==="true"){await i.evaluate(o=>o.setAttribute("aria-checked","false"),{timeout:this.actionTimeoutMs});let a=e.locator(`#${i}`);await test.expect(a).toHaveAttribute("aria-checked","false",{timeout:this.assertionTimeoutMs}).catch(()=>{});}}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var at={};q(at,{CheckboxComponentStrategy:()=>xe});var xe,ct=x(()=>{xe=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.checkbox||!this.selectors.relative)return;let t=this.selectors.checkbox;if(!t)return;let r=await e.locator(t).all();for(let i of r)if(await i.getAttribute("aria-checked")==="true"){await i.click({timeout:this.actionTimeoutMs});let a=e.locator(`#${i}`);await test.expect(a).toHaveAttribute("aria-checked","false",{timeout:this.assertionTimeoutMs}).catch(()=>{});}}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var lt={};q(lt,{ToggleComponentStrategy:()=>Ee});var Ee,ut=x(()=>{Ee=class{constructor(e,t,r=400,i=400){this.mainSelector=e;this.selectors=t;this.actionTimeoutMs=r;this.assertionTimeoutMs=i;}async resetState(e){if(!this.selectors.toggle||!this.selectors.relative)return;let t=this.selectors.toggle;if(!t)return;let r=await e.locator(t).all();for(let i of r)if(await i.getAttribute("aria-pressed")==="true"){await i.click({timeout:this.actionTimeoutMs});let a=e.locator(`#${i}`);await test.expect(a).toHaveAttribute("aria-pressed","false",{timeout:this.assertionTimeoutMs}).catch(()=>{});}}async shouldSkipTest(){return false}getMainSelector(){return this.mainSelector}};});var pe,ft=x(()=>{pe=class{builtInStrategies=new Map;constructor(){this.registerBuiltInStrategies();}registerBuiltInStrategies(){this.builtInStrategies.set("menu",()=>Promise.resolve().then(()=>(Xe(),Qe)).then(e=>e.MenuComponentStrategy)),this.builtInStrategies.set("accordion",()=>Promise.resolve().then(()=>(et(),Ze)).then(e=>e.AccordionComponentStrategy)),this.builtInStrategies.set("combobox",()=>Promise.resolve().then(()=>(st(),tt)).then(e=>e.ComboboxComponentStrategy)),this.builtInStrategies.set("tabs",()=>Promise.resolve().then(()=>(it(),rt)).then(e=>e.TabsComponentStrategy)),this.builtInStrategies.set("radio",()=>Promise.resolve().then(()=>(ot(),nt)).then(e=>e.RadioComponentStrategy)),this.builtInStrategies.set("checkbox",()=>Promise.resolve().then(()=>(ct(),at)).then(e=>e.CheckboxComponentStrategy)),this.builtInStrategies.set("toggle",()=>Promise.resolve().then(()=>(ut(),lt)).then(e=>e.ToggleComponentStrategy));}async loadStrategy(e,t,r){try{if(t)try{let n=Be__default.default.isAbsolute(t)?t:Be__default.default.resolve(r||process.cwd(),t),a=await import(url.pathToFileURL(n).href),o=a.default||a;if(!o)throw new Error(`No default export found in ${t}`);return o}catch(n){throw new Error(`Failed to load custom strategy from ${t}: ${n instanceof Error?n.message:String(n)}`)}let i=this.builtInStrategies.get(e);return i?i():null}catch(i){throw new Error(`Strategy loading failed for ${e}: ${i instanceof Error?i.message:String(i)}`)}}has(e,t){return !!t||this.builtInStrategies.has(e)}};});var fe,gt=x(()=>{ft();fe=class{static strategyRegistry=new pe;static isComponentConfig(e){return typeof e=="object"&&e!==null}static async detect(e,t,r=400,i=400,n){let a=this.isComponentConfig(t)?t:void 0,o=a?.contractPath;if(!o)throw new Error(`Contract path not found for component: ${e}`);let p=(()=>{if(Be__default.default.isAbsolute(o))return o;if(n){let le=Be__default.default.resolve(n,o);try{return fs.readFileSync(le,"utf-8"),le}catch{}}let Z=Be__default.default.resolve(process.cwd(),o);try{return fs.readFileSync(Z,"utf-8"),Z}catch{return new URL(o,(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).pathname}})(),$=fs.readFileSync(p,"utf-8"),E=JSON.parse($).selectors,P=await this.strategyRegistry.loadStrategy(e,a?.strategyPath,n);if(!P)return null;let z=E.main;return e==="tabs"?new P(z,E):new P(z,E,r,i)}};});var ge,dt=x(()=>{ge=class{startTime=0;componentName="";staticPasses=0;staticFailures=0;staticWarnings=0;dynamicResults=[];totalTests=0;skipped=0;warnings=0;isPlaywright=false;isCustomContract=false;apgUrl="https://www.w3.org/WAI/ARIA/apg/";hasPrintedStaticSection=false;hasPrintedDynamicSection=false;constructor(e=false,t=false){this.isPlaywright=e,this.isCustomContract=t;}log(e){process.stderr.write(e+`
10
10
  `);}start(e,t,r){this.startTime=Date.now(),this.componentName=e,this.totalTests=t,this.hasPrintedStaticSection=false,this.hasPrintedDynamicSection=false,r&&(this.apgUrl=r);let i="Playwright (Real Browser)";this.log(`
11
11
  ${"\u2550".repeat(60)}`),this.log(`\u{1F50D} Testing ${e.charAt(0).toUpperCase()+e.slice(1)} Component - ${i}`),this.log(`${"\u2550".repeat(60)}
12
12
  `);}reportStatic(e,t,r=0){this.staticPasses=e,this.staticFailures=t,this.staticWarnings=r;}reportStaticTest(e,t,r,i){this.hasPrintedStaticSection||(this.log(`${"\u2500".repeat(60)}`),this.log("\u{1F9EA} Static Assertions"),this.log(`${"\u2500".repeat(60)}`),this.hasPrintedStaticSection=true);let n=t==="pass"?"\u2713":t==="warn"?"\u26A0":t==="skip"?"\u25CB":"\u2717";this.log(` ${n} ${e}`),i&&this.log(` \u21B3 level=${i}`),(t==="fail"||t==="warn"||t==="skip")&&r&&this.log(` \u21B3 ${r}`);}reportTest(e,t,r){this.hasPrintedDynamicSection||(this.log(""),this.log(`${"\u2500".repeat(60)}`),this.log("\u2328\uFE0F Dynamic Interaction Tests"),this.log(`${"\u2500".repeat(60)}`),this.hasPrintedDynamicSection=true);let i={description:e.description,status:t,failureMessage:r,level:e.level};t==="skip"&&(i.skipReason="Requires real browser (addEventListener events)"),this.dynamicResults.push(i);let n={pass:"\u2713",fail:"\u2717",warn:"\u26A0",skip:"\u25CB"},a=e.level?`[${e.level.toUpperCase()}] `:"";this.log(` ${n[t]} ${a}${e.description}`),t==="skip"&&!this.isPlaywright&&this.log(" \u21B3 Skipped (runs only in Playwright)"),t==="fail"&&r&&this.log(` \u21B3 ${r}`),t==="warn"&&r&&this.log(` \u21B3 ${r}`),t==="skip"&&r&&this.log(` \u21B3 ${r}`);}reportFailures(e){e.length!==0&&(this.log(`
@@ -21,62 +21,62 @@ ${"\u2500".repeat(60)}`),this.log(`\u2139\uFE0F Skipped Tests (${this.skipped})
21
21
  `),this.log("These tests use native keyboard events via addEventListener,"),this.log(`which only run in Playwright (real browser).
22
22
  `),e.forEach((t,r)=>{this.log(`${r+1}. ${t.description}`);}),this.log(`
23
23
  \u{1F4A1} Run with Playwright for full validation:`),this.log(` testUiComponent('${this.componentName}', null, 'http://localhost:5173/test-harness?component=component_name')
24
- `);}summary(e){let t=Date.now()-this.startTime,r=this.dynamicResults.filter(y=>y.status==="pass").length,i=this.dynamicResults.filter(y=>y.status==="fail").length,n=this.dynamicResults.filter(y=>y.status==="warn").length;this.skipped=this.dynamicResults.filter(y=>y.status==="skip").length,this.warnings=this.staticWarnings+n;let a=this.staticPasses+r,o=this.staticFailures+i,f=a+o+this.warnings,$=()=>{let y=`${this.componentName.charAt(0).toUpperCase()}${this.componentName.slice(1)}`;return this.isCustomContract?`${y} component validates against your custom accessibility policy \u2713`:`${y} component meets Aria-Ease baseline WAI-ARIA expectations \u2713`};return e.length>0&&this.reportFailures(e),this.reportWarnings(),this.reportSkipped(),this.log(`
24
+ `);}summary(e){let t=Date.now()-this.startTime,r=this.dynamicResults.filter(v=>v.status==="pass").length,i=this.dynamicResults.filter(v=>v.status==="fail").length,n=this.dynamicResults.filter(v=>v.status==="warn").length;this.skipped=this.dynamicResults.filter(v=>v.status==="skip").length,this.warnings=this.staticWarnings+n;let a=this.staticPasses+r,o=this.staticFailures+i,p=a+o+this.warnings,$=()=>{let v=`${this.componentName.charAt(0).toUpperCase()}${this.componentName.slice(1)}`;return this.isCustomContract?`${v} component validates against your custom accessibility policy \u2713`:`${v} component meets Aria-Ease baseline WAI-ARIA expectations \u2713`};return e.length>0&&this.reportFailures(e),this.reportWarnings(),this.reportSkipped(),this.log(`
25
25
  ${"\u2550".repeat(60)}`),this.log(`\u{1F4CA} Summary
26
- `),o===0&&this.skipped===0&&this.warnings===0?(this.log(`\u2705 All ${f} tests passed!`),this.log(` ${$()}`)):o===0?(this.log(`\u2705 ${a}/${f} tests passed`),this.skipped>0&&this.log(`\u25CB ${this.skipped} tests skipped`),this.warnings>0&&this.log(`\u26A0\uFE0F ${this.warnings} warning${this.warnings>1?"s":""}`),this.log(` ${$()}`)):(this.log(`\u274C ${o} test${o>1?"s":""} failed`),this.log(`\u2705 ${a} test${a>1?"s":""} passed`),this.warnings>0&&this.log(`\u26A0\uFE0F ${this.warnings} warning${this.warnings>1?"s":""}`),this.skipped>0&&this.log(`\u25CB ${this.skipped} test${this.skipped>1?"s":""} skipped`)),this.log(`\u23F1\uFE0F Duration: ${t}ms`),this.log(`${"\u2550".repeat(60)}
26
+ `),o===0&&this.skipped===0&&this.warnings===0?(this.log(`\u2705 All ${p} tests passed!`),this.log(` ${$()}`)):o===0?(this.log(`\u2705 ${a}/${p} tests passed`),this.skipped>0&&this.log(`\u25CB ${this.skipped} tests skipped`),this.warnings>0&&this.log(`\u26A0\uFE0F ${this.warnings} warning${this.warnings>1?"s":""}`),this.log(` ${$()}`)):(this.log(`\u274C ${o} test${o>1?"s":""} failed`),this.log(`\u2705 ${a} test${a>1?"s":""} passed`),this.warnings>0&&this.log(`\u26A0\uFE0F ${this.warnings} warning${this.warnings>1?"s":""}`),this.skipped>0&&this.log(`\u25CB ${this.skipped} test${this.skipped>1?"s":""} skipped`)),this.log(`\u23F1\uFE0F Duration: ${t}ms`),this.log(`${"\u2550".repeat(60)}
27
27
  `),o>0?(this.log("\u{1F527} Next Steps:"),this.log(" 1. Review the failures above"),this.log(" 2. Fix ARIA attributes and keyboard handlers"),this.log(` 3. Re-run tests to verify fixes
28
28
  `)):!this.isPlaywright&&this.skipped>0&&this.log(`\u2728 Optional: Run Playwright tests for complete validation
29
29
  `),{passes:a,failures:o,skipped:this.skipped,duration:t}}error(e,t){this.log(`
30
- \u274C Error: ${e}`),t&&this.log(` Context: ${t}`),this.log("");}};});var pt={};z(pt,{RelativeTargetResolver:()=>O});var O,me=E(()=>{O=class{static async resolve(e,t,r){let i=await e.locator(t).all();if(typeof r=="number")return i[r-1];switch(r){case "first":return i[0];case "second":return i[1];case "last":return i[i.length-1];case "next":{let a=(await e.evaluate(([o])=>Array.from(document.querySelectorAll(o)).indexOf(document.activeElement),[t])+1)%i.length;return i[a]}case "previous":{let a=(await e.evaluate(([o])=>Array.from(document.querySelectorAll(o)).indexOf(document.activeElement),[t])-1+i.length)%i.length;return i[a]}default:return null}}};});var ne,ft=E(()=>{me();ne=class{constructor(e,t,r=400){this.page=e;this.selectors=t;this.timeoutMs=r;}isBrowserClosedError(e){return e instanceof Error&&e.message.includes("Target page, context or browser has been closed")}async focus(e,t,r){try{if(e==="virtual"&&r){let n=this.selectors.main;if(!n)return {success:!1,error:"Main selector not defined for virtual focus."};let a=this.page.locator(n).first();return await a.count()?(await a.evaluate((f,$)=>{f.setAttribute("aria-activedescendant",$);},r),{success:!0}):{success:!1,error:"Main element not found for virtual focus."}}if(e==="relative"&&t){let n=this.selectors.relative;if(!n)return {success:!1,error:"Relative selector not defined for focus action."};let a=await O.resolve(this.page,n,t);return a?(await a.focus({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${t} for focus.`}}let i=this.selectors[e];return i?(await this.page.locator(i).first().focus({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for focus target ${e} not found.`}}catch(i){return this.isBrowserClosedError(i)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to focus ${e}: ${i instanceof Error?i.message:String(i)}`}}}async type(e,t){try{let r=this.selectors[e];return r?(await this.page.locator(r).first().fill(t,{timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for type target ${e} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to type into ${e}: ${r instanceof Error?r.message:String(r)}`}}}async click(e,t){try{if(e==="document")return await this.page.mouse.click(10,10),{success:!0};if(e==="relative"&&t){let i=this.selectors.relative;if(!i)return {success:!1,error:"Relative selector not defined for click action."};let n=await O.resolve(this.page,i,t);return n?(await n.click({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${t} for click.`}}let r=this.selectors[e];return r?(await this.page.locator(r).first().click({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for action target ${e} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to click ${e}: ${r instanceof Error?r.message:String(r)}`}}}async keypress(e,t,r){try{let n={Space:"Space",Enter:"Enter",Escape:"Escape","Arrow Up":"ArrowUp","Arrow Down":"ArrowDown","Arrow Left":"ArrowLeft","Arrow Right":"ArrowRight",Home:"Home",End:"End",Tab:"Tab"}[t]||t;if(n==="Space"?n=" ":n.includes(" ")&&(n=n.replace(/ /g,"")),e==="relative"){if(r==null)return {success:!1,error:"relativeTarget must be provided for relative keypress."};let $=this.selectors.relative;if(!$)return {success:!1,error:"Relative selector not defined for keypress action."};let y=await O.resolve(this.page,$,r);return y?(await y.press(n,{timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${r} for keypress.`}}let a=this.selectors[e];if(!a)return {success:!1,error:`Selector for keypress target ${e} not found.`};let o=this.page.locator(a).first();return await o.count()===0?{success:!1,error:`${e} element not found.`,shouldBreak:!0}:(await o.press(n,{timeout:this.timeoutMs}),{success:!0})}catch(i){return this.isBrowserClosedError(i)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to press ${t} on ${e}: ${i instanceof Error?i.message:String(i)}`}}}async hover(e,t){try{if(e==="relative"&&t){let i=this.selectors.relative;if(!i)return {success:!1,error:"Relative selector not defined for hover action."};let n=await O.resolve(this.page,i,t);return n?(await n.hover({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${t} for hover.`}}let r=this.selectors[e];return r?(await this.page.locator(r).first().hover({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for hover target ${e} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to hover ${e}: ${r instanceof Error?r.message:String(r)}`}}}};});var le,gt=E(()=>{me();le=class{constructor(e,t,r=400){this.page=e;this.selectors=t;this.timeoutMs=r;}async resolveTarget(e,t,r){try{if(e==="relative"){let n=r?this.selectors[r]:this.selectors.relative;if(!n)return {target:null,error:"Relative selector is not defined in the contract."};if(!t)return {target:null,error:"Relative target or expected value is not defined."};let a=await O.resolve(this.page,n,t);return a?{target:a}:{target:null,error:`Target ${e} not found.`}}let i=this.selectors[e];return i?{target:this.page.locator(i).first()}:{target:null,error:`Selector for assertion target ${e} not found.`}}catch(i){return {target:null,error:`Failed to resolve target ${e}: ${i instanceof Error?i.message:String(i)}`}}}async validateVisibility(e,t,r,i,n){try{return r?(await test.expect(e).toBeVisible({timeout:this.timeoutMs}),{success:!0,passMessage:`${t} is visible as expected. Test: "${n}".`}):(await test.expect(e).toBeHidden({timeout:this.timeoutMs}),{success:!0,passMessage:`${t} is not visible as expected. Test: "${n}".`})}catch{let a=this.selectors[t]||"",o=await this.page.evaluate(f=>{let $=f?document.querySelector(f):null;if(!$)return "element not found";let y=window.getComputedStyle($);return `display:${y.display}, visibility:${y.visibility}, opacity:${y.opacity}`},a);return r?{success:false,failMessage:`${i} (actual: ${o})`}:{success:false,failMessage:`${i} ${t} is still visible (actual: ${o}).`}}}async validateAttribute(e,t,r,i,n,a){if(i==="!empty"){let $=await e.getAttribute(r);return $&&$.trim()!==""?{success:true,passMessage:`${t} has non-empty "${r}". Test: "${a}".`}:{success:false,failMessage:`${n} ${t} "${r}" should not be empty, found "${$}".`}}if(typeof i!="string")throw console.error("[AssertionRunner] expectedValue is not a string:",i),new Error(`AssertionRunner: expectedValue for attribute assertion must be a string, but got: ${JSON.stringify(i)}`);let o=i.split(" | ").map($=>$.trim()),f=await e.getAttribute(r);return f!==null&&o.includes(f)?{success:true,passMessage:`${t} has expected "${r}". Test: "${a}".`}:{success:false,failMessage:`${n} ${t} "${r}" should be "${i}", found "${f}".`}}async validateValue(e,t,r,i,n){let a=await e.inputValue().catch(()=>"");return r==="!empty"?a&&a.trim()!==""?{success:true,passMessage:`${t} has non-empty value. Test: "${n}".`}:{success:false,failMessage:`${i} ${t} value should not be empty, found "${a}".`}:r===""?a===""?{success:true,passMessage:`${t} has empty value. Test: "${n}".`}:{success:false,failMessage:`${i} ${t} value should be empty, found "${a}".`}:a===r?{success:true,passMessage:`${t} has expected value. Test: "${n}".`}:{success:false,failMessage:`${i} ${t} value should be "${r}", found "${a}".`}}async validateFocus(e,t,r,i,n){try{return r?(await test.expect(e).toBeFocused({timeout:this.timeoutMs}),{success:!0,passMessage:`${t} has focus as expected. Test: "${n}".`}):(await test.expect(e).not.toBeFocused({timeout:this.timeoutMs}),{success:!0,passMessage:`${t} does not have focus as expected. Test: "${n}".`})}catch{let a=await this.page.evaluate(()=>{let o=document.activeElement;return o?`${o.tagName}#${o.id||"no-id"}.${o.className||"no-class"}`:"no element focused"});return {success:false,failMessage:`${i} (actual focus: ${a})`}}}async validateRole(e,t,r,i,n){let a=await e.getAttribute("role");return a===r?{success:true,passMessage:`${t} has role "${r}". Test: "${n}".`}:{success:false,failMessage:`${i} Expected role "${r}", found "${a}".`}}async validate(e,t){if(this.page.isClosed())return {success:false,failMessage:"CRITICAL: Browser/page closed before completing all tests. Increase test timeout or reduce test complexity."};let r=null,i;if(e.controlledBy){let n=e.controlledBy,a=this.selectors[n.target];if(!a)return {success:false,failMessage:`Selector for controlledBy.target '${n.target}' not found.`,target:null};let o=null;if(n.relativeTarget?o=await O.resolve(this.page,a,n.relativeTarget):o=this.page.locator(a).first(),!o)return {success:false,failMessage:"Controlling element for controlledBy not found.",target:null};let f=n.attribute||"aria-controls",$=await o.getAttribute(f);if(!$)return {success:false,failMessage:`Controlling element does not have attribute '${f}'.`,target:null};if(r=this.page.locator(`#${$}`),!r||await r.count()===0)return {success:false,failMessage:`Controlled element with id '${$}' not found.`,target:null}}else {let n=await this.resolveTarget(e.target,e.relativeTarget||e.expectedValue,e.selectorKey);if(r=n.target,i=n.error,i||!r)return {success:false,failMessage:i||`Target ${e.target} not found.`,target:null}}if(e.target==="input"&&e.attribute==="aria-activedescendant"&&e.expectedValue==="!empty"&&e.relativeTarget&&e.selectorKey){let n=await O.resolve(this.page,this.selectors[e.selectorKey],e.relativeTarget),a=n?await n.getAttribute("id"):null,o=await r.getAttribute("aria-activedescendant");return a&&o===a?{success:true,passMessage:`input[aria-activedescendant] matches id of ${e.relativeTarget}(${e.selectorKey}). Test: "${t}".`}:{success:false,failMessage:`input[aria-activedescendant] should match id of ${e.relativeTarget}(${e.selectorKey}), found "${o}".`}}switch(e.assertion){case "toBeVisible":return this.validateVisibility(r,e.target,true,e.failureMessage||"",t);case "notToBeVisible":return this.validateVisibility(r,e.target,false,e.failureMessage||"",t);case "toHaveAttribute":return e.attribute&&e.expectedValue!==void 0?this.validateAttribute(r,e.target,e.attribute,e.expectedValue,e.failureMessage||"",t):{success:false,failMessage:"Missing attribute or expectedValue for toHaveAttribute assertion"};case "toHaveValue":return e.expectedValue!==void 0?this.validateValue(r,e.target,e.expectedValue,e.failureMessage||"",t):{success:false,failMessage:"Missing expectedValue for toHaveValue assertion"};case "toHaveFocus":return this.validateFocus(r,e.target,true,e.failureMessage||"",t);case "notToHaveFocus":return this.validateFocus(r,e.target,false,e.failureMessage||"",t);case "toHaveRole":return e.expectedValue!==void 0?this.validateRole(r,e.target,e.expectedValue,e.failureMessage||"",t):{success:false,failMessage:"Missing expectedValue for toHaveRole assertion"};default:return {success:false,failMessage:`Unknown assertion type: ${e.assertion}`}}}};});var dt={};z(dt,{runContractTestsPlaywright:()=>Vt});async function Vt(c,e,t,r,i){let n=r?.test?.components?.find(h=>h.name===c),a=!!n?.contractPath,o=new de(true,a),f={actionTimeoutMs:400,assertionTimeoutMs:400,navigationTimeoutMs:3e4,componentReadyTimeoutMs:5e3},$=r?.test?.disableTimeouts===true,P=n?.disableTimeouts===true||$,B=(h,_,J)=>{if(P)return 0;let D=h??_;return typeof D!="number"||!Number.isFinite(D)||D<0?J:D},G=B(n?.actionTimeoutMs,r?.test?.actionTimeoutMs,f.actionTimeoutMs),ee=B(n?.assertionTimeoutMs,r?.test?.assertionTimeoutMs,f.assertionTimeoutMs),ue=B(n?.navigationTimeoutMs,r?.test?.navigationTimeoutMs,f.navigationTimeoutMs),ye=B(n?.componentReadyTimeoutMs,r?.test?.componentReadyTimeoutMs,f.componentReadyTimeoutMs),Ve=ce(t),te=n?.contractPath;if(!te)throw new Error(`Contract path not found for component: ${c}`);let wt=(()=>{if(Pe__default.default.isAbsolute(te))return te;if(i){let _=Pe__default.default.resolve(i,te);try{return fs.readFileSync(_,"utf-8"),_}catch{}}let h=Pe__default.default.resolve(process.cwd(),te);try{return fs.readFileSync(h,"utf-8"),h}catch{return new URL(te,(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).pathname}})(),bt=fs.readFileSync(wt,"utf-8"),C=JSON.parse(bt),Tt=(C.relationships?.length||0)+(C.static.length||0)+C.dynamic.length,St=C.meta?.source?.apg,H=[],N=[],Y=[],I=[],T=null,M=(h,_)=>{let J=Z(_),D=_e(J,Ve);if(D==="error")return H.push(h),{status:"fail",level:J,detail:h};if(D==="warning")return N.push(h),{status:"warn",level:J,detail:h};let K=`${h} (ignored by strictness=${Ve}, level=${J})`;return I.push(K),{status:"skip",level:J,detail:K}};try{if(T=await Oe(),e){try{await T.goto(e,{waitUntil:"domcontentloaded",timeout:ue});}catch(s){throw new Error(`Failed to navigate to ${e}. Ensure dev server is running and accessible. Original error: ${s instanceof Error?s.message:String(s)}`)}await T.addStyleTag({content:"* { transition: none !important; animation: none !important; }"});}let h=await ge.detect(c,n,G,ee,i);if(!h)throw new Error(`Unsupported component: ${c}`);let _=h.getMainSelector();if(!_)throw new Error(`CRITICAL: No selector found in contract for ${c}`);try{await T.locator(_).first().waitFor({state:"attached",timeout:ye});}catch(s){throw new Error(`
30
+ \u274C Error: ${e}`),t&&this.log(` Context: ${t}`),this.log("");}};});var mt={};q(mt,{RelativeTargetResolver:()=>D});var D,de=x(()=>{D=class{static async resolve(e,t,r){let i=await e.locator(t).all();if(typeof r=="number")return i[r-1];switch(r){case "first":return i[0];case "second":return i[1];case "last":return i[i.length-1];case "next":{let a=(await e.evaluate(([o])=>Array.from(document.querySelectorAll(o)).indexOf(document.activeElement),[t])+1)%i.length;return i[a]}case "previous":{let a=(await e.evaluate(([o])=>Array.from(document.querySelectorAll(o)).indexOf(document.activeElement),[t])-1+i.length)%i.length;return i[a]}default:return null}}};});var ne,ht=x(()=>{de();ne=class{constructor(e,t,r=400){this.page=e;this.selectors=t;this.timeoutMs=r;}isBrowserClosedError(e){return e instanceof Error&&e.message.includes("Target page, context or browser has been closed")}async focus(e,t,r){try{if(e==="virtual"&&r){let n=this.selectors.main;if(!n)return {success:!1,error:"Main selector not defined for virtual focus."};let a=this.page.locator(n).first();return await a.count()?(await a.evaluate((p,$)=>{p.setAttribute("aria-activedescendant",$);},r),{success:!0}):{success:!1,error:"Main element not found for virtual focus."}}if(e==="relative"&&t){let n=this.selectors.relative;if(!n)return {success:!1,error:"Relative selector not defined for focus action."};let a=await D.resolve(this.page,n,t);return a?(await a.focus({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${t} for focus.`}}let i=this.selectors[e];return i?(await this.page.locator(i).first().focus({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for focus target ${e} not found.`}}catch(i){return this.isBrowserClosedError(i)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to focus ${e}: ${i instanceof Error?i.message:String(i)}`}}}async type(e,t){try{let r=this.selectors[e];return r?(await this.page.locator(r).first().fill(t,{timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for type target ${e} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to type into ${e}: ${r instanceof Error?r.message:String(r)}`}}}async click(e,t){try{if(e==="document")return await this.page.mouse.click(10,10),{success:!0};if(e==="relative"&&t){let i=this.selectors.relative;if(!i)return {success:!1,error:"Relative selector not defined for click action."};let n=await D.resolve(this.page,i,t);return n?(await n.click({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${t} for click.`}}let r=this.selectors[e];return r?(await this.page.locator(r).first().click({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for action target ${e} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to click ${e}: ${r instanceof Error?r.message:String(r)}`}}}async keypress(e,t,r){try{let n={Space:"Space",Enter:"Enter",Escape:"Escape","Arrow Up":"ArrowUp","Arrow Down":"ArrowDown","Arrow Left":"ArrowLeft","Arrow Right":"ArrowRight",Home:"Home",End:"End",Tab:"Tab"}[t]||t;if(n==="Space"?n=" ":n.includes(" ")&&(n=n.replace(/ /g,"")),e==="relative"){if(r==null)return {success:!1,error:"relativeTarget must be provided for relative keypress."};let $=this.selectors.relative;if(!$)return {success:!1,error:"Relative selector not defined for keypress action."};let v=await D.resolve(this.page,$,r);return v?(await v.press(n,{timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${r} for keypress.`}}let a=this.selectors[e];if(!a)return {success:!1,error:`Selector for keypress target ${e} not found.`};let o=this.page.locator(a).first();return await o.count()===0?{success:!1,error:`${e} element not found.`,shouldBreak:!0}:(await o.press(n,{timeout:this.timeoutMs}),{success:!0})}catch(i){return this.isBrowserClosedError(i)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to press ${t} on ${e}: ${i instanceof Error?i.message:String(i)}`}}}async hover(e,t){try{if(e==="relative"&&t){let i=this.selectors.relative;if(!i)return {success:!1,error:"Relative selector not defined for hover action."};let n=await D.resolve(this.page,i,t);return n?(await n.hover({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${t} for hover.`}}let r=this.selectors[e];return r?(await this.page.locator(r).first().hover({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for hover target ${e} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:false,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:true}:{success:false,error:`Failed to hover ${e}: ${r instanceof Error?r.message:String(r)}`}}}};});var ce,yt=x(()=>{de();ce=class{constructor(e,t,r=400){this.page=e;this.selectors=t;this.timeoutMs=r;}async resolveTarget(e,t,r){try{if(e==="relative"){let n=r?this.selectors[r]:this.selectors.relative;if(!n)return {target:null,error:"Relative selector is not defined in the contract."};if(!t)return {target:null,error:"Relative target or expected value is not defined."};let a=await D.resolve(this.page,n,t);return a?{target:a}:{target:null,error:`Target ${e} not found.`}}let i=this.selectors[e];return i?{target:this.page.locator(i).first()}:{target:null,error:`Selector for assertion target ${e} not found.`}}catch(i){return {target:null,error:`Failed to resolve target ${e}: ${i instanceof Error?i.message:String(i)}`}}}async validateVisibility(e,t,r,i,n){try{return r?(await test.expect(e).toBeVisible({timeout:this.timeoutMs}),{success:!0,passMessage:`${t} is visible as expected. Test: "${n}".`}):(await test.expect(e).toBeHidden({timeout:this.timeoutMs}),{success:!0,passMessage:`${t} is not visible as expected. Test: "${n}".`})}catch{let a=this.selectors[t]||"",o=await this.page.evaluate(p=>{let $=p?document.querySelector(p):null;if(!$)return "element not found";let v=window.getComputedStyle($);return `display:${v.display}, visibility:${v.visibility}, opacity:${v.opacity}`},a);return r?{success:false,failMessage:`${i} (actual: ${o})`}:{success:false,failMessage:`${i} ${t} is still visible (actual: ${o}).`}}}async validateAttribute(e,t,r,i,n,a){if(i==="!empty"){let $=await e.getAttribute(r);return $&&$.trim()!==""?{success:true,passMessage:`${t} has non-empty "${r}". Test: "${a}".`}:{success:false,failMessage:`${n} ${t} "${r}" should not be empty, found "${$}".`}}if(typeof i!="string")throw console.error("[AssertionRunner] expectedValue is not a string:",i),new Error(`AssertionRunner: expectedValue for attribute assertion must be a string, but got: ${JSON.stringify(i)}`);let o=i.split(" | ").map($=>$.trim()),p=await e.getAttribute(r);return p!==null&&o.includes(p)?{success:true,passMessage:`${t} has expected "${r}". Test: "${a}".`}:{success:false,failMessage:`${n} ${t} "${r}" should be "${i}", found "${p}".`}}async validateValue(e,t,r,i,n){let a=await e.inputValue().catch(()=>"");return r==="!empty"?a&&a.trim()!==""?{success:true,passMessage:`${t} has non-empty value. Test: "${n}".`}:{success:false,failMessage:`${i} ${t} value should not be empty, found "${a}".`}:r===""?a===""?{success:true,passMessage:`${t} has empty value. Test: "${n}".`}:{success:false,failMessage:`${i} ${t} value should be empty, found "${a}".`}:a===r?{success:true,passMessage:`${t} has expected value. Test: "${n}".`}:{success:false,failMessage:`${i} ${t} value should be "${r}", found "${a}".`}}async validateFocus(e,t,r,i,n){try{return r?(await test.expect(e).toBeFocused({timeout:this.timeoutMs}),{success:!0,passMessage:`${t} has focus as expected. Test: "${n}".`}):(await test.expect(e).not.toBeFocused({timeout:this.timeoutMs}),{success:!0,passMessage:`${t} does not have focus as expected. Test: "${n}".`})}catch{let a=await this.page.evaluate(()=>{let o=document.activeElement;return o?`${o.tagName}#${o.id||"no-id"}.${o.className||"no-class"}`:"no element focused"});return {success:false,failMessage:`${i} (actual focus: ${a})`}}}async validateRole(e,t,r,i,n){let a=await e.getAttribute("role");return a===r?{success:true,passMessage:`${t} has role "${r}". Test: "${n}".`}:{success:false,failMessage:`${i} Expected role "${r}", found "${a}".`}}async validate(e,t){if(this.page.isClosed())return {success:false,failMessage:"CRITICAL: Browser/page closed before completing all tests. Increase test timeout or reduce test complexity."};let r=null,i;if(e.controlledBy){let n=e.controlledBy,a=this.selectors[n.target];if(!a)return {success:false,failMessage:`Selector for controlledBy.target '${n.target}' not found.`,target:null};let o=null;if(n.relativeTarget?o=await D.resolve(this.page,a,n.relativeTarget):o=this.page.locator(a).first(),!o)return {success:false,failMessage:"Controlling element for controlledBy not found.",target:null};let p=n.attribute||"aria-controls",$=await o.getAttribute(p);if(!$)return {success:false,failMessage:`Controlling element does not have attribute '${p}'.`,target:null};if(r=this.page.locator(`#${$}`),!r||await r.count()===0)return {success:false,failMessage:`Controlled element with id '${$}' not found.`,target:null}}else {let n=await this.resolveTarget(e.target,e.relativeTarget||e.expectedValue,e.selectorKey);if(r=n.target,i=n.error,i||!r)return {success:false,failMessage:i||`Target ${e.target} not found.`,target:null}}if(e.target==="input"&&e.attribute==="aria-activedescendant"&&e.expectedValue==="!empty"&&e.relativeTarget&&e.selectorKey){let n=await D.resolve(this.page,this.selectors[e.selectorKey],e.relativeTarget),a=n?await n.getAttribute("id"):null,o=await r.getAttribute("aria-activedescendant");return a&&o===a?{success:true,passMessage:`input[aria-activedescendant] matches id of ${e.relativeTarget}(${e.selectorKey}). Test: "${t}".`}:{success:false,failMessage:`input[aria-activedescendant] should match id of ${e.relativeTarget}(${e.selectorKey}), found "${o}".`}}switch(e.assertion){case "toBeVisible":return this.validateVisibility(r,e.target,true,e.failureMessage||"",t);case "notToBeVisible":return this.validateVisibility(r,e.target,false,e.failureMessage||"",t);case "toHaveAttribute":return e.attribute&&e.expectedValue!==void 0?this.validateAttribute(r,e.target,e.attribute,e.expectedValue,e.failureMessage||"",t):{success:false,failMessage:"Missing attribute or expectedValue for toHaveAttribute assertion"};case "toHaveValue":return e.expectedValue!==void 0?this.validateValue(r,e.target,e.expectedValue,e.failureMessage||"",t):{success:false,failMessage:"Missing expectedValue for toHaveValue assertion"};case "toHaveFocus":return this.validateFocus(r,e.target,true,e.failureMessage||"",t);case "notToHaveFocus":return this.validateFocus(r,e.target,false,e.failureMessage||"",t);case "toHaveRole":return e.expectedValue!==void 0?this.validateRole(r,e.target,e.expectedValue,e.failureMessage||"",t):{success:false,failMessage:"Missing expectedValue for toHaveRole assertion"};default:return {success:false,failMessage:`Unknown assertion type: ${e.assertion}`}}}};});var vt={};q(vt,{runContractTestsPlaywright:()=>qt});async function qt(c,e,t,r,i){let n=r?.test?.components?.find(m=>m.name===c),a=!!n?.contractPath,o=new ge(true,a),p={actionTimeoutMs:400,assertionTimeoutMs:400,navigationTimeoutMs:3e4,componentReadyTimeoutMs:5e3},$=r?.test?.disableTimeouts===true,E=n?.disableTimeouts===true||$,P=(m,_,J)=>{if(E)return 0;let j=m??_;return typeof j!="number"||!Number.isFinite(j)||j<0?J:j},z=P(n?.actionTimeoutMs,r?.test?.actionTimeoutMs,p.actionTimeoutMs),Z=P(n?.assertionTimeoutMs,r?.test?.assertionTimeoutMs,p.assertionTimeoutMs),le=P(n?.navigationTimeoutMs,r?.test?.navigationTimeoutMs,p.navigationTimeoutMs),he=P(n?.componentReadyTimeoutMs,r?.test?.componentReadyTimeoutMs,p.componentReadyTimeoutMs),Ue=ae(t),ee=n?.contractPath;if(!ee)throw new Error(`Contract path not found for component: ${c}`);let $t=(()=>{if(Be__default.default.isAbsolute(ee))return ee;if(i){let _=Be__default.default.resolve(i,ee);try{return fs.readFileSync(_,"utf-8"),_}catch{}}let m=Be__default.default.resolve(process.cwd(),ee);try{return fs.readFileSync(m,"utf-8"),m}catch{return new URL(ee,(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))).pathname}})(),Ct=fs.readFileSync($t,"utf-8"),C=JSON.parse(Ct),kt=(C.relationships?.length||0)+(C.static.length||0)+C.dynamic.length,At=C.meta?.source?.apg,W=[],Y=[],Q=[],B=[],T=null,I=(m,_)=>{let J=ie(_),j=Ke(J,Ue);if(j==="error")return W.push(m),{status:"fail",level:J,detail:m};if(j==="warning")return Y.push(m),{status:"warn",level:J,detail:m};let K=`${m} (ignored by strictness=${Ue}, level=${J})`;return B.push(K),{status:"skip",level:J,detail:K}},Rt=m=>m&&typeof m=="object"&&m.success===true;try{if(T=await _e(),e){try{await T.goto(e,{waitUntil:"domcontentloaded",timeout:le});}catch(s){throw new Error(`Failed to navigate to ${e}. Ensure dev server is running and accessible. Original error: ${s instanceof Error?s.message:String(s)}`)}await T.addStyleTag({content:"* { transition: none !important; animation: none !important; }"});}let m=await fe.detect(c,n,z,Z,i);if(!m)throw new Error(`Unsupported component: ${c}`);let _=m.getMainSelector();if(!_)throw new Error(`CRITICAL: No selector found in contract for ${c}`);try{await T.locator(_).first().waitFor({state:"attached",timeout:he});}catch(s){throw new Error(`
31
31
  \u274C CRITICAL: Component not found on page!
32
32
  This usually means:
33
33
  - The component didn't render
34
34
  - The URL is incorrect
35
35
  - The component selector '${_}' in the contract is wrong
36
- - Original error: ${s}`)}o.start(c,Tt,St),c==="menu"&&C.selectors.main&&await T.locator(C.selectors.main).first().waitFor({state:"visible",timeout:ye}).catch(()=>{});let J=c==="menu"&&C.selectors.submenuTrigger?await T.locator(C.selectors.submenuTrigger).count()>0:!1,D=s=>s.type==="aria-reference"&&[s.from,s.to].some(g=>["submenu","submenuTrigger","submenuItems"].includes(g||""))||s.type==="contains"&&[s.parent,s.child].some(g=>["submenu","submenuTrigger","submenuItems"].includes(g||"")),K=0,F=0,V=0;for(let s of C.relationships||[]){if(h&&typeof h.resetState=="function")try{await h.resetState(T);}catch(m){N.push(`Warning: resetState failed before relationship test: ${m instanceof Error?m.message:String(m)}`);}let g=Z(s.level);if(Array.isArray(s.setup)&&s.setup.length>0){let S=function(p){return v.includes(p)};var Ue=S;let m=new ne(T,C.selectors,G),R=s.type==="aria-reference"?`${s.from}.${s.attribute} references ${s.to}`:`${s.parent} contains ${s.child}`,v=["focus","type","click","keypress","hover"],w=p=>({...p,type:S(p.type)?p.type:"click"}),k=s.setup.map(w),x=await ve(k,m,h,T,R,["submenu","submenuTrigger","submenuItems"]);if(x.skip){I.push(x.message||"Setup action skipped"),o.reportStaticTest(R,"skip",x.message,g);continue}if(!x.success){let p=`Relationship setup failed: ${x.error}`,u=M(p,s.level);u.status==="fail"&&(F+=1),u.status==="warn"&&(V+=1),o.reportStaticTest(R,u.status,u.detail,u.level);continue}}if(c==="menu"&&!J&&D(s)){let R=s.type==="aria-reference"?`${s.from}.${s.attribute} references ${s.to}`:`${s.parent} contains ${s.child}`,v="Skipping submenu relationship assertion: no submenu capability detected in rendered component.";I.push(v),o.reportStaticTest(R,"skip",v,g);continue}if(s.type==="aria-reference"){let m=`${s.from}.${s.attribute} references ${s.to}`,R=C.selectors[s.from],v=C.selectors[s.to];if(!R||!v){let d=M(`Relationship selector missing: from="${s.from}" or to="${s.to}" not found in selectors.`,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(m,d.status,d.detail,d.level);continue}let S=T.locator(R).first(),w=T.locator(v).first(),k=await S.count()>0,x=await w.count()>0;if(!k||!x){if(c==="menu"&&D(s)){let U="Skipping submenu relationship assertion in static phase: submenu elements are not present until submenu is opened.";I.push(U),o.reportStaticTest(m,"skip",U,g);continue}let d=M(`Relationship target not found: ${k?s.to:s.from}.`,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(m,d.status,d.detail,d.level);continue}let p=await S.getAttribute(s.attribute),u=await w.getAttribute("id");if(!u){let d=M(`Relationship target "${s.to}" must have an id for ${s.attribute} validation.`,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(m,d.status,d.detail,d.level);continue}if(!(p||"").split(/\s+/).filter(Boolean).includes(u)){let d=M(`Expected ${s.from} ${s.attribute} to reference id "${u}", found "${p||""}".`,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(m,d.status,d.detail,d.level);continue}Y.push(`Relationship valid: ${s.from}.${s.attribute} -> ${s.to} (id=${u}).`),K+=1,o.reportStaticTest(m,"pass",void 0,g);continue}if(s.type==="contains"){let m=`${s.parent} contains ${s.child}`,R=C.selectors[s.parent],v=C.selectors[s.child];if(!R||!v){let p=M(`Relationship selector missing: parent="${s.parent}" or child="${s.child}" not found in selectors.`,s.level);p.status==="fail"&&(F+=1),p.status==="warn"&&(V+=1),o.reportStaticTest(m,p.status,p.detail,p.level);continue}let S=T.locator(R).first();if(!(await S.count()>0)){if(c==="menu"&&D(s)){let u="Skipping submenu relationship assertion in static phase: submenu container is not present until submenu is opened.";I.push(u),o.reportStaticTest(m,"skip",u,g);continue}let p=M(`Relationship parent target not found: ${s.parent}.`,s.level);p.status==="fail"&&(F+=1),p.status==="warn"&&(V+=1),o.reportStaticTest(m,p.status,p.detail,p.level);continue}if(await S.locator(v).count()<1){if(c==="menu"&&D(s)){let u="Skipping submenu relationship assertion in static phase: submenu descendants are not present until submenu is opened.";I.push(u),o.reportStaticTest(m,"skip",u,g);continue}let p=M(`Expected ${s.parent} to contain descendant matching selector for ${s.child}.`,s.level);p.status==="fail"&&(F+=1),p.status==="warn"&&(V+=1),o.reportStaticTest(m,p.status,p.detail,p.level);continue}Y.push(`Relationship valid: ${s.parent} contains ${s.child}.`),K+=1,o.reportStaticTest(m,"pass",void 0,g);}}async function je(s,g,m,R={}){if(!s||typeof s!="object"||!("ref"in s))return s;let v;if(s.ref==="relative"){if(!s.relativeTarget||!R.relativeBaseSelector)return;let S=m.locator(R.relativeBaseSelector),w=await S.count(),k=0;if(s.relativeTarget==="first"?k=0:s.relativeTarget==="second"?k=1:s.relativeTarget==="last"?k=w-1:isNaN(Number(s.relativeTarget))?k=0:k=Number(s.relativeTarget),k<0||k>=w)return;let x=S.nth(k);return await He(x,s.property||s.attribute)}else {if(v=g[s.ref],!v)throw new Error(`Selector for ref '${s.ref}' not found in contract selectors.`);let S=m.locator(v).first();return await He(S,s.property||s.attribute)}}async function He(s,g){if(s)return !g||g==="id"?await s.getAttribute("id")??void 0:g==="class"?await s.getAttribute("class")??void 0:g==="textContent"?await s.evaluate(m=>m.textContent??void 0):g.startsWith("aria-")?await s.getAttribute(g)??void 0:g.endsWith("*")?await s.evaluate(R=>{let v=[];for(let S of Array.from(R.attributes))S.name.startsWith("aria-")&&v.push(`${S.name}=${S.value}`);return v.join(";")}):await s.getAttribute(g)??void 0}let $t=new le(T,C.selectors,ee);async function ve(s,g,m,R,v,S=[]){if(!Array.isArray(s)||s.length===0)return {success:!0};m&&typeof m.resetState=="function"&&await m.resetState(R);for(let w of s){let k={success:!0};try{if(w.type==="focus")w.target==="relative"&&w.relativeTarget?k=await g.focus("relative",w.relativeTarget):k=await g.focus(w.target);else if(w.type==="type"&&w.value)k=await g.type(w.target,w.value);else if(w.type==="click")k=await g.click(w.target,w.relativeTarget);else if(w.type==="keypress"&&w.key)k=await g.keypress(w.target,w.key,w.relativeTarget);else if(w.type==="hover")k=await g.hover(w.target,w.relativeTarget);else continue}catch(x){k={success:!1,error:x instanceof Error?x.message:String(x)};}if(!k.success){let x=k.error||"Setup action failed";return S.some(u=>v.includes(u)||x.includes(u))?{success:!1,skip:!0,message:`Skipping test - capability not present: ${x}`}:{success:!1,error:x}}}return {success:!0}}for(let s of C.static||[]){if(h&&typeof h.resetState=="function")try{await h.resetState(T);}catch(p){N.push(`Warning: resetState failed before static test: ${p instanceof Error?p.message:String(p)}`);}if(s.target==="relative")continue;let g=`${s.target}${s.attribute?` (${s.attribute})`:""}`,m=Z(s.level);if(c==="menu"&&s.target==="submenuTrigger"&&!J){let p=`Skipping submenu static assertion for ${s.target}: no submenu capability detected in rendered component.`;I.push(p),o.reportStaticTest(g,"skip",p,m);continue}let R=[];if(s.target||R.push("target"),s.attribute||R.push("attribute"),typeof s.expectedValue>"u"&&R.push("expectedValue"),R.length>0){let p=`${s.target||""}${s.attribute?` (${s.attribute})`:""}`,u=`Static assertion missing required field(s): ${R.join(", ")}`,b=M(u,s.level);b.status==="fail"&&(F+=1),b.status==="warn"&&(V+=1),o.reportStaticTest(p,b.status,b.detail,b.level);continue}if(Array.isArray(s.setup)&&s.setup.length>0){let b=function(l){return u.includes(l)};var Ue=b;let p=new ne(T,C.selectors,G),u=["focus","type","click","keypress","hover"],W=l=>({...l,type:b(l.type)?l.type:"click"}),d=s.setup.map(W),U=await ve(d,p,h,T,g,["submenu","submenuTrigger","submenuItems"]);if(U.skip){I.push(U.message||"Setup action skipped"),o.reportStaticTest(g,"skip",U.message,m);continue}if(!U.success){let l=`Static setup failed: ${U.error}`,A=M(l,s.level);A.status==="fail"&&(F+=1),A.status==="warn"&&(V+=1),o.reportStaticTest(g,A.status,A.detail,A.level);continue}}let v=C.selectors[s.target];if(!v){let p=`Selector for target ${s.target} not found.`,u=M(p,s.level);u.status==="fail"&&(F+=1),u.status==="warn"&&(V+=1),o.reportStaticTest(g,u.status,u.detail,u.level);continue}let S=T.locator(v).first();if(!(await S.count()>0)){let p=`Target ${s.target} not found.`,u=M(p,s.level);u.status==="fail"&&(F+=1),u.status==="warn"&&(V+=1),o.reportStaticTest(g,u.status,u.detail,u.level);continue}let k=(p,u,b)=>{let W=new RegExp(`\\[${u}(?:=["']?([^\\]"']+)["']?)?\\]`),d=p.match(W);if(!d)return !1;if(!b)return !0;let U=d[1];return U?b.split(" | ").includes(U):!1},x=s.expectedValue;if(s.expectedValue&&typeof s.expectedValue=="object"&&"ref"in s.expectedValue){let p={},u=s.relativeTarget;if(s.expectedValue.ref==="relative"&&s.target==="relative"&&u){let b=C.selectors[u];if(!b)throw new Error(`Selector for relativeTarget '${u}' not found in contract selectors.`);p.relativeBaseSelector=b;}else if(s.expectedValue.ref==="relative"&&u){let b=C.selectors[u];if(!b)throw new Error(`Selector for relativeTarget '${u}' not found in contract selectors.`);p.relativeBaseSelector=b;}x=await je(s.expectedValue,C.selectors,T,p);}if(s.expectedValue)if(k(v,s.attribute,typeof x=="string"?x:void 0))Y.push(`${s.attribute}="${x}" on ${s.target} verified by selector (already present in: ${v}).`),K+=1,o.reportStaticTest(g,"pass",void 0,m);else {let p=x??"",u=await $t.validateAttribute(S,s.target,s.attribute,p,s.failureMessage,"Static ARIA Test");if(u.success&&u.passMessage)Y.push(u.passMessage),K+=1,o.reportStaticTest(g,"pass",void 0,m);else if(!u.success&&u.failMessage){let b=M(u.failMessage,s.level);b.status==="fail"&&(F+=1),b.status==="warn"&&(V+=1),o.reportStaticTest(g,b.status,b.detail,b.level);}}else {let p=s.attribute.split(" | "),u=!1,b=!0;for(let W of p){let d=W.trim();if(k(v,d)){Y.push(`${d} on ${s.target} verified by selector (already present in: ${v}).`),u=!0;continue}if(b=!1,await S.getAttribute(d)!==null){u=!0;break}}if(!u&&!b){let W=s.failureMessage+` None of the attributes "${s.attribute}" are present.`,d=M(W,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(g,d.status,d.detail,d.level);}else !b&&u?(Y.push(`At least one of the attributes "${s.attribute}" exists on the element.`),K+=1,o.reportStaticTest(g,"pass",void 0,m)):(K+=1,o.reportStaticTest(g,"pass",void 0,m));}}for(let s of C.dynamic||[]){if(!s.assertions||s.assertions.length===0){let l="Skipping test - no assertions found for this dynamic test.";I.push(l),o.reportTest({description:s.description,level:Z(s.level)},"skip",l);continue}if(!T||T.isClosed()){console.warn(`
36
+ - Original error: ${s}`)}o.start(c,kt,At),c==="menu"&&C.selectors.main&&await T.locator(C.selectors.main).first().waitFor({state:"visible",timeout:he}).catch(()=>{});let J=c==="menu"&&C.selectors.submenuTrigger?await T.locator(C.selectors.submenuTrigger).count()>0:!1,j=s=>s.type==="aria-reference"&&[s.from,s.to].some(f=>["submenu","submenuTrigger","submenuItems"].includes(f||""))||s.type==="contains"&&[s.parent,s.child].some(f=>["submenu","submenuTrigger","submenuItems"].includes(f||"")),K=0,F=0,V=0;for(let s of C.relationships||[]){if(m&&typeof m.resetState=="function")try{await m.resetState(T);}catch(h){Y.push(`Warning: resetState failed before relationship test: ${h instanceof Error?h.message:String(h)}`);}let f=ie(s.level);if(Array.isArray(s.setup)&&s.setup.length>0){let S=function(u){return y.includes(u)};var je=S;let h=new ne(T,C.selectors,z),A=s.type==="aria-reference"?`${s.from}.${s.attribute} references ${s.to}`:`${s.parent} contains ${s.child}`,y=["focus","type","click","keypress","hover"],w=u=>({...u,type:S(u.type)?u.type:"click"}),k=s.setup.map(w),R=await ye(k,h,m,T,A,["submenu","submenuTrigger","submenuItems"]);if(R.skip){B.push(R.message||"Setup action skipped"),o.reportStaticTest(A,"skip",R.message,f);continue}if(!R.success){let u=`Relationship setup failed: ${R.error}`,l=I(u,s.level);l.status==="fail"&&(F+=1),l.status==="warn"&&(V+=1),o.reportStaticTest(A,l.status,l.detail,l.level);continue}}if(c==="menu"&&!J&&j(s)){let A=s.type==="aria-reference"?`${s.from}.${s.attribute} references ${s.to}`:`${s.parent} contains ${s.child}`,y="Skipping submenu relationship assertion: no submenu capability detected in rendered component.";B.push(y),o.reportStaticTest(A,"skip",y,f);continue}if(s.type==="aria-reference"){let h=`${s.from}.${s.attribute} references ${s.to}`,A=C.selectors[s.from],y=C.selectors[s.to];if(!A||!y){let d=I(`Relationship selector missing: from="${s.from}" or to="${s.to}" not found in selectors.`,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(h,d.status,d.detail,d.level);continue}let S=T.locator(A).first(),w=T.locator(y).first(),k=await S.count()>0,R=await w.count()>0;if(!k||!R){if(c==="menu"&&j(s)){let U="Skipping submenu relationship assertion in static phase: submenu elements are not present until submenu is opened.";B.push(U),o.reportStaticTest(h,"skip",U,f);continue}let d=I(`Relationship target not found: ${k?s.to:s.from}.`,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(h,d.status,d.detail,d.level);continue}let u=await S.getAttribute(s.attribute),l=await w.getAttribute("id");if(!l){let d=I(`Relationship target "${s.to}" must have an id for ${s.attribute} validation.`,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(h,d.status,d.detail,d.level);continue}if(!(u||"").split(/\s+/).filter(Boolean).includes(l)){let d=I(`Expected ${s.from} ${s.attribute} to reference id "${l}", found "${u||""}".`,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(h,d.status,d.detail,d.level);continue}Q.push(`Relationship valid: ${s.from}.${s.attribute} -> ${s.to} (id=${l}).`),K+=1,o.reportStaticTest(h,"pass",void 0,f);continue}if(s.type==="contains"){let h=`${s.parent} contains ${s.child}`,A=C.selectors[s.parent],y=C.selectors[s.child];if(!A||!y){let u=I(`Relationship selector missing: parent="${s.parent}" or child="${s.child}" not found in selectors.`,s.level);u.status==="fail"&&(F+=1),u.status==="warn"&&(V+=1),o.reportStaticTest(h,u.status,u.detail,u.level);continue}let S=T.locator(A).first();if(!(await S.count()>0)){if(c==="menu"&&j(s)){let l="Skipping submenu relationship assertion in static phase: submenu container is not present until submenu is opened.";B.push(l),o.reportStaticTest(h,"skip",l,f);continue}let u=I(`Relationship parent target not found: ${s.parent}.`,s.level);u.status==="fail"&&(F+=1),u.status==="warn"&&(V+=1),o.reportStaticTest(h,u.status,u.detail,u.level);continue}if(await S.locator(y).count()<1){if(c==="menu"&&j(s)){let l="Skipping submenu relationship assertion in static phase: submenu descendants are not present until submenu is opened.";B.push(l),o.reportStaticTest(h,"skip",l,f);continue}let u=I(`Expected ${s.parent} to contain descendant matching selector for ${s.child}.`,s.level);u.status==="fail"&&(F+=1),u.status==="warn"&&(V+=1),o.reportStaticTest(h,u.status,u.detail,u.level);continue}Q.push(`Relationship valid: ${s.parent} contains ${s.child}.`),K+=1,o.reportStaticTest(h,"pass",void 0,f);}}async function He(s,f,h,A={}){if(!s||typeof s!="object"||!("ref"in s))return s;let y;if(s.ref==="relative"){if(!s.relativeTarget||!A.relativeBaseSelector)return;let S=h.locator(A.relativeBaseSelector),w=await S.count(),k=0;if(s.relativeTarget==="first"?k=0:s.relativeTarget==="second"?k=1:s.relativeTarget==="last"?k=w-1:isNaN(Number(s.relativeTarget))?k=0:k=Number(s.relativeTarget),k<0||k>=w)return;let R=S.nth(k);return await De(R,s.property||s.attribute)}else {if(y=f[s.ref],!y)throw new Error(`Selector for ref '${s.ref}' not found in contract selectors.`);let S=h.locator(y).first();return await De(S,s.property||s.attribute)}}async function De(s,f){if(s)return !f||f==="id"?await s.getAttribute("id")??void 0:f==="class"?await s.getAttribute("class")??void 0:f==="textContent"?await s.evaluate(h=>h.textContent??void 0):f.startsWith("aria-")?await s.getAttribute(f)??void 0:f.endsWith("*")?await s.evaluate(A=>{let y=[];for(let S of Array.from(A.attributes))S.name.startsWith("aria-")&&y.push(`${S.name}=${S.value}`);return y.join(";")}):await s.getAttribute(f)??void 0}let Mt=new ce(T,C.selectors,Z);async function ye(s,f,h,A,y,S=[]){if(!Array.isArray(s)||s.length===0)return {success:!0};h&&typeof h.resetState=="function"&&await h.resetState(A);for(let w of s){let k={success:!0};try{if(w.type==="focus")w.target==="relative"&&w.relativeTarget?k=await f.focus("relative",w.relativeTarget):k=await f.focus(w.target);else if(w.type==="type"&&w.value)k=await f.type(w.target,w.value);else if(w.type==="click")k=await f.click(w.target,w.relativeTarget);else if(w.type==="keypress"&&w.key)k=await f.keypress(w.target,w.key,w.relativeTarget);else if(w.type==="hover")k=await f.hover(w.target,w.relativeTarget);else continue}catch(R){k={success:!1,error:R instanceof Error?R.message:String(R)};}if(!k.success){let R=k.error||"Setup action failed";return S.some(l=>y.includes(l)||R.includes(l))?{success:!1,skip:!0,message:`Skipping test - capability not present: ${R}`}:{success:!1,error:R}}}return {success:!0}}for(let s of C.static||[]){if(m&&typeof m.resetState=="function")try{await m.resetState(T);}catch(u){Y.push(`Warning: resetState failed before static test: ${u instanceof Error?u.message:String(u)}`);}if(s.target==="relative")continue;let f=`${s.target}${s.attribute?` (${s.attribute})`:""}`,h=ie(s.level);if(c==="menu"&&s.target==="submenuTrigger"&&!J){let u=`Skipping submenu static assertion for ${s.target}: no submenu capability detected in rendered component.`;B.push(u),o.reportStaticTest(f,"skip",u,h);continue}let A=[];if(s.target||A.push("target"),s.attribute||A.push("attribute"),typeof s.expectedValue>"u"&&A.push("expectedValue"),A.length>0){let u=`${s.target||""}${s.attribute?` (${s.attribute})`:""}`,l=`Static assertion missing required field(s): ${A.join(", ")}`,b=I(l,s.level);b.status==="fail"&&(F+=1),b.status==="warn"&&(V+=1),o.reportStaticTest(u,b.status,b.detail,b.level);continue}if(Array.isArray(s.setup)&&s.setup.length>0){let b=function(G){return l.includes(G)};var je=b;let u=new ne(T,C.selectors,z),l=["focus","type","click","keypress","hover"],H=G=>({...G,type:b(G.type)?G.type:"click"}),d=s.setup.map(H),U=await ye(d,u,m,T,f,["submenu","submenuTrigger","submenuItems"]);if(U.skip){B.push(U.message||"Setup action skipped"),o.reportStaticTest(f,"skip",U.message,h);continue}if(!U.success){let G=`Static setup failed: ${U.error}`,X=I(G,s.level);X.status==="fail"&&(F+=1),X.status==="warn"&&(V+=1),o.reportStaticTest(f,X.status,X.detail,X.level);continue}}let y=C.selectors[s.target];if(!y){let u=`Selector for target ${s.target} not found.`,l=I(u,s.level);l.status==="fail"&&(F+=1),l.status==="warn"&&(V+=1),o.reportStaticTest(f,l.status,l.detail,l.level);continue}let S=T.locator(y).first();if(!(await S.count()>0)){let u=`Target ${s.target} not found.`,l=I(u,s.level);l.status==="fail"&&(F+=1),l.status==="warn"&&(V+=1),o.reportStaticTest(f,l.status,l.detail,l.level);continue}let k=(u,l,b)=>{let H=new RegExp(`\\[${l}(?:=["']?([^\\]"']+)["']?)?\\]`),d=u.match(H);if(!d)return !1;if(!b)return !0;let U=d[1];return U?b.split(" | ").includes(U):!1},R=s.expectedValue;if(s.expectedValue&&typeof s.expectedValue=="object"&&"ref"in s.expectedValue){let u={},l=s.relativeTarget;if(s.expectedValue.ref==="relative"&&s.target==="relative"&&l){let b=C.selectors[l];if(!b)throw new Error(`Selector for relativeTarget '${l}' not found in contract selectors.`);u.relativeBaseSelector=b;}else if(s.expectedValue.ref==="relative"&&l){let b=C.selectors[l];if(!b)throw new Error(`Selector for relativeTarget '${l}' not found in contract selectors.`);u.relativeBaseSelector=b;}R=await He(s.expectedValue,C.selectors,T,u);}if(s.expectedValue)if(k(y,s.attribute,typeof R=="string"?R:void 0))Q.push(`${s.attribute}="${R}" on ${s.target} verified by selector (already present in: ${y}).`),K+=1,o.reportStaticTest(f,"pass",void 0,h);else {let u=R??"",l=await Mt.validateAttribute(S,s.target,s.attribute,u,s.failureMessage,"Static ARIA Test");if(l.success&&l.passMessage)Q.push(l.passMessage),K+=1,o.reportStaticTest(f,"pass",void 0,h);else if(!l.success&&l.failMessage){let b=I(l.failMessage,s.level);b.status==="fail"&&(F+=1),b.status==="warn"&&(V+=1),o.reportStaticTest(f,b.status,b.detail,b.level);}}else {let u=s.attribute.split(" | "),l=!1,b=!0;for(let H of u){let d=H.trim();if(k(y,d)){Q.push(`${d} on ${s.target} verified by selector (already present in: ${y}).`),l=!0;continue}if(b=!1,await S.getAttribute(d)!==null){l=!0;break}}if(!l&&!b){let H=s.failureMessage+` None of the attributes "${s.attribute}" are present.`,d=I(H,s.level);d.status==="fail"&&(F+=1),d.status==="warn"&&(V+=1),o.reportStaticTest(f,d.status,d.detail,d.level);}else !b&&l?(Q.push(`At least one of the attributes "${s.attribute}" exists on the element.`),K+=1,o.reportStaticTest(f,"pass",void 0,h)):(K+=1,o.reportStaticTest(f,"pass",void 0,h));}}for(let s of C.dynamic||[]){if(!s.assertions||s.assertions.length===0){let g="Skipping test - no assertions found for this dynamic test.";B.push(g),o.reportTest({description:s.description,level:ie(s.level)},"skip",g);continue}if(!T||T.isClosed()){console.warn(`
37
37
  \u26A0\uFE0F Browser closed - skipping remaining ${C.dynamic.length-C.dynamic.indexOf(s)} tests
38
- `),H.push(`CRITICAL: Browser/page closed before completing all tests. ${C.dynamic.length-C.dynamic.indexOf(s)} tests skipped.`);break}try{await h.resetState(T);}catch(l){let A=l instanceof Error?l.message:String(l);throw o.error(A),l}let{setup:g=[],action:m,assertions:R}=s,v=Z(s.level),S=new ne(T,C.selectors,G);if(Array.isArray(g)&&g.length>0){let A=function(j){return l.includes(j)};var Ue=A;let l=["focus","type","click","keypress","hover"],se=j=>({...j,type:A(j.type)?j.type:"click"}),we=g.map(se),q=await ve(we,S,h,T,s.description,["submenu","submenuTrigger","submenuItems"]);if(q.skip){I.push(q.message||"Setup action skipped"),o.reportTest({description:s.description,level:v},"skip",q.message);continue}if(!q.success){let j=M(`Setup failed: ${q.error}`,s.level);o.reportTest({description:s.description,level:v},j.status,j.detail);continue}}let w=H.length,k=N.length,x=I.length;if(await h.shouldSkipTest(s,T)){let l="Skipping test - component-specific conditions not met";I.push(l),o.reportTest({description:s.description,level:v},"skip",l);continue}let u=new le(T,C.selectors,ee),b=!1,W=null;for(let l of m){if(!T||T.isClosed()){H.push("CRITICAL: Browser/page closed during test execution. Remaining actions skipped."),b=!0;break}let A;if(l.type==="focus")l.target==="relative"&&l.relativeTarget?A=await S.focus("relative",l.relativeTarget):A=await S.focus(l.target);else if(l.type==="type"&&l.value)A=await S.type(l.target,l.value);else if(l.type==="click")A=await S.click(l.target,l.relativeTarget);else if(l.type==="keypress"&&l.key)A=await S.keypress(l.target,l.key,l.relativeTarget);else if(l.type==="hover")A=await S.hover(l.target,l.relativeTarget);else continue;if(!A.success){if(A.error){let se=M(A.error,s.level);W={status:se.status,detail:se.detail};}b=!0;break}}if(b){o.reportTest({description:s.description,level:v},W?.status||"fail",W?.detail||H[H.length-1]);continue}for(let l of R){let A;if(l.expectedValue&&typeof l.expectedValue=="object"&&"ref"in l.expectedValue)if(l.expectedValue.ref==="relative"){let{RelativeTargetResolver:Q}=await Promise.resolve().then(()=>(me(),pt)),j=C.selectors.relative;if(!j)throw new Error("Relative selector not defined in contract selectors.");let ae=l.relativeTarget||"first",X=await Q.resolve(T,j,ae);if(!X)throw new Error(`Could not resolve relative target '${ae}' for expectedValue.`);let We=l.expectedValue.property||l.expectedValue.attribute||"id";if(We==="textContent")A=await X.evaluate(pe=>pe.textContent??void 0);else {let pe=await X.getAttribute(We);A=pe===null?void 0:pe;}}else A=await je(l.expectedValue,C.selectors,T,{});else typeof l.expectedValue=="string"||typeof l.expectedValue>"u"?A=l.expectedValue:A="";let se={...l,expectedValue:A},we=A??"",q=await u.validate({...se,expectedValue:we},s.description);if(q.success&&q.passMessage)Y.push(q.passMessage);else if(!q.success&&q.failMessage){let Q=[];if(l.target||Q.push("target"),l.assertion||Q.push("assertion"),["toHaveAttribute","toHaveValue","toHaveRole"].includes(l.assertion)&&(typeof l.attribute>"u"&&l.assertion==="toHaveAttribute"&&Q.push("attribute"),typeof l.expectedValue>"u"&&Q.push("expectedValue")),Q.length>0){let j=Z(l.level||s.level),ae=`Dynamic assertion missing required field(s): ${Q.join(", ")}`,X=M(ae,j);if(X.status==="skip")continue;H.push(ae),o.reportTest({description:s.description,level:j},X.status,X.detail);continue}}}let d=H.length,U=N.length,De=I.length;d>w?o.reportTest({description:s.description,level:v},"fail",H[H.length-1]):U>k?o.reportTest({description:s.description,level:v},"warn",N[N.length-1]):De>x?o.reportTest({description:s.description,level:v},"skip",I[I.length-1]):o.reportTest({description:s.description,level:v},"pass");}o.reportStatic(K,F,V),o.summary(H);}catch(h){if(h instanceof Error)throw h.message.includes("Executable doesn't exist")||h.message.includes("browserType.launch")?new Error(`
38
+ `),W.push(`CRITICAL: Browser/page closed before completing all tests. ${C.dynamic.length-C.dynamic.indexOf(s)} tests skipped.`);break}try{await m.resetState(T);}catch(g){let M=g instanceof Error?g.message:String(g);throw o.error(M),g}let{setup:f=[],action:h,assertions:A}=s,y=ie(s.level),S=new ne(T,C.selectors,z);if(Array.isArray(f)&&f.length>0){let M=function(O){return g.includes(O)};var je=M;let g=["focus","type","click","keypress","hover"],te=O=>({...O,type:M(O.type)?O.type:"click"}),ve=f.map(te),N=await ye(ve,S,m,T,s.description,["submenu","submenuTrigger","submenuItems"]);if(N.skip){B.push(N.message||"Setup action skipped"),o.reportTest({description:s.description,level:y},"skip",N.message);continue}if(!N.success){let O=I(`Setup failed: ${N.error}`,s.level);o.reportTest({description:s.description,level:y},O.status,O.detail);continue}}let w=W.length,k=Y.length,R=B.length;if(await m.shouldSkipTest(s,T)){let g="Skipping test - component-specific conditions not met";B.push(g),o.reportTest({description:s.description,level:y},"skip",g);continue}let l=new ce(T,C.selectors,Z),b=!1,H=null;for(let g of h){if(!T||T.isClosed()){W.push("CRITICAL: Browser/page closed during test execution. Remaining actions skipped."),b=!0;break}let M;if(g.type==="focus")g.target==="relative"&&g.relativeTarget?M=await S.focus("relative",g.relativeTarget):M=await S.focus(g.target);else if(g.type==="type"&&g.value)M=await S.type(g.target,g.value);else if(g.type==="click")M=await S.click(g.target,g.relativeTarget);else if(g.type==="keypress"&&g.key)M=await S.keypress(g.target,g.key,g.relativeTarget);else if(g.type==="hover")M=await S.hover(g.target,g.relativeTarget);else continue;if(!M.success){if(M.error){let te=I(M.error,s.level);H={status:te.status,detail:te.detail};}b=!0;break}}if(b){o.reportTest({description:s.description,level:y},H?.status||"fail",H?.detail||W[W.length-1]);continue}let d=!1,U="";for(let g of A){let M;if(g.expectedValue&&typeof g.expectedValue=="object"&&"ref"in g.expectedValue)if(g.expectedValue.ref==="relative"){let{RelativeTargetResolver:xt}=await Promise.resolve().then(()=>(de(),mt)),O=C.selectors.relative;if(!O)throw new Error("Relative selector not defined in contract selectors.");let Oe=g.relativeTarget||"first",we=await xt.resolve(T,O,Oe);if(!we)throw new Error(`Could not resolve relative target '${Oe}' for expectedValue.`);let qe=g.expectedValue.property||g.expectedValue.attribute||"id";if(qe==="textContent")M=await we.evaluate(ue=>ue.textContent??void 0);else {let ue=await we.getAttribute(qe);M=ue===null?void 0:ue;}}else M=await He(g.expectedValue,C.selectors,T,{});else typeof g.expectedValue=="string"||typeof g.expectedValue>"u"?M=g.expectedValue:M="";let te={...g,expectedValue:M},ve=M??"",N=await l.validate({...te,expectedValue:ve},s.description);Rt(N)?Q.push(N.passMessage):(d=!0,U=N.failMessage||"Assertion failed.");}if(d){o.reportTest({description:s.description,level:y},"fail",U);continue}let We=W.length,G=Y.length,X=B.length;We>w?o.reportTest({description:s.description,level:y},"fail",W[W.length-1]):G>k?o.reportTest({description:s.description,level:y},"warn",Y[Y.length-1]):X>R?o.reportTest({description:s.description,level:y},"skip",B[B.length-1]):o.reportTest({description:s.description,level:y},"pass");}o.reportStatic(K,F,V),o.summary(W);}catch(m){if(m instanceof Error)throw m.message.includes("Executable doesn't exist")||m.message.includes("browserType.launch")?new Error(`
39
39
  \u274C CRITICAL: Playwright browsers not found!
40
- \u{1F4E6} Run: npx playwright install chromium`):h.message.includes("net::ERR_CONNECTION_REFUSED")||h.message.includes("NS_ERROR_CONNECTION_REFUSED")?new Error(`
40
+ \u{1F4E6} Run: npx playwright install chromium`):m.message.includes("net::ERR_CONNECTION_REFUSED")||m.message.includes("NS_ERROR_CONNECTION_REFUSED")?new Error(`
41
41
  \u274C CRITICAL: Cannot connect to dev server!
42
- Make sure your dev server is running at ${e}`):h.message.includes("Timeout")&&h.message.includes("waitFor")?new Error(`
42
+ Make sure your dev server is running at ${e}`):m.message.includes("Timeout")&&m.message.includes("waitFor")?new Error(`
43
43
  \u274C CRITICAL: Component not found on page!
44
- The component selector could not be found within ${ye}ms.
44
+ The component selector could not be found within ${he}ms.
45
45
  This usually means:
46
46
  - The component didn't render
47
47
  - The URL is incorrect
48
48
  - The component selector was not provided to the component utility, or a wrong selector was used
49
- `):h.message.includes("Target page, context or browser has been closed")?new Error(`
49
+ `):m.message.includes("Target page, context or browser has been closed")?new Error(`
50
50
  \u274C CRITICAL: Browser/page was closed unexpectedly!
51
51
  This usually means:
52
52
  - The test timeout was too short
53
53
  - The browser crashed
54
- - An external process killed the browser`):h}finally{T&&await T.close();}return {passes:Y,failures:H,skipped:I,warnings:N}}var mt=E(()=>{be();lt();ut();ft();gt();Te();});var ht={};z(ht,{BADGE_CONFIGS:()=>Fe,displayAllBadges:()=>Ot,displayBadgeInfo:()=>Ht,getBadgeMarkdown:()=>oe,promptAddBadge:()=>Dt});function oe(c){let e=Fe[c];return `[![${e.label}](${e.markdownUrl})](https://github.com/aria-ease/aria-ease)`}function Ht(c){let e=oe(c);console.log(L__default.default.cyan(`
54
+ - An external process killed the browser`):m}finally{T&&await T.close();}return {passes:Q,failures:W,skipped:B,warnings:Y}}var wt=x(()=>{be();gt();dt();ht();yt();Te();});var bt={};q(bt,{BADGE_CONFIGS:()=>Ve,displayAllBadges:()=>Nt,displayBadgeInfo:()=>Kt,getBadgeMarkdown:()=>oe,promptAddBadge:()=>zt});function oe(c){let e=Ve[c];return `[![${e.label}](${e.markdownUrl})](https://github.com/aria-ease/aria-ease)`}function Kt(c){let e=oe(c);console.log(L__default.default.cyan(`
55
55
  \u{1F3C5} Show your accessibility commitment!`)),console.log(L__default.default.white(` Add this badge to your README.md:
56
56
  `)),console.log(L__default.default.green(" "+e)),console.log(L__default.default.dim(`
57
57
  This helps others discover accessibility tools and shows you care!
58
- `));}async function Dt(c,e=process.cwd()){let t=Pe__default.default.join(e,"README.md");if(!await Le__default.default.pathExists(t)){console.log(L__default.default.yellow(" \u2139\uFE0F No README.md found in current directory"));return}let i=await Le__default.default.readFile(t,"utf-8"),n=oe(c);if(i.includes(n)||i.includes(Fe[c].fileName)){console.log(L__default.default.gray(" \u2713 Badge already in README.md"));return}let a=jt__default.default.createInterface({input:process.stdin,output:process.stdout}),o=await new Promise(f=>{a.question(L__default.default.cyan(" Add badge to README.md now? (y/n): "),$=>{a.close(),f($.toLowerCase().trim());});});o==="y"||o==="yes"?(await Wt(t,i,n),console.log(L__default.default.green(" \u2713 Badge added to README.md!"))):console.log(L__default.default.gray(" Skipped. You can add it manually anytime."));}async function Wt(c,e,t){let r=e.split(`
59
- `),i=0;for(let n=0;n<r.length;n++){let a=r[n].trim();if(a.startsWith("[![")||a.startsWith("[!")){i=n+1;continue}if(i>0&&!a.startsWith("[![")&&!a.startsWith("[!")&&a.length>0)break;if(i===0&&a.startsWith("#")){i=n+2;break}}i===0&&(i=1),r.splice(i,0,t),await Le__default.default.writeFile(c,r.join(`
60
- `),"utf-8");}function Ot(){console.log(L__default.default.cyan(`
58
+ `));}async function zt(c,e=process.cwd()){let t=Be__default.default.join(e,"README.md");if(!await Fe__default.default.pathExists(t)){console.log(L__default.default.yellow(" \u2139\uFE0F No README.md found in current directory"));return}let i=await Fe__default.default.readFile(t,"utf-8"),n=oe(c);if(i.includes(n)||i.includes(Ve[c].fileName)){console.log(L__default.default.gray(" \u2713 Badge already in README.md"));return}let a=Jt__default.default.createInterface({input:process.stdin,output:process.stdout}),o=await new Promise(p=>{a.question(L__default.default.cyan(" Add badge to README.md now? (y/n): "),$=>{a.close(),p($.toLowerCase().trim());});});o==="y"||o==="yes"?(await Gt(t,i,n),console.log(L__default.default.green(" \u2713 Badge added to README.md!"))):console.log(L__default.default.gray(" Skipped. You can add it manually anytime."));}async function Gt(c,e,t){let r=e.split(`
59
+ `),i=0;for(let n=0;n<r.length;n++){let a=r[n].trim();if(a.startsWith("[![")||a.startsWith("[!")){i=n+1;continue}if(i>0&&!a.startsWith("[![")&&!a.startsWith("[!")&&a.length>0)break;if(i===0&&a.startsWith("#")){i=n+2;break}}i===0&&(i=1),r.splice(i,0,t),await Fe__default.default.writeFile(c,r.join(`
60
+ `),"utf-8");}function Nt(){console.log(L__default.default.cyan(`
61
61
  \u{1F4CD} Available badges:`)),console.log(L__default.default.white(`
62
62
  For audits:`)),console.log(L__default.default.green(" "+oe("audit"))),console.log(L__default.default.white(`
63
63
  For component testing:`)),console.log(L__default.default.green(" "+oe("component"))),console.log(L__default.default.white(`
64
- For both (verified):`)),console.log(L__default.default.green(" "+oe("verified"))),console.log("");}var Fe,yt=E(()=>{Fe={audit:{type:"audit",fileName:"audited-by-aria-ease.svg",label:"Audited by aria-ease",markdownUrl:"https://cdn.jsdelivr.net/gh/aria-ease/aria-ease@main/badges/audited-by-aria-ease.svg"},component:{type:"component",fileName:"components-tested-aria-ease.svg",label:"Components tested: aria-ease",markdownUrl:"https://cdn.jsdelivr.net/gh/aria-ease/aria-ease@main/badges/components-tested-aria-ease.svg"},verified:{type:"verified",fileName:"verified-by-aria-ease.svg",label:"Verified by aria-ease",markdownUrl:"https://cdn.jsdelivr.net/gh/aria-ease/aria-ease@main/badges/verified-by-aria-ease.svg"}};});be();Te();async function _t(c,e,t={}){if(!c||typeof c!="string")throw new Error("\u274C testUiComponent requires a valid componentName (string)");if(!e)throw new Error("\u274C testUiComponent requires a URL");if(e&&typeof e!="string")throw new Error("\u274C testUiComponent url parameter must be a string");let r={violations:[]};async function i(y){try{let P=await fetch(y,{method:"HEAD",signal:AbortSignal.timeout(1e3)});if(P.ok||P.status===304)return y}catch{return null}return null}let n=ce(t.strictness),a={},o=typeof process<"u"?process.cwd():"";if(typeof process<"u"&&typeof process.cwd=="function")try{let{loadConfig:y}=await Promise.resolve().then(()=>(Ge(),ze)),P=await y(process.cwd());if(a=P.config,P.configPath&&(o=Pe__default.default.dirname(P.configPath)),t.strictness===void 0){let B=a.test?.components?.find(G=>G?.name===c)?.strictness;n=ce(B??a.test?.strictness);}}catch{t.strictness===void 0&&(n="balanced");}let f;try{if(e){let y=await i(e);if(y){console.log(`\u{1F3AD} Running Playwright tests on ${y}`);let{runContractTestsPlaywright:P}=await Promise.resolve().then(()=>(mt(),dt));f=await P(c,y,n,a,o);}else throw new Error(`\u274C Dev server not running at ${e}
65
- Please start your dev server and try again.`)}else throw new Error("\u274C URL is required for component testing. Please provide a URL to run full accessibility tests with testUiComponent.")}catch(y){throw y instanceof Error?y:new Error(`\u274C Contract test execution failed: ${String(y)}`)}let $={violations:r.violations,raw:r,contract:f};if(f.failures.length>0&&e==="Playwright")throw new Error(`
66
- \u274C ${f.failures.length} accessibility contract test${f.failures.length>1?"s":""} failed (Playwright mode)
67
- \u2705 ${f.passes.length} test${f.passes.length>1?"s":""} passed
64
+ For both (verified):`)),console.log(L__default.default.green(" "+oe("verified"))),console.log("");}var Ve,Tt=x(()=>{Ve={audit:{type:"audit",fileName:"audited-by-aria-ease.svg",label:"Audited by aria-ease",markdownUrl:"https://cdn.jsdelivr.net/gh/aria-ease/aria-ease@main/badges/audited-by-aria-ease.svg"},component:{type:"component",fileName:"components-tested-aria-ease.svg",label:"Components tested: aria-ease",markdownUrl:"https://cdn.jsdelivr.net/gh/aria-ease/aria-ease@main/badges/components-tested-aria-ease.svg"},verified:{type:"verified",fileName:"verified-by-aria-ease.svg",label:"Verified by aria-ease",markdownUrl:"https://cdn.jsdelivr.net/gh/aria-ease/aria-ease@main/badges/verified-by-aria-ease.svg"}};});be();Te();async function Qt(c,e,t={}){if(!c||typeof c!="string")throw new Error("\u274C testUiComponent requires a valid componentName (string)");if(!e)throw new Error("\u274C testUiComponent requires a URL");if(e&&typeof e!="string")throw new Error("\u274C testUiComponent url parameter must be a string");let r={violations:[]};async function i(v){try{let E=await fetch(v,{method:"HEAD",signal:AbortSignal.timeout(1e3)});if(E.ok||E.status===304)return v}catch{return null}return null}let n=ae(t.strictness),a={},o=typeof process<"u"?process.cwd():"";if(typeof process<"u"&&typeof process.cwd=="function")try{let{loadConfig:v}=await Promise.resolve().then(()=>(Ye(),Ne)),E=await v(process.cwd());if(a=E.config,E.configPath&&(o=Be__default.default.dirname(E.configPath)),t.strictness===void 0){let P=a.test?.components?.find(z=>z?.name===c)?.strictness;n=ae(P??a.test?.strictness);}}catch{t.strictness===void 0&&(n="balanced");}let p;try{if(e){let v=await i(e);if(v){console.log(`\u{1F3AD} Running Playwright tests on ${v}`);let{runContractTestsPlaywright:E}=await Promise.resolve().then(()=>(wt(),vt));p=await E(c,v,n,a,o);}else throw new Error(`\u274C Dev server not running at ${e}
65
+ Please start your dev server and try again.`)}else throw new Error("\u274C URL is required for component testing. Please provide a URL to run full accessibility tests with testUiComponent.")}catch(v){throw v instanceof Error?v:new Error(`\u274C Contract test execution failed: ${String(v)}`)}let $={violations:r.violations,raw:r,contract:p};if(p.failures.length>0&&e==="Playwright")throw new Error(`
66
+ \u274C ${p.failures.length} accessibility contract test${p.failures.length>1?"s":""} failed (Playwright mode)
67
+ \u2705 ${p.passes.length} test${p.passes.length>1?"s":""} passed
68
68
 
69
69
  \u{1F4CB} Review the detailed test report above for specific failures.
70
- \u{1F4A1} Contract tests validate ARIA attributes and keyboard interactions per W3C APG guidelines.`);if(r.violations.length>0){let y=r.violations.length,P=r.violations.map(B=>`
71
- - ${B.id}: ${B.description}
72
- Impact: ${B.impact}
73
- Affected elements: ${B.nodes.length}
74
- Help: ${B.helpUrl}`).join(`
70
+ \u{1F4A1} Contract tests validate ARIA attributes and keyboard interactions per W3C APG guidelines.`);if(r.violations.length>0){let v=r.violations.length,E=r.violations.map(P=>`
71
+ - ${P.id}: ${P.description}
72
+ Impact: ${P.impact}
73
+ Affected elements: ${P.nodes.length}
74
+ Help: ${P.helpUrl}`).join(`
75
75
  `);throw new Error(`
76
- \u274C ${y} axe accessibility violation${y>1?"s":""} detected
77
- ${P}
76
+ \u274C ${v} axe accessibility violation${v>1?"s":""} detected
77
+ ${E}
78
78
 
79
79
  \u{1F4CB} Full details available in result.violations`)}return $}exports.runTest=async()=>({passes:[],failures:[],skipped:[]});typeof window>"u"&&(exports.runTest=async()=>{console.log(`\u{1F680} Running component accessibility tests...
80
- `);let{exec:c}=await import('child_process'),e=(await import('chalk')).default;return new Promise((t,r)=>{c("npx vitest --run --reporter verbose",async(i,n,a)=>{if(console.log(n),a&&console.error(a),!i||i.code===0){try{let{displayBadgeInfo:f,promptAddBadge:$}=await Promise.resolve().then(()=>(yt(),ht));f("component"),await $("component",process.cwd()),console.log(e.dim(`
80
+ `);let{exec:c}=await import('child_process'),e=(await import('chalk')).default;return new Promise((t,r)=>{c("npx vitest --run --reporter verbose",async(i,n,a)=>{if(console.log(n),a&&console.error(a),!i||i.code===0){try{let{displayBadgeInfo:p,promptAddBadge:$}=await Promise.resolve().then(()=>(Tt(),bt));p("component"),await $("component",process.cwd()),console.log(e.dim(`
81
81
  `+"\u2500".repeat(60))),console.log(e.cyan("\u{1F499} Found aria-ease helpful?")),console.log(e.white(" \u2022 Star us on GitHub: ")+e.blue.underline("https://github.com/aria-ease/aria-ease")),console.log(e.white(" \u2022 Share feedback: ")+e.blue.underline("https://github.com/aria-ease/aria-ease/discussions")),console.log(e.dim("\u2500".repeat(60)+`
82
- `));}catch(f){console.error("Warning: Could not display badge prompt:",f);}t({passes:[],failures:[],skipped:[]}),process.exit(0);}else {let f=i?.code||1;r(new Error(`Tests failed with code ${f}`)),process.exit(f);}});})});async function Jt(){await qe();}exports.cleanupTests=Jt;exports.testUiComponent=_t;
82
+ `));}catch(p){console.error("Warning: Could not display badge prompt:",p);}t({passes:[],failures:[],skipped:[]}),process.exit(0);}else {let p=i?.code||1;r(new Error(`Tests failed with code ${p}`)),process.exit(p);}});})});async function Xt(){await Je();}exports.cleanupTests=Xt;exports.testUiComponent=Qt;
@@ -3,10 +3,11 @@ interface JestAxeResult {
3
3
  raw: unknown;
4
4
  contract: unknown;
5
5
  }
6
+
6
7
  interface ContractTestResult {
7
- passes: string[];
8
- failures: string[];
9
- skipped: string[];
8
+ passes: string[];
9
+ failures: string[];
10
+ skipped: string[];
10
11
  warnings?: string[];
11
12
  }
12
13
 
@@ -3,10 +3,11 @@ interface JestAxeResult {
3
3
  raw: unknown;
4
4
  contract: unknown;
5
5
  }
6
+
6
7
  interface ContractTestResult {
7
- passes: string[];
8
- failures: string[];
9
- skipped: string[];
8
+ passes: string[];
9
+ failures: string[];
10
+ skipped: string[];
10
11
  warnings?: string[];
11
12
  }
12
13
 
@@ -1,4 +1,4 @@
1
- import {d,b}from'./chunk-APUMBDOT.js';import m from'path';async function y(a,e,c={}){if(!a||typeof a!="string")throw new Error("\u274C testUiComponent requires a valid componentName (string)");if(!e)throw new Error("\u274C testUiComponent requires a URL");if(e&&typeof e!="string")throw new Error("\u274C testUiComponent url parameter must be a string");let i={violations:[]};async function l(t){try{let n=await fetch(t,{method:"HEAD",signal:AbortSignal.timeout(1e3)});if(n.ok||n.status===304)return t}catch{return null}return null}let p=d(c.strictness),o={},d$1=typeof process<"u"?process.cwd():"";if(typeof process<"u"&&typeof process.cwd=="function")try{let{loadConfig:t}=await import('./configLoader-NCYRL2O6.js'),n=await t(process.cwd());if(o=n.config,n.configPath&&(d$1=m.dirname(n.configPath)),c.strictness===void 0){let r=o.test?.components?.find(h=>h?.name===a)?.strictness;p=d(r??o.test?.strictness);}}catch{c.strictness===void 0&&(p="balanced");}let s;try{if(e){let t=await l(e);if(t){console.log(`\u{1F3AD} Running Playwright tests on ${t}`);let{runContractTestsPlaywright:n}=await import('./contractTestRunnerPlaywright-FSZDW7IR.js');s=await n(a,t,p,o,d$1);}else throw new Error(`\u274C Dev server not running at ${e}
1
+ import {d,b}from'./chunk-APUMBDOT.js';import m from'path';async function y(a,e,c={}){if(!a||typeof a!="string")throw new Error("\u274C testUiComponent requires a valid componentName (string)");if(!e)throw new Error("\u274C testUiComponent requires a URL");if(e&&typeof e!="string")throw new Error("\u274C testUiComponent url parameter must be a string");let i={violations:[]};async function l(t){try{let n=await fetch(t,{method:"HEAD",signal:AbortSignal.timeout(1e3)});if(n.ok||n.status===304)return t}catch{return null}return null}let p=d(c.strictness),o={},d$1=typeof process<"u"?process.cwd():"";if(typeof process<"u"&&typeof process.cwd=="function")try{let{loadConfig:t}=await import('./configLoader-NCYRL2O6.js'),n=await t(process.cwd());if(o=n.config,n.configPath&&(d$1=m.dirname(n.configPath)),c.strictness===void 0){let r=o.test?.components?.find(h=>h?.name===a)?.strictness;p=d(r??o.test?.strictness);}}catch{c.strictness===void 0&&(p="balanced");}let s;try{if(e){let t=await l(e);if(t){console.log(`\u{1F3AD} Running Playwright tests on ${t}`);let{runContractTestsPlaywright:n}=await import('./contractTestRunnerPlaywright-7ERFIHCM.js');s=await n(a,t,p,o,d$1);}else throw new Error(`\u274C Dev server not running at ${e}
2
2
  Please start your dev server and try again.`)}else throw new Error("\u274C URL is required for component testing. Please provide a URL to run full accessibility tests with testUiComponent.")}catch(t){throw t instanceof Error?t:new Error(`\u274C Contract test execution failed: ${String(t)}`)}let u={violations:i.violations,raw:i,contract:s};if(s.failures.length>0&&e==="Playwright")throw new Error(`
3
3
  \u274C ${s.failures.length} accessibility contract test${s.failures.length>1?"s":""} failed (Playwright mode)
4
4
  \u2705 ${s.passes.length} test${s.passes.length>1?"s":""} passed
@@ -1,4 +1,4 @@
1
- import{b as g,d as f}from"./chunk-APUMBDOT.js";import"./chunk-CNU4N4AY.js";import m from"path";async function y(a,e,c={}){if(!a||typeof a!="string")throw new Error("\u274C testUiComponent requires a valid componentName (string)");if(!e)throw new Error("\u274C testUiComponent requires a URL");if(e&&typeof e!="string")throw new Error("\u274C testUiComponent url parameter must be a string");let i={violations:[]};async function l(t){try{let n=await fetch(t,{method:"HEAD",signal:AbortSignal.timeout(1e3)});if(n.ok||n.status===304)return t}catch{return null}return null}let p=f(c.strictness),o={},d=typeof process<"u"?process.cwd():"";if(typeof process<"u"&&typeof process.cwd=="function")try{let{loadConfig:t}=await import("./configLoader-ZXTSCIP6.js"),n=await t(process.cwd());if(o=n.config,n.configPath&&(d=m.dirname(n.configPath)),c.strictness===void 0){let r=o.test?.components?.find(h=>h?.name===a)?.strictness;p=f(r??o.test?.strictness)}}catch{c.strictness===void 0&&(p="balanced")}let s;try{if(e){let t=await l(e);if(t){console.log(`\u{1F3AD} Running Playwright tests on ${t}`);let{runContractTestsPlaywright:n}=await import("./contractTestRunnerPlaywright-VLOD5IB3.js");s=await n(a,t,p,o,d)}else throw new Error(`\u274C Dev server not running at ${e}
1
+ import{b as g,d as f}from"./chunk-APUMBDOT.js";import"./chunk-CNU4N4AY.js";import m from"path";async function y(a,e,c={}){if(!a||typeof a!="string")throw new Error("\u274C testUiComponent requires a valid componentName (string)");if(!e)throw new Error("\u274C testUiComponent requires a URL");if(e&&typeof e!="string")throw new Error("\u274C testUiComponent url parameter must be a string");let i={violations:[]};async function l(t){try{let n=await fetch(t,{method:"HEAD",signal:AbortSignal.timeout(1e3)});if(n.ok||n.status===304)return t}catch{return null}return null}let p=f(c.strictness),o={},d=typeof process<"u"?process.cwd():"";if(typeof process<"u"&&typeof process.cwd=="function")try{let{loadConfig:t}=await import("./configLoader-ZXTSCIP6.js"),n=await t(process.cwd());if(o=n.config,n.configPath&&(d=m.dirname(n.configPath)),c.strictness===void 0){let r=o.test?.components?.find(h=>h?.name===a)?.strictness;p=f(r??o.test?.strictness)}}catch{c.strictness===void 0&&(p="balanced")}let s;try{if(e){let t=await l(e);if(t){console.log(`\u{1F3AD} Running Playwright tests on ${t}`);let{runContractTestsPlaywright:n}=await import("./contractTestRunnerPlaywright-FECB4HSX.js");s=await n(a,t,p,o,d)}else throw new Error(`\u274C Dev server not running at ${e}
2
2
  Please start your dev server and try again.`)}else throw new Error("\u274C URL is required for component testing. Please provide a URL to run full accessibility tests with testUiComponent.")}catch(t){throw t instanceof Error?t:new Error(`\u274C Contract test execution failed: ${String(t)}`)}let u={violations:i.violations,raw:i,contract:s};if(s.failures.length>0&&e==="Playwright")throw new Error(`
3
3
  \u274C ${s.failures.length} accessibility contract test${s.failures.length>1?"s":""} failed (Playwright mode)
4
4
  \u2705 ${s.passes.length} test${s.passes.length>1?"s":""} passed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aria-ease",
3
- "version": "7.5.0",
3
+ "version": "7.8.1",
4
4
  "description": "Accessibility infrastructure for the entire frontend engineering lifecycle. Build accessible patterns, run automated audits, verify component interactions, and gate deployments — all in one system.",
5
5
  "main": "dist/index.cjs",
6
6
  "type": "module",
@@ -1,46 +0,0 @@
1
- import{a as j}from"./chunk-WIWSYIGK.js";import{a as Te,c as Q,d as Se,e as ke}from"./chunk-APUMBDOT.js";import{a as N}from"./chunk-SM6ZKEDR.js";import"./chunk-CNU4N4AY.js";import{readFileSync as de}from"fs";import he from"path";import{readFileSync as fe}from"fs";import ge from"path";import Ce from"path";import{pathToFileURL as Pe}from"url";var oe=class{builtInStrategies=new Map;constructor(){this.registerBuiltInStrategies()}registerBuiltInStrategies(){this.builtInStrategies.set("menu",()=>import("./MenuComponentStrategy-L3QXLC6S.js").then(t=>t.MenuComponentStrategy)),this.builtInStrategies.set("accordion",()=>import("./AccordionComponentStrategy-T5YODP3A.js").then(t=>t.AccordionComponentStrategy)),this.builtInStrategies.set("combobox",()=>import("./ComboboxComponentStrategy-DHZS4NW6.js").then(t=>t.ComboboxComponentStrategy)),this.builtInStrategies.set("tabs",()=>import("./TabsComponentStrategy-LKV6D2B7.js").then(t=>t.TabsComponentStrategy)),this.builtInStrategies.set("radio",()=>import("./RadioComponentStrategy-GKA5KOM5.js").then(t=>t.RadioComponentStrategy)),this.builtInStrategies.set("checkbox",()=>import("./CheckboxComponentStrategy-AZF2Y4MN.js").then(t=>t.CheckboxComponentStrategy))}async loadStrategy(t,s,r){try{if(s)try{let n=Ce.isAbsolute(s)?s:Ce.resolve(r||process.cwd(),s),u=await import(Pe(n).href),i=u.default||u;if(!i)throw new Error(`No default export found in ${s}`);return i}catch(n){throw new Error(`Failed to load custom strategy from ${s}: ${n instanceof Error?n.message:String(n)}`)}let o=this.builtInStrategies.get(t);return o?o():null}catch(o){throw new Error(`Strategy loading failed for ${t}: ${o instanceof Error?o.message:String(o)}`)}}has(t,s){return!!s||this.builtInStrategies.has(t)}};var ae=class{static strategyRegistry=new oe;static isComponentConfig(t){return typeof t=="object"&&t!==null}static async detect(t,s,r=400,o=400,n){let u=this.isComponentConfig(s)?s:void 0,i=u?.contractPath;if(!i)throw new Error(`Contract path not found for component: ${t}`);let R=(()=>{if(ge.isAbsolute(i))return i;if(n){let ie=ge.resolve(n,i);try{return fe(ie,"utf-8"),ie}catch{}}let X=ge.resolve(process.cwd(),i);try{return fe(X,"utf-8"),X}catch{return new URL(i,import.meta.url).pathname}})(),C=fe(R,"utf-8"),te=JSON.parse(C).selectors,_=await this.strategyRegistry.loadStrategy(t,u?.strategyPath,n);if(!_)return null;let z=te.main;return t==="tabs"?new _(z,te):new _(z,te,r,o)}};var ce=class{startTime=0;componentName="";staticPasses=0;staticFailures=0;staticWarnings=0;dynamicResults=[];totalTests=0;skipped=0;warnings=0;isPlaywright=!1;isCustomContract=!1;apgUrl="https://www.w3.org/WAI/ARIA/apg/";hasPrintedStaticSection=!1;hasPrintedDynamicSection=!1;constructor(t=!1,s=!1){this.isPlaywright=t,this.isCustomContract=s}log(t){process.stderr.write(t+`
2
- `)}start(t,s,r){this.startTime=Date.now(),this.componentName=t,this.totalTests=s,this.hasPrintedStaticSection=!1,this.hasPrintedDynamicSection=!1,r&&(this.apgUrl=r);let o="Playwright (Real Browser)";this.log(`
3
- ${"\u2550".repeat(60)}`),this.log(`\u{1F50D} Testing ${t.charAt(0).toUpperCase()+t.slice(1)} Component - ${o}`),this.log(`${"\u2550".repeat(60)}
4
- `)}reportStatic(t,s,r=0){this.staticPasses=t,this.staticFailures=s,this.staticWarnings=r}reportStaticTest(t,s,r,o){this.hasPrintedStaticSection||(this.log(`${"\u2500".repeat(60)}`),this.log("\u{1F9EA} Static Assertions"),this.log(`${"\u2500".repeat(60)}`),this.hasPrintedStaticSection=!0);let n=s==="pass"?"\u2713":s==="warn"?"\u26A0":s==="skip"?"\u25CB":"\u2717";this.log(` ${n} ${t}`),o&&this.log(` \u21B3 level=${o}`),(s==="fail"||s==="warn"||s==="skip")&&r&&this.log(` \u21B3 ${r}`)}reportTest(t,s,r){this.hasPrintedDynamicSection||(this.log(""),this.log(`${"\u2500".repeat(60)}`),this.log("\u2328\uFE0F Dynamic Interaction Tests"),this.log(`${"\u2500".repeat(60)}`),this.hasPrintedDynamicSection=!0);let o={description:t.description,status:s,failureMessage:r,level:t.level};s==="skip"&&(o.skipReason="Requires real browser (addEventListener events)"),this.dynamicResults.push(o);let n={pass:"\u2713",fail:"\u2717",warn:"\u26A0",skip:"\u25CB"},u=t.level?`[${t.level.toUpperCase()}] `:"";this.log(` ${n[s]} ${u}${t.description}`),s==="skip"&&!this.isPlaywright&&this.log(" \u21B3 Skipped (runs only in Playwright)"),s==="fail"&&r&&this.log(` \u21B3 ${r}`),s==="warn"&&r&&this.log(` \u21B3 ${r}`),s==="skip"&&r&&this.log(` \u21B3 ${r}`)}reportFailures(t){t.length!==0&&(this.log(`
5
- ${"\u2500".repeat(60)}`),this.log(`\u274C Failures (${t.length}):
6
- `),t.forEach((s,r)=>{this.log(`${r+1}. ${s}`),s.includes("aria-")?this.log(" \u{1F4A1} Add the missing ARIA attribute to improve screen reader support"):s.includes("focus")?this.log(" \u{1F4A1} Check keyboard event handlers and focus management"):s.includes("visible")&&this.log(" \u{1F4A1} Verify display/visibility styles and state management"),this.log("")}))}reportWarnings(){let t=this.dynamicResults.filter(s=>s.status==="warn");t.length===0&&this.staticWarnings===0||(this.log(`
7
- ${"\u2500".repeat(60)}`),this.log(`\u26A0\uFE0F Warnings (${this.staticWarnings+t.length}):
8
- `),this.log(`These checks are failing but treated as warnings under the active strictness mode.
9
- `),t.forEach((s,r)=>{this.log(`${r+1}. ${s.description}`),s.failureMessage&&this.log(` \u21B3 ${s.failureMessage}`),s.level&&this.log(` \u21B3 level=${s.level}`)}),this.apgUrl&&this.log(`
10
- Reference: ${this.apgUrl}
11
- `))}reportSkipped(){if(this.skipped===0||this.isPlaywright)return;let t=this.dynamicResults.filter(s=>s.status==="skip");this.log(`
12
- ${"\u2500".repeat(60)}`),this.log(`\u2139\uFE0F Skipped Tests (${this.skipped}):
13
- `),this.log("These tests use native keyboard events via addEventListener,"),this.log(`which only run in Playwright (real browser).
14
- `),t.forEach((s,r)=>{this.log(`${r+1}. ${s.description}`)}),this.log(`
15
- \u{1F4A1} Run with Playwright for full validation:`),this.log(` testUiComponent('${this.componentName}', null, 'http://localhost:5173/test-harness?component=component_name')
16
- `)}summary(t){let s=Date.now()-this.startTime,r=this.dynamicResults.filter(A=>A.status==="pass").length,o=this.dynamicResults.filter(A=>A.status==="fail").length,n=this.dynamicResults.filter(A=>A.status==="warn").length;this.skipped=this.dynamicResults.filter(A=>A.status==="skip").length,this.warnings=this.staticWarnings+n;let u=this.staticPasses+r,i=this.staticFailures+o,R=u+i+this.warnings,C=()=>{let A=`${this.componentName.charAt(0).toUpperCase()}${this.componentName.slice(1)}`;return this.isCustomContract?`${A} component validates against your custom accessibility policy \u2713`:`${A} component meets Aria-Ease baseline WAI-ARIA expectations \u2713`};return t.length>0&&this.reportFailures(t),this.reportWarnings(),this.reportSkipped(),this.log(`
17
- ${"\u2550".repeat(60)}`),this.log(`\u{1F4CA} Summary
18
- `),i===0&&this.skipped===0&&this.warnings===0?(this.log(`\u2705 All ${R} tests passed!`),this.log(` ${C()}`)):i===0?(this.log(`\u2705 ${u}/${R} tests passed`),this.skipped>0&&this.log(`\u25CB ${this.skipped} tests skipped`),this.warnings>0&&this.log(`\u26A0\uFE0F ${this.warnings} warning${this.warnings>1?"s":""}`),this.log(` ${C()}`)):(this.log(`\u274C ${i} test${i>1?"s":""} failed`),this.log(`\u2705 ${u} test${u>1?"s":""} passed`),this.warnings>0&&this.log(`\u26A0\uFE0F ${this.warnings} warning${this.warnings>1?"s":""}`),this.skipped>0&&this.log(`\u25CB ${this.skipped} test${this.skipped>1?"s":""} skipped`)),this.log(`\u23F1\uFE0F Duration: ${s}ms`),this.log(`${"\u2550".repeat(60)}
19
- `),i>0?(this.log("\u{1F527} Next Steps:"),this.log(" 1. Review the failures above"),this.log(" 2. Fix ARIA attributes and keyboard handlers"),this.log(` 3. Re-run tests to verify fixes
20
- `)):!this.isPlaywright&&this.skipped>0&&this.log(`\u2728 Optional: Run Playwright tests for complete validation
21
- `),{passes:u,failures:i,skipped:this.skipped,duration:s}}error(t,s){this.log(`
22
- \u274C Error: ${t}`),s&&this.log(` Context: ${s}`),this.log("")}};var ee=class{constructor(t,s,r=400){this.page=t;this.selectors=s;this.timeoutMs=r}isBrowserClosedError(t){return t instanceof Error&&t.message.includes("Target page, context or browser has been closed")}async focus(t,s,r){try{if(t==="virtual"&&r){let n=this.selectors.main;if(!n)return{success:!1,error:"Main selector not defined for virtual focus."};let u=this.page.locator(n).first();return await u.count()?(await u.evaluate((R,C)=>{R.setAttribute("aria-activedescendant",C)},r),{success:!0}):{success:!1,error:"Main element not found for virtual focus."}}if(t==="relative"&&s){let n=this.selectors.relative;if(!n)return{success:!1,error:"Relative selector not defined for focus action."};let u=await j.resolve(this.page,n,s);return u?(await u.focus({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${s} for focus.`}}let o=this.selectors[t];return o?(await this.page.locator(o).first().focus({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for focus target ${t} not found.`}}catch(o){return this.isBrowserClosedError(o)?{success:!1,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:!0}:{success:!1,error:`Failed to focus ${t}: ${o instanceof Error?o.message:String(o)}`}}}async type(t,s){try{let r=this.selectors[t];return r?(await this.page.locator(r).first().fill(s,{timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for type target ${t} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:!1,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:!0}:{success:!1,error:`Failed to type into ${t}: ${r instanceof Error?r.message:String(r)}`}}}async click(t,s){try{if(t==="document")return await this.page.mouse.click(10,10),{success:!0};if(t==="relative"&&s){let o=this.selectors.relative;if(!o)return{success:!1,error:"Relative selector not defined for click action."};let n=await j.resolve(this.page,o,s);return n?(await n.click({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${s} for click.`}}let r=this.selectors[t];return r?(await this.page.locator(r).first().click({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for action target ${t} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:!1,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:!0}:{success:!1,error:`Failed to click ${t}: ${r instanceof Error?r.message:String(r)}`}}}async keypress(t,s,r){try{let n={Space:"Space",Enter:"Enter",Escape:"Escape","Arrow Up":"ArrowUp","Arrow Down":"ArrowDown","Arrow Left":"ArrowLeft","Arrow Right":"ArrowRight",Home:"Home",End:"End",Tab:"Tab"}[s]||s;if(n==="Space"?n=" ":n.includes(" ")&&(n=n.replace(/ /g,"")),t==="relative"){if(r==null)return{success:!1,error:"relativeTarget must be provided for relative keypress."};let C=this.selectors.relative;if(!C)return{success:!1,error:"Relative selector not defined for keypress action."};let A=await j.resolve(this.page,C,r);return A?(await A.press(n,{timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${r} for keypress.`}}let u=this.selectors[t];if(!u)return{success:!1,error:`Selector for keypress target ${t} not found.`};let i=this.page.locator(u).first();return await i.count()===0?{success:!1,error:`${t} element not found.`,shouldBreak:!0}:(await i.press(n,{timeout:this.timeoutMs}),{success:!0})}catch(o){return this.isBrowserClosedError(o)?{success:!1,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:!0}:{success:!1,error:`Failed to press ${s} on ${t}: ${o instanceof Error?o.message:String(o)}`}}}async hover(t,s){try{if(t==="relative"&&s){let o=this.selectors.relative;if(!o)return{success:!1,error:"Relative selector not defined for hover action."};let n=await j.resolve(this.page,o,s);return n?(await n.hover({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Could not resolve relative target ${s} for hover.`}}let r=this.selectors[t];return r?(await this.page.locator(r).first().hover({timeout:this.timeoutMs}),{success:!0}):{success:!1,error:`Selector for hover target ${t} not found.`}}catch(r){return this.isBrowserClosedError(r)?{success:!1,error:"CRITICAL: Browser/page closed during test execution. Remaining actions skipped.",shouldBreak:!0}:{success:!1,error:`Failed to hover ${t}: ${r instanceof Error?r.message:String(r)}`}}}};var re=class{constructor(t,s,r=400){this.page=t;this.selectors=s;this.timeoutMs=r}async resolveTarget(t,s,r){try{if(t==="relative"){let n=r?this.selectors[r]:this.selectors.relative;if(!n)return{target:null,error:"Relative selector is not defined in the contract."};if(!s)return{target:null,error:"Relative target or expected value is not defined."};let u=await j.resolve(this.page,n,s);return u?{target:u}:{target:null,error:`Target ${t} not found.`}}let o=this.selectors[t];return o?{target:this.page.locator(o).first()}:{target:null,error:`Selector for assertion target ${t} not found.`}}catch(o){return{target:null,error:`Failed to resolve target ${t}: ${o instanceof Error?o.message:String(o)}`}}}async validateVisibility(t,s,r,o,n){try{return r?(await(0,N.expect)(t).toBeVisible({timeout:this.timeoutMs}),{success:!0,passMessage:`${s} is visible as expected. Test: "${n}".`}):(await(0,N.expect)(t).toBeHidden({timeout:this.timeoutMs}),{success:!0,passMessage:`${s} is not visible as expected. Test: "${n}".`})}catch{let u=this.selectors[s]||"",i=await this.page.evaluate(R=>{let C=R?document.querySelector(R):null;if(!C)return"element not found";let A=window.getComputedStyle(C);return`display:${A.display}, visibility:${A.visibility}, opacity:${A.opacity}`},u);return r?{success:!1,failMessage:`${o} (actual: ${i})`}:{success:!1,failMessage:`${o} ${s} is still visible (actual: ${i}).`}}}async validateAttribute(t,s,r,o,n,u){if(o==="!empty"){let C=await t.getAttribute(r);return C&&C.trim()!==""?{success:!0,passMessage:`${s} has non-empty "${r}". Test: "${u}".`}:{success:!1,failMessage:`${n} ${s} "${r}" should not be empty, found "${C}".`}}if(typeof o!="string")throw console.error("[AssertionRunner] expectedValue is not a string:",o),new Error(`AssertionRunner: expectedValue for attribute assertion must be a string, but got: ${JSON.stringify(o)}`);let i=o.split(" | ").map(C=>C.trim()),R=await t.getAttribute(r);return R!==null&&i.includes(R)?{success:!0,passMessage:`${s} has expected "${r}". Test: "${u}".`}:{success:!1,failMessage:`${n} ${s} "${r}" should be "${o}", found "${R}".`}}async validateValue(t,s,r,o,n){let u=await t.inputValue().catch(()=>"");return r==="!empty"?u&&u.trim()!==""?{success:!0,passMessage:`${s} has non-empty value. Test: "${n}".`}:{success:!1,failMessage:`${o} ${s} value should not be empty, found "${u}".`}:r===""?u===""?{success:!0,passMessage:`${s} has empty value. Test: "${n}".`}:{success:!1,failMessage:`${o} ${s} value should be empty, found "${u}".`}:u===r?{success:!0,passMessage:`${s} has expected value. Test: "${n}".`}:{success:!1,failMessage:`${o} ${s} value should be "${r}", found "${u}".`}}async validateFocus(t,s,r,o,n){try{return r?(await(0,N.expect)(t).toBeFocused({timeout:this.timeoutMs}),{success:!0,passMessage:`${s} has focus as expected. Test: "${n}".`}):(await(0,N.expect)(t).not.toBeFocused({timeout:this.timeoutMs}),{success:!0,passMessage:`${s} does not have focus as expected. Test: "${n}".`})}catch{let u=await this.page.evaluate(()=>{let i=document.activeElement;return i?`${i.tagName}#${i.id||"no-id"}.${i.className||"no-class"}`:"no element focused"});return{success:!1,failMessage:`${o} (actual focus: ${u})`}}}async validateRole(t,s,r,o,n){let u=await t.getAttribute("role");return u===r?{success:!0,passMessage:`${s} has role "${r}". Test: "${n}".`}:{success:!1,failMessage:`${o} Expected role "${r}", found "${u}".`}}async validate(t,s){if(this.page.isClosed())return{success:!1,failMessage:"CRITICAL: Browser/page closed before completing all tests. Increase test timeout or reduce test complexity."};let r=null,o;if(t.controlledBy){let n=t.controlledBy,u=this.selectors[n.target];if(!u)return{success:!1,failMessage:`Selector for controlledBy.target '${n.target}' not found.`,target:null};let i=null;if(n.relativeTarget?i=await j.resolve(this.page,u,n.relativeTarget):i=this.page.locator(u).first(),!i)return{success:!1,failMessage:"Controlling element for controlledBy not found.",target:null};let R=n.attribute||"aria-controls",C=await i.getAttribute(R);if(!C)return{success:!1,failMessage:`Controlling element does not have attribute '${R}'.`,target:null};if(r=this.page.locator(`#${C}`),!r||await r.count()===0)return{success:!1,failMessage:`Controlled element with id '${C}' not found.`,target:null}}else{let n=await this.resolveTarget(t.target,t.relativeTarget||t.expectedValue,t.selectorKey);if(r=n.target,o=n.error,o||!r)return{success:!1,failMessage:o||`Target ${t.target} not found.`,target:null}}if(t.target==="input"&&t.attribute==="aria-activedescendant"&&t.expectedValue==="!empty"&&t.relativeTarget&&t.selectorKey){let n=await j.resolve(this.page,this.selectors[t.selectorKey],t.relativeTarget),u=n?await n.getAttribute("id"):null,i=await r.getAttribute("aria-activedescendant");return u&&i===u?{success:!0,passMessage:`input[aria-activedescendant] matches id of ${t.relativeTarget}(${t.selectorKey}). Test: "${s}".`}:{success:!1,failMessage:`input[aria-activedescendant] should match id of ${t.relativeTarget}(${t.selectorKey}), found "${i}".`}}switch(t.assertion){case"toBeVisible":return this.validateVisibility(r,t.target,!0,t.failureMessage||"",s);case"notToBeVisible":return this.validateVisibility(r,t.target,!1,t.failureMessage||"",s);case"toHaveAttribute":return t.attribute&&t.expectedValue!==void 0?this.validateAttribute(r,t.target,t.attribute,t.expectedValue,t.failureMessage||"",s):{success:!1,failMessage:"Missing attribute or expectedValue for toHaveAttribute assertion"};case"toHaveValue":return t.expectedValue!==void 0?this.validateValue(r,t.target,t.expectedValue,t.failureMessage||"",s):{success:!1,failMessage:"Missing expectedValue for toHaveValue assertion"};case"toHaveFocus":return this.validateFocus(r,t.target,!0,t.failureMessage||"",s);case"notToHaveFocus":return this.validateFocus(r,t.target,!1,t.failureMessage||"",s);case"toHaveRole":return t.expectedValue!==void 0?this.validateRole(r,t.target,t.expectedValue,t.failureMessage||"",s):{success:!1,failMessage:"Missing expectedValue for toHaveRole assertion"};default:return{success:!1,failMessage:`Unknown assertion type: ${t.assertion}`}}}};async function tt(M,t,s,r,o){let n=r?.test?.components?.find(d=>d.name===M),u=!!n?.contractPath,i=new ce(!0,u),R={actionTimeoutMs:400,assertionTimeoutMs:400,navigationTimeoutMs:3e4,componentReadyTimeoutMs:5e3},C=r?.test?.disableTimeouts===!0,te=n?.disableTimeouts===!0||C,_=(d,H,O)=>{if(te)return 0;let F=d??H;return typeof F!="number"||!Number.isFinite(F)||F<0?O:F},z=_(n?.actionTimeoutMs,r?.test?.actionTimeoutMs,R.actionTimeoutMs),X=_(n?.assertionTimeoutMs,r?.test?.assertionTimeoutMs,R.assertionTimeoutMs),ie=_(n?.navigationTimeoutMs,r?.test?.navigationTimeoutMs,R.navigationTimeoutMs),le=_(n?.componentReadyTimeoutMs,r?.test?.componentReadyTimeoutMs,R.componentReadyTimeoutMs),me=Se(s),Y=n?.contractPath;if(!Y)throw new Error(`Contract path not found for component: ${M}`);let Re=(()=>{if(he.isAbsolute(Y))return Y;if(o){let H=he.resolve(o,Y);try{return de(H,"utf-8"),H}catch{}}let d=he.resolve(process.cwd(),Y);try{return de(d,"utf-8"),d}catch{return new URL(Y,import.meta.url).pathname}})(),Ae=de(Re,"utf-8"),b=JSON.parse(Ae),Me=(b.relationships?.length||0)+(b.static.length||0)+b.dynamic.length,Ee=b.meta?.source?.apg,V=[],K=[],q=[],x=[],v=null,E=(d,H)=>{let O=Q(H),F=ke(O,me);if(F==="error")return V.push(d),{status:"fail",level:O,detail:d};if(F==="warning")return K.push(d),{status:"warn",level:O,detail:d};let D=`${d} (ignored by strictness=${me}, level=${O})`;return x.push(D),{status:"skip",level:O,detail:D}};try{if(v=await Te(),t){try{await v.goto(t,{waitUntil:"domcontentloaded",timeout:ie})}catch(e){throw new Error(`Failed to navigate to ${t}. Ensure dev server is running and accessible. Original error: ${e instanceof Error?e.message:String(e)}`)}await v.addStyleTag({content:"* { transition: none !important; animation: none !important; }"})}let d=await ae.detect(M,n,z,X,o);if(!d)throw new Error(`Unsupported component: ${M}`);let H=d.getMainSelector();if(!H)throw new Error(`CRITICAL: No selector found in contract for ${M}`);try{await v.locator(H).first().waitFor({state:"attached",timeout:le})}catch(e){throw new Error(`
23
- \u274C CRITICAL: Component not found on page!
24
- This usually means:
25
- - The component didn't render
26
- - The URL is incorrect
27
- - The component selector '${H}' in the contract is wrong
28
- - Original error: ${e}`)}i.start(M,Me,Ee),M==="menu"&&b.selectors.main&&await v.locator(b.selectors.main).first().waitFor({state:"visible",timeout:le}).catch(()=>{});let O=M==="menu"&&b.selectors.submenuTrigger?await v.locator(b.selectors.submenuTrigger).count()>0:!1,F=e=>e.type==="aria-reference"&&[e.from,e.to].some(p=>["submenu","submenuTrigger","submenuItems"].includes(p||""))||e.type==="contains"&&[e.parent,e.child].some(p=>["submenu","submenuTrigger","submenuItems"].includes(p||"")),D=0,P=0,I=0;for(let e of b.relationships||[]){if(d&&typeof d.resetState=="function")try{await d.resetState(v)}catch(g){K.push(`Warning: resetState failed before relationship test: ${g instanceof Error?g.message:String(g)}`)}let p=Q(e.level);if(Array.isArray(e.setup)&&e.setup.length>0){let w=function(l){return h.includes(l)};var ye=w;let g=new ee(v,b.selectors,z),S=e.type==="aria-reference"?`${e.from}.${e.attribute} references ${e.to}`:`${e.parent} contains ${e.child}`,h=["focus","type","click","keypress","hover"],m=l=>({...l,type:w(l.type)?l.type:"click"}),$=e.setup.map(m),k=await ue($,g,d,v,S,["submenu","submenuTrigger","submenuItems"]);if(k.skip){x.push(k.message||"Setup action skipped"),i.reportStaticTest(S,"skip",k.message,p);continue}if(!k.success){let l=`Relationship setup failed: ${k.error}`,c=E(l,e.level);c.status==="fail"&&(P+=1),c.status==="warn"&&(I+=1),i.reportStaticTest(S,c.status,c.detail,c.level);continue}}if(M==="menu"&&!O&&F(e)){let S=e.type==="aria-reference"?`${e.from}.${e.attribute} references ${e.to}`:`${e.parent} contains ${e.child}`,h="Skipping submenu relationship assertion: no submenu capability detected in rendered component.";x.push(h),i.reportStaticTest(S,"skip",h,p);continue}if(e.type==="aria-reference"){let g=`${e.from}.${e.attribute} references ${e.to}`,S=b.selectors[e.from],h=b.selectors[e.to];if(!S||!h){let f=E(`Relationship selector missing: from="${e.from}" or to="${e.to}" not found in selectors.`,e.level);f.status==="fail"&&(P+=1),f.status==="warn"&&(I+=1),i.reportStaticTest(g,f.status,f.detail,f.level);continue}let w=v.locator(S).first(),m=v.locator(h).first(),$=await w.count()>0,k=await m.count()>0;if(!$||!k){if(M==="menu"&&F(e)){let B="Skipping submenu relationship assertion in static phase: submenu elements are not present until submenu is opened.";x.push(B),i.reportStaticTest(g,"skip",B,p);continue}let f=E(`Relationship target not found: ${$?e.to:e.from}.`,e.level);f.status==="fail"&&(P+=1),f.status==="warn"&&(I+=1),i.reportStaticTest(g,f.status,f.detail,f.level);continue}let l=await w.getAttribute(e.attribute),c=await m.getAttribute("id");if(!c){let f=E(`Relationship target "${e.to}" must have an id for ${e.attribute} validation.`,e.level);f.status==="fail"&&(P+=1),f.status==="warn"&&(I+=1),i.reportStaticTest(g,f.status,f.detail,f.level);continue}if(!(l||"").split(/\s+/).filter(Boolean).includes(c)){let f=E(`Expected ${e.from} ${e.attribute} to reference id "${c}", found "${l||""}".`,e.level);f.status==="fail"&&(P+=1),f.status==="warn"&&(I+=1),i.reportStaticTest(g,f.status,f.detail,f.level);continue}q.push(`Relationship valid: ${e.from}.${e.attribute} -> ${e.to} (id=${c}).`),D+=1,i.reportStaticTest(g,"pass",void 0,p);continue}if(e.type==="contains"){let g=`${e.parent} contains ${e.child}`,S=b.selectors[e.parent],h=b.selectors[e.child];if(!S||!h){let l=E(`Relationship selector missing: parent="${e.parent}" or child="${e.child}" not found in selectors.`,e.level);l.status==="fail"&&(P+=1),l.status==="warn"&&(I+=1),i.reportStaticTest(g,l.status,l.detail,l.level);continue}let w=v.locator(S).first();if(!(await w.count()>0)){if(M==="menu"&&F(e)){let c="Skipping submenu relationship assertion in static phase: submenu container is not present until submenu is opened.";x.push(c),i.reportStaticTest(g,"skip",c,p);continue}let l=E(`Relationship parent target not found: ${e.parent}.`,e.level);l.status==="fail"&&(P+=1),l.status==="warn"&&(I+=1),i.reportStaticTest(g,l.status,l.detail,l.level);continue}if(await w.locator(h).count()<1){if(M==="menu"&&F(e)){let c="Skipping submenu relationship assertion in static phase: submenu descendants are not present until submenu is opened.";x.push(c),i.reportStaticTest(g,"skip",c,p);continue}let l=E(`Expected ${e.parent} to contain descendant matching selector for ${e.child}.`,e.level);l.status==="fail"&&(P+=1),l.status==="warn"&&(I+=1),i.reportStaticTest(g,l.status,l.detail,l.level);continue}q.push(`Relationship valid: ${e.parent} contains ${e.child}.`),D+=1,i.reportStaticTest(g,"pass",void 0,p)}}async function ve(e,p,g,S={}){if(!e||typeof e!="object"||!("ref"in e))return e;let h;if(e.ref==="relative"){if(!e.relativeTarget||!S.relativeBaseSelector)return;let w=g.locator(S.relativeBaseSelector),m=await w.count(),$=0;if(e.relativeTarget==="first"?$=0:e.relativeTarget==="second"?$=1:e.relativeTarget==="last"?$=m-1:isNaN(Number(e.relativeTarget))?$=0:$=Number(e.relativeTarget),$<0||$>=m)return;let k=w.nth($);return await we(k,e.property||e.attribute)}else{if(h=p[e.ref],!h)throw new Error(`Selector for ref '${e.ref}' not found in contract selectors.`);let w=g.locator(h).first();return await we(w,e.property||e.attribute)}}async function we(e,p){if(e)return!p||p==="id"?await e.getAttribute("id")??void 0:p==="class"?await e.getAttribute("class")??void 0:p==="textContent"?await e.evaluate(g=>g.textContent??void 0):p.startsWith("aria-")?await e.getAttribute(p)??void 0:p.endsWith("*")?await e.evaluate(S=>{let h=[];for(let w of Array.from(S.attributes))w.name.startsWith("aria-")&&h.push(`${w.name}=${w.value}`);return h.join(";")}):await e.getAttribute(p)??void 0}let xe=new re(v,b.selectors,X);async function ue(e,p,g,S,h,w=[]){if(!Array.isArray(e)||e.length===0)return{success:!0};g&&typeof g.resetState=="function"&&await g.resetState(S);for(let m of e){let $={success:!0};try{if(m.type==="focus")m.target==="relative"&&m.relativeTarget?$=await p.focus("relative",m.relativeTarget):$=await p.focus(m.target);else if(m.type==="type"&&m.value)$=await p.type(m.target,m.value);else if(m.type==="click")$=await p.click(m.target,m.relativeTarget);else if(m.type==="keypress"&&m.key)$=await p.keypress(m.target,m.key,m.relativeTarget);else if(m.type==="hover")$=await p.hover(m.target,m.relativeTarget);else continue}catch(k){$={success:!1,error:k instanceof Error?k.message:String(k)}}if(!$.success){let k=$.error||"Setup action failed";return w.some(c=>h.includes(c)||k.includes(c))?{success:!1,skip:!0,message:`Skipping test - capability not present: ${k}`}:{success:!1,error:k}}}return{success:!0}}for(let e of b.static||[]){if(d&&typeof d.resetState=="function")try{await d.resetState(v)}catch(l){K.push(`Warning: resetState failed before static test: ${l instanceof Error?l.message:String(l)}`)}if(e.target==="relative")continue;let p=`${e.target}${e.attribute?` (${e.attribute})`:""}`,g=Q(e.level);if(M==="menu"&&e.target==="submenuTrigger"&&!O){let l=`Skipping submenu static assertion for ${e.target}: no submenu capability detected in rendered component.`;x.push(l),i.reportStaticTest(p,"skip",l,g);continue}let S=[];if(e.target||S.push("target"),e.attribute||S.push("attribute"),typeof e.expectedValue>"u"&&S.push("expectedValue"),S.length>0){let l=`${e.target||""}${e.attribute?` (${e.attribute})`:""}`,c=`Static assertion missing required field(s): ${S.join(", ")}`,y=E(c,e.level);y.status==="fail"&&(P+=1),y.status==="warn"&&(I+=1),i.reportStaticTest(l,y.status,y.detail,y.level);continue}if(Array.isArray(e.setup)&&e.setup.length>0){let y=function(a){return c.includes(a)};var ye=y;let l=new ee(v,b.selectors,z),c=["focus","type","click","keypress","hover"],U=a=>({...a,type:y(a.type)?a.type:"click"}),f=e.setup.map(U),B=await ue(f,l,d,v,p,["submenu","submenuTrigger","submenuItems"]);if(B.skip){x.push(B.message||"Setup action skipped"),i.reportStaticTest(p,"skip",B.message,g);continue}if(!B.success){let a=`Static setup failed: ${B.error}`,T=E(a,e.level);T.status==="fail"&&(P+=1),T.status==="warn"&&(I+=1),i.reportStaticTest(p,T.status,T.detail,T.level);continue}}let h=b.selectors[e.target];if(!h){let l=`Selector for target ${e.target} not found.`,c=E(l,e.level);c.status==="fail"&&(P+=1),c.status==="warn"&&(I+=1),i.reportStaticTest(p,c.status,c.detail,c.level);continue}let w=v.locator(h).first();if(!(await w.count()>0)){let l=`Target ${e.target} not found.`,c=E(l,e.level);c.status==="fail"&&(P+=1),c.status==="warn"&&(I+=1),i.reportStaticTest(p,c.status,c.detail,c.level);continue}let $=(l,c,y)=>{let U=new RegExp(`\\[${c}(?:=["']?([^\\]"']+)["']?)?\\]`),f=l.match(U);if(!f)return!1;if(!y)return!0;let B=f[1];return B?y.split(" | ").includes(B):!1},k=e.expectedValue;if(e.expectedValue&&typeof e.expectedValue=="object"&&"ref"in e.expectedValue){let l={},c=e.relativeTarget;if(e.expectedValue.ref==="relative"&&e.target==="relative"&&c){let y=b.selectors[c];if(!y)throw new Error(`Selector for relativeTarget '${c}' not found in contract selectors.`);l.relativeBaseSelector=y}else if(e.expectedValue.ref==="relative"&&c){let y=b.selectors[c];if(!y)throw new Error(`Selector for relativeTarget '${c}' not found in contract selectors.`);l.relativeBaseSelector=y}k=await ve(e.expectedValue,b.selectors,v,l)}if(e.expectedValue)if($(h,e.attribute,typeof k=="string"?k:void 0))q.push(`${e.attribute}="${k}" on ${e.target} verified by selector (already present in: ${h}).`),D+=1,i.reportStaticTest(p,"pass",void 0,g);else{let l=k??"",c=await xe.validateAttribute(w,e.target,e.attribute,l,e.failureMessage,"Static ARIA Test");if(c.success&&c.passMessage)q.push(c.passMessage),D+=1,i.reportStaticTest(p,"pass",void 0,g);else if(!c.success&&c.failMessage){let y=E(c.failMessage,e.level);y.status==="fail"&&(P+=1),y.status==="warn"&&(I+=1),i.reportStaticTest(p,y.status,y.detail,y.level)}}else{let l=e.attribute.split(" | "),c=!1,y=!0;for(let U of l){let f=U.trim();if($(h,f)){q.push(`${f} on ${e.target} verified by selector (already present in: ${h}).`),c=!0;continue}if(y=!1,await w.getAttribute(f)!==null){c=!0;break}}if(!c&&!y){let U=e.failureMessage+` None of the attributes "${e.attribute}" are present.`,f=E(U,e.level);f.status==="fail"&&(P+=1),f.status==="warn"&&(I+=1),i.reportStaticTest(p,f.status,f.detail,f.level)}else!y&&c?(q.push(`At least one of the attributes "${e.attribute}" exists on the element.`),D+=1,i.reportStaticTest(p,"pass",void 0,g)):(D+=1,i.reportStaticTest(p,"pass",void 0,g))}}for(let e of b.dynamic||[]){if(!e.assertions||e.assertions.length===0){let a="Skipping test - no assertions found for this dynamic test.";x.push(a),i.reportTest({description:e.description,level:Q(e.level)},"skip",a);continue}if(!v||v.isClosed()){console.warn(`
29
- \u26A0\uFE0F Browser closed - skipping remaining ${b.dynamic.length-b.dynamic.indexOf(e)} tests
30
- `),V.push(`CRITICAL: Browser/page closed before completing all tests. ${b.dynamic.length-b.dynamic.indexOf(e)} tests skipped.`);break}try{await d.resetState(v)}catch(a){let T=a instanceof Error?a.message:String(a);throw i.error(T),a}let{setup:p=[],action:g,assertions:S}=e,h=Q(e.level),w=new ee(v,b.selectors,z);if(Array.isArray(p)&&p.length>0){let T=function(L){return a.includes(L)};var ye=T;let a=["focus","type","click","keypress","hover"],Z=L=>({...L,type:T(L.type)?L.type:"click"}),pe=p.map(Z),W=await ue(pe,w,d,v,e.description,["submenu","submenuTrigger","submenuItems"]);if(W.skip){x.push(W.message||"Setup action skipped"),i.reportTest({description:e.description,level:h},"skip",W.message);continue}if(!W.success){let L=E(`Setup failed: ${W.error}`,e.level);i.reportTest({description:e.description,level:h},L.status,L.detail);continue}}let m=V.length,$=K.length,k=x.length;if(await d.shouldSkipTest(e,v)){let a="Skipping test - component-specific conditions not met";x.push(a),i.reportTest({description:e.description,level:h},"skip",a);continue}let c=new re(v,b.selectors,X),y=!1,U=null;for(let a of g){if(!v||v.isClosed()){V.push("CRITICAL: Browser/page closed during test execution. Remaining actions skipped."),y=!0;break}let T;if(a.type==="focus")a.target==="relative"&&a.relativeTarget?T=await w.focus("relative",a.relativeTarget):T=await w.focus(a.target);else if(a.type==="type"&&a.value)T=await w.type(a.target,a.value);else if(a.type==="click")T=await w.click(a.target,a.relativeTarget);else if(a.type==="keypress"&&a.key)T=await w.keypress(a.target,a.key,a.relativeTarget);else if(a.type==="hover")T=await w.hover(a.target,a.relativeTarget);else continue;if(!T.success){if(T.error){let Z=E(T.error,e.level);U={status:Z.status,detail:Z.detail}}y=!0;break}}if(y){i.reportTest({description:e.description,level:h},U?.status||"fail",U?.detail||V[V.length-1]);continue}for(let a of S){let T;if(a.expectedValue&&typeof a.expectedValue=="object"&&"ref"in a.expectedValue)if(a.expectedValue.ref==="relative"){let{RelativeTargetResolver:J}=await import("./RelativeTargetResolver-PDJM3ZJI.js"),L=b.selectors.relative;if(!L)throw new Error("Relative selector not defined in contract selectors.");let se=a.relativeTarget||"first",G=await J.resolve(v,L,se);if(!G)throw new Error(`Could not resolve relative target '${se}' for expectedValue.`);let $e=a.expectedValue.property||a.expectedValue.attribute||"id";if($e==="textContent")T=await G.evaluate(ne=>ne.textContent??void 0);else{let ne=await G.getAttribute($e);T=ne===null?void 0:ne}}else T=await ve(a.expectedValue,b.selectors,v,{});else typeof a.expectedValue=="string"||typeof a.expectedValue>"u"?T=a.expectedValue:T="";let Z={...a,expectedValue:T},pe=T??"",W=await c.validate({...Z,expectedValue:pe},e.description);if(W.success&&W.passMessage)q.push(W.passMessage);else if(!W.success&&W.failMessage){let J=[];if(a.target||J.push("target"),a.assertion||J.push("assertion"),["toHaveAttribute","toHaveValue","toHaveRole"].includes(a.assertion)&&(typeof a.attribute>"u"&&a.assertion==="toHaveAttribute"&&J.push("attribute"),typeof a.expectedValue>"u"&&J.push("expectedValue")),J.length>0){let L=Q(a.level||e.level),se=`Dynamic assertion missing required field(s): ${J.join(", ")}`,G=E(se,L);if(G.status==="skip")continue;V.push(se),i.reportTest({description:e.description,level:L},G.status,G.detail);continue}}}let f=V.length,B=K.length,be=x.length;f>m?i.reportTest({description:e.description,level:h},"fail",V[V.length-1]):B>$?i.reportTest({description:e.description,level:h},"warn",K[K.length-1]):be>k?i.reportTest({description:e.description,level:h},"skip",x[x.length-1]):i.reportTest({description:e.description,level:h},"pass")}i.reportStatic(D,P,I),i.summary(V)}catch(d){if(d instanceof Error)throw d.message.includes("Executable doesn't exist")||d.message.includes("browserType.launch")?new Error(`
31
- \u274C CRITICAL: Playwright browsers not found!
32
- \u{1F4E6} Run: npx playwright install chromium`):d.message.includes("net::ERR_CONNECTION_REFUSED")||d.message.includes("NS_ERROR_CONNECTION_REFUSED")?new Error(`
33
- \u274C CRITICAL: Cannot connect to dev server!
34
- Make sure your dev server is running at ${t}`):d.message.includes("Timeout")&&d.message.includes("waitFor")?new Error(`
35
- \u274C CRITICAL: Component not found on page!
36
- The component selector could not be found within ${le}ms.
37
- This usually means:
38
- - The component didn't render
39
- - The URL is incorrect
40
- - The component selector was not provided to the component utility, or a wrong selector was used
41
- `):d.message.includes("Target page, context or browser has been closed")?new Error(`
42
- \u274C CRITICAL: Browser/page was closed unexpectedly!
43
- This usually means:
44
- - The test timeout was too short
45
- - The browser crashed
46
- - An external process killed the browser`):d}finally{v&&await v.close()}return{passes:q,failures:V,skipped:x,warnings:K}}export{tt as runContractTestsPlaywright};