skeptic-cli 0.2.1 → 1.0.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 (79) hide show
  1. package/AGENTS.md +20 -53
  2. package/LICENSE +24 -0
  3. package/LICENSES.md +92 -3
  4. package/README.md +25 -49
  5. package/agent-skills/skeptic/SKILL.md +150 -38
  6. package/dist/adb-DUGGW3FV.mjs +2 -0
  7. package/dist/adb-driver-TBOCCKEO.mjs +3 -0
  8. package/dist/adb-session-AVVXL3QQ.mjs +2 -0
  9. package/dist/add-G7JFXU4S.mjs +67 -0
  10. package/dist/audit-ID2BSVYC.mjs +7 -0
  11. package/dist/auto-spawn-4TO4DBO6.mjs +2 -0
  12. package/dist/browser-verbs-R7R6PK2G.mjs +21 -0
  13. package/dist/browsers-install-F2ZWEBOX.mjs +3 -0
  14. package/dist/chokidar-KB6GLGX4.mjs +7 -0
  15. package/dist/chunk-2N64R5DC.mjs +457 -0
  16. package/dist/chunk-2VGKPSCR.mjs +8 -0
  17. package/dist/chunk-2VSGDT7T.mjs +7 -0
  18. package/dist/chunk-2YKSIUIN.mjs +3 -0
  19. package/dist/chunk-2ZORFJJP.mjs +11 -0
  20. package/dist/chunk-42J77CYA.mjs +3 -0
  21. package/dist/chunk-6TLKI7UN.mjs +4 -0
  22. package/dist/chunk-6U6H22OR.mjs +3 -0
  23. package/dist/chunk-7BFRKEFV.mjs +160 -0
  24. package/dist/chunk-7ZUWKIDM.mjs +3 -0
  25. package/dist/chunk-AH75LR2T.mjs +3 -0
  26. package/dist/chunk-B26AZRXU.mjs +41 -0
  27. package/dist/chunk-BIGNULF6.mjs +12 -0
  28. package/dist/chunk-COVGJJ47.mjs +3 -0
  29. package/dist/chunk-CWNYWHJ2.mjs +143 -0
  30. package/dist/chunk-EU3OXJX4.mjs +3 -0
  31. package/dist/chunk-EYVJTUBL.mjs +3 -0
  32. package/dist/chunk-G22LGRZ4.mjs +4 -0
  33. package/dist/chunk-I4JX25Y5.mjs +13 -0
  34. package/dist/chunk-IXBYLSGB.mjs +5 -0
  35. package/dist/chunk-IYLF56WL.mjs +3 -0
  36. package/dist/chunk-K65JNLTT.mjs +3 -0
  37. package/dist/chunk-LPJF33QP.mjs +3 -0
  38. package/dist/chunk-MHNEFL35.mjs +3 -0
  39. package/dist/chunk-N3533BCE.mjs +3 -0
  40. package/dist/chunk-NXTEMSUR.mjs +4 -0
  41. package/dist/chunk-OHVNABCL.mjs +10 -0
  42. package/dist/chunk-QICYK6XT.mjs +10 -0
  43. package/dist/chunk-RU7M6UGM.mjs +5 -0
  44. package/dist/chunk-S3M2RTHJ.mjs +7 -0
  45. package/dist/chunk-U3KRIAEU.mjs +3 -0
  46. package/dist/chunk-YB25SMQ2.mjs +141 -0
  47. package/dist/chunk-ZN6MI2TU.mjs +4 -0
  48. package/dist/client-UR65IKYX.mjs +2 -0
  49. package/dist/comment-F734YE5S.mjs +6 -0
  50. package/dist/cookies-X7W5U3VE.mjs +3 -0
  51. package/dist/daemon-7M5HNFD7.mjs +7 -0
  52. package/dist/device-fixture-MJSDIP75.mjs +2 -0
  53. package/dist/devices-NG4P5UPS.mjs +4 -0
  54. package/dist/devtools-N5AYAR54.mjs +12 -0
  55. package/dist/doctor-Q76JEQQI.mjs +4 -0
  56. package/dist/extractor-Y477MBN6.mjs +2 -0
  57. package/dist/html-reporter-7QHIRHEY.mjs +2 -0
  58. package/dist/index.d.ts +87 -120
  59. package/dist/index.mjs +26 -1741
  60. package/dist/init-6RHO2LGR.mjs +15 -0
  61. package/dist/ink-reporter-4EN7CRMK.mjs +3 -0
  62. package/dist/inspect-44KF3IPH.mjs +19 -0
  63. package/dist/ios-tools-WK66CQ7Q.mjs +2 -0
  64. package/dist/json-reporter-SXWPAXRY.mjs +2 -0
  65. package/dist/junit-reporter-5AT3OFWV.mjs +12 -0
  66. package/dist/mail-GTOZFXJ5.mjs +14 -0
  67. package/dist/observe-EDXYWK6C.mjs +3 -0
  68. package/dist/render-MHOBDOSP.mjs +383 -0
  69. package/dist/run-GUWITPL4.mjs +2 -0
  70. package/dist/scaffold-6ZF6K6Y5.mjs +38 -0
  71. package/dist/screenshot-GUJSIRQB.mjs +2 -0
  72. package/dist/session-daemon-cmd-QHVSSKSL.mjs +4 -0
  73. package/dist/simctl-driver-PNUN7W7G.mjs +5 -0
  74. package/dist/skeptic.mjs +3 -1754
  75. package/dist/slack-reporter-EEFO66V6.mjs +8 -0
  76. package/dist/watch-A7ZLUYR2.mjs +3 -0
  77. package/dist/webhook-reporter-BXJGZS2I.mjs +3 -0
  78. package/dist/worker.mjs +3 -724
  79. package/package.json +13 -11
@@ -0,0 +1,4 @@
1
+ import {createRequire}from'node:module';import {execFile}from'child_process';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var u=t=>{if(t)return t;let n=process.env.ANDROID_HOME??process.env.ANDROID_SDK_ROOT;return n?`${n}/platform-tools/adb`:"adb"},f=t=>{let n=u(t.adbPath),o=t.timeoutMs??15e3,s=["-s",t.serial],i=(e,r)=>new Promise((m,b)=>{execFile(n,[...s,...e],{timeout:r??o,maxBuffer:64*1024*1024,encoding:"buffer"},(a,g)=>{if(a){b(new Error(`adb ${e.join(" ")} failed: ${a.message}`));return}m(g);});});return {text:async(e,r)=>(await i(e,r)).toString("utf8"),bytes:(e,r)=>i(e,r)}},p=t=>/^[\x20-\x7e]*$/.test(t),d=t=>t.replace(/(["\\$`])/g,"\\$1").replace(/ /g,"%s").replace(/[()<>|;&*~^]/g,"\\$&"),x=async t=>{let n=u(t);return (await new Promise((s,i)=>{execFile(n,["devices"],{timeout:1e4},(e,r)=>e?i(e):s(r));})).split(`
4
+ `).slice(1).map(s=>s.trim()).filter(Boolean).map(s=>{let[i,e]=s.split(/\s+/);return {serial:i??"",state:e??"unknown"}}).filter(s=>s.serial)};export{f as a,p as b,d as c,x as d};
@@ -0,0 +1,13 @@
1
+ import {createRequire}from'node:module';import {a,b as b$2}from'./chunk-U3KRIAEU.mjs';import {b as b$3}from'./chunk-OHVNABCL.mjs';import {a as a$1}from'./chunk-B26AZRXU.mjs';import {b as b$1}from'./chunk-K65JNLTT.mjs';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var b="__skepticActiveRegistry__",v=()=>globalThis,q=t=>{let e={file:t,tests:[],beforeEach:[],afterEach:[],fileUse:{}};return v()[b]=e,e},K=()=>{let t=v(),e=t[b]??null;return t[b]=null,e},g=t=>{let e=v()[b];if(!e)throw new Error(`[skeptic] ${t}() called outside a spec file. Tests must be defined at module top level of a *.spec.ts file imported by the runner.`);return e},T=(t,e)=>(r,s,a)=>{let n=g("test"),o=n.tests.length,i=`${n.file}#${o}`;n.tests.push({ordinal:o,id:i,name:r,file:n.file,fn:s,skip:t,only:e,use:a??{}});},d=T(false,false);d.skip=T(true,false);d.only=T(false,true);d.use=t=>{let e=g("test.use");e.fileUse={...e.fileUse,...t};};d.beforeEach=(t,e)=>{g("test.beforeEach").beforeEach.push({fn:t,use:e??{}});};d.afterEach=(t,e)=>{g("test.afterEach").afterEach.push({fn:t,use:e??{}});};var z=d;var M=/^(<=|>=|<|>|=)\s*(\d+(?:\.\d+)?)\s*(ms|s)?$/,F=(t,e)=>{let r=t.trim(),s=M.exec(r);if(!s)throw new Error(`Invalid threshold expression: "${t}". Expected format: "<value[unit]", e.g. "<2.5s", "<=200ms", "<0.1".`);let[,a,n,o]=s,i=parseFloat(n);if(e==="ms"){if(o==="s")i=i*1e3;else if(!(o==="ms"||o===void 0))throw new Error(`Time metric cannot use unit "${o}"`)}else if(o!==void 0)throw new Error(`Unitless metric "${t}" should not have a unit suffix`);return {operator:a,value:i,raw:r}},$=(t,e)=>{switch(e.operator){case "<":return t<e.value;case "<=":return t<=e.value;case ">":return t>e.value;case ">=":return t>=e.value;case "=":return t===e.value}};var w=(t,e)=>{if(!t)throw new Error(`[skeptic] observability.expect${e}() needs the "${e.toLowerCase()}" collector. Pass --observability or test.use({ collectors: ["${e.toLowerCase()}"] }).`);return t},A=(t,e)=>!e||e.length===0?false:e.some(r=>typeof r=="string"?t.includes(r):r.test(t)),L=t=>{let{runAction:e,collectors:r}=t;return {expectPerformance:s=>e("observability.expectPerformance",async()=>{let n=await w(r.performance,"Performance").snapshot(),o=[],i=[{key:"lcp",metric:"lcp"},{key:"cls",metric:"cls"},{key:"inp",metric:"inp"},{key:"fcp",metric:"fcp"},{key:"ttfb",metric:"ttfb"}];for(let{key:c,metric:p}of i){let u=s[c];if(u===void 0)continue;let y=F(u,c==="cls"?"unitless":"ms"),l=n[p];if(typeof l!="number"){o.push(`${c}: not measured (collector returned ${l===null?"null":typeof l})`);continue}$(l,y)||o.push(`${c}: ${l} ${y.operator} ${y.value} failed`);}if(o.length>0)throw new Error(`[skeptic] performance thresholds violated:
4
+ - ${o.join(`
5
+ - `)}`)}),expectNoNetworkErrors:s=>e("observability.expectNoNetworkErrors",async()=>{let n=await w(r.network,"Network").snapshot(),o=[],i=s?.allow;for(let c of n.issues.failedRequests)A(c.url,i)||o.push(`${c.method} ${c.url} \u2192 ${c.status}`);for(let c of n.issues.networkFailures)A(c.url,i)||o.push(`${c.method} ${c.url}: ${c.reason}`);if(o.length>0)throw new Error(`[skeptic] network errors detected:
6
+ - ${o.join(`
7
+ - `)}`)}),expectNoConsoleErrors:s=>e("observability.expectNoConsoleErrors",async()=>{let n=await w(r.console,"Console").snapshot(),o=s?.allow,i=n.messages.filter(c=>c.type==="error"&&!A(c.text,o));if(i.length>0)throw new Error(`[skeptic] ${i.length} console error(s):
8
+ - ${i.slice(0,5).map(c=>c.text.slice(0,200)).join(`
9
+ - `)}`)}),expectAccessible:s=>e("observability.expectAccessible",async()=>{let n=await w(r.accessibility,"Accessibility").audit({standard:s?.standard??"WCAG21AA",...s?.include?{include:s.include}:{},...s?.exclude?{exclude:s.exclude}:{},...s?.impacts?{impacts:s.impacts}:{}}),{summary:o}=n,i=o.enginesErrored??[],c=o.violations>0||o.passes>0||o.incomplete>0;if(i.length>0&&!c){let p=i.map(u=>`${u.engine}: ${u.reason}`).join(`
10
+ - `);throw new Error(`[skeptic] accessibility audit could not run \u2014 no engine produced results:
11
+ - ${p}`)}if(o.violations>0){let p=n.violations.slice(0,5).map(u=>`${u.ruleId} (${u.impact}): ${u.help}`);throw new Error(`[skeptic] ${o.violations} a11y violation(s):
12
+ - ${p.join(`
13
+ - `)}`)}}),snapshot:()=>e("observability.snapshot",async()=>{let s={};if(r.performance&&(s.performance=await r.performance.snapshot()),r.network&&(s.network=await r.network.snapshot()),r.console&&(s.console=await r.console.snapshot()),r.accessibility){let a=await r.accessibility.snapshot();a!==void 0&&(s.accessibility=a);}return s})}};var N=new Set(["click","dblclick","hover","fill","type","press","selectOption","check","uncheck","tap","setChecked"]),W=new Set(["locator","getByRole","getByText","getByLabel","getByPlaceholder","getByTestId","getByAltText","getByTitle","filter","and","or","first","last","nth","frameLocator","contentFrame"]),D=new Set(["locator","getByRole","getByText","getByLabel","getByPlaceholder","getByTestId","getByAltText","getByTitle","frameLocator"]),C=(t,e)=>{t.evaluate(({cmd:r,x:s,y:a})=>{let n=globalThis.__skepticCursor;!n||typeof n.recordAction!="function"||(typeof s=="number"&&typeof a=="number"?n.recordAction(r,s,a):n.recordAction(r));},{cmd:e.command,x:e.x,y:e.y}).catch(()=>{});},_=async t=>{if(!t)return null;try{let e=await t.boundingBox({timeout:250}).catch(()=>null);return e?{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}:null}catch{return null}},U=(t,e)=>new Proxy(t,{get(r,s,a$1){if(s==="constructor")return r.constructor;let n=Reflect.get(r,s,a$1);if(typeof n!="function")return n;let o=typeof s=="string"?s:"";return W.has(o)?(...i)=>{let c=Reflect.apply(n,r,i);return c&&typeof c.click=="function"?U(c,e):c}:N.has(o)?async(...i)=>{let c=await _(r);C(e,{command:o,x:c?.x??null,y:c?.y??null});let p=a(`proxy.${o}`);await k(e,p,{persistent:true}).catch(()=>{});try{return await Reflect.apply(n,r,i)}finally{await x(e).catch(()=>{});}}:(...i)=>Reflect.apply(n,r,i)}}),B=t=>new Proxy(t,{get(e,r,s){if(r==="constructor")return e.constructor;let a$1=Reflect.get(e,r,s);if(typeof a$1!="function")return a$1;let n=typeof r=="string"?r:"";return D.has(n)?(...o)=>{let i=Reflect.apply(a$1,e,o);return i&&typeof i.click=="function"?U(i,e):i}:N.has(n)?async(...o)=>{let i=null,c=typeof o[0]=="string"?o[0]:null;if(c)try{let u=e.locator(c);i=await _(u);}catch{}C(e,{command:n,x:i?.x??null,y:i?.y??null});let p=a(`proxy.${n}`);await k(e,p,{persistent:true}).catch(()=>{});try{return await Reflect.apply(a$1,e,o)}finally{await x(e).catch(()=>{});}}:(...o)=>Reflect.apply(a$1,e,o)}}),k=(t,e,r={})=>{let s=r.persistent===true;return t.evaluate(({label:a,persistent:n})=>{let o=globalThis.__skepticCursor;o&&typeof o.setCommandLabel=="function"&&o.setCommandLabel(a,{persistent:n});},{label:e,persistent:s}).catch(()=>{})},x=t=>t.evaluate(()=>{let e=globalThis.__skepticCursor;e&&typeof e.clearCommandLabel=="function"&&e.clearCommandLabel();}).catch(()=>{}),j=(t,e)=>{C(t,{command:e,x:null,y:null});};var Y=t=>{},ce=(t,e,r={})=>{let s=r.onAction??Y,a$2=r.enableCursorProxy===true,n=a$2?B(t):t,o=async(l,m)=>{if(e.abortReason!==null&&!e.inTeardown){let f=`[skeptic] aborted: ${e.abortReason}`;throw s({label:l,status:"failed",error:f}),new Error(f)}let S=performance.now();s({label:l,status:"started"});let H=a(l),I=b$2.has(l);a$2&&k(t,H,{persistent:I}).catch(()=>{});try{let f=await m();return s({label:l,status:"completed",durationMs:Math.round(performance.now()-S)}),a$2&&j(t,l),f}catch(f){let G=f instanceof Error?f.message:String(f);throw s({label:l,status:"failed",durationMs:Math.round(performance.now()-S),error:G}),f}finally{a$2&&await x(t).catch(()=>{});}},i=(l,m)=>o("snapshot",()=>b$3(l??t,e,m)),c=(l,m)=>o(m?.annotate===true?"screenshot.annotated":"screenshot",()=>a$1(t,e,l,m)),p=()=>o("settle",async()=>{try{await t.waitForLoadState("networkidle",{timeout:5e3});}catch{}}),u={performance:e.collectors.get("performance"),network:e.collectors.get("network"),console:e.collectors.get("console"),accessibility:e.collectors.get("accessibility")},y=L({runAction:o,collectors:u});return {page:n,device:b$1("device","android or ios-sim"),ctx:e,runAction:o,snapshot:i,screenshot:c,settle:p,observability:y}};export{q as a,K as b,z as c,ce as d};
@@ -0,0 +1,5 @@
1
+ import {createRequire}from'node:module';import {m,e,f,c,n,p,d,o as o$1}from'./chunk-2VSGDT7T.mjs';import {a}from'./chunk-IYLF56WL.mjs';import*as o from'fs';import {createRequire as createRequire$1}from'module';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var H=(n,e)=>o$1(n.authToken)?n.engine===void 0||n.headed===void 0||n.playwrightVersion===void 0||n.cliVersion===void 0?{ok:false,reason:"missing-fields",engine:e.engine,headed:e.headed,playwrightVersion:e.playwrightVersion,cliVersion:e.cliVersion}:n.engine!==e.engine?{ok:false,reason:"engine-mismatch",engine:e.engine,headed:e.headed,playwrightVersion:e.playwrightVersion,cliVersion:e.cliVersion}:n.headed!==e.headed?{ok:false,reason:"headed-mismatch",engine:e.engine,headed:e.headed,playwrightVersion:e.playwrightVersion,cliVersion:e.cliVersion}:n.playwrightVersion!==e.playwrightVersion?{ok:false,reason:"version-mismatch",engine:e.engine,headed:e.headed,playwrightVersion:e.playwrightVersion,cliVersion:e.cliVersion}:n.cliVersion!==e.cliVersion?{ok:false,reason:"version-mismatch",engine:e.engine,headed:e.headed,playwrightVersion:e.playwrightVersion,cliVersion:e.cliVersion}:{ok:true,engine:e.engine,headed:e.headed,playwrightVersion:e.playwrightVersion,cliVersion:e.cliVersion}:{ok:false,reason:"auth-failed"},b=async(n,e,i)=>{switch(n.method){case "daemon.ping":{let t=n.params??{};return {result:H(t,e)}}case "daemon.status":return {result:{uptimeMs:Date.now()-e.startedAt,clients:e.clients,engine:e.engine,headed:e.headed,cliVersion:e.cliVersion,playwrightVersion:e.playwrightVersion}};case "browser.getEndpoint":{let t=n.params??{};return o$1(t.authToken)?(e.incClients(),{result:{wsEndpoint:e.wsEndpoint()}}):{error:"auth-failed"}}case "daemon.shutdown":return i(),{result:{ok:true}};default:return {error:`unknown-method: ${n.method}`}}};var F=n=>{try{return process.kill(n,0),!0}catch(e){return e.code!=="ESRCH"}},A=()=>{let n=d(),e=null;try{e=o.readFileSync(n,"utf8").trim();}catch{}if(e){let i=Number(e);if(Number.isFinite(i)&&i>0&&F(i)&&i!==process.pid)throw new Error(`daemon already running at PID ${i} (lockfile ${n}). Use 'skeptic daemon stop' first.`);y();}o.writeFileSync(n,String(process.pid),{mode:384});},y=()=>{for(let n of [d(),e(),f()])try{o.unlinkSync(n);}catch{}},V=class{timer=null;ms;onFire;constructor(e,i){this.ms=Math.max(0,Math.floor(e*1e3)),this.onFire=i;}arm(){this.ms!==0&&(this.disarm(),this.timer=setTimeout(()=>{this.timer=null,this.onFire();},this.ms),this.timer.unref?.());}reset(){this.ms!==0&&this.arm();}disarm(){this.timer&&(clearTimeout(this.timer),this.timer=null);}},x=createRequire$1(import.meta.url),T=(()=>{try{return x("playwright/package.json").version}catch{try{return x("playwright-core/package.json").version}catch{return "unknown"}}})(),J=async n$1=>{m(),A(),o.writeFileSync(e(),`${n$1.cliVersion}
4
+ ${T}`,{mode:384}),o.writeFileSync(f(),`${n$1.engine}
5
+ ${n$1.headed?"headed":"headless"}`,{mode:384});let i=(await a())[n$1.engine],t;try{t=await i.launchServer({headless:!n$1.headed});}catch(r){throw y(),new Error(`daemon: BrowserServer launch failed for engine=${n$1.engine} headed=${n$1.headed}: ${r instanceof Error?r.message:String(r)}`)}let h=Date.now(),a$1=0,l={engine:n$1.engine,headed:n$1.headed,cliVersion:n$1.cliVersion,playwrightVersion:T,startedAt:h,get clients(){return a$1},incClients:()=>{a$1+=1;},decClients:()=>{a$1=Math.max(0,a$1-1);},wsEndpoint:()=>t.wsEndpoint()},m$1=c();n(m$1);let c$1=null,d=async r=>c$1||(c$1=(async()=>{s.disarm();try{await S.close();}catch{}try{await t.close();}catch{}y();try{o.unlinkSync(m$1);}catch{}})(),c$1),s=new V(n$1.idleTimeoutSeconds??300,()=>{if(l.clients>0){s.arm();return}d();}),S=await p(m$1,(r,v)=>(v.onActivity(),s.reset(),r.method==="browser.release"?(l.decClients(),Promise.resolve({result:{ok:true}})):b(r,l,()=>{v.close(),d();})),{onAccept:()=>s.reset()});s.arm();let u=r=>{d().then(()=>{process.exit(0);});};return process.on("SIGTERM",u),process.on("SIGINT",u),process.on("SIGHUP",u),{state:l,socket:S,shutdown:d}};export{F as a,V as b,J as c};
@@ -0,0 +1,3 @@
1
+ import {createRequire}from'node:module';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var r=null;async function e(){return r||(r=await import('playwright'),r)}var t=null;async function o(){return t||(t=await import('playwright-core/lib/server'),t)}export{e as a,o as b};
@@ -0,0 +1,3 @@
1
+ import {createRequire}from'node:module';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var m=(r,n)=>r.selectorHint===n||r.selectorHint.includes(n)||r.name.length>0&&r.name.includes(n)||`${r.role}:${r.name}`.includes(n),v=r=>{let n=r.entries.map(o=>({ref:o.ref,role:o.role,name:o.name,selectorHint:o.selectorHint??""}));return {yaml:r.yaml,refs:n,has:o=>n.some(a=>m(a,o)),ref:o=>{let a=n.find(t=>m(t,o));if(!a)throw new Error(`no ref matches "${o}". Available: ${n.map(t=>t.selectorHint||`${t.role}:${t.name}`).join(", ")||"(none)"}`);return `@${a.ref}`}}},y=(r,n,o={})=>{let a=o.onAction??(()=>{}),t=async(e,s)=>{if(n.abortReason!==null&&!n.inTeardown){let l=`[skeptic] aborted: ${n.abortReason}`;throw a({label:e,status:"failed",error:l}),new Error(l)}let c=performance.now();a({label:e,status:"started"});try{let l=await s();return a({label:e,status:"completed",durationMs:Math.round(performance.now()-c)}),l}catch(l){throw a({label:e,status:"failed",durationMs:Math.round(performance.now()-c),error:l instanceof Error?l.message:String(l)}),l}},i=e=>e.startsWith("@")?r.resolveRef(e.slice(1)):r.resolveSelector(e),g=async e=>{let s=await r.screenshot(e);return n.addScreenshot(s.path),s};return {device:{open:e=>t("device.open",()=>r.open(e)),snapshot:()=>t("snapshot",async()=>v(await r.snapshot())),click:e=>t("proxy.click",async()=>(await i(e)).click()),tap:e=>t("proxy.tap",async()=>(await i(e)).click()),fill:(e,s)=>t("proxy.fill",async()=>(await i(e)).fill(s)),type:(e,s)=>t("proxy.type",async()=>(await i(e)).type(s)),press:(e,s)=>t("proxy.press",async()=>(await i(e)).press(s)),hover:e=>t("proxy.hover",async()=>(await i(e)).hover()),check:e=>t("proxy.check",async()=>(await i(e)).check()),uncheck:e=>t("proxy.uncheck",async()=>(await i(e)).uncheck()),select:(e,s)=>t("proxy.selectOption",async()=>(await i(e)).selectOption(s)),scroll:e=>t("proxy.scroll",async()=>typeof e=="string"?(await i(e)).scrollIntoView():r.scroll(e??{})),screenshot:e=>t("screenshot",async()=>(await g(e)).path),is:(e,s)=>t(`device.is.${e}`,async()=>{let c=await i(s);return e==="visible"?c.isVisible():e==="enabled"?c.isEnabled():c.isChecked()}),get:(e,s)=>t(`device.get.${e}`,async()=>{let c=await i(s);return e==="value"?c.inputValue():c.textContent()}),wait:e=>t("wait",()=>r.wait(e))},ctx:n,runAction:t,screenshot:e=>t("screenshot",()=>g(e)),page:p("page"),snapshot:p("snapshot"),settle:p("settle"),observability:p("observability")}},h=(r,n)=>new Proxy({},{get(){throw new Error(`the \`${r}\` fixture is only available under --platform ${n}`)},apply(){throw new Error(`the \`${r}\` fixture is only available under --platform ${n}`)}}),p=r=>h(r,"web");export{y as a,h as b};
@@ -0,0 +1,3 @@
1
+ import {createRequire}from'node:module';import {execFile}from'child_process';import {existsSync}from'fs';import {join}from'path';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var m=e=>{let t=[e,process.env.DEVELOPER_DIR,"/Applications/Xcode.app/Contents/Developer","/Applications/Xcode-beta.app/Contents/Developer"];for(let s of t)if(s&&existsSync(`${s}/usr/bin/simctl`))return s},d=(...e)=>e.find(t=>t&&existsSync(t)),D=(e={})=>{let t=m(e.developerDir),s=e.simctlPath??d(t?`${t}/usr/bin/simctl`:void 0)??"simctl",l=P(e.axePath),n=e.timeoutMs??3e4,r={...process.env,...t?{DEVELOPER_DIR:t}:{}},a=(o,i,f)=>new Promise((g,x)=>{execFile(o,i,{timeout:f??n,maxBuffer:64*1024*1024,encoding:"utf8",env:r},(p,v,u)=>{if(p){x(new Error(`${o} ${i.join(" ")} failed: ${p.message}${u?` \u2014 ${String(u).slice(0,400)}`:""}`));return}g(v);});});return {simctl:(o,i)=>a(s,o,i),axe:(o,i)=>a(l,o,i)}},A=async(e={})=>{let s=await D(e).simctl(["list","devices","booted","-j"]).catch(()=>"");if(!s)return [];try{let l=JSON.parse(s),n=[];for(let[r,a]of Object.entries(l.devices??{}))for(let o of a)o.state==="Booted"&&n.push({udid:o.udid,name:o.name,state:o.state,runtime:r.split(".").pop()??r});return n}catch{return []}},P=e=>e??d("/opt/homebrew/bin/axe","/usr/local/bin/axe")??"axe",w=e=>(process.env.PATH??"").split(":").some(t=>t&&existsSync(join(t,e))),E=e=>e?existsSync(e):d("/opt/homebrew/bin/axe","/usr/local/bin/axe")!==void 0||w("axe"),y=()=>process.platform==="darwin"&&m()!==void 0,R=(e={})=>{if(process.platform!=="darwin")throw new Error("[ios-sim] --platform ios-sim is macOS-only.");if(!m(e.developerDir))throw new Error("[ios-sim] no full Xcode found \u2014 --platform ios-sim needs Xcode (Command Line Tools lack simctl). Install Xcode, then `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer` or set DEVELOPER_DIR.");if(!E(e.axePath))throw new Error("[ios-sim] the `axe` tool is required for iOS UI automation but isn't installed. Install it: `brew install cameroncooke/axe/axe` (`skeptic doctor` checks this).")};export{m as a,D as b,A as c,P as d,E as e,y as f,R as g};
@@ -0,0 +1,3 @@
1
+ import {createRequire}from'node:module';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var t="skeptic",e="skeptic";var c="skeptic.config.yaml",o="./skeptic-output";export{t as a,e as b,c,o as d};
@@ -0,0 +1,3 @@
1
+ import {createRequire}from'node:module';import {d as d$1}from'./chunk-ZN6MI2TU.mjs';import {b,a,d}from'./chunk-2YKSIUIN.mjs';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var U=b((oi,re)=>{var tt=a("util"),ie=a("stream"),I=re.exports=function(){ie.call(this),this._buffers=[],this._buffered=0,this._reads=[],this._paused=false,this._encoding="utf8",this.writable=true;};tt.inherits(I,ie);I.prototype.read=function(e,t){this._reads.push({length:Math.abs(e),allowLess:e<0,func:t}),process.nextTick(function(){this._process(),this._paused&&this._reads&&this._reads.length>0&&(this._paused=false,this.emit("drain"));}.bind(this));};I.prototype.write=function(e,t){if(!this.writable)return this.emit("error",new Error("Stream not writable")),false;let i;return Buffer.isBuffer(e)?i=e:i=Buffer.from(e,t||this._encoding),this._buffers.push(i),this._buffered+=i.length,this._process(),this._reads&&this._reads.length===0&&(this._paused=true),this.writable&&!this._paused};I.prototype.end=function(e,t){e&&this.write(e,t),this.writable=false,this._buffers&&(this._buffers.length===0?this._end():(this._buffers.push(null),this._process()));};I.prototype.destroySoon=I.prototype.end;I.prototype._end=function(){this._reads.length>0&&this.emit("error",new Error("Unexpected end of input")),this.destroy();};I.prototype.destroy=function(){this._buffers&&(this.writable=false,this._reads=null,this._buffers=null,this.emit("close"));};I.prototype._processReadAllowingLess=function(e){this._reads.shift();let t=this._buffers[0];t.length>e.length?(this._buffered-=e.length,this._buffers[0]=t.slice(e.length),e.func.call(this,t.slice(0,e.length))):(this._buffered-=t.length,this._buffers.shift(),e.func.call(this,t));};I.prototype._processRead=function(e){this._reads.shift();let t=0,i=0,r=Buffer.alloc(e.length);for(;t<e.length;){let l=this._buffers[i++],n=Math.min(l.length,e.length-t);l.copy(r,t,0,n),t+=n,n!==l.length&&(this._buffers[--i]=l.slice(n));}i>0&&this._buffers.splice(0,i),this._buffered-=e.length,e.func.call(this,r);};I.prototype._process=function(){try{for(;this._buffered>0&&this._reads&&this._reads.length>0;){let e=this._reads[0];if(e.allowLess)this._processReadAllowingLess(e);else if(this._buffered>=e.length)this._processRead(e);else break}this._buffers&&!this.writable&&this._end();}catch(e){this.emit("error",e);}};});var D=b(F=>{var A=[{x:[0],y:[0]},{x:[4],y:[0]},{x:[0,4],y:[4]},{x:[2,6],y:[0,4]},{x:[0,2,4,6],y:[2,6]},{x:[1,3,5,7],y:[0,2,4,6]},{x:[0,1,2,3,4,5,6,7],y:[1,3,5,7]}];F.getImagePasses=function(e,t){let i=[],r=e%8,l=t%8,n=(e-r)/8,s=(t-l)/8;for(let h=0;h<A.length;h++){let o=A[h],a=n*o.x.length,f=s*o.y.length;for(let u=0;u<o.x.length&&o.x[u]<r;u++)a++;for(let u=0;u<o.y.length&&o.y[u]<l;u++)f++;a>0&&f>0&&i.push({width:a,height:f,index:h});}return i};F.getInterlaceIterator=function(e){return function(t,i,r){let l=t%A[r].x.length,n=(t-l)/A[r].x.length*8+A[r].x[l],s=i%A[r].y.length,h=(i-s)/A[r].y.length*8+A[r].y[s];return n*4+h*e*4}};});var v=b((fi,ne)=>{ne.exports=function(t,i,r){let l=t+i-r,n=Math.abs(l-t),s=Math.abs(l-i),h=Math.abs(l-r);return n<=s&&n<=h?t:s<=h?i:r};});var G=b((ui,se)=>{var it=D(),rt=v();function le(e,t,i){let r=e*t;return i!==8&&(r=Math.ceil(r/(8/i))),r}var P=se.exports=function(e,t){let i=e.width,r=e.height,l=e.interlace,n=e.bpp,s=e.depth;if(this.read=t.read,this.write=t.write,this.complete=t.complete,this._imageIndex=0,this._images=[],l){let h=it.getImagePasses(i,r);for(let o=0;o<h.length;o++)this._images.push({byteWidth:le(h[o].width,n,s),height:h[o].height,lineIndex:0});}else this._images.push({byteWidth:le(i,n,s),height:r,lineIndex:0});s===8?this._xComparison=n:s===16?this._xComparison=n*2:this._xComparison=1;};P.prototype.start=function(){this.read(this._images[this._imageIndex].byteWidth+1,this._reverseFilterLine.bind(this));};P.prototype._unFilterType1=function(e,t,i){let r=this._xComparison,l=r-1;for(let n=0;n<i;n++){let s=e[1+n],h=n>l?t[n-r]:0;t[n]=s+h;}};P.prototype._unFilterType2=function(e,t,i){let r=this._lastLine;for(let l=0;l<i;l++){let n=e[1+l],s=r?r[l]:0;t[l]=n+s;}};P.prototype._unFilterType3=function(e,t,i){let r=this._xComparison,l=r-1,n=this._lastLine;for(let s=0;s<i;s++){let h=e[1+s],o=n?n[s]:0,a=s>l?t[s-r]:0,f=Math.floor((a+o)/2);t[s]=h+f;}};P.prototype._unFilterType4=function(e,t,i){let r=this._xComparison,l=r-1,n=this._lastLine;for(let s=0;s<i;s++){let h=e[1+s],o=n?n[s]:0,a=s>l?t[s-r]:0,f=s>l&&n?n[s-r]:0,u=rt(a,o,f);t[s]=h+u;}};P.prototype._reverseFilterLine=function(e){let t=e[0],i,r=this._images[this._imageIndex],l=r.byteWidth;if(t===0)i=e.slice(1,l+1);else switch(i=Buffer.alloc(l),t){case 1:this._unFilterType1(e,i,l);break;case 2:this._unFilterType2(e,i,l);break;case 3:this._unFilterType3(e,i,l);break;case 4:this._unFilterType4(e,i,l);break;default:throw new Error("Unrecognised filter type - "+t)}this.write(i),r.lineIndex++,r.lineIndex>=r.height?(this._lastLine=null,this._imageIndex++,r=this._images[this._imageIndex]):this._lastLine=i,r?this.read(r.byteWidth+1,this._reverseFilterLine.bind(this)):(this._lastLine=null,this.complete());};});var ae=b((ci,oe)=>{var nt=a("util"),he=U(),lt=G(),st=oe.exports=function(e){he.call(this);let t=[],i=this;this._filter=new lt(e,{read:this.read.bind(this),write:function(r){t.push(r);},complete:function(){i.emit("complete",Buffer.concat(t));}}),this._filter.start();};nt.inherits(st,he);});var M=b((_i,fe)=>{fe.exports={PNG_SIGNATURE:[137,80,78,71,13,10,26,10],TYPE_IHDR:1229472850,TYPE_IEND:1229278788,TYPE_IDAT:1229209940,TYPE_PLTE:1347179589,TYPE_tRNS:1951551059,TYPE_gAMA:1732332865,COLORTYPE_GRAYSCALE:0,COLORTYPE_PALETTE:1,COLORTYPE_COLOR:2,COLORTYPE_ALPHA:4,COLORTYPE_PALETTE_COLOR:3,COLORTYPE_COLOR_ALPHA:6,COLORTYPE_TO_BPP_MAP:{0:1,2:3,3:1,4:2,6:4},GAMMA_DIVISION:1e5};});var j=b((pi,ue)=>{var z=[];(function(){for(let e=0;e<256;e++){let t=e;for(let i=0;i<8;i++)t&1?t=3988292384^t>>>1:t=t>>>1;z[e]=t;}})();var V=ue.exports=function(){this._crc=-1;};V.prototype.write=function(e){for(let t=0;t<e.length;t++)this._crc=z[(this._crc^e[t])&255]^this._crc>>>8;return true};V.prototype.crc32=function(){return this._crc^-1};V.crc32=function(e){let t=-1;for(let i=0;i<e.length;i++)t=z[(t^e[i])&255]^t>>>8;return t^-1};});var Z=b((di,ce)=>{var y=M(),ht=j(),w=ce.exports=function(e,t){this._options=e,e.checkCRC=e.checkCRC!==false,this._hasIHDR=false,this._hasIEND=false,this._emittedHeadersFinished=false,this._palette=[],this._colorType=0,this._chunks={},this._chunks[y.TYPE_IHDR]=this._handleIHDR.bind(this),this._chunks[y.TYPE_IEND]=this._handleIEND.bind(this),this._chunks[y.TYPE_IDAT]=this._handleIDAT.bind(this),this._chunks[y.TYPE_PLTE]=this._handlePLTE.bind(this),this._chunks[y.TYPE_tRNS]=this._handleTRNS.bind(this),this._chunks[y.TYPE_gAMA]=this._handleGAMA.bind(this),this.read=t.read,this.error=t.error,this.metadata=t.metadata,this.gamma=t.gamma,this.transColor=t.transColor,this.palette=t.palette,this.parsed=t.parsed,this.inflateData=t.inflateData,this.finished=t.finished,this.simpleTransparency=t.simpleTransparency,this.headersFinished=t.headersFinished||function(){};};w.prototype.start=function(){this.read(y.PNG_SIGNATURE.length,this._parseSignature.bind(this));};w.prototype._parseSignature=function(e){let t=y.PNG_SIGNATURE;for(let i=0;i<t.length;i++)if(e[i]!==t[i]){this.error(new Error("Invalid file signature"));return}this.read(8,this._parseChunkBegin.bind(this));};w.prototype._parseChunkBegin=function(e){let t=e.readUInt32BE(0),i=e.readUInt32BE(4),r="";for(let n=4;n<8;n++)r+=String.fromCharCode(e[n]);let l=!!(e[4]&32);if(!this._hasIHDR&&i!==y.TYPE_IHDR){this.error(new Error("Expected IHDR on beggining"));return}if(this._crc=new ht,this._crc.write(Buffer.from(r)),this._chunks[i])return this._chunks[i](t);if(!l){this.error(new Error("Unsupported critical chunk type "+r));return}this.read(t+4,this._skipChunk.bind(this));};w.prototype._skipChunk=function(){this.read(8,this._parseChunkBegin.bind(this));};w.prototype._handleChunkEnd=function(){this.read(4,this._parseChunkEnd.bind(this));};w.prototype._parseChunkEnd=function(e){let t=e.readInt32BE(0),i=this._crc.crc32();if(this._options.checkCRC&&i!==t){this.error(new Error("Crc error - "+t+" - "+i));return}this._hasIEND||this.read(8,this._parseChunkBegin.bind(this));};w.prototype._handleIHDR=function(e){this.read(e,this._parseIHDR.bind(this));};w.prototype._parseIHDR=function(e){this._crc.write(e);let t=e.readUInt32BE(0),i=e.readUInt32BE(4),r=e[8],l=e[9],n=e[10],s=e[11],h=e[12];if(r!==8&&r!==4&&r!==2&&r!==1&&r!==16){this.error(new Error("Unsupported bit depth "+r));return}if(!(l in y.COLORTYPE_TO_BPP_MAP)){this.error(new Error("Unsupported color type"));return}if(n!==0){this.error(new Error("Unsupported compression method"));return}if(s!==0){this.error(new Error("Unsupported filter method"));return}if(h!==0&&h!==1){this.error(new Error("Unsupported interlace method"));return}this._colorType=l;let o=y.COLORTYPE_TO_BPP_MAP[this._colorType];this._hasIHDR=true,this.metadata({width:t,height:i,depth:r,interlace:!!h,palette:!!(l&y.COLORTYPE_PALETTE),color:!!(l&y.COLORTYPE_COLOR),alpha:!!(l&y.COLORTYPE_ALPHA),bpp:o,colorType:l}),this._handleChunkEnd();};w.prototype._handlePLTE=function(e){this.read(e,this._parsePLTE.bind(this));};w.prototype._parsePLTE=function(e){this._crc.write(e);let t=Math.floor(e.length/3);for(let i=0;i<t;i++)this._palette.push([e[i*3],e[i*3+1],e[i*3+2],255]);this.palette(this._palette),this._handleChunkEnd();};w.prototype._handleTRNS=function(e){this.simpleTransparency(),this.read(e,this._parseTRNS.bind(this));};w.prototype._parseTRNS=function(e){if(this._crc.write(e),this._colorType===y.COLORTYPE_PALETTE_COLOR){if(this._palette.length===0){this.error(new Error("Transparency chunk must be after palette"));return}if(e.length>this._palette.length){this.error(new Error("More transparent colors than palette size"));return}for(let t=0;t<e.length;t++)this._palette[t][3]=e[t];this.palette(this._palette);}this._colorType===y.COLORTYPE_GRAYSCALE&&this.transColor([e.readUInt16BE(0)]),this._colorType===y.COLORTYPE_COLOR&&this.transColor([e.readUInt16BE(0),e.readUInt16BE(2),e.readUInt16BE(4)]),this._handleChunkEnd();};w.prototype._handleGAMA=function(e){this.read(e,this._parseGAMA.bind(this));};w.prototype._parseGAMA=function(e){this._crc.write(e),this.gamma(e.readUInt32BE(0)/y.GAMMA_DIVISION),this._handleChunkEnd();};w.prototype._handleIDAT=function(e){this._emittedHeadersFinished||(this._emittedHeadersFinished=true,this.headersFinished()),this.read(-e,this._parseIDAT.bind(this,e));};w.prototype._parseIDAT=function(e,t){if(this._crc.write(t),this._colorType===y.COLORTYPE_PALETTE_COLOR&&this._palette.length===0)throw new Error("Expected palette not found");this.inflateData(t);let i=e-t.length;i>0?this._handleIDAT(i):this._handleChunkEnd();};w.prototype._handleIEND=function(e){this.read(e,this._parseIEND.bind(this));};w.prototype._parseIEND=function(e){this._crc.write(e),this._hasIEND=true,this._handleChunkEnd(),this.finished&&this.finished();};});var W=b(pe=>{var _e=D(),ot=[function(){},function(e,t,i,r){if(r===t.length)throw new Error("Ran out of data");let l=t[r];e[i]=l,e[i+1]=l,e[i+2]=l,e[i+3]=255;},function(e,t,i,r){if(r+1>=t.length)throw new Error("Ran out of data");let l=t[r];e[i]=l,e[i+1]=l,e[i+2]=l,e[i+3]=t[r+1];},function(e,t,i,r){if(r+2>=t.length)throw new Error("Ran out of data");e[i]=t[r],e[i+1]=t[r+1],e[i+2]=t[r+2],e[i+3]=255;},function(e,t,i,r){if(r+3>=t.length)throw new Error("Ran out of data");e[i]=t[r],e[i+1]=t[r+1],e[i+2]=t[r+2],e[i+3]=t[r+3];}],at=[function(){},function(e,t,i,r){let l=t[0];e[i]=l,e[i+1]=l,e[i+2]=l,e[i+3]=r;},function(e,t,i){let r=t[0];e[i]=r,e[i+1]=r,e[i+2]=r,e[i+3]=t[1];},function(e,t,i,r){e[i]=t[0],e[i+1]=t[1],e[i+2]=t[2],e[i+3]=r;},function(e,t,i){e[i]=t[0],e[i+1]=t[1],e[i+2]=t[2],e[i+3]=t[3];}];function ft(e,t){let i=[],r=0;function l(){if(r===e.length)throw new Error("Ran out of data");let n=e[r];r++;let s,h,o,a,f,u,c,p;switch(t){default:throw new Error("unrecognised depth");case 16:c=e[r],r++,i.push((n<<8)+c);break;case 4:c=n&15,p=n>>4,i.push(p,c);break;case 2:f=n&3,u=n>>2&3,c=n>>4&3,p=n>>6&3,i.push(p,c,u,f);break;case 1:s=n&1,h=n>>1&1,o=n>>2&1,a=n>>3&1,f=n>>4&1,u=n>>5&1,c=n>>6&1,p=n>>7&1,i.push(p,c,u,f,a,o,h,s);break}}return {get:function(n){for(;i.length<n;)l();let s=i.slice(0,n);return i=i.slice(n),s},resetAfterLine:function(){i.length=0;},end:function(){if(r!==e.length)throw new Error("extra data found")}}}function ut(e,t,i,r,l,n){let s=e.width,h=e.height,o=e.index;for(let a=0;a<h;a++)for(let f=0;f<s;f++){let u=i(f,a,o);ot[r](t,l,u,n),n+=r;}return n}function ct(e,t,i,r,l,n){let s=e.width,h=e.height,o=e.index;for(let a=0;a<h;a++){for(let f=0;f<s;f++){let u=l.get(r),c=i(f,a,o);at[r](t,u,c,n);}l.resetAfterLine();}}pe.dataToBitMap=function(e,t){let i=t.width,r=t.height,l=t.depth,n=t.bpp,s=t.interlace,h;l!==8&&(h=ft(e,l));let o;l<=8?o=Buffer.alloc(i*r*4):o=new Uint16Array(i*r*4);let a=Math.pow(2,l)-1,f=0,u,c;if(s)u=_e.getImagePasses(i,r),c=_e.getInterlaceIterator(i,r);else {let p=0;c=function(){let d=p;return p+=4,d},u=[{width:i,height:r}];}for(let p=0;p<u.length;p++)l===8?f=ut(u[p],o,c,n,e,f):ct(u[p],o,c,n,h,a);if(l===8){if(f!==e.length)throw new Error("extra data found")}else h.end();return o};});var $=b((bi,de)=>{function _t(e,t,i,r,l){let n=0;for(let s=0;s<r;s++)for(let h=0;h<i;h++){let o=l[e[n]];if(!o)throw new Error("index "+e[n]+" not in palette");for(let a=0;a<4;a++)t[n+a]=o[a];n+=4;}}function pt(e,t,i,r,l){let n=0;for(let s=0;s<r;s++)for(let h=0;h<i;h++){let o=false;if(l.length===1?l[0]===e[n]&&(o=true):l[0]===e[n]&&l[1]===e[n+1]&&l[2]===e[n+2]&&(o=true),o)for(let a=0;a<4;a++)t[n+a]=0;n+=4;}}function dt(e,t,i,r,l){let n=255,s=Math.pow(2,l)-1,h=0;for(let o=0;o<r;o++)for(let a=0;a<i;a++){for(let f=0;f<4;f++)t[h+f]=Math.floor(e[h+f]*n/s+.5);h+=4;}}de.exports=function(e,t,i=false){let r=t.depth,l=t.width,n=t.height,s=t.colorType,h=t.transColor,o=t.palette,a=e;return s===3?_t(e,a,l,n,o):(h&&pt(e,a,l,n,h),r!==8&&!i&&(r===16&&(a=Buffer.alloc(l*n*4)),dt(e,a,l,n,r))),a};});var ge=b((gi,be)=>{var mt=a("util"),K=a("zlib"),me=U(),bt=ae(),gt=Z(),yt=W(),wt=$(),k=be.exports=function(e){me.call(this),this._parser=new gt(e,{read:this.read.bind(this),error:this._handleError.bind(this),metadata:this._handleMetaData.bind(this),gamma:this.emit.bind(this,"gamma"),palette:this._handlePalette.bind(this),transColor:this._handleTransColor.bind(this),finished:this._finished.bind(this),inflateData:this._inflateData.bind(this),simpleTransparency:this._simpleTransparency.bind(this),headersFinished:this._headersFinished.bind(this)}),this._options=e,this.writable=true,this._parser.start();};mt.inherits(k,me);k.prototype._handleError=function(e){this.emit("error",e),this.writable=false,this.destroy(),this._inflate&&this._inflate.destroy&&this._inflate.destroy(),this._filter&&(this._filter.destroy(),this._filter.on("error",function(){})),this.errord=true;};k.prototype._inflateData=function(e){if(!this._inflate)if(this._bitmapInfo.interlace)this._inflate=K.createInflate(),this._inflate.on("error",this.emit.bind(this,"error")),this._filter.on("complete",this._complete.bind(this)),this._inflate.pipe(this._filter);else {let i=((this._bitmapInfo.width*this._bitmapInfo.bpp*this._bitmapInfo.depth+7>>3)+1)*this._bitmapInfo.height,r=Math.max(i,K.Z_MIN_CHUNK);this._inflate=K.createInflate({chunkSize:r});let l=i,n=this.emit.bind(this,"error");this._inflate.on("error",function(h){l&&n(h);}),this._filter.on("complete",this._complete.bind(this));let s=this._filter.write.bind(this._filter);this._inflate.on("data",function(h){l&&(h.length>l&&(h=h.slice(0,l)),l-=h.length,s(h));}),this._inflate.on("end",this._filter.end.bind(this._filter));}this._inflate.write(e);};k.prototype._handleMetaData=function(e){this._metaData=e,this._bitmapInfo=Object.create(e),this._filter=new bt(this._bitmapInfo);};k.prototype._handleTransColor=function(e){this._bitmapInfo.transColor=e;};k.prototype._handlePalette=function(e){this._bitmapInfo.palette=e;};k.prototype._simpleTransparency=function(){this._metaData.alpha=true;};k.prototype._headersFinished=function(){this.emit("metadata",this._metaData);};k.prototype._finished=function(){this.errord||(this._inflate?this._inflate.end():this.emit("error","No Inflate block"));};k.prototype._complete=function(e){if(this.errord)return;let t;try{let i=yt.dataToBitMap(e,this._bitmapInfo);t=wt(i,this._bitmapInfo,this._options.skipRescale),i=null;}catch(i){this._handleError(i);return}this.emit("parsed",t);};});var we=b((yi,ye)=>{var L=M();ye.exports=function(e,t,i,r){let l=[L.COLORTYPE_COLOR_ALPHA,L.COLORTYPE_ALPHA].indexOf(r.colorType)!==-1;if(r.colorType===r.inputColorType){let d=(function(){let b=new ArrayBuffer(2);return new DataView(b).setInt16(0,256,true),new Int16Array(b)[0]!==256})();if(r.bitDepth===8||r.bitDepth===16&&d)return e}let n=r.bitDepth!==16?e:new Uint16Array(e.buffer),s=255,h=L.COLORTYPE_TO_BPP_MAP[r.inputColorType];h===4&&!r.inputHasAlpha&&(h=3);let o=L.COLORTYPE_TO_BPP_MAP[r.colorType];r.bitDepth===16&&(s=65535,o*=2);let a=Buffer.alloc(t*i*o),f=0,u=0,c=r.bgColor||{};c.red===void 0&&(c.red=s),c.green===void 0&&(c.green=s),c.blue===void 0&&(c.blue=s);function p(){let d,b,_,m=s;switch(r.inputColorType){case L.COLORTYPE_COLOR_ALPHA:m=n[f+3],d=n[f],b=n[f+1],_=n[f+2];break;case L.COLORTYPE_COLOR:d=n[f],b=n[f+1],_=n[f+2];break;case L.COLORTYPE_ALPHA:m=n[f+1],d=n[f],b=d,_=d;break;case L.COLORTYPE_GRAYSCALE:d=n[f],b=d,_=d;break;default:throw new Error("input color type:"+r.inputColorType+" is not supported at present")}return r.inputHasAlpha&&(l||(m/=s,d=Math.min(Math.max(Math.round((1-m)*c.red+m*d),0),s),b=Math.min(Math.max(Math.round((1-m)*c.green+m*b),0),s),_=Math.min(Math.max(Math.round((1-m)*c.blue+m*_),0),s))),{red:d,green:b,blue:_,alpha:m}}for(let d=0;d<i;d++)for(let b=0;b<t;b++){let _=p();switch(r.colorType){case L.COLORTYPE_COLOR_ALPHA:case L.COLORTYPE_COLOR:r.bitDepth===8?(a[u]=_.red,a[u+1]=_.green,a[u+2]=_.blue,l&&(a[u+3]=_.alpha)):(a.writeUInt16BE(_.red,u),a.writeUInt16BE(_.green,u+2),a.writeUInt16BE(_.blue,u+4),l&&a.writeUInt16BE(_.alpha,u+6));break;case L.COLORTYPE_ALPHA:case L.COLORTYPE_GRAYSCALE:{let m=(_.red+_.green+_.blue)/3;r.bitDepth===8?(a[u]=m,l&&(a[u+1]=_.alpha)):(a.writeUInt16BE(m,u),l&&a.writeUInt16BE(_.alpha,u+2));break}default:throw new Error("unrecognised color Type "+r.colorType)}f+=h,u+=o;}return a};});var Ce=b((wi,Te)=>{var Ee=v();function Et(e,t,i,r,l){for(let n=0;n<i;n++)r[l+n]=e[t+n];}function Tt(e,t,i){let r=0,l=t+i;for(let n=t;n<l;n++)r+=Math.abs(e[n]);return r}function Ct(e,t,i,r,l,n){for(let s=0;s<i;s++){let h=s>=n?e[t+s-n]:0,o=e[t+s]-h;r[l+s]=o;}}function Ot(e,t,i,r){let l=0;for(let n=0;n<i;n++){let s=n>=r?e[t+n-r]:0,h=e[t+n]-s;l+=Math.abs(h);}return l}function Lt(e,t,i,r,l){for(let n=0;n<i;n++){let s=t>0?e[t+n-i]:0,h=e[t+n]-s;r[l+n]=h;}}function It(e,t,i){let r=0,l=t+i;for(let n=t;n<l;n++){let s=t>0?e[n-i]:0,h=e[n]-s;r+=Math.abs(h);}return r}function kt(e,t,i,r,l,n){for(let s=0;s<i;s++){let h=s>=n?e[t+s-n]:0,o=t>0?e[t+s-i]:0,a=e[t+s]-(h+o>>1);r[l+s]=a;}}function At(e,t,i,r){let l=0;for(let n=0;n<i;n++){let s=n>=r?e[t+n-r]:0,h=t>0?e[t+n-i]:0,o=e[t+n]-(s+h>>1);l+=Math.abs(o);}return l}function Rt(e,t,i,r,l,n){for(let s=0;s<i;s++){let h=s>=n?e[t+s-n]:0,o=t>0?e[t+s-i]:0,a=t>0&&s>=n?e[t+s-(i+n)]:0,f=e[t+s]-Ee(h,o,a);r[l+s]=f;}}function St(e,t,i,r){let l=0;for(let n=0;n<i;n++){let s=n>=r?e[t+n-r]:0,h=t>0?e[t+n-i]:0,o=t>0&&n>=r?e[t+n-(i+r)]:0,a=e[t+n]-Ee(s,h,o);l+=Math.abs(a);}return l}var Bt={0:Et,1:Ct,2:Lt,3:kt,4:Rt},Pt={0:Tt,1:Ot,2:It,3:At,4:St};Te.exports=function(e,t,i,r,l){let n;if(!("filterType"in r)||r.filterType===-1)n=[0,1,2,3,4];else if(typeof r.filterType=="number")n=[r.filterType];else throw new Error("unrecognised filter types");r.bitDepth===16&&(l*=2);let s=t*l,h=0,o=0,a=Buffer.alloc((s+1)*i),f=n[0];for(let u=0;u<i;u++){if(n.length>1){let c=1/0;for(let p=0;p<n.length;p++){let d=Pt[n[p]](e,o,s,l);d<c&&(f=n[p],c=d);}}a[h]=f,h++,Bt[f](e,o,s,a,h,l),h+=s,o+=s;}return a};});var J=b((Ei,Oe)=>{var C=M(),Mt=j(),xt=we(),Yt=Ce(),qt=a("zlib"),R=Oe.exports=function(e){if(this._options=e,e.deflateChunkSize=e.deflateChunkSize||32*1024,e.deflateLevel=e.deflateLevel!=null?e.deflateLevel:9,e.deflateStrategy=e.deflateStrategy!=null?e.deflateStrategy:3,e.inputHasAlpha=e.inputHasAlpha!=null?e.inputHasAlpha:true,e.deflateFactory=e.deflateFactory||qt.createDeflate,e.bitDepth=e.bitDepth||8,e.colorType=typeof e.colorType=="number"?e.colorType:C.COLORTYPE_COLOR_ALPHA,e.inputColorType=typeof e.inputColorType=="number"?e.inputColorType:C.COLORTYPE_COLOR_ALPHA,[C.COLORTYPE_GRAYSCALE,C.COLORTYPE_COLOR,C.COLORTYPE_COLOR_ALPHA,C.COLORTYPE_ALPHA].indexOf(e.colorType)===-1)throw new Error("option color type:"+e.colorType+" is not supported at present");if([C.COLORTYPE_GRAYSCALE,C.COLORTYPE_COLOR,C.COLORTYPE_COLOR_ALPHA,C.COLORTYPE_ALPHA].indexOf(e.inputColorType)===-1)throw new Error("option input color type:"+e.inputColorType+" is not supported at present");if(e.bitDepth!==8&&e.bitDepth!==16)throw new Error("option bit depth:"+e.bitDepth+" is not supported at present")};R.prototype.getDeflateOptions=function(){return {chunkSize:this._options.deflateChunkSize,level:this._options.deflateLevel,strategy:this._options.deflateStrategy}};R.prototype.createDeflate=function(){return this._options.deflateFactory(this.getDeflateOptions())};R.prototype.filterData=function(e,t,i){let r=xt(e,t,i,this._options),l=C.COLORTYPE_TO_BPP_MAP[this._options.colorType];return Yt(r,t,i,this._options,l)};R.prototype._packChunk=function(e,t){let i=t?t.length:0,r=Buffer.alloc(i+12);return r.writeUInt32BE(i,0),r.writeUInt32BE(e,4),t&&t.copy(r,8),r.writeInt32BE(Mt.crc32(r.slice(4,r.length-4)),r.length-4),r};R.prototype.packGAMA=function(e){let t=Buffer.alloc(4);return t.writeUInt32BE(Math.floor(e*C.GAMMA_DIVISION),0),this._packChunk(C.TYPE_gAMA,t)};R.prototype.packIHDR=function(e,t){let i=Buffer.alloc(13);return i.writeUInt32BE(e,0),i.writeUInt32BE(t,4),i[8]=this._options.bitDepth,i[9]=this._options.colorType,i[10]=0,i[11]=0,i[12]=0,this._packChunk(C.TYPE_IHDR,i)};R.prototype.packIDAT=function(e){return this._packChunk(C.TYPE_IDAT,e)};R.prototype.packIEND=function(){return this._packChunk(C.TYPE_IEND,null)};});var Ae=b((Ti,ke)=>{var Nt=a("util"),Le=a("stream"),Ht=M(),Ut=J(),Ie=ke.exports=function(e){Le.call(this);let t=e||{};this._packer=new Ut(t),this._deflate=this._packer.createDeflate(),this.readable=true;};Nt.inherits(Ie,Le);Ie.prototype.pack=function(e,t,i,r){this.emit("data",Buffer.from(Ht.PNG_SIGNATURE)),this.emit("data",this._packer.packIHDR(t,i)),r&&this.emit("data",this._packer.packGAMA(r));let l=this._packer.filterData(e,t,i);this._deflate.on("error",this.emit.bind(this,"error")),this._deflate.on("data",function(n){this.emit("data",this._packer.packIDAT(n));}.bind(this)),this._deflate.on("end",function(){this.emit("data",this._packer.packIEND()),this.emit("end");}.bind(this)),this._deflate.end(l);};});var xe=b((N,Me)=>{var Re=a("assert").ok,x=a("zlib"),Ft=a("util"),Se=a("buffer").kMaxLength;function B(e){if(!(this instanceof B))return new B(e);e&&e.chunkSize<x.Z_MIN_CHUNK&&(e.chunkSize=x.Z_MIN_CHUNK),x.Inflate.call(this,e),this._offset=this._offset===void 0?this._outOffset:this._offset,this._buffer=this._buffer||this._outBuffer,e&&e.maxLength!=null&&(this._maxLength=e.maxLength);}function Dt(e){return new B(e)}function Be(e,t){e._handle&&(e._handle.close(),e._handle=null);}B.prototype._processChunk=function(e,t,i){if(typeof i=="function")return x.Inflate._processChunk.call(this,e,t,i);let r=this,l=e&&e.length,n=this._chunkSize-this._offset,s=this._maxLength,h=0,o=[],a=0,f;this.on("error",function(d){f=d;});function u(d,b){if(r._hadError)return;let _=n-b;if(Re(_>=0,"have should not go down"),_>0){let m=r._buffer.slice(r._offset,r._offset+_);if(r._offset+=_,m.length>s&&(m=m.slice(0,s)),o.push(m),a+=m.length,s-=m.length,s===0)return false}return (b===0||r._offset>=r._chunkSize)&&(n=r._chunkSize,r._offset=0,r._buffer=Buffer.allocUnsafe(r._chunkSize)),b===0?(h+=l-d,l=d,true):false}Re(this._handle,"zlib binding closed");let c;do c=this._handle.writeSync(t,e,h,l,this._buffer,this._offset,n),c=c||this._writeState;while(!this._hadError&&u(c[0],c[1]));if(this._hadError)throw f;if(a>=Se)throw Be(this),new RangeError("Cannot create final Buffer. It would be larger than 0x"+Se.toString(16)+" bytes");let p=Buffer.concat(o,a);return Be(this),p};Ft.inherits(B,x.Inflate);function vt(e,t){if(typeof t=="string"&&(t=Buffer.from(t)),!(t instanceof Buffer))throw new TypeError("Not a string or buffer");let i=e._finishFlushFlag;return i==null&&(i=x.Z_FINISH),e._processChunk(t,i)}function Pe(e,t){return vt(new B(t),e)}Me.exports=N=Pe;N.Inflate=B;N.createInflate=Dt;N.inflateSync=Pe;});var Q=b((Ci,qe)=>{var Ye=qe.exports=function(e){this._buffer=e,this._reads=[];};Ye.prototype.read=function(e,t){this._reads.push({length:Math.abs(e),allowLess:e<0,func:t});};Ye.prototype.process=function(){for(;this._reads.length>0&&this._buffer.length;){let e=this._reads[0];if(this._buffer.length&&(this._buffer.length>=e.length||e.allowLess)){this._reads.shift();let t=this._buffer;this._buffer=t.slice(e.length),e.func.call(this,t.slice(0,e.length));}else break}if(this._reads.length>0)throw new Error("There are some read requests waitng on finished stream");if(this._buffer.length>0)throw new Error("unrecognised content at end of stream")};});var He=b(Ne=>{var Gt=Q(),zt=G();Ne.process=function(e,t){let i=[],r=new Gt(e);return new zt(t,{read:r.read.bind(r),write:function(n){i.push(n);},complete:function(){}}).start(),r.process(),Buffer.concat(i)};});var ve=b((Li,De)=>{var Ue=true,Fe=a("zlib"),Vt=xe();Fe.deflateSync||(Ue=false);var jt=Q(),Zt=He(),Wt=Z(),$t=W(),Kt=$();De.exports=function(e,t){if(!Ue)throw new Error("To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0");let i;function r(E){i=E;}let l;function n(E){l=E;}function s(E){l.transColor=E;}function h(E){l.palette=E;}function o(){l.alpha=true;}let a;function f(E){a=E;}let u=[];function c(E){u.push(E);}let p=new jt(e);if(new Wt(t,{read:p.read.bind(p),error:r,metadata:n,gamma:f,palette:h,transColor:s,inflateData:c,simpleTransparency:o}).start(),p.process(),i)throw i;let b=Buffer.concat(u);u.length=0;let _;if(l.interlace)_=Fe.inflateSync(b);else {let S=((l.width*l.bpp*l.depth+7>>3)+1)*l.height;_=Vt(b,{chunkSize:S,maxLength:S});}if(b=null,!_||!_.length)throw new Error("bad png - invalid inflate data response");let m=Zt.process(_,l);b=null;let Y=$t.dataToBitMap(m,l);m=null;let q=Kt(Y,l,t.skipRescale);return l.data=q,l.gamma=a||0,l};});var je=b((Ii,Ve)=>{var Ge=true,ze=a("zlib");ze.deflateSync||(Ge=false);var Jt=M(),Qt=J();Ve.exports=function(e,t){if(!Ge)throw new Error("To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0");let i=t||{},r=new Qt(i),l=[];l.push(Buffer.from(Jt.PNG_SIGNATURE)),l.push(r.packIHDR(e.width,e.height)),e.gamma&&l.push(r.packGAMA(e.gamma));let n=r.filterData(e.data,e.width,e.height),s=ze.deflateSync(n,r.getDeflateOptions());if(n=null,!s||!s.length)throw new Error("bad png - invalid compressed data response");return l.push(r.packIDAT(s)),l.push(r.packIEND()),Buffer.concat(l)};});var Ze=b(X=>{var Xt=ve(),ei=je();X.read=function(e,t){return Xt(e,t||{})};X.write=function(e,t){return ei(e,t)};});var Ke=b($e=>{var ti=a("util"),We=a("stream"),ii=ge(),ri=Ae(),ni=Ze(),O=$e.PNG=function(e){We.call(this),e=e||{},this.width=e.width|0,this.height=e.height|0,this.data=this.width>0&&this.height>0?Buffer.alloc(4*this.width*this.height):null,e.fill&&this.data&&this.data.fill(0),this.gamma=0,this.readable=this.writable=true,this._parser=new ii(e),this._parser.on("error",this.emit.bind(this,"error")),this._parser.on("close",this._handleClose.bind(this)),this._parser.on("metadata",this._metadata.bind(this)),this._parser.on("gamma",this._gamma.bind(this)),this._parser.on("parsed",function(t){this.data=t,this.emit("parsed",t);}.bind(this)),this._packer=new ri(e),this._packer.on("data",this.emit.bind(this,"data")),this._packer.on("end",this.emit.bind(this,"end")),this._parser.on("close",this._handleClose.bind(this)),this._packer.on("error",this.emit.bind(this,"error"));};ti.inherits(O,We);O.sync=ni;O.prototype.pack=function(){return !this.data||!this.data.length?(this.emit("error","No data provided"),this):(process.nextTick(function(){this._packer.pack(this.data,this.width,this.height,this.gamma);}.bind(this)),this)};O.prototype.parse=function(e,t){if(t){let i,r;i=function(l){this.removeListener("error",r),this.data=l,t(null,this);}.bind(this),r=function(l){this.removeListener("parsed",i),t(l,null);}.bind(this),this.once("parsed",i),this.once("error",r);}return this.end(e),this};O.prototype.write=function(e){return this._parser.write(e),true};O.prototype.end=function(e){this._parser.end(e);};O.prototype._metadata=function(e){this.width=e.width,this.height=e.height,this.emit("metadata",e);};O.prototype._gamma=function(e){this.gamma=e;};O.prototype._handleClose=function(){!this._parser.writable&&!this._packer.readable&&this.emit("close");};O.bitblt=function(e,t,i,r,l,n,s,h){if(i|=0,r|=0,l|=0,n|=0,s|=0,h|=0,i>e.width||r>e.height||i+l>e.width||r+n>e.height)throw new Error("bitblt reading outside image");if(s>t.width||h>t.height||s+l>t.width||h+n>t.height)throw new Error("bitblt writing outside image");for(let o=0;o<n;o++)e.data.copy(t.data,(h+o)*t.width+s<<2,(r+o)*e.width+i<<2,(r+o)*e.width+i+l<<2);};O.prototype.bitblt=function(e,t,i,r,l,n,s){return O.bitblt(this,e,t,i,r,l,n,s),this};O.adjustGamma=function(e){if(e.gamma){for(let t=0;t<e.height;t++)for(let i=0;i<e.width;i++){let r=e.width*t+i<<2;for(let l=0;l<3;l++){let n=e.data[r+l]/255;n=Math.pow(n,1/2.2/e.gamma),e.data[r+l]=Math.round(n*255);}}e.gamma=0;}};O.prototype.adjustGamma=function(){O.adjustGamma(this);};});var Xe=d(Ke(),1);var Si={enabled:false,networkIdleMs:0,animationFrames:0,pixelStableMs:0,hardCeilingMs:0},Bi={enabled:true,networkIdleMs:500,animationFrames:2,pixelStableMs:0,hardCeilingMs:1500},ee=e=>new Promise(t=>setTimeout(t,e)),Pi=async(e,t,i)=>{if(!i.enabled||t.abortReason!==null||e.isClosed())return;let r=async()=>{if(i.networkIdleMs>0){try{await Promise.race([e.waitForLoadState("networkidle",{timeout:i.networkIdleMs}),ee(i.networkIdleMs)]);}catch{}if(t.abortReason!==null||e.isClosed())return}for(let l=0;l<i.animationFrames;l++){try{await e.evaluate("new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)))");}catch{return}if(t.abortReason!==null||e.isClosed())return}if(i.pixelStableMs>0){let l=Date.now()+i.pixelStableMs,n=null,s=0;for(;Date.now()<l;){if(t.abortReason!==null||e.isClosed())return;try{let h=await e.screenshot({clip:{x:0,y:0,width:256,height:256},type:"png"}),o=hi(h);if(n!==null&&o===n){if(s++,s>=2)return}else s=0;n=o;}catch{return}await ee(50);}}};if(i.hardCeilingMs<=0){await r();return}await Promise.race([r(),ee(i.hardCeilingMs)]);},Je=8*1024,Qe=8,li=4096,Mi=e=>{let t=[],i=e.byteLength,r=i<Je;r&&t.push(`byte size ${i} below floor ${Je}`);let l=false,n=0;try{let s=Xe.PNG.sync.read(e),{width:h,height:o,data:a}=s,f=h*o;if(f>0){let u=Math.max(1,Math.floor(f/li)),c=255,p=0,d=255,b=0,_=255,m=0;for(let Y=0;Y<f;Y+=u){let q=Y*4,E=a[q],S=a[q+1],H=a[q+2];E<c&&(c=E),E>p&&(p=E),S<d&&(d=S),S>b&&(b=S),H<_&&(_=H),H>m&&(m=H);}n=Math.max(p-c,b-d,m-_),l=n<Qe,l&&t.push(`pixel channel range ${n} below threshold ${Qe}`);}}catch(s){d$1.debug(`[visual-settle] PNG decode failed in blank-frame check: ${s instanceof Error?s.message:String(s)}`);}return {blank:r&&l,reasons:t,meta:{byteSize:i,channelRange:n}}},si=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t++){let i=t;for(let r=0;r<8;r++)i=i&1?3988292384^i>>>1:i>>>1;e[t]=i>>>0;}return e})(),hi=e=>{let t=4294967295;for(let i=0;i<e.length;i++)t=si[(t^e[i])&255]^t>>>8;return (t^4294967295)>>>0};export{Si as a,Bi as b,Pi as c,Mi as d};
@@ -0,0 +1,4 @@
1
+ import {createRequire}from'node:module';import {a as a$1}from'./chunk-N3533BCE.mjs';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var f={fullPageScreenshots:false,visualSettle:a$1,blankFrameDetection:"warn",writeSidecars:false},a=class{page;screenshots=[];baseUrl;lastElement=null;testDir;sourceDir;defaultTimeout;activeTimeout;collectors;artifactConfig;ariaRefs=new Map;ariaSnapshotYaml=null;abortReason=null;inTeardown=false;constructor(t,e,r,n,s=3e4,l=[],c=f){this.page=t,this.baseUrl=e,this.testDir=r??".",this.sourceDir=n??process.cwd(),this.defaultTimeout=s,this.activeTimeout=s,this.collectors=new Map(l.map(i=>[i.name,i])),this.artifactConfig=c;}resolveUrl(t){if(/^https?:\/\//.test(t))return t;let e=this.baseUrl.replace(/\/+$/,""),r=t.startsWith("/")?t:`/${t}`;return `${e}${r}`}addScreenshot(t){this.screenshots.push(t);}};
4
+ export{f as a,a as b};
@@ -0,0 +1,10 @@
1
+ import {createRequire}from'node:module';import {b,a,d as d$1,c}from'./chunk-7BFRKEFV.mjs';import {d}from'./chunk-ZN6MI2TU.mjs';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var y=(n,r)=>{let o=new Error(`[ariaRef:${n}] ${JSON.stringify(r)}`);return o.kind=n,o};async function k(n,r,o){let e=o.slice(1);if(!/^e\d+$/.test(e))throw y("invalid_format",{selector:o,ref:e});let t=r.ariaRefs.get(e);if(!t)throw y("not_found",{ref:e,available:[...r.ariaRefs.keys()],hasSnapshot:r.ariaSnapshotYaml!==null});if(t.kind==="cursor-interactive"){if(!t.selectorHint)throw y("invalid_format",{ref:e,reason:"cursor-interactive entry has no selectorHint"});return b(n,t.selectorHint)}let a=n.locator(t.scopeSelector).getByRole(t.role,{name:t.name,exact:true}),i=await a.count();typeof t.matchCountAtSnapshot=="number"&&t.matchCountAtSnapshot>0&&i!==t.matchCountAtSnapshot&&t.nth===0&&d.warn(`[aria-ref] ${e} silently retargeted: snapshot saw ${t.matchCountAtSnapshot} candidate${t.matchCountAtSnapshot===1?"":"s"}, live page has ${i} \u2014 first match may differ.`);let p=a.nth(t.nth);if(i===0||i<=t.nth)throw y("stale",{ref:e,role:t.role,name:t.name,expectedNth:t.nth,actualMatches:i});return p}var $=4,U=async(n,r,o={})=>{let e="context"in n&&typeof n.context=="function"?n:n.page(),t=o.selector??"body",l=o.viewportAware??true,a$1=o.includeCursorInteractive??true,i=await a(e,t,{viewport:l,includeCursorInteractive:a$1,extractLinkHrefs:true}),p=new Map,m=0,h=0;for(let c of i.entries)p.set(c.ref,c),r.ariaRefs.set(c.ref,c),c.kind==="aria"?m++:h++;r.ariaSnapshotYaml=i.yaml;let s=T(i.yaml,i.entries,{interactive:o.interactive??false,compact:o.compact??false,offViewportRefs:i.offViewportRefs}),u=I(s,i.entries),g=async c=>{let f=p.get(c);if(!f)throw new Error(`[skeptic] snapshot ref "${c}" not found. Available: ${[...p.keys()].join(", ")||"(none)"}`);return f.kind==="cursor-interactive"?k(e,r,`@${c}`):e.locator(f.scopeSelector).getByRole(f.role,{name:f.name.length>0?f.name:void 0,exact:true}).nth(f.nth)},d=(c,f={})=>{let S={name:f.name};typeof f.name=="string"&&(S.exact=true);let R=e.getByRole(c,{...S});return f.hrefIncludes!==void 0&&(R=R.and(e.locator(`[href*="${f.hrefIncludes}"]`))),f.index!==void 0?R.nth(f.index):R},v=c=>e.getByText(c),x=c=>e.getByTestId(c);return {yaml:s,rawYaml:i.yaml,refs:p,stats:u,byRef:g,byRole:d,byText:v,byTestId:x,cursorInteractiveCount:h,ariaRefCount:m}},I=(n,r)=>{let o=L(n);return {lines:n.split(`
4
+ `).length,characters:n.length,estimatedTokens:Math.ceil(n.length/$),totalRefs:r.length,renderedRefs:o.size,interactiveRefs:r.filter(d$1).length,renderedInteractiveRefs:r.filter(e=>o.has(e.ref)&&d$1(e)).length,ariaRefs:r.filter(e=>e.kind==="aria").length,cursorInteractiveRefs:r.filter(e=>e.kind==="cursor-interactive").length}},L=n=>new Set([...n.matchAll(/\[ref=(e\d+)\]/g)].map(r=>r[1])),T=(n,r,o)=>{let e=/\[ref=(e\d+)\]/,t=o.offViewportRefs,l=n.split(`
5
+ `),a=[],i=new Map(r.map(s=>[s.ref,s]));for(let s=0;s<l.length;s++){let u=l[s]??"";if(u.length===0&&l.length===1)continue;let g=e.exec(u);if(g&&t?.has(g[1])&&(u=u.replace(`[ref=${g[1]}]`,`[ref=${g[1]}] [off-viewport]`)),a.push(u),g){let d=i.get(g[1]),v=l[s+1]??"",x=u.includes("/url:")||/^\s*-?\s*\/url:/.test(v);if(d?.role==="link"&&d.href&&!x){let c=u.match(/^\s*/)?.[0]??"";a.push(`${c} /url: ${d.href}`);}}}let p=r.filter(s=>s.kind==="cursor-interactive");if(p.length>0)for(let s of p){let u=s.name?` "${H(s.name)}"`:"";a.push(`- ${s.role}${u} [ref=${s.ref}] clickable`);}let m=a.join(`
6
+ `),h=new Set(r.filter(c).map(s=>s.ref));return o.compact?m=_(m,h):o.interactive&&(m=B(m,h)),m},B=(n,r)=>{let o=n.split(`
7
+ `),e=[],t=false;for(let l of o){let a=P(l);if(a&&r.has(a)){e.push(l),t=true;continue}if(t&&/^\s*-?\s*\/url:/.test(l)){e.push(l),t=false;continue}l.trim().length>0&&(t=false);}return e.join(`
8
+ `)},P=n=>/\[ref=(e\d+)\]/.exec(n)?.[1]??null,_=(n,r)=>{let o=n.split(`
9
+ `);if(o.length===0)return "";let e=[],t=false;for(let a of o){let i=P(a);if(i&&r.has(i)){e.push(a.replace(/^\s+/,"")),t=true;continue}if(t&&/^\s*-?\s*\/url:/.test(a)){e.push(` ${a.trim()}`),t=false;continue}a.trim().length>0&&(t=false);}let l=e.join(`
10
+ `).trim();return l.length===0?"(no interactive elements)":l},H=n=>n.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n");export{k as a,U as b,I as c,T as d};
@@ -0,0 +1,10 @@
1
+ import {createRequire}from'node:module';import {d}from'./chunk-ZN6MI2TU.mjs';import {a}from'./chunk-MHNEFL35.mjs';import*as m from'fs';import*as h from'path';import*as y from'os';import {createRequire as createRequire$1}from'module';import {pbkdf2Sync,createDecipheriv,createHash}from'crypto';import {execSync}from'child_process';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var C=null;function S(){return C||(C=createRequire$1(import.meta.url)("better-sqlite3"),C)}var W=Buffer.from("saltysalt"),z=1003,V=16,G=Buffer.alloc(16,32);function O(e){return pbkdf2Sync(e,W,z,V,"sha1")}function _(e,r,o){if(e.length<=3)return "";let i=e.subarray(0,3).toString("ascii");if(i!=="v10"&&i!=="v11")return e.toString("utf-8");let t=e.subarray(3);try{let s=createDecipheriv("aes-128-cbc",r,G),n=Buffer.concat([s.update(t),s.final()]);if(o&&n.length>=32){let f=createHash("sha256").update(o).digest();n.subarray(0,32).equals(f)&&(n=n.subarray(32));}return n.toString("utf-8")}catch{return ""}}function F(e){let o={chrome:"Chrome Safe Storage",edge:"Microsoft Edge Safe Storage",brave:"Brave Safe Storage",arc:"Arc Safe Storage",opera:"Opera Safe Storage",vivaldi:"Vivaldi Safe Storage",chromium:"Chromium Safe Storage"}[e]??"Chrome Safe Storage";try{return execSync(`security find-generic-password -s "${o}" -w`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return ""}}function I(){try{let e=execSync("secret-tool lookup application chrome",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]});if(e.trim())return e.trim()}catch{}return "peanuts"}var M=[{name:"Google Chrome",id:"chrome",darwin:"Google/Chrome",linux:"google-chrome"},{name:"Microsoft Edge",id:"edge",darwin:"Microsoft Edge",linux:"microsoft-edge"},{name:"Brave",id:"brave",darwin:"BraveSoftware/Brave-Browser",linux:"BraveSoftware/Brave-Browser"},{name:"Arc",id:"arc",darwin:"Arc/User Data",linux:"arc"},{name:"Opera",id:"opera",darwin:"com.operasoftware.Opera",linux:"opera"},{name:"Vivaldi",id:"vivaldi",darwin:"Vivaldi",linux:"vivaldi"},{name:"Chromium",id:"chromium",darwin:"Chromium",linux:"chromium"}];function D(){let e=y.platform();if(e!=="darwin"&&e!=="linux")return [];let r=y.homedir(),o=[];for(let i of M){let t=e==="darwin"?h.join(r,"Library","Application Support",i.darwin):h.join(r,".config",i.linux),s=h.join(t,"Default","Cookies");m.existsSync(s)&&o.push({browser:i.name,profilePath:t,platform:e});}return o}function Y(e){let r=e.replace(/^\.+/,"").trim().toLowerCase();if(!r)return [];let o=new Set;o.add(r),o.add(`.${r}`);let i=r.split(".");for(let t=1;t+2<=i.length;t+=1)o.add(`.${i.slice(t).join(".")}`);return [...o]}function $(e,r){let o=h.join(e.profilePath,"Default","Cookies");if(!m.existsSync(o))return {cookies:[],browser:e.browser,profilePath:e.profilePath,error:"Cookies database not found"};let i=h.join(y.tmpdir(),`skeptic-cookies-${Date.now()}-${Math.random().toString(36).slice(2)}.sqlite`);try{m.copyFileSync(o,i);for(let u of ["-wal","-shm"]){let w=o+u;m.existsSync(w)&&m.copyFileSync(w,i+u);}let t=S(),s=new t(i,{readonly:!0}),n=Q(e),f=Y(r);if(f.length===0)return s.close(),{cookies:[],browser:e.browser,profilePath:e.profilePath};let l=f.map(()=>"?").join(", "),c=s.prepare(`SELECT host_key, name, encrypted_value, path, expires_utc, is_secure, is_httponly, samesite
4
+ FROM cookies
5
+ WHERE host_key IN (${l})`).all(...f);s.close();let a=c.map(u=>({name:u.name,value:X(u.encrypted_value,n,u.host_key),domain:u.host_key,path:u.path,expires:Z(u.expires_utc),secure:u.is_secure===1,httpOnly:u.is_httponly===1,sameSite:J[u.samesite]??"Lax"}));return d.debug(`Extracted ${a.length} cookies from ${e.browser}`),{cookies:a,browser:e.browser,profilePath:e.profilePath}}catch(t){return {cookies:[],browser:e.browser,profilePath:e.profilePath,error:t instanceof Error?t.message:String(t)}}finally{for(let t of ["","-wal","-shm"])try{m.unlinkSync(i+t);}catch{}}}var J={[-1]:"None",0:"None",1:"Lax",2:"Strict"};function Q(e){let r=M.find(i=>i.name===e.browser)?.id??"chrome",o=e.platform==="darwin"?F(r):I();return o?O(o):(d.warn(`Could not retrieve encryption key for ${e.browser}. Cookie values may be empty.`),O("peanuts"))}function X(e,r,o){return !e||e.length===0?"":_(e,r,o)}function Z(e){return e===0?-1:Math.round(e/1e6)-11644473600}function L(){let e=y.platform();if(e!=="darwin"&&e!=="linux")return [];let r=y.homedir(),o=e==="darwin"?h.join(r,"Library","Application Support","Firefox","Profiles"):h.join(r,".mozilla","firefox"),i=e==="darwin"?h.join(r,"Library","Application Support","Firefox","profiles.ini"):h.join(r,".mozilla","firefox","profiles.ini");if(!m.existsSync(i))return [];let t=re(i,o);return t?[{browser:"Firefox",profilePath:t,platform:e}]:[]}function j(e,r){let o=h.join(e.profilePath,"cookies.sqlite");if(!m.existsSync(o))return {cookies:[],browser:"Firefox",profilePath:e.profilePath,error:"cookies.sqlite not found"};let i=h.join(y.tmpdir(),`skeptic-ff-cookies-${Date.now()}-${Math.random().toString(36).slice(2)}.sqlite`);try{m.copyFileSync(o,i);for(let c of ["-wal","-shm"]){let a=o+c;m.existsSync(a)&&m.copyFileSync(a,i+c);}let t=S(),s=new t(i,{readonly:!0}),n=r.startsWith(".")?r:`.${r}`,f=s.prepare(`SELECT host, name, value, path, expiry, isSecure, isHttpOnly, sameSite
6
+ FROM moz_cookies
7
+ WHERE host = ? OR host = ?`).all(r,n);s.close();let l=f.map(c=>({name:c.name,value:c.value,domain:c.host,path:c.path,expires:c.expiry,secure:c.isSecure===1,httpOnly:c.isHttpOnly===1,sameSite:ee[c.sameSite]??"None"}));return d.debug(`Extracted ${l.length} cookies from Firefox`),{cookies:l,browser:"Firefox",profilePath:e.profilePath}}catch(t){return {cookies:[],browser:"Firefox",profilePath:e.profilePath,error:t instanceof Error?t.message:String(t)}}finally{for(let t of ["","-wal","-shm"])try{m.unlinkSync(i+t);}catch{}}}var ee={0:"None",1:"Lax",2:"Strict"};function re(e,r){let i=m.readFileSync(e,"utf-8").split(/\[Profile\d+\]/);for(let t of i){let s=t.split(`
8
+ `),n={};for(let f of s){let l=f.indexOf("=");if(l>0){let c=f.slice(0,l).trim(),a=f.slice(l+1).trim();n[c]=a;}}if(n.Default==="1"&&n.Path){let f=n.IsRelative==="1"?h.join(r,n.Path):n.Path;if(m.existsSync(f))return f}}if(m.existsSync(r))try{let t=m.readdirSync(r,{withFileTypes:!0});for(let s of t)if(s.isDirectory()){let n=h.join(r,s.name,"cookies.sqlite");if(m.existsSync(n))return h.join(r,s.name)}}catch{}return null}var oe="Library/Cookies/Cookies.binarycookies";function N(){if(y.platform()!=="darwin")return [];let e=h.join(y.homedir(),oe);return m.existsSync(e)?[{browser:"Safari",profilePath:e,platform:"darwin"}]:[]}function T(e,r){try{let o=m.readFileSync(e.profilePath);if(o.subarray(0,4).toString("ascii")!=="cook")return {cookies:[],browser:"Safari",profilePath:e.profilePath,error:"Invalid binarycookies file (bad magic)"};let t=o.readUInt32BE(4),s=[];for(let a=0;a<t;a++)s.push(o.readUInt32BE(8+a*4));let n=8+t*4,f=[];for(let a=0;a<t;a++){let u=o.subarray(n,n+s[a]),w=te(u);f.push(...w),n+=s[a];}let l=r.startsWith(".")?r.slice(1):r,c=f.filter(a=>a.domain===l||a.domain===`.${l}`||a.domain.endsWith(`.${l}`));return d.debug(`Extracted ${c.length} cookies from Safari`),{cookies:c,browser:"Safari",profilePath:e.profilePath}}catch(o){return {cookies:[],browser:"Safari",profilePath:e.profilePath,error:o instanceof Error?o.message:String(o)}}}function te(e){let r=e.readUInt32LE(4),o=[],i=[];for(let t=0;t<r;t++)i.push(e.readUInt32LE(8+t*4));for(let t of i)try{let s=ie(e,t);s&&o.push(s);}catch{}return o}function ie(e,r){let o=e.readUInt32LE(r+4),i=e.readUInt32LE(r+16),t=e.readUInt32LE(r+20),s=e.readUInt32LE(r+24),n=e.readUInt32LE(r+28),f=e.readDoubleLE(r+40),l=Math.round(f+978307200),c=b(e,r+i),a=b(e,r+t),u=b(e,r+s),w=b(e,r+n);return !a||!c?null:{name:a,value:w,domain:c,path:u||"/",expires:l,secure:(o&1)!==0,httpOnly:(o&4)!==0,sameSite:"None"}}function b(e,r){let o=e.indexOf(0,r);return o===-1?e.subarray(r).toString("utf-8"):e.subarray(r,o).toString("utf-8")}var se=".skeptic/.cookies-consent";function ne(){return [...D(),...L(),...N()]}function ae(e,r={}){let o=ne();if(r.browsers&&r.browsers.length>0){let t=new Set(r.browsers.map(s=>s.toLowerCase()));o=o.filter(s=>t.has(s.browser.toLowerCase()));}if(o.length===0)return d.warn("No supported browsers detected for cookie extraction"),[];d.info(`${a} is reading cookies for ${e} from: ${o.map(t=>t.browser).join(", ")}`);let i=[];for(let t of o){let s=ue(t,e);i.push(s),s.error&&d.warn(`${t.browser}: ${s.error}`);}return i}function ce(e){let r=new Map;for(let o of e)for(let i of o.cookies){let t=`${i.name}|${i.domain}`,s=r.get(t);(!s||i.expires>s.expires)&&r.set(t,i);}return [...r.values()]}function fe(){let e=h.resolve(process.cwd(),se);if(m.existsSync(e))return true;d.warn(`${a} cookie extraction reads browser cookie databases on your machine.
9
+ Cookies are injected into test browser contexts and never leave your machine.
10
+ This notice will not be shown again.`);let r=h.dirname(e);return m.existsSync(r)||m.mkdirSync(r,{recursive:true}),m.writeFileSync(e,new Date().toISOString(),"utf-8"),true}async function _e(e,r,o={}){fe();let i=ae(r,o),t=ce(i);if(t.length===0)return d.debug(`No cookies found for ${r}`),0;let s=t.map(n=>({name:n.name,value:n.value,domain:n.domain,path:n.path,expires:n.expires>0?n.expires:void 0,secure:n.secure,httpOnly:n.httpOnly,sameSite:n.sameSite}));return await e.addCookies(s),d.success(`Injected ${s.length} cookies for ${r}`),s.length}function ue(e,r){return e.browser==="Firefox"?j(e,r):e.browser==="Safari"?T(e,r):$(e,r)}export{ne as a,ae as b,ce as c,fe as d,_e as e};
@@ -0,0 +1,5 @@
1
+ import {createRequire}from'node:module';import {m,c,q as q$1,b}from'./chunk-2VSGDT7T.mjs';import {a}from'./chunk-IYLF56WL.mjs';import {d as d$1}from'./chunk-ZN6MI2TU.mjs';import*as R from'fs';import*as h from'net';import {spawn}from'child_process';import {createRequire as createRequire$1}from'module';import {fileURLToPath}from'url';import {setTimeout as setTimeout$1}from'timers/promises';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var J=async e=>{m();let n=c(),t={engine:e.engine,headed:e.headed,cliVersion:e.cliVersion,playwrightVersion:V(),...process.env.SKEPTIC_DAEMON_AUTH_TOKEN?{authToken:process.env.SKEPTIC_DAEMON_AUTH_TOKEN}:{}},r=0;for(;r<2;){r+=1;let o=await A(n,e);if(!o.ok)throw new Error(`daemon: ${o.reason}`);let s=await q$1(n,t);if(s.ok){let i=await k(n,t.authToken),c=await(await a())[e.engine].connect(i);return {browser:c,disconnect:async()=>{await c.close().catch(()=>{}),await O(n).catch(()=>{});}}}let a$1=s.reason??"unknown";if(P(a$1)){let i=await _(n);if(x(a$1,i)==="standalone")return d$1.warn(`[daemon] ${a$1} but ${i} active client(s) \u2014 launching a private (non-daemon) browser for this run instead of restarting the shared daemon`),$(e);d$1.warn(`[daemon] ${a$1} \u2014 restarting daemon with engine=${e.engine} headed=${e.headed}`),await C(n).catch(()=>{}),await N(n,3e3);continue}throw new Error(`daemon ping failed: ${a$1}`)}throw new Error("daemon: handshake failed after 2 attempts")},k=async(e,n)=>{let r=await d(e,{method:"browser.getEndpoint",params:n?{authToken:n}:{}},3e3);if(r.error)throw new Error(`browser.getEndpoint failed: ${r.error}`);let o=r.result;if(!o||typeof o.wsEndpoint!="string")throw new Error("browser.getEndpoint: malformed response");return o.wsEndpoint},C=async e=>{await d(e,{method:"daemon.shutdown"},1500).catch(()=>{});},O=async e=>{await d(e,{method:"browser.release"},1500).catch(()=>{});},P=e=>e==="engine-mismatch"||e==="headed-mismatch"||e==="version-mismatch",x=(e,n)=>P(e)&&n>0?"standalone":"restart",_=async e=>{let n=await d(e,{method:"daemon.status"},1500).catch(()=>null);if(!n||n.error)return 0;let t=n.result;return typeof t?.clients=="number"?t.clients:0},$=async e=>{let t=await(await a())[e.engine].launch({headless:!e.headed});return {browser:t,disconnect:async()=>{await t.close().catch(()=>{});}}},d=async(e,n,t)=>new Promise((r,o)=>{let s=h.createConnection(b(e)),a="",i=setTimeout(()=>{s.destroy(),o(new Error(`rpc timeout: ${n.method}`));},t);s.on("connect",()=>{s.write(`${JSON.stringify(n)}
4
+ `);}),s.on("data",m=>{a+=m.toString("utf8");let c=a.indexOf(`
5
+ `);if(c>=0){clearTimeout(i);try{let u=JSON.parse(a.slice(0,c));s.destroy(),r(u);}catch(u){s.destroy(),o(u);}}}),s.on("error",m=>{clearTimeout(i),o(m);});}),A=async(e,n)=>{if(await g(e))return {ok:true};if(n.autoSpawn===false)return {ok:false,reason:"no-daemon"};let t=I(n),r=M(),o=spawn(process.execPath,[r,...t],{detached:true,stdio:"ignore",env:{...process.env}});o.unref(),o.on("error",()=>{});let s=Date.now()+(n.spawnTimeoutMs??15e3);for(;Date.now()<s;){if(await g(e))return {ok:true};await setTimeout$1(100);}return {ok:false,reason:"spawn-timeout"}},g=e=>new Promise(n=>{if(process.platform!=="win32"&&!R.existsSync(e)){n(false);return}let t=h.createConnection(b(e)),r=s=>{t.removeAllListeners(),t.destroy(),n(s);},o=setTimeout(()=>r(false),800);t.on("connect",()=>{clearTimeout(o),r(true);}),t.on("error",()=>{clearTimeout(o),r(false);});}),N=async(e,n)=>{let t=Date.now()+n;for(;Date.now()<t;){if(!await g(e))return;await setTimeout$1(50);}},I=e=>{let n=["daemon","start"];return n.push("--engine",e.engine),e.headed&&n.push("--headed"),typeof e.idleTimeoutSeconds=="number"&&n.push("--daemon-idle-timeout",String(e.idleTimeoutSeconds)),n},M=()=>{let e=process.env.SKEPTIC_DAEMON_BIN;if(e)return e;let n=process.argv[1];return n||fileURLToPath(new URL("../../dist/skeptic.mjs",import.meta.url))},E=createRequire$1(import.meta.url),q=(()=>{try{return E("playwright/package.json").version}catch{try{return E("playwright-core/package.json").version}catch{return "unknown"}}})(),V=()=>q;export{J as a,P as b,x as c,_ as d,d as e,A as f};
@@ -0,0 +1,7 @@
1
+ import {createRequire}from'node:module';import p from'process';import P from'os';import N from'tty';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var A=(r=0)=>e=>`\x1B[${e+r}m`,y=(r=0)=>e=>`\x1B[${38+r};5;${e}m`,E=(r=0)=>(e,t,o)=>`\x1B[${38+r};2;${e};${t};${o}m`,l={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};Object.keys(l.modifier);var _=Object.keys(l.color),j=Object.keys(l.bgColor);[..._,...j];function w(){let r=new Map;for(let[e,t]of Object.entries(l)){for(let[o,n]of Object.entries(t))l[o]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},t[o]=l[o],r.set(n[0],n[1]);Object.defineProperty(l,e,{value:t,enumerable:false});}return Object.defineProperty(l,"codes",{value:r,enumerable:false}),l.color.close="\x1B[39m",l.bgColor.close="\x1B[49m",l.color.ansi=A(),l.color.ansi256=y(),l.color.ansi16m=E(),l.bgColor.ansi=A(10),l.bgColor.ansi256=y(10),l.bgColor.ansi16m=E(10),Object.defineProperties(l,{rgbToAnsi256:{value(e,t,o){return e===t&&t===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(o/255*5)},enumerable:false},hexToRgb:{value(e){let t=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!t)return [0,0,0];let[o]=t;o.length===3&&(o=[...o].map(i=>i+i).join(""));let n=Number.parseInt(o,16);return [n>>16&255,n>>8&255,n&255]},enumerable:false},hexToAnsi256:{value:e=>l.rgbToAnsi256(...l.hexToRgb(e)),enumerable:false},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let t,o,n;if(e>=232)t=((e-232)*10+8)/255,o=t,n=t;else {e-=16;let R=e%36;t=Math.floor(e/36)/5,o=Math.floor(R/6)/5,n=R%6/5;}let i=Math.max(t,o,n)*2;if(i===0)return 30;let u=30+(Math.round(n)<<2|Math.round(o)<<1|Math.round(t));return i===2&&(u+=60),u},enumerable:false},rgbToAnsi:{value:(e,t,o)=>l.ansi256ToAnsi(l.rgbToAnsi256(e,t,o)),enumerable:false},hexToAnsi:{value:e=>l.ansi256ToAnsi(l.hexToAnsi256(e)),enumerable:false}}),l}var L=w(),a=L;function c(r,e=globalThis.Deno?globalThis.Deno.args:p.argv){let t=r.startsWith("-")?"":r.length===1?"-":"--",o=e.indexOf(t+r),n=e.indexOf("--");return o!==-1&&(n===-1||o<n)}var{env:s}=p,d;c("no-color")||c("no-colors")||c("color=false")||c("color=never")?d=0:(c("color")||c("colors")||c("color=true")||c("color=always"))&&(d=1);function k(){if("FORCE_COLOR"in s)return s.FORCE_COLOR==="true"?1:s.FORCE_COLOR==="false"?0:s.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(s.FORCE_COLOR,10),3)}function G(r){return r===0?false:{level:r,hasBasic:true,has256:r>=2,has16m:r>=3}}function Y(r,{streamIsTTY:e,sniffFlags:t=true}={}){let o=k();o!==void 0&&(d=o);let n=t?d:o;if(n===0)return 0;if(t){if(c("color=16m")||c("color=full")||c("color=truecolor"))return 3;if(c("color=256"))return 2}if("TF_BUILD"in s&&"AGENT_NAME"in s)return 1;if(r&&!e&&n===void 0)return 0;let i=n||0;if(s.TERM==="dumb")return i;if(p.platform==="win32"){let u=P.release().split(".");return Number(u[0])>=10&&Number(u[2])>=10586?Number(u[2])>=14931?3:2:1}if("CI"in s)return ["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(u=>u in s)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(u=>u in s)||s.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in s)return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(s.TEAMCITY_VERSION)?1:0;if(s.COLORTERM==="truecolor"||s.TERM==="xterm-kitty"||s.TERM==="xterm-ghostty"||s.TERM==="wezterm")return 3;if("TERM_PROGRAM"in s){let u=Number.parseInt((s.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(s.TERM_PROGRAM){case "iTerm.app":return u>=3?3:2;case "Apple_Terminal":return 2}}return /-256(color)?$/i.test(s.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(s.TERM)||"COLORTERM"in s?1:i}function x(r,e={}){let t=Y(r,{streamIsTTY:r&&r.isTTY,...e});return G(t)}var $={stdout:x({isTTY:N.isatty(1)}),stderr:x({isTTY:N.isatty(2)})},v=$;function B(r,e,t){let o=r.indexOf(e);if(o===-1)return r;let n=e.length,i=0,u="";do u+=r.slice(i,o)+e+t,i=o+n,o=r.indexOf(e,i);while(o!==-1);return u+=r.slice(i),u}function M(r,e,t,o){let n=0,i="";do{let u=r[o-1]==="\r";i+=r.slice(n,u?o-1:o)+e+(u?`\r
4
+ `:`
5
+ `)+t,n=o+1,o=r.indexOf(`
6
+ `,n);}while(o!==-1);return i+=r.slice(n),i}var{stdout:I,stderr:S}=v,O=Symbol("GENERATOR"),f=Symbol("STYLER"),h=Symbol("IS_EMPTY"),F=["ansi","ansi","ansi256","ansi16m"],b=Object.create(null),D=(r,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let t=I?I.level:0;r.level=e.level===void 0?t:e.level;};var U=r=>{let e=(...t)=>t.join(" ");return D(e,r),Object.setPrototypeOf(e,m.prototype),e};function m(r){return U(r)}Object.setPrototypeOf(m.prototype,Function.prototype);for(let[r,e]of Object.entries(a))b[r]={get(){let t=g(this,C(e.open,e.close,this[f]),this[h]);return Object.defineProperty(this,r,{value:t}),t}};b.visible={get(){let r=g(this,this[f],true);return Object.defineProperty(this,"visible",{value:r}),r}};var T=(r,e,t,...o)=>r==="rgb"?e==="ansi16m"?a[t].ansi16m(...o):e==="ansi256"?a[t].ansi256(a.rgbToAnsi256(...o)):a[t].ansi(a.rgbToAnsi(...o)):r==="hex"?T("rgb",e,t,...a.hexToRgb(...o)):a[t][r](...o),V=["rgb","hex","ansi256"];for(let r of V){b[r]={get(){let{level:t}=this;return function(...o){let n=C(T(r,F[t],"color",...o),a.color.close,this[f]);return g(this,n,this[h])}}};let e="bg"+r[0].toUpperCase()+r.slice(1);b[e]={get(){let{level:t}=this;return function(...o){let n=C(T(r,F[t],"bgColor",...o),a.bgColor.close,this[f]);return g(this,n,this[h])}}};}var K=Object.defineProperties(()=>{},{...b,level:{enumerable:true,get(){return this[O].level},set(r){this[O].level=r;}}}),C=(r,e,t)=>{let o,n;return t===void 0?(o=r,n=e):(o=t.openAll+r,n=e+t.closeAll),{open:r,close:e,openAll:o,closeAll:n,parent:t}},g=(r,e,t)=>{let o=(...n)=>W(o,n.length===1?""+n[0]:n.join(" "));return Object.setPrototypeOf(o,K),o[O]=r,o[f]=e,o[h]=t,o},W=(r,e)=>{if(r.level<=0||!e)return r[h]?"":e;let t=r[f];if(t===void 0)return e;let{openAll:o,closeAll:n}=t;if(e.includes("\x1B"))for(;t!==void 0;)e=B(e,t.close,t.open),t=t.parent;let i=e.indexOf(`
7
+ `);return i!==-1&&(e=M(e,n,o,i)),o+e+n};Object.defineProperties(m.prototype,b);var z=m();m({level:S?S.level:0});var se=z;export{se as a};
@@ -0,0 +1,3 @@
1
+ import {createRequire}from'node:module';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var t={screenshot:"Capturing screenshot","screenshot.annotated":"Taking annotated screenshot",snapshot:"Reading ARIA snapshot",settle:"Waiting for visual settle","observability.expectPerformance":"Checking performance thresholds","observability.expectNoNetworkErrors":"Analyzing network requests","observability.expectNoConsoleErrors":"Reading console messages","observability.expectAccessible":"Running accessibility audit","observability.snapshot":"Snapshotting observability metrics",test:"Running test","proxy.click":"Clicking","proxy.dblclick":"Double-clicking","proxy.hover":"Hovering","proxy.fill":"Filling input","proxy.type":"Typing","proxy.press":"Pressing key","proxy.selectOption":"Selecting option","proxy.check":"Checking","proxy.uncheck":"Unchecking","proxy.tap":"Tapping","proxy.setChecked":"Setting checkbox"},s=e=>typeof e!="string"||e.length===0?"":t[e]??e,o=new Set(["observability.expectAccessible","observability.expectPerformance","observability.expectNoNetworkErrors","observability.expectNoConsoleErrors","observability.snapshot","screenshot.annotated","snapshot","settle","test"]);export{s as a,o as b};
@@ -0,0 +1,141 @@
1
+ import {createRequire}from'node:module';import {a as a$1}from'./chunk-EYVJTUBL.mjs';import {d}from'./chunk-ZN6MI2TU.mjs';import {a}from'./chunk-MHNEFL35.mjs';import*as u from'fs';import*as b from'path';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var T=1024,P=class{outputDir;silent;constructor(s,t={}){this.outputDir=s,this.silent=t.silent??false;}onTestStart(s){}onStepComplete(s,t,r,o){}onTestComplete(s,t){}onRunComplete(s){u.mkdirSync(this.outputDir,{recursive:true});let t=b.join(this.outputDir,"report.html"),r=s.tests.map((l,c)=>z(l,c,s.tests,this.outputDir)).join(`
4
+ `),o=s.total>0?Math.round(s.passed/s.total*100):0,d$1=M(s.duration_ms),a$1=`<!DOCTYPE html>
5
+ <html lang="en">
6
+ <head>
7
+ <meta charset="UTF-8">
8
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
+ <title>${a} Test Report</title>
10
+ <style>
11
+ * { margin: 0; padding: 0; box-sizing: border-box; }
12
+ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #0f0f0f; color: #e0e0e0; padding: 2rem; max-width: 1100px; margin: 0 auto; }
13
+ h1 { color: #ffd700; margin-bottom: 0.5rem; font-size: 1.5rem; }
14
+ .meta { color: #888; font-size: 0.85rem; margin-bottom: 2rem; }
15
+ .summary { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-bottom: 2rem; }
16
+ .card { background: #1a1a1a; border-radius: 8px; padding: 1.25rem; text-align: center; }
17
+ .card .value { font-size: 2rem; font-weight: 700; }
18
+ .card .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.05em; margin-top: 0.25rem; }
19
+ .passed .value { color: #4caf50; }
20
+ .failed .value { color: #f44336; }
21
+ .total .value { color: #ffd700; }
22
+ .duration .value { color: #90caf9; font-size: 1.5rem; }
23
+ .test { background: #1a1a1a; border-radius: 8px; margin-bottom: 1rem; overflow: hidden; }
24
+ .test-header { padding: 1rem 1.25rem; cursor: pointer; display: flex; align-items: center; gap: 0.75rem; user-select: none; }
25
+ .test-header:hover { background: #222; }
26
+ .test-header .badge { font-size: 0.7rem; font-weight: 700; padding: 0.2rem 0.5rem; border-radius: 4px; text-transform: uppercase; }
27
+ .badge-pass { background: #1b5e20; color: #4caf50; }
28
+ .badge-fail { background: #b71c1c; color: #ef9a9a; }
29
+ .test-header .name { flex: 1; font-weight: 600; }
30
+ .test-header .dur { color: #888; font-size: 0.85rem; }
31
+ .test-header .arrow { color: #666; transition: transform 0.2s; }
32
+ .test.open .test-header .arrow { transform: rotate(90deg); }
33
+ .test-body { display: none; padding: 0 1.25rem 1rem; }
34
+ .test.open .test-body { display: block; }
35
+ .file { color: #666; font-size: 0.8rem; margin-top: 0.25rem; margin-bottom: 0.5rem; }
36
+
37
+ .artifacts { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin: 0.75rem 0; padding: 0.75rem; background: #141414; border-radius: 6px; border: 1px solid #222; }
38
+ .artifacts h4 { font-size: 0.85rem; color: #ffd700; margin-bottom: 0.5rem; }
39
+ .artifact-card { background: #1f1f1f; padding: 0.75rem; border-radius: 4px; }
40
+ .artifact-card video, .artifact-card img { width: 100%; max-height: 320px; object-fit: contain; border-radius: 4px; border: 1px solid #333; background: #000; display: block; }
41
+ .artifact-card a { color: #90caf9; text-decoration: none; font-size: 0.85rem; word-break: break-all; }
42
+ .artifact-card a:hover { text-decoration: underline; }
43
+ .artifact-card .hint { color: #666; font-size: 0.75rem; margin-top: 0.4rem; }
44
+ .artifact-card code { font-family: ui-monospace, monospace; background: #0a0a0a; padding: 0.1rem 0.3rem; border-radius: 2px; color: #b3e5fc; }
45
+ .copy-btn { background: #2a2a2a; color: #90caf9; border: 1px solid #333; border-radius: 4px; padding: 0.2rem 0.5rem; cursor: pointer; font-size: 0.7rem; margin-left: 0.4rem; }
46
+ .copy-btn:hover { background: #333; }
47
+
48
+ .step { display: flex; align-items: flex-start; gap: 0.5rem; padding: 0.4rem 0; font-size: 0.9rem; border-bottom: 1px solid #222; }
49
+ .step:last-child { border-bottom: none; }
50
+ .step .icon { width: 1.2rem; flex-shrink: 0; text-align: center; }
51
+ .step .icon.pass { color: #4caf50; }
52
+ .step .icon.fail { color: #f44336; }
53
+ .step .icon.err { color: #ff9800; }
54
+ .step .cmd { color: #90caf9; font-family: monospace; min-width: 8rem; }
55
+ .step .desc { flex: 1; color: #aaa; }
56
+ .step .sdur { color: #666; font-size: 0.8rem; min-width: 4rem; text-align: right; }
57
+ .step-error { color: #ef9a9a; font-size: 0.8rem; padding: 0.25rem 0 0 1.7rem; }
58
+ .step-warning { color: #ffd54f; font-size: 0.8rem; padding: 0.25rem 0 0 1.7rem; }
59
+ .step-diagnostic { color: #ffb74d; font-size: 0.8rem; padding: 0.25rem 0 0 1.7rem; }
60
+ .diag-chip { display: inline-block; background: #2a1d10; color: #ffb74d; border: 1px solid #5a3d20; border-radius: 999px; padding: 0.05rem 0.5rem; font-size: 0.7rem; margin-right: 0.4rem; }
61
+
62
+ .screenshot { margin: 0.5rem 0 0 1.7rem; }
63
+ .screenshot img { max-width: 100%; border-radius: 4px; border: 1px solid #333; }
64
+ .visual-diff { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.5rem; margin: 0.5rem 0 0 1.7rem; }
65
+ .visual-diff figure { margin: 0; }
66
+ .visual-diff figcaption { font-size: 0.8rem; color: #888; margin-bottom: 0.25rem; }
67
+ .visual-diff img { max-width: 100%; border: 1px solid #333; border-radius: 4px; }
68
+
69
+ .test-metrics { margin-top: 0.75rem; padding: 0.75rem 1rem; background: #141414; border-radius: 6px; }
70
+ .test-metrics summary { cursor: pointer; color: #90caf9; font-weight: 600; }
71
+ .metrics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 0.75rem; margin-top: 0.5rem; }
72
+ .metric-card { background: #1f1f1f; padding: 0.75rem; border-radius: 4px; }
73
+ .metric-card h4 { font-size: 0.85rem; color: #ffd700; margin-bottom: 0.5rem; }
74
+ .metric-card table { width: 100%; border-collapse: collapse; }
75
+ .metric-card td { padding: 0.1rem 0.3rem; font-size: 0.8rem; }
76
+ .metric-card td.label { color: #888; }
77
+ .metric-card .issue-list { margin-top: 0.3rem; font-size: 0.8rem; color: #ef9a9a; }
78
+ .metric-card .issue-list li { margin-left: 1rem; }
79
+ .metric-card .console-banner { background: #2a1d10; color: #ffb74d; border-radius: 4px; padding: 0.25rem 0.5rem; margin-top: 0.4rem; font-size: 0.75rem; }
80
+ </style>
81
+ </head>
82
+ <body>
83
+ <h1>${a} Test Report</h1>
84
+ <div class="meta">Generated ${new Date().toISOString()} | ${o}% pass rate</div>
85
+
86
+ <div class="summary">
87
+ <div class="card total"><div class="value">${s.total}</div><div class="label">Total</div></div>
88
+ <div class="card passed"><div class="value">${s.passed}</div><div class="label">Passed</div></div>
89
+ <div class="card failed"><div class="value">${s.failed}</div><div class="label">Failed</div></div>
90
+ <div class="card duration"><div class="value">${d$1}</div><div class="label">Duration</div></div>
91
+ </div>
92
+
93
+ ${r}
94
+
95
+ <script>
96
+ document.querySelectorAll('.test-header').forEach(h => {
97
+ h.addEventListener('click', () => h.parentElement.classList.toggle('open'));
98
+ });
99
+ // Auto-open failed tests
100
+ document.querySelectorAll('.test.failed').forEach(f => f.classList.add('open'));
101
+ // Copy-to-clipboard for trace command
102
+ document.querySelectorAll('.copy-btn').forEach(btn => {
103
+ btn.addEventListener('click', (e) => {
104
+ e.stopPropagation();
105
+ const code = btn.previousElementSibling;
106
+ if (!code) return;
107
+ navigator.clipboard.writeText(code.textContent || '').then(() => {
108
+ const original = btn.textContent;
109
+ btn.textContent = 'Copied!';
110
+ setTimeout(() => { btn.textContent = original; }, 1500);
111
+ });
112
+ });
113
+ });
114
+ </script>
115
+ </body>
116
+ </html>`;u.writeFileSync(t,a$1,"utf-8"),this.silent||d.info(`HTML report written to ${t}`);}};function z(e,s,t,r){let o=e.status==="passed",d=o?'<span class="badge badge-pass">PASS</span>':'<span class="badge badge-fail">FAIL</span>',a=e.steps.map(f=>C(f,r)).join(`
117
+ `),l=e.artifacts?.video?.path,c=l?`<span style="color:#90caf9;font-size:0.8rem;margin-left:0.5rem;" title="${i(l)}">&#127909; Video</span>`:"",n=j(e,r),m=F(e.metrics);return `<div class="test ${o?"passed":"failed"}">
118
+ <div class="test-header">
119
+ ${d}
120
+ <span class="name">${i(a$1(e,t))}${c}</span>
121
+ <span class="dur">${M(e.duration_ms)}</span>
122
+ <span class="arrow">&#9654;</span>
123
+ </div>
124
+ <div class="test-body">
125
+ <div class="file">${i(e.file)}</div>
126
+ ${n}
127
+ ${a}${m}
128
+ </div>
129
+ </div>`}function C(e,s){let t=e.status==="passed"?'<span class="icon pass">&#10003;</span>':e.status==="failed"?'<span class="icon fail">&#10007;</span>':e.status==="skipped"?'<span class="icon">&#8226;</span>':'<span class="icon err">&#9888;</span>',r="";if(e.error&&(r+=`
130
+ <div class="step-error">${i(e.error)}</div>`),e.warnings&&e.warnings.length>0)for(let o of e.warnings)r+=`
131
+ <div class="step-warning">\u26A0 ${i(o)}</div>`;if(e.diagnostics&&e.diagnostics.length>0){let o=e.diagnostics.map(a=>`<span class="diag-chip">${i(a.kind)}</span>`).join(""),d=e.diagnostics.map(a=>i(a.message)).join(" \xB7 ");r+=`
132
+ <div class="step-diagnostic">${o}${d}</div>`;}if(e.baselinePath&&e.currentPath&&e.diffPath){let o=v(e.baselinePath),d=v(e.currentPath),a=v(e.diffPath);o&&d&&a&&(r+=`
133
+ <div class="visual-diff">`,r+=x("Baseline",o,"baseline screenshot",s),r+=x("Current",d,"current screenshot",s),r+=x("Diff",a,"diff screenshot",s),r+="</div>");}else if(e.screenshot){let o=v(e.screenshot);if(o){let d=e.status==="failed"||e.status==="error",a=A(e.args),l=d?`failure evidence \u2014 ${e.command}${a?` ${a}`:""}`:`${e.command} screenshot${a?` \u2014 ${a}`:""}`;r+=`
134
+ <div class="screenshot">${S(o,l,s)}</div>`;}}return ` <div class="step">
135
+ ${t}
136
+ <span class="cmd">${i(e.command)}</span>
137
+ <span class="desc">${i(A(e.args))}</span>
138
+ <span class="sdur">${e.duration_ms}ms</span>
139
+ </div>${r}`}function j(e,s){let t=e.artifacts??{},r=[],o=e.steps.find(c=>(c.status==="failed"||c.status==="error")&&c.screenshot),d=[...e.steps].reverse().find(c=>c.screenshot&&c.command==="screenshot"),a=o?.screenshot??d?.screenshot??t.screenshots?.[t.screenshots.length-1];if(a){let c=v(a);if(c){let n=o?"failure evidence":"last screenshot";r.push(`<div class="artifact-card"><h4>Screenshot</h4>${S(c,n,s)}<div class="hint">${i(p(s,a))}</div></div>`);}}if(t.video){let c=p(s,t.video.path);r.push(`<div class="artifact-card"><h4>Video (${t.video.width}\xD7${t.video.height})</h4><video controls preload="metadata" src="${i(c)}"></video><div class="hint">${i(c)}</div></div>`);}if(t.trace){let c=`npx playwright show-trace ${t.trace}`;r.push(`<div class="artifact-card"><h4>Playwright Trace</h4><a href="${i(p(s,t.trace))}">Open trace zip</a><div class="hint">View interactively: <code>${i(c)}</code><button class="copy-btn">Copy</button></div></div>`);}t.har&&r.push(`<div class="artifact-card"><h4>HAR (network archive)</h4><a href="${i(p(s,t.har))}">Open HAR archive</a></div>`),t.perfTrace&&r.push(`<div class="artifact-card"><h4>Performance Trace</h4><a href="${i(p(s,t.perfTrace))}">Open performance-trace.md</a></div>`),t.accessibilityAudit&&r.push(`<div class="artifact-card"><h4>Accessibility Audit</h4><a href="${i(p(s,t.accessibilityAudit))}">Open audit.md</a></div>`);let l=[];return t.consoleSnapshot&&l.push(`<a href="${i(p(s,t.consoleSnapshot))}">console.json</a>`),t.networkSnapshot&&l.push(`<a href="${i(p(s,t.networkSnapshot))}">network.json</a>`),t.accessibilityJson&&l.push(`<a href="${i(p(s,t.accessibilityJson))}">accessibility.json</a>`),t.testJson&&l.push(`<a href="${i(p(s,t.testJson))}">test.json</a>`),l.length>0&&r.push(`<div class="artifact-card"><h4>Sidecars</h4>${l.join(" \xB7 ")}</div>`),r.length===0?"":`
140
+ <div class="artifacts">${r.join("")}</div>`}function F(e){if(!e)return "";let s=[],t=e.performance;if(t){let n=[],m=(f,g)=>{g!==null&&n.push(`<tr><td class="label">${f}</td><td>${i(g)}</td></tr>`);};m("FCP",t.fcp===null?null:$(t.fcp)),m("LCP",t.lcp===null?null:$(t.lcp)),m("CLS",t.cls===null?null:t.cls.toFixed(3)),m("INP",t.inp===null?null:$(t.inp)),m("TTFB",t.ttfb===null?null:$(t.ttfb)),t.longAnimationFrames.length>0&&n.push(`<tr><td class="label">LoAF</td><td>${t.longAnimationFrames.length} frames</td></tr>`),n.length>0&&s.push(`<div class="metric-card"><h4>Core Web Vitals</h4><table>${n.join("")}</table></div>`);}let r=e.network;if(r&&r.issues){let n=[];r.issues.failedRequests.length>0&&n.push(`<li>${r.issues.failedRequests.length} HTTP failure(s) (4xx/5xx)</li>`),r.issues.networkFailures.length>0&&n.push(`<li>${r.issues.networkFailures.length} network failure(s) (DNS/TCP/aborted)</li>`),r.issues.duplicates.length>0&&n.push(`<li>${r.issues.duplicates.length} duplicate group(s)</li>`),r.issues.mixedContent.length>0&&n.push(`<li>${r.issues.mixedContent.length} mixed-content resource(s)</li>`),r.issues.corsErrors.length>0&&n.push(`<li>${r.issues.corsErrors.length} CORS error(s)</li>`);let m=n.length>0?`<ul class="issue-list">${n.join("")}</ul>`:"";s.push(`<div class="metric-card"><h4>Network</h4><p>${r.requests.length} request(s)</p>${m}</div>`);}let o=e.console;if(o){let n=o.summary.redactionDisabled?'<div class="console-banner">\u26A0 redaction disabled \u2014 text may contain credentials/PII</div>':"",m=o.summary.errorCount,f=o.summary.warningCount,g=o.messages.filter(h=>h.type==="error"||h.type==="warning").slice(0,5).map(h=>`<li><strong>${i(h.type)}</strong>: ${i(h.text)}</li>`).join("");s.push(`<div class="metric-card"><h4>Console</h4><p>${o.summary.total} message(s) \u2014 ${m} error(s), ${f} warning(s)</p>${g?`<ul class="issue-list">${g}</ul>`:""}${n}</div>`);}let d=e.accessibility;if(d){let n=d.summary.dualEngine?"axe-core + IBM Equal Access":"axe-core",m=d.violations.slice(0,5).map(h=>`<li>[${i(h.impact)}] ${i(h.ruleId)}${h.engine==="equal-access"?" <em>(equal-access)</em>":""}</li>`).join(""),f=d.violations.length>5?` (and ${d.violations.length-5} more)`:"",g=d.summary.violations>0?`<ul class="issue-list">${m}</ul>${f?`<p>${f}</p>`:""}`:"";s.push(`<div class="metric-card"><h4>Accessibility</h4><p>${i(d.standard)} \u2014 ${d.summary.violations} violation(s), ${d.summary.passes} passes (${n})</p>${g}</div>`);}let a=e.mobilePerformance;if(a){let n=[];a.frames&&(n.push(`<tr><td class="label">Frames</td><td>${a.frames.totalFrames} (${a.frames.jankyPercent}% janky)</td></tr>`),n.push(`<tr><td class="label">Frame time</td><td>p50 ${a.frames.percentiles.p50}ms \xB7 p90 ${a.frames.percentiles.p90}ms \xB7 p99 ${a.frames.percentiles.p99}ms</td></tr>`),a.frames.missedVsync>0&&n.push(`<tr><td class="label">Missed vsync</td><td>${a.frames.missedVsync}</td></tr>`)),a.memory&&n.push(`<tr><td class="label">Memory (PSS)</td><td>${Math.round(a.memory.totalPssKb/1024)} MB</td></tr>`),a.launch.totalTimeMs!==null&&n.push(`<tr><td class="label">Launch</td><td>${a.launch.totalTimeMs}ms</td></tr>`),n.length>0&&s.push(`<div class="metric-card"><h4>Device Performance</h4><table>${n.join("")}</table></div>`);}let l=e.mobileAccessibility;if(l){let n=l.issues.slice(0,5).map(f=>`<li>[${i(f.impact)}] ${i(f.rule)} \u2014 ${i(f.className)}</li>`).join(""),m=l.issues.length>5?`<p>(and ${l.issues.length-5} more)</p>`:"";s.push(`<div class="metric-card"><h4>Device Accessibility</h4><p>${l.summary.issues} issue(s) across ${l.summary.checked} interactive node(s) \u2014 structural heuristics only</p>${n?`<ul class="issue-list">${n}</ul>${m}`:""}</div>`);}let c=e.mobileNetwork;if(c){let n=c.totals?`${(c.totals.rxBytes/1024/1024).toFixed(1)} MB in \xB7 ${(c.totals.txBytes/1024/1024).toFixed(1)} MB out`:"no per-uid totals";s.push(`<div class="metric-card"><h4>Device Network <em>(degraded)</em></h4><p>${n}</p><p class="dim">Per-uid byte totals only \u2014 per-request capture needs a proxy.</p></div>`);}return s.length===0?"":`
141
+ <details class="test-metrics" open><summary>Metrics</summary><div class="metrics-grid">${s.join("")}</div></details>`}function $(e){return e>=1e3?`${(e/1e3).toFixed(2)}s`:`${Math.round(e)}ms`}function v(e){try{if(u.existsSync(e)){let s=u.statSync(e),t={filePath:e,bytes:s.size};return s.size<=R()&&(t.base64=u.readFileSync(e).toString("base64")),t}}catch{}return null}function x(e,s,t,r){return `<figure><figcaption>${i(e)}</figcaption>${S(s,t,r)}</figure>`}function S(e,s,t){return e.base64?`<img src="data:image/png;base64,${e.base64}" alt="${i(s)}">`:`<a href="${i(p(t,e.filePath))}" title="${i(e.filePath)}">Open image (${E(e.bytes)})</a>`}function p(e,s){let t=b.relative(e,s);return (t.length>0?t:s).split(b.sep).join("/")}function R(){let e=process.env.SKEPTIC_HTML_EMBED_MAX_KB,s=e?Number.parseInt(e,10):T;return (Number.isFinite(s)&&s>0?s:T)*1024}function E(e){if(e<1024)return `${e} B`;let s=e/1024;return s<1024?`${Math.round(s)} KB`:`${(s/1024).toFixed(1)} MB`}function A(e){if(typeof e=="string")return e;if(typeof e=="object"&&e!==null){let s=e,t=[];return s.target&&t.push(String(s.target)),s.value!==void 0&&t.push(String(s.value)),s.description?String(s.description):s.name?String(s.name):t.join(" = ")}return String(e??"")}function M(e){return e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(2)}s`}function i(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}export{P as a};
@@ -0,0 +1,4 @@
1
+ import {createRequire}from'node:module';import {a as a$2}from'./chunk-MHNEFL35.mjs';import {a as a$1}from'./chunk-S3M2RTHJ.mjs';import {format}from'util';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var d={debug:0,info:1,warn:2,error:3,silent:4},u="info";function a(o){u=o;}function w(){return u}function n(o){return d[o]>=d[u]}var i=a$1.bold.hex("#FFD700")(`[${a$2}]`),t=null;function m(o){t=o;}function r(o,l){t?t.write(format(...l)+`
4
+ `):o(...l);}var p={debug(...o){n("debug")&&r(console.debug,[a$1.gray(`${i}`),...o]);},info(...o){n("info")&&r(console.log,[i,...o]);},success(...o){n("info")&&r(console.log,[i,a$1.green("\u2713"),...o]);},warn(...o){n("warn")&&r(console.warn,[i,a$1.yellow("\u26A0"),...o]);},error(...o){n("error")&&r(console.error,[i,a$1.red("\u2717"),...o]);},raw(...o){n("info")&&r(console.log,o);},errorRaw(...o){n("error")&&r(console.error,o);},step(o,l,g){n("info")&&r(console.log,[i,a$1.cyan(`Step ${o}/${l}`),a$1.dim("\u2014"),g]);}};export{a,w as b,m as c,p as d};
@@ -0,0 +1,2 @@
1
+ import {createRequire}from'node:module';export{a as connectDaemon,f as ensureDaemonRunning,d as getDaemonClientCount,b as isMismatchReason,c as resolveMismatchAction,e as sendRpc}from'./chunk-RU7M6UGM.mjs';import'./chunk-2VSGDT7T.mjs';import'./chunk-IYLF56WL.mjs';import'./chunk-ZN6MI2TU.mjs';import'./chunk-MHNEFL35.mjs';import'./chunk-S3M2RTHJ.mjs';import'./chunk-2YKSIUIN.mjs';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
@@ -0,0 +1,6 @@
1
+ import {createRequire}from'node:module';import {d}from'./chunk-ZN6MI2TU.mjs';import {a}from'./chunk-MHNEFL35.mjs';import'./chunk-S3M2RTHJ.mjs';import'./chunk-2YKSIUIN.mjs';import*as c from'fs';import*as h from'os';import*as f from'path';import {execFileSync}from'child_process';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var b="<!-- skeptic-qa-results -->",l=15e3;function k(t){if(!t||typeof t!="object")return false;let n=t;return !(typeof n.total!="number"||typeof n.passed!="number"||typeof n.failed!="number"||typeof n.duration_ms!="number"||!Array.isArray(n.tests))}function R(t,n,r=b){let a$1=t.failed>0?"\u274C":"\u2705",i=e=>e.replace(/\|/g,"\\|"),s=[r,`## ${a$1} ${a} test results`,"","| Total | Passed | Failed | Duration |","|-------|--------|--------|----------|",`| ${t.total} | ${t.passed} | ${t.failed} | ${(t.duration_ms/1e3).toFixed(1)}s |`,""];if(t.failed>0){s.push("### Failed Tests");for(let e of t.tests){if(e.status==="passed")continue;let p=e.steps.find(d=>d.status!=="passed")?.error??"unknown error";s.push(`- **${i(e.name)}** (${i(e.file)}): ${i(p)}`);}s.push("");}return n&&s.push(`> [Download full report](${n})`),s.filter(e=>e!=null).join(`
4
+ `)}function $(){let t=process.env.GITHUB_SERVER_URL,n=process.env.GITHUB_REPOSITORY,r=process.env.GITHUB_RUN_ID;return t&&n&&r?`${t}/${n}/actions/runs/${r}`:null}function w(){let t=process.env.GITHUB_REF;if(!t)return null;let n=/^refs\/pull\/(\d+)\/(merge|head)$/.exec(t);return n?n[1]:null}function S(){let t=w();if(t)return t;try{let r=execFileSync("gh",["pr","view","--json","number","-q",".number"],{encoding:"utf-8",timeout:l}).trim();return r.length>0?r:null}catch{return null}}function E(t,n){let r=execFileSync("gh",["api",`repos/{owner}/{repo}/issues/${t}/comments?per_page=100`],{encoding:"utf-8",timeout:l}),a=JSON.parse(r);if(!Array.isArray(a))return null;let i=a.find(s=>typeof s.body=="string"&&s.body.includes(n));return i&&typeof i.id=="number"?String(i.id):null}async function _(t){let n=f.resolve(t.results??"./skeptic-output/results.json"),r=t.marker??b;if(!c.existsSync(n)){d.warn(`skeptic comment: results file not found at ${n} \u2014 skipping`);return}let a;try{let e=c.readFileSync(n,"utf-8"),u=JSON.parse(e);if(!k(u)){d.warn("skeptic comment: results.json has unexpected shape \u2014 skipping");return}a=u;}catch{d.warn("skeptic comment: results.json is not valid JSON \u2014 skipping");return}let i=t.runUrl??$(),s=R(a,i,r);if(t.dryRun){process.stdout.write(s+`
5
+ `);return}try{let e=t.pr??S();if(!e){d.info("skeptic comment: no PR detected \u2014 skipping");return}let u=null;try{u=E(e,r);}catch(d$1){if(y(d$1)){d.warn("skeptic comment: 'gh' CLI not found \u2014 skipping PR comment. Install: https://cli.github.com");return}d.warn("skeptic comment: gh CLI not authenticated or GitHub API unreachable \u2014 skipping");return}let p=f.join(h.tmpdir(),`skeptic-comment-${Date.now()}-${process.pid}.md`);c.writeFileSync(p,s,"utf-8");try{u?(execFileSync("gh",["api",`repos/{owner}/{repo}/issues/comments/${u}`,"-X","PATCH","-F",`body=@${p}`],{encoding:"utf-8",timeout:l}),d.success(`skeptic comment: updated comment on PR #${e}`)):(execFileSync("gh",["pr","comment",String(e),"--body-file",p],{encoding:"utf-8",timeout:l}),d.success(`skeptic comment: posted comment on PR #${e}`));}finally{try{c.unlinkSync(p);}catch{}}}catch(e){if(y(e)){d.warn("skeptic comment: 'gh' CLI not found \u2014 skipping PR comment. Install: https://cli.github.com");return}let u=e instanceof Error?e.name:"UnknownError";d.warn(`skeptic comment: failed to post \u2014 ${u}`);}}function y(t){return !!(t&&typeof t=="object"&&t.code==="ENOENT")}
6
+ export{b as DEFAULT_MARKER,R as buildCommentBody,S as detectPrNumber,E as findExistingComment,k as isValidResults,_ as runComment};
@@ -0,0 +1,3 @@
1
+ import {createRequire}from'node:module';import {d}from'./chunk-ZN6MI2TU.mjs';import'./chunk-MHNEFL35.mjs';import {a}from'./chunk-S3M2RTHJ.mjs';import'./chunk-2YKSIUIN.mjs';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ async function p(){{let{detectBrowsers:i}=await import('./extractor-Y477MBN6.mjs'),e=i();if(e.length===0){d.warn("No supported browsers detected on this machine.");return}console.log(),console.log(a.bold("Detected browsers:")),console.log();let t=Math.max(...e.map(s=>s.browser.length),7)+2,r=`${"Browser".padEnd(t)} Profile Path`;console.log(a.dim(r)),console.log(a.dim("-".repeat(r.length+40)));for(let s of e){let c=a.cyan(s.browser.padEnd(t)),l=a.dim(s.profilePath);console.log(`${c} ${l}`);}console.log(),console.log(a.dim(`${e.length} browser(s) detected. Use --cookies to inject cookies during tests.`));}}export{p as runCookiesList};
@@ -0,0 +1,7 @@
1
+ import {createRequire}from'node:module';import {c,a}from'./chunk-IXBYLSGB.mjs';import {e}from'./chunk-RU7M6UGM.mjs';import {c as c$1,g,d as d$1}from'./chunk-2VSGDT7T.mjs';import'./chunk-IYLF56WL.mjs';import {d}from'./chunk-ZN6MI2TU.mjs';import'./chunk-MHNEFL35.mjs';import'./chunk-S3M2RTHJ.mjs';import'./chunk-2YKSIUIN.mjs';import*as r from'fs';import'net';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var p=new Set(["chromium","firefox","webkit"]),E=async o=>{let e=o.engine??"chromium";if(!p.has(e)){d.error(`daemon start: unknown engine "${e}" (expected chromium|firefox|webkit)`),process.exitCode=2;return}try{let t=await c({engine:e,headed:o.headed===!0,cliVersion:"1.0.1",...typeof o.daemonIdleTimeout=="number"?{idleTimeoutSeconds:o.daemonIdleTimeout}:{}});d.info(`[skeptic daemon] listening at ${t.socket.socketPath} (engine=${t.state.engine} headed=${t.state.headed} pw=${t.state.playwrightVersion} cli=${t.state.cliVersion})`),await new Promise(()=>{});}catch(t){d.error(`daemon start failed: ${t instanceof Error?t.message:String(t)}`),process.exitCode=1;}},x=async()=>{let o=c$1();if(!r.existsSync(o)){let e=f();if(e&&a(e)){try{process.kill(e,"SIGTERM"),d.info(`[skeptic daemon] sent SIGTERM to PID ${e}`);}catch(t){d.warn(`daemon stop: kill failed: ${t instanceof Error?t.message:String(t)}`);}return}d.info("[skeptic daemon] not running");return}try{await e(o,{method:"daemon.shutdown"},1500),d.info("[skeptic daemon] shutdown requested");}catch(e){d.warn(`daemon stop: rpc failed: ${e instanceof Error?e.message:String(e)}`);}},D=async()=>{let o=c$1();if(!r.existsSync(o)){d.info("[skeptic daemon] not running");return}try{let e$1=await e(o,{method:"daemon.status"},1500);if(e$1.error){d.warn(`daemon status: ${e$1.error}`);return}let t=e$1.result,i=Math.round(t.uptimeMs/1e3);d.raw(`[skeptic daemon] running \u2014 engine=${t.engine} headed=${t.headed} clients=${t.clients} uptime=${i}s cli=${t.cliVersion} pw=${t.playwrightVersion}`);}catch(e){d.warn(`daemon status: rpc failed: ${e instanceof Error?e.message:String(e)}`);}},I=async o=>{let e=g();if(!r.existsSync(e)){d.info(`[skeptic daemon] no log at ${e}`);return}let t=o.lines??200;try{let c=r.readFileSync(e,"utf8").split(`
4
+ `).slice(-t).join(`
5
+ `);process.stdout.write(c),c.endsWith(`
6
+ `)||process.stdout.write(`
7
+ `);}catch(i){d.warn(`daemon logs: read failed: ${i instanceof Error?i.message:String(i)}`);}},f=()=>{try{let o=r.readFileSync(d$1(),"utf8").trim(),e=Number(o);return Number.isFinite(e)&&e>0?e:null}catch{return null}};export{I as runDaemonLogs,E as runDaemonStart,D as runDaemonStatus,x as runDaemonStop};
@@ -0,0 +1,2 @@
1
+ import {createRequire}from'node:module';export{a as buildDeviceFixture,b as unavailable}from'./chunk-K65JNLTT.mjs';import'./chunk-2YKSIUIN.mjs';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
@@ -0,0 +1,4 @@
1
+ import {createRequire}from'node:module';import {d}from'./chunk-G22LGRZ4.mjs';import {c as c$1}from'./chunk-LPJF33QP.mjs';import {a}from'./chunk-S3M2RTHJ.mjs';import'./chunk-2YKSIUIN.mjs';/*! @license skeptic-cli — see LICENSES.md for third-party attributions */
2
+ createRequire(import.meta.url);
3
+ var t=s=>s instanceof Error&&s.code==="ENOENT",l=async()=>{try{return {available:!0,devices:await d()}}catch(s){return t(s)?{available:false,devices:[]}:{available:true,devices:[],error:s instanceof Error?s.message:String(s)}}},c=async()=>process.platform!=="darwin"?[]:(await c$1().catch(()=>[])).map(o=>({udid:o.udid,name:o.name,state:o.state})),v=async s=>{let[o,r]=await Promise.all([l(),c()]);if(s.json){process.stdout.write(`${JSON.stringify({android:{available:o.available,devices:o.devices,...o.error?{error:o.error}:{}},ios:{available:true,devices:r}})}
4
+ `);return}if(console.log(),console.log(a.bold("Android (adb):")),!o.available)console.log(a.dim(" adb not found on PATH.")),console.log(a.dim(" Install Android platform-tools and set ANDROID_HOME (or put adb on PATH)."));else if(o.error)console.log(a.yellow(` adb error: ${o.error}`));else if(o.devices.length===0)console.log(a.dim(" no devices or emulators connected."));else for(let i of o.devices)console.log(` ${a.cyan(i.serial)} ${i.state}`);if(console.log(),console.log(`${a.bold("iOS (simctl + axe):")} ${a.dim("--platform ios-sim")}`),process.platform!=="darwin")console.log(a.dim(" iOS simulators are only listable on macOS."));else if(r.length===0)console.log(a.dim(" no booted simulators."));else for(let i of r)console.log(` ${a.cyan(i.udid)} ${i.name} (${i.state})`);console.log();};export{v as runDevices};