@checksum-ai/runtime 1.0.28 → 1.0.30

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/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- var f=Object.create;var g=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty;var u=(n,t)=>g(n,"name",{value:t,configurable:!0});var k=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of w(t))!P.call(n,o)&&o!==e&&g(n,o,{get:()=>t[o],enumerable:!(s=C(t,o))||s.enumerable});return n};var R=(n,t,e)=>(e=n!=null?f(y(n)):{},k(t||!n||!n.__esModule?g(e,"default",{value:n,enumerable:!0}):e,n));var i=require("fs"),l=R(require("child_process")),r=require("path");var d="checksum";var h=class{constructor(){this.TEST_RUN_MONITOR_PATH=(0,r.join)(__dirname,"test-run-monitor.js");this.CHECKSUM_API_URL="https://api.checksum.ai";this.CHECKSUM_APP_URL="https://app.checksum.ai";this.didFail=!1;this.mock=!1;this.isolatedMode=!1;this.completeIndicators={upload:!1,tests:!1,report:!1};this.guardReturn=async(t,e=1e3,s="action hang guard timed out")=>{let o="guard-timed-out",a=u(async()=>(await this.awaitSleep(e+1e3),o),"guard"),c=await Promise.race([t,a()]);if(typeof c=="string"&&c===o)throw new Error(s);return c};this.awaitSleep=t=>new Promise(e=>setTimeout(e,t))}async execute(){switch(process.argv.find(t=>t==="--help"||t==="-h")&&(await this.printHelp(process.argv[2]),process.exit(0)),process.argv[2]){case"init":this.install();break;case"test":await this.test(process.argv.slice(3));break;case"show-report":this.showReport(process.argv.slice(3));break;default:await this.printHelp()}process.exit(0)}async execCmd(t){let e=await l.spawn(t,{shell:!0,stdio:"inherit"});return new Promise((o,a)=>{e.on("exit",c=>{c===0?o(!0):a(new Error(`Checsum failed execution with code: ${c} `))})})}async getCmdOutput(t){return new Promise(function(e,s){l.exec(t,(o,a,c)=>{if(o){s(`Error executing command: ${o.message}`);return}e(a)})})}async printHelp(t){switch(t){default:console.log(`
1
+ var f=Object.create;var g=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty;var u=(n,t)=>g(n,"name",{value:t,configurable:!0});var k=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of w(t))!P.call(n,o)&&o!==e&&g(n,o,{get:()=>t[o],enumerable:!(s=C(t,o))||s.enumerable});return n};var R=(n,t,e)=>(e=n!=null?f(y(n)):{},k(t||!n||!n.__esModule?g(e,"default",{value:n,enumerable:!0}):e,n));var i=require("fs"),l=R(require("child_process")),r=require("path");var m="checksum";var h=class{constructor(){this.TEST_RUN_MONITOR_PATH=(0,r.join)(__dirname,"test-run-monitor.js");this.CHECKSUM_API_URL="https://api.checksum.ai";this.CHECKSUM_APP_URL="https://app.checksum.ai";this.didFail=!1;this.isolatedMode=!1;this.completeIndicators={upload:!1,tests:!1,report:!1};this.guardReturn=async(t,e=1e3,s="action hang guard timed out")=>{let o="guard-timed-out",a=u(async()=>(await this.awaitSleep(e+1e3),o),"guard"),c=await Promise.race([t,a()]);if(typeof c=="string"&&c===o)throw new Error(s);return c};this.awaitSleep=t=>new Promise(e=>setTimeout(e,t))}async execute(){switch(process.argv.find(t=>t==="--help"||t==="-h")&&(await this.printHelp(process.argv[2]),process.exit(0)),process.argv[2]){case"init":this.install();break;case"test":await this.test(process.argv.slice(3));break;case"show-report":this.showReport(process.argv.slice(3));break;default:await this.printHelp()}process.exit(0)}async execCmd(t){let e=await l.spawn(t,{shell:!0,stdio:"inherit"});return new Promise((o,a)=>{e.on("exit",c=>{c===0?o(!0):a(new Error(`Checsum failed execution with code: ${c} `))})})}async getCmdOutput(t){return new Promise(function(e,s){l.exec(t,(o,a,c)=>{if(o){s(`Error executing command: ${o.message}`);return}e(a)})})}async printHelp(t){switch(t){default:console.log(`
2
2
  Checksum CLI
3
3
  Usage: checksum [command] [options]
4
4
 
@@ -10,10 +10,10 @@ show-report [options] [report] show HTML report
10
10
  `);break;case"test":try{let e="npx playwright test --help",s=(await this.getCmdOutput(e)).replace(/npx playwright/g,"yarn checksum").split(`
11
11
  `);s.splice(5,0," --checksum-config=<config> Checksum configuration in JSON format").join(`
12
12
  `),console.log(s.join(`
13
- `))}catch(e){console.log("Error",e.message)}break;case"show-report":try{let e="npx playwright show-report --help",s=(await this.getCmdOutput(e)).replace(/npx playwright/g,"yarn checksum");console.log(s)}catch(e){console.log("Error",e.message)}break}}async showReport(t){let e=`npx playwright show-report ${t.join(" ")}`;try{await this.execCmd(e)}catch(s){console.log("Error showing report",s.message)}}async test(t){this.processChecksumArguments(t),this.setChecksumConfig(),await this.getSession();let e;try{e=await this.guardReturn(this.startTestRunMonitor(this.testSession),1e4,"test run monitor timeout")}catch{console.log("Error starting test run monitor. Test results will not be available on checksum.")}this.buildVolatileConfig();let s=`${e?`CHECKSUM_UPLOAD_AGENT_PORT=${e} `:""} PWDEBUG=console npx playwright test --config ${this.getPlaywrightConfigFile()} ${t.join(" ")}`;await this.patchPlaywright();try{await this.execCmd(s),console.log("Tests execution finished")}catch(o){this.didFail=!0,console.log("Error during test",o.message)}finally{let o=this.getPlaywrightReportPath();(0,i.existsSync)(o)?this.testRunMonitorProcess.stdin.write(`cli:report=${o}`):console.log(`Could not find report file at ${o}`),await this.patchPlaywright(!0),this.completeIndicators.tests=!0,await this.handleCompleteMessage()}}async patchPlaywright(t=!1){let e=`bash ${(0,r.join)(__dirname,"scripts/patch.sh")}${t?" off":""}`;try{await this.execCmd(e)}catch(s){console.log("Error patching playwright",s.message)}}getPlaywrightReportPath(){var o,a;let t=(0,r.join)(process.cwd(),"playwright-report"),e=require(this.getPlaywrightConfigFile()),{reporter:s}=e;return s instanceof Array&&s.length>1&&((o=s[1])!=null&&o.outputFolder)&&(t=(a=s[1])==null?void 0:a.outputFolder),process.env.PLAYWRIGHT_HTML_REPORT&&(t=process.env.PLAYWRIGHT_HTML_REPORT),(0,r.join)(t,"index.html")}getPlaywrightConfigFile(){return(0,r.join)(this.getRootDirPath(),"playwright.config.ts")}startTestRunMonitor(t){return new Promise(e=>{console.log("Starting test run monitor"),this.testRunMonitorProcess=l.spawn("node",[this.TEST_RUN_MONITOR_PATH,JSON.stringify({sessionId:t,checksumApiURL:this.CHECKSUM_API_URL,apiKey:this.config.apiKey}),...this.mock?["mock"]:[]]),this.testRunMonitorProcess.stdout.on("data",s=>{var p,m;let o=s.toString().trim();if(!o.startsWith("monitor")){(m=(p=this.config)==null?void 0:p.options)!=null&&m.printLogs&&console.log(`Message from test run monitor: ${o}`);return}let[a,c]=o.substring(o.indexOf(":")+1).split("=");a==="port"?e(c):this.handleTestRunMonitorMessage(a,c)}),this.testRunMonitorProcess.on("exit",(s,o)=>{console.log(`test run monitor process exited with code ${s} and signal ${o}`)}),this.testRunMonitorProcess.on("error",s=>{console.error(`Error starting test run monitor: ${s.message}`)})})}async handleTestRunMonitorMessage(t,e){switch(t){case"complete":this.isolatedMode||console.log("Test artifacts uploaded successfully"),this.sendUploadsComplete().then(()=>{this.completeIndicators.upload=!0});break;case"report-uploaded":{this.isolatedMode||console.log("Report generated and uploaded to checksum");let s={};try{s=JSON.parse(e)}catch(o){console.log("Error parsing stats",o.message)}await this.sendTestRunEnd(s),this.completeIndicators.report=!0,this.isolatedMode||console.log(`*******************
13
+ `))}catch(e){console.log("Error",e.message)}break;case"show-report":try{let e="npx playwright show-report --help",s=(await this.getCmdOutput(e)).replace(/npx playwright/g,"yarn checksum");console.log(s)}catch(e){console.log("Error",e.message)}break}}async showReport(t){let e=`npx playwright show-report ${t.join(" ")}`;try{await this.execCmd(e)}catch(s){console.log("Error showing report",s.message)}}async test(t){this.processChecksumArguments(t),this.setChecksumConfig(),await this.getSession();let e;try{e=await this.guardReturn(this.startTestRunMonitor(this.testSession),1e4,"test run monitor timeout")}catch{console.log("Error starting test run monitor. Test results will not be available on checksum.")}this.buildVolatileConfig();let s=`${e?`CHECKSUM_UPLOAD_AGENT_PORT=${e} `:""}${this.config.options.hostReports&&!this.isolatedMode?" PW_TEST_HTML_REPORT_OPEN=never":""} npx playwright test --config ${this.getPlaywrightConfigFile()} ${t.join(" ")}`;await this.patchPlaywright();try{await this.execCmd(s),console.log("Tests execution finished")}catch(o){this.didFail=!0,console.log("Error during test",o.message)}finally{let o=this.getPlaywrightReportPath();(0,i.existsSync)(o)?this.testRunMonitorProcess.stdin.write(`cli:report=${o}`):console.log(`Could not find report file at ${o}`),await this.patchPlaywright(!0),this.completeIndicators.tests=!0,await this.handleCompleteMessage()}}async patchPlaywright(t=!1){let e=`bash ${(0,r.join)(__dirname,"scripts/patch.sh")}${t?" off":""}`;try{await this.execCmd(e)}catch(s){console.log("Error patching playwright",s.message)}}getPlaywrightReportPath(){var o,a;let t=(0,r.join)(process.cwd(),"playwright-report"),e=require(this.getPlaywrightConfigFile()),{reporter:s}=e;return s instanceof Array&&s.length>1&&((o=s[1])!=null&&o.outputFolder)&&(t=(a=s[1])==null?void 0:a.outputFolder),process.env.PLAYWRIGHT_HTML_REPORT&&(t=process.env.PLAYWRIGHT_HTML_REPORT),(0,r.join)(t,"index.html")}getPlaywrightConfigFile(){return(0,r.join)(this.getRootDirPath(),"playwright.config.ts")}startTestRunMonitor(t){return new Promise(e=>{console.log("Starting test run monitor"),this.testRunMonitorProcess=l.spawn("node",[this.TEST_RUN_MONITOR_PATH,JSON.stringify({sessionId:t,checksumApiURL:this.CHECKSUM_API_URL,apiKey:this.config.apiKey}),...this.isolatedMode?["isolated"]:[]]),this.testRunMonitorProcess.stdout.on("data",s=>{var p,d;let o=s.toString().trim();if(!o.startsWith("monitor")){(d=(p=this.config)==null?void 0:p.options)!=null&&d.printLogs&&console.log(`Message from test run monitor: ${o}`);return}let[a,c]=o.substring(o.indexOf(":")+1).split("=");a==="port"?e(c):this.handleTestRunMonitorMessage(a,c)}),this.testRunMonitorProcess.on("exit",(s,o)=>{console.log(`test run monitor process exited with code ${s} and signal ${o}`)}),this.testRunMonitorProcess.on("error",s=>{console.error(`Error starting test run monitor: ${s.message}`)})})}async handleTestRunMonitorMessage(t,e){switch(t){case"complete":this.isolatedMode||console.log("Test artifacts uploaded successfully"),this.sendUploadsComplete().then(()=>{this.completeIndicators.upload=!0});break;case"report-uploaded":{if(this.isolatedMode){this.completeIndicators.report=!0;break}console.log("Report generated and uploaded to checksum");let s={};try{s=JSON.parse(e)}catch(o){console.log("Error parsing stats",o.message)}await this.sendTestRunEnd(s),this.completeIndicators.report=!0,console.log(`*******************
14
14
  * Checksum report URL: ${this.CHECKSUM_APP_URL}/#/test-runs/${this.testSession}
15
15
  *******************`);break}default:console.warn(`Unhandled test run monitor message: ${t}=${e}`)}}async handleCompleteMessage(){for(;;)Object.keys(this.completeIndicators).find(t=>!this.completeIndicators[t])?await this.awaitSleep(1e3):(console.log("Checksum test run complete"),this.shutdown(this.didFail?1:0))}shutdown(t=0){this.cleanup(),process.exit(t)}buildVolatileConfig(){if(!this.volatileChecksumConfig)return;let t=this.getVolatileConfigPath(),e=`
16
16
  import { RunMode, getChecksumConfig } from "@checksum-ai/runtime";
17
17
 
18
18
  export default getChecksumConfig(${JSON.stringify(this.config,null,2)});
19
- `;(0,i.writeFileSync)(t,e)}cleanup(){this.deleteVolatileConfig(),this.testRunMonitorProcess.stdin.write("cli:shutdown"),this.testRunMonitorProcess.kill()}async getSession(){try{if(this.mock){this.testSession="mock-session";return}let t=this.config.apiKey;(!t||t==="<API key>")&&(console.error("No API key found in checksum config"),this.shutdown(1));let e=JSON.stringify(await this.getEnvInfo()),s=await fetch(`${this.CHECKSUM_API_URL}/client-api/test-runs`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",ChecksumAppCode:t},body:e});this.testSession=(await s.json()).uuid}catch{console.log("Error getting checksum test session, will run in isolation mode"),this.isolatedMode=!0,this.mock=!0,this.testSession="isolated-session"}}async sendTestRunEnd(t){try{if(this.mock)return"https://mock.report.url";let e=JSON.stringify({...t,endedAt:Date.now()});await this.updateTestRun(`${this.CHECKSUM_API_URL}/client-api/test-runs/${this.testSession}`,"PATCH",e)}catch(e){return console.log("Error sending test run end",e.message),null}}async sendUploadsComplete(){if(!this.mock)try{await this.updateTestRun(`${this.CHECKSUM_API_URL}/client-api/test-runs/${this.testSession}/uploads-completed`,"PATCH")}catch(t){console.log("Error sending test run uploads complete",t.message)}}async updateTestRun(t,e,s=void 0){return(await fetch(t,{method:e,headers:{Accept:"application/json","Content-Type":"application/json",ChecksumAppCode:this.config.apiKey},body:s})).json()}async getEnvInfo(){let t={commitHash:"",branch:"branch",environment:process.env.CI?"CI":"local",name:"name",startedAt:Date.now()};try{t.commitHash=(await this.getCmdOutput("git rev-parse HEAD")).toString().trim()}catch(e){console.log("Error getting git hash",e.message)}try{t.branch=(await this.getCmdOutput("git rev-parse --abbrev-ref HEAD")).toString().trim()}catch(e){console.log("Error getting branch name",e.message)}return t}getVolatileConfigPath(){return(0,r.join)(this.getRootDirPath(),"checksum.config.tmp.ts")}deleteVolatileConfig(){let t=this.getVolatileConfigPath();(0,i.existsSync)(t)&&(0,i.rmSync)(t)}setChecksumConfig(){this.config={...require((0,r.join)(this.getRootDirPath(),"checksum.config.ts")).default||{},...this.volatileChecksumConfig||{}},this.config.apiURL&&(this.CHECKSUM_API_URL=this.config.apiURL)}processChecksumArguments(t){this.deleteVolatileConfig();for(let e of t)if(e.startsWith("--checksum-config"))try{this.volatileChecksumConfig=JSON.parse(e.split("=")[1]),t=t.filter(s=>s!==e)}catch(s){console.log("Error parsing checksum config",s.message),this.volatileChecksumConfig=void 0}}install(){console.log("Creating Checksum directory and necessary files to run your tests");let t=this.getRootDirPath();if((0,i.existsSync)(this.getRootDirPath())||(0,i.mkdirSync)(t),!(0,i.existsSync)(this.getChecksumRootOrigin()))throw new Error("Could not find checksum root directory, please install @checksum-ai/runtime package");["checksum.config.ts","playwright.config.ts","login.ts","README.md"].forEach(e=>{(0,i.copyFileSync)((0,r.join)(this.getChecksumRootOrigin(),e),(0,r.join)(t,e))}),(0,i.mkdirSync)((0,r.join)(t,"tests"),{recursive:!0}),["esra","har","trace","log"].forEach(e=>{(0,i.mkdirSync)((0,r.join)(t,"test-data",e),{recursive:!0})})}getRootDirPath(){return(0,r.join)(process.cwd(),d)}getChecksumRootOrigin(){return(0,r.join)(process.cwd(),"node_modules","@checksum-ai","runtime","checksum-root")}};u(h,"ChecksumCLI");(async()=>await new h().execute())();
19
+ `;(0,i.writeFileSync)(t,e)}cleanup(){this.deleteVolatileConfig(),this.testRunMonitorProcess.stdin.write("cli:shutdown"),this.testRunMonitorProcess.kill()}async getSession(){try{if(!this.config.options.hostReports){this.setIsolatedMode();return}let t=this.config.apiKey;(!t||t==="<API key>")&&(console.error("No API key found in checksum config"),this.shutdown(1));let e=JSON.stringify(await this.getEnvInfo()),s=await fetch(`${this.CHECKSUM_API_URL}/client-api/test-runs`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",ChecksumAppCode:t},body:e});this.testSession=(await s.json()).uuid}catch{console.log("Error getting checksum test session, will run in isolation mode"),this.setIsolatedMode()}}setIsolatedMode(){this.isolatedMode=!0,this.testSession="isolated-session"}async sendTestRunEnd(t){if(!this.isolatedMode)try{let e=JSON.stringify({...t,endedAt:Date.now()});await this.updateTestRun(`${this.CHECKSUM_API_URL}/client-api/test-runs/${this.testSession}`,"PATCH",e)}catch(e){return console.log("Error sending test run end",e.message),null}}async sendUploadsComplete(){if(!this.isolatedMode)try{await this.updateTestRun(`${this.CHECKSUM_API_URL}/client-api/test-runs/${this.testSession}/uploads-completed`,"PATCH")}catch(t){console.log("Error sending test run uploads complete",t.message)}}async updateTestRun(t,e,s=void 0){return(await fetch(t,{method:e,headers:{Accept:"application/json","Content-Type":"application/json",ChecksumAppCode:this.config.apiKey},body:s})).json()}async getEnvInfo(){let t={commitHash:"",branch:"branch",environment:process.env.CI?"CI":"local",name:"name",startedAt:Date.now()};try{t.commitHash=(await this.getCmdOutput("git rev-parse HEAD")).toString().trim()}catch(e){console.log("Error getting git hash",e.message)}try{t.branch=(await this.getCmdOutput("git rev-parse --abbrev-ref HEAD")).toString().trim()}catch(e){console.log("Error getting branch name",e.message)}return t}getVolatileConfigPath(){return(0,r.join)(this.getRootDirPath(),"checksum.config.tmp.ts")}deleteVolatileConfig(){let t=this.getVolatileConfigPath();(0,i.existsSync)(t)&&(0,i.rmSync)(t)}setChecksumConfig(){this.config={...require((0,r.join)(this.getRootDirPath(),"checksum.config.ts")).default||{},...this.volatileChecksumConfig||{}},this.config.apiURL&&(this.CHECKSUM_API_URL=this.config.apiURL)}processChecksumArguments(t){this.deleteVolatileConfig();for(let e of t)if(e.startsWith("--checksum-config"))try{this.volatileChecksumConfig=JSON.parse(e.split("=")[1]),t=t.filter(s=>s!==e)}catch(s){console.log("Error parsing checksum config",s.message),this.volatileChecksumConfig=void 0}}install(){console.log("Creating Checksum directory and necessary files to run your tests");let t=this.getRootDirPath();if((0,i.existsSync)(this.getRootDirPath())||(0,i.mkdirSync)(t),!(0,i.existsSync)(this.getChecksumRootOrigin()))throw new Error("Could not find checksum root directory, please install @checksum-ai/runtime package");["checksum.config.ts","playwright.config.ts","login.ts","README.md"].forEach(e=>{(0,i.copyFileSync)((0,r.join)(this.getChecksumRootOrigin(),e),(0,r.join)(t,e))}),(0,i.mkdirSync)((0,r.join)(t,"tests"),{recursive:!0}),["esra","har","trace","log"].forEach(e=>{(0,i.mkdirSync)((0,r.join)(t,"test-data",e),{recursive:!0})})}getRootDirPath(){return(0,r.join)(process.cwd(),m)}getChecksumRootOrigin(){return(0,r.join)(process.cwd(),"node_modules","@checksum-ai","runtime","checksum-root")}};u(h,"ChecksumCLI");(async()=>await new h().execute())();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@checksum-ai/runtime",
3
- "version": "1.0.28",
3
+ "version": "1.0.30",
4
4
  "description": "Checksum.ai test runtime",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -5,5 +5,5 @@ GFS4: `),console.error(e)},"debug"));H[se]||(In=global[se]||[],Pn(H,In),H.close=
5
5
  see https://github.com/jprichardson/node-fs-extra/issues/269`,"Warning","fs-extra-WARN0001"),Op.checkPaths(e,a,"copy",p,(i,d)=>{if(i)return t(i);let{srcStat:n,destStat:l}=d;Op.checkParentPaths(e,n,a,"copy",s=>{if(s)return t(s);Qn(e,a,p,(m,o)=>{if(m)return t(m);if(!o)return t();Uo(l,e,a,p,t)})})})}r(qo,"copy");function Uo(e,a,p,t,i){let d=Fp.dirname(p);Po(d,(n,l)=>{if(n)return i(n);if(l)return hd(e,a,p,t,i);Bo(d,s=>s?i(s):hd(e,a,p,t,i))})}r(Uo,"checkParentDir");function Qn(e,a,p,t){if(!p.filter)return t(null,!0);Promise.resolve(p.filter(e,a)).then(i=>t(null,i),i=>t(i))}r(Qn,"runFilter");function hd(e,a,p,t,i){(t.dereference?xe.stat:xe.lstat)(a,(n,l)=>n?i(n):l.isDirectory()?$o(l,e,a,p,t,i):l.isFile()||l.isCharacterDevice()||l.isBlockDevice()?Mo(l,e,a,p,t,i):l.isSymbolicLink()?Ko(e,a,p,t,i):l.isSocket()?i(new Error(`Cannot copy a socket file: ${a}`)):l.isFIFO()?i(new Error(`Cannot copy a FIFO pipe: ${a}`)):i(new Error(`Unknown file: ${a}`)))}r(hd,"getStats");function Mo(e,a,p,t,i,d){return a?zo(e,p,t,i,d):e3(e,p,t,i,d)}r(Mo,"onFile");function zo(e,a,p,t,i){if(t.overwrite)xe.unlink(p,d=>d?i(d):e3(e,a,p,t,i));else return t.errorOnExist?i(new Error(`'${p}' already exists`)):i()}r(zo,"mayCopyFile");function e3(e,a,p,t,i){xe.copyFile(a,p,d=>d?i(d):t.preserveTimestamps?jo(e.mode,a,p,i):Zt(p,e.mode,i))}r(e3,"copyFile");function jo(e,a,p,t){return Zo(e)?Wo(p,e,i=>i?t(i):Xn(e,a,p,t)):Xn(e,a,p,t)}r(jo,"handleTimestampsAndMode");function Zo(e){return(e&128)===0}r(Zo,"fileIsNotWritable");function Wo(e,a,p){return Zt(e,a|128,p)}r(Wo,"makeFileWritable");function Xn(e,a,p,t){Ho(a,p,i=>i?t(i):Zt(p,e,t))}r(Xn,"setDestTimestampsAndMode");function Zt(e,a,p){return xe.chmod(e,a,p)}r(Zt,"setDestMode");function Ho(e,a,p){xe.stat(e,(t,i)=>t?p(t):Lo(a,i.atime,i.mtime,p))}r(Ho,"setDestTimestamps");function $o(e,a,p,t,i,d){return a?a3(p,t,i,d):Go(e.mode,p,t,i,d)}r($o,"onDir");function Go(e,a,p,t,i){xe.mkdir(p,d=>{if(d)return i(d);a3(a,p,t,n=>n?i(n):Zt(p,e,i))})}r(Go,"mkDirAndCopy");function a3(e,a,p,t){xe.readdir(e,(i,d)=>i?t(i):cd(d,e,a,p,t))}r(a3,"copyDir");function cd(e,a,p,t,i){let d=e.pop();return d?Jo(e,d,a,p,t,i):i()}r(cd,"copyDirItems");function Jo(e,a,p,t,i,d){let n=Fp.join(p,a),l=Fp.join(t,a);Qn(n,l,i,(s,m)=>{if(s)return d(s);if(!m)return cd(e,p,t,i,d);Op.checkPaths(n,l,"copy",i,(o,c)=>{if(o)return d(o);let{destStat:f}=c;hd(f,n,l,i,u=>u?d(u):cd(e,p,t,i,d))})})}r(Jo,"copyDirItem");function Ko(e,a,p,t,i){xe.readlink(a,(d,n)=>{if(d)return i(d);if(t.dereference&&(n=Fp.resolve(process.cwd(),n)),e)xe.readlink(p,(l,s)=>l?l.code==="EINVAL"||l.code==="UNKNOWN"?xe.symlink(n,p,i):i(l):(t.dereference&&(s=Fp.resolve(process.cwd(),s)),Op.isSrcSubdir(n,s)?i(new Error(`Cannot copy '${n}' to a subdirectory of itself, '${s}'.`)):Op.isSrcSubdir(s,n)?i(new Error(`Cannot overwrite '${s}' with '${n}'.`)):Yo(n,p,i)));else return xe.symlink(n,p,i)})}r(Ko,"onLink");function Yo(e,a,p){xe.unlink(a,t=>t?p(t):xe.symlink(e,a,p))}r(Yo,"copyLink");p3.exports=qo});var l3=v((Pc,n3)=>{"use strict";var _e=be(),Rp=require("path"),Xo=ze().mkdirsSync,Qo=ud().utimesMillisSync,Vp=ea();function em(e,a,p){typeof p=="function"&&(p={filter:p}),p=p||{},p.clobber="clobber"in p?!!p.clobber:!0,p.overwrite="overwrite"in p?!!p.overwrite:p.clobber,p.preserveTimestamps&&process.arch==="ia32"&&process.emitWarning(`Using the preserveTimestamps option in 32-bit node is not recommended;
6
6
 
7
7
  see https://github.com/jprichardson/node-fs-extra/issues/269`,"Warning","fs-extra-WARN0002");let{srcStat:t,destStat:i}=Vp.checkPathsSync(e,a,"copy",p);if(Vp.checkParentPathsSync(e,t,a,"copy"),p.filter&&!p.filter(e,a))return;let d=Rp.dirname(a);return _e.existsSync(d)||Xo(d),i3(i,e,a,p)}r(em,"copySync");function i3(e,a,p,t){let d=(t.dereference?_e.statSync:_e.lstatSync)(a);if(d.isDirectory())return nm(d,e,a,p,t);if(d.isFile()||d.isCharacterDevice()||d.isBlockDevice())return am(d,e,a,p,t);if(d.isSymbolicLink())return om(e,a,p,t);throw d.isSocket()?new Error(`Cannot copy a socket file: ${a}`):d.isFIFO()?new Error(`Cannot copy a FIFO pipe: ${a}`):new Error(`Unknown file: ${a}`)}r(i3,"getStats");function am(e,a,p,t,i){return a?pm(e,p,t,i):d3(e,p,t,i)}r(am,"onFile");function pm(e,a,p,t){if(t.overwrite)return _e.unlinkSync(p),d3(e,a,p,t);if(t.errorOnExist)throw new Error(`'${p}' already exists`)}r(pm,"mayCopyFile");function d3(e,a,p,t){return _e.copyFileSync(a,p),t.preserveTimestamps&&tm(e.mode,a,p),vd(p,e.mode)}r(d3,"copyFile");function tm(e,a,p){return im(e)&&dm(p,e),rm(a,p)}r(tm,"handleTimestamps");function im(e){return(e&128)===0}r(im,"fileIsNotWritable");function dm(e,a){return vd(e,a|128)}r(dm,"makeFileWritable");function vd(e,a){return _e.chmodSync(e,a)}r(vd,"setDestMode");function rm(e,a){let p=_e.statSync(e);return Qo(a,p.atime,p.mtime)}r(rm,"setDestTimestamps");function nm(e,a,p,t,i){return a?r3(p,t,i):lm(e.mode,p,t,i)}r(nm,"onDir");function lm(e,a,p,t){return _e.mkdirSync(p),r3(a,p,t),vd(p,e)}r(lm,"mkDirAndCopy");function r3(e,a,p){_e.readdirSync(e).forEach(t=>sm(t,e,a,p))}r(r3,"copyDir");function sm(e,a,p,t){let i=Rp.join(a,e),d=Rp.join(p,e);if(t.filter&&!t.filter(i,d))return;let{destStat:n}=Vp.checkPathsSync(i,d,"copy",t);return i3(n,i,d,t)}r(sm,"copyDirItem");function om(e,a,p,t){let i=_e.readlinkSync(a);if(t.dereference&&(i=Rp.resolve(process.cwd(),i)),e){let d;try{d=_e.readlinkSync(p)}catch(n){if(n.code==="EINVAL"||n.code==="UNKNOWN")return _e.symlinkSync(i,p);throw n}if(t.dereference&&(d=Rp.resolve(process.cwd(),d)),Vp.isSrcSubdir(i,d))throw new Error(`Cannot copy '${i}' to a subdirectory of itself, '${d}'.`);if(Vp.isSrcSubdir(d,i))throw new Error(`Cannot overwrite '${d}' with '${i}'.`);return mm(i,p)}else return _e.symlinkSync(i,p)}r(om,"onLink");function mm(e,a){return _e.unlinkSync(a),_e.symlinkSync(e,a)}r(mm,"copyLink");n3.exports=em});var Wt=v((qc,s3)=>{"use strict";var um=Se().fromCallback;s3.exports={copy:um(t3()),copySync:l3()}});var Ip=v((Uc,m3)=>{"use strict";var o3=be(),fm=Se().fromCallback;function hm(e,a){o3.rm(e,{recursive:!0,force:!0},a)}r(hm,"remove");function cm(e){o3.rmSync(e,{recursive:!0,force:!0})}r(cm,"removeSync");m3.exports={remove:fm(hm),removeSync:cm}});var g3=v((zc,_3)=>{"use strict";var vm=Se().fromPromise,h3=Q1(),c3=require("path"),v3=ze(),w3=Ip(),u3=vm(r(async function(a){let p;try{p=await h3.readdir(a)}catch{return v3.mkdirs(a)}return Promise.all(p.map(t=>w3.remove(c3.join(a,t))))},"emptyDir"));function f3(e){let a;try{a=h3.readdirSync(e)}catch{return v3.mkdirsSync(e)}a.forEach(p=>{p=c3.join(e,p),w3.removeSync(p)})}r(f3,"emptyDirSync");_3.exports={emptyDirSync:f3,emptydirSync:f3,emptyDir:u3,emptydir:u3}});var x3=v((Zc,b3)=>{"use strict";var wm=Se().fromCallback,y3=require("path"),O1=be(),S3=ze();function _m(e,a){function p(){O1.writeFile(e,"",t=>{if(t)return a(t);a()})}r(p,"makeFile"),O1.stat(e,(t,i)=>{if(!t&&i.isFile())return a();let d=y3.dirname(e);O1.stat(d,(n,l)=>{if(n)return n.code==="ENOENT"?S3.mkdirs(d,s=>{if(s)return a(s);p()}):a(n);l.isDirectory()?p():O1.readdir(d,s=>{if(s)return a(s)})})})}r(_m,"createFile");function gm(e){let a;try{a=O1.statSync(e)}catch{}if(a&&a.isFile())return;let p=y3.dirname(e);try{O1.statSync(p).isDirectory()||O1.readdirSync(p)}catch(t){if(t&&t.code==="ENOENT")S3.mkdirsSync(p);else throw t}O1.writeFileSync(e,"")}r(gm,"createFileSync");b3.exports={createFile:wm(_m),createFileSync:gm}});var k3=v((Hc,E3)=>{"use strict";var ym=Se().fromCallback,T3=require("path"),R1=be(),N3=ze(),Sm=F1().pathExists,{areIdentical:D3}=ea();function bm(e,a,p){function t(i,d){R1.link(i,d,n=>{if(n)return p(n);p(null)})}r(t,"makeLink"),R1.lstat(a,(i,d)=>{R1.lstat(e,(n,l)=>{if(n)return n.message=n.message.replace("lstat","ensureLink"),p(n);if(d&&D3(l,d))return p(null);let s=T3.dirname(a);Sm(s,(m,o)=>{if(m)return p(m);if(o)return t(e,a);N3.mkdirs(s,c=>{if(c)return p(c);t(e,a)})})})})}r(bm,"createLink");function xm(e,a){let p;try{p=R1.lstatSync(a)}catch{}try{let d=R1.lstatSync(e);if(p&&D3(d,p))return}catch(d){throw d.message=d.message.replace("lstat","ensureLink"),d}let t=T3.dirname(a);return R1.existsSync(t)||N3.mkdirsSync(t),R1.linkSync(e,a)}r(xm,"createLinkSync");E3.exports={createLink:ym(bm),createLinkSync:xm}});var C3=v((Gc,A3)=>{"use strict";var V1=require("path"),Bp=be(),Tm=F1().pathExists;function Nm(e,a,p){if(V1.isAbsolute(e))return Bp.lstat(e,t=>t?(t.message=t.message.replace("lstat","ensureSymlink"),p(t)):p(null,{toCwd:e,toDst:e}));{let t=V1.dirname(a),i=V1.join(t,e);return Tm(i,(d,n)=>d?p(d):n?p(null,{toCwd:i,toDst:e}):Bp.lstat(e,l=>l?(l.message=l.message.replace("lstat","ensureSymlink"),p(l)):p(null,{toCwd:e,toDst:V1.relative(t,e)})))}}r(Nm,"symlinkPaths");function Dm(e,a){let p;if(V1.isAbsolute(e)){if(p=Bp.existsSync(e),!p)throw new Error("absolute srcpath does not exist");return{toCwd:e,toDst:e}}else{let t=V1.dirname(a),i=V1.join(t,e);if(p=Bp.existsSync(i),p)return{toCwd:i,toDst:e};if(p=Bp.existsSync(e),!p)throw new Error("relative srcpath does not exist");return{toCwd:e,toDst:V1.relative(t,e)}}}r(Dm,"symlinkPathsSync");A3.exports={symlinkPaths:Nm,symlinkPathsSync:Dm}});var R3=v((Kc,O3)=>{"use strict";var F3=be();function Em(e,a,p){if(p=typeof a=="function"?a:p,a=typeof a=="function"?!1:a,a)return p(null,a);F3.lstat(e,(t,i)=>{if(t)return p(null,"file");a=i&&i.isDirectory()?"dir":"file",p(null,a)})}r(Em,"symlinkType");function km(e,a){let p;if(a)return a;try{p=F3.lstatSync(e)}catch{return"file"}return p&&p.isDirectory()?"dir":"file"}r(km,"symlinkTypeSync");O3.exports={symlinkType:Em,symlinkTypeSync:km}});var M3=v((Xc,U3)=>{"use strict";var Am=Se().fromCallback,I3=require("path"),je=Q1(),B3=ze(),Cm=B3.mkdirs,Fm=B3.mkdirsSync,P3=C3(),Om=P3.symlinkPaths,Rm=P3.symlinkPathsSync,L3=R3(),Vm=L3.symlinkType,Im=L3.symlinkTypeSync,Bm=F1().pathExists,{areIdentical:q3}=ea();function Pm(e,a,p,t){t=typeof p=="function"?p:t,p=typeof p=="function"?!1:p,je.lstat(a,(i,d)=>{!i&&d.isSymbolicLink()?Promise.all([je.stat(e),je.stat(a)]).then(([n,l])=>{if(q3(n,l))return t(null);V3(e,a,p,t)}):V3(e,a,p,t)})}r(Pm,"createSymlink");function V3(e,a,p,t){Om(e,a,(i,d)=>{if(i)return t(i);e=d.toDst,Vm(d.toCwd,p,(n,l)=>{if(n)return t(n);let s=I3.dirname(a);Bm(s,(m,o)=>{if(m)return t(m);if(o)return je.symlink(e,a,l,t);Cm(s,c=>{if(c)return t(c);je.symlink(e,a,l,t)})})})})}r(V3,"_createSymlink");function Lm(e,a,p){let t;try{t=je.lstatSync(a)}catch{}if(t&&t.isSymbolicLink()){let l=je.statSync(e),s=je.statSync(a);if(q3(l,s))return}let i=Rm(e,a);e=i.toDst,p=Im(i.toCwd,p);let d=I3.dirname(a);return je.existsSync(d)||Fm(d),je.symlinkSync(e,a,p)}r(Lm,"createSymlinkSync");U3.exports={createSymlink:Am(Pm),createSymlinkSync:Lm}});var J3=v((ev,G3)=>{"use strict";var{createFile:z3,createFileSync:j3}=x3(),{createLink:Z3,createLinkSync:W3}=k3(),{createSymlink:H3,createSymlinkSync:$3}=M3();G3.exports={createFile:z3,createFileSync:j3,ensureFile:z3,ensureFileSync:j3,createLink:Z3,createLinkSync:W3,ensureLink:Z3,ensureLinkSync:W3,createSymlink:H3,createSymlinkSync:$3,ensureSymlink:H3,ensureSymlinkSync:$3}});var Ht=v((av,K3)=>{function qm(e,{EOL:a=`
8
- `,finalEOL:p=!0,replacer:t=null,spaces:i}={}){let d=p?a:"";return JSON.stringify(e,t,i).replace(/\n/g,a)+d}r(qm,"stringify");function Um(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e.replace(/^\uFEFF/,"")}r(Um,"stripBom");K3.exports={stringify:qm,stripBom:Um}});var e9=v((tv,Q3)=>{var qa;try{qa=be()}catch{qa=require("fs")}var $t=Se(),{stringify:Y3,stripBom:X3}=Ht();async function Mm(e,a={}){typeof a=="string"&&(a={encoding:a});let p=a.fs||qa,t="throws"in a?a.throws:!0,i=await $t.fromCallback(p.readFile)(e,a);i=X3(i);let d;try{d=JSON.parse(i,a?a.reviver:null)}catch(n){if(t)throw n.message=`${e}: ${n.message}`,n;return null}return d}r(Mm,"_readFile");var zm=$t.fromPromise(Mm);function jm(e,a={}){typeof a=="string"&&(a={encoding:a});let p=a.fs||qa,t="throws"in a?a.throws:!0;try{let i=p.readFileSync(e,a);return i=X3(i),JSON.parse(i,a.reviver)}catch(i){if(t)throw i.message=`${e}: ${i.message}`,i;return null}}r(jm,"readFileSync");async function Zm(e,a,p={}){let t=p.fs||qa,i=Y3(a,p);await $t.fromCallback(t.writeFile)(e,i,p)}r(Zm,"_writeFile");var Wm=$t.fromPromise(Zm);function Hm(e,a,p={}){let t=p.fs||qa,i=Y3(a,p);return t.writeFileSync(e,i,p)}r(Hm,"writeFileSync");var $m={readFile:zm,readFileSync:jm,writeFile:Wm,writeFileSync:Hm};Q3.exports=$m});var p9=v((dv,a9)=>{"use strict";var Gt=e9();a9.exports={readJson:Gt.readFile,readJsonSync:Gt.readFileSync,writeJson:Gt.writeFile,writeJsonSync:Gt.writeFileSync}});var Jt=v((rv,d9)=>{"use strict";var Gm=Se().fromCallback,Pp=be(),t9=require("path"),i9=ze(),Jm=F1().pathExists;function Km(e,a,p,t){typeof p=="function"&&(t=p,p="utf8");let i=t9.dirname(e);Jm(i,(d,n)=>{if(d)return t(d);if(n)return Pp.writeFile(e,a,p,t);i9.mkdirs(i,l=>{if(l)return t(l);Pp.writeFile(e,a,p,t)})})}r(Km,"outputFile");function Ym(e,...a){let p=t9.dirname(e);if(Pp.existsSync(p))return Pp.writeFileSync(e,...a);i9.mkdirsSync(p),Pp.writeFileSync(e,...a)}r(Ym,"outputFileSync");d9.exports={outputFile:Gm(Km),outputFileSync:Ym}});var n9=v((lv,r9)=>{"use strict";var{stringify:Xm}=Ht(),{outputFile:Qm}=Jt();async function eu(e,a,p={}){let t=Xm(a,p);await Qm(e,t,p)}r(eu,"outputJson");r9.exports=eu});var s9=v((ov,l9)=>{"use strict";var{stringify:au}=Ht(),{outputFileSync:pu}=Jt();function tu(e,a,p){let t=au(a,p);pu(e,t,p)}r(tu,"outputJsonSync");l9.exports=tu});var m9=v((uv,o9)=>{"use strict";var iu=Se().fromPromise,ge=p9();ge.outputJson=iu(n9());ge.outputJsonSync=s9();ge.outputJSON=ge.outputJson;ge.outputJSONSync=ge.outputJsonSync;ge.writeJSON=ge.writeJson;ge.writeJSONSync=ge.writeJsonSync;ge.readJSON=ge.readJson;ge.readJSONSync=ge.readJsonSync;o9.exports=ge});var v9=v((fv,c9)=>{"use strict";var du=be(),_d=require("path"),ru=Wt().copy,h9=Ip().remove,nu=ze().mkdirp,lu=F1().pathExists,u9=ea();function su(e,a,p,t){typeof p=="function"&&(t=p,p={}),p=p||{};let i=p.overwrite||p.clobber||!1;u9.checkPaths(e,a,"move",p,(d,n)=>{if(d)return t(d);let{srcStat:l,isChangingCase:s=!1}=n;u9.checkParentPaths(e,l,a,"move",m=>{if(m)return t(m);if(ou(a))return f9(e,a,i,s,t);nu(_d.dirname(a),o=>o?t(o):f9(e,a,i,s,t))})})}r(su,"move");function ou(e){let a=_d.dirname(e);return _d.parse(a).root===a}r(ou,"isParentRoot");function f9(e,a,p,t,i){if(t)return wd(e,a,p,i);if(p)return h9(a,d=>d?i(d):wd(e,a,p,i));lu(a,(d,n)=>d?i(d):n?i(new Error("dest already exists.")):wd(e,a,p,i))}r(f9,"doRename");function wd(e,a,p,t){du.rename(e,a,i=>i?i.code!=="EXDEV"?t(i):mu(e,a,p,t):t())}r(wd,"rename");function mu(e,a,p,t){ru(e,a,{overwrite:p,errorOnExist:!0},d=>d?t(d):h9(e,t))}r(mu,"moveAcrossDevice");c9.exports=su});var S9=v((cv,y9)=>{"use strict";var _9=be(),yd=require("path"),uu=Wt().copySync,g9=Ip().removeSync,fu=ze().mkdirpSync,w9=ea();function hu(e,a,p){p=p||{};let t=p.overwrite||p.clobber||!1,{srcStat:i,isChangingCase:d=!1}=w9.checkPathsSync(e,a,"move",p);return w9.checkParentPathsSync(e,i,a,"move"),cu(a)||fu(yd.dirname(a)),vu(e,a,t,d)}r(hu,"moveSync");function cu(e){let a=yd.dirname(e);return yd.parse(a).root===a}r(cu,"isParentRoot");function vu(e,a,p,t){if(t)return gd(e,a,p);if(p)return g9(a),gd(e,a,p);if(_9.existsSync(a))throw new Error("dest already exists.");return gd(e,a,p)}r(vu,"doRename");function gd(e,a,p){try{_9.renameSync(e,a)}catch(t){if(t.code!=="EXDEV")throw t;return wu(e,a,p)}}r(gd,"rename");function wu(e,a,p){return uu(e,a,{overwrite:p,errorOnExist:!0}),g9(e)}r(wu,"moveAcrossDevice");y9.exports=hu});var x9=v((wv,b9)=>{"use strict";var _u=Se().fromCallback;b9.exports={move:_u(v9()),moveSync:S9()}});var N9=v((_v,T9)=>{"use strict";T9.exports={...Q1(),...Wt(),...g3(),...J3(),...m9(),...ze(),...x9(),...Jt(),...F1(),...Ip()}});var gu={};L9(gu,{TestRunMonitor:()=>qp});module.exports=q9(gu);var F9=I1(require("net")),Ua=require("fs"),Sd=I1(nr());var na=r(e=>new Promise(a=>setTimeout(a,e)),"awaitSleep"),lr=r(async(e,a=1e3,p="action hang guard timed out")=>{let t="guard-timed-out",i=r(async()=>(await na(a+1e3),t),"guard"),d=await Promise.race([e,i()]);if(typeof d=="string"&&d===t)throw new Error(p);return d},"guardReturn");var Xt=require("path");var Tn=require("fs"),Nn=require("jsdom"),Dn=require("fs/promises"),En=I1(Lt());var kp=class{constructor(a,p,t,i="https://api.checksum.ai/cdn/test-runs"){this.reportHTMLFilePath=a;this.testRunUUID=p;this.pwTestIdToChecksumTestId=t;this.assetsBaseURL=i}async process(){await this.initializeDOM(),this.makeLightModeOnly(),await this.editZipFile(),await this.writeFile()}async initializeDOM(){return this.dom=await Nn.JSDOM.fromFile(this.reportHTMLFilePath,{resources:"usable",runScripts:"dangerously"}),new Promise(a=>this.dom.window.addEventListener("load",a))}async writeFile(){let a=this.dom.serialize();a=a.replace(/window.playwrightReportBase64 = ".*";/,`window.playwrightReportBase64 = "${this.newBase64Zip}";`),await(0,Dn.cp)(this.reportHTMLFilePath,this.reportHTMLFilePath.replace(".html",".backup.html")),(0,Tn.writeFileSync)(this.reportHTMLFilePath,a)}makeLightModeOnly(){this.dom.window.document.querySelector('meta[name="color-scheme"]').setAttribute("content","light");let p=this.dom.window.document.querySelector("head style"),t=p.innerHTML,i=/@media\s*\(prefers-color-scheme:\s*dark\)\s*{[^}]*}/g,d=t.replace(i,"");p.innerHTML=d}async editZipFile(){let a=this.dom.window.playwrightReportBase64.replace("data:application/zip;base64,",""),p=await(0,En.loadAsync)(a,{base64:!0});for(let i of Object.keys(p.files)){let d=p.file(i);if(d){let n=await d.async("string"),l=JSON.parse(n);i.startsWith("report")?this.handleReportJSON(l):this.handleFileReportJSON(l),p.file(i,JSON.stringify(l))}}let t=await p.generateAsync({type:"base64"});this.newBase64Zip=`data:application/zip;base64,${t}`}getCloudPath(a){return`${this.assetsBaseURL}/${this.testRunUUID}/${this.pwTestIdToChecksumTestId[a]}`}handleReportJSON(a){a.files.forEach(p=>p.tests.forEach(t=>{t.results.forEach(i=>{i.attachments.forEach(d=>{this.handleAttachment(d,t.testId)})})}))}handleFileReportJSON(a){var p;(p=a.tests)==null||p.forEach(t=>{var i;(i=t.results)==null||i.forEach(d=>{var n;(n=d.attachments)==null||n.forEach(l=>this.handleAttachment(l,t.testId))})})}handleAttachment(a,p){["trace","video"].includes(a.name)&&(a.path=`${this.getCloudPath(p)}/${a.name}`)}};r(kp,"PlaywrightReportProcessor");var O9=require("http");var ue=require("fs"),pd=I1(Lt()),td=require("readline/promises");var Ap=class{constructor(a,p,t,i){this.mode=a;this.inputZipFilePath=p;this.outputZipFilePath=t;this.frontendLogPrefix=i;this.originalTraceFileNames=[];this.remainingTraceFileNames=[];this.wallTimesToBeRemoved={};this.callIdsRemovals={};this.consoleLogGUIDs=[];this.numberOfLinesPerFile={};this.generationAllowedAPIName=["page.goto","page.waitForNavigation","locator.fill","locator.click","locator.hover","locator.check","locator.uncheck"]}async process(){await this.unzipAndWriteTraceFiles();for(let a of this.originalTraceFileNames)await this.preprocessFile(a);for(this.remainingTraceFileNames=[...this.originalTraceFileNames];this.remainingTraceFileNames.length>0;)for(let a of this.remainingTraceFileNames)await this.processFile(a);await this.reZip()}getBackupZipFilePath(){return this.inputZipFilePath.replace(".zip",".trace-files-backup.zip")}async unzipAndWriteTraceFiles(){let a=(0,ue.readFileSync)(this.inputZipFilePath);this.zipped=await(0,pd.loadAsync)(a),this.originalTraceFileNames=Object.keys(this.zipped.files).filter(i=>i.endsWith(".trace"));let p=await(0,pd.loadAsync)("UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==",{base64:!0});for(let i of this.originalTraceFileNames){let d=await this.zipped.file(i).async("string");(0,ue.writeFileSync)(i,d),p.file(i,d)}let t=await p.generateAsync({type:"nodebuffer"});(0,ue.writeFileSync)(this.getBackupZipFilePath(),t)}async reZip(){for(let p of this.originalTraceFileNames){let t=(0,ue.readFileSync)(p);this.zipped.remove(p),this.zipped.file(p,t)}let a=await this.zipped.generateAsync({type:"nodebuffer"});(0,ue.existsSync)(this.outputZipFilePath)&&(0,ue.rmSync)(this.outputZipFilePath),(0,ue.writeFileSync)(this.outputZipFilePath,a);for(let p of this.originalTraceFileNames)(0,ue.rmSync)(p)}async preprocessFile(a){this.callIdsRemovals[a]={callIdsToBeRemoved:{},arrayOfCallIdsToBeRemoved:new Set};let p=(0,ue.createReadStream)(a),t=(0,td.createInterface)({input:p,crlfDelay:1/0}),i=0;for await(let d of t){i++;let n=JSON.parse(d);this.shouldLineBeRemoved(n)&&(n.wallTime&&(this.wallTimesToBeRemoved[n.wallTime]=!0),n.callId&&(this.callIdsRemovals[a].callIdsToBeRemoved[n.callId]=!0,this.callIdsRemovals[a].arrayOfCallIdsToBeRemoved.add(n.callId)))}this.numberOfLinesPerFile[a]=i}async processFile(a){var n,l;let p=[],t=(0,ue.createReadStream)(a),i=(0,td.createInterface)({input:t,crlfDelay:1/0}),d=a;for await(let s of i){let m=JSON.parse(s),o=!1;if(this.frontendLogPrefix){if(this.isChecksumConsoleLog(m)){this.consoleLogGUIDs.push(m.guid);continue}if(this.isConsoleLogMetadata(m)&&this.consoleLogGUIDs.includes((l=(n=m.params)==null?void 0:n.message)==null?void 0:l.guid))continue}if(this.lineCanBeRemoved(m)&&(this.wallTimesToBeRemoved[m.wallTime]||this.callIdsRemovals[d].callIdsToBeRemoved[m.callId]||Array.from(this.callIdsRemovals[d].arrayOfCallIdsToBeRemoved).some(c=>s.includes(`"${c}"`)))&&(o=!0),o){m.callId&&(this.callIdsRemovals[d].callIdsToBeRemoved[m.callId]=!0,this.callIdsRemovals[d].arrayOfCallIdsToBeRemoved.add(m.callId));continue}p.push(s)}if(p.length===this.numberOfLinesPerFile[d]){let s=this.remainingTraceFileNames.indexOf(d);s>-1&&this.remainingTraceFileNames.splice(s,1)}else this.numberOfLinesPerFile[d]=p.length,(0,ue.writeFileSync)(a,p.join(`
9
- `))}isChecksumConsoleLog(a){var p,t;return a.class==="ConsoleMessage"&&((t=(p=a.initializer)==null?void 0:p.text)==null?void 0:t.startsWith(this.frontendLogPrefix))}isConsoleLogMetadata(a){return a.class==="BrowserContext"&&a.method==="console"}lineCanBeRemoved(a){return!["frame-snapshot"].includes(a.type)}shouldLineBeRemoved(a){switch(this.mode){case"runtime":return this.shouldLineBeRemoved_runtime(a);case"generation":return this.shouldLineBeRemoved_generation(a)}return!1}shouldLineBeRemoved_runtime(a){var p;return(p=a.stack)==null?void 0:p.find(t=>!t.file.endsWith("spec.ts")&&!["executePlaywrightMethodWithTimeout"].includes(t.function))}shouldLineBeRemoved_generation(a){return!!a.apiName&&!this.generationAllowedAPIName.includes(a.apiName)}};r(Ap,"PlaywrightTraceProcessor");var D9=I1(Lt()),Kt=I1(N9()),Yt=I1(require("path")),E9=require("fs");async function k9(e,a){let p=await Kt.default.readdir(a);await Promise.all(p.map(async t=>{let i=Yt.default.join(a,t);if((await Kt.default.stat(i)).isDirectory()){let n=e.folder(t);await k9(n,i)}else{let n=await Kt.default.readFile(i);e.file(t,n)}}))}r(k9,"addFolderToZip");async function A9(e){let a=new D9.default;try{await k9(a,e);let p=await a.generateAsync({type:"nodebuffer"}),t=`${(0,Yt.basename)(e)}.zip`;return(0,E9.writeFileSync)(t,p),t}catch(p){return console.error("Error creating zip:",p),null}}r(A9,"zipFolder");var qp=class{constructor(a,p=!1){this.config=a;this.mock=p;this.MAX_UPLOADS=5;this.MONITOR_INTERVAL=5e3;this.UPLOAD_TIMEOUT=6e5;this.assets=[];this.stats={passed:0,failed:0,healed:0};this.reportComplete=!1;this.pwTestIdToChecksumTestId={};setInterval(this.monitorUploads.bind(this),this.MONITOR_INTERVAL),this.listenForMessages(),this.startServer()}listenForMessages(){process.stdin.on("data",async a=>{let p=a.toString().trim();if(!p.startsWith("cli:"))return;let[t,i]=p.substring(4).split("=");switch(t){case"report":await this.handleReport(i),this.monitorUploadsCompletion();break;case"shutdown":this.shutdown();break}})}sendMessage(a){console.log(`${"monitor"}:${a}`)}async handleReport(a){return this.reportAsset=this.initAsset({type:"report",path:a}),await new kp(a,this.config.sessionId,this.pwTestIdToChecksumTestId).process(),this.uploadAsset(this.reportAsset)}shutdown(){console.log("Received shutdown message from CLI"),this.server.close(),process.exit(0)}async monitorUploadsCompletion(){if(!this.reportComplete&&this.reportAsset&&this.reportAsset.complete){this.reportComplete=!0;let a="{}";try{a=JSON.stringify(this.stats)}catch(p){console.log("Error stringifying stats",p)}this.sendMessage(`report-uploaded=${a}`)}if(this.reportComplete&&this.assets.filter(a=>a.complete||a.error).length===this.assets.length){await na(100),this.sendMessage("complete");return}await na(1e3),this.monitorUploadsCompletion()}async startServer(){let a=await this.acquirePortNumber();this.sendMessage(`port=${a}`),this.server=(0,O9.createServer)((p,t)=>{let i=r(n=>{t.writeHead(400,{"Content-Type":"text/plain"}),t.end(n)},"returnErrorWithMessage");if(p.method!=="POST"){t.writeHead(404,{"Content-Type":"text/plain"}),t.end("Method not allowed");return}let d="";p.on("data",n=>{d+=n.toString()}),p.on("end",()=>{let n;try{n=JSON.parse(d)}catch{return i("Invalid body")}let{type:l,payload:s,watch:m}=n;switch(l){case"asset":if(!s.path||!s.type)return i("Missing arguments");m?this.watchAsset(s):this.processAsset(s);break;case"testInfo":if(!s.pwTestId||!s.checksumTestId)return i("Missing arguments");this.pwTestIdToChecksumTestId[s.pwTestId]=s.checksumTestId;break;case"testStats":this.stats[s.passed?"passed":"failed"]++,s.healed&&this.stats.healed++;break;default:return i("Invalid message type")}t.writeHead(200,{"Content-Type":"text/plain"}),t.end("OK")})}),this.server.listen(a)}monitorUploads(){let a=r(()=>this.assets.filter(t=>t.response&&!t.complete&&!t.error),"getActiveUploads"),p=this.assets.filter(t=>!t.response);if(p.length!==0&&!(a().length>=this.MAX_UPLOADS))for(;p.length>0&&a().length<this.MAX_UPLOADS;){let t=p.pop();this.uploadAsset(t)}}async uploadAsset(a){let{path:p}=a.info;if(console.log("uploading asset",p),this.mock){a.response=new Promise((l,s)=>{setTimeout(()=>{a.complete=!0,console.log("Asset uploaded successfully",p),l(new Response)},Math.random()*100)});return}if(await this.getSignedURLForUpload(a),!a.uploadURL){console.log("Error getting signed URL for asset",p),a.error=!0;return}let i=(0,Ua.statSync)(p).size,d=(0,Ua.createReadStream)(p),n=lr((0,Sd.default)(a.uploadURL,{method:"PUT",headers:{"Content-length":i.toString()},body:d}),this.UPLOAD_TIMEOUT);n.then(l=>{if(!l.ok)throw l.json().then(s=>{console.log(s)}),new Error("Upload failed");console.log("Asset uploaded successfully",p),a.complete=!0}).catch(l=>{console.log("Error uploading asset",p,l),a.error=!0}),a.response=n}async getSignedURLForUpload(a){try{let{apiKey:p,sessionId:t,checksumApiURL:i}=this.config,d=a.info,n=await(0,Sd.default)(`${i}/client-api/test-runs/${t}/get-upload-url`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",ChecksumAppCode:p},body:JSON.stringify(d)}),{url:l}=await n.json();a.uploadURL=l}catch(p){return console.error("Error getting signed URL for artifact",p),null}}watchAsset(a){let p=(0,Xt.dirname)(a.path),t=(0,Xt.basename)(a.path),i=(0,Ua.watch)(p,(d,n)=>{n===t&&(this.processAsset(a),i.close())})}processAsset(a){switch(a.type){case"trace":return this.processTrace(a.path,a.testId);case"har":return this.processHar(a.path,a.testId);case"esra":case"test-files":return this.addAsset(a)}}async processHar(a,p){await na(1e3);let t=await A9(a);if(console.log("processed har, sending for upload"),t)return this.addAsset({type:"har",path:t,testId:p})}async processTrace(a,p){await na(1e3);let t=a.replace(".zip",".processed.zip");await new Ap("runtime",a,t,"$checksum").process(),console.log("processed trace files, sending for upload"),this.addAsset({type:"trace",path:t,testId:p}),this.addAsset({type:"trace-backup-file",path:a,testId:p})}addAsset(a){console.log("adding asset",a.path);let p=this.initAsset(a);return this.assets.push(p),p}initAsset(a){return{complete:!1,error:!1,response:void 0,info:a}}async acquirePortNumber(){return await new Promise((a,p)=>{let t=F9.createServer();t.unref(),t.on("error",p),t.listen(0,()=>{let i=t.address().port;t.close(()=>{a(i)})})})}};r(qp,"TestRunMonitor");var Lp;try{if(Lp=JSON.parse(process.argv[2]),!Lp.sessionId||!Lp.apiKey||!Lp.checksumApiURL)throw new Error("Invalid config")}catch(e){console.log("Error starting test run monitor",e),process.exit(1)}var C9;new qp(Lp,((C9=process.argv)==null?void 0:C9[3])==="mock");0&&(module.exports={TestRunMonitor});
8
+ `,finalEOL:p=!0,replacer:t=null,spaces:i}={}){let d=p?a:"";return JSON.stringify(e,t,i).replace(/\n/g,a)+d}r(qm,"stringify");function Um(e){return Buffer.isBuffer(e)&&(e=e.toString("utf8")),e.replace(/^\uFEFF/,"")}r(Um,"stripBom");K3.exports={stringify:qm,stripBom:Um}});var e9=v((tv,Q3)=>{var qa;try{qa=be()}catch{qa=require("fs")}var $t=Se(),{stringify:Y3,stripBom:X3}=Ht();async function Mm(e,a={}){typeof a=="string"&&(a={encoding:a});let p=a.fs||qa,t="throws"in a?a.throws:!0,i=await $t.fromCallback(p.readFile)(e,a);i=X3(i);let d;try{d=JSON.parse(i,a?a.reviver:null)}catch(n){if(t)throw n.message=`${e}: ${n.message}`,n;return null}return d}r(Mm,"_readFile");var zm=$t.fromPromise(Mm);function jm(e,a={}){typeof a=="string"&&(a={encoding:a});let p=a.fs||qa,t="throws"in a?a.throws:!0;try{let i=p.readFileSync(e,a);return i=X3(i),JSON.parse(i,a.reviver)}catch(i){if(t)throw i.message=`${e}: ${i.message}`,i;return null}}r(jm,"readFileSync");async function Zm(e,a,p={}){let t=p.fs||qa,i=Y3(a,p);await $t.fromCallback(t.writeFile)(e,i,p)}r(Zm,"_writeFile");var Wm=$t.fromPromise(Zm);function Hm(e,a,p={}){let t=p.fs||qa,i=Y3(a,p);return t.writeFileSync(e,i,p)}r(Hm,"writeFileSync");var $m={readFile:zm,readFileSync:jm,writeFile:Wm,writeFileSync:Hm};Q3.exports=$m});var p9=v((dv,a9)=>{"use strict";var Gt=e9();a9.exports={readJson:Gt.readFile,readJsonSync:Gt.readFileSync,writeJson:Gt.writeFile,writeJsonSync:Gt.writeFileSync}});var Jt=v((rv,d9)=>{"use strict";var Gm=Se().fromCallback,Pp=be(),t9=require("path"),i9=ze(),Jm=F1().pathExists;function Km(e,a,p,t){typeof p=="function"&&(t=p,p="utf8");let i=t9.dirname(e);Jm(i,(d,n)=>{if(d)return t(d);if(n)return Pp.writeFile(e,a,p,t);i9.mkdirs(i,l=>{if(l)return t(l);Pp.writeFile(e,a,p,t)})})}r(Km,"outputFile");function Ym(e,...a){let p=t9.dirname(e);if(Pp.existsSync(p))return Pp.writeFileSync(e,...a);i9.mkdirsSync(p),Pp.writeFileSync(e,...a)}r(Ym,"outputFileSync");d9.exports={outputFile:Gm(Km),outputFileSync:Ym}});var n9=v((lv,r9)=>{"use strict";var{stringify:Xm}=Ht(),{outputFile:Qm}=Jt();async function eu(e,a,p={}){let t=Xm(a,p);await Qm(e,t,p)}r(eu,"outputJson");r9.exports=eu});var s9=v((ov,l9)=>{"use strict";var{stringify:au}=Ht(),{outputFileSync:pu}=Jt();function tu(e,a,p){let t=au(a,p);pu(e,t,p)}r(tu,"outputJsonSync");l9.exports=tu});var m9=v((uv,o9)=>{"use strict";var iu=Se().fromPromise,ge=p9();ge.outputJson=iu(n9());ge.outputJsonSync=s9();ge.outputJSON=ge.outputJson;ge.outputJSONSync=ge.outputJsonSync;ge.writeJSON=ge.writeJson;ge.writeJSONSync=ge.writeJsonSync;ge.readJSON=ge.readJson;ge.readJSONSync=ge.readJsonSync;o9.exports=ge});var v9=v((fv,c9)=>{"use strict";var du=be(),_d=require("path"),ru=Wt().copy,h9=Ip().remove,nu=ze().mkdirp,lu=F1().pathExists,u9=ea();function su(e,a,p,t){typeof p=="function"&&(t=p,p={}),p=p||{};let i=p.overwrite||p.clobber||!1;u9.checkPaths(e,a,"move",p,(d,n)=>{if(d)return t(d);let{srcStat:l,isChangingCase:s=!1}=n;u9.checkParentPaths(e,l,a,"move",m=>{if(m)return t(m);if(ou(a))return f9(e,a,i,s,t);nu(_d.dirname(a),o=>o?t(o):f9(e,a,i,s,t))})})}r(su,"move");function ou(e){let a=_d.dirname(e);return _d.parse(a).root===a}r(ou,"isParentRoot");function f9(e,a,p,t,i){if(t)return wd(e,a,p,i);if(p)return h9(a,d=>d?i(d):wd(e,a,p,i));lu(a,(d,n)=>d?i(d):n?i(new Error("dest already exists.")):wd(e,a,p,i))}r(f9,"doRename");function wd(e,a,p,t){du.rename(e,a,i=>i?i.code!=="EXDEV"?t(i):mu(e,a,p,t):t())}r(wd,"rename");function mu(e,a,p,t){ru(e,a,{overwrite:p,errorOnExist:!0},d=>d?t(d):h9(e,t))}r(mu,"moveAcrossDevice");c9.exports=su});var S9=v((cv,y9)=>{"use strict";var _9=be(),yd=require("path"),uu=Wt().copySync,g9=Ip().removeSync,fu=ze().mkdirpSync,w9=ea();function hu(e,a,p){p=p||{};let t=p.overwrite||p.clobber||!1,{srcStat:i,isChangingCase:d=!1}=w9.checkPathsSync(e,a,"move",p);return w9.checkParentPathsSync(e,i,a,"move"),cu(a)||fu(yd.dirname(a)),vu(e,a,t,d)}r(hu,"moveSync");function cu(e){let a=yd.dirname(e);return yd.parse(a).root===a}r(cu,"isParentRoot");function vu(e,a,p,t){if(t)return gd(e,a,p);if(p)return g9(a),gd(e,a,p);if(_9.existsSync(a))throw new Error("dest already exists.");return gd(e,a,p)}r(vu,"doRename");function gd(e,a,p){try{_9.renameSync(e,a)}catch(t){if(t.code!=="EXDEV")throw t;return wu(e,a,p)}}r(gd,"rename");function wu(e,a,p){return uu(e,a,{overwrite:p,errorOnExist:!0}),g9(e)}r(wu,"moveAcrossDevice");y9.exports=hu});var x9=v((wv,b9)=>{"use strict";var _u=Se().fromCallback;b9.exports={move:_u(v9()),moveSync:S9()}});var N9=v((_v,T9)=>{"use strict";T9.exports={...Q1(),...Wt(),...g3(),...J3(),...m9(),...ze(),...x9(),...Jt(),...F1(),...Ip()}});var gu={};L9(gu,{TestRunMonitor:()=>qp});module.exports=q9(gu);var F9=I1(require("net")),Ua=require("fs"),Sd=I1(nr());var na=r(e=>new Promise(a=>setTimeout(a,e)),"awaitSleep"),lr=r(async(e,a=1e3,p="action hang guard timed out")=>{let t="guard-timed-out",i=r(async()=>(await na(a+1e3),t),"guard"),d=await Promise.race([e,i()]);if(typeof d=="string"&&d===t)throw new Error(p);return d},"guardReturn");var Xt=require("path");var Tn=require("fs"),Nn=require("jsdom"),Dn=require("fs/promises"),En=I1(Lt());var kp=class{constructor(a,p,t,i="https://api.checksum.ai/api/test-runs"){this.reportHTMLFilePath=a;this.testRunUUID=p;this.pwTestIdToChecksumTestId=t;this.assetsBaseURL=i;this.supportVideo=!1}async process(){await this.initializeDOM(),this.makeLightModeOnly(),await this.editZipFile(),await this.writeFile()}async initializeDOM(){return this.dom=await Nn.JSDOM.fromFile(this.reportHTMLFilePath,{resources:"usable",runScripts:"dangerously"}),new Promise(a=>this.dom.window.addEventListener("load",a))}async writeFile(){let a=this.dom.serialize();a=a.replace(/window.playwrightReportBase64 = ".*";/,`window.playwrightReportBase64 = "${this.newBase64Zip}";`),await(0,Dn.cp)(this.reportHTMLFilePath,this.reportHTMLFilePath.replace(".html",".backup.html")),(0,Tn.writeFileSync)(this.reportHTMLFilePath,a)}makeLightModeOnly(){this.dom.window.document.querySelector('meta[name="color-scheme"]').setAttribute("content","light");let p=this.dom.window.document.querySelector("head style"),t=p.innerHTML,i=/@media\s*\(prefers-color-scheme:\s*dark\)\s*{[^}]*}/g,d=t.replace(i,"");p.innerHTML=d}async editZipFile(){let a=this.dom.window.playwrightReportBase64.replace("data:application/zip;base64,",""),p=await(0,En.loadAsync)(a,{base64:!0});for(let i of Object.keys(p.files)){let d=p.file(i);if(d){let n=await d.async("string"),l=JSON.parse(n);i.startsWith("report")?this.handleReportJSON(l):this.handleFileReportJSON(l),p.file(i,JSON.stringify(l))}}let t=await p.generateAsync({type:"base64"});this.newBase64Zip=`data:application/zip;base64,${t}`}getCloudPath(a){return`${this.assetsBaseURL}/${this.testRunUUID}/${this.pwTestIdToChecksumTestId[a]}`}handleReportJSON(a){a.files.forEach(p=>p.tests.forEach(t=>{t.results.forEach(i=>{this.processAttachments(i.attachments,t.testId)})}))}handleFileReportJSON(a){var p;(p=a.tests)==null||p.forEach(t=>{var i;(i=t.results)==null||i.forEach(d=>{this.processAttachments(d.attachments,t.testId)})})}processAttachments(a,p){if(a.forEach(t=>this.updateAttachment(t,p)),!this.supportVideo){let t=a.findIndex(i=>i.name==="video");t!==-1&&a.splice(t,1)}}updateAttachment(a,p){["trace","video"].includes(a.name)&&(a.path=`${this.getCloudPath(p)}/${a.name}`)}};r(kp,"PlaywrightReportProcessor");var O9=require("http");var ue=require("fs"),pd=I1(Lt()),td=require("readline/promises");var Ap=class{constructor(a,p,t,i){this.mode=a;this.inputZipFilePath=p;this.outputZipFilePath=t;this.frontendLogPrefix=i;this.originalTraceFileNames=[];this.remainingTraceFileNames=[];this.wallTimesToBeRemoved={};this.callIdsRemovals={};this.consoleLogGUIDs=[];this.numberOfLinesPerFile={};this.generationAllowedAPIName=["page.goto","page.waitForNavigation","locator.fill","locator.click","locator.hover","locator.check","locator.uncheck"]}async process(){await this.unzipAndWriteTraceFiles();for(let a of this.originalTraceFileNames)await this.preprocessFile(a);for(this.remainingTraceFileNames=[...this.originalTraceFileNames];this.remainingTraceFileNames.length>0;)for(let a of this.remainingTraceFileNames)await this.processFile(a);await this.reZip()}getBackupZipFilePath(){return this.inputZipFilePath.replace(".zip",".trace-files-backup.zip")}async unzipAndWriteTraceFiles(){let a=(0,ue.readFileSync)(this.inputZipFilePath);this.zipped=await(0,pd.loadAsync)(a),this.originalTraceFileNames=Object.keys(this.zipped.files).filter(i=>i.endsWith(".trace"));let p=await(0,pd.loadAsync)("UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==",{base64:!0});for(let i of this.originalTraceFileNames){let d=await this.zipped.file(i).async("string");(0,ue.writeFileSync)(i,d),p.file(i,d)}let t=await p.generateAsync({type:"nodebuffer"});(0,ue.writeFileSync)(this.getBackupZipFilePath(),t)}async reZip(){for(let p of this.originalTraceFileNames){let t=(0,ue.readFileSync)(p);this.zipped.remove(p),this.zipped.file(p,t)}let a=await this.zipped.generateAsync({type:"nodebuffer"});(0,ue.existsSync)(this.outputZipFilePath)&&(0,ue.rmSync)(this.outputZipFilePath),(0,ue.writeFileSync)(this.outputZipFilePath,a);for(let p of this.originalTraceFileNames)(0,ue.rmSync)(p)}async preprocessFile(a){this.callIdsRemovals[a]={callIdsToBeRemoved:{},arrayOfCallIdsToBeRemoved:new Set};let p=(0,ue.createReadStream)(a),t=(0,td.createInterface)({input:p,crlfDelay:1/0}),i=0;for await(let d of t){i++;let n=JSON.parse(d);this.shouldLineBeRemoved(n)&&(n.wallTime&&(this.wallTimesToBeRemoved[n.wallTime]=!0),n.callId&&(this.callIdsRemovals[a].callIdsToBeRemoved[n.callId]=!0,this.callIdsRemovals[a].arrayOfCallIdsToBeRemoved.add(n.callId)))}this.numberOfLinesPerFile[a]=i}async processFile(a){var n,l;let p=[],t=(0,ue.createReadStream)(a),i=(0,td.createInterface)({input:t,crlfDelay:1/0}),d=a;for await(let s of i){let m=JSON.parse(s),o=!1;if(this.frontendLogPrefix){if(this.isChecksumConsoleLog(m)){this.consoleLogGUIDs.push(m.guid);continue}if(this.isConsoleLogMetadata(m)&&this.consoleLogGUIDs.includes((l=(n=m.params)==null?void 0:n.message)==null?void 0:l.guid))continue}if(this.lineCanBeRemoved(m)&&(this.wallTimesToBeRemoved[m.wallTime]||this.callIdsRemovals[d].callIdsToBeRemoved[m.callId]||Array.from(this.callIdsRemovals[d].arrayOfCallIdsToBeRemoved).some(c=>s.includes(`"${c}"`)))&&(o=!0),o){m.callId&&(this.callIdsRemovals[d].callIdsToBeRemoved[m.callId]=!0,this.callIdsRemovals[d].arrayOfCallIdsToBeRemoved.add(m.callId));continue}p.push(s)}if(p.length===this.numberOfLinesPerFile[d]){let s=this.remainingTraceFileNames.indexOf(d);s>-1&&this.remainingTraceFileNames.splice(s,1)}else this.numberOfLinesPerFile[d]=p.length,(0,ue.writeFileSync)(a,p.join(`
9
+ `))}isChecksumConsoleLog(a){var p,t;return a.class==="ConsoleMessage"&&((t=(p=a.initializer)==null?void 0:p.text)==null?void 0:t.startsWith(this.frontendLogPrefix))}isConsoleLogMetadata(a){return a.class==="BrowserContext"&&a.method==="console"}lineCanBeRemoved(a){return!["frame-snapshot"].includes(a.type)}shouldLineBeRemoved(a){switch(this.mode){case"runtime":return this.shouldLineBeRemoved_runtime(a);case"generation":return this.shouldLineBeRemoved_generation(a)}return!1}shouldLineBeRemoved_runtime(a){var p;return(p=a.stack)==null?void 0:p.find(t=>!t.file.endsWith("spec.ts")&&!["executePlaywrightMethodWithTimeout"].includes(t.function))}shouldLineBeRemoved_generation(a){return!!a.apiName&&!this.generationAllowedAPIName.includes(a.apiName)}};r(Ap,"PlaywrightTraceProcessor");var D9=I1(Lt()),Kt=I1(N9()),Yt=I1(require("path")),E9=require("fs");async function k9(e,a){let p=await Kt.default.readdir(a);await Promise.all(p.map(async t=>{let i=Yt.default.join(a,t);if((await Kt.default.stat(i)).isDirectory()){let n=e.folder(t);await k9(n,i)}else{let n=await Kt.default.readFile(i);e.file(t,n)}}))}r(k9,"addFolderToZip");async function A9(e){let a=new D9.default;try{await k9(a,e);let p=await a.generateAsync({type:"nodebuffer"}),t=`${(0,Yt.basename)(e)}.zip`;return(0,E9.writeFileSync)(t,p),t}catch(p){return console.error("Error creating zip:",p),null}}r(A9,"zipFolder");var qp=class{constructor(a,p=!1){this.config=a;this.isolatedMode=p;this.MAX_UPLOADS=5;this.MONITOR_INTERVAL=5e3;this.UPLOAD_TIMEOUT=6e5;this.assets=[];this.stats={passed:0,failed:0,healed:0};this.reportComplete=!1;this.pwTestIdToChecksumTestId={};setInterval(this.monitorUploads.bind(this),this.MONITOR_INTERVAL),this.listenForMessages(),this.startServer()}listenForMessages(){process.stdin.on("data",async a=>{let p=a.toString().trim();if(!p.startsWith("cli:"))return;let[t,i]=p.substring(4).split("=");switch(t){case"report":await this.handleReport(i),this.monitorUploadsCompletion();break;case"shutdown":this.shutdown();break}})}sendMessage(a){console.log(`${"monitor"}:${a}`)}async handleReport(a){if(!this.isolatedMode)return this.reportAsset=this.initAsset({type:"report",path:a}),await new kp(a,this.config.sessionId,this.pwTestIdToChecksumTestId).process(),this.uploadAsset(this.reportAsset)}shutdown(){console.log("Received shutdown message from CLI"),this.server.close(),process.exit(0)}async monitorUploadsCompletion(){if(this.isolatedMode||!this.reportComplete&&this.reportAsset&&this.reportAsset.complete){this.reportComplete=!0;let a="{}";try{a=JSON.stringify(this.stats)}catch(p){console.log("Error stringifying stats",p)}this.sendMessage(`report-uploaded=${a}`)}if(this.reportComplete&&this.assets.filter(a=>a.complete||a.error).length===this.assets.length){await na(100),this.sendMessage("complete");return}await na(1e3),this.monitorUploadsCompletion()}async startServer(){let a=await this.acquirePortNumber();this.sendMessage(`port=${a}`),this.server=(0,O9.createServer)((p,t)=>{let i=r(n=>{t.writeHead(400,{"Content-Type":"text/plain"}),t.end(n)},"returnErrorWithMessage");if(p.method!=="POST"){t.writeHead(404,{"Content-Type":"text/plain"}),t.end("Method not allowed");return}let d="";p.on("data",n=>{d+=n.toString()}),p.on("end",()=>{let n;try{n=JSON.parse(d)}catch{return i("Invalid body")}let{type:l,payload:s,watch:m}=n;switch(l){case"asset":if(!s.path||!s.type)return i("Missing arguments");m?this.watchAsset(s):this.processAsset(s);break;case"testInfo":if(!s.pwTestId||!s.checksumTestId)return i("Missing arguments");this.pwTestIdToChecksumTestId[s.pwTestId]=s.checksumTestId;break;case"testStats":this.stats[s.passed?"passed":"failed"]++,s.healed&&this.stats.healed++;break;default:return i("Invalid message type")}t.writeHead(200,{"Content-Type":"text/plain"}),t.end("OK")})}),this.server.listen(a)}monitorUploads(){let a=r(()=>this.assets.filter(t=>t.response&&!t.complete&&!t.error),"getActiveUploads"),p=this.assets.filter(t=>!t.response);if(p.length!==0&&!(a().length>=this.MAX_UPLOADS))for(;p.length>0&&a().length<this.MAX_UPLOADS;){let t=p.pop();this.uploadAsset(t)}}async uploadAsset(a){if(this.isolatedMode){a.response=new Promise((l,s)=>{setTimeout(()=>{a.complete=!0,l(new Response)},Math.random()*100)});return}let{path:p}=a.info;if(console.log("uploading asset",p),await this.getSignedURLForUpload(a),!a.uploadURL){console.log("Error getting signed URL for asset",p),a.error=!0;return}let i=(0,Ua.statSync)(p).size,d=(0,Ua.createReadStream)(p),n=lr((0,Sd.default)(a.uploadURL,{method:"PUT",headers:{"Content-length":i.toString()},body:d}),this.UPLOAD_TIMEOUT);n.then(l=>{if(!l.ok)throw l.json().then(s=>{console.log(s)}),new Error("Upload failed");console.log("Asset uploaded successfully",p),a.complete=!0}).catch(l=>{console.log("Error uploading asset",p,l),a.error=!0}),a.response=n}async getSignedURLForUpload(a){try{let{apiKey:p,sessionId:t,checksumApiURL:i}=this.config,d=a.info,n=await(0,Sd.default)(`${i}/client-api/test-runs/${t}/get-upload-url`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",ChecksumAppCode:p},body:JSON.stringify(d)}),{url:l}=await n.json();a.uploadURL=l}catch(p){return console.error("Error getting signed URL for artifact",p),null}}watchAsset(a){let p=(0,Xt.dirname)(a.path),t=(0,Xt.basename)(a.path),i=(0,Ua.watch)(p,(d,n)=>{n===t&&(this.processAsset(a),i.close())})}processAsset(a){if(!this.isolatedMode)switch(a.type){case"trace":return this.processTrace(a.path,a.testId);case"har":return this.processHar(a.path,a.testId);case"esra":case"test-files":return this.addAsset(a)}}async processHar(a,p){await na(1e3);let t=await A9(a);if(console.log("processed har, sending for upload"),t)return this.addAsset({type:"har",path:t,testId:p})}async processTrace(a,p){await na(1e3);let t=a.replace(".zip",".processed.zip");await new Ap("runtime",a,t,"$checksum").process(),console.log("processed trace files, sending for upload"),this.addAsset({type:"trace",path:t,testId:p}),this.addAsset({type:"trace-backup-file",path:a,testId:p})}addAsset(a){if(this.isolatedMode)return;console.log("adding asset",a.path);let p=this.initAsset(a);return this.assets.push(p),p}initAsset(a){return{complete:!1,error:!1,response:void 0,info:a}}async acquirePortNumber(){return await new Promise((a,p)=>{let t=F9.createServer();t.unref(),t.on("error",p),t.listen(0,()=>{let i=t.address().port;t.close(()=>{a(i)})})})}};r(qp,"TestRunMonitor");var Lp;try{if(Lp=JSON.parse(process.argv[2]),!Lp.sessionId||!Lp.apiKey||!Lp.checksumApiURL)throw new Error("Invalid config")}catch(e){console.log("Error starting test run monitor",e),process.exit(1)}var C9;new qp(Lp,((C9=process.argv)==null?void 0:C9[3])==="isolated");0&&(module.exports={TestRunMonitor});