@testrelic/playwright-analytics 2.16.4-next.191 → 2.16.4-next.193

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.
@@ -798,7 +798,7 @@ body{
798
798
  var h='';
799
799
  h+='<div class="run-meta-item"><span class="run-meta-label">Run</span><span class="run-id-tag">'+esc(data.testRunId.substring(0,8))+'</span></div>';
800
800
  h+='<div class="run-meta-item"><span class="run-meta-label">Duration</span>'+fmtDur(data.totalDuration)+'</div>';
801
- h+='<div class="run-meta-item">'+fmtDate(data.startedAt)+'</div>';
801
+ h+='<div class="run-meta-item">'+esc(fmtDate(data.startedAt))+'</div>';
802
802
  if(data.ci){
803
803
  h+='<div class="run-meta-item"><span class="ci-tag">'+esc(data.ci.provider)+'</span></div>';
804
804
  if(data.ci.branch)h+='<div class="run-meta-item"><span class="run-meta-label">Branch</span>'+esc(data.ci.branch)+'</div>';
@@ -4342,11 +4342,11 @@ ${r?`<meta name="artifact-server-port" content="${r}">`:""}
4342
4342
  ${l?`<script id="artifact-manifest-data" type="application/json">${l}</script>`:""}
4343
4343
  <script>${p}</script>
4344
4344
  </body>
4345
- </html>`}function ct(e){try{let t=process.platform,r,a;t==="darwin"?(r="open",a=[e]):t==="win32"?(r="cmd",a=["/c","start","",e]):(r="xdg-open",a=[e]),execFile(r,a,s=>{s&&process.stderr.write(`[testrelic] Failed to open browser: ${s.message}
4346
- `);});}catch{}}join(tmpdir(),"testrelic-data");async function Sr(e,t,r,a){let s=(t-1)*r,n=[],i=0,o=createInterface({input:createReadStream(e,{encoding:"utf-8"}),crlfDelay:1/0});for await(let c of o)if(c.length!==0){if(i>=s&&n.length<r)try{n.push(JSON.parse(c));}catch{}if(i++,n.length>=r&&a!==void 0)break}let l=a??i,d=Math.max(1,Math.ceil(l/r));return {items:n,total:l,page:t,pageSize:r,totalPages:d}}var Ar=/^[a-f0-9]{12}$/,ft=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,_r=500;function S(e,t,r){e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(r));}function Ir(e){e.setHeader("Access-Control-Allow-Origin","*"),e.setHeader("Access-Control-Allow-Methods","GET, DELETE, OPTIONS"),e.setHeader("Access-Control-Allow-Headers","Content-Type");}function he(e){try{return existsSync(e)?JSON.parse(readFileSync(e,"utf-8")):null}catch{return null}}function me(e){let t=0;try{let r=readdirSync(e,{withFileTypes:!0});for(let a of r){let s=join(e,a.name);a.isFile()?t+=statSync(s).size:a.isDirectory()&&(t+=me(s));}}catch{}return t}function Mr(e,t,r,a){let s=he(join(r,"index.json"));S(t,200,{status:"ok",reportMode:"streaming",testCount:s?.length??0,uptime:Math.floor((Date.now()-a)/1e3)});}function Er(e,t,r){let a=he(join(r,"summary.json"));if(!a){S(t,404,{error:"Summary not found"});return}S(t,200,a);}function Pr(e,t,r){let a=he(join(r,"index.json"));if(!a){S(t,404,{error:"Test index not found"});return}let n=new URL(e.url??"/",`http://${e.headers.host}`).searchParams,i=Math.max(1,parseInt(n.get("page")??"1",10)||1),o=Math.min(_r,Math.max(1,parseInt(n.get("pageSize")??"100",10)||100)),l=n.get("status")?.split(",").filter(Boolean)??null,d=n.get("file")??null,c=n.get("search")?.toLowerCase()??null,p=n.get("tag")?.split(",").filter(Boolean)??null,y=n.get("sort")??"file",f=n.get("order")==="desc"?-1:1,u=a;l&&l.length>0&&(u=u.filter(v=>l.includes(v.status))),d&&(u=u.filter(v=>v.filePath===d||v.filePath.startsWith(d+"/"))),c&&(u=u.filter(v=>v.title.toLowerCase().includes(c)||v.filePath.toLowerCase().includes(c))),p&&p.length>0&&(u=u.filter(v=>p.some(w=>v.tags.includes(w)))),u=[...u].sort((v,w)=>{let x=0;switch(y){case "duration":x=v.duration-w.duration;break;case "status":x=v.status.localeCompare(w.status);break;case "title":x=v.title.localeCompare(w.title);break;default:x=v.filePath.localeCompare(w.filePath);break}return x*f});let m=u.length,b=Math.max(1,Math.ceil(m/o)),h=(i-1)*o,g=u.slice(h,h+o);S(t,200,{tests:g,pagination:{page:i,pageSize:o,totalItems:m,totalPages:b},filters:{status:l,file:d,search:c,tag:p}});}function Dr(e,t,r,a){if(!Ar.test(a)){S(t,400,{error:"Invalid test ID format"});return}let s=join(r,"tests",a,"meta.json"),n=join(r,"tests",`${a}.json`),i=existsSync(s)?s:existsSync(n)?n:null;if(!i){S(t,404,{error:`Test not found: ${a}`});return}try{let o=readFileSync(i,"utf-8");t.writeHead(200,{"Content-Type":"application/json"}),t.end(o);}catch(o){S(t,500,{error:o instanceof Error?o.message:String(o)});}}async function Lr(e,t,r,a,s){if(!Ar.test(a)){S(t,400,{error:"Invalid test ID format"});return}let i=join(r,"tests",a,{network:"network.jsonl",console:"console.jsonl","api-calls":"api-calls.jsonl"}[s]);if(!existsSync(i)){S(t,200,{items:[],total:0,page:1,pageSize:50,totalPages:0});return}try{let l=new URL(e.url??"/",`http://${e.headers.host}`).searchParams,d=Math.max(1,parseInt(l.get("page")??"1",10)||1),c=Math.min(_r,Math.max(1,parseInt(l.get("pageSize")??"50",10)||50)),p,y=join(r,"tests",a,"meta.json");if(existsSync(y))try{let u=JSON.parse(readFileSync(y,"utf-8"));switch(s){case "network":p=u.networkRequestsCount;break;case "console":p=u.consoleLogsCount;break;case "api-calls":p=u.apiCallsCount;break}}catch{}let f=await Sr(i,d,c,p);S(t,200,f);}catch(o){S(t,500,{error:o instanceof Error?o.message:String(o)});}}function Nr(e,t,r){let a=he(join(r,"index.json"));if(!a){S(t,404,{error:"Test index not found"});return}let s=new Map;for(let i of a){if(i.isRetry)continue;let o=s.get(i.filePath);switch(o||(o={total:0,passed:0,failed:0,flaky:0,skipped:0,timedOut:0},s.set(i.filePath,o)),o.total++,i.status){case "passed":o.passed++;break;case "failed":o.failed++;break;case "flaky":o.flaky++;break;case "skipped":o.skipped++;break;case "timedout":o.timedOut++;break}}let n=Array.from(s.entries()).map(([i,o])=>({filePath:i,...o})).sort((i,o)=>i.filePath.localeCompare(o.filePath));S(t,200,{files:n});}function Fr(e,t,r){if(!existsSync(r)){S(t,200,{runs:[],totalSizeBytes:0});return}try{let a=[],s=0,n=readdirSync(r,{withFileTypes:!0});for(let i of n){if(!i.isDirectory()||!ft.test(i.name))continue;let o=join(r,i.name),l=me(o),d=readdirSync(o,{withFileTypes:!0}).filter(c=>c.isDirectory());a.push({folderName:i.name,totalSizeBytes:l,testCount:d.length}),s+=l;}a.sort((i,o)=>o.folderName.localeCompare(i.folderName)),S(t,200,{runs:a,totalSizeBytes:s});}catch(a){S(t,500,{error:a instanceof Error?a.message:String(a)});}}function Br(e,t,r){try{let a=0,s=0;if(existsSync(r)){let n=readdirSync(r,{withFileTypes:!0});for(let i of n){if(!i.isDirectory()||!ft.test(i.name))continue;let o=join(r,i.name),l=me(o);rmSync(o,{recursive:!0,force:!0}),s+=l,a++;}}S(t,200,{deletedCount:a,freedBytes:s});}catch(a){S(t,500,{error:a instanceof Error?a.message:String(a)});}}function Or(e,t,r,a){if(!ft.test(a)){S(t,400,{error:"Invalid folder name"});return}let s=join(r,a);try{if(!statSync(s).isDirectory()){S(t,404,{error:"Not found"});return}}catch{S(t,404,{error:"Not found"});return}try{let n=me(s);rmSync(s,{recursive:!0,force:!0}),S(t,200,{deleted:a,freedBytes:n});}catch(n){S(t,500,{error:n instanceof Error?n.message:String(n)});}}function Ur(e,t,r){S(t,200,{status:"shutting_down"}),r.close();}function gt(e,t,r){if(!existsSync(r)){S(t,404,{error:"File not found"});return}try{let a=statSync(r).size,s=extname(r).toLowerCase(),n=Ws[s]??"application/octet-stream",i=Gs(e.headers.range,a);if(i==="unsatisfiable"){t.writeHead(416,{"Content-Range":`bytes */${a}`,"Accept-Ranges":"bytes"}),t.end();return}if(i){t.writeHead(206,{"Content-Type":n,"Content-Length":i.end-i.start+1,"Content-Range":`bytes ${i.start}-${i.end}/${a}`,"Accept-Ranges":"bytes"}),Tr(createReadStream(r,{start:i.start,end:i.end}),t);return}t.writeHead(200,{"Content-Type":n,"Content-Length":a,"Accept-Ranges":"bytes"}),Tr(createReadStream(r),t);}catch(a){S(t,500,{error:a instanceof Error?a.message:String(a)});}}function Tr(e,t){e.on("error",()=>{e.destroy(),t.destroy();}),t.on("close",()=>{e.destroy();}),e.pipe(t);}function Gs(e,t){if(!e)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(e.trim());if(!r)return null;let[,a,s]=r;if(a===""&&s==="")return null;let n,i;if(a===""){let o=Number(s);if(o<=0)return "unsatisfiable";n=Math.max(0,t-o),i=t-1;}else n=Number(a),i=s===""?t-1:Math.min(Number(s),t-1);return !Number.isFinite(n)||!Number.isFinite(i)?null:t===0||n>=t||n>i?"unsatisfiable":{start:n,end:i}}var Ws={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".webm":"video/webm",".mp4":"video/mp4",".json":"application/json",".html":"text/html",".css":"text/css",".js":"text/javascript",".svg":"image/svg+xml"};var Xs=9323,Zs=10,Qs=1800*1e3;function oe(e,t){return new Promise((r,a)=>{let s=t?.port??Xs,n=Date.now(),i,o=0,l=existsSync(join(e,"artifacts"))?join(e,"artifacts"):existsSync(join(e,"..","artifacts"))?join(e,"..","artifacts"):join(e,"artifacts");function d(){clearTimeout(i),i=setTimeout(()=>{p.close();},Qs);}let c=t?.htmlPath??null;if(!c){let f=dirname(e);try{let u=readdirSync(f).find(m=>m.endsWith(".html"));u&&(c=join(f,u));}catch{}}let p=createServer((f,u)=>{if(d(),Ir(u),f.method==="OPTIONS"){u.writeHead(204),u.end();return}let m;try{m=new URL(f.url??"/",`http://${f.headers.host??"localhost"}`).pathname;}catch{S(u,400,{error:"Invalid URL"});return}if(f.method==="GET"&&(m==="/"||m==="/index.html")){if(c&&existsSync(c)){gt(f,u,c);return}S(u,404,{error:"HTML report not found"});return}if(f.method==="GET"&&m==="/api/health"){Mr(f,u,e,n);return}if(f.method==="GET"&&m==="/api/summary"){Er(f,u,e);return}if(f.method==="GET"&&m==="/api/tests"){Pr(f,u,e);return}if(f.method==="GET"&&m==="/api/files"){Nr(f,u,e);return}let b=m.match(/^\/api\/tests\/([a-f0-9]+)\/(network|console|api-calls)$/);if(f.method==="GET"&&b){Lr(f,u,e,b[1],b[2]);return}let h=m.match(/^\/api\/tests\/([a-f0-9]+)$/);if(f.method==="GET"&&h){Dr(f,u,e,h[1]);return}if(f.method==="GET"&&m==="/api/artifacts"){Fr(f,u,l);return}if(f.method==="DELETE"&&m==="/api/artifacts"){Br(f,u,l);return}let g=m.match(/^\/api\/artifacts\/(.+)$/);if(f.method==="DELETE"&&g){Or(f,u,l,decodeURIComponent(g[1]));return}if(f.method==="GET"&&m.startsWith("/artifacts/")){let v=decodeURIComponent(m.slice(11));if(v.includes("..")||v.includes("\0")){S(u,400,{error:"Invalid path"});return}gt(f,u,join(l,v));return}if(f.method==="POST"&&m==="/api/shutdown"){Ur(f,u,p);return}S(u,404,{error:"Not found"});});function y(f){let u=m=>{m.code==="EADDRINUSE"&&o<Zs?(o++,y(f+1)):a(m);};p.once("error",u),p.listen(f,"127.0.0.1",()=>{p.removeListener("error",u);let m=p.address();if(!m||typeof m=="string"){a(new Error("Failed to get server address"));return}d(),r({port:m.port,dispose:()=>new Promise(b=>{clearTimeout(i),p.close(()=>b());})});});}y(s);})}async function zr(e){let t=await oe(e);return {port:t.port,dispose:t.dispose}}function rn(e,t,r,a){let s=JSON.stringify(a?{...e,presentedSummary:a}:e),n=r?JSON.stringify(r):null;return kr(s,t,n)}async function mt(e,t,r,a){try{let s=null,n=null,i=t.reportMode==="streaming"||t.reportMode==="auto"&&e.timeline.length===0&&e.summary.total>=t.streamingThreshold,o,l=t.htmlReportPath,d=dirname(l);mkdirSync(d,{recursive:!0});let c="",p="[]",y=null,f=a?JSON.stringify(a):null;if(i){c=JSON.stringify({...e.summary,testRunId:e.testRunId,startedAt:e.startedAt,completedAt:e.completedAt,totalDuration:e.totalDuration,ci:e.ci,metadata:e.metadata,shardRunIds:e.shardRunIds});let m=dirname(t.outputPath),b=join(m,".testrelic-report");try{let h=join(b,"index-compact.json"),g=join(b,"index.json");existsSync(h)?p=readFileSync(h,"utf-8"):existsSync(g)&&(p=readFileSync(g,"utf-8"));}catch{}y=r?JSON.stringify(r):null,o=dt(c,p,null,y,f);}else o=rn(e,null,r,a);let u=l+".tmp";if(writeFileSync(u,o,"utf-8"),renameSync(u,l),i){if(e.ci===null){let m=dirname(t.outputPath),b=join(m,".testrelic-report"),h=resolve(l);try{if(await sn(),s=await nn(b),!s){n=await oe(b,{htmlPath:h}),s=n.port;let g=setInterval(()=>{},6e4),v=()=>{clearInterval(g),n?.dispose();};process.on("SIGINT",v),process.on("SIGTERM",v),setTimeout(v,1800*1e3).unref();}if(s){process.stderr.write(`
4345
+ </html>`}function ct(e){try{let t=process.platform,r,a;t==="darwin"?(r="open",a=[e]):t==="win32"?(r="explorer.exe",a=[e]):(r="xdg-open",a=[e]),execFile(r,a,s=>{s&&process.stderr.write(`[testrelic] Failed to open browser: ${s.message}
4346
+ `);});}catch{}}join(tmpdir(),"testrelic-data");async function Sr(e,t,r,a){let s=(t-1)*r,n=[],i=0,o=createInterface({input:createReadStream(e,{encoding:"utf-8"}),crlfDelay:1/0});for await(let c of o)if(c.length!==0){if(i>=s&&n.length<r)try{n.push(JSON.parse(c));}catch{}if(i++,n.length>=r&&a!==void 0)break}let l=a??i,d=Math.max(1,Math.ceil(l/r));return {items:n,total:l,page:t,pageSize:r,totalPages:d}}var Ar=/^[a-f0-9]{12}$/,ft=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,_r=500;function S(e,t,r){e.writeHead(t,{"Content-Type":"application/json"}),e.end(JSON.stringify(r));}function Ir(e){e.setHeader("Access-Control-Allow-Origin","*"),e.setHeader("Access-Control-Allow-Methods","GET, DELETE, OPTIONS"),e.setHeader("Access-Control-Allow-Headers","Content-Type");}function he(e){try{return existsSync(e)?JSON.parse(readFileSync(e,"utf-8")):null}catch{return null}}function me(e){let t=0;try{let r=readdirSync(e,{withFileTypes:!0});for(let a of r){let s=join(e,a.name);a.isFile()?t+=statSync(s).size:a.isDirectory()&&(t+=me(s));}}catch{}return t}function Mr(e,t,r,a){let s=he(join(r,"index.json"));S(t,200,{status:"ok",reportMode:"streaming",testCount:s?.length??0,uptime:Math.floor((Date.now()-a)/1e3)});}function Er(e,t,r){let a=he(join(r,"summary.json"));if(!a){S(t,404,{error:"Summary not found"});return}S(t,200,a);}function Pr(e,t,r){let a=he(join(r,"index.json"));if(!a){S(t,404,{error:"Test index not found"});return}let n=new URL(e.url??"/",`http://${e.headers.host}`).searchParams,i=Math.max(1,parseInt(n.get("page")??"1",10)||1),o=Math.min(_r,Math.max(1,parseInt(n.get("pageSize")??"100",10)||100)),l=n.get("status")?.split(",").filter(Boolean)??null,d=n.get("file")??null,c=n.get("search")?.toLowerCase()??null,p=n.get("tag")?.split(",").filter(Boolean)??null,y=n.get("sort")??"file",f=n.get("order")==="desc"?-1:1,u=a;l&&l.length>0&&(u=u.filter(v=>l.includes(v.status))),d&&(u=u.filter(v=>v.filePath===d||v.filePath.startsWith(d+"/"))),c&&(u=u.filter(v=>v.title.toLowerCase().includes(c)||v.filePath.toLowerCase().includes(c))),p&&p.length>0&&(u=u.filter(v=>p.some(w=>v.tags.includes(w)))),u=[...u].sort((v,w)=>{let x=0;switch(y){case "duration":x=v.duration-w.duration;break;case "status":x=v.status.localeCompare(w.status);break;case "title":x=v.title.localeCompare(w.title);break;default:x=v.filePath.localeCompare(w.filePath);break}return x*f});let m=u.length,b=Math.max(1,Math.ceil(m/o)),h=(i-1)*o,g=u.slice(h,h+o);S(t,200,{tests:g,pagination:{page:i,pageSize:o,totalItems:m,totalPages:b},filters:{status:l,file:d,search:c,tag:p}});}function Dr(e,t,r,a){if(!Ar.test(a)){S(t,400,{error:"Invalid test ID format"});return}let s=join(r,"tests",a,"meta.json"),n=join(r,"tests",`${a}.json`),i=existsSync(s)?s:existsSync(n)?n:null;if(!i){S(t,404,{error:`Test not found: ${a}`});return}try{let o=readFileSync(i,"utf-8");t.writeHead(200,{"Content-Type":"application/json"}),t.end(o);}catch{S(t,500,{error:"Failed to read the test data file"});}}async function Lr(e,t,r,a,s){if(!Ar.test(a)){S(t,400,{error:"Invalid test ID format"});return}let i=join(r,"tests",a,{network:"network.jsonl",console:"console.jsonl","api-calls":"api-calls.jsonl"}[s]);if(!existsSync(i)){S(t,200,{items:[],total:0,page:1,pageSize:50,totalPages:0});return}try{let l=new URL(e.url??"/",`http://${e.headers.host}`).searchParams,d=Math.max(1,parseInt(l.get("page")??"1",10)||1),c=Math.min(_r,Math.max(1,parseInt(l.get("pageSize")??"50",10)||50)),p,y=join(r,"tests",a,"meta.json");if(existsSync(y))try{let u=JSON.parse(readFileSync(y,"utf-8"));switch(s){case "network":p=u.networkRequestsCount;break;case "console":p=u.consoleLogsCount;break;case "api-calls":p=u.apiCallsCount;break}}catch{}let f=await Sr(i,d,c,p);S(t,200,f);}catch{S(t,500,{error:"Failed to read the report data"});}}function Nr(e,t,r){let a=he(join(r,"index.json"));if(!a){S(t,404,{error:"Test index not found"});return}let s=new Map;for(let i of a){if(i.isRetry)continue;let o=s.get(i.filePath);switch(o||(o={total:0,passed:0,failed:0,flaky:0,skipped:0,timedOut:0},s.set(i.filePath,o)),o.total++,i.status){case "passed":o.passed++;break;case "failed":o.failed++;break;case "flaky":o.flaky++;break;case "skipped":o.skipped++;break;case "timedout":o.timedOut++;break}}let n=Array.from(s.entries()).map(([i,o])=>({filePath:i,...o})).sort((i,o)=>i.filePath.localeCompare(o.filePath));S(t,200,{files:n});}function Fr(e,t,r){if(!existsSync(r)){S(t,200,{runs:[],totalSizeBytes:0});return}try{let a=[],s=0,n=readdirSync(r,{withFileTypes:!0});for(let i of n){if(!i.isDirectory()||!ft.test(i.name))continue;let o=join(r,i.name),l=me(o),d=readdirSync(o,{withFileTypes:!0}).filter(c=>c.isDirectory());a.push({folderName:i.name,totalSizeBytes:l,testCount:d.length}),s+=l;}a.sort((i,o)=>o.folderName.localeCompare(i.folderName)),S(t,200,{runs:a,totalSizeBytes:s});}catch{S(t,500,{error:"Failed to read the report data"});}}function Br(e,t,r){try{let a=0,s=0;if(existsSync(r)){let n=readdirSync(r,{withFileTypes:!0});for(let i of n){if(!i.isDirectory()||!ft.test(i.name))continue;let o=join(r,i.name),l=me(o);rmSync(o,{recursive:!0,force:!0}),s+=l,a++;}}S(t,200,{deletedCount:a,freedBytes:s});}catch{S(t,500,{error:"Failed to read the report data"});}}function Or(e,t,r,a){if(!ft.test(a)){S(t,400,{error:"Invalid folder name"});return}let s=join(r,a);try{if(!statSync(s).isDirectory()){S(t,404,{error:"Not found"});return}}catch{S(t,404,{error:"Not found"});return}try{let n=me(s);rmSync(s,{recursive:!0,force:!0}),S(t,200,{deleted:a,freedBytes:n});}catch{S(t,500,{error:"Failed to read the report data"});}}function Ur(e,t,r){S(t,200,{status:"shutting_down"}),r.close();}function gt(e,t,r){if(!existsSync(r)){S(t,404,{error:"File not found"});return}try{let a=statSync(r).size,s=extname(r).toLowerCase(),n=Ws[s]??"application/octet-stream",i=Gs(e.headers.range,a);if(i==="unsatisfiable"){t.writeHead(416,{"Content-Range":`bytes */${a}`,"Accept-Ranges":"bytes"}),t.end();return}if(i){t.writeHead(206,{"Content-Type":n,"Content-Length":i.end-i.start+1,"Content-Range":`bytes ${i.start}-${i.end}/${a}`,"Accept-Ranges":"bytes"}),Tr(createReadStream(r,{start:i.start,end:i.end}),t);return}t.writeHead(200,{"Content-Type":n,"Content-Length":a,"Accept-Ranges":"bytes"}),Tr(createReadStream(r),t);}catch{S(t,500,{error:"Failed to read the report data"});}}function Tr(e,t){e.on("error",()=>{e.destroy(),t.destroy();}),t.on("close",()=>{e.destroy();}),e.pipe(t);}function Gs(e,t){if(!e)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(e.trim());if(!r)return null;let[,a,s]=r;if(a===""&&s==="")return null;let n,i;if(a===""){let o=Number(s);if(o<=0)return "unsatisfiable";n=Math.max(0,t-o),i=t-1;}else n=Number(a),i=s===""?t-1:Math.min(Number(s),t-1);return !Number.isFinite(n)||!Number.isFinite(i)?null:t===0||n>=t||n>i?"unsatisfiable":{start:n,end:i}}var Ws={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".webm":"video/webm",".mp4":"video/mp4",".json":"application/json",".html":"text/html",".css":"text/css",".js":"text/javascript",".svg":"image/svg+xml"};var Xs=9323,Zs=10,Qs=1800*1e3;function oe(e,t){return new Promise((r,a)=>{let s=t?.port??Xs,n=Date.now(),i,o=0,l=existsSync(join(e,"artifacts"))?join(e,"artifacts"):existsSync(join(e,"..","artifacts"))?join(e,"..","artifacts"):join(e,"artifacts");function d(){clearTimeout(i),i=setTimeout(()=>{p.close();},Qs);}let c=t?.htmlPath??null;if(!c){let f=dirname(e);try{let u=readdirSync(f).find(m=>m.endsWith(".html"));u&&(c=join(f,u));}catch{}}let p=createServer((f,u)=>{if(d(),Ir(u),f.method==="OPTIONS"){u.writeHead(204),u.end();return}let m;try{m=new URL(f.url??"/",`http://${f.headers.host??"localhost"}`).pathname;}catch{S(u,400,{error:"Invalid URL"});return}if(f.method==="GET"&&(m==="/"||m==="/index.html")){if(c&&existsSync(c)){gt(f,u,c);return}S(u,404,{error:"HTML report not found"});return}if(f.method==="GET"&&m==="/api/health"){Mr(f,u,e,n);return}if(f.method==="GET"&&m==="/api/summary"){Er(f,u,e);return}if(f.method==="GET"&&m==="/api/tests"){Pr(f,u,e);return}if(f.method==="GET"&&m==="/api/files"){Nr(f,u,e);return}let b=m.match(/^\/api\/tests\/([a-f0-9]+)\/(network|console|api-calls)$/);if(f.method==="GET"&&b){Lr(f,u,e,b[1],b[2]);return}let h=m.match(/^\/api\/tests\/([a-f0-9]+)$/);if(f.method==="GET"&&h){Dr(f,u,e,h[1]);return}if(f.method==="GET"&&m==="/api/artifacts"){Fr(f,u,l);return}if(f.method==="DELETE"&&m==="/api/artifacts"){Br(f,u,l);return}let g=m.match(/^\/api\/artifacts\/(.+)$/);if(f.method==="DELETE"&&g){Or(f,u,l,decodeURIComponent(g[1]));return}if(f.method==="GET"&&m.startsWith("/artifacts/")){let v=decodeURIComponent(m.slice(11));if(v.includes("..")||v.includes("\0")){S(u,400,{error:"Invalid path"});return}gt(f,u,join(l,v));return}if(f.method==="POST"&&m==="/api/shutdown"){Ur(f,u,p);return}S(u,404,{error:"Not found"});});function y(f){let u=m=>{m.code==="EADDRINUSE"&&o<Zs?(o++,y(f+1)):a(m);};p.once("error",u),p.listen(f,"127.0.0.1",()=>{p.removeListener("error",u);let m=p.address();if(!m||typeof m=="string"){a(new Error("Failed to get server address"));return}d(),r({port:m.port,dispose:()=>new Promise(b=>{clearTimeout(i),p.close(()=>b());})});});}y(s);})}async function zr(e){let t=await oe(e);return {port:t.port,dispose:t.dispose}}function rn(e,t,r,a){let s=JSON.stringify(a?{...e,presentedSummary:a}:e),n=r?JSON.stringify(r):null;return kr(s,t,n)}async function mt(e,t,r,a){try{let s=null,n=null,i=t.reportMode==="streaming"||t.reportMode==="auto"&&e.timeline.length===0&&e.summary.total>=t.streamingThreshold,o,l=t.htmlReportPath,d=dirname(l);mkdirSync(d,{recursive:!0});let c="",p="[]",y=null,f=a?JSON.stringify(a):null;if(i){c=JSON.stringify({...e.summary,testRunId:e.testRunId,startedAt:e.startedAt,completedAt:e.completedAt,totalDuration:e.totalDuration,ci:e.ci,metadata:e.metadata,shardRunIds:e.shardRunIds});let m=dirname(t.outputPath),b=join(m,".testrelic-report");try{let h=join(b,"index-compact.json"),g=join(b,"index.json");existsSync(h)?p=readFileSync(h,"utf-8"):existsSync(g)&&(p=readFileSync(g,"utf-8"));}catch{}y=r?JSON.stringify(r):null,o=dt(c,p,null,y,f);}else o=rn(e,null,r,a);let u=l+".tmp";if(writeFileSync(u,o,"utf-8"),renameSync(u,l),i){if(e.ci===null){let m=dirname(t.outputPath),b=join(m,".testrelic-report"),h=resolve(l);try{if(await sn(),s=await nn(b),!s){n=await oe(b,{htmlPath:h}),s=n.port;let g=setInterval(()=>{},6e4),v=()=>{clearInterval(g),n?.dispose();};process.on("SIGINT",v),process.on("SIGTERM",v),setTimeout(v,1800*1e3).unref();}if(s){process.stderr.write(`
4347
4347
  Report server: http://127.0.0.1:${s}
4348
4348
  `);try{let g=dt(c,p,s,y,f),v=l+".tmp";writeFileSync(v,g,"utf-8"),renameSync(v,l);}catch{}}}catch{}}}else if(t.openReport&&e.ci===null&&t.includeArtifacts){let m=dirname(t.outputPath),b=join(m,"artifacts");if(existsSync(b))try{let h=await zr(b);s=h.port,process.on("exit",()=>{h.dispose();});}catch{}}if(t.openReport&&e.ci===null)if(i&&s)ct(`http://127.0.0.1:${s}`);else {let m=resolve(l);ct(m);}}catch(s){process.stderr.write(`[testrelic] Failed to write HTML report: ${s instanceof Error?s.message:String(s)}
4349
- `);}}var be=9323,jr=10;async function an(){for(let e=be;e<be+jr;e++)try{let t=new AbortController,r=setTimeout(()=>t.abort(),500),a=await fetch(`http://127.0.0.1:${e}/api/health`,{signal:t.signal});if(clearTimeout(r),a.ok)return e}catch{}return null}async function sn(){for(let e=be;e<be+jr;e++)try{let t=new AbortController,r=setTimeout(()=>t.abort(),1e3);await fetch(`http://127.0.0.1:${e}/api/shutdown`,{method:"POST",signal:t.signal}),clearTimeout(r);}catch{}await new Promise(e=>setTimeout(e,300));}async function nn(e){let r=[join(__dirname,"cli.cjs"),join(__dirname,"cli.js"),join(__dirname,"..","dist","cli.cjs"),join(__dirname,"..","dist","cli.js")].find(a=>existsSync(a));if(!r){let a=await oe(e);return process.on("exit",()=>{a?.dispose();}),a.port}return new Promise(a=>{let s=spawn(process.execPath,[r,"serve",e],{detached:true,stdio:["ignore","ignore","pipe"],env:{...process.env}}),n="",i=false,o=setTimeout(()=>{i||(i=true,s.stderr?.removeAllListeners(),an().then(a));},5e3);s.stderr?.on("data",l=>{n+=l.toString();let d=n.match(/127\.0\.0\.1:(\d+)/);d&&!i&&(i=true,clearTimeout(o),s.stderr?.removeAllListeners(),s.unref(),a(Number(d[1])));}),s.on("error",()=>{i||(i=true,clearTimeout(o),a(null));}),s.on("exit",()=>{i||(i=true,clearTimeout(o),a(null));}),s.unref();})}var Gr=Buffer.from([137,80,78,71,13,10,26,10]),on=16,ln=20,xe=24;function Wr(e){if(e.length<xe||!e.subarray(0,Gr.length).equals(Gr))return null;let t=e.readUInt32BE(on),r=e.readUInt32BE(ln);return t===0||r===0?null:{width:t,height:r}}var dn=/(\d+) pixels \(ratio [\d.]+ of all image pixels\) are different/,Kr=/Expected an image (\d+)px by (\d+)px, received (\d+)px by (\d+)px/;function Jr(e){return e?Kr.test(e):false}var cn=/^\s*Snapshot:\s*(.+?)\s*$/m;function Yr(e){if(!e)return {};let t={},r=dn.exec(e);if(r){let n=Number.parseInt(r[1],10);Number.isFinite(n)&&(t.diffPixels=n);}let a=Kr.exec(e);if(a){let[,n,i,o,l]=a,d=[n,i,o,l].map(c=>Number.parseInt(c,10));d.every(c=>Number.isFinite(c))&&(t.expectedWidth=d[0],t.expectedHeight=d[1],t.actualWidth=d[2],t.actualHeight=d[3]);}let s=cn.exec(e);return s&&(t.snapshotName=s[1]),t}function Xr(e,t){if(e===void 0||!t)return;let r=t.width*t.height;if(!(r<=0))return e/r}var vn=20,vt=0,yt=[];async function le(e,t){vt>=vn&&await new Promise(r=>yt.push(r)),vt++;try{return await copyFile(e,t),!0}catch{return false}finally{vt--,yt.length>0&&yt.shift()();}}var H=[];async function ea(){H.length!==0&&(await Promise.allSettled(H),H.length=0);}function ta(e){let t=new Date,r=n=>String(n).padStart(2,"0"),a=`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())}T${r(t.getHours())}-${r(t.getMinutes())}-${r(t.getSeconds())}`;if(!existsSync(join(e,a)))return a;let s=1;for(;existsSync(join(e,`${a}-${s}`));)s++;return `${a}-${s}`}function bt(e){let t=e.replace(/[^a-zA-Z0-9\-_ ]/g,"-").replace(/\s+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"");return t.length>100&&(t=t.substring(0,100).replace(/-+$/,"")),t||"unnamed-test"}var yn=8;function ra(e,t,r){let a=bt(e),s=r?bt(r).substring(0,yn):"";return s&&(a+=`--${s}`),t>0&&(a+=`--retry-${t}`),a}function aa(e,t,r,a,s,n){let i=e.find(u=>u.name==="screenshot"&&u.path),o=e.find(u=>u.name==="video"&&u.path),l=e.find(u=>u.name==="trace"&&u.path);if(!i&&!o&&!l)return null;let d=ra(t,r,n),c=s?["artifacts",s,d]:["artifacts",d],p=join(a,...c),y=c,f={};try{mkdirSync(p,{recursive:!0});}catch{return null}if(i?.path&&existsSync(i.path)){let m=`screenshot${extname(i.path)||".png"}`,b=join(p,m);H.push(le(i.path,b).then(()=>{})),f.screenshot=`${y.join("/")}/${m}`;}if(o?.path&&existsSync(o.path)){let m=`video${extname(o.path)||".webm"}`,b=join(p,m);H.push(le(o.path,b).then(()=>{})),f.video=`${y.join("/")}/${m}`;}if(l?.path&&existsSync(l.path)){let m=`trace${extname(l.path)||".zip"}`,b=join(p,m);H.push(le(l.path,b).then(()=>{})),f.trace=`${y.join("/")}/${m}`;}return !f.screenshot&&!f.video&&!f.trace?null:f}var xt="visual",bn=6;function xn(e){let t=createHash("sha256").update(e).digest("hex").substring(0,bn);return `${bt(e)}--${t}`}function Zr(e){let t=null;try{t=openSync(e,"r");let r=Buffer.alloc(xe),a=readSync(t,r,0,xe,0);return Wr(r.subarray(0,a))}catch{return null}finally{if(t!==null)try{closeSync(t);}catch{}}}var Qr=[{key:"expectedPath",dest:"baseline",field:"baseline"},{key:"actualPath",dest:"actual",field:"actual"},{key:"diffPath",dest:"diff",field:"diff"},{key:"previousPath",dest:"previous",field:"previous"}],wn=[{key:"baselineDomPath",dest:"baseline.dom.json",field:"baselineDom"},{key:"actualDomPath",dest:"actual.dom.json",field:"actualDom"}];function kn(e,t,r,a){let s=xn(e.name),n=join(t,s),i=Qr.some(u=>e[u.key]);if(i||e.dom)try{mkdirSync(n,{recursive:!0});}catch{return null}let o={},l=false;for(let u of Qr){let m=e[u.key];if(!m||!existsSync(m))continue;let b=extname(m)||".png",h=`${u.dest}${b}`;H.push(le(m,join(n,h)).then(()=>{})),o[u.field]=`${r}/${xt}/${s}/${h}`,l=true;}let d=e.dom;if(d)for(let u of wn){let m=d[u.key];!m||!existsSync(m)||(H.push(le(m,join(n,u.dest)).then(()=>{})),o[u.field]=`${r}/${xt}/${s}/${u.dest}`);}if(!l&&i)return null;let c=e.expectedPath?Zr(e.expectedPath):e.actualPath?Zr(e.actualPath):null,p=Xr(e.diffPixels,c),y=e.committedPath??e.expectedPath,f=y?relative(a,y).replace(/\\/g,"/"):void 0;return {name:e.name,status:e.status,source:e.source,...o,...f?{baselinePath:f}:{},...c?{width:c.width,height:c.height}:{},...e.actualWidth!==void 0?{actualWidth:e.actualWidth}:{},...e.actualHeight!==void 0?{actualHeight:e.actualHeight}:{},...e.diffPixels!==void 0?{diffPixels:e.diffPixels}:{},...p!==void 0?{diffPixelRatio:p}:{},...d?{domChanges:d.changes,domChangeCount:d.total,domRootCauses:d.rootCauses,domTruncated:d.truncated,domCaptureBox:d.captureBox}:{}}}function sa(e,t,r,a,s,n,i=process.cwd()){if(e.length===0)return null;let o=ra(t,r,n),l=s?["artifacts",s,o]:["artifacts",o],d=join(a,...l,xt),c=l.join("/");try{mkdirSync(d,{recursive:!0});}catch{return null}let p=[];for(let y of e){let f=kn(y,d,c,i);f&&p.push(f);}return p.length>0?p:null}var na="testrelic-visual-dom";var Sn="testrelic-visual",Cn=/^(.+)-(expected|actual|diff|previous)(\.[A-Za-z0-9]+)$/;function Tn(e){let t=new Map;for(let r of e)if(!(r.name!==Sn||!r.body))try{let a=JSON.parse(r.body.toString("utf-8"));if(!Array.isArray(a))continue;for(let s of a){let n=An(s);n&&t.set(n.stem,n);}}catch{}return t}var Rn=["passed","failed","new","updated"];function An(e){if(typeof e!="object"||e===null)return null;let t=e;return typeof t.stem!="string"||!t.stem||typeof t.name!="string"||!t.name||typeof t.status!="string"||!Rn.includes(t.status)?null:{stem:t.stem,name:t.name,status:t.status,...typeof t.committedPath=="string"&&t.committedPath?{committedPath:t.committedPath}:{}}}function _n(e){let t=new Map;for(let r of e)if(!(r.name!==na||!r.body))try{let a=JSON.parse(r.body.toString("utf-8"));if(!Array.isArray(a))continue;for(let s of a){if(typeof s!="object"||s===null)continue;let n=s;typeof n.stem!="string"||!Array.isArray(n.changes)||t.set(n.stem,s);}}catch{}return t}function In(e){let t=new Map;for(let r of e){if(!r.path)continue;let a=Cn.exec(r.name);if(!a)continue;let[,s,n]=a,i=t.get(s)??{};i[n]=r.path,t.set(s,i);}return t}function Mn(e){return !!(e.actual&&(e.expected||e.diff))}function En(e,t,r){return e.diff||Jr(r)?"failed":t?"updated":"new"}function Pn(e,t){if(e.length===0)return null;if(e.length===1)return e[0];if(!t)return null;let r=t.replace(/\.[A-Za-z0-9]+$/,""),a=e.filter(s=>s===r||s.endsWith(`/${r}`));return a.length===1?a[0]:null}function la(e,t={}){if(e.length===0)return [];let r=Tn(e),a=_n(e),s=In(e);if(s.size===0&&r.size===0)return [];let n=t.updatingSnapshots===true,i=[];for(let[o,l]of s){let d=r.get(o);!d&&!Mn(l)||i.push({name:d?.name??o,status:d?.status??En(l,n,t.failureMessage),source:d?"toMatchVisualBaseline":"toHaveScreenshot",...l.expected?{expectedPath:l.expected}:{},...d?.committedPath?{committedPath:d.committedPath}:{},...l.actual?{actualPath:l.actual}:{},...l.diff?{diffPath:l.diff}:{},...l.previous?{previousPath:l.previous}:{},...a.has(o)?{dom:a.get(o)}:{}});}for(let[o,l]of r)s.has(o)||i.push({name:l.name,status:l.status,source:"toMatchVisualBaseline",...l.committedPath?{committedPath:l.committedPath}:{},...a.has(o)?{dom:a.get(o)}:{}});return Dn(i,s,t.failureMessage)}function Dn(e,t,r){let a=Yr(r);if(a.diffPixels===void 0&&a.actualWidth===void 0)return [...e];let s=e.filter(i=>i.status==="failed"&&ia(i)).map(i=>oa(i,t)),n=Pn(s,a.snapshotName);return n===null?[...e]:e.map(i=>ia(i)&&oa(i,t)===n?{...i,...a.diffPixels!==void 0?{diffPixels:a.diffPixels}:{},...a.actualWidth!==void 0?{actualWidth:a.actualWidth}:{},...a.actualHeight!==void 0?{actualHeight:a.actualHeight}:{}}:i)}function ia(e){return !!(e.expectedPath||e.actualPath||e.diffPath||e.previousPath)}function oa(e,t){if(t.has(e.name))return e.name;for(let[r,a]of t)if(a.actual===e.actualPath&&a.expected===e.expectedPath&&a.diff===e.diffPath)return r;return e.name}var Ln=new RegExp("[\x1B\x9B][[\\]()#;?]*(?:\\d{1,4}(?:;\\d{0,4})*)?[0-9A-PR-TZcf-nqry=><]","g");function ke(e){return !e||e.indexOf("\x1B")===-1&&e.indexOf("\x9B")===-1?e:e.replace(Ln,"")}function da(e){return e==null?null:ke(e)}var Nn=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,Fn="1.0",kt="visual";function fa(e){let t=extname(e).toLowerCase();return [".png",".jpg",".jpeg",".gif",".bmp",".webp"].includes(t)?"screenshot":[".webm",".mp4",".avi",".mov"].includes(t)?"video":t===".zip"&&basename(e,t)==="trace"?"trace":"other"}function Bn(e){if(e.endsWith(".dom.json"))return "dom";let t=basename(e,extname(e));return t==="baseline"?"baseline":t==="diff"?"diff":fa(e)}function On(e,t,r){let a=[];try{for(let s of readdirSync(e,{withFileTypes:!0})){if(!s.isFile())continue;let n=statSync(join(e,s.name));a.push({name:`${kt}/${r}/${s.name}`,type:Bn(s.name),relativePath:`${t}/${kt}/${r}/${s.name}`,sizeBytes:n.size});}}catch{}return a}function ga(e,t,r){let a=[],s=`artifacts/${t}/${r}`;try{let n=readdirSync(e,{withFileTypes:!0});for(let i of n){if(i.isDirectory()&&i.name===kt){let d=join(e,i.name);for(let c of readdirSync(d,{withFileTypes:!0}))c.isDirectory()&&a.push(...On(join(d,c.name),s,c.name));continue}if(!i.isFile())continue;let o=join(e,i.name),l=statSync(o);a.push({name:i.name,type:fa(i.name),relativePath:`${s}/${i.name}`,sizeBytes:l.size});}}catch{}return {testName:r,files:a}}function Un(e,t){let r=join(e,t),a=[],s=0;try{let i=readdirSync(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory())continue;let l=ga(join(r,o.name),t,o.name);a.push(l);for(let d of l.files)s+=d.sizeBytes;}}catch{}let n=t.replace(/^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})/,"$1T$2:$3:$4").replace(/-\d+$/,"");return a.sort((i,o)=>i.testName.localeCompare(o.testName)),{folderName:t,timestamp:n,totalSizeBytes:s,testCount:a.length,tests:a,isCurrentRun:false}}function ha(e,t){let r=join(e,"artifacts"),a=[],s=[],n=0;try{let o=readdirSync(r,{withFileTypes:!0});for(let l of o)if(l.isDirectory())if(Nn.test(l.name)){let d=Un(r,l.name);a.push({...d,isCurrentRun:l.name===t});}else {let d=ga(join(r,l.name),l.name,l.name);s.push(d);for(let c of d.files)n+=c.sizeBytes;}}catch{}a.sort((o,l)=>l.timestamp.localeCompare(o.timestamp)),s.length>0&&(s.sort((o,l)=>o.testName.localeCompare(l.testName)),a.push({folderName:"__legacy__",timestamp:"1970-01-01T00:00:00",totalSizeBytes:n,testCount:s.length,tests:s,isCurrentRun:false}));let i=a.reduce((o,l)=>o+l.totalSizeBytes,0);return {schemaVersion:Fn,generatedAt:new Date().toISOString(),artifactBaseDir:"artifacts",totalSizeBytes:i,runs:a,serverPort:null}}var jn=256;function Gn(e){let t=resolve(e);for(let r=0;r<jn;r++){if(existsSync(join(t,".git")))return t;let a=dirname(t);if(a===t)return null;t=a;}return null}function ya(e){try{let t=Gn(e);if(!t)return;let r=join(t,".gitignore"),a=relative(t,e).replace(/\\/g,"/"),s=a.endsWith("/")?a:`${a}/`;if(existsSync(r)&&readFileSync(r,"utf-8").split(`
4349
+ `);}}var be=9323,jr=10;async function an(){for(let e=be;e<be+jr;e++)try{let t=new AbortController,r=setTimeout(()=>t.abort(),500),a=await fetch(`http://127.0.0.1:${e}/api/health`,{signal:t.signal});if(clearTimeout(r),a.ok)return e}catch{}return null}async function sn(){for(let e=be;e<be+jr;e++)try{let t=new AbortController,r=setTimeout(()=>t.abort(),1e3);await fetch(`http://127.0.0.1:${e}/api/shutdown`,{method:"POST",signal:t.signal}),clearTimeout(r);}catch{}await new Promise(e=>setTimeout(e,300));}async function nn(e){let r=[join(__dirname,"cli.cjs"),join(__dirname,"cli.js"),join(__dirname,"..","dist","cli.cjs"),join(__dirname,"..","dist","cli.js")].find(a=>existsSync(a));if(!r){let a=await oe(e);return process.on("exit",()=>{a?.dispose();}),a.port}return new Promise(a=>{let s=spawn(process.execPath,[r,"serve",e],{detached:true,stdio:["ignore","ignore","pipe"],env:{...process.env}}),n="",i=false,o=setTimeout(()=>{i||(i=true,s.stderr?.removeAllListeners(),an().then(a));},5e3);s.stderr?.on("data",l=>{n+=l.toString();let d=n.match(/127\.0\.0\.1:(\d+)/);d&&!i&&(i=true,clearTimeout(o),s.stderr?.removeAllListeners(),s.unref(),a(Number(d[1])));}),s.on("error",()=>{i||(i=true,clearTimeout(o),a(null));}),s.on("exit",()=>{i||(i=true,clearTimeout(o),a(null));}),s.unref();})}var Gr=Buffer.from([137,80,78,71,13,10,26,10]),on=16,ln=20,xe=24;function Wr(e){if(e.length<xe||!e.subarray(0,Gr.length).equals(Gr))return null;let t=e.readUInt32BE(on),r=e.readUInt32BE(ln);return t===0||r===0?null:{width:t,height:r}}var dn=/(?:^|\D)(\d+) pixels \(ratio [\d.]+ of all image pixels\) are different/,Kr=/Expected an image (\d+)px by (\d+)px, received (\d+)px by (\d+)px/;function Jr(e){return e?Kr.test(e):false}var cn=/^[ \t]*Snapshot:[ \t]*(\S(?:.*\S)?)[ \t]*$/m;function Yr(e){if(!e)return {};let t={},r=dn.exec(e);if(r){let n=Number.parseInt(r[1],10);Number.isFinite(n)&&(t.diffPixels=n);}let a=Kr.exec(e);if(a){let[,n,i,o,l]=a,d=[n,i,o,l].map(c=>Number.parseInt(c,10));d.every(c=>Number.isFinite(c))&&(t.expectedWidth=d[0],t.expectedHeight=d[1],t.actualWidth=d[2],t.actualHeight=d[3]);}let s=cn.exec(e);return s&&(t.snapshotName=s[1]),t}function Xr(e,t){if(e===void 0||!t)return;let r=t.width*t.height;if(!(r<=0))return e/r}var vn=20,vt=0,yt=[];async function le(e,t){vt>=vn&&await new Promise(r=>yt.push(r)),vt++;try{return await copyFile(e,t),!0}catch{return false}finally{vt--,yt.length>0&&yt.shift()();}}var H=[];async function ea(){H.length!==0&&(await Promise.allSettled(H),H.length=0);}function ta(e){let t=new Date,r=n=>String(n).padStart(2,"0"),a=`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())}T${r(t.getHours())}-${r(t.getMinutes())}-${r(t.getSeconds())}`;if(!existsSync(join(e,a)))return a;let s=1;for(;existsSync(join(e,`${a}-${s}`));)s++;return `${a}-${s}`}function bt(e){let t=e.replace(/[^a-zA-Z0-9\-_ ]/g,"-").replace(/\s+/g,"-").replace(/-{2,}/g,"-").replace(/^-|-$/g,"");return t.length>100&&(t=t.substring(0,100).replace(/-+$/,"")),t||"unnamed-test"}var yn=8;function ra(e,t,r){let a=bt(e),s=r?bt(r).substring(0,yn):"";return s&&(a+=`--${s}`),t>0&&(a+=`--retry-${t}`),a}function aa(e,t,r,a,s,n){let i=e.find(u=>u.name==="screenshot"&&u.path),o=e.find(u=>u.name==="video"&&u.path),l=e.find(u=>u.name==="trace"&&u.path);if(!i&&!o&&!l)return null;let d=ra(t,r,n),c=s?["artifacts",s,d]:["artifacts",d],p=join(a,...c),y=c,f={};try{mkdirSync(p,{recursive:!0});}catch{return null}if(i?.path&&existsSync(i.path)){let m=`screenshot${extname(i.path)||".png"}`,b=join(p,m);H.push(le(i.path,b).then(()=>{})),f.screenshot=`${y.join("/")}/${m}`;}if(o?.path&&existsSync(o.path)){let m=`video${extname(o.path)||".webm"}`,b=join(p,m);H.push(le(o.path,b).then(()=>{})),f.video=`${y.join("/")}/${m}`;}if(l?.path&&existsSync(l.path)){let m=`trace${extname(l.path)||".zip"}`,b=join(p,m);H.push(le(l.path,b).then(()=>{})),f.trace=`${y.join("/")}/${m}`;}return !f.screenshot&&!f.video&&!f.trace?null:f}var xt="visual",bn=6;function xn(e){let t=createHash("sha256").update(e).digest("hex").substring(0,bn);return `${bt(e)}--${t}`}function Zr(e){let t=null;try{t=openSync(e,"r");let r=Buffer.alloc(xe),a=readSync(t,r,0,xe,0);return Wr(r.subarray(0,a))}catch{return null}finally{if(t!==null)try{closeSync(t);}catch{}}}var Qr=[{key:"expectedPath",dest:"baseline",field:"baseline"},{key:"actualPath",dest:"actual",field:"actual"},{key:"diffPath",dest:"diff",field:"diff"},{key:"previousPath",dest:"previous",field:"previous"}],wn=[{key:"baselineDomPath",dest:"baseline.dom.json",field:"baselineDom"},{key:"actualDomPath",dest:"actual.dom.json",field:"actualDom"}];function kn(e,t,r,a){let s=xn(e.name),n=join(t,s),i=Qr.some(u=>e[u.key]);if(i||e.dom)try{mkdirSync(n,{recursive:!0});}catch{return null}let o={},l=false;for(let u of Qr){let m=e[u.key];if(!m||!existsSync(m))continue;let b=extname(m)||".png",h=`${u.dest}${b}`;H.push(le(m,join(n,h)).then(()=>{})),o[u.field]=`${r}/${xt}/${s}/${h}`,l=true;}let d=e.dom;if(d)for(let u of wn){let m=d[u.key];!m||!existsSync(m)||(H.push(le(m,join(n,u.dest)).then(()=>{})),o[u.field]=`${r}/${xt}/${s}/${u.dest}`);}if(!l&&i)return null;let c=e.expectedPath?Zr(e.expectedPath):e.actualPath?Zr(e.actualPath):null,p=Xr(e.diffPixels,c),y=e.committedPath??e.expectedPath,f=y?relative(a,y).replace(/\\/g,"/"):void 0;return {name:e.name,status:e.status,source:e.source,...o,...f?{baselinePath:f}:{},...c?{width:c.width,height:c.height}:{},...e.actualWidth!==void 0?{actualWidth:e.actualWidth}:{},...e.actualHeight!==void 0?{actualHeight:e.actualHeight}:{},...e.diffPixels!==void 0?{diffPixels:e.diffPixels}:{},...p!==void 0?{diffPixelRatio:p}:{},...d?{domChanges:d.changes,domChangeCount:d.total,domRootCauses:d.rootCauses,domTruncated:d.truncated,domCaptureBox:d.captureBox}:{}}}function sa(e,t,r,a,s,n,i=process.cwd()){if(e.length===0)return null;let o=ra(t,r,n),l=s?["artifacts",s,o]:["artifacts",o],d=join(a,...l,xt),c=l.join("/");try{mkdirSync(d,{recursive:!0});}catch{return null}let p=[];for(let y of e){let f=kn(y,d,c,i);f&&p.push(f);}return p.length>0?p:null}var na="testrelic-visual-dom";var Sn="testrelic-visual",Cn=/^(.+)-(expected|actual|diff|previous)(\.[A-Za-z0-9]+)$/;function Tn(e){let t=new Map;for(let r of e)if(!(r.name!==Sn||!r.body))try{let a=JSON.parse(r.body.toString("utf-8"));if(!Array.isArray(a))continue;for(let s of a){let n=An(s);n&&t.set(n.stem,n);}}catch{}return t}var Rn=["passed","failed","new","updated"];function An(e){if(typeof e!="object"||e===null)return null;let t=e;return typeof t.stem!="string"||!t.stem||typeof t.name!="string"||!t.name||typeof t.status!="string"||!Rn.includes(t.status)?null:{stem:t.stem,name:t.name,status:t.status,...typeof t.committedPath=="string"&&t.committedPath?{committedPath:t.committedPath}:{}}}function _n(e){let t=new Map;for(let r of e)if(!(r.name!==na||!r.body))try{let a=JSON.parse(r.body.toString("utf-8"));if(!Array.isArray(a))continue;for(let s of a){if(typeof s!="object"||s===null)continue;let n=s;typeof n.stem!="string"||!Array.isArray(n.changes)||t.set(n.stem,s);}}catch{}return t}function In(e){let t=new Map;for(let r of e){if(!r.path)continue;let a=Cn.exec(r.name);if(!a)continue;let[,s,n]=a,i=t.get(s)??{};i[n]=r.path,t.set(s,i);}return t}function Mn(e){return !!(e.actual&&(e.expected||e.diff))}function En(e,t,r){return e.diff||Jr(r)?"failed":t?"updated":"new"}function Pn(e,t){if(e.length===0)return null;if(e.length===1)return e[0];if(!t)return null;let r=t.replace(/\.[A-Za-z0-9]+$/,""),a=e.filter(s=>s===r||s.endsWith(`/${r}`));return a.length===1?a[0]:null}function la(e,t={}){if(e.length===0)return [];let r=Tn(e),a=_n(e),s=In(e);if(s.size===0&&r.size===0)return [];let n=t.updatingSnapshots===true,i=[];for(let[o,l]of s){let d=r.get(o);!d&&!Mn(l)||i.push({name:d?.name??o,status:d?.status??En(l,n,t.failureMessage),source:d?"toMatchVisualBaseline":"toHaveScreenshot",...l.expected?{expectedPath:l.expected}:{},...d?.committedPath?{committedPath:d.committedPath}:{},...l.actual?{actualPath:l.actual}:{},...l.diff?{diffPath:l.diff}:{},...l.previous?{previousPath:l.previous}:{},...a.has(o)?{dom:a.get(o)}:{}});}for(let[o,l]of r)s.has(o)||i.push({name:l.name,status:l.status,source:"toMatchVisualBaseline",...l.committedPath?{committedPath:l.committedPath}:{},...a.has(o)?{dom:a.get(o)}:{}});return Dn(i,s,t.failureMessage)}function Dn(e,t,r){let a=Yr(r);if(a.diffPixels===void 0&&a.actualWidth===void 0)return [...e];let s=e.filter(i=>i.status==="failed"&&ia(i)).map(i=>oa(i,t)),n=Pn(s,a.snapshotName);return n===null?[...e]:e.map(i=>ia(i)&&oa(i,t)===n?{...i,...a.diffPixels!==void 0?{diffPixels:a.diffPixels}:{},...a.actualWidth!==void 0?{actualWidth:a.actualWidth}:{},...a.actualHeight!==void 0?{actualHeight:a.actualHeight}:{}}:i)}function ia(e){return !!(e.expectedPath||e.actualPath||e.diffPath||e.previousPath)}function oa(e,t){if(t.has(e.name))return e.name;for(let[r,a]of t)if(a.actual===e.actualPath&&a.expected===e.expectedPath&&a.diff===e.diffPath)return r;return e.name}var Ln=new RegExp("[\x1B\x9B][[\\]()#;?]*(?:\\d{1,4}(?:;\\d{0,4})*)?[0-9A-PR-TZcf-nqry=><]","g");function ke(e){return !e||e.indexOf("\x1B")===-1&&e.indexOf("\x9B")===-1?e:e.replace(Ln,"")}function da(e){return e==null?null:ke(e)}var Nn=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,Fn="1.0",kt="visual";function fa(e){let t=extname(e).toLowerCase();return [".png",".jpg",".jpeg",".gif",".bmp",".webp"].includes(t)?"screenshot":[".webm",".mp4",".avi",".mov"].includes(t)?"video":t===".zip"&&basename(e,t)==="trace"?"trace":"other"}function Bn(e){if(e.endsWith(".dom.json"))return "dom";let t=basename(e,extname(e));return t==="baseline"?"baseline":t==="diff"?"diff":fa(e)}function On(e,t,r){let a=[];try{for(let s of readdirSync(e,{withFileTypes:!0})){if(!s.isFile())continue;let n=statSync(join(e,s.name));a.push({name:`${kt}/${r}/${s.name}`,type:Bn(s.name),relativePath:`${t}/${kt}/${r}/${s.name}`,sizeBytes:n.size});}}catch{}return a}function ga(e,t,r){let a=[],s=`artifacts/${t}/${r}`;try{let n=readdirSync(e,{withFileTypes:!0});for(let i of n){if(i.isDirectory()&&i.name===kt){let d=join(e,i.name);for(let c of readdirSync(d,{withFileTypes:!0}))c.isDirectory()&&a.push(...On(join(d,c.name),s,c.name));continue}if(!i.isFile())continue;let o=join(e,i.name),l=statSync(o);a.push({name:i.name,type:fa(i.name),relativePath:`${s}/${i.name}`,sizeBytes:l.size});}}catch{}return {testName:r,files:a}}function Un(e,t){let r=join(e,t),a=[],s=0;try{let i=readdirSync(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory())continue;let l=ga(join(r,o.name),t,o.name);a.push(l);for(let d of l.files)s+=d.sizeBytes;}}catch{}let n=t.replace(/^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})/,"$1T$2:$3:$4").replace(/-\d+$/,"");return a.sort((i,o)=>i.testName.localeCompare(o.testName)),{folderName:t,timestamp:n,totalSizeBytes:s,testCount:a.length,tests:a,isCurrentRun:false}}function ha(e,t){let r=join(e,"artifacts"),a=[],s=[],n=0;try{let o=readdirSync(r,{withFileTypes:!0});for(let l of o)if(l.isDirectory())if(Nn.test(l.name)){let d=Un(r,l.name);a.push({...d,isCurrentRun:l.name===t});}else {let d=ga(join(r,l.name),l.name,l.name);s.push(d);for(let c of d.files)n+=c.sizeBytes;}}catch{}a.sort((o,l)=>l.timestamp.localeCompare(o.timestamp)),s.length>0&&(s.sort((o,l)=>o.testName.localeCompare(l.testName)),a.push({folderName:"__legacy__",timestamp:"1970-01-01T00:00:00",totalSizeBytes:n,testCount:s.length,tests:s,isCurrentRun:false}));let i=a.reduce((o,l)=>o+l.totalSizeBytes,0);return {schemaVersion:Fn,generatedAt:new Date().toISOString(),artifactBaseDir:"artifacts",totalSizeBytes:i,runs:a,serverPort:null}}var jn=256;function Gn(e){let t=resolve(e);for(let r=0;r<jn;r++){if(existsSync(join(t,".git")))return t;let a=dirname(t);if(a===t)return null;t=a;}return null}function ya(e){try{let t=Gn(e);if(!t)return;let r=join(t,".gitignore"),a=relative(t,e).replace(/\\/g,"/"),s=a.endsWith("/")?a:`${a}/`;if(existsSync(r)&&readFileSync(r,"utf-8").split(`
4350
4350
  `).map(l=>l.trim()).some(l=>l===s||l===a))return;let n=`
4351
4351
  # TestRelic test artifacts
4352
4352
  ${s}