shiplightai 0.1.87 → 0.1.88

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.
@@ -883,7 +883,7 @@
883
883
  });
884
884
  </script>
885
885
  </body>
886
- </html>`}var Ie="0.1.87",Ne=Ie!=="dev"?Ie:void 0;var go=3600*1e3,yo=10080*60*1e3;var Tt={before:0,main:1,teardown:2,after:3};function De(e){let t=e.split(".")[0];return Tt[t]??1}function Ce(e){return e.split(".").map(t=>{let r=Number(t);return Number.isNaN(r)?0:r})}function At(e){return[...e].sort(([t],[r])=>{let i=De(t),o=De(r);if(i!==o)return i-o;let a=Ce(t),n=Ce(r);for(let u=0;u<Math.max(a.length,n.length);u++){let d=a[u]??-1,p=n[u]??-1;if(d!==p)return d-p}return 0})}function $t(e){let t=new Set;for(let r of e)if(t.add(r.category),r.category==="hook")for(let i of r.steps)t.add(i.category);return t}function Et(e,t){let r=e.toLowerCase();return r.includes("before")?"before":r.includes("after")?"after":t}function oe(e,t="main",r,i,o){r===void 0&&(r=!$t(e).has("test.step")),o||(o=new Map);let a=[];for(let n of e){if(n.category==="fixture"||n.category==="test.attach")continue;if(n.category==="hook"){let d=Et(n.title,t);a.push(...oe(n.steps,d,r,i,o));continue}if(n.category==="test.step"||r&&(n.category==="expect"||n.category==="pw:api")){let d=o.get(t)??0;o.set(t,d+1);let p=`${t}.${d}`,b={stepId:p,description:n.title,status:n.error?"failure":n.duration===-1?"skipped":"success",duration:n.duration>=0?n.duration:void 0};n.error&&(b.error=n.error.message??n.error.stack),i&&n.location&&i.set(p,n.location),a.push(b),n.steps.length>0&&a.push(...oe(n.steps,p,r,i,o))}}return a}function Mt(e,t){let r=v.isAbsolute(e)?e:v.join(process.cwd(),e),i=v.join(r,"latest");try{if(x.lstatSync(i).isSymbolicLink())x.unlinkSync(i);else{console.warn("[report] 'latest' exists and is not a symlink; skipping update");return}}catch{}try{process.platform==="win32"?x.symlinkSync(v.join(r,t),i,"junction"):x.symlinkSync(t,i,"dir")}catch(o){console.warn(`[report] Could not create 'latest' symlink: ${o instanceof Error?o.message:String(o)}`)}}var ne=class{outputFolder;openMode;latestSymlinkDir;collected=[];config;runStartTime;constructor(t={}){this.outputFolder=t.outputFolder||"shiplight-report",this.openMode=t.open||"on-failure",this.latestSymlinkDir=t.latestSymlinkDir}onBegin(t,r){this.config=t,this.runStartTime=new Date().toISOString()}onTestEnd(t,r){this.collected.push({test:t,result:r})}async onEnd(t){if(this.collected.length===0)return;let r=new Map;for(let p of this.collected){let b=p.test.titlePath().join(" > "),w=r.get(b);w||(w=[],r.set(b,w)),w.push(p)}let i=[];for(let[,p]of r.entries()){let b=p[0].test.location.file,w=[],c,l,m;for(let _=0;_<p.length;_++){let{test:y,result:A}=p[_],$=await this.buildReportTest(y,A,b);c=$,l||(l=$.startTime),m=$.endTime,w.push({attemptNumber:_+1,status:A.status,duration:A.duration,steps:$.steps,error:$.error,videoPath:$.videoPath,tracePath:$.tracePath})}let h=w[w.length-1],{test:S}=p[p.length-1],g={title:S.title,baseTitle:c?.baseTitle,file:v.relative(process.cwd(),b),status:h.status,duration:h.duration,steps:h.steps,error:h.error,videoPath:h.videoPath,tracePath:h.tracePath,actionStepsMap:c?.actionStepsMap,tags:c?.tags,baseUrl:c?.baseUrl,skip:c?.skip,slow:c?.slow,timeout:c?.timeout,parameterSetName:c?.parameterSetName,startTime:l,endTime:m,suiteName:c?.suiteName};w.length>1&&(g.retries=w.length-1,g.attempts=w,w.some(y=>y.status==="failed"||y.status==="timedOut")&&h.status==="passed"&&(g.flaky=!0)),i.push(g)}let o={tests:i,totalDuration:t.duration,timestamp:new Date().toISOString(),shiplightVersion:Ne},a=v.isAbsolute(this.outputFolder)?this.outputFolder:v.join(process.cwd(),this.outputFolder);x.mkdirSync(a,{recursive:!0});let n=v.join(a,"screenshots");for(let p=0;p<o.tests.length;p++){let b=o.tests[p],w=b.attempts&&b.attempts.length>0,c=[{obj:b,prefix:w?`test-${p}-attempt-0`:`test-${p}`,screenshotSubDir:`test-${p}`}];if(b.attempts)for(let l=0;l<b.attempts.length;l++)c.push({obj:b.attempts[l],prefix:`test-${p}-attempt-${l+1}`,screenshotSubDir:`test-${p}/attempt-${l}`});for(let{obj:l,prefix:m,screenshotSubDir:h}of c){let S=v.join(n,h),g=!1;for(let _ of l.steps)if(_.screenshot&&v.isAbsolute(_.screenshot))try{g||(x.mkdirSync(S,{recursive:!0}),g=!0);let y=`${_.stepId.replace(/\./g,"-")}.png`;x.copyFileSync(_.screenshot,v.join(S,y)),_.screenshot=`screenshots/${h}/${y}`}catch(y){console.warn(`[reporter] Failed to copy screenshot for ${_.stepId}:`,y)}if(l.videoPath&&v.isAbsolute(l.videoPath)){let _=v.extname(l.videoPath)||".webm",y=`${m}-video${_}`;try{x.copyFileSync(l.videoPath,v.join(a,y)),l.videoPath=y}catch{l.videoPath=void 0}}if(l.tracePath&&v.isAbsolute(l.tracePath)){let _=v.extname(l.tracePath)||".zip",y=`${m}-trace${_}`;try{x.copyFileSync(l.tracePath,v.join(a,y)),l.tracePath=y}catch{l.tracePath=void 0}}}}let u=v.join(a,"report-data.json");x.writeFileSync(u,JSON.stringify(o,null,2),"utf-8");let d=v.join(a,"index.html");if(x.writeFileSync(d,Le({...o,outputDir:a}),"utf-8"),console.log(`
886
+ </html>`}var Ie="0.1.88",Ne=Ie!=="dev"?Ie:void 0;var go=3600*1e3,yo=10080*60*1e3;var Tt={before:0,main:1,teardown:2,after:3};function De(e){let t=e.split(".")[0];return Tt[t]??1}function Ce(e){return e.split(".").map(t=>{let r=Number(t);return Number.isNaN(r)?0:r})}function At(e){return[...e].sort(([t],[r])=>{let i=De(t),o=De(r);if(i!==o)return i-o;let a=Ce(t),n=Ce(r);for(let u=0;u<Math.max(a.length,n.length);u++){let d=a[u]??-1,p=n[u]??-1;if(d!==p)return d-p}return 0})}function $t(e){let t=new Set;for(let r of e)if(t.add(r.category),r.category==="hook")for(let i of r.steps)t.add(i.category);return t}function Et(e,t){let r=e.toLowerCase();return r.includes("before")?"before":r.includes("after")?"after":t}function oe(e,t="main",r,i,o){r===void 0&&(r=!$t(e).has("test.step")),o||(o=new Map);let a=[];for(let n of e){if(n.category==="fixture"||n.category==="test.attach")continue;if(n.category==="hook"){let d=Et(n.title,t);a.push(...oe(n.steps,d,r,i,o));continue}if(n.category==="test.step"||r&&(n.category==="expect"||n.category==="pw:api")){let d=o.get(t)??0;o.set(t,d+1);let p=`${t}.${d}`,b={stepId:p,description:n.title,status:n.error?"failure":n.duration===-1?"skipped":"success",duration:n.duration>=0?n.duration:void 0};n.error&&(b.error=n.error.message??n.error.stack),i&&n.location&&i.set(p,n.location),a.push(b),n.steps.length>0&&a.push(...oe(n.steps,p,r,i,o))}}return a}function Mt(e,t){let r=v.isAbsolute(e)?e:v.join(process.cwd(),e),i=v.join(r,"latest");try{if(x.lstatSync(i).isSymbolicLink())x.unlinkSync(i);else{console.warn("[report] 'latest' exists and is not a symlink; skipping update");return}}catch{}try{process.platform==="win32"?x.symlinkSync(v.join(r,t),i,"junction"):x.symlinkSync(t,i,"dir")}catch(o){console.warn(`[report] Could not create 'latest' symlink: ${o instanceof Error?o.message:String(o)}`)}}var ne=class{outputFolder;openMode;latestSymlinkDir;collected=[];config;runStartTime;constructor(t={}){this.outputFolder=t.outputFolder||"shiplight-report",this.openMode=t.open||"on-failure",this.latestSymlinkDir=t.latestSymlinkDir}onBegin(t,r){this.config=t,this.runStartTime=new Date().toISOString()}onTestEnd(t,r){this.collected.push({test:t,result:r})}async onEnd(t){if(this.collected.length===0)return;let r=new Map;for(let p of this.collected){let b=p.test.titlePath().join(" > "),w=r.get(b);w||(w=[],r.set(b,w)),w.push(p)}let i=[];for(let[,p]of r.entries()){let b=p[0].test.location.file,w=[],c,l,m;for(let _=0;_<p.length;_++){let{test:y,result:A}=p[_],$=await this.buildReportTest(y,A,b);c=$,l||(l=$.startTime),m=$.endTime,w.push({attemptNumber:_+1,status:A.status,duration:A.duration,steps:$.steps,error:$.error,videoPath:$.videoPath,tracePath:$.tracePath})}let h=w[w.length-1],{test:S}=p[p.length-1],g={title:S.title,baseTitle:c?.baseTitle,file:v.relative(process.cwd(),b),status:h.status,duration:h.duration,steps:h.steps,error:h.error,videoPath:h.videoPath,tracePath:h.tracePath,actionStepsMap:c?.actionStepsMap,tags:c?.tags,baseUrl:c?.baseUrl,skip:c?.skip,slow:c?.slow,timeout:c?.timeout,parameterSetName:c?.parameterSetName,startTime:l,endTime:m,suiteName:c?.suiteName};w.length>1&&(g.retries=w.length-1,g.attempts=w,w.some(y=>y.status==="failed"||y.status==="timedOut")&&h.status==="passed"&&(g.flaky=!0)),i.push(g)}let o={tests:i,totalDuration:t.duration,timestamp:new Date().toISOString(),shiplightVersion:Ne},a=v.isAbsolute(this.outputFolder)?this.outputFolder:v.join(process.cwd(),this.outputFolder);x.mkdirSync(a,{recursive:!0});let n=v.join(a,"screenshots");for(let p=0;p<o.tests.length;p++){let b=o.tests[p],w=b.attempts&&b.attempts.length>0,c=[{obj:b,prefix:w?`test-${p}-attempt-0`:`test-${p}`,screenshotSubDir:`test-${p}`}];if(b.attempts)for(let l=0;l<b.attempts.length;l++)c.push({obj:b.attempts[l],prefix:`test-${p}-attempt-${l+1}`,screenshotSubDir:`test-${p}/attempt-${l}`});for(let{obj:l,prefix:m,screenshotSubDir:h}of c){let S=v.join(n,h),g=!1;for(let _ of l.steps)if(_.screenshot&&v.isAbsolute(_.screenshot))try{g||(x.mkdirSync(S,{recursive:!0}),g=!0);let y=`${_.stepId.replace(/\./g,"-")}.png`;x.copyFileSync(_.screenshot,v.join(S,y)),_.screenshot=`screenshots/${h}/${y}`}catch(y){console.warn(`[reporter] Failed to copy screenshot for ${_.stepId}:`,y)}if(l.videoPath&&v.isAbsolute(l.videoPath)){let _=v.extname(l.videoPath)||".webm",y=`${m}-video${_}`;try{x.copyFileSync(l.videoPath,v.join(a,y)),l.videoPath=y}catch{l.videoPath=void 0}}if(l.tracePath&&v.isAbsolute(l.tracePath)){let _=v.extname(l.tracePath)||".zip",y=`${m}-trace${_}`;try{x.copyFileSync(l.tracePath,v.join(a,y)),l.tracePath=y}catch{l.tracePath=void 0}}}}let u=v.join(a,"report-data.json");x.writeFileSync(u,JSON.stringify(o,null,2),"utf-8");let d=v.join(a,"index.html");if(x.writeFileSync(d,Le({...o,outputDir:a}),"utf-8"),console.log(`
887
887
  Shiplight report written to: ${d}`),this.latestSymlinkDir&&Mt(this.latestSymlinkDir,v.basename(a)),this.openMode==="always"||this.openMode==="on-failure"&&t.status!=="passed")try{let p=(await import("open")).default;await p(d)}catch{}}printsToStdio(){return!1}async buildReportTest(t,r,i){let o={title:t.title,file:v.relative(process.cwd(),i),status:r.status,duration:r.duration,steps:[],startTime:new Date(r.startTime).toISOString(),endTime:new Date(r.startTime.getTime()+r.duration).toISOString()};r.errors.length>0&&(o.error=r.errors.map(c=>c.message||c.stack||String(c)).join(`
888
888
 
889
889
  `)),r.stdout.length>0&&(o.stdout=r.stdout.map(c=>typeof c=="string"?c:c.toString()).join("")),r.stderr.length>0&&(o.stderr=r.stderr.map(c=>typeof c=="string"?c:c.toString()).join(""));for(let c of r.attachments)c.name==="video"&&c.path&&(o.videoPath=c.path),c.name==="trace"&&c.path&&(o.tracePath=c.path);let a=r.attachments.find(c=>c.name==="shiplight-results"),n=null;if(a)try{if(a.body)n=JSON.parse(a.body.toString("utf-8"));else if(a.path){let c=x.readFileSync(a.path,"utf-8");n=JSON.parse(c)}}catch{}let u=i.replace(/\.yaml\.spec\.ts$/,".test.yaml"),d={},p=t.title.match(/^(.*)\s+\[([^\]]+)\]$/),b=p?p[1]:t.title,w=p?p[2]:void 0;if(w&&(o.parameterSetName=w),x.existsSync(u))try{let c=x.readFileSync(u,"utf-8"),l=Ee(c,u,this.config.rootDir);if(l.suite){let m=l.suite.tests.find(h=>h.name===b);m&&(d=z(m.testFlow),m.tags?.length&&(o.tags=m.tags),m.skip!==void 0&&(o.skip=m.skip),m.slow&&(o.slow=m.slow),m.timeout!==void 0&&(o.timeout=m.timeout),o.baseTitle=m.name||m.testFlow?.goal),o.suiteName=l.name,l.tags?.length&&(o.suiteTags=l.tags),l.use?.baseURL&&(o.baseUrl=l.use.baseURL)}else l.testFlow&&(d=z(l.testFlow),o.baseTitle=l.name||l.testFlow?.goal,l.tags?.length&&(o.tags=l.tags),l.use?.baseURL&&(o.baseUrl=l.use.baseURL))}catch{}if(n||Object.keys(d).length>0){let c=new Set([...Object.keys(d),...Object.keys(n||{})]),l=Array.from(c).map(h=>[h,null]),m=At(l);for(let[h]of m){let S=d[h],g=n?.[h],_=S?.description;if(!_||_==="Action"||_==="Draft"){let A=S?.action_entity;_=A?.action_description||A?.action_data?.kwargs?.description||g?.description||h}let y={stepId:h,description:_,status:g?.status||"pending",duration:g?.duration};if(g?.message){let A=typeof g.message=="string"?g.message:JSON.stringify(g.message,null,2);g.status==="failure"?y.error=A:y.message=A}if(g?.screenshot){let A=g.screenshot,$=a?.path?v.dirname(a.path):"",L=v.isAbsolute(A)?A:v.join($,A);x.existsSync(L)&&(y.screenshot=L)}g?.code&&(y.code=g.code),g?.type&&(y.type=g.type),g?.startTime&&(y.startTime=g.startTime),g?.autoHealed&&(y.autoHealed=g.autoHealed),g?.healedAction&&(y.healedAction=g.healedAction),g?.dismissedModalActions?.length&&(y.dismissedModalActions=g.dismissedModalActions),g?.contextBefore&&(y.contextBefore=g.contextBefore),g?.contextAfter&&(y.contextAfter=g.contextAfter),o.steps.push(y)}}if(n===null&&Object.keys(d).length===0&&!i.endsWith(".yaml.spec.ts")){let c=new Map;if(o.steps=oe(r.steps,"main",void 0,c),o.steps.length>0){let l=new Map;o.actionStepsMap=Object.fromEntries(o.steps.map(m=>{let h=c.get(m.stepId),S;if(h?.file){if(!l.has(h.file))try{l.set(h.file,x.readFileSync(h.file,"utf-8").split(`