@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.
- package/dist/api-fixture.cjs +4 -4
- package/dist/api-fixture.cjs.map +1 -1
- package/dist/api-fixture.js +4 -4
- package/dist/api-fixture.js.map +1 -1
- package/dist/cli.cjs +14 -14
- package/dist/fixture.cjs.map +1 -1
- package/dist/fixture.js.map +1 -1
- package/dist/index.cjs +44 -44
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +44 -44
- package/dist/index.js.map +1 -1
- package/dist/reporter-entry.cjs +4 -4
- package/dist/reporter-entry.cjs.map +1 -1
- package/dist/reporter-entry.js +4 -4
- package/dist/reporter-entry.js.map +1 -1
- package/dist/visual.cjs.map +1 -1
- package/dist/visual.js.map +1 -1
- package/package.json +2 -2
package/dist/reporter-entry.cjs
CHANGED
|
@@ -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="
|
|
4346
|
-
`);});}catch{}}path.join(os$1.tmpdir(),"testrelic-data");async function Sr(e,t,r,a){let s=(t-1)*r,n=[],i=0,o=readline.createInterface({input:fs$1.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 fs$1.existsSync(e)?JSON.parse(fs$1.readFileSync(e,"utf-8")):null}catch{return null}}function me(e){let t=0;try{let r=fs$1.readdirSync(e,{withFileTypes:!0});for(let a of r){let s=path.join(e,a.name);a.isFile()?t+=fs$1.statSync(s).size:a.isDirectory()&&(t+=me(s));}}catch{}return t}function Mr(e,t,r,a){let s=he(path.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(path.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(path.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=path.join(r,"tests",a,"meta.json"),n=path.join(r,"tests",`${a}.json`),i=fs$1.existsSync(s)?s:fs$1.existsSync(n)?n:null;if(!i){S(t,404,{error:`Test not found: ${a}`});return}try{let o=fs$1.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=path.join(r,"tests",a,{network:"network.jsonl",console:"console.jsonl","api-calls":"api-calls.jsonl"}[s]);if(!fs$1.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=path.join(r,"tests",a,"meta.json");if(fs$1.existsSync(y))try{let u=JSON.parse(fs$1.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(path.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(!fs$1.existsSync(r)){S(t,200,{runs:[],totalSizeBytes:0});return}try{let a=[],s=0,n=fs$1.readdirSync(r,{withFileTypes:!0});for(let i of n){if(!i.isDirectory()||!ft.test(i.name))continue;let o=path.join(r,i.name),l=me(o),d=fs$1.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(fs$1.existsSync(r)){let n=fs$1.readdirSync(r,{withFileTypes:!0});for(let i of n){if(!i.isDirectory()||!ft.test(i.name))continue;let o=path.join(r,i.name),l=me(o);fs$1.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=path.join(r,a);try{if(!fs$1.statSync(s).isDirectory()){S(t,404,{error:"Not found"});return}}catch{S(t,404,{error:"Not found"});return}try{let n=me(s);fs$1.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(!fs$1.existsSync(r)){S(t,404,{error:"File not found"});return}try{let a=fs$1.statSync(r).size,s=path.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(fs$1.createReadStream(r,{start:i.start,end:i.end}),t);return}t.writeHead(200,{"Content-Type":n,"Content-Length":a,"Accept-Ranges":"bytes"}),Tr(fs$1.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=fs$1.existsSync(path.join(e,"artifacts"))?path.join(e,"artifacts"):fs$1.existsSync(path.join(e,"..","artifacts"))?path.join(e,"..","artifacts"):path.join(e,"artifacts");function d(){clearTimeout(i),i=setTimeout(()=>{p.close();},Qs);}let c=t?.htmlPath??null;if(!c){let f=path.dirname(e);try{let u=fs$1.readdirSync(f).find(m=>m.endsWith(".html"));u&&(c=path.join(f,u));}catch{}}let p=http.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&&fs$1.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,path.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=path.dirname(l);fs$1.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=path.dirname(t.outputPath),b=path.join(m,".testrelic-report");try{let h=path.join(b,"index-compact.json"),g=path.join(b,"index.json");fs$1.existsSync(h)?p=fs$1.readFileSync(h,"utf-8"):fs$1.existsSync(g)&&(p=fs$1.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(fs$1.writeFileSync(u,o,"utf-8"),fs$1.renameSync(u,l),i){if(e.ci===null){let m=path.dirname(t.outputPath),b=path.join(m,".testrelic-report"),h=path.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]),child_process.execFile(r,a,s=>{s&&process.stderr.write(`[testrelic] Failed to open browser: ${s.message}
|
|
4346
|
+
`);});}catch{}}path.join(os$1.tmpdir(),"testrelic-data");async function Sr(e,t,r,a){let s=(t-1)*r,n=[],i=0,o=readline.createInterface({input:fs$1.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 fs$1.existsSync(e)?JSON.parse(fs$1.readFileSync(e,"utf-8")):null}catch{return null}}function me(e){let t=0;try{let r=fs$1.readdirSync(e,{withFileTypes:!0});for(let a of r){let s=path.join(e,a.name);a.isFile()?t+=fs$1.statSync(s).size:a.isDirectory()&&(t+=me(s));}}catch{}return t}function Mr(e,t,r,a){let s=he(path.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(path.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(path.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=path.join(r,"tests",a,"meta.json"),n=path.join(r,"tests",`${a}.json`),i=fs$1.existsSync(s)?s:fs$1.existsSync(n)?n:null;if(!i){S(t,404,{error:`Test not found: ${a}`});return}try{let o=fs$1.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=path.join(r,"tests",a,{network:"network.jsonl",console:"console.jsonl","api-calls":"api-calls.jsonl"}[s]);if(!fs$1.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=path.join(r,"tests",a,"meta.json");if(fs$1.existsSync(y))try{let u=JSON.parse(fs$1.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(path.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(!fs$1.existsSync(r)){S(t,200,{runs:[],totalSizeBytes:0});return}try{let a=[],s=0,n=fs$1.readdirSync(r,{withFileTypes:!0});for(let i of n){if(!i.isDirectory()||!ft.test(i.name))continue;let o=path.join(r,i.name),l=me(o),d=fs$1.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(fs$1.existsSync(r)){let n=fs$1.readdirSync(r,{withFileTypes:!0});for(let i of n){if(!i.isDirectory()||!ft.test(i.name))continue;let o=path.join(r,i.name),l=me(o);fs$1.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=path.join(r,a);try{if(!fs$1.statSync(s).isDirectory()){S(t,404,{error:"Not found"});return}}catch{S(t,404,{error:"Not found"});return}try{let n=me(s);fs$1.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(!fs$1.existsSync(r)){S(t,404,{error:"File not found"});return}try{let a=fs$1.statSync(r).size,s=path.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(fs$1.createReadStream(r,{start:i.start,end:i.end}),t);return}t.writeHead(200,{"Content-Type":n,"Content-Length":a,"Accept-Ranges":"bytes"}),Tr(fs$1.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=fs$1.existsSync(path.join(e,"artifacts"))?path.join(e,"artifacts"):fs$1.existsSync(path.join(e,"..","artifacts"))?path.join(e,"..","artifacts"):path.join(e,"artifacts");function d(){clearTimeout(i),i=setTimeout(()=>{p.close();},Qs);}let c=t?.htmlPath??null;if(!c){let f=path.dirname(e);try{let u=fs$1.readdirSync(f).find(m=>m.endsWith(".html"));u&&(c=path.join(f,u));}catch{}}let p=http.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&&fs$1.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,path.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=path.dirname(l);fs$1.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=path.dirname(t.outputPath),b=path.join(m,".testrelic-report");try{let h=path.join(b,"index-compact.json"),g=path.join(b,"index.json");fs$1.existsSync(h)?p=fs$1.readFileSync(h,"utf-8"):fs$1.existsSync(g)&&(p=fs$1.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(fs$1.writeFileSync(u,o,"utf-8"),fs$1.renameSync(u,l),i){if(e.ci===null){let m=path.dirname(t.outputPath),b=path.join(m,".testrelic-report"),h=path.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";fs$1.writeFileSync(v,g,"utf-8"),fs$1.renameSync(v,l);}catch{}}}catch{}}}else if(t.openReport&&e.ci===null&&t.includeArtifacts){let m=path.dirname(t.outputPath),b=path.join(m,"artifacts");if(fs$1.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=path.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=[path.join(__dirname,"cli.cjs"),path.join(__dirname,"cli.js"),path.join(__dirname,"..","dist","cli.cjs"),path.join(__dirname,"..","dist","cli.js")].find(a=>fs$1.existsSync(a));if(!r){let a=await oe(e);return process.on("exit",()=>{a?.dispose();}),a.port}return new Promise(a=>{let s=child_process.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 promises.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(!fs$1.existsSync(path.join(e,a)))return a;let s=1;for(;fs$1.existsSync(path.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=path.join(a,...c),y=c,f={};try{fs$1.mkdirSync(p,{recursive:!0});}catch{return null}if(i?.path&&fs$1.existsSync(i.path)){let m=`screenshot${path.extname(i.path)||".png"}`,b=path.join(p,m);H.push(le(i.path,b).then(()=>{})),f.screenshot=`${y.join("/")}/${m}`;}if(o?.path&&fs$1.existsSync(o.path)){let m=`video${path.extname(o.path)||".webm"}`,b=path.join(p,m);H.push(le(o.path,b).then(()=>{})),f.video=`${y.join("/")}/${m}`;}if(l?.path&&fs$1.existsSync(l.path)){let m=`trace${path.extname(l.path)||".zip"}`,b=path.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=crypto.createHash("sha256").update(e).digest("hex").substring(0,bn);return `${bt(e)}--${t}`}function Zr(e){let t=null;try{t=fs$1.openSync(e,"r");let r=Buffer.alloc(xe),a=fs$1.readSync(t,r,0,xe,0);return Wr(r.subarray(0,a))}catch{return null}finally{if(t!==null)try{fs$1.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=path.join(t,s),i=Qr.some(u=>e[u.key]);if(i||e.dom)try{fs$1.mkdirSync(n,{recursive:!0});}catch{return null}let o={},l=false;for(let u of Qr){let m=e[u.key];if(!m||!fs$1.existsSync(m))continue;let b=path.extname(m)||".png",h=`${u.dest}${b}`;H.push(le(m,path.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||!fs$1.existsSync(m)||(H.push(le(m,path.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?path.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=path.join(a,...l,xt),c=l.join("/");try{fs$1.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=path.extname(e).toLowerCase();return [".png",".jpg",".jpeg",".gif",".bmp",".webp"].includes(t)?"screenshot":[".webm",".mp4",".avi",".mov"].includes(t)?"video":t===".zip"&&path.basename(e,t)==="trace"?"trace":"other"}function Bn(e){if(e.endsWith(".dom.json"))return "dom";let t=path.basename(e,path.extname(e));return t==="baseline"?"baseline":t==="diff"?"diff":fa(e)}function On(e,t,r){let a=[];try{for(let s of fs$1.readdirSync(e,{withFileTypes:!0})){if(!s.isFile())continue;let n=fs$1.statSync(path.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=fs$1.readdirSync(e,{withFileTypes:!0});for(let i of n){if(i.isDirectory()&&i.name===kt){let d=path.join(e,i.name);for(let c of fs$1.readdirSync(d,{withFileTypes:!0}))c.isDirectory()&&a.push(...On(path.join(d,c.name),s,c.name));continue}if(!i.isFile())continue;let o=path.join(e,i.name),l=fs$1.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=path.join(e,t),a=[],s=0;try{let i=fs$1.readdirSync(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory())continue;let l=ga(path.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=path.join(e,"artifacts"),a=[],s=[],n=0;try{let o=fs$1.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(path.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=path.resolve(e);for(let r=0;r<jn;r++){if(fs$1.existsSync(path.join(t,".git")))return t;let a=path.dirname(t);if(a===t)return null;t=a;}return null}function ya(e){try{let t=Gn(e);if(!t)return;let r=path.join(t,".gitignore"),a=path.relative(t,e).replace(/\\/g,"/"),s=a.endsWith("/")?a:`${a}/`;if(fs$1.existsSync(r)&&fs$1.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=[path.join(__dirname,"cli.cjs"),path.join(__dirname,"cli.js"),path.join(__dirname,"..","dist","cli.cjs"),path.join(__dirname,"..","dist","cli.js")].find(a=>fs$1.existsSync(a));if(!r){let a=await oe(e);return process.on("exit",()=>{a?.dispose();}),a.port}return new Promise(a=>{let s=child_process.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 promises.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(!fs$1.existsSync(path.join(e,a)))return a;let s=1;for(;fs$1.existsSync(path.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=path.join(a,...c),y=c,f={};try{fs$1.mkdirSync(p,{recursive:!0});}catch{return null}if(i?.path&&fs$1.existsSync(i.path)){let m=`screenshot${path.extname(i.path)||".png"}`,b=path.join(p,m);H.push(le(i.path,b).then(()=>{})),f.screenshot=`${y.join("/")}/${m}`;}if(o?.path&&fs$1.existsSync(o.path)){let m=`video${path.extname(o.path)||".webm"}`,b=path.join(p,m);H.push(le(o.path,b).then(()=>{})),f.video=`${y.join("/")}/${m}`;}if(l?.path&&fs$1.existsSync(l.path)){let m=`trace${path.extname(l.path)||".zip"}`,b=path.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=crypto.createHash("sha256").update(e).digest("hex").substring(0,bn);return `${bt(e)}--${t}`}function Zr(e){let t=null;try{t=fs$1.openSync(e,"r");let r=Buffer.alloc(xe),a=fs$1.readSync(t,r,0,xe,0);return Wr(r.subarray(0,a))}catch{return null}finally{if(t!==null)try{fs$1.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=path.join(t,s),i=Qr.some(u=>e[u.key]);if(i||e.dom)try{fs$1.mkdirSync(n,{recursive:!0});}catch{return null}let o={},l=false;for(let u of Qr){let m=e[u.key];if(!m||!fs$1.existsSync(m))continue;let b=path.extname(m)||".png",h=`${u.dest}${b}`;H.push(le(m,path.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||!fs$1.existsSync(m)||(H.push(le(m,path.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?path.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=path.join(a,...l,xt),c=l.join("/");try{fs$1.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=path.extname(e).toLowerCase();return [".png",".jpg",".jpeg",".gif",".bmp",".webp"].includes(t)?"screenshot":[".webm",".mp4",".avi",".mov"].includes(t)?"video":t===".zip"&&path.basename(e,t)==="trace"?"trace":"other"}function Bn(e){if(e.endsWith(".dom.json"))return "dom";let t=path.basename(e,path.extname(e));return t==="baseline"?"baseline":t==="diff"?"diff":fa(e)}function On(e,t,r){let a=[];try{for(let s of fs$1.readdirSync(e,{withFileTypes:!0})){if(!s.isFile())continue;let n=fs$1.statSync(path.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=fs$1.readdirSync(e,{withFileTypes:!0});for(let i of n){if(i.isDirectory()&&i.name===kt){let d=path.join(e,i.name);for(let c of fs$1.readdirSync(d,{withFileTypes:!0}))c.isDirectory()&&a.push(...On(path.join(d,c.name),s,c.name));continue}if(!i.isFile())continue;let o=path.join(e,i.name),l=fs$1.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=path.join(e,t),a=[],s=0;try{let i=fs$1.readdirSync(r,{withFileTypes:!0});for(let o of i){if(!o.isDirectory())continue;let l=ga(path.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=path.join(e,"artifacts"),a=[],s=[],n=0;try{let o=fs$1.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(path.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=path.resolve(e);for(let r=0;r<jn;r++){if(fs$1.existsSync(path.join(t,".git")))return t;let a=path.dirname(t);if(a===t)return null;t=a;}return null}function ya(e){try{let t=Gn(e);if(!t)return;let r=path.join(t,".gitignore"),a=path.relative(t,e).replace(/\\/g,"/"),s=a.endsWith("/")?a:`${a}/`;if(fs$1.existsSync(r)&&fs$1.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}
|