@testream/vitest-reporter 1.2.0 → 1.2.2

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.
@@ -1,4 +1,4 @@
1
- var ue=Object.create;var j=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var de=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var _=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var R=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var fe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of le(t))!pe.call(e,i)&&i!==r&&j(e,i,{get:()=>t[i],enumerable:!(n=ce(t,i))||n.enumerable});return e};var V=(e,t,r)=>(r=e!=null?ue(de(e)):{},fe(t||!e||!e.__esModule?j(r,"default",{value:e,enumerable:!0}):r,e));var G=R(K=>{"use strict";Object.defineProperty(K,"__esModule",{value:!0})});var M=R(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.detectCIContext=Ee;function P(e,t){if(e)return e.startsWith(t)?e.slice(t.length):e}function he(){return globalThis.process?.env??{}}function me(e){if(!(!e.GITHUB_SERVER_URL||!e.GITHUB_REPOSITORY))return`${e.GITHUB_SERVER_URL}/${e.GITHUB_REPOSITORY}`}function Te(e){if(!(!e.GITHUB_SERVER_URL||!e.GITHUB_REPOSITORY||!e.GITHUB_RUN_ID))return`${e.GITHUB_SERVER_URL}/${e.GITHUB_REPOSITORY}/actions/runs/${e.GITHUB_RUN_ID}`}function ge(e){if(e.GITHUB_HEAD_REF)return e.GITHUB_HEAD_REF;if(e.GITHUB_REF?.startsWith("refs/heads/"))return e.GITHUB_REF_NAME??P(e.GITHUB_REF,"refs/heads/")}function Re(e){return{branch:ge(e),commitSha:e.GITHUB_SHA,repositoryUrl:me(e),buildNumber:e.GITHUB_RUN_NUMBER,buildUrl:Te(e)}}function be(e){return{branch:e.CI_COMMIT_BRANCH||e.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,commitSha:e.CI_COMMIT_SHA,repositoryUrl:e.CI_PROJECT_URL,buildNumber:e.CI_PIPELINE_IID,buildUrl:e.CI_PIPELINE_URL}}function ye(e){return{branch:P(e.BUILD_SOURCEBRANCH,"refs/heads/"),commitSha:e.BUILD_SOURCEVERSION,repositoryUrl:e.BUILD_REPOSITORY_URI,buildNumber:e.BUILD_BUILDNUMBER,buildUrl:e.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI&&e.SYSTEM_TEAMPROJECT&&e.BUILD_BUILDID?`${e.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}${e.SYSTEM_TEAMPROJECT}/_build/results?buildId=${e.BUILD_BUILDID}`:void 0}}function Ie(e){return{branch:e.CIRCLE_BRANCH,commitSha:e.CIRCLE_SHA1,repositoryUrl:e.CIRCLE_REPOSITORY_URL,buildNumber:e.CIRCLE_BUILD_NUM,buildUrl:e.CIRCLE_BUILD_URL}}function Ce(e){return{branch:P(e.GIT_BRANCH,"origin/"),commitSha:e.GIT_COMMIT,repositoryUrl:e.GIT_URL,buildNumber:e.BUILD_NUMBER,buildUrl:e.BUILD_URL}}function _e(e){return{branch:e.BITBUCKET_BRANCH,commitSha:e.BITBUCKET_COMMIT,repositoryUrl:e.BITBUCKET_GIT_HTTP_ORIGIN,buildNumber:e.BITBUCKET_BUILD_NUMBER,buildUrl:e.BITBUCKET_REPO_FULL_NAME&&e.BITBUCKET_BUILD_NUMBER?`https://bitbucket.org/${e.BITBUCKET_REPO_FULL_NAME}/pipelines/results/${e.BITBUCKET_BUILD_NUMBER}`:void 0}}var Ue=[{isMatch:e=>e.GITHUB_ACTIONS==="true",detect:Re},{isMatch:e=>e.GITLAB_CI==="true",detect:be},{isMatch:e=>e.TF_BUILD==="True",detect:ye},{isMatch:e=>e.CIRCLECI==="true",detect:Ie},{isMatch:e=>!!e.JENKINS_URL,detect:Ce},{isMatch:e=>!!e.BITBUCKET_BUILD_NUMBER,detect:_e}];function Ee(){let e=he();for(let t of Ue)if(t.isMatch(e))return t.detect(e);return{}}});var E=R(b=>{"use strict";var Se=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.resolveSourceSnippetOptions=v;b.enrichReportWithSourceSnippets=Le;var Ne=_("node:fs/promises"),U=Se(_("node:path")),Be=2e3,we=40;function v(e){return{sourceRoot:U.default.resolve(e?.sourceRoot??process.cwd()),maxChars:W(e?.maxChars,Be),maxLines:W(e?.maxLines,we)}}async function Le(e,t){let r=v(t),n=new Map;await Promise.all(e.results.tests.map(async i=>{if(i.snippet||!i.filePath||!i.line)return;let o=await Oe(i,r,n);o&&(i.snippet=o)}))}async function Oe(e,t,r){let n=U.default.resolve(t.sourceRoot,e.filePath);if(!De(n,t.sourceRoot))return;let i=await xe(n,r);if(i)return Pe(i,e.line,t)}function xe(e,t){let r=t.get(e);return r||(r=(0,Ne.readFile)(e,"utf-8").catch(()=>{}),t.set(e,r)),r}function Pe(e,t,r){let n=e.split(/\r?\n/),i=Math.max(0,Math.min(n.length-1,t-1)),o=Ae(n,i);if(o==null)return;let a=[],u=0,s=!1;for(let p=o;p<n.length&&a.length<r.maxLines;p++){let l=n[p];a.push(l);for(let f of l)f==="{"?(u++,s=!0):f==="}"&&u--;if(s&&u<=0&&Me(l))break}let c=a.join(`
1
+ var ue=Object.create;var j=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var de=Object.getPrototypeOf,pe=Object.prototype.hasOwnProperty;var _=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var R=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}};var fe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of le(t))!pe.call(e,i)&&i!==r&&j(e,i,{get:()=>t[i],enumerable:!(n=ce(t,i))||n.enumerable});return e};var V=(e,t,r)=>(r=e!=null?ue(de(e)):{},fe(t||!e||!e.__esModule?j(r,"default",{value:e,enumerable:!0}):r,e));var G=R(K=>{"use strict";Object.defineProperty(K,"__esModule",{value:!0})});var M=R(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.detectCIContext=Ee;function P(e,t){if(e)return e.startsWith(t)?e.slice(t.length):e}function he(){return globalThis.process?.env??{}}function me(e){if(!(!e.GITHUB_SERVER_URL||!e.GITHUB_REPOSITORY))return`${e.GITHUB_SERVER_URL}/${e.GITHUB_REPOSITORY}`}function Te(e){if(!(!e.GITHUB_SERVER_URL||!e.GITHUB_REPOSITORY||!e.GITHUB_RUN_ID))return`${e.GITHUB_SERVER_URL}/${e.GITHUB_REPOSITORY}/actions/runs/${e.GITHUB_RUN_ID}`}function ge(e){if(e.GITHUB_HEAD_REF)return e.GITHUB_HEAD_REF;if(e.GITHUB_REF?.startsWith("refs/heads/"))return e.GITHUB_REF_NAME??P(e.GITHUB_REF,"refs/heads/")}function Re(e){return{branch:ge(e),commitSha:e.GITHUB_SHA,repositoryUrl:me(e),buildNumber:e.GITHUB_RUN_NUMBER,buildUrl:Te(e)}}function be(e){return{branch:e.CI_COMMIT_BRANCH||e.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,commitSha:e.CI_COMMIT_SHA,repositoryUrl:e.CI_PROJECT_URL,buildNumber:e.CI_PIPELINE_IID,buildUrl:e.CI_PIPELINE_URL}}function ye(e){return{branch:P(e.BUILD_SOURCEBRANCH,"refs/heads/"),commitSha:e.BUILD_SOURCEVERSION,repositoryUrl:e.BUILD_REPOSITORY_URI,buildNumber:e.BUILD_BUILDNUMBER,buildUrl:e.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI&&e.SYSTEM_TEAMPROJECT&&e.BUILD_BUILDID?`${e.SYSTEM_TEAMFOUNDATIONCOLLECTIONURI}${e.SYSTEM_TEAMPROJECT}/_build/results?buildId=${e.BUILD_BUILDID}`:void 0}}function Ie(e){return{branch:e.CIRCLE_BRANCH,commitSha:e.CIRCLE_SHA1,repositoryUrl:e.CIRCLE_REPOSITORY_URL,buildNumber:e.CIRCLE_BUILD_NUM,buildUrl:e.CIRCLE_BUILD_URL}}function Ce(e){return{branch:P(e.GIT_BRANCH,"origin/"),commitSha:e.GIT_COMMIT,repositoryUrl:e.GIT_URL,buildNumber:e.BUILD_NUMBER,buildUrl:e.BUILD_URL}}function _e(e){return{branch:e.BITBUCKET_BRANCH,commitSha:e.BITBUCKET_COMMIT,repositoryUrl:e.BITBUCKET_GIT_HTTP_ORIGIN,buildNumber:e.BITBUCKET_BUILD_NUMBER,buildUrl:e.BITBUCKET_REPO_FULL_NAME&&e.BITBUCKET_BUILD_NUMBER?`https://bitbucket.org/${e.BITBUCKET_REPO_FULL_NAME}/pipelines/results/${e.BITBUCKET_BUILD_NUMBER}`:void 0}}var Ue=[{isMatch:e=>e.GITHUB_ACTIONS==="true",detect:Re},{isMatch:e=>e.GITLAB_CI==="true",detect:be},{isMatch:e=>e.TF_BUILD==="True",detect:ye},{isMatch:e=>e.CIRCLECI==="true",detect:Ie},{isMatch:e=>!!e.JENKINS_URL,detect:Ce},{isMatch:e=>!!e.BITBUCKET_BUILD_NUMBER,detect:_e}];function Ee(){let e=he();for(let t of Ue)if(t.isMatch(e))return t.detect(e);return{}}});var E=R(b=>{"use strict";var Se=b&&b.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(b,"__esModule",{value:!0});b.resolveSourceSnippetOptions=v;b.enrichReportWithSourceSnippets=Le;var Ne=_("node:fs/promises"),U=Se(_("node:path")),Be=2e3,we=40;function v(e){return{sourceRoot:U.default.resolve(e?.sourceRoot??process.cwd()),maxChars:W(e?.maxChars,Be),maxLines:W(e?.maxLines,we)}}async function Le(e,t){let r=v(t),n=new Map;await Promise.all(e.results.tests.map(async i=>{if(i.snippet||!i.filePath||!i.line)return;let o=await Oe(i,r,n);o&&(i.snippet=o)}))}async function Oe(e,t,r){let n=U.default.resolve(t.sourceRoot,e.filePath);if(!De(n,t.sourceRoot))return;let i=await xe(n,r);if(i)return Pe(i,e.line,t)}function xe(e,t){let r=t.get(e);return r||(r=(0,Ne.readFile)(e,"utf-8").catch(()=>{}),t.set(e,r)),r}function Pe(e,t,r){let n=e.split(/\r?\n/),i=Math.max(0,Math.min(n.length-1,t-1)),o=Ae(n,i);if(o==null)return;let a=[],u=0,s=!1;for(let p=o;p<n.length&&a.length<r.maxLines;p++){let l=n[p];a.push(l);for(let f of l)f==="{"?(u++,s=!0):f==="}"&&u--;if(s&&u<=0&&Me(l))break}let c=a.join(`
2
2
  `).trim();if(c)return c.length<=r.maxChars?c:c.slice(0,r.maxChars)}function Ae(e,t){for(let r=t;r>=0;r--)if(/\b(?:test|it)(?:\.(?:only|skip|fixme|slow))?\s*\(/.test(e[r]))return r}function Me(e){let t=e.length-1;for(;t>=0&&/\s/.test(e[t]);)t--;for(t>=0&&e[t]===";"&&t--;t>=0&&/\s/.test(e[t]);)t--;if(t<1||e[t]!==")")return!1;for(t--;t>=0&&/\s/.test(e[t]);)t--;return t>=0&&e[t]==="}"}function De(e,t){let r=U.default.relative(t,e);return r.length>0&&!r.startsWith("..")&&!U.default.isAbsolute(r)}function W(e,t){return typeof e=="number"&&Number.isInteger(e)&&e>0?e:t}});var Y=R(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.ensureReportId=q;y.uploadTestRun=We;y.mapAttachmentsToTestResults=ve;y.uploadArtifacts=qe;var $e=M(),Fe=E(),ke="https://api.testream.app";function q(e){if(typeof e.reportId=="string"&&e.reportId.trim().length>0)return e.reportId;let t=crypto.randomUUID();return e.reportId=t,t}function J(e){let t=z(e);if(t)return t;let r=He();return r||ke}function He(){if(!(typeof process>"u"||!process?.env))return z(process.env.TESTREAM_API_URL)}function z(e){if(!e)return;let t=e.trim();if(!t)return;let r=t;for(;r.endsWith("/");)r=r.slice(0,-1);return r}function je(e){return e.errorCode==="report_already_exists"}function Ve(e){let t=e.detail||e.title||e.rawBody||"Unknown error",r=e.errorCode?`, code=${e.errorCode}`:"";return`Upload failed (HTTP ${e.statusCode}${r}): ${t}`}async function Ke(e){let t=await e.text();if((e.headers.get("content-type")||"").toLowerCase().includes("json")&&t.trim().length>0)try{let n=JSON.parse(t);return{statusCode:e.status,title:n.title,detail:n.detail||n.details||n.error,errorCode:n.errorCode,rawBody:t}}catch{}return{statusCode:e.status,rawBody:t}}function Ge(e){let t=(0,$e.detectCIContext)();return{commitSha:e.commitSha??t.commitSha,branch:e.branch??t.branch,repositoryUrl:e.repositoryUrl??t.repositoryUrl,buildName:e.buildName,buildNumber:e.buildNumber??t.buildNumber,buildUrl:e.buildUrl??t.buildUrl,testEnvironment:e.testEnvironment,appName:e.appName,appVersion:e.appVersion,testType:e.testType}}async function We(e){let{report:t,apiKey:r}=e,n=J(e.apiUrl),i=q(t),o=Ge(e);await(0,Fe.enrichReportWithSourceSnippets)(t);let a={report:t,reportId:i,...o};console.log("Uploading test results...");let u;try{u=await fetch(`${n}/api/v1/ingest`,{method:"POST",headers:{"X-API-KEY":r,"Content-Type":"application/json"},body:JSON.stringify(a)})}catch(c){let l=`Connection failed: ${c instanceof Error?c.message:String(c)}`;return console.error(l),{success:!1,reportId:i,error:l}}if(!u.ok){let c=await Ke(u);if(u.status===409&&je(c))return console.warn("Report already exists (workflow may have been re-run)"),{success:!0,reportId:i,summary:{passed:t.results.summary.passed,failed:t.results.summary.failed,skipped:t.results.summary.skipped,total:t.results.summary.tests},alreadyExists:!0,statusCode:c.statusCode,errorCode:c.errorCode};let p=Ve(c);return console.error(p),{success:!1,reportId:i,error:p,statusCode:c.statusCode,errorCode:c.errorCode,errorDetail:c.detail||c.rawBody}}let s=await u.json();return console.log("\u2713 Test results uploaded successfully"),console.log(` Report ID: ${s.reportId}`),console.log(` Test Run ID: ${s.testRunId}`),console.log(` Tests: ${s.summary.passed}/${s.summary.total} passed`),{success:!0,reportId:s.reportId,testRunId:s.testRunId,summary:{passed:s.summary.passed,failed:s.summary.failed,skipped:s.summary.skipped,total:s.summary.total},testResults:s.testResults}}function ve(e,t){let r=new Map;for(let i of t){let o=r.get(i.name)??[];o.push(i.id),r.set(i.name,o)}let n=[];for(let i of e){let a=r.get(i.name)?.shift();if(!(!i.attachments||i.attachments.length===0)){if(!a){console.warn(`Skipping artifact upload: could not match test result for "${i.name}"`);continue}n.push({testResultId:a,attachments:i.attachments})}}return n}async function qe(e){let{reportId:t,apiKey:r,testResults:n}=e,i=J(e.apiUrl),o=0;for(let a of n)for(let u of a.attachments)try{await Je({testResultId:a.testResultId,attachment:u,reportId:t,apiKey:r,apiUrl:i})&&o++}catch(s){let c=s instanceof Error?s.message:String(s);console.error(`Failed to upload artifact ${u.name}: ${c}`)}return o>0&&console.log(`\u2713 Uploaded ${o} artifact(s)`),o}async function Je(e){let{testResultId:t,attachment:r,reportId:n,apiKey:i,apiUrl:o}=e,a=await import("node:fs/promises"),u=await import("node:path"),s=u.resolve(r.path);try{await a.access(s)}catch{return console.warn(`Artifact not found: ${u.basename(s)}`),!1}let c,p,l=u.basename(s),f=r.contentType||"application/octet-stream";try{c=await a.readFile(s),p=c.byteLength}catch(h){let g=h instanceof Error?h.message:String(h);throw new Error(`Failed to read file: ${g}`)}try{return await ze({testResultId:t,reportId:n,apiKey:i,apiUrl:o,attachmentName:r.name,fileName:l,contentType:f,sizeBytes:p,fileBuffer:c})}catch(h){if(!(h instanceof S))throw h;return await Ye({testResultId:t,attachmentName:r.name,reportId:n,apiKey:i,apiUrl:o,fileName:l,contentType:f,fileBuffer:c})}}var S=class extends Error{constructor(){super("Legacy upload endpoint required")}};async function ze(e){let{testResultId:t,reportId:r,apiKey:n,apiUrl:i,attachmentName:o,fileName:a,contentType:u,sizeBytes:s,fileBuffer:c}=e,p={testResultId:t,ctrfAttachmentName:o,fileName:a,contentType:u,sizeBytes:s},l=await fetch(`${i}/api/v1/artifacts/${r}/upload-url`,{method:"POST",headers:{"X-API-KEY":n,"Content-Type":"application/json"},body:JSON.stringify(p)});if(Xe(l.status))throw new S;if(!l.ok){let I=await l.text();throw new Error(`Failed to create direct upload URL (HTTP ${l.status}): ${I}`)}let f=await l.json(),h={...f.requiredHeaders};Qe(h,"Content-Type")||(h["Content-Type"]=u);let g=await fetch(f.uploadUrl,{method:"PUT",headers:h,body:c});if(!g.ok){let I=await g.text();throw new Error(`Direct artifact upload failed (HTTP ${g.status}): ${I}`)}let H={testResultId:t,ctrfAttachmentName:o,fileName:a,contentType:u,sizeBytes:s,storageKey:f.storageKey},x=await fetch(`${i}/api/v1/artifacts/${r}/complete`,{method:"POST",headers:{"X-API-KEY":n,"Content-Type":"application/json"},body:JSON.stringify(H)});if(!x.ok){let I=await x.text();throw new Error(`Failed to finalize artifact upload (HTTP ${x.status}): ${I}`)}return!0}async function Ye(e){let{testResultId:t,attachmentName:r,reportId:n,apiKey:i,apiUrl:o,fileName:a,contentType:u,fileBuffer:s}=e,c=new Blob([new Uint8Array(s)],{type:u}),p=new FormData;p.append("testResultId",t),p.append("ctrfAttachmentName",r),p.append("file",c,a);let l=await fetch(`${o}/api/v1/artifacts/${n}`,{method:"POST",headers:{"X-API-KEY":i},body:p});if(!l.ok){let f=await l.text();throw new Error(`Legacy artifact upload failed (HTTP ${l.status}): ${f}`)}return!0}function Xe(e){return e===404||e===405||e===501}function Qe(e,t){let r=t.toLowerCase();return Object.keys(e).some(n=>n.toLowerCase()===r)}});var re=R(C=>{"use strict";var Ze=C&&C.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(C,"__esModule",{value:!0});C.enrichReportWithJsTestNameSourceSnippets=nt;var et=_("node:fs/promises"),D=Ze(_("node:path")),tt=E(),rt=3,X=/\b(describe|it|test)(?:\.(only|skip))?\s*\(\s*(['"`])/g;async function nt(e,t){let r=(0,tt.resolveSourceSnippetOptions)(t),n=new Map;await Promise.all(e.results.tests.map(async i=>{if(i.snippet||!i.filePath)return;let o=D.default.resolve(r.sourceRoot,i.filePath);if(!yt(o,r.sourceRoot))return;let a=await it(o,n);if(!a)return;let u=at(i,a).slice(0,rt);u.length!==0&&(i.line??(i.line=u[0].line),i.snippet=ut(u,r))}))}function it(e,t){let r=t.get(e);return r||(r=(0,et.readFile)(e,"utf-8").then(n=>ot(n)).catch(()=>{}),t.set(e,r)),r}function ot(e){let t=mt(e),r=st(e,t),n=r.filter(i=>i.kind==="describe");return r.filter(i=>i.kind==="test").map(i=>{let o=n.filter(a=>a.startIndex<i.startIndex&&a.endIndex>=i.endIndex).sort((a,u)=>a.startIndex-u.startIndex).map(a=>a.title);return{title:i.title,describeTitles:o,fullName:[...o,i.title].join(" ").trim(),line:i.startLine,snippet:i.snippet}})}function st(e,t){let r=[];X.lastIndex=0;let n;for(;(n=X.exec(e))!==null;){if(gt(e,n.index))continue;let i=dt(e,n.index+n[0].length,n[3]);if(!i)continue;let o=pt(e,i.endIndex+1);if(o==null)continue;let a=n[1]==="describe"?"describe":"test",u=n.index,s=ct(e,o+1);if(s==null)continue;let c=lt(e,s);if(c==null)continue;let p=ft(e,c),l=e.slice(u,p).trim();l&&r.push({kind:a,title:i.value.trim(),startIndex:u,endIndex:p,startLine:Tt(t,u),snippet:l})}return r}function at(e,t){let r=m(e.name),n=bt(e.suite),i=t.filter(a=>m(a.fullName)===r);if(i.length>0)return i;if(n){let a=t.filter(u=>m(u.title)===r&&m(u.describeTitles.join(" "))===n);if(a.length>0)return a}let o=t.filter(a=>m(a.title)===r);return o.length>0?o:t.filter(a=>{let u=m(a.title);if(!r.endsWith(u))return!1;let s=r.slice(0,r.length-u.length).trim();return s.length>0&&m(a.describeTitles.join(" "))===s})}function ut(e,t){let n=(e.length===1?e[0].snippet:e.map((i,o)=>`Candidate ${o+1} (line ${i.line})
3
3
  ${i.snippet}`).join(`
4
4
 
@@ -9,4 +9,4 @@ ${i.snippet}`).join(`
9
9
  `)return r;r++}return e.length}function $(e,t){let r=e[t];for(let n=t+1;n<e.length;n++){let i=e[n];if(i==="\\"){n++;continue}if(i===r)return n}return e.length-1}function ee(e,t){for(let r=t;r<e.length;r++)if(e[r]===`
10
10
  `)return r;return e.length-1}function te(e,t){for(let r=t;r<e.length-1;r++)if(e[r]==="*"&&e[r+1]==="/")return r+1;return e.length-1}function ht(e,t){for(let r=t;r<e.length;r++){let n=e[r];if(!/\s/.test(n))return n!=="."&&n!=="("}return!1}function mt(e){let t=[0];for(let r=0;r<e.length;r++)e[r]===`
11
11
  `&&t.push(r+1);return t}function Tt(e,t){let r=0;for(let n=0;n<e.length&&!(e[n]>t);n++)r=n;return r+1}function gt(e,t){let r=e.lastIndexOf(`
12
- `,t-1)+1,n=e.slice(r,t).trimStart();return n.startsWith("//")||n.startsWith("*")}function Rt(e,t,r){if(!e.startsWith(r,t))return!1;let n=t===0?"":e[t-1],i=e[t+r.length]??"";return!Z(n)&&!Z(i)}function Z(e){return/[A-Za-z0-9_$]/.test(e)}function m(e){return(e??"").trim().replace(/\s+/g," ")}function bt(e){if(!e)return"";let t=e.split(">").map(i=>i.trim()).filter(Boolean);if(t.length===0)return"";let n=t[0].includes(".")?t.slice(1):t;return m(n.join(" "))}function yt(e,t){let r=D.default.relative(t,e);return r.length>0&&!r.startsWith("..")&&!D.default.isAbsolute(r)}});var ne=R(F=>{"use strict";Object.defineProperty(F,"__esModule",{value:!0});F.createTestLocationCollector=It;function It(){let e=new Map;return{add(t,r){if(!t||!Ct(r))return;let n=e.get(t)??[];n.push(r),e.set(t,n)},applyToReport(t){let r=new Map([...e.entries()].map(([n,i])=>[n,[...i]]));for(let n of t.results.tests){let o=r.get(n.name)?.shift();o&&(n.filePath??(n.filePath=o.filePath),n.line??(n.line=o.line))}}}}function Ct(e){return!!e.filePath&&Number.isInteger(e.line)&&e.line>0}});var k=R(d=>{"use strict";var _t=d&&d.__createBinding||(Object.create?function(e,t,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);(!i||("get"in i?!t.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}:function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]}),Ut=d&&d.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&_t(t,e,r)};Object.defineProperty(d,"__esModule",{value:!0});d.createTestLocationCollector=d.enrichReportWithJsTestNameSourceSnippets=d.resolveSourceSnippetOptions=d.enrichReportWithSourceSnippets=d.ensureReportId=d.mapAttachmentsToTestResults=d.uploadArtifacts=d.uploadTestRun=d.detectCIContext=void 0;Ut(G(),d);var Et=M();Object.defineProperty(d,"detectCIContext",{enumerable:!0,get:function(){return Et.detectCIContext}});var N=Y();Object.defineProperty(d,"uploadTestRun",{enumerable:!0,get:function(){return N.uploadTestRun}});Object.defineProperty(d,"uploadArtifacts",{enumerable:!0,get:function(){return N.uploadArtifacts}});Object.defineProperty(d,"mapAttachmentsToTestResults",{enumerable:!0,get:function(){return N.mapAttachmentsToTestResults}});Object.defineProperty(d,"ensureReportId",{enumerable:!0,get:function(){return N.ensureReportId}});var ie=E();Object.defineProperty(d,"enrichReportWithSourceSnippets",{enumerable:!0,get:function(){return ie.enrichReportWithSourceSnippets}});Object.defineProperty(d,"resolveSourceSnippetOptions",{enumerable:!0,get:function(){return ie.resolveSourceSnippetOptions}});var St=re();Object.defineProperty(d,"enrichReportWithJsTestNameSourceSnippets",{enumerable:!0,get:function(){return St.enrichReportWithJsTestNameSourceSnippets}});var Nt=ne();Object.defineProperty(d,"createTestLocationCollector",{enumerable:!0,get:function(){return Nt.createTestLocationCollector}})});var O=V(k());import*as L from"node:fs/promises";import*as ae from"node:path";function Bt(e){switch(e){case"passed":return"passed";case"failed":return"failed";case"skipped":return"skipped";default:return"pending"}}function wt(e){let t=[],r=e.parent;for(;r?.type==="suite";)t.unshift(r.name),r=r.parent;return t.join(" > ")}function oe(e){let t=[];for(let r of e)r.type==="test"?t.push(r):r.type==="suite"&&t.push(...oe(r.children));return t}function Lt(e){if(!e||e.length===0)return{message:void 0,trace:void 0};let t=e[0],r=t?.message,n=t?.stackTrace??t?.stack;return{message:r,trace:typeof n=="string"?n:void 0}}function Ot(e,t,r){let n=e.result(),i=e.diagnostic(),o=n.state,a=Bt(o),u=Math.round(i?.duration??0),s=i?.startTime??r,c=s+u,p=i?.retryCount??0,l=i?.flaky??!1,f=wt(e),{message:h,trace:g}=Lt(n.errors);return{ctrfTest:{name:e.name,status:a,duration:u,start:s,stop:c,rawStatus:o,tags:[],type:t.testType||"unit",filePath:e.module.moduleId,line:e.location?.line,retries:p,flaky:l,steps:[],suite:f||void 0,stdout:[],stderr:[],message:h,trace:g},suiteName:f}}function se(e,t,r){let n=Date.now(),i=[],o=new Set;for(let s of e){let c=oe(s.children);for(let p of c){let{ctrfTest:l,suiteName:f}=Ot(p,t,r);f&&o.add(f),i.push(l)}}let a={tests:i.length,passed:i.filter(s=>s.status==="passed").length,failed:i.filter(s=>s.status==="failed").length,skipped:i.filter(s=>s.status==="skipped").length,pending:i.filter(s=>s.status==="pending").length,other:i.filter(s=>s.status==="other").length,suites:o.size,start:r,stop:n};return{reportFormat:"CTRF",specVersion:"0.0.1",timestamp:new Date(r).toISOString(),generatedBy:"@testream/vitest-reporter",extra:{branch:t.branch,commitSha:t.commitSha},results:{tool:{name:"vitest"},summary:a,tests:i,environment:{...t.testEnvironment?{testEnvironment:t.testEnvironment}:{},...t.appName?{appName:t.appName}:{},...t.appVersion?{appVersion:t.appVersion}:{},...t.buildName?{buildName:t.buildName}:{},...t.buildNumber?{buildNumber:t.buildNumber}:{},...t.buildUrl?{buildUrl:t.buildUrl}:{}}}}}var T=V(k()),B=class{constructor(t){if(!t.apiKey)throw new Error("ReportUploader requires an apiKey");this.config={apiKey:t.apiKey,branch:t.branch,commitSha:t.commitSha,repositoryUrl:t.repositoryUrl,failOnUploadError:t.failOnUploadError??!1,buildName:t.buildName,buildNumber:t.buildNumber,buildUrl:t.buildUrl,testEnvironment:t.testEnvironment,appName:t.appName,appVersion:t.appVersion,testType:t.testType}}async uploadReport(t){try{let r=await(0,T.uploadTestRun)({report:t,apiKey:this.config.apiKey,commitSha:this.config.commitSha,branch:this.config.branch,repositoryUrl:this.config.repositoryUrl,buildName:this.config.buildName,buildNumber:this.config.buildNumber,buildUrl:this.config.buildUrl,testEnvironment:this.config.testEnvironment,appName:this.config.appName,appVersion:this.config.appVersion,testType:this.config.testType});if(!r.success){if(this.config.failOnUploadError)throw new Error(r.error||"Upload failed");return r}let n=0;if(!r.alreadyExists&&r.testRunId&&r.testResults){let i=(0,T.mapAttachmentsToTestResults)(t.results.tests,r.testResults);i.length>0&&(n=await(0,T.uploadArtifacts)({reportId:r.reportId,apiKey:this.config.apiKey,testResults:i}))}return{...r,artifactCount:n}}catch(r){let n=r instanceof Error?r.message:String(r);if(this.config.failOnUploadError)throw new Error(`Failed to upload report: ${n}`);return{success:!1,reportId:(0,T.ensureReportId)(t),error:n}}}};var w=class{constructor(t){this.uploader=null;this.startTimestamp=0;if(this.config={uploadEnabled:!0,outputFile:"ctrf-report.json",outputDir:"ctrf",failOnUploadError:!1,testType:"unit",...t},this.config.uploadEnabled&&!this.config.apiKey)throw new Error("TestreamVitestReporter: apiKey is required when upload is enabled");let r=(0,O.detectCIContext)();!this.config.branch&&r.branch&&(this.config.branch=r.branch),!this.config.commitSha&&r.commitSha&&(this.config.commitSha=r.commitSha),!this.config.repositoryUrl&&r.repositoryUrl&&(this.config.repositoryUrl=r.repositoryUrl),!this.config.buildNumber&&r.buildNumber&&(this.config.buildNumber=r.buildNumber),!this.config.buildUrl&&r.buildUrl&&(this.config.buildUrl=r.buildUrl),this.reportPath=ae.join(this.config.outputDir,this.config.outputFile),this.config.uploadEnabled&&(this.uploader=new B(this.config))}onInit(t){t.config.includeTaskLocation!==!0&&(t.config.includeTaskLocation=!0)}onTestRunStart(t){this.startTimestamp=Date.now(),console.log(""),console.log("=".repeat(60)),console.log("Vitest Testream Reporter"),console.log("=".repeat(60)),this.config.uploadEnabled?(this.config.branch&&console.log(`Branch: ${this.config.branch}`),this.config.commitSha&&console.log(`Commit: ${this.config.commitSha.substring(0,7)}`),this.config.repositoryUrl&&console.log(`Repository: ${this.config.repositoryUrl}`)):console.log("Upload: Disabled"),console.log(`Report: ${this.reportPath}`),console.log("=".repeat(60)),console.log("")}async onTestRunEnd(t,r,n){let i=se(t,this.config,this.startTimestamp);await(0,O.enrichReportWithSourceSnippets)(i);try{await L.mkdir(this.config.outputDir,{recursive:!0}),await L.writeFile(this.reportPath,JSON.stringify(i,null,2))}catch(o){let a=o instanceof Error?o.message:String(o);console.error(`Failed to write CTRF report: ${a}`)}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{let o=await this.uploader.uploadReport(i);o.success?(console.log("=".repeat(60)),console.log("Upload Complete"),console.log("=".repeat(60)),console.log("")):(console.error("Upload completed with errors"),o.error&&console.error(`Error: ${o.error}`),o.errorCode&&console.error(`Error code: ${o.errorCode}`),console.error(""))}catch(o){let a=o instanceof Error?o.message:String(o);if(console.error(""),console.error("=".repeat(60)),console.error("Upload Failed"),console.error("=".repeat(60)),console.error(`Error: ${a}`),console.error(""),this.config.failOnUploadError)throw o}}};export{w as TestreamVitestReporter,w as default};
12
+ `,t-1)+1,n=e.slice(r,t).trimStart();return n.startsWith("//")||n.startsWith("*")}function Rt(e,t,r){if(!e.startsWith(r,t))return!1;let n=t===0?"":e[t-1],i=e[t+r.length]??"";return!Z(n)&&!Z(i)}function Z(e){return/[A-Za-z0-9_$]/.test(e)}function m(e){return(e??"").trim().replace(/\s+/g," ")}function bt(e){if(!e)return"";let t=e.split(">").map(i=>i.trim()).filter(Boolean);if(t.length===0)return"";let n=t[0].includes(".")?t.slice(1):t;return m(n.join(" "))}function yt(e,t){let r=D.default.relative(t,e);return r.length>0&&!r.startsWith("..")&&!D.default.isAbsolute(r)}});var ne=R(F=>{"use strict";Object.defineProperty(F,"__esModule",{value:!0});F.createTestLocationCollector=It;function It(){let e=new Map;return{add(t,r){if(!t||!Ct(r))return;let n=e.get(t)??[];n.push(r),e.set(t,n)},applyToReport(t){let r=new Map([...e.entries()].map(([n,i])=>[n,[...i]]));for(let n of t.results.tests){let o=r.get(n.name)?.shift();o&&(n.filePath??(n.filePath=o.filePath),n.line??(n.line=o.line))}}}}function Ct(e){return!!e.filePath&&Number.isInteger(e.line)&&e.line>0}});var k=R(d=>{"use strict";var _t=d&&d.__createBinding||(Object.create?(function(e,t,r,n){n===void 0&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);(!i||("get"in i?!t.__esModule:i.writable||i.configurable))&&(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}):(function(e,t,r,n){n===void 0&&(n=r),e[n]=t[r]})),Ut=d&&d.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&_t(t,e,r)};Object.defineProperty(d,"__esModule",{value:!0});d.createTestLocationCollector=d.enrichReportWithJsTestNameSourceSnippets=d.resolveSourceSnippetOptions=d.enrichReportWithSourceSnippets=d.ensureReportId=d.mapAttachmentsToTestResults=d.uploadArtifacts=d.uploadTestRun=d.detectCIContext=void 0;Ut(G(),d);var Et=M();Object.defineProperty(d,"detectCIContext",{enumerable:!0,get:function(){return Et.detectCIContext}});var N=Y();Object.defineProperty(d,"uploadTestRun",{enumerable:!0,get:function(){return N.uploadTestRun}});Object.defineProperty(d,"uploadArtifacts",{enumerable:!0,get:function(){return N.uploadArtifacts}});Object.defineProperty(d,"mapAttachmentsToTestResults",{enumerable:!0,get:function(){return N.mapAttachmentsToTestResults}});Object.defineProperty(d,"ensureReportId",{enumerable:!0,get:function(){return N.ensureReportId}});var ie=E();Object.defineProperty(d,"enrichReportWithSourceSnippets",{enumerable:!0,get:function(){return ie.enrichReportWithSourceSnippets}});Object.defineProperty(d,"resolveSourceSnippetOptions",{enumerable:!0,get:function(){return ie.resolveSourceSnippetOptions}});var St=re();Object.defineProperty(d,"enrichReportWithJsTestNameSourceSnippets",{enumerable:!0,get:function(){return St.enrichReportWithJsTestNameSourceSnippets}});var Nt=ne();Object.defineProperty(d,"createTestLocationCollector",{enumerable:!0,get:function(){return Nt.createTestLocationCollector}})});var O=V(k());import*as L from"node:fs/promises";import*as ae from"node:path";function Bt(e){switch(e){case"passed":return"passed";case"failed":return"failed";case"skipped":return"skipped";default:return"pending"}}function wt(e){let t=[],r=e.parent;for(;r?.type==="suite";)t.unshift(r.name),r=r.parent;return t.join(" > ")}function oe(e){let t=[];for(let r of e)r.type==="test"?t.push(r):r.type==="suite"&&t.push(...oe(r.children));return t}function Lt(e){if(!e||e.length===0)return{message:void 0,trace:void 0};let t=e[0],r=t?.message,n=t?.stackTrace??t?.stack;return{message:r,trace:typeof n=="string"?n:void 0}}function Ot(e,t,r){let n=e.result(),i=e.diagnostic(),o=n.state,a=Bt(o),u=Math.round(i?.duration??0),s=i?.startTime??r,c=s+u,p=i?.retryCount??0,l=i?.flaky??!1,f=wt(e),{message:h,trace:g}=Lt(n.errors);return{ctrfTest:{name:e.name,status:a,duration:u,start:s,stop:c,rawStatus:o,tags:[],type:t.testType||"unit",filePath:e.module.moduleId,line:e.location?.line,retries:p,flaky:l,steps:[],suite:f||void 0,stdout:[],stderr:[],message:h,trace:g},suiteName:f}}function se(e,t,r){let n=Date.now(),i=[],o=new Set;for(let s of e){let c=oe(s.children);for(let p of c){let{ctrfTest:l,suiteName:f}=Ot(p,t,r);f&&o.add(f),i.push(l)}}let a={tests:i.length,passed:i.filter(s=>s.status==="passed").length,failed:i.filter(s=>s.status==="failed").length,skipped:i.filter(s=>s.status==="skipped").length,pending:i.filter(s=>s.status==="pending").length,other:i.filter(s=>s.status==="other").length,suites:o.size,start:r,stop:n};return{reportFormat:"CTRF",specVersion:"0.0.1",timestamp:new Date(r).toISOString(),generatedBy:"@testream/vitest-reporter",extra:{branch:t.branch,commitSha:t.commitSha},results:{tool:{name:"vitest"},summary:a,tests:i,environment:{...t.testEnvironment?{testEnvironment:t.testEnvironment}:{},...t.appName?{appName:t.appName}:{},...t.appVersion?{appVersion:t.appVersion}:{},...t.buildName?{buildName:t.buildName}:{},...t.buildNumber?{buildNumber:t.buildNumber}:{},...t.buildUrl?{buildUrl:t.buildUrl}:{}}}}}var T=V(k()),B=class{constructor(t){if(!t.apiKey)throw new Error("ReportUploader requires an apiKey");this.config={apiKey:t.apiKey,branch:t.branch,commitSha:t.commitSha,repositoryUrl:t.repositoryUrl,failOnUploadError:t.failOnUploadError??!1,buildName:t.buildName,buildNumber:t.buildNumber,buildUrl:t.buildUrl,testEnvironment:t.testEnvironment,appName:t.appName,appVersion:t.appVersion,testType:t.testType}}async uploadReport(t){try{let r=await(0,T.uploadTestRun)({report:t,apiKey:this.config.apiKey,commitSha:this.config.commitSha,branch:this.config.branch,repositoryUrl:this.config.repositoryUrl,buildName:this.config.buildName,buildNumber:this.config.buildNumber,buildUrl:this.config.buildUrl,testEnvironment:this.config.testEnvironment,appName:this.config.appName,appVersion:this.config.appVersion,testType:this.config.testType});if(!r.success){if(this.config.failOnUploadError)throw new Error(r.error||"Upload failed");return r}let n=0;if(!r.alreadyExists&&r.testRunId&&r.testResults){let i=(0,T.mapAttachmentsToTestResults)(t.results.tests,r.testResults);i.length>0&&(n=await(0,T.uploadArtifacts)({reportId:r.reportId,apiKey:this.config.apiKey,testResults:i}))}return{...r,artifactCount:n}}catch(r){let n=r instanceof Error?r.message:String(r);if(this.config.failOnUploadError)throw new Error(`Failed to upload report: ${n}`);return{success:!1,reportId:(0,T.ensureReportId)(t),error:n}}}};var w=class{constructor(t){this.uploader=null;this.startTimestamp=0;if(this.config={uploadEnabled:!0,outputFile:"ctrf-report.json",outputDir:"ctrf",failOnUploadError:!1,testType:"unit",...t},this.config.uploadEnabled&&!this.config.apiKey)throw new Error("TestreamVitestReporter: apiKey is required when upload is enabled");let r=(0,O.detectCIContext)();!this.config.branch&&r.branch&&(this.config.branch=r.branch),!this.config.commitSha&&r.commitSha&&(this.config.commitSha=r.commitSha),!this.config.repositoryUrl&&r.repositoryUrl&&(this.config.repositoryUrl=r.repositoryUrl),!this.config.buildNumber&&r.buildNumber&&(this.config.buildNumber=r.buildNumber),!this.config.buildUrl&&r.buildUrl&&(this.config.buildUrl=r.buildUrl),this.reportPath=ae.join(this.config.outputDir,this.config.outputFile),this.config.uploadEnabled&&(this.uploader=new B(this.config))}onInit(t){t.config.includeTaskLocation!==!0&&(t.config.includeTaskLocation=!0)}onTestRunStart(t){this.startTimestamp=Date.now(),console.log(""),console.log("=".repeat(60)),console.log("Vitest Testream Reporter"),console.log("=".repeat(60)),this.config.uploadEnabled?(this.config.branch&&console.log(`Branch: ${this.config.branch}`),this.config.commitSha&&console.log(`Commit: ${this.config.commitSha.substring(0,7)}`),this.config.repositoryUrl&&console.log(`Repository: ${this.config.repositoryUrl}`)):console.log("Upload: Disabled"),console.log(`Report: ${this.reportPath}`),console.log("=".repeat(60)),console.log("")}async onTestRunEnd(t,r,n){let i=se(t,this.config,this.startTimestamp);await(0,O.enrichReportWithSourceSnippets)(i);try{await L.mkdir(this.config.outputDir,{recursive:!0}),await L.writeFile(this.reportPath,JSON.stringify(i,null,2))}catch(o){let a=o instanceof Error?o.message:String(o);console.error(`Failed to write CTRF report: ${a}`)}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{let o=await this.uploader.uploadReport(i);o.success?(console.log("=".repeat(60)),console.log("Upload Complete"),console.log("=".repeat(60)),console.log("")):(console.error("Upload completed with errors"),o.error&&console.error(`Error: ${o.error}`),o.errorCode&&console.error(`Error code: ${o.errorCode}`),console.error(""))}catch(o){let a=o instanceof Error?o.message:String(o);if(console.error(""),console.error("=".repeat(60)),console.error("Upload Failed"),console.error("=".repeat(60)),console.error(`Error: ${a}`),console.error(""),this.config.failOnUploadError)throw o}}};export{w as TestreamVitestReporter,w as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testream/vitest-reporter",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Vitest reporter to upload test results to Testream",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.mjs",
@@ -49,8 +49,8 @@
49
49
  "devDependencies": {
50
50
  "@jira-test-manager/shared-types": "*",
51
51
  "@vercel/ncc": "^0.38.1",
52
- "esbuild": "^0.24.0",
53
- "vitest": "^3.0.0",
52
+ "esbuild": "^0.28.1",
53
+ "vitest": "^4.1.9",
54
54
  "@types/node": "^20.10.6",
55
55
  "@typescript-eslint/eslint-plugin": "^6.17.0",
56
56
  "@typescript-eslint/parser": "^6.17.0",