@testream/playwright-reporter 0.4.4 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,14 +1 @@
1
- "use strict";
2
- /**
3
- * @jira-test-manager/playwright-reporter
4
- *
5
- * Playwright reporter that generates CTRF-format test reports and
6
- * automatically uploads them with artifacts to the Test Manager backend.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.PlaywrightCTRFReporterWithUpload = exports.default = void 0;
10
- var reporter_1 = require("./reporter");
11
- Object.defineProperty(exports, "default", { enumerable: true, get: function () { return reporter_1.PlaywrightCTRFReporterWithUpload; } });
12
- var reporter_2 = require("./reporter");
13
- Object.defineProperty(exports, "PlaywrightCTRFReporterWithUpload", { enumerable: true, get: function () { return reporter_2.PlaywrightCTRFReporterWithUpload; } });
14
- //# sourceMappingURL=index.js.map
1
+ (()=>{"use strict";var t={649:function(t,e,r){var o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});const i=o(r(928));const n=o(r(896));const s=o(r(982));class GenerateCtrfReport{constructor(t){var e,r,o,i,n,a,l,u,c,d,f,p,h,m,g,v,_,b,y;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:(o=t===null||t===void 0?void 0:t.minimal)!==null&&o!==void 0?o:false,screenshot:(i=t===null||t===void 0?void 0:t.screenshot)!==null&&i!==void 0?i: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:(f=t===null||t===void 0?void 0:t.osVersion)!==null&&f!==void 0?f:undefined,buildName:(p=t===null||t===void 0?void 0:t.buildName)!==null&&p!==void 0?p: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:(v=t===null||t===void 0?void 0:t.repositoryUrl)!==null&&v!==void 0?v:undefined,branchName:(_=t===null||t===void 0?void 0:t.branchName)!==null&&_!==void 0?_:undefined,commit:(b=t===null||t===void 0?void 0:t.commit)!==null&&b!==void 0?b:undefined,testEnvironment:(y=t===null||t===void 0?void 0:t.testEnvironment)!==null&&y!==void 0?y: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,o,i;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((o=this.reporterConfigOptions.outputDir)!==null&&o!==void 0?o:this.defaultOutputDir,{recursive:true})}this.setEnvironmentDetails(this.reporterConfigOptions);if(this.hasEnvironmentDetails(this.ctrfEnvironment)){this.ctrfReport.results.environment=this.ctrfEnvironment}this.setFilename((i=this.reporterConfigOptions.outputFile)!==null&&i!==void 0?i: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 o,i,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=(o=t.tags)!==null&&o!==void 0?o:[];u.type=(i=this.reporterConfigOptions.testType)!==null&&i!==void 0?i:"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 o=new Date(r.getTime()+e);return Math.floor(o.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 o=i.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(o,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 o=e.error===undefined?this.mapPlaywrightStatusToCtrf("passed"):this.mapPlaywrightStatusToCtrf("failed");const i={name:e.title,status:o};(r=t.steps)===null||r===void 0?void 0:r.push(i)}const o=e.steps;if(o.length>0){o.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 o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:true});e["default"]=void 0;var i=r(649);Object.defineProperty(e,"default",{enumerable:true,get:function(){return o(i).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 o=this&&this.__createBinding||(Object.create?function(t,e,r,o){if(o===undefined)o=r;var i=Object.getOwnPropertyDescriptor(e,r);if(!i||("get"in i?!e.__esModule:i.writable||i.configurable)){i={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,o,i)}:function(t,e,r,o){if(o===undefined)o=r;t[o]=e[r]});var i=this&&this.__exportStar||function(t,e){for(var r in t)if(r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r))o(e,t,r)};Object.defineProperty(e,"__esModule",{value:true});e.detectCIContext=void 0;i(r(827),e);var n=r(406);Object.defineProperty(e,"detectCIContext",{enumerable:true,get:function(){return n.detectCIContext}})},665:function(t,e,r){var o=this&&this.__createBinding||(Object.create?function(t,e,r,o){if(o===undefined)o=r;var i=Object.getOwnPropertyDescriptor(e,r);if(!i||("get"in i?!e.__esModule:i.writable||i.configurable)){i={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,o,i)}:function(t,e,r,o){if(o===undefined)o=r;t[o]=e[r]});var i=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")o(e,t,r[n]);i(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(10);const c=s(r(197));class PlaywrightCTRFReporterWithUpload{constructor(t){this.uploader=null;if(!t.apiKey){throw new Error("PlaywrightCTRFReporter: apiKey is required")}if(!t.projectKey){throw new Error("PlaywrightCTRFReporter: projectKey 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.detectGitContext)();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 c.default(r);if(this.config.uploadEnabled){this.uploader=new u.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){console.log(`Project: ${this.config.projectKey}`);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:function(t,e,r){var o=this&&this.__createBinding||(Object.create?function(t,e,r,o){if(o===undefined)o=r;var i=Object.getOwnPropertyDescriptor(e,r);if(!i||("get"in i?!e.__esModule:i.writable||i.configurable)){i={enumerable:true,get:function(){return e[r]}}}Object.defineProperty(t,o,i)}:function(t,e,r,o){if(o===undefined)o=r;t[o]=e[r]});var i=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")o(e,t,r[n]);i(e,t);return e}}();Object.defineProperty(e,"__esModule",{value:true});e.detectGitContext=e.ReportUploader=void 0;const s=n(r(943));const a=n(r(928));const l=r(982);const u=r(322);class ReportUploader{constructor(t){this.apiUrl="https://test-manager-backend.fly.dev";this.config={apiKey:t.apiKey,projectKey:t.projectKey,branch:t.branch,commitSha:t.commitSha,repositoryUrl:t.repositoryUrl,failOnUploadError:t.failOnUploadError??false}}async uploadReport(t){if(!t.reportId){t.reportId=(0,l.randomUUID)();console.log(`Generated reportId: ${t.reportId}`)}try{console.log("Uploading test results to backend...");const e={reportId:t.reportId,report:t,commitSha:this.config.commitSha,branch:this.config.branch,repositoryUrl:this.config.repositoryUrl};const r=await fetch(`${this.apiUrl}/api/v1/ingest`,{method:"POST",headers:{"X-API-KEY":this.config.apiKey,"Content-Type":"application/json"},body:JSON.stringify(e)});if(r.status===409){const e=await r.json();console.warn(`Report already exists: ${e.reportId}`);return{success:true,reportId:e.reportId||t.reportId}}if(!r.ok){let t;try{const e=await r.json();t=e.error||`HTTP ${r.status}`;if(e.details){t+=`: ${e.details}`}}catch{t=await r.text()}throw new Error(`API ingest failed: ${t}`)}const o=await r.json();console.log(`Report uploaded successfully`);console.log(` Report ID: ${o.reportId}`);console.log(` Test Run ID: ${o.testRunId}`);console.log(` Summary: ${o.summary.passed}/${o.summary.total} passed`);await this.uploadArtifacts(t,o);return{success:true,reportId:o.reportId,testRunId:o.testRunId,summary:o.summary}}catch(e){const r=e instanceof Error?e.message:String(e);const o=`Failed to upload report: ${r}`;if(this.config.failOnUploadError){throw new Error(o)}else{console.error(`${o}`);return{success:false,reportId:t.reportId,error:r}}}}async uploadArtifacts(t,e){try{const r=t.results.tests.reduce(((t,e)=>t+(e.attachments?.length||0)),0);if(r===0){console.log("--- Artifact Upload: No artifacts found to upload. ---");return 0}console.log(`--- Artifact Upload: Starting (${r} artifact(s)) ---`);let o=0;for(const r of t.results.tests){if(!r.attachments||r.attachments.length===0){continue}const t=e.testResults.find((t=>t.name===r.name));if(!t){console.warn(`[Artifact] Could not find test result for: ${r.name}`);continue}for(const i of r.attachments){console.log(`[Artifact] Preparing to upload: ${i.path}`);try{const r=await this.uploadSingleArtifact(t.id,i,e.reportId);if(r){o++}}catch(t){const e=t instanceof Error?t.message:String(t);if(e.includes("File not found")){console.error(`[Artifact] File not found: ${i.path}`)}else{console.error(`[Artifact] Failed to upload: ${i.path}`);console.error(`[Artifact] Error:`,e)}}}}console.log(`--- Artifact Upload: Completed. Total artifacts attempted: ${r}, uploaded: ${o} ---`);return o}catch(t){const e=t instanceof Error?t.message:String(t);const r=`Failed to upload artifacts: ${e}`;if(this.config.failOnUploadError){throw new Error(r)}else{console.error(`${r}`);return 0}}}async uploadSingleArtifact(t,e,r){const o=a.resolve(e.path);try{await s.access(o)}catch{console.warn(` File not found: ${o}`);return false}let i;try{i=await s.readFile(o)}catch(t){const e=t instanceof Error?t.message:String(t);throw new Error(`Failed to read file: ${e}`)}const n=new Blob([i],{type:e.contentType});const l=new FormData;l.append("testResultId",t);l.append("ctrfAttachmentName",e.name);l.append("file",n,a.basename(o));const u=`${this.apiUrl}/api/v1/artifacts/${r}`;const c=await fetch(u,{method:"POST",headers:{"X-API-KEY":this.config.apiKey},body:l});if(!c.ok){const t=await c.text();throw new Error(`HTTP ${c.status}: ${t}`)}return true}}e.ReportUploader=ReportUploader;e.detectGitContext=u.detectCIContext},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 o=e[r];if(o!==undefined){return o.exports}var i=e[r]={exports:{}};var n=true;try{t[r].call(i.exports,i,i.exports,__nccwpck_require__);n=false}finally{if(n)delete e[r]}return i.exports}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 o=__nccwpck_require__(665);Object.defineProperty(t,"PlaywrightCTRFReporterWithUpload",{enumerable:true,get:function(){return o.PlaywrightCTRFReporterWithUpload}})})();module.exports=r})();
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "@testream/playwright-reporter",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Playwright CTRF reporter with automatic upload to Testream",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
- "build": "tsc",
8
+ "build": "npm run build:bundle && npm run build:types",
9
+ "build:bundle": "ncc build src/index.ts -o dist --minify",
10
+ "build:types": "tsc --declaration --emitDeclarationOnly --outDir dist",
9
11
  "format": "prettier --write '**/*.ts'",
10
12
  "lint": "eslint src/**/*.ts",
11
13
  "prepublishOnly": "npm run build",
@@ -42,6 +44,7 @@
42
44
  "@types/node": "^20.10.6",
43
45
  "@typescript-eslint/eslint-plugin": "^6.17.0",
44
46
  "@typescript-eslint/parser": "^6.17.0",
47
+ "@vercel/ncc": "^0.38.1",
45
48
  "dotenv": "^17.2.3",
46
49
  "eslint": "^8.56.0",
47
50
  "prettier": "^3.1.1",
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,uCAAyE;AAAhE,mGAAA,gCAAgC,OAAW;AACpD,uCAA8D;AAArD,4HAAA,gCAAgC,OAAA"}
package/dist/reporter.js DELETED
@@ -1,244 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.PlaywrightCTRFReporterWithUpload = void 0;
40
- const fs = __importStar(require("fs/promises"));
41
- const path = __importStar(require("path"));
42
- const uploader_1 = require("./uploader");
43
- // Import the underlying CTRF reporter
44
- const playwright_ctrf_json_reporter_1 = __importDefault(require("playwright-ctrf-json-reporter"));
45
- /**
46
- * Playwright Reporter that generates CTRF reports and uploads them to a backend API
47
- */
48
- class PlaywrightCTRFReporterWithUpload {
49
- constructor(config) {
50
- this.uploader = null;
51
- // Validate required configuration (apiUrl is now internal)
52
- if (!config.apiKey) {
53
- throw new Error('PlaywrightCTRFReporter: apiKey is required');
54
- }
55
- if (!config.projectKey) {
56
- throw new Error('PlaywrightCTRFReporter: projectKey is required');
57
- }
58
- // Set defaults and inject internalApiUrl
59
- this.config = {
60
- uploadEnabled: true,
61
- outputFile: 'ctrf-report.json',
62
- outputDir: 'ctrf',
63
- failOnUploadError: false,
64
- screenshot: true,
65
- annotations: false,
66
- testType: 'e2e',
67
- ...config
68
- };
69
- // Auto-detect git context if not provided
70
- const gitContext = (0, uploader_1.detectGitContext)();
71
- if (!this.config.branch && gitContext.branch) {
72
- this.config.branch = gitContext.branch;
73
- }
74
- if (!this.config.commitSha && gitContext.commitSha) {
75
- this.config.commitSha = gitContext.commitSha;
76
- }
77
- if (!this.config.repositoryUrl && gitContext.repositoryUrl) {
78
- this.config.repositoryUrl = gitContext.repositoryUrl;
79
- }
80
- // Calculate full report path
81
- this.reportPath = path.join(this.config.outputDir, this.config.outputFile);
82
- // Initialize the underlying CTRF reporter
83
- const ctrfConfig = {
84
- outputFile: this.config.outputFile,
85
- outputDir: this.config.outputDir,
86
- screenshot: this.config.screenshot,
87
- annotations: this.config.annotations,
88
- testType: this.config.testType,
89
- };
90
- // Add optional environment configuration
91
- if (this.config.appName)
92
- ctrfConfig.appName = this.config.appName;
93
- if (this.config.appVersion)
94
- ctrfConfig.appVersion = this.config.appVersion;
95
- if (this.config.buildName)
96
- ctrfConfig.buildName = this.config.buildName;
97
- if (this.config.buildNumber)
98
- ctrfConfig.buildNumber = this.config.buildNumber;
99
- if (this.config.buildUrl)
100
- ctrfConfig.buildUrl = this.config.buildUrl;
101
- if (this.config.testEnvironment)
102
- ctrfConfig.testEnvironment = this.config.testEnvironment;
103
- if (this.config.branch)
104
- ctrfConfig.branchName = this.config.branch;
105
- if (this.config.commitSha)
106
- ctrfConfig.commit = this.config.commitSha;
107
- this.ctrfReporter = new playwright_ctrf_json_reporter_1.default(ctrfConfig);
108
- // Initialize uploader if upload is enabled
109
- if (this.config.uploadEnabled) {
110
- this.uploader = new uploader_1.ReportUploader(this.config);
111
- }
112
- }
113
- /**
114
- * Called once before running tests
115
- */
116
- onBegin(config, suite) {
117
- if (this.ctrfReporter.onBegin) {
118
- this.ctrfReporter.onBegin(config, suite);
119
- }
120
- console.log('');
121
- console.log('='.repeat(60));
122
- console.log('Playwright Test Manager Reporter');
123
- console.log('='.repeat(60));
124
- if (this.config.uploadEnabled) {
125
- console.log(`Project: ${this.config.projectKey}`);
126
- if (this.config.branch)
127
- console.log(`Branch: ${this.config.branch}`);
128
- if (this.config.commitSha)
129
- console.log(`Commit: ${this.config.commitSha.substring(0, 7)}`);
130
- if (this.config.repositoryUrl)
131
- console.log(`Repository: ${this.config.repositoryUrl}`);
132
- }
133
- else {
134
- console.log('Upload: Disabled');
135
- }
136
- console.log(`Report: ${this.reportPath}`);
137
- console.log('='.repeat(60));
138
- console.log('');
139
- }
140
- /**
141
- * Called after a test has been started
142
- */
143
- onTestBegin(test, result) {
144
- if (this.ctrfReporter.onTestBegin) {
145
- this.ctrfReporter.onTestBegin(test, result);
146
- }
147
- }
148
- /**
149
- * Called after a test has been finished
150
- */
151
- onTestEnd(test, result) {
152
- if (this.ctrfReporter.onTestEnd) {
153
- this.ctrfReporter.onTestEnd(test, result);
154
- }
155
- }
156
- /**
157
- * Called on some global error
158
- */
159
- onError(error) {
160
- if (this.ctrfReporter.onError) {
161
- this.ctrfReporter.onError(error);
162
- }
163
- }
164
- /**
165
- * Called after a step has been started
166
- */
167
- onStepBegin(test, result, step) {
168
- if (this.ctrfReporter.onStepBegin) {
169
- this.ctrfReporter.onStepBegin(test, result, step);
170
- }
171
- }
172
- /**
173
- * Called after a step has been finished
174
- */
175
- onStepEnd(test, result, step) {
176
- if (this.ctrfReporter.onStepEnd) {
177
- this.ctrfReporter.onStepEnd(test, result, step);
178
- }
179
- }
180
- /**
181
- * Called after all tests have been run
182
- */
183
- async onEnd(result) {
184
- // Let the underlying CTRF reporter finish writing the report
185
- if (this.ctrfReporter.onEnd) {
186
- await this.ctrfReporter.onEnd(result);
187
- }
188
- // If upload is disabled, we're done
189
- if (!this.config.uploadEnabled || !this.uploader) {
190
- console.log('');
191
- console.log('CTRF report generated');
192
- console.log(` ${this.reportPath}`);
193
- return;
194
- }
195
- console.log('');
196
- console.log('='.repeat(60));
197
- console.log('Uploading Test Results');
198
- console.log('='.repeat(60));
199
- try {
200
- // Read the generated CTRF report
201
- const reportContent = await fs.readFile(this.reportPath, 'utf-8');
202
- const report = JSON.parse(reportContent);
203
- // Force tool name to 'playwright'
204
- report.results.tool.name = 'playwright';
205
- // Add git context to report if not already present
206
- if (!report.extra) {
207
- report.extra = {};
208
- }
209
- if (this.config.branch && !report.extra.branch) {
210
- report.extra.branch = this.config.branch;
211
- }
212
- if (this.config.commitSha && !report.extra.commitSha) {
213
- report.extra.commitSha = this.config.commitSha;
214
- }
215
- // Upload report (artifacts are uploaded internally)
216
- const uploadResult = await this.uploader.uploadReport(report);
217
- if (uploadResult.success) {
218
- console.log('='.repeat(60));
219
- console.log('Upload Complete');
220
- console.log('='.repeat(60));
221
- console.log('');
222
- }
223
- else {
224
- console.error('Upload completed with errors');
225
- console.error('');
226
- }
227
- }
228
- catch (error) {
229
- const errorMessage = error instanceof Error ? error.message : String(error);
230
- console.error('');
231
- console.error('='.repeat(60));
232
- console.error('Upload Failed');
233
- console.error('='.repeat(60));
234
- console.error(`Error: ${errorMessage}`);
235
- console.error('');
236
- if (this.config.failOnUploadError) {
237
- throw error;
238
- }
239
- }
240
- }
241
- }
242
- exports.PlaywrightCTRFReporterWithUpload = PlaywrightCTRFReporterWithUpload;
243
- exports.default = PlaywrightCTRFReporterWithUpload;
244
- //# sourceMappingURL=reporter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
package/dist/types.js DELETED
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/dist/uploader.js DELETED
@@ -1,247 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.detectGitContext = exports.ReportUploader = void 0;
37
- const fs = __importStar(require("fs/promises"));
38
- const path = __importStar(require("path"));
39
- const crypto_1 = require("crypto");
40
- const shared_types_1 = require("@jira-test-manager/shared-types");
41
- /**
42
- * Upload CTRF report and artifacts to the backend API
43
- */
44
- class ReportUploader {
45
- constructor(config) {
46
- this.apiUrl = 'https://test-manager-backend.fly.dev';
47
- this.config = {
48
- apiKey: config.apiKey,
49
- projectKey: config.projectKey,
50
- branch: config.branch,
51
- commitSha: config.commitSha,
52
- repositoryUrl: config.repositoryUrl,
53
- failOnUploadError: config.failOnUploadError ?? false,
54
- };
55
- }
56
- /**
57
- * Upload CTRF report to the backend
58
- */
59
- async uploadReport(report) {
60
- // Ensure reportId exists
61
- if (!report.reportId) {
62
- report.reportId = (0, crypto_1.randomUUID)();
63
- console.log(`Generated reportId: ${report.reportId}`);
64
- }
65
- try {
66
- console.log('Uploading test results to backend...');
67
- const ingestPayload = {
68
- reportId: report.reportId,
69
- report,
70
- commitSha: this.config.commitSha,
71
- branch: this.config.branch,
72
- repositoryUrl: this.config.repositoryUrl,
73
- };
74
- const response = await fetch(`${this.apiUrl}/api/v1/ingest`, {
75
- method: 'POST',
76
- headers: {
77
- 'X-API-KEY': this.config.apiKey,
78
- 'Content-Type': 'application/json',
79
- },
80
- body: JSON.stringify(ingestPayload),
81
- });
82
- // Handle idempotent duplicate reports
83
- if (response.status === 409) {
84
- const errorData = (await response.json());
85
- console.warn(`Report already exists: ${errorData.reportId}`);
86
- return {
87
- success: true,
88
- reportId: errorData.reportId || report.reportId,
89
- };
90
- }
91
- if (!response.ok) {
92
- let errorMessage;
93
- try {
94
- const errorData = (await response.json());
95
- errorMessage = errorData.error || `HTTP ${response.status}`;
96
- if (errorData.details) {
97
- errorMessage += `: ${errorData.details}`;
98
- }
99
- }
100
- catch {
101
- errorMessage = await response.text();
102
- }
103
- throw new Error(`API ingest failed: ${errorMessage}`);
104
- }
105
- const result = (await response.json());
106
- console.log(`Report uploaded successfully`);
107
- console.log(` Report ID: ${result.reportId}`);
108
- console.log(` Test Run ID: ${result.testRunId}`);
109
- console.log(` Summary: ${result.summary.passed}/${result.summary.total} passed`);
110
- // Upload artifacts if present
111
- await this.uploadArtifacts(report, result);
112
- return {
113
- success: true,
114
- reportId: result.reportId,
115
- testRunId: result.testRunId,
116
- summary: result.summary,
117
- };
118
- }
119
- catch (error) {
120
- const errorMessage = error instanceof Error ? error.message : String(error);
121
- const message = `Failed to upload report: ${errorMessage}`;
122
- if (this.config.failOnUploadError) {
123
- throw new Error(message);
124
- }
125
- else {
126
- console.error(`${message}`);
127
- return {
128
- success: false,
129
- reportId: report.reportId,
130
- error: errorMessage,
131
- };
132
- }
133
- }
134
- }
135
- /**
136
- * Upload all artifacts from the CTRF report (internal method)
137
- */
138
- async uploadArtifacts(report, ingestResponse) {
139
- try {
140
- const totalAttachments = report.results.tests.reduce((sum, test) => sum + (test.attachments?.length || 0), 0);
141
- if (totalAttachments === 0) {
142
- console.log('--- Artifact Upload: No artifacts found to upload. ---');
143
- return 0;
144
- }
145
- console.log(`--- Artifact Upload: Starting (${totalAttachments} artifact(s)) ---`);
146
- let uploadedCount = 0;
147
- // Iterate through all tests
148
- for (const test of report.results.tests) {
149
- if (!test.attachments || test.attachments.length === 0) {
150
- continue;
151
- }
152
- // Find matching test result from ingest response
153
- const testResult = ingestResponse.testResults.find((tr) => tr.name === test.name);
154
- if (!testResult) {
155
- console.warn(`[Artifact] Could not find test result for: ${test.name}`);
156
- continue;
157
- }
158
- // Upload each attachment
159
- for (const attachment of test.attachments) {
160
- console.log(`[Artifact] Preparing to upload: ${attachment.path}`);
161
- try {
162
- const uploaded = await this.uploadSingleArtifact(testResult.id, attachment, ingestResponse.reportId);
163
- if (uploaded) {
164
- uploadedCount++;
165
- // console.log(`[Artifact] Successfully uploaded: ${attachment.path}`);
166
- }
167
- }
168
- catch (error) {
169
- const errorMessage = error instanceof Error ? error.message : String(error);
170
- if (errorMessage.includes('File not found')) {
171
- console.error(`[Artifact] File not found: ${attachment.path}`);
172
- }
173
- else {
174
- console.error(`[Artifact] Failed to upload: ${attachment.path}`);
175
- console.error(`[Artifact] Error:`, errorMessage);
176
- }
177
- }
178
- }
179
- }
180
- console.log(`--- Artifact Upload: Completed. Total artifacts attempted: ${totalAttachments}, uploaded: ${uploadedCount} ---`);
181
- return uploadedCount;
182
- }
183
- catch (error) {
184
- const errorMessage = error instanceof Error ? error.message : String(error);
185
- const message = `Failed to upload artifacts: ${errorMessage}`;
186
- if (this.config.failOnUploadError) {
187
- throw new Error(message);
188
- }
189
- else {
190
- console.error(`${message}`);
191
- return 0;
192
- }
193
- }
194
- }
195
- /**
196
- * Upload a single artifact file
197
- */
198
- async uploadSingleArtifact(testResultId, attachment, reportId) {
199
- // Resolve file path
200
- const filePath = path.resolve(attachment.path);
201
- // Check if file exists
202
- try {
203
- await fs.access(filePath);
204
- }
205
- catch {
206
- console.warn(` File not found: ${filePath}`);
207
- return false;
208
- }
209
- // Read file
210
- let fileBuffer;
211
- try {
212
- fileBuffer = await fs.readFile(filePath);
213
- }
214
- catch (error) {
215
- const errorMessage = error instanceof Error ? error.message : String(error);
216
- throw new Error(`Failed to read file: ${errorMessage}`);
217
- }
218
- // Create native FormData with Blob (compatible with native fetch)
219
- const blob = new Blob([fileBuffer], { type: attachment.contentType });
220
- const formData = new FormData();
221
- formData.append('testResultId', testResultId);
222
- formData.append('ctrfAttachmentName', attachment.name);
223
- formData.append('file', blob, path.basename(filePath));
224
- // Upload to API
225
- const uploadUrl = `${this.apiUrl}/api/v1/artifacts/${reportId}`;
226
- const response = await fetch(uploadUrl, {
227
- method: 'POST',
228
- headers: {
229
- 'X-API-KEY': this.config.apiKey,
230
- // Note: Don't set Content-Type - fetch sets it automatically with boundary
231
- },
232
- body: formData,
233
- });
234
- if (!response.ok) {
235
- const errorText = await response.text();
236
- throw new Error(`HTTP ${response.status}: ${errorText}`);
237
- }
238
- return true;
239
- }
240
- }
241
- exports.ReportUploader = ReportUploader;
242
- /**
243
- * Detect git context from environment variables
244
- * @deprecated Use detectCIContext from @jira-test-manager/shared-types instead
245
- */
246
- exports.detectGitContext = shared_types_1.detectCIContext;
247
- //# sourceMappingURL=uploader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uploader.js","sourceRoot":"","sources":["../src/uploader.ts"],"names":[],"mappings":"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"}