shiplightai 0.1.87 → 0.1.89
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/cjs/debugger-pw.cjs +47 -47
- package/dist/cjs/fixture.cjs +56 -56
- package/dist/cjs/index.cjs +87 -87
- package/dist/cjs/reporter.cjs +1 -1
- package/dist/cli.js +84 -84
- package/dist/debugger-pw.js +48 -48
- package/dist/fixture.js +57 -57
- package/dist/index.js +88 -88
- package/dist/reporter.js +1 -1
- package/package.json +2 -2
package/dist/reporter.js
CHANGED
|
@@ -883,7 +883,7 @@ import*as x from"fs";import*as v from"path";var I=(e,t,r)=>{e.forEach((i,o)=>{le
|
|
|
883
883
|
});
|
|
884
884
|
</script>
|
|
885
885
|
</body>
|
|
886
|
-
</html>`}var Ee="0.1.
|
|
886
|
+
</html>`}var Ee="0.1.89",Me=Ee!=="dev"?Ee:void 0;var Eo=3600*1e3,Mo=10080*60*1e3;var bt={before:0,main:1,teardown:2,after:3};function Pe(e){let t=e.split(".")[0];return bt[t]??1}function Oe(e){return e.split(".").map(t=>{let r=Number(t);return Number.isNaN(r)?0:r})}function _t(e){return[...e].sort(([t],[r])=>{let i=Pe(t),o=Pe(r);if(i!==o)return i-o;let a=Oe(t),n=Oe(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 wt(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 vt(e,t){let r=e.toLowerCase();return r.includes("before")?"before":r.includes("after")?"after":t}function Q(e,t="main",r,i,o){r===void 0&&(r=!wt(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=vt(n.title,t);a.push(...Q(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(...Q(n.steps,p,r,i,o))}}return a}function St(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 ee=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:T}=p[_],A=await this.buildReportTest(y,T,b);c=A,l||(l=A.startTime),m=A.endTime,w.push({attemptNumber:_+1,status:T.status,duration:T.duration,steps:A.steps,error:A.error,videoPath:A.videoPath,tracePath:A.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:Me},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,$e({...o,outputDir:a}),"utf-8"),console.log(`
|
|
887
887
|
Shiplight report written to: ${d}`),this.latestSymlinkDir&&St(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=Se(c,u,this.config.rootDir);if(l.suite){let m=l.suite.tests.find(h=>h.name===b);m&&(d=H(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=H(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=_t(l);for(let[h]of m){let S=d[h],g=n?.[h],_=S?.description;if(!_||_==="Action"||_==="Draft"){let T=S?.action_entity;_=T?.action_description||T?.action_data?.kwargs?.description||g?.description||h}let y={stepId:h,description:_,status:g?.status||"pending",duration:g?.duration};if(g?.message){let T=typeof g.message=="string"?g.message:JSON.stringify(g.message,null,2);g.status==="failure"?y.error=T:y.message=T}if(g?.screenshot){let T=g.screenshot,A=a?.path?v.dirname(a.path):"",O=v.isAbsolute(T)?T:v.join(A,T);x.existsSync(O)&&(y.screenshot=O)}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=Q(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(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shiplightai",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.89",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Shiplight CLI for running and debugging .test.yaml files",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -98,9 +98,9 @@
|
|
|
98
98
|
"tsup": "^8.3.5",
|
|
99
99
|
"typescript": "5.5.4",
|
|
100
100
|
"mcp-tools": "1.0.0",
|
|
101
|
+
"sdk-core": "0.1.0",
|
|
101
102
|
"sdk-internal": "0.1.1",
|
|
102
103
|
"shiplight-tools": "1.0.0",
|
|
103
|
-
"sdk-core": "0.1.0",
|
|
104
104
|
"shiplight-types": "0.1.0"
|
|
105
105
|
},
|
|
106
106
|
"peerDependencies": {
|