@testream/playwright-reporter 0.5.2 → 0.5.3

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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- (()=>{"use strict";var t={649:function(t,e,r){var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});const o=i(r(928));const n=i(r(896));const s=i(r(982));class GenerateCtrfReport{constructor(t){var e,r,i,o,n,a,l,u,c,d,p,f,h,m,g,_,b,y,v;this.reporterName="playwright-ctrf-json-reporter";this.defaultOutputFile="ctrf-report.json";this.defaultOutputDir="ctrf";this.reporterConfigOptions={outputFile:(e=t===null||t===void 0?void 0:t.outputFile)!==null&&e!==void 0?e:this.defaultOutputFile,outputDir:(r=t===null||t===void 0?void 0:t.outputDir)!==null&&r!==void 0?r:this.defaultOutputDir,minimal:(i=t===null||t===void 0?void 0:t.minimal)!==null&&i!==void 0?i:false,screenshot:(o=t===null||t===void 0?void 0:t.screenshot)!==null&&o!==void 0?o:false,annotations:(n=t===null||t===void 0?void 0:t.annotations)!==null&&n!==void 0?n:false,testType:(a=t===null||t===void 0?void 0:t.testType)!==null&&a!==void 0?a:"e2e",appName:(l=t===null||t===void 0?void 0:t.appName)!==null&&l!==void 0?l:undefined,appVersion:(u=t===null||t===void 0?void 0:t.appVersion)!==null&&u!==void 0?u:undefined,osPlatform:(c=t===null||t===void 0?void 0:t.osPlatform)!==null&&c!==void 0?c:undefined,osRelease:(d=t===null||t===void 0?void 0:t.osRelease)!==null&&d!==void 0?d:undefined,osVersion:(p=t===null||t===void 0?void 0:t.osVersion)!==null&&p!==void 0?p:undefined,buildName:(f=t===null||t===void 0?void 0:t.buildName)!==null&&f!==void 0?f:undefined,buildNumber:(h=t===null||t===void 0?void 0:t.buildNumber)!==null&&h!==void 0?h:undefined,buildUrl:(m=t===null||t===void 0?void 0:t.buildUrl)!==null&&m!==void 0?m:undefined,repositoryName:(g=t===null||t===void 0?void 0:t.repositoryName)!==null&&g!==void 0?g:undefined,repositoryUrl:(_=t===null||t===void 0?void 0:t.repositoryUrl)!==null&&_!==void 0?_:undefined,branchName:(b=t===null||t===void 0?void 0:t.branchName)!==null&&b!==void 0?b:undefined,commit:(y=t===null||t===void 0?void 0:t.commit)!==null&&y!==void 0?y:undefined,testEnvironment:(v=t===null||t===void 0?void 0:t.testEnvironment)!==null&&v!==void 0?v:undefined};this.ctrfReport={reportFormat:"CTRF",specVersion:"0.0.0",reportId:s.default.randomUUID(),timestamp:(new Date).toISOString(),generatedBy:"playwright-ctrf-json-reporter",results:{tool:{name:"playwright"},summary:{tests:0,passed:0,failed:0,pending:0,skipped:0,other:0,start:0,stop:0},tests:[]}};this.ctrfEnvironment={}}onBegin(t,e){var r,i,o;this.suite=e;this.startTime=Date.now();this.ctrfReport.results.summary.start=this.startTime;if(!n.default.existsSync((r=this.reporterConfigOptions.outputDir)!==null&&r!==void 0?r:this.defaultOutputDir)){n.default.mkdirSync((i=this.reporterConfigOptions.outputDir)!==null&&i!==void 0?i:this.defaultOutputDir,{recursive:true})}this.setEnvironmentDetails(this.reporterConfigOptions);if(this.hasEnvironmentDetails(this.ctrfEnvironment)){this.ctrfReport.results.environment=this.ctrfEnvironment}this.setFilename((o=this.reporterConfigOptions.outputFile)!==null&&o!==void 0?o:this.defaultOutputFile)}onEnd(){this.ctrfReport.results.summary.stop=Date.now();if(this.suite!==undefined){if(this.suite.allTests().length>0){this.processSuite(this.suite);this.ctrfReport.results.summary.suites=this.countSuites(this.suite)}}this.writeReportToFile(this.ctrfReport)}printsToStdio(){return false}processSuite(t){for(const e of t.tests){this.processTest(e)}for(const e of t.suites){this.processSuite(e)}}processTest(t){if(t.results.length===0){return}const e=t.results[t.results.length-1];if(e!==undefined){this.updateCtrfTestResultsFromTestResult(t,e,this.ctrfReport);this.updateSummaryFromTestResult(e,this.ctrfReport)}}setFilename(t){if(t.endsWith(".json")){this.reporterConfigOptions.outputFile=t}else{this.reporterConfigOptions.outputFile=`${t}.json`}}updateCtrfTestResultsFromTestResult(t,e,r){var i,o,n,s,a,l;const u={name:t.title,status:e.status===t.expectedStatus&&e.status!=="skipped"?"passed":this.mapPlaywrightStatusToCtrf(e.status),duration:e.duration};if(this.reporterConfigOptions.minimal===false){u.start=this.updateStart(e.startTime);u.stop=this.calculateStopTime(e.startTime,e.duration);u.message=this.extractFailureDetails(e).message;u.trace=this.extractFailureDetails(e).trace;u.snippet=this.extractFailureDetails(e).snippet;u.rawStatus=e.status;u.tags=(i=t.tags)!==null&&i!==void 0?i:[];u.type=(o=this.reporterConfigOptions.testType)!==null&&o!==void 0?o:"e2e";u.filePath=t.location.file;u.retries=e.retry;u.flaky=e.status==="passed"&&e.retry>0;u.steps=[];if(e.steps.length>0){e.steps.forEach((t=>{this.processStep(u,t)}))}if(this.reporterConfigOptions.screenshot===true){u.screenshot=this.extractScreenshotBase64(e)}u.suite=this.buildSuitePath(t);if(((n=this.extractMetadata(e))===null||n===void 0?void 0:n.name)!==undefined||((s=this.extractMetadata(e))===null||s===void 0?void 0:s.version)!==undefined)u.browser=`${(a=this.extractMetadata(e))===null||a===void 0?void 0:a.name} ${(l=this.extractMetadata(e))===null||l===void 0?void 0:l.version}`;u.attachments=this.filterValidAttachments(e.attachments);u.stdout=e.stdout.map((t=>Buffer.isBuffer(t)?t.toString():String(t)));u.stderr=e.stderr.map((t=>Buffer.isBuffer(t)?t.toString():String(t)));if(this.reporterConfigOptions.annotations!==undefined){u.extra={annotations:t.annotations}}if(t.results.length>1){const e=t.results.slice(0,-1);u.retryAttempts=[];for(const t of e){const e={status:this.mapPlaywrightStatusToCtrf(t.status),duration:t.duration,message:this.extractFailureDetails(t).message,trace:this.extractFailureDetails(t).trace,snippet:this.extractFailureDetails(t).snippet};u.retryAttempts.push(e)}}}r.results.tests.push(u)}updateSummaryFromTestResult(t,e){e.results.summary.tests++;const r=this.mapPlaywrightStatusToCtrf(t.status);if(r in e.results.summary){e.results.summary[r]++}else{e.results.summary.other++}}mapPlaywrightStatusToCtrf(t){switch(t){case"passed":return"passed";case"failed":case"timedOut":case"interrupted":return"failed";case"skipped":return"skipped";case"pending":return"pending";default:return"other"}}setEnvironmentDetails(t){if(t.appName!==undefined){this.ctrfEnvironment.appName=t.appName}if(t.appVersion!==undefined){this.ctrfEnvironment.appVersion=t.appVersion}if(t.osPlatform!==undefined){this.ctrfEnvironment.osPlatform=t.osPlatform}if(t.osRelease!==undefined){this.ctrfEnvironment.osRelease=t.osRelease}if(t.osVersion!==undefined){this.ctrfEnvironment.osVersion=t.osVersion}if(t.buildName!==undefined){this.ctrfEnvironment.buildName=t.buildName}if(t.buildNumber!==undefined){this.ctrfEnvironment.buildNumber=t.buildNumber}if(t.buildUrl!==undefined){this.ctrfEnvironment.buildUrl=t.buildUrl}if(t.repositoryName!==undefined){this.ctrfEnvironment.repositoryName=t.repositoryName}if(t.repositoryUrl!==undefined){this.ctrfEnvironment.repositoryUrl=t.repositoryUrl}if(t.branchName!==undefined){this.ctrfEnvironment.branchName=t.branchName}if(t.commit!==undefined){this.ctrfEnvironment.commit=t.commit}if(t.testEnvironment!==undefined){this.ctrfEnvironment.testEnvironment=t.testEnvironment}}hasEnvironmentDetails(t){return Object.keys(t).length>0}extractMetadata(t){const e=t.attachments.find((t=>t.name==="metadata.json"));if((e===null||e===void 0?void 0:e.body)!==null&&(e===null||e===void 0?void 0:e.body)!==undefined){try{const t=e.body.toString("utf-8");return JSON.parse(t)}catch(t){if(t instanceof Error){console.error(`Error parsing browser metadata: ${t.message}`)}else{console.error("An unknown error occurred in parsing browser metadata")}}}return null}updateStart(t){const e=new Date(t);const r=Math.floor(e.getTime()/1e3);return r}calculateStopTime(t,e){const r=new Date(t);const i=new Date(r.getTime()+e);return Math.floor(i.getTime()/1e3)}buildSuitePath(t){const e=[];let r=t.parent;while(r!==undefined){if(r.title!==""){e.unshift(r.title)}r=r.parent}return e.join(" > ")}extractScreenshotBase64(t){var e;const r=t.attachments.find((t=>t.name==="screenshot"&&(t.contentType==="image/jpeg"||t.contentType==="image/png")));return(e=r===null||r===void 0?void 0:r.body)===null||e===void 0?void 0:e.toString("base64")}extractFailureDetails(t){if((t.status==="failed"||t.status==="timedOut"||t.status==="interrupted")&&t.error!==undefined){const e={};if(t.error.message!==undefined){e.message=t.error.message}if(t.error.stack!==undefined){e.trace=t.error.stack}if(t.error.snippet!==undefined){e.snippet=t.error.snippet}return e}return{}}countSuites(t){let e=0;t.suites.forEach((t=>{e+=this.countSuites(t)}));return e}writeReportToFile(t){var e,r;const i=o.default.join((e=this.reporterConfigOptions.outputDir)!==null&&e!==void 0?e:this.defaultOutputDir,(r=this.reporterConfigOptions.outputFile)!==null&&r!==void 0?r:this.defaultOutputFile);const s=JSON.stringify(t,null,2);try{n.default.writeFileSync(i,s+"\n");console.log(`${this.reporterName}: successfully written ctrf json to %s/%s`,this.reporterConfigOptions.outputDir,this.reporterConfigOptions.outputFile)}catch(t){console.error(`Error writing ctrf json report:, ${String(t)}`)}}processStep(t,e){var r;if(e.category==="test.step"){const i=e.error===undefined?this.mapPlaywrightStatusToCtrf("passed"):this.mapPlaywrightStatusToCtrf("failed");const o={name:e.title,status:i};(r=t.steps)===null||r===void 0?void 0:r.push(o)}const i=e.steps;if(i.length>0){i.forEach((e=>{this.processStep(t,e)}))}}filterValidAttachments(t){return t.filter((t=>t.path!==undefined)).map((t=>{var e;return{name:t.name,contentType:t.contentType,path:(e=t.path)!==null&&e!==void 0?e:""}}))}}e["default"]=GenerateCtrfReport},197:function(t,e,r){var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});e["default"]=void 0;var o=r(649);Object.defineProperty(e,"default",{enumerable:true,get:function(){return i(o).default}})},406:(t,e)=>{Object.defineProperty(e,"__esModule",{value:true});e.detectCIContext=detectCIContext;function detectCIContext(){const t=process.env;if(t.GITHUB_ACTIONS==="true"){return{branch:t.GITHUB_HEAD_REF||t.GITHUB_REF_NAME||t.GITHUB_REF?.replace("refs/heads/",""),commitSha:t.GITHUB_SHA,repositoryUrl:t.GITHUB_SERVER_URL&&t.GITHUB_REPOSITORY?`${t.GITHUB_SERVER_URL}/${t.GITHUB_REPOSITORY}`:undefined,buildNumber:t.GITHUB_RUN_NUMBER,buildUrl:t.GITHUB_SERVER_URL&&t.GITHUB_REPOSITORY&&t.GITHUB_RUN_ID?`${t.GITHUB_SERVER_URL}/${t.GITHUB_REPOSITORY}/actions/runs/${t.GITHUB_RUN_ID}`:undefined}}if(t.GITLAB_CI==="true"){return{branch:t.CI_COMMIT_BRANCH||t.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,commitSha:t.CI_COMMIT_SHA,repositoryUrl:t.CI_PROJECT_URL,buildNumber:t.CI_PIPELINE_IID,buildUrl:t.CI_PIPELINE_URL}}if(t.TF_BUILD==="True"){return{branch:t.BUILD_SOURCEBRANCH?.replace("refs/heads/",""),commitSha:t.BUILD_SOURCEVERSION,repositoryUrl:t.BUILD_REPOSITORY_URI,buildNumber:t.BUILD_BUILDNUMBER,buildUrl:t.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI&&t.SYSTEM_TEAMPROJECT&&t.BUILD_BUILDID?`${t.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}${t.SYSTEM_TEAMPROJECT}/_build/results?buildId=${t.BUILD_BUILDID}`:undefined}}if(t.CIRCLECI==="true"){return{branch:t.CIRCLE_BRANCH,commitSha:t.CIRCLE_SHA1,repositoryUrl:t.CIRCLE_REPOSITORY_URL,buildNumber:t.CIRCLE_BUILD_NUM,buildUrl:t.CIRCLE_BUILD_URL}}if(t.JENKINS_URL){return{branch:t.GIT_BRANCH?.replace("origin/",""),commitSha:t.GIT_COMMIT,repositoryUrl:t.GIT_URL,buildNumber:t.BUILD_NUMBER,buildUrl:t.BUILD_URL}}if(t.BITBUCKET_BUILD_NUMBER){return{branch:t.BITBUCKET_BRANCH,commitSha:t.BITBUCKET_COMMIT,repositoryUrl:t.BITBUCKET_GIT_HTTP_ORIGIN,buildNumber:t.BITBUCKET_BUILD_NUMBER,buildUrl:t.BITBUCKET_REPO_FULL_NAME&&t.BITBUCKET_BUILD_NUMBER?`https://bitbucket.org/${t.BITBUCKET_REPO_FULL_NAME}/pipelines/results/${t.BITBUCKET_BUILD_NUMBER}`:undefined}}return{}}},827:(t,e)=>{Object.defineProperty(e,"__esModule",{value:true})},322:function(t,e,r){var i=this&&this.__createBinding||(Object.create?function(t,e,r,i){if(i===undefined)i=r;var o=Object.getOwnPropertyDescriptor(e,r);if(!o||("get"in o?!e.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,i,o)}:function(t,e,r,i){if(i===undefined)i=r;t[i]=e[r]});var o=this&&this.__exportStar||function(t,e){for(var r in t)if(r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r))i(e,t,r)};Object.defineProperty(e,"__esModule",{value:true});e.uploadArtifacts=e.uploadTestRun=e.detectCIContext=void 0;o(r(827),e);var n=r(406);Object.defineProperty(e,"detectCIContext",{enumerable:true,get:function(){return n.detectCIContext}});var s=r(969);Object.defineProperty(e,"uploadTestRun",{enumerable:true,get:function(){return s.uploadTestRun}});Object.defineProperty(e,"uploadArtifacts",{enumerable:true,get:function(){return s.uploadArtifacts}})},969:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:true});e.uploadTestRun=uploadTestRun;e.uploadArtifacts=uploadArtifacts;const i="https://test-manager-backend.fly.dev";async function uploadTestRun(t){const{report:e,apiKey:r,apiUrl:o=i}=t;if(!e.reportId){e.reportId=crypto.randomUUID()}const n={report:e,reportId:e.reportId,commitSha:t.commitSha,branch:t.branch,repositoryUrl:t.repositoryUrl,buildName:t.buildName,buildNumber:t.buildNumber,buildUrl:t.buildUrl,testEnvironment:t.testEnvironment,appName:t.appName,appVersion:t.appVersion,testType:t.testType};console.log("Uploading test results...");let s;try{s=await fetch(`${o}/api/v1/ingest`,{method:"POST",headers:{"X-API-KEY":r,"Content-Type":"application/json"},body:JSON.stringify(n)})}catch(t){const r=t instanceof Error?t.message:String(t);return{success:false,reportId:e.reportId,error:`Connection failed: ${r}`}}if(s.status===409){console.warn("Report already exists (workflow may have been re-run)");return{success:true,reportId:e.reportId,summary:{passed:e.results.summary.passed,failed:e.results.summary.failed,skipped:e.results.summary.skipped,total:e.results.summary.tests},alreadyExists:true}}if(!s.ok){const t=await s.text();return{success:false,reportId:e.reportId,error:`Upload failed (HTTP ${s.status}): ${t}`}}const a=await s.json();console.log(`✓ Test results uploaded successfully`);console.log(` Report ID: ${a.reportId}`);console.log(` Test Run ID: ${a.testRunId}`);console.log(` Tests: ${a.summary.passed}/${a.summary.total} passed`);return{success:true,reportId:a.reportId,testRunId:a.testRunId,summary:{passed:a.summary.passed,failed:a.summary.failed,skipped:a.summary.skipped,total:a.summary.total},testResults:a.testResults}}async function uploadArtifacts(t){const{reportId:e,apiKey:r,testResults:o,apiUrl:n=i}=t;let s=0;for(const t of o){for(const i of t.attachments){try{const o=await uploadSingleArtifact({testResultId:t.testResultId,attachment:i,reportId:e,apiKey:r,apiUrl:n});if(o)s++}catch(t){const e=t instanceof Error?t.message:String(t);console.error(`Failed to upload artifact ${i.name}: ${e}`)}}}if(s>0){console.log(`✓ Uploaded ${s} artifact(s)`)}return s}async function uploadSingleArtifact(t){const{testResultId:e,attachment:i,reportId:o,apiKey:n,apiUrl:s}=t;const a=await Promise.resolve().then(r.t.bind(r,943,23));const l=await Promise.resolve().then(r.t.bind(r,928,23));const u=l.resolve(i.path);try{await a.access(u)}catch{console.warn(`Artifact not found: ${l.basename(u)}`);return false}let c;try{c=await a.readFile(u)}catch(t){const e=t instanceof Error?t.message:String(t);throw new Error(`Failed to read file: ${e}`)}const d=new Blob([c],{type:i.contentType});const p=new FormData;p.append("testResultId",e);p.append("ctrfAttachmentName",i.name);p.append("file",d,l.basename(u));const f=`${s}/api/v1/artifacts/${o}`;const h=await fetch(f,{method:"POST",headers:{"X-API-KEY":n},body:p});if(!h.ok){const t=await h.text();throw new Error(`HTTP ${h.status}: ${t}`)}return true}},665:function(t,e,r){var i=this&&this.__createBinding||(Object.create?function(t,e,r,i){if(i===undefined)i=r;var o=Object.getOwnPropertyDescriptor(e,r);if(!o||("get"in o?!e.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,i,o)}:function(t,e,r,i){if(i===undefined)i=r;t[i]=e[r]});var o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:true,value:e})}:function(t,e){t["default"]=e});var n=this&&this.__importStar||function(){var ownKeys=function(t){ownKeys=Object.getOwnPropertyNames||function(t){var e=[];for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r))e[e.length]=r;return e};return ownKeys(t)};return function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r=ownKeys(t),n=0;n<r.length;n++)if(r[n]!=="default")i(e,t,r[n]);o(e,t);return e}}();var s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});e.PlaywrightCTRFReporterWithUpload=void 0;const a=n(r(943));const l=n(r(928));const u=r(322);const c=r(10);const d=s(r(197));class PlaywrightCTRFReporterWithUpload{constructor(t){this.uploader=null;if(!t.apiKey){throw new Error("PlaywrightCTRFReporter: apiKey is required")}this.config={uploadEnabled:true,outputFile:"ctrf-report.json",outputDir:"ctrf",failOnUploadError:false,screenshot:true,annotations:false,testType:"e2e",...t};const e=(0,u.detectCIContext)();if(!this.config.branch&&e.branch){this.config.branch=e.branch}if(!this.config.commitSha&&e.commitSha){this.config.commitSha=e.commitSha}if(!this.config.repositoryUrl&&e.repositoryUrl){this.config.repositoryUrl=e.repositoryUrl}this.reportPath=l.join(this.config.outputDir,this.config.outputFile);const r={outputFile:this.config.outputFile,outputDir:this.config.outputDir,screenshot:this.config.screenshot,annotations:this.config.annotations,testType:this.config.testType};if(this.config.appName)r.appName=this.config.appName;if(this.config.appVersion)r.appVersion=this.config.appVersion;if(this.config.buildName)r.buildName=this.config.buildName;if(this.config.buildNumber)r.buildNumber=this.config.buildNumber;if(this.config.buildUrl)r.buildUrl=this.config.buildUrl;if(this.config.testEnvironment)r.testEnvironment=this.config.testEnvironment;if(this.config.branch)r.branchName=this.config.branch;if(this.config.commitSha)r.commit=this.config.commitSha;this.ctrfReporter=new d.default(r);if(this.config.uploadEnabled){this.uploader=new c.ReportUploader(this.config)}}onBegin(t,e){if(this.ctrfReporter.onBegin){this.ctrfReporter.onBegin(t,e)}console.log("");console.log("=".repeat(60));console.log("Playwright Test Manager Reporter");console.log("=".repeat(60));if(this.config.uploadEnabled){if(this.config.branch)console.log(`Branch: ${this.config.branch}`);if(this.config.commitSha)console.log(`Commit: ${this.config.commitSha.substring(0,7)}`);if(this.config.repositoryUrl)console.log(`Repository: ${this.config.repositoryUrl}`)}else{console.log("Upload: Disabled")}console.log(`Report: ${this.reportPath}`);console.log("=".repeat(60));console.log("")}onTestBegin(t,e){if(this.ctrfReporter.onTestBegin){this.ctrfReporter.onTestBegin(t,e)}}onTestEnd(t,e){if(this.ctrfReporter.onTestEnd){this.ctrfReporter.onTestEnd(t,e)}}onError(t){if(this.ctrfReporter.onError){this.ctrfReporter.onError(t)}}onStepBegin(t,e,r){if(this.ctrfReporter.onStepBegin){this.ctrfReporter.onStepBegin(t,e,r)}}onStepEnd(t,e,r){if(this.ctrfReporter.onStepEnd){this.ctrfReporter.onStepEnd(t,e,r)}}async onEnd(t){if(this.ctrfReporter.onEnd){await this.ctrfReporter.onEnd(t)}if(!this.config.uploadEnabled||!this.uploader){console.log("");console.log("CTRF report generated");console.log(` ${this.reportPath}`);return}console.log("");console.log("=".repeat(60));console.log("Uploading Test Results");console.log("=".repeat(60));try{const t=await a.readFile(this.reportPath,"utf-8");const e=JSON.parse(t);e.results.tool.name="playwright";if(!e.extra){e.extra={}}if(this.config.branch&&!e.extra.branch){e.extra.branch=this.config.branch}if(this.config.commitSha&&!e.extra.commitSha){e.extra.commitSha=this.config.commitSha}const r=await this.uploader.uploadReport(e);if(r.success){console.log("=".repeat(60));console.log("Upload Complete");console.log("=".repeat(60));console.log("")}else{console.error("Upload completed with errors");console.error("")}}catch(t){const e=t instanceof Error?t.message:String(t);console.error("");console.error("=".repeat(60));console.error("Upload Failed");console.error("=".repeat(60));console.error(`Error: ${e}`);console.error("");if(this.config.failOnUploadError){throw t}}}}e.PlaywrightCTRFReporterWithUpload=PlaywrightCTRFReporterWithUpload;e["default"]=PlaywrightCTRFReporterWithUpload},10:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:true});e.ReportUploader=void 0;const i=r(322);class ReportUploader{constructor(t){this.apiUrl="https://test-manager-backend.fly.dev";this.config={apiKey:t.apiKey,branch:t.branch,commitSha:t.commitSha,repositoryUrl:t.repositoryUrl,failOnUploadError:t.failOnUploadError??false}}async uploadReport(t){try{const e=await(0,i.uploadTestRun)({report:t,apiKey:this.config.apiKey,commitSha:this.config.commitSha,branch:this.config.branch,repositoryUrl:this.config.repositoryUrl});if(!e.success){if(this.config.failOnUploadError){throw new Error(e.error||"Upload failed")}return e}let r=0;if(!e.alreadyExists&&e.testRunId&&e.testResults){const o=t.results.tests.filter((t=>t.attachments&&t.attachments.length>0)).map((t=>{const r=e.testResults?.find((e=>e.name===t.name));if(!r)return null;return{testResultId:r.id,attachments:t.attachments||[]}})).filter((t=>t!==null));if(o.length>0){r=await(0,i.uploadArtifacts)({reportId:e.reportId,apiKey:this.config.apiKey,testResults:o})}}return{...e,artifactCount:r}}catch(e){const r=e instanceof Error?e.message:String(e);if(this.config.failOnUploadError){throw new Error(`Failed to upload report: ${r}`)}return{success:false,reportId:t.reportId,error:r}}}}e.ReportUploader=ReportUploader},982:t=>{t.exports=require("crypto")},896:t=>{t.exports=require("fs")},943:t=>{t.exports=require("fs/promises")},928:t=>{t.exports=require("path")}};var e={};function __nccwpck_require__(r){var i=e[r];if(i!==undefined){return i.exports}var o=e[r]={exports:{}};var n=true;try{t[r].call(o.exports,o,o.exports,__nccwpck_require__);n=false}finally{if(n)delete e[r]}return o.exports}(()=>{var t=Object.getPrototypeOf?t=>Object.getPrototypeOf(t):t=>t.__proto__;var e;__nccwpck_require__.t=function(r,i){if(i&1)r=this(r);if(i&8)return r;if(typeof r==="object"&&r){if(i&4&&r.__esModule)return r;if(i&16&&typeof r.then==="function")return r}var o=Object.create(null);__nccwpck_require__.r(o);var n={};e=e||[null,t({}),t([]),t(t)];for(var s=i&2&&r;typeof s=="object"&&!~e.indexOf(s);s=t(s)){Object.getOwnPropertyNames(s).forEach((t=>n[t]=()=>r[t]))}n["default"]=()=>r;__nccwpck_require__.d(o,n);return o}})();(()=>{__nccwpck_require__.d=(t,e)=>{for(var r in e){if(__nccwpck_require__.o(e,r)&&!__nccwpck_require__.o(t,r)){Object.defineProperty(t,r,{enumerable:true,get:e[r]})}}}})();(()=>{__nccwpck_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e)})();(()=>{__nccwpck_require__.r=t=>{if(typeof Symbol!=="undefined"&&Symbol.toStringTag){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}Object.defineProperty(t,"__esModule",{value:true})}})();if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var r={};(()=>{var t=r;Object.defineProperty(t,"__esModule",{value:true});t.PlaywrightCTRFReporterWithUpload=t["default"]=void 0;var e=__nccwpck_require__(665);Object.defineProperty(t,"default",{enumerable:true,get:function(){return e.PlaywrightCTRFReporterWithUpload}});var i=__nccwpck_require__(665);Object.defineProperty(t,"PlaywrightCTRFReporterWithUpload",{enumerable:true,get:function(){return i.PlaywrightCTRFReporterWithUpload}})})();module.exports=r})();
1
+ (()=>{"use strict";var t={649:function(t,e,r){var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});const o=i(r(928));const n=i(r(896));const s=i(r(982));class GenerateCtrfReport{constructor(t){var e,r,i,o,n,a,l,u,c,d,p,f,h,m,g,_,b,y,v;this.reporterName="playwright-ctrf-json-reporter";this.defaultOutputFile="ctrf-report.json";this.defaultOutputDir="ctrf";this.reporterConfigOptions={outputFile:(e=t===null||t===void 0?void 0:t.outputFile)!==null&&e!==void 0?e:this.defaultOutputFile,outputDir:(r=t===null||t===void 0?void 0:t.outputDir)!==null&&r!==void 0?r:this.defaultOutputDir,minimal:(i=t===null||t===void 0?void 0:t.minimal)!==null&&i!==void 0?i:false,screenshot:(o=t===null||t===void 0?void 0:t.screenshot)!==null&&o!==void 0?o:false,annotations:(n=t===null||t===void 0?void 0:t.annotations)!==null&&n!==void 0?n:false,testType:(a=t===null||t===void 0?void 0:t.testType)!==null&&a!==void 0?a:"e2e",appName:(l=t===null||t===void 0?void 0:t.appName)!==null&&l!==void 0?l:undefined,appVersion:(u=t===null||t===void 0?void 0:t.appVersion)!==null&&u!==void 0?u:undefined,osPlatform:(c=t===null||t===void 0?void 0:t.osPlatform)!==null&&c!==void 0?c:undefined,osRelease:(d=t===null||t===void 0?void 0:t.osRelease)!==null&&d!==void 0?d:undefined,osVersion:(p=t===null||t===void 0?void 0:t.osVersion)!==null&&p!==void 0?p:undefined,buildName:(f=t===null||t===void 0?void 0:t.buildName)!==null&&f!==void 0?f:undefined,buildNumber:(h=t===null||t===void 0?void 0:t.buildNumber)!==null&&h!==void 0?h:undefined,buildUrl:(m=t===null||t===void 0?void 0:t.buildUrl)!==null&&m!==void 0?m:undefined,repositoryName:(g=t===null||t===void 0?void 0:t.repositoryName)!==null&&g!==void 0?g:undefined,repositoryUrl:(_=t===null||t===void 0?void 0:t.repositoryUrl)!==null&&_!==void 0?_:undefined,branchName:(b=t===null||t===void 0?void 0:t.branchName)!==null&&b!==void 0?b:undefined,commit:(y=t===null||t===void 0?void 0:t.commit)!==null&&y!==void 0?y:undefined,testEnvironment:(v=t===null||t===void 0?void 0:t.testEnvironment)!==null&&v!==void 0?v:undefined};this.ctrfReport={reportFormat:"CTRF",specVersion:"0.0.0",reportId:s.default.randomUUID(),timestamp:(new Date).toISOString(),generatedBy:"playwright-ctrf-json-reporter",results:{tool:{name:"playwright"},summary:{tests:0,passed:0,failed:0,pending:0,skipped:0,other:0,start:0,stop:0},tests:[]}};this.ctrfEnvironment={}}onBegin(t,e){var r,i,o;this.suite=e;this.startTime=Date.now();this.ctrfReport.results.summary.start=this.startTime;if(!n.default.existsSync((r=this.reporterConfigOptions.outputDir)!==null&&r!==void 0?r:this.defaultOutputDir)){n.default.mkdirSync((i=this.reporterConfigOptions.outputDir)!==null&&i!==void 0?i:this.defaultOutputDir,{recursive:true})}this.setEnvironmentDetails(this.reporterConfigOptions);if(this.hasEnvironmentDetails(this.ctrfEnvironment)){this.ctrfReport.results.environment=this.ctrfEnvironment}this.setFilename((o=this.reporterConfigOptions.outputFile)!==null&&o!==void 0?o:this.defaultOutputFile)}onEnd(){this.ctrfReport.results.summary.stop=Date.now();if(this.suite!==undefined){if(this.suite.allTests().length>0){this.processSuite(this.suite);this.ctrfReport.results.summary.suites=this.countSuites(this.suite)}}this.writeReportToFile(this.ctrfReport)}printsToStdio(){return false}processSuite(t){for(const e of t.tests){this.processTest(e)}for(const e of t.suites){this.processSuite(e)}}processTest(t){if(t.results.length===0){return}const e=t.results[t.results.length-1];if(e!==undefined){this.updateCtrfTestResultsFromTestResult(t,e,this.ctrfReport);this.updateSummaryFromTestResult(e,this.ctrfReport)}}setFilename(t){if(t.endsWith(".json")){this.reporterConfigOptions.outputFile=t}else{this.reporterConfigOptions.outputFile=`${t}.json`}}updateCtrfTestResultsFromTestResult(t,e,r){var i,o,n,s,a,l;const u={name:t.title,status:e.status===t.expectedStatus&&e.status!=="skipped"?"passed":this.mapPlaywrightStatusToCtrf(e.status),duration:e.duration};if(this.reporterConfigOptions.minimal===false){u.start=this.updateStart(e.startTime);u.stop=this.calculateStopTime(e.startTime,e.duration);u.message=this.extractFailureDetails(e).message;u.trace=this.extractFailureDetails(e).trace;u.snippet=this.extractFailureDetails(e).snippet;u.rawStatus=e.status;u.tags=(i=t.tags)!==null&&i!==void 0?i:[];u.type=(o=this.reporterConfigOptions.testType)!==null&&o!==void 0?o:"e2e";u.filePath=t.location.file;u.retries=e.retry;u.flaky=e.status==="passed"&&e.retry>0;u.steps=[];if(e.steps.length>0){e.steps.forEach((t=>{this.processStep(u,t)}))}if(this.reporterConfigOptions.screenshot===true){u.screenshot=this.extractScreenshotBase64(e)}u.suite=this.buildSuitePath(t);if(((n=this.extractMetadata(e))===null||n===void 0?void 0:n.name)!==undefined||((s=this.extractMetadata(e))===null||s===void 0?void 0:s.version)!==undefined)u.browser=`${(a=this.extractMetadata(e))===null||a===void 0?void 0:a.name} ${(l=this.extractMetadata(e))===null||l===void 0?void 0:l.version}`;u.attachments=this.filterValidAttachments(e.attachments);u.stdout=e.stdout.map((t=>Buffer.isBuffer(t)?t.toString():String(t)));u.stderr=e.stderr.map((t=>Buffer.isBuffer(t)?t.toString():String(t)));if(this.reporterConfigOptions.annotations!==undefined){u.extra={annotations:t.annotations}}if(t.results.length>1){const e=t.results.slice(0,-1);u.retryAttempts=[];for(const t of e){const e={status:this.mapPlaywrightStatusToCtrf(t.status),duration:t.duration,message:this.extractFailureDetails(t).message,trace:this.extractFailureDetails(t).trace,snippet:this.extractFailureDetails(t).snippet};u.retryAttempts.push(e)}}}r.results.tests.push(u)}updateSummaryFromTestResult(t,e){e.results.summary.tests++;const r=this.mapPlaywrightStatusToCtrf(t.status);if(r in e.results.summary){e.results.summary[r]++}else{e.results.summary.other++}}mapPlaywrightStatusToCtrf(t){switch(t){case"passed":return"passed";case"failed":case"timedOut":case"interrupted":return"failed";case"skipped":return"skipped";case"pending":return"pending";default:return"other"}}setEnvironmentDetails(t){if(t.appName!==undefined){this.ctrfEnvironment.appName=t.appName}if(t.appVersion!==undefined){this.ctrfEnvironment.appVersion=t.appVersion}if(t.osPlatform!==undefined){this.ctrfEnvironment.osPlatform=t.osPlatform}if(t.osRelease!==undefined){this.ctrfEnvironment.osRelease=t.osRelease}if(t.osVersion!==undefined){this.ctrfEnvironment.osVersion=t.osVersion}if(t.buildName!==undefined){this.ctrfEnvironment.buildName=t.buildName}if(t.buildNumber!==undefined){this.ctrfEnvironment.buildNumber=t.buildNumber}if(t.buildUrl!==undefined){this.ctrfEnvironment.buildUrl=t.buildUrl}if(t.repositoryName!==undefined){this.ctrfEnvironment.repositoryName=t.repositoryName}if(t.repositoryUrl!==undefined){this.ctrfEnvironment.repositoryUrl=t.repositoryUrl}if(t.branchName!==undefined){this.ctrfEnvironment.branchName=t.branchName}if(t.commit!==undefined){this.ctrfEnvironment.commit=t.commit}if(t.testEnvironment!==undefined){this.ctrfEnvironment.testEnvironment=t.testEnvironment}}hasEnvironmentDetails(t){return Object.keys(t).length>0}extractMetadata(t){const e=t.attachments.find((t=>t.name==="metadata.json"));if((e===null||e===void 0?void 0:e.body)!==null&&(e===null||e===void 0?void 0:e.body)!==undefined){try{const t=e.body.toString("utf-8");return JSON.parse(t)}catch(t){if(t instanceof Error){console.error(`Error parsing browser metadata: ${t.message}`)}else{console.error("An unknown error occurred in parsing browser metadata")}}}return null}updateStart(t){const e=new Date(t);const r=Math.floor(e.getTime()/1e3);return r}calculateStopTime(t,e){const r=new Date(t);const i=new Date(r.getTime()+e);return Math.floor(i.getTime()/1e3)}buildSuitePath(t){const e=[];let r=t.parent;while(r!==undefined){if(r.title!==""){e.unshift(r.title)}r=r.parent}return e.join(" > ")}extractScreenshotBase64(t){var e;const r=t.attachments.find((t=>t.name==="screenshot"&&(t.contentType==="image/jpeg"||t.contentType==="image/png")));return(e=r===null||r===void 0?void 0:r.body)===null||e===void 0?void 0:e.toString("base64")}extractFailureDetails(t){if((t.status==="failed"||t.status==="timedOut"||t.status==="interrupted")&&t.error!==undefined){const e={};if(t.error.message!==undefined){e.message=t.error.message}if(t.error.stack!==undefined){e.trace=t.error.stack}if(t.error.snippet!==undefined){e.snippet=t.error.snippet}return e}return{}}countSuites(t){let e=0;t.suites.forEach((t=>{e+=this.countSuites(t)}));return e}writeReportToFile(t){var e,r;const i=o.default.join((e=this.reporterConfigOptions.outputDir)!==null&&e!==void 0?e:this.defaultOutputDir,(r=this.reporterConfigOptions.outputFile)!==null&&r!==void 0?r:this.defaultOutputFile);const s=JSON.stringify(t,null,2);try{n.default.writeFileSync(i,s+"\n");console.log(`${this.reporterName}: successfully written ctrf json to %s/%s`,this.reporterConfigOptions.outputDir,this.reporterConfigOptions.outputFile)}catch(t){console.error(`Error writing ctrf json report:, ${String(t)}`)}}processStep(t,e){var r;if(e.category==="test.step"){const i=e.error===undefined?this.mapPlaywrightStatusToCtrf("passed"):this.mapPlaywrightStatusToCtrf("failed");const o={name:e.title,status:i};(r=t.steps)===null||r===void 0?void 0:r.push(o)}const i=e.steps;if(i.length>0){i.forEach((e=>{this.processStep(t,e)}))}}filterValidAttachments(t){return t.filter((t=>t.path!==undefined)).map((t=>{var e;return{name:t.name,contentType:t.contentType,path:(e=t.path)!==null&&e!==void 0?e:""}}))}}e["default"]=GenerateCtrfReport},197:function(t,e,r){var i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});e["default"]=void 0;var o=r(649);Object.defineProperty(e,"default",{enumerable:true,get:function(){return i(o).default}})},406:(t,e)=>{Object.defineProperty(e,"__esModule",{value:true});e.detectCIContext=detectCIContext;function detectCIContext(){const t=process.env;if(t.GITHUB_ACTIONS==="true"){return{branch:t.GITHUB_HEAD_REF||t.GITHUB_REF_NAME||t.GITHUB_REF?.replace("refs/heads/",""),commitSha:t.GITHUB_SHA,repositoryUrl:t.GITHUB_SERVER_URL&&t.GITHUB_REPOSITORY?`${t.GITHUB_SERVER_URL}/${t.GITHUB_REPOSITORY}`:undefined,buildNumber:t.GITHUB_RUN_NUMBER,buildUrl:t.GITHUB_SERVER_URL&&t.GITHUB_REPOSITORY&&t.GITHUB_RUN_ID?`${t.GITHUB_SERVER_URL}/${t.GITHUB_REPOSITORY}/actions/runs/${t.GITHUB_RUN_ID}`:undefined}}if(t.GITLAB_CI==="true"){return{branch:t.CI_COMMIT_BRANCH||t.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,commitSha:t.CI_COMMIT_SHA,repositoryUrl:t.CI_PROJECT_URL,buildNumber:t.CI_PIPELINE_IID,buildUrl:t.CI_PIPELINE_URL}}if(t.TF_BUILD==="True"){return{branch:t.BUILD_SOURCEBRANCH?.replace("refs/heads/",""),commitSha:t.BUILD_SOURCEVERSION,repositoryUrl:t.BUILD_REPOSITORY_URI,buildNumber:t.BUILD_BUILDNUMBER,buildUrl:t.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI&&t.SYSTEM_TEAMPROJECT&&t.BUILD_BUILDID?`${t.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}${t.SYSTEM_TEAMPROJECT}/_build/results?buildId=${t.BUILD_BUILDID}`:undefined}}if(t.CIRCLECI==="true"){return{branch:t.CIRCLE_BRANCH,commitSha:t.CIRCLE_SHA1,repositoryUrl:t.CIRCLE_REPOSITORY_URL,buildNumber:t.CIRCLE_BUILD_NUM,buildUrl:t.CIRCLE_BUILD_URL}}if(t.JENKINS_URL){return{branch:t.GIT_BRANCH?.replace("origin/",""),commitSha:t.GIT_COMMIT,repositoryUrl:t.GIT_URL,buildNumber:t.BUILD_NUMBER,buildUrl:t.BUILD_URL}}if(t.BITBUCKET_BUILD_NUMBER){return{branch:t.BITBUCKET_BRANCH,commitSha:t.BITBUCKET_COMMIT,repositoryUrl:t.BITBUCKET_GIT_HTTP_ORIGIN,buildNumber:t.BITBUCKET_BUILD_NUMBER,buildUrl:t.BITBUCKET_REPO_FULL_NAME&&t.BITBUCKET_BUILD_NUMBER?`https://bitbucket.org/${t.BITBUCKET_REPO_FULL_NAME}/pipelines/results/${t.BITBUCKET_BUILD_NUMBER}`:undefined}}return{}}},827:(t,e)=>{Object.defineProperty(e,"__esModule",{value:true})},322:function(t,e,r){var i=this&&this.__createBinding||(Object.create?function(t,e,r,i){if(i===undefined)i=r;var o=Object.getOwnPropertyDescriptor(e,r);if(!o||("get"in o?!e.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,i,o)}:function(t,e,r,i){if(i===undefined)i=r;t[i]=e[r]});var o=this&&this.__exportStar||function(t,e){for(var r in t)if(r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r))i(e,t,r)};Object.defineProperty(e,"__esModule",{value:true});e.uploadArtifacts=e.uploadTestRun=e.detectCIContext=void 0;o(r(827),e);var n=r(406);Object.defineProperty(e,"detectCIContext",{enumerable:true,get:function(){return n.detectCIContext}});var s=r(969);Object.defineProperty(e,"uploadTestRun",{enumerable:true,get:function(){return s.uploadTestRun}});Object.defineProperty(e,"uploadArtifacts",{enumerable:true,get:function(){return s.uploadArtifacts}})},969:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:true});e.uploadTestRun=uploadTestRun;e.uploadArtifacts=uploadArtifacts;const i="https://test-manager-backend.fly.dev";async function uploadTestRun(t){const{report:e,apiKey:r,apiUrl:o=i}=t;if(!e.reportId){e.reportId=crypto.randomUUID()}const n={report:e,reportId:e.reportId,commitSha:t.commitSha,branch:t.branch,repositoryUrl:t.repositoryUrl,buildName:t.buildName,buildNumber:t.buildNumber,buildUrl:t.buildUrl,testEnvironment:t.testEnvironment,appName:t.appName,appVersion:t.appVersion,testType:t.testType};console.log("Uploading test results...");let s;try{s=await fetch(`${o}/api/v1/ingest`,{method:"POST",headers:{"X-API-KEY":r,"Content-Type":"application/json"},body:JSON.stringify(n)})}catch(t){const r=t instanceof Error?t.message:String(t);return{success:false,reportId:e.reportId,error:`Connection failed: ${r}`}}if(s.status===409){console.warn("Report already exists (workflow may have been re-run)");return{success:true,reportId:e.reportId,summary:{passed:e.results.summary.passed,failed:e.results.summary.failed,skipped:e.results.summary.skipped,total:e.results.summary.tests},alreadyExists:true}}if(!s.ok){const t=await s.text();return{success:false,reportId:e.reportId,error:`Upload failed (HTTP ${s.status}): ${t}`}}const a=await s.json();console.log(`✓ Test results uploaded successfully`);console.log(` Report ID: ${a.reportId}`);console.log(` Test Run ID: ${a.testRunId}`);console.log(` Tests: ${a.summary.passed}/${a.summary.total} passed`);return{success:true,reportId:a.reportId,testRunId:a.testRunId,summary:{passed:a.summary.passed,failed:a.summary.failed,skipped:a.summary.skipped,total:a.summary.total},testResults:a.testResults}}async function uploadArtifacts(t){const{reportId:e,apiKey:r,testResults:o,apiUrl:n=i}=t;let s=0;for(const t of o){for(const i of t.attachments){try{const o=await uploadSingleArtifact({testResultId:t.testResultId,attachment:i,reportId:e,apiKey:r,apiUrl:n});if(o)s++}catch(t){const e=t instanceof Error?t.message:String(t);console.error(`Failed to upload artifact ${i.name}: ${e}`)}}}if(s>0){console.log(`✓ Uploaded ${s} artifact(s)`)}return s}async function uploadSingleArtifact(t){const{testResultId:e,attachment:i,reportId:o,apiKey:n,apiUrl:s}=t;const a=await Promise.resolve().then(r.t.bind(r,943,23));const l=await Promise.resolve().then(r.t.bind(r,928,23));const u=l.resolve(i.path);try{await a.access(u)}catch{console.warn(`Artifact not found: ${l.basename(u)}`);return false}let c;try{c=await a.readFile(u)}catch(t){const e=t instanceof Error?t.message:String(t);throw new Error(`Failed to read file: ${e}`)}const d=new Blob([new Uint8Array(c)],{type:i.contentType});const p=new FormData;p.append("testResultId",e);p.append("ctrfAttachmentName",i.name);p.append("file",d,l.basename(u));const f=`${s}/api/v1/artifacts/${o}`;const h=await fetch(f,{method:"POST",headers:{"X-API-KEY":n},body:p});if(!h.ok){const t=await h.text();throw new Error(`HTTP ${h.status}: ${t}`)}return true}},665:function(t,e,r){var i=this&&this.__createBinding||(Object.create?function(t,e,r,i){if(i===undefined)i=r;var o=Object.getOwnPropertyDescriptor(e,r);if(!o||("get"in o?!e.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,i,o)}:function(t,e,r,i){if(i===undefined)i=r;t[i]=e[r]});var o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:true,value:e})}:function(t,e){t["default"]=e});var n=this&&this.__importStar||function(){var ownKeys=function(t){ownKeys=Object.getOwnPropertyNames||function(t){var e=[];for(var r in t)if(Object.prototype.hasOwnProperty.call(t,r))e[e.length]=r;return e};return ownKeys(t)};return function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r=ownKeys(t),n=0;n<r.length;n++)if(r[n]!=="default")i(e,t,r[n]);o(e,t);return e}}();var s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});e.PlaywrightCTRFReporterWithUpload=void 0;const a=n(r(943));const l=n(r(928));const u=r(322);const c=r(10);const d=s(r(197));class PlaywrightCTRFReporterWithUpload{constructor(t){this.uploader=null;if(!t.apiKey){throw new Error("PlaywrightCTRFReporter: apiKey is required")}this.config={uploadEnabled:true,outputFile:"ctrf-report.json",outputDir:"ctrf",failOnUploadError:false,screenshot:true,annotations:false,testType:"e2e",...t};const e=(0,u.detectCIContext)();if(!this.config.branch&&e.branch){this.config.branch=e.branch}if(!this.config.commitSha&&e.commitSha){this.config.commitSha=e.commitSha}if(!this.config.repositoryUrl&&e.repositoryUrl){this.config.repositoryUrl=e.repositoryUrl}this.reportPath=l.join(this.config.outputDir,this.config.outputFile);const r={outputFile:this.config.outputFile,outputDir:this.config.outputDir,screenshot:this.config.screenshot,annotations:this.config.annotations,testType:this.config.testType};if(this.config.appName)r.appName=this.config.appName;if(this.config.appVersion)r.appVersion=this.config.appVersion;if(this.config.buildName)r.buildName=this.config.buildName;if(this.config.buildNumber)r.buildNumber=this.config.buildNumber;if(this.config.buildUrl)r.buildUrl=this.config.buildUrl;if(this.config.testEnvironment)r.testEnvironment=this.config.testEnvironment;if(this.config.branch)r.branchName=this.config.branch;if(this.config.commitSha)r.commit=this.config.commitSha;this.ctrfReporter=new d.default(r);if(this.config.uploadEnabled){this.uploader=new c.ReportUploader(this.config)}}onBegin(t,e){if(this.ctrfReporter.onBegin){this.ctrfReporter.onBegin(t,e)}console.log("");console.log("=".repeat(60));console.log("Playwright Test Manager Reporter");console.log("=".repeat(60));if(this.config.uploadEnabled){if(this.config.branch)console.log(`Branch: ${this.config.branch}`);if(this.config.commitSha)console.log(`Commit: ${this.config.commitSha.substring(0,7)}`);if(this.config.repositoryUrl)console.log(`Repository: ${this.config.repositoryUrl}`)}else{console.log("Upload: Disabled")}console.log(`Report: ${this.reportPath}`);console.log("=".repeat(60));console.log("")}onTestBegin(t,e){if(this.ctrfReporter.onTestBegin){this.ctrfReporter.onTestBegin(t,e)}}onTestEnd(t,e){if(this.ctrfReporter.onTestEnd){this.ctrfReporter.onTestEnd(t,e)}}onError(t){if(this.ctrfReporter.onError){this.ctrfReporter.onError(t)}}onStepBegin(t,e,r){if(this.ctrfReporter.onStepBegin){this.ctrfReporter.onStepBegin(t,e,r)}}onStepEnd(t,e,r){if(this.ctrfReporter.onStepEnd){this.ctrfReporter.onStepEnd(t,e,r)}}async onEnd(t){if(this.ctrfReporter.onEnd){await this.ctrfReporter.onEnd(t)}if(!this.config.uploadEnabled||!this.uploader){console.log("");console.log("CTRF report generated");console.log(` ${this.reportPath}`);return}console.log("");console.log("=".repeat(60));console.log("Uploading Test Results");console.log("=".repeat(60));try{const t=await a.readFile(this.reportPath,"utf-8");const e=JSON.parse(t);e.results.tool.name="playwright";if(!e.extra){e.extra={}}if(this.config.branch&&!e.extra.branch){e.extra.branch=this.config.branch}if(this.config.commitSha&&!e.extra.commitSha){e.extra.commitSha=this.config.commitSha}const r=await this.uploader.uploadReport(e);if(r.success){console.log("=".repeat(60));console.log("Upload Complete");console.log("=".repeat(60));console.log("")}else{console.error("Upload completed with errors");console.error("")}}catch(t){const e=t instanceof Error?t.message:String(t);console.error("");console.error("=".repeat(60));console.error("Upload Failed");console.error("=".repeat(60));console.error(`Error: ${e}`);console.error("");if(this.config.failOnUploadError){throw t}}}}e.PlaywrightCTRFReporterWithUpload=PlaywrightCTRFReporterWithUpload;e["default"]=PlaywrightCTRFReporterWithUpload},10:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:true});e.ReportUploader=void 0;const i=r(322);class ReportUploader{constructor(t){this.apiUrl="https://test-manager-backend.fly.dev";this.config={apiKey:t.apiKey,branch:t.branch,commitSha:t.commitSha,repositoryUrl:t.repositoryUrl,failOnUploadError:t.failOnUploadError??false}}async uploadReport(t){try{const e=await(0,i.uploadTestRun)({report:t,apiKey:this.config.apiKey,commitSha:this.config.commitSha,branch:this.config.branch,repositoryUrl:this.config.repositoryUrl});if(!e.success){if(this.config.failOnUploadError){throw new Error(e.error||"Upload failed")}return e}let r=0;if(!e.alreadyExists&&e.testRunId&&e.testResults){const o=t.results.tests.filter((t=>t.attachments&&t.attachments.length>0)).map((t=>{const r=e.testResults?.find((e=>e.name===t.name));if(!r)return null;return{testResultId:r.id,attachments:t.attachments||[]}})).filter((t=>t!==null));if(o.length>0){r=await(0,i.uploadArtifacts)({reportId:e.reportId,apiKey:this.config.apiKey,testResults:o})}}return{...e,artifactCount:r}}catch(e){const r=e instanceof Error?e.message:String(e);if(this.config.failOnUploadError){throw new Error(`Failed to upload report: ${r}`)}return{success:false,reportId:t.reportId,error:r}}}}e.ReportUploader=ReportUploader},982:t=>{t.exports=require("crypto")},896:t=>{t.exports=require("fs")},943:t=>{t.exports=require("fs/promises")},928:t=>{t.exports=require("path")}};var e={};function __nccwpck_require__(r){var i=e[r];if(i!==undefined){return i.exports}var o=e[r]={exports:{}};var n=true;try{t[r].call(o.exports,o,o.exports,__nccwpck_require__);n=false}finally{if(n)delete e[r]}return o.exports}(()=>{var t=Object.getPrototypeOf?t=>Object.getPrototypeOf(t):t=>t.__proto__;var e;__nccwpck_require__.t=function(r,i){if(i&1)r=this(r);if(i&8)return r;if(typeof r==="object"&&r){if(i&4&&r.__esModule)return r;if(i&16&&typeof r.then==="function")return r}var o=Object.create(null);__nccwpck_require__.r(o);var n={};e=e||[null,t({}),t([]),t(t)];for(var s=i&2&&r;typeof s=="object"&&!~e.indexOf(s);s=t(s)){Object.getOwnPropertyNames(s).forEach((t=>n[t]=()=>r[t]))}n["default"]=()=>r;__nccwpck_require__.d(o,n);return o}})();(()=>{__nccwpck_require__.d=(t,e)=>{for(var r in e){if(__nccwpck_require__.o(e,r)&&!__nccwpck_require__.o(t,r)){Object.defineProperty(t,r,{enumerable:true,get:e[r]})}}}})();(()=>{__nccwpck_require__.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e)})();(()=>{__nccwpck_require__.r=t=>{if(typeof Symbol!=="undefined"&&Symbol.toStringTag){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})}Object.defineProperty(t,"__esModule",{value:true})}})();if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var r={};(()=>{var t=r;Object.defineProperty(t,"__esModule",{value:true});t.PlaywrightCTRFReporterWithUpload=t["default"]=void 0;var e=__nccwpck_require__(665);Object.defineProperty(t,"default",{enumerable:true,get:function(){return e.PlaywrightCTRFReporterWithUpload}});var i=__nccwpck_require__(665);Object.defineProperty(t,"PlaywrightCTRFReporterWithUpload",{enumerable:true,get:function(){return i.PlaywrightCTRFReporterWithUpload}})})();module.exports=r})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testream/playwright-reporter",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "description": "Playwright plugin to upload test results to Testream",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",