@testrelic/playwright-analytics 2.9.0-next.67 → 2.9.0-next.68

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
@@ -2,9 +2,9 @@ import {randomUUID,createHash}from'crypto';import {mkdirSync,openSync,writeSync,
2
2
  `),false}}moveFile(e,r){try{renameSync(e,r);}catch{try{let{copyFileSync:n}=vn("fs");n(e,r);try{unlinkSync(e);}catch{}}catch(n){process.stderr.write(`[testrelic] Failed to move file ${e} \u2192 ${r}: ${n instanceof Error?n.message:String(n)}
3
3
  `);}}}writeIndex(e){let r=join(this.reportDir,"index.json"),n=r+".tmp",s=JSON.stringify(e);writeFileSync(n,s,"utf-8"),renameSync(n,r),this.totalBytesWritten+=Buffer.byteLength(s,"utf-8");}writeCompactIndex(e){let r=join(this.reportDir,"index-compact.json"),n=r+".tmp",s=e.map(({titlePath:o,project:i,...l})=>l),a=JSON.stringify(s);writeFileSync(n,a,"utf-8"),renameSync(n,r),this.totalBytesWritten+=Buffer.byteLength(a,"utf-8");}writeSummary(e){let r=join(this.reportDir,"summary.json"),n=r+".tmp",s=JSON.stringify(e);writeFileSync(n,s,"utf-8"),renameSync(n,r),this.totalBytesWritten+=Buffer.byteLength(s,"utf-8");}writeManifest(e){let r=join(this.reportDir,"manifest.json"),n=r+".tmp",s=JSON.stringify(e);writeFileSync(n,s,"utf-8"),renameSync(n,r),this.totalBytesWritten+=Buffer.byteLength(s,"utf-8");}computeTotalSize(){return this.totalBytesWritten}dispose(){}};var Bt=".testrelic",An="testrelic-config.json",_n=".testrelic",In=5,Ln=new Set(["__proto__","constructor","prototype"]),Ft=Object.freeze({apiKey:null,endpoint:"https://platform.testrelic.ai/api/v1",uploadStrategy:"batch",timeout:3e4,projectName:null,queueMaxAge:6048e5,queueDirectory:`${Bt}/queue`,uploadArtifacts:true,artifactMaxSizeMb:50}),Pn={s:1e3,m:60*1e3,h:3600*1e3,d:1440*60*1e3};function Ot(t){let e=resolve(t);for(let r=0;r<=In;r++){let n=join(e,Bt,An);if(existsSync(n))try{if(statSync(n).isFile())return n}catch{}let s=join(e,_n);if(existsSync(s))try{if(statSync(s).isFile())return process.stderr.write(`[testrelic] Deprecation: config file ".testrelic" has moved to ".testrelic/testrelic-config.json". Please migrate your config file to the new location.
4
4
  `),s}catch{}let a=dirname(e);if(a===e)break;e=a;}return null}function qt(t){try{let e=readFileSync(t,"utf-8"),r=JSON.parse(e);return typeof r!="object"||r===null||Array.isArray(r)||!Ht(r)?null:r}catch{return null}}function Ht(t){for(let e of Object.keys(t)){if(Ln.has(e))return false;let r=t[e];if(typeof r=="object"&&r!==null&&!Array.isArray(r)&&!Ht(r))return false}return true}function Ut(t){let e=/^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/.exec(t);if(e)return process.env[e[1]]??null;let r=/^\$([A-Za-z_][A-Za-z0-9_]*)$/.exec(t);return r?process.env[r[1]]??null:t}function Pe(t){let e=Object.create(null);for(let r of Object.keys(t)){let n=t[r];typeof n=="string"&&n.startsWith("$")?e[r]=Ut(n):typeof n=="object"&&n!==null&&!Array.isArray(n)?e[r]=Pe(n):e[r]=n;}return e}function Dt(t){let e=/^(\d+)\s*([smhd])$/.exec(t.trim());if(!e)return null;let r=parseInt(e[1],10),n=e[2],s=Pn[n];return !s||r<=0?null:r*s}function zt(t,e){let r=Object.create(null);if(Object.assign(r,Ft),t){let l=t.cloud;l&&typeof l=="object"&&(typeof l.endpoint=="string"&&(r.endpoint=l.endpoint),typeof l.upload=="string"&&(r.uploadStrategy=l.upload),typeof l.timeout=="number"&&(r.timeout=l.timeout),typeof l.apiKey=="string"&&l.apiKey.length>0&&(r.apiKey=l.apiKey));let d=t["testrelic-repo"]??t.project;d&&typeof d=="object"&&typeof d.name=="string"&&(r.projectName=d.name),t.project&&!t["testrelic-repo"]&&process.stderr.write(`[testrelic] Deprecation: "project" key in config is deprecated. Rename it to "testrelic-repo".
5
- `);let u=t.queue;if(u&&typeof u=="object"){if(typeof u.maxAge=="string"){let p=Dt(u.maxAge);p!==null&&(r.queueMaxAge=p);}typeof u.directory=="string"&&(r.queueDirectory=u.directory);}}if(e){if(typeof e.apiKey=="string"&&e.apiKey.length>0){let l=e.apiKey.startsWith("$")?Ut(e.apiKey):e.apiKey;l&&(r.apiKey=l);}if(typeof e.endpoint=="string"&&(r.endpoint=e.endpoint),typeof e.upload=="string"&&(r.uploadStrategy=e.upload),typeof e.timeout=="number"&&(r.timeout=e.timeout),typeof e.projectName=="string"&&(r.projectName=e.projectName),typeof e.queueMaxAge=="string"){let l=Dt(e.queueMaxAge);l!==null&&(r.queueMaxAge=l);}typeof e.queueDirectory=="string"&&(r.queueDirectory=e.queueDirectory),typeof e.uploadArtifacts=="boolean"&&(r.uploadArtifacts=e.uploadArtifacts),typeof e.artifactMaxSizeMb=="number"&&(r.artifactMaxSizeMb=e.artifactMaxSizeMb);}let n=process.env.TESTRELIC_API_KEY;n&&n.length>0&&(r.apiKey=n);let s=process.env.TESTRELIC_CLOUD_ENDPOINT;s&&isValidEndpointUrl(s)&&(r.endpoint=s);let a=process.env.TESTRELIC_UPLOAD_STRATEGY;a&&["batch","realtime","both"].includes(a)&&(r.uploadStrategy=a);let o=process.env.TESTRELIC_CLOUD_TIMEOUT;if(o){let l=parseInt(o,10);!isNaN(l)&&l>=1e3&&l<=12e4&&(r.timeout=l);}let i=Object.freeze(r);return isValidCloudConfig(i)?i:Ft}var Fn=[/AKIA[A-Z0-9]{16}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,/-----BEGIN\s+(RSA\s+)?PRIVATE\sKEY-----[\s\S]*?-----END/g,/\/\/[^:]+:[^@]+@/g],Dn=["authorization","cookie","set-cookie","x-api-key"],Bn=["password","secret","token","apiKey","api_key"];function jt(t){let e=Object.create(null);return e.trackApiCalls=t?.trackApiCalls??true,e.captureRequestHeaders=t?.captureRequestHeaders??true,e.captureResponseHeaders=t?.captureResponseHeaders??true,e.captureRequestBody=t?.captureRequestBody??true,e.captureResponseBody=t?.captureResponseBody??true,e.captureAssertions=t?.captureAssertions??true,e.redactHeaders=t?.redactHeaders??[...Dn],e.redactBodyFields=t?.redactBodyFields??[...Bn],e.apiIncludeUrls=t?.apiIncludeUrls??[],e.apiExcludeUrls=t?.apiExcludeUrls??[],Object.freeze(e)}function $t(t){if(t!==void 0&&!isValidConfig(t))throw createError(ErrorCode.CONFIG_INVALID,"Invalid reporter configuration");let e=Object.create(null);e.outputPath=t?.outputPath??"./test-results/analytics-timeline.json",e.includeStackTrace=t?.includeStackTrace??false,e.includeCodeSnippets=t?.includeCodeSnippets??true,e.codeContextLines=t?.codeContextLines??3,e.includeNetworkStats=t?.includeNetworkStats??true,e.navigationTypes=t?.navigationTypes??null,e.redactPatterns=[...Fn,...t?.redactPatterns??[]],e.testRunId=t?.testRunId??null,e.metadata=t?.metadata??null;let r=e.outputPath;e.openReport=t?.openReport??true,e.htmlReportPath=t?.htmlReportPath??r.replace(/\.json$/,".html"),e.includeArtifacts=t?.includeArtifacts??true,e.trackApiCalls=t?.trackApiCalls??true,e.quiet=t?.quiet??false,e.includeActionSteps=t?.includeActionSteps??true,e.captureConsoleLogs=t?.captureConsoleLogs??true;let n=Ot(process.cwd()),s=n?qt(n):null,a=s?Pe(s):null,o=zt(a,t?.cloud);return e.cloud=o.apiKey?o:null,e.reportMode=t?.reportMode??"streaming",e.streamingThreshold=t?.streamingThreshold??0,Object.freeze(e)}var ie="1.3.0";function Wt(t,e,r){try{let s=readFileSync(t,"utf-8").split(`
5
+ `);let u=t.queue;if(u&&typeof u=="object"){if(typeof u.maxAge=="string"){let p=Dt(u.maxAge);p!==null&&(r.queueMaxAge=p);}typeof u.directory=="string"&&(r.queueDirectory=u.directory);}}if(e){if(typeof e.apiKey=="string"&&e.apiKey.length>0){let l=e.apiKey.startsWith("$")?Ut(e.apiKey):e.apiKey;l&&(r.apiKey=l);}if(typeof e.endpoint=="string"&&(r.endpoint=e.endpoint),typeof e.upload=="string"&&(r.uploadStrategy=e.upload),typeof e.timeout=="number"&&(r.timeout=e.timeout),typeof e.projectName=="string"&&(r.projectName=e.projectName),typeof e.queueMaxAge=="string"){let l=Dt(e.queueMaxAge);l!==null&&(r.queueMaxAge=l);}typeof e.queueDirectory=="string"&&(r.queueDirectory=e.queueDirectory),typeof e.uploadArtifacts=="boolean"&&(r.uploadArtifacts=e.uploadArtifacts),typeof e.artifactMaxSizeMb=="number"&&(r.artifactMaxSizeMb=e.artifactMaxSizeMb);}let n=process.env.TESTRELIC_API_KEY;n&&n.length>0&&(r.apiKey=n);let s=process.env.TESTRELIC_CLOUD_ENDPOINT;s&&isValidEndpointUrl(s)&&(r.endpoint=s);let a=process.env.TESTRELIC_UPLOAD_STRATEGY;a&&["batch","realtime","both"].includes(a)&&(r.uploadStrategy=a);let o=process.env.TESTRELIC_CLOUD_TIMEOUT;if(o){let l=parseInt(o,10);!isNaN(l)&&l>=1e3&&l<=12e4&&(r.timeout=l);}let i=Object.freeze(r);return isValidCloudConfig(i)?i:Ft}var Fn=[/AKIA[A-Z0-9]{16}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,/-----BEGIN\s+(RSA\s+)?PRIVATE\sKEY-----[\s\S]*?-----END/g,/\/\/[^:]+:[^@]+@/g],Dn=["authorization","cookie","set-cookie","x-api-key"],Bn=["password","secret","token","apiKey","api_key"];function jt(t){let e=Object.create(null);return e.trackApiCalls=t?.trackApiCalls??true,e.captureRequestHeaders=t?.captureRequestHeaders??true,e.captureResponseHeaders=t?.captureResponseHeaders??true,e.captureRequestBody=t?.captureRequestBody??true,e.captureResponseBody=t?.captureResponseBody??true,e.captureAssertions=t?.captureAssertions??true,e.redactHeaders=t?.redactHeaders??[...Dn],e.redactBodyFields=t?.redactBodyFields??[...Bn],e.apiIncludeUrls=t?.apiIncludeUrls??[],e.apiExcludeUrls=t?.apiExcludeUrls??[],Object.freeze(e)}function $t(t){if(t!==void 0&&!isValidConfig(t))throw createError(ErrorCode.CONFIG_INVALID,"Invalid reporter configuration");let e=Object.create(null);e.outputPath=t?.outputPath??"./test-results/analytics-timeline.json",e.includeStackTrace=t?.includeStackTrace??false,e.includeCodeSnippets=t?.includeCodeSnippets??true,e.codeContextLines=t?.codeContextLines??3,e.includeNetworkStats=t?.includeNetworkStats??true,e.navigationTypes=t?.navigationTypes??null,e.redactPatterns=[...Fn,...t?.redactPatterns??[]],e.testRunId=t?.testRunId??null,e.metadata=t?.metadata??null;let r=e.outputPath;e.openReport=t?.openReport??true,e.htmlReportPath=t?.htmlReportPath??r.replace(/\.json$/,".html"),e.includeArtifacts=t?.includeArtifacts??true,e.trackApiCalls=t?.trackApiCalls??true,e.quiet=t?.quiet??false,e.includeActionSteps=t?.includeActionSteps??true,e.captureConsoleLogs=t?.captureConsoleLogs??true;let n=Ot(process.cwd()),s=n?qt(n):null,a=s?Pe(s):null,o=zt(a,t?.cloud);return e.cloud=o.apiKey?o:null,e.reportMode=t?.reportMode??"streaming",e.streamingThreshold=t?.streamingThreshold??0,Object.freeze(e)}var ie="1.3.0";function Vt(t,e,r){try{let s=readFileSync(t,"utf-8").split(`
6
6
  `);if(e<1||e>s.length)return null;let a=Math.max(1,e-r),o=Math.min(s.length,e+r),i=[];for(let l=a;l<=o;l++){let d=l===e?">":" ",u=String(l).padStart(String(o).length," ");i.push(`${d} ${u} | ${s[l-1]}`);}return i.join(`
7
- `)}catch{return null}}function Vt(t){return e=>{let r=e;for(let n of t)if(typeof n=="string"){let s=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");r=r.replace(new RegExp(s,"g"),"[REDACTED]");}else {let s=n.flags.includes("g")?n.flags:n.flags+"g",a=new RegExp(n.source,s);r=r.replace(a,"[REDACTED]");}return r}}function qn(t){return t.GITHUB_ACTIONS!=="true"?null:{provider:"github-actions",buildId:t.GITHUB_RUN_ID??null,commitSha:t.GITHUB_SHA??null,branch:t.GITHUB_REF_NAME??null,runUrl:t.GITHUB_SERVER_URL&&t.GITHUB_REPOSITORY&&t.GITHUB_RUN_ID?`${t.GITHUB_SERVER_URL}/${t.GITHUB_REPOSITORY}/actions/runs/${t.GITHUB_RUN_ID}`:null}}function Hn(t){return t.GITLAB_CI!=="true"?null:{provider:"gitlab-ci",buildId:t.CI_PIPELINE_ID??null,commitSha:t.CI_COMMIT_SHA??null,branch:t.CI_COMMIT_BRANCH??t.CI_COMMIT_REF_NAME??null,runUrl:t.CI_PIPELINE_URL??null}}function Un(t){if(!t.JENKINS_URL)return null;let e=t.GIT_BRANCH??null;return e?.startsWith("origin/")&&(e=e.slice(7)),{provider:"jenkins",buildId:t.BUILD_ID??null,commitSha:t.GIT_COMMIT??null,branch:e,runUrl:t.BUILD_URL??null}}function zn(t){return t.CIRCLECI!=="true"?null:{provider:"circleci",buildId:t.CIRCLE_BUILD_NUM??null,commitSha:t.CIRCLE_SHA1??null,branch:t.CIRCLE_BRANCH??null,runUrl:t.CIRCLE_BUILD_URL??null}}function jn(t){if(!t.BITBUCKET_PIPELINE_UUID)return null;let e=t.BITBUCKET_WORKSPACE&&t.BITBUCKET_REPO_SLUG&&t.BITBUCKET_PIPELINE_UUID?`https://bitbucket.org/${t.BITBUCKET_WORKSPACE}/${t.BITBUCKET_REPO_SLUG}/pipelines/results/${t.BITBUCKET_PIPELINE_UUID}`:null;return {provider:"bitbucket-pipelines",buildId:t.BITBUCKET_BUILD_NUMBER??null,commitSha:t.BITBUCKET_COMMIT??null,branch:t.BITBUCKET_BRANCH??null,runUrl:e}}var $n=[qn,Hn,Un,zn,jn];function F(t){let e=process.env;for(let r of $n){let n=r(e);if(n)return n}return null}var Ee=`
7
+ `)}catch{return null}}function Wt(t){return e=>{let r=e;for(let n of t)if(typeof n=="string"){let s=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");r=r.replace(new RegExp(s,"g"),"[REDACTED]");}else {let s=n.flags.includes("g")?n.flags:n.flags+"g",a=new RegExp(n.source,s);r=r.replace(a,"[REDACTED]");}return r}}function qn(t){return t.GITHUB_ACTIONS!=="true"?null:{provider:"github-actions",buildId:t.GITHUB_RUN_ID??null,commitSha:t.GITHUB_SHA??null,branch:t.GITHUB_REF_NAME??null,runUrl:t.GITHUB_SERVER_URL&&t.GITHUB_REPOSITORY&&t.GITHUB_RUN_ID?`${t.GITHUB_SERVER_URL}/${t.GITHUB_REPOSITORY}/actions/runs/${t.GITHUB_RUN_ID}`:null}}function Hn(t){return t.GITLAB_CI!=="true"?null:{provider:"gitlab-ci",buildId:t.CI_PIPELINE_ID??null,commitSha:t.CI_COMMIT_SHA??null,branch:t.CI_COMMIT_BRANCH??t.CI_COMMIT_REF_NAME??null,runUrl:t.CI_PIPELINE_URL??null}}function Un(t){if(!t.JENKINS_URL)return null;let e=t.GIT_BRANCH??null;return e?.startsWith("origin/")&&(e=e.slice(7)),{provider:"jenkins",buildId:t.BUILD_ID??null,commitSha:t.GIT_COMMIT??null,branch:e,runUrl:t.BUILD_URL??null}}function zn(t){return t.CIRCLECI!=="true"?null:{provider:"circleci",buildId:t.CIRCLE_BUILD_NUM??null,commitSha:t.CIRCLE_SHA1??null,branch:t.CIRCLE_BRANCH??null,runUrl:t.CIRCLE_BUILD_URL??null}}function jn(t){if(!t.BITBUCKET_PIPELINE_UUID)return null;let e=t.BITBUCKET_WORKSPACE&&t.BITBUCKET_REPO_SLUG&&t.BITBUCKET_PIPELINE_UUID?`https://bitbucket.org/${t.BITBUCKET_WORKSPACE}/${t.BITBUCKET_REPO_SLUG}/pipelines/results/${t.BITBUCKET_PIPELINE_UUID}`:null;return {provider:"bitbucket-pipelines",buildId:t.BITBUCKET_BUILD_NUMBER??null,commitSha:t.BITBUCKET_COMMIT??null,branch:t.BITBUCKET_BRANCH??null,runUrl:e}}var $n=[qn,Hn,Un,zn,jn];function F(t){let e=process.env;for(let r of $n){let n=r(e);if(n)return n}return null}var Ee=`
8
8
  /* Theme Variables */
9
9
  :root,[data-theme="dark"]{
10
10
  --bg:#0f1117;--bg-1:#161b22;--bg-2:#1c2128;--bg-3:#21262d;--bg-code:#13111c;
@@ -2314,7 +2314,7 @@ function _updateCard(cls,val){
2314
2314
  if(i>=sizes.length)i=sizes.length-1;
2315
2315
  return parseFloat((bytes/Math.pow(k,i)).toFixed(1))+' '+sizes[i];
2316
2316
  }
2317
- `;var Wn=`
2317
+ `;var Vn=`
2318
2318
  (function(){
2319
2319
  var data=JSON.parse(document.getElementById('report-data').textContent);
2320
2320
  ${Fe}
@@ -2385,7 +2385,7 @@ ${""}
2385
2385
  </aside>
2386
2386
  <script id="report-data" type="application/json">${n}</script>
2387
2387
  ${s?`<script id="artifact-manifest-data" type="application/json">${s}</script>`:""}
2388
- <script>${Wn}</script>
2388
+ <script>${Vn}</script>
2389
2389
  </body>
2390
2390
  </html>`}function ze(t,e,r,n){let s=t.replace(/<\//g,"<\\/"),a=e.replace(/<\//g,"<\\/"),o=n?n.replace(/<\//g,"<\\/"):null,i={};try{i=JSON.parse(t);}catch{}let l=`{
2391
2391
  "schemaVersion":"2.0",
@@ -2545,7 +2545,7 @@ ${o?`<script id="artifact-manifest-data" type="application/json">${o}</script>`:
2545
2545
  </body>
2546
2546
  </html>`}function je(t){try{let e=process.platform,r;e==="darwin"?r=`open "${t}"`:e==="win32"?r=`start "" "${t}"`:r=`xdg-open "${t}"`,exec(r,n=>{n&&process.stderr.write(`[testrelic] Failed to open browser: ${n.message}
2547
2547
  `);});}catch{}}var Jt=join(tmpdir(),"testrelic-data"),M=class{constructor(e){this.count=0;this.closed=false;mkdirSync(Jt,{recursive:true}),this.filePath=join(Jt,`${e}-${randomUUID().substring(0,8)}.jsonl`),this.fd=openSync(this.filePath,"w");}append(e){if(this.closed)return;let r=JSON.stringify(e)+`
2548
- `;writeSync(this.fd,r),this.count++;}getPath(){return this.filePath}getCount(){return this.count}close(){if(!this.closed){this.closed=true;try{closeSync(this.fd);}catch{}}}cleanup(){try{unlinkSync(this.filePath);}catch{}}};async function Yt(t,e,r,n){let s=(e-1)*r,a=[],o=0,i=createInterface({input:createReadStream(t,{encoding:"utf-8"}),crlfDelay:1/0});for await(let u of i)if(u.length!==0){if(o>=s&&a.length<r)try{a.push(JSON.parse(u));}catch{}if(o++,a.length>=r&&n!==void 0)break}let l=n??o,d=Math.max(1,Math.ceil(l/r));return {items:a,total:l,page:e,pageSize:r,totalPages:d}}var Qt=/^[a-f0-9]{12}$/,$e=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,er=500;function x(t,e,r){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(r));}function tr(t){t.setHeader("Access-Control-Allow-Origin","*"),t.setHeader("Access-Control-Allow-Methods","GET, DELETE, OPTIONS"),t.setHeader("Access-Control-Allow-Headers","Content-Type");}function de(t){try{return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):null}catch{return null}}function ce(t){let e=0;try{let r=readdirSync(t,{withFileTypes:!0});for(let n of r){let s=join(t,n.name);n.isFile()?e+=statSync(s).size:n.isDirectory()&&(e+=ce(s));}}catch{}return e}function rr(t,e,r,n){let s=de(join(r,"index.json"));x(e,200,{status:"ok",reportMode:"streaming",testCount:s?.length??0,uptime:Math.floor((Date.now()-n)/1e3)});}function nr(t,e,r){let n=de(join(r,"summary.json"));if(!n){x(e,404,{error:"Summary not found"});return}x(e,200,n);}function sr(t,e,r){let n=de(join(r,"index.json"));if(!n){x(e,404,{error:"Test index not found"});return}let a=new URL(t.url??"/",`http://${t.headers.host}`).searchParams,o=Math.max(1,parseInt(a.get("page")??"1",10)||1),i=Math.min(er,Math.max(1,parseInt(a.get("pageSize")??"100",10)||100)),l=a.get("status")?.split(",").filter(Boolean)??null,d=a.get("file")??null,u=a.get("search")?.toLowerCase()??null,p=a.get("tag")?.split(",").filter(Boolean)??null,f=a.get("sort")??"file",c=a.get("order")==="desc"?-1:1,g=n;l&&l.length>0&&(g=g.filter(y=>l.includes(y.status))),d&&(g=g.filter(y=>y.filePath===d||y.filePath.startsWith(d+"/"))),u&&(g=g.filter(y=>y.title.toLowerCase().includes(u)||y.filePath.toLowerCase().includes(u))),p&&p.length>0&&(g=g.filter(y=>p.some(b=>y.tags.includes(b)))),g=[...g].sort((y,b)=>{let C=0;switch(f){case "duration":C=y.duration-b.duration;break;case "status":C=y.status.localeCompare(b.status);break;case "title":C=y.title.localeCompare(b.title);break;default:C=y.filePath.localeCompare(b.filePath);break}return C*c});let h=g.length,m=Math.max(1,Math.ceil(h/i)),w=(o-1)*i,T=g.slice(w,w+i);x(e,200,{tests:T,pagination:{page:o,pageSize:i,totalItems:h,totalPages:m},filters:{status:l,file:d,search:u,tag:p}});}function ar(t,e,r,n){if(!Qt.test(n)){x(e,400,{error:"Invalid test ID format"});return}let s=join(r,"tests",n,"meta.json"),a=join(r,"tests",`${n}.json`),o=existsSync(s)?s:existsSync(a)?a:null;if(!o){x(e,404,{error:`Test not found: ${n}`});return}try{let i=readFileSync(o,"utf-8");e.writeHead(200,{"Content-Type":"application/json"}),e.end(i);}catch(i){x(e,500,{error:i instanceof Error?i.message:String(i)});}}async function ir(t,e,r,n,s){if(!Qt.test(n)){x(e,400,{error:"Invalid test ID format"});return}let o=join(r,"tests",n,{network:"network.jsonl",console:"console.jsonl","api-calls":"api-calls.jsonl"}[s]);if(!existsSync(o)){x(e,200,{items:[],total:0,page:1,pageSize:50,totalPages:0});return}try{let l=new URL(t.url??"/",`http://${t.headers.host}`).searchParams,d=Math.max(1,parseInt(l.get("page")??"1",10)||1),u=Math.min(er,Math.max(1,parseInt(l.get("pageSize")??"50",10)||50)),p,f=join(r,"tests",n,"meta.json");if(existsSync(f))try{let g=JSON.parse(readFileSync(f,"utf-8"));switch(s){case "network":p=g.networkRequestsCount;break;case "console":p=g.consoleLogsCount;break;case "api-calls":p=g.apiCallsCount;break}}catch{}let c=await Yt(o,d,u,p);x(e,200,c);}catch(i){x(e,500,{error:i instanceof Error?i.message:String(i)});}}function or(t,e,r){let n=de(join(r,"index.json"));if(!n){x(e,404,{error:"Test index not found"});return}let s=new Map;for(let o of n){if(o.isRetry)continue;let i=s.get(o.filePath);switch(i||(i={total:0,passed:0,failed:0,flaky:0,skipped:0,timedOut:0},s.set(o.filePath,i)),i.total++,o.status){case "passed":i.passed++;break;case "failed":i.failed++;break;case "flaky":i.flaky++;break;case "skipped":i.skipped++;break;case "timedout":i.timedOut++;break}}let a=Array.from(s.entries()).map(([o,i])=>({filePath:o,...i})).sort((o,i)=>o.filePath.localeCompare(i.filePath));x(e,200,{files:a});}function lr(t,e,r){if(!existsSync(r)){x(e,200,{runs:[],totalSizeBytes:0});return}try{let n=[],s=0,a=readdirSync(r,{withFileTypes:!0});for(let o of a){if(!o.isDirectory()||!$e.test(o.name))continue;let i=join(r,o.name),l=ce(i),d=readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory());n.push({folderName:o.name,totalSizeBytes:l,testCount:d.length}),s+=l;}n.sort((o,i)=>i.folderName.localeCompare(o.folderName)),x(e,200,{runs:n,totalSizeBytes:s});}catch(n){x(e,500,{error:n instanceof Error?n.message:String(n)});}}function dr(t,e,r){try{let n=0,s=0;if(existsSync(r)){let a=readdirSync(r,{withFileTypes:!0});for(let o of a){if(!o.isDirectory()||!$e.test(o.name))continue;let i=join(r,o.name),l=ce(i);rmSync(i,{recursive:!0,force:!0}),s+=l,n++;}}x(e,200,{deletedCount:n,freedBytes:s});}catch(n){x(e,500,{error:n instanceof Error?n.message:String(n)});}}function cr(t,e,r,n){if(!$e.test(n)){x(e,400,{error:"Invalid folder name"});return}let s=join(r,n);try{if(!statSync(s).isDirectory()){x(e,404,{error:"Not found"});return}}catch{x(e,404,{error:"Not found"});return}try{let a=ce(s);rmSync(s,{recursive:!0,force:!0}),x(e,200,{deleted:n,freedBytes:a});}catch(a){x(e,500,{error:a instanceof Error?a.message:String(a)});}}function ur(t,e,r){x(e,200,{status:"shutting_down"}),r.close();}function We(t,e,r){if(!existsSync(r)){x(e,404,{error:"File not found"});return}try{let n=readFileSync(r),s=extname(r).toLowerCase(),a=ns[s]??"application/octet-stream";e.writeHead(200,{"Content-Type":a}),e.end(n);}catch(n){x(e,500,{error:n instanceof Error?n.message:String(n)});}}var ns={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".webm":"video/webm",".mp4":"video/mp4",".json":"application/json",".html":"text/html",".css":"text/css",".js":"text/javascript",".svg":"image/svg+xml"};var os=9323,ls=10,ds=1800*1e3;function X(t,e){return new Promise((r,n)=>{let s=e?.port??os,a=Date.now(),o,i=0,l=existsSync(join(t,"artifacts"))?join(t,"artifacts"):existsSync(join(t,"..","artifacts"))?join(t,"..","artifacts"):join(t,"artifacts");function d(){clearTimeout(o),o=setTimeout(()=>{p.close();},ds);}let u=e?.htmlPath??null;if(!u){let c=dirname(t);try{let g=readdirSync(c).find(h=>h.endsWith(".html"));g&&(u=join(c,g));}catch{}}let p=createServer((c,g)=>{if(d(),tr(g),c.method==="OPTIONS"){g.writeHead(204),g.end();return}let h;try{h=new URL(c.url??"/",`http://${c.headers.host??"localhost"}`).pathname;}catch{x(g,400,{error:"Invalid URL"});return}if(c.method==="GET"&&(h==="/"||h==="/index.html")){if(u&&existsSync(u)){We(c,g,u);return}x(g,404,{error:"HTML report not found"});return}if(c.method==="GET"&&h==="/api/health"){rr(c,g,t,a);return}if(c.method==="GET"&&h==="/api/summary"){nr(c,g,t);return}if(c.method==="GET"&&h==="/api/tests"){sr(c,g,t);return}if(c.method==="GET"&&h==="/api/files"){or(c,g,t);return}let m=h.match(/^\/api\/tests\/([a-f0-9]+)\/(network|console|api-calls)$/);if(c.method==="GET"&&m){ir(c,g,t,m[1],m[2]);return}let w=h.match(/^\/api\/tests\/([a-f0-9]+)$/);if(c.method==="GET"&&w){ar(c,g,t,w[1]);return}if(c.method==="GET"&&h==="/api/artifacts"){lr(c,g,l);return}if(c.method==="DELETE"&&h==="/api/artifacts"){dr(c,g,l);return}let T=h.match(/^\/api\/artifacts\/(.+)$/);if(c.method==="DELETE"&&T){cr(c,g,l,decodeURIComponent(T[1]));return}if(c.method==="GET"&&h.startsWith("/artifacts/")){let y=decodeURIComponent(h.slice(11));if(y.includes("..")||y.includes("\0")){x(g,400,{error:"Invalid path"});return}We(c,g,join(l,y));return}if(c.method==="POST"&&h==="/api/shutdown"){ur(c,g,p);return}x(g,404,{error:"Not found"});});function f(c){let g=h=>{h.code==="EADDRINUSE"&&i<ls?(i++,f(c+1)):n(h);};p.once("error",g),p.listen(c,"127.0.0.1",()=>{p.removeListener("error",g);let h=p.address();if(!h||typeof h=="string"){n(new Error("Failed to get server address"));return}d(),r({port:h.port,dispose:()=>new Promise(m=>{clearTimeout(o),p.close(()=>m());})});});}f(s);})}async function pr(t){let e=await X(t);return {port:e.port,dispose:e.dispose}}function ps(t,e,r){let n=JSON.stringify(t),s=r?JSON.stringify(r):null;return Gt(n,e,s)}async function Ge(t,e,r){try{let n=null,s=null,a=e.reportMode==="streaming"||e.reportMode==="auto"&&t.timeline.length===0&&t.summary.total>=e.streamingThreshold,o,i=e.htmlReportPath,l=dirname(i);mkdirSync(l,{recursive:!0});let d="",u="[]",p=null;if(a){d=JSON.stringify(t.summary);let c=dirname(e.outputPath),g=join(c,".testrelic-report");try{let h=join(g,"index-compact.json"),m=join(g,"index.json");existsSync(h)?u=readFileSync(h,"utf-8"):existsSync(m)&&(u=readFileSync(m,"utf-8"));}catch{}p=r?JSON.stringify(r):null,o=ze(d,u,null,p);}else o=ps(t,null,r);let f=i+".tmp";if(writeFileSync(f,o,"utf-8"),renameSync(f,i),a){if(t.ci===null){let c=dirname(e.outputPath),g=join(c,".testrelic-report"),h=resolve(i);try{if(await gs(),n=await hs(g),!n){s=await X(g,{htmlPath:h}),n=s.port;let m=setInterval(()=>{},6e4),w=()=>{clearInterval(m),s?.dispose();};process.on("SIGINT",w),process.on("SIGTERM",w),setTimeout(w,1800*1e3).unref();}if(n){process.stderr.write(`
2548
+ `;writeSync(this.fd,r),this.count++;}getPath(){return this.filePath}getCount(){return this.count}close(){if(!this.closed){this.closed=true;try{closeSync(this.fd);}catch{}}}cleanup(){try{unlinkSync(this.filePath);}catch{}}};async function Yt(t,e,r,n){let s=(e-1)*r,a=[],o=0,i=createInterface({input:createReadStream(t,{encoding:"utf-8"}),crlfDelay:1/0});for await(let u of i)if(u.length!==0){if(o>=s&&a.length<r)try{a.push(JSON.parse(u));}catch{}if(o++,a.length>=r&&n!==void 0)break}let l=n??o,d=Math.max(1,Math.ceil(l/r));return {items:a,total:l,page:e,pageSize:r,totalPages:d}}var Qt=/^[a-f0-9]{12}$/,$e=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,er=500;function x(t,e,r){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(r));}function tr(t){t.setHeader("Access-Control-Allow-Origin","*"),t.setHeader("Access-Control-Allow-Methods","GET, DELETE, OPTIONS"),t.setHeader("Access-Control-Allow-Headers","Content-Type");}function de(t){try{return existsSync(t)?JSON.parse(readFileSync(t,"utf-8")):null}catch{return null}}function ce(t){let e=0;try{let r=readdirSync(t,{withFileTypes:!0});for(let n of r){let s=join(t,n.name);n.isFile()?e+=statSync(s).size:n.isDirectory()&&(e+=ce(s));}}catch{}return e}function rr(t,e,r,n){let s=de(join(r,"index.json"));x(e,200,{status:"ok",reportMode:"streaming",testCount:s?.length??0,uptime:Math.floor((Date.now()-n)/1e3)});}function nr(t,e,r){let n=de(join(r,"summary.json"));if(!n){x(e,404,{error:"Summary not found"});return}x(e,200,n);}function sr(t,e,r){let n=de(join(r,"index.json"));if(!n){x(e,404,{error:"Test index not found"});return}let a=new URL(t.url??"/",`http://${t.headers.host}`).searchParams,o=Math.max(1,parseInt(a.get("page")??"1",10)||1),i=Math.min(er,Math.max(1,parseInt(a.get("pageSize")??"100",10)||100)),l=a.get("status")?.split(",").filter(Boolean)??null,d=a.get("file")??null,u=a.get("search")?.toLowerCase()??null,p=a.get("tag")?.split(",").filter(Boolean)??null,f=a.get("sort")??"file",c=a.get("order")==="desc"?-1:1,g=n;l&&l.length>0&&(g=g.filter(y=>l.includes(y.status))),d&&(g=g.filter(y=>y.filePath===d||y.filePath.startsWith(d+"/"))),u&&(g=g.filter(y=>y.title.toLowerCase().includes(u)||y.filePath.toLowerCase().includes(u))),p&&p.length>0&&(g=g.filter(y=>p.some(b=>y.tags.includes(b)))),g=[...g].sort((y,b)=>{let C=0;switch(f){case "duration":C=y.duration-b.duration;break;case "status":C=y.status.localeCompare(b.status);break;case "title":C=y.title.localeCompare(b.title);break;default:C=y.filePath.localeCompare(b.filePath);break}return C*c});let h=g.length,m=Math.max(1,Math.ceil(h/i)),w=(o-1)*i,T=g.slice(w,w+i);x(e,200,{tests:T,pagination:{page:o,pageSize:i,totalItems:h,totalPages:m},filters:{status:l,file:d,search:u,tag:p}});}function ar(t,e,r,n){if(!Qt.test(n)){x(e,400,{error:"Invalid test ID format"});return}let s=join(r,"tests",n,"meta.json"),a=join(r,"tests",`${n}.json`),o=existsSync(s)?s:existsSync(a)?a:null;if(!o){x(e,404,{error:`Test not found: ${n}`});return}try{let i=readFileSync(o,"utf-8");e.writeHead(200,{"Content-Type":"application/json"}),e.end(i);}catch(i){x(e,500,{error:i instanceof Error?i.message:String(i)});}}async function ir(t,e,r,n,s){if(!Qt.test(n)){x(e,400,{error:"Invalid test ID format"});return}let o=join(r,"tests",n,{network:"network.jsonl",console:"console.jsonl","api-calls":"api-calls.jsonl"}[s]);if(!existsSync(o)){x(e,200,{items:[],total:0,page:1,pageSize:50,totalPages:0});return}try{let l=new URL(t.url??"/",`http://${t.headers.host}`).searchParams,d=Math.max(1,parseInt(l.get("page")??"1",10)||1),u=Math.min(er,Math.max(1,parseInt(l.get("pageSize")??"50",10)||50)),p,f=join(r,"tests",n,"meta.json");if(existsSync(f))try{let g=JSON.parse(readFileSync(f,"utf-8"));switch(s){case "network":p=g.networkRequestsCount;break;case "console":p=g.consoleLogsCount;break;case "api-calls":p=g.apiCallsCount;break}}catch{}let c=await Yt(o,d,u,p);x(e,200,c);}catch(i){x(e,500,{error:i instanceof Error?i.message:String(i)});}}function or(t,e,r){let n=de(join(r,"index.json"));if(!n){x(e,404,{error:"Test index not found"});return}let s=new Map;for(let o of n){if(o.isRetry)continue;let i=s.get(o.filePath);switch(i||(i={total:0,passed:0,failed:0,flaky:0,skipped:0,timedOut:0},s.set(o.filePath,i)),i.total++,o.status){case "passed":i.passed++;break;case "failed":i.failed++;break;case "flaky":i.flaky++;break;case "skipped":i.skipped++;break;case "timedout":i.timedOut++;break}}let a=Array.from(s.entries()).map(([o,i])=>({filePath:o,...i})).sort((o,i)=>o.filePath.localeCompare(i.filePath));x(e,200,{files:a});}function lr(t,e,r){if(!existsSync(r)){x(e,200,{runs:[],totalSizeBytes:0});return}try{let n=[],s=0,a=readdirSync(r,{withFileTypes:!0});for(let o of a){if(!o.isDirectory()||!$e.test(o.name))continue;let i=join(r,o.name),l=ce(i),d=readdirSync(i,{withFileTypes:!0}).filter(u=>u.isDirectory());n.push({folderName:o.name,totalSizeBytes:l,testCount:d.length}),s+=l;}n.sort((o,i)=>i.folderName.localeCompare(o.folderName)),x(e,200,{runs:n,totalSizeBytes:s});}catch(n){x(e,500,{error:n instanceof Error?n.message:String(n)});}}function dr(t,e,r){try{let n=0,s=0;if(existsSync(r)){let a=readdirSync(r,{withFileTypes:!0});for(let o of a){if(!o.isDirectory()||!$e.test(o.name))continue;let i=join(r,o.name),l=ce(i);rmSync(i,{recursive:!0,force:!0}),s+=l,n++;}}x(e,200,{deletedCount:n,freedBytes:s});}catch(n){x(e,500,{error:n instanceof Error?n.message:String(n)});}}function cr(t,e,r,n){if(!$e.test(n)){x(e,400,{error:"Invalid folder name"});return}let s=join(r,n);try{if(!statSync(s).isDirectory()){x(e,404,{error:"Not found"});return}}catch{x(e,404,{error:"Not found"});return}try{let a=ce(s);rmSync(s,{recursive:!0,force:!0}),x(e,200,{deleted:n,freedBytes:a});}catch(a){x(e,500,{error:a instanceof Error?a.message:String(a)});}}function ur(t,e,r){x(e,200,{status:"shutting_down"}),r.close();}function Ve(t,e,r){if(!existsSync(r)){x(e,404,{error:"File not found"});return}try{let n=readFileSync(r),s=extname(r).toLowerCase(),a=ns[s]??"application/octet-stream";e.writeHead(200,{"Content-Type":a}),e.end(n);}catch(n){x(e,500,{error:n instanceof Error?n.message:String(n)});}}var ns={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".webm":"video/webm",".mp4":"video/mp4",".json":"application/json",".html":"text/html",".css":"text/css",".js":"text/javascript",".svg":"image/svg+xml"};var os=9323,ls=10,ds=1800*1e3;function X(t,e){return new Promise((r,n)=>{let s=e?.port??os,a=Date.now(),o,i=0,l=existsSync(join(t,"artifacts"))?join(t,"artifacts"):existsSync(join(t,"..","artifacts"))?join(t,"..","artifacts"):join(t,"artifacts");function d(){clearTimeout(o),o=setTimeout(()=>{p.close();},ds);}let u=e?.htmlPath??null;if(!u){let c=dirname(t);try{let g=readdirSync(c).find(h=>h.endsWith(".html"));g&&(u=join(c,g));}catch{}}let p=createServer((c,g)=>{if(d(),tr(g),c.method==="OPTIONS"){g.writeHead(204),g.end();return}let h;try{h=new URL(c.url??"/",`http://${c.headers.host??"localhost"}`).pathname;}catch{x(g,400,{error:"Invalid URL"});return}if(c.method==="GET"&&(h==="/"||h==="/index.html")){if(u&&existsSync(u)){Ve(c,g,u);return}x(g,404,{error:"HTML report not found"});return}if(c.method==="GET"&&h==="/api/health"){rr(c,g,t,a);return}if(c.method==="GET"&&h==="/api/summary"){nr(c,g,t);return}if(c.method==="GET"&&h==="/api/tests"){sr(c,g,t);return}if(c.method==="GET"&&h==="/api/files"){or(c,g,t);return}let m=h.match(/^\/api\/tests\/([a-f0-9]+)\/(network|console|api-calls)$/);if(c.method==="GET"&&m){ir(c,g,t,m[1],m[2]);return}let w=h.match(/^\/api\/tests\/([a-f0-9]+)$/);if(c.method==="GET"&&w){ar(c,g,t,w[1]);return}if(c.method==="GET"&&h==="/api/artifacts"){lr(c,g,l);return}if(c.method==="DELETE"&&h==="/api/artifacts"){dr(c,g,l);return}let T=h.match(/^\/api\/artifacts\/(.+)$/);if(c.method==="DELETE"&&T){cr(c,g,l,decodeURIComponent(T[1]));return}if(c.method==="GET"&&h.startsWith("/artifacts/")){let y=decodeURIComponent(h.slice(11));if(y.includes("..")||y.includes("\0")){x(g,400,{error:"Invalid path"});return}Ve(c,g,join(l,y));return}if(c.method==="POST"&&h==="/api/shutdown"){ur(c,g,p);return}x(g,404,{error:"Not found"});});function f(c){let g=h=>{h.code==="EADDRINUSE"&&i<ls?(i++,f(c+1)):n(h);};p.once("error",g),p.listen(c,"127.0.0.1",()=>{p.removeListener("error",g);let h=p.address();if(!h||typeof h=="string"){n(new Error("Failed to get server address"));return}d(),r({port:h.port,dispose:()=>new Promise(m=>{clearTimeout(o),p.close(()=>m());})});});}f(s);})}async function pr(t){let e=await X(t);return {port:e.port,dispose:e.dispose}}function ps(t,e,r){let n=JSON.stringify(t),s=r?JSON.stringify(r):null;return Gt(n,e,s)}async function Ge(t,e,r){try{let n=null,s=null,a=e.reportMode==="streaming"||e.reportMode==="auto"&&t.timeline.length===0&&t.summary.total>=e.streamingThreshold,o,i=e.htmlReportPath,l=dirname(i);mkdirSync(l,{recursive:!0});let d="",u="[]",p=null;if(a){d=JSON.stringify(t.summary);let c=dirname(e.outputPath),g=join(c,".testrelic-report");try{let h=join(g,"index-compact.json"),m=join(g,"index.json");existsSync(h)?u=readFileSync(h,"utf-8"):existsSync(m)&&(u=readFileSync(m,"utf-8"));}catch{}p=r?JSON.stringify(r):null,o=ze(d,u,null,p);}else o=ps(t,null,r);let f=i+".tmp";if(writeFileSync(f,o,"utf-8"),renameSync(f,i),a){if(t.ci===null){let c=dirname(e.outputPath),g=join(c,".testrelic-report"),h=resolve(i);try{if(await gs(),n=await hs(g),!n){s=await X(g,{htmlPath:h}),n=s.port;let m=setInterval(()=>{},6e4),w=()=>{clearInterval(m),s?.dispose();};process.on("SIGINT",w),process.on("SIGTERM",w),setTimeout(w,1800*1e3).unref();}if(n){process.stderr.write(`
2549
2549
  Report server: http://127.0.0.1:${n}
2550
2550
  `);try{let m=ze(d,u,n,p),w=i+".tmp";writeFileSync(w,m,"utf-8"),renameSync(w,i);}catch{}}}catch{}}}else if(e.openReport&&t.ci===null&&e.includeArtifacts){let c=dirname(e.outputPath),g=join(c,"artifacts");if(existsSync(g))try{let h=await pr(g);n=h.port,process.on("exit",()=>{h.dispose();});}catch{}}if(e.openReport&&t.ci===null)if(a&&n)je(`http://127.0.0.1:${n}`);else {let c=resolve(i);je(c);}}catch(n){process.stderr.write(`[testrelic] Failed to write HTML report: ${n instanceof Error?n.message:String(n)}
2551
2551
  `);}}var fe=9323,yr=10;async function fs(){for(let t=fe;t<fe+yr;t++)try{let e=new AbortController,r=setTimeout(()=>e.abort(),500),n=await fetch(`http://127.0.0.1:${t}/api/health`,{signal:e.signal});if(clearTimeout(r),n.ok)return t}catch{}return null}async function gs(){for(let t=fe;t<fe+yr;t++)try{let e=new AbortController,r=setTimeout(()=>e.abort(),1e3);await fetch(`http://127.0.0.1:${t}/api/shutdown`,{method:"POST",signal:e.signal}),clearTimeout(r);}catch{}await new Promise(t=>setTimeout(t,300));}async function hs(t){let r=[join(__dirname,"cli.cjs"),join(__dirname,"cli.js"),join(__dirname,"..","dist","cli.cjs"),join(__dirname,"..","dist","cli.js")].find(n=>existsSync(n));if(!r){let n=await X(t);return process.on("exit",()=>{n?.dispose();}),n.port}return new Promise(n=>{let s=spawn(process.execPath,[r,"serve",t],{detached:true,stdio:["ignore","ignore","pipe"],env:{...process.env}}),a="",o=false,i=setTimeout(()=>{o||(o=true,s.stderr?.removeAllListeners(),fs().then(n));},5e3);s.stderr?.on("data",l=>{a+=l.toString();let d=a.match(/127\.0\.0\.1:(\d+)/);d&&!o&&(o=true,clearTimeout(i),s.stderr?.removeAllListeners(),s.unref(),n(Number(d[1])));}),s.on("error",()=>{o||(o=true,clearTimeout(i),n(null));}),s.on("exit",()=>{o||(o=true,clearTimeout(i),n(null));}),s.unref();})}var vs=20,Je=0,Ke=[];async function br(t,e){Je>=vs&&await new Promise(r=>Ke.push(r)),Je++;try{return await copyFile(t,e),!0}catch{return false}finally{Je--,Ke.length>0&&Ke.shift()();}}var ee=[];async function wr(){ee.length!==0&&(await Promise.allSettled(ee),ee.length=0);}function xr(t){let e=new Date,r=a=>String(a).padStart(2,"0"),n=`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())}T${r(e.getHours())}-${r(e.getMinutes())}-${r(e.getSeconds())}`;if(!existsSync(join(t,n)))return n;let s=1;for(;existsSync(join(t,`${n}-${s}`));)s++;return `${n}-${s}`}function bs(t){let e=t.replace(/[^a-zA-Z0-9\-_ ]/g,"-").replace(/\s+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"");return e.length>100&&(e=e.substring(0,100).replace(/-+$/,"")),e||"unnamed-test"}function kr(t,e,r,n,s){let a=t.find(f=>f.name==="screenshot"&&f.path),o=t.find(f=>f.name==="video"&&f.path);if(!a&&!o)return null;let i=bs(e);r>0&&(i+=`--retry-${r}`);let l=s?["artifacts",s,i]:["artifacts",i],d=join(n,...l),u=l,p={};try{mkdirSync(d,{recursive:!0});}catch{return null}if(a?.path&&existsSync(a.path)){let c=`screenshot${extname(a.path)||".png"}`,g=join(d,c);ee.push(br(a.path,g).then(()=>{})),p.screenshot=`${u.join("/")}/${c}`;}if(o?.path&&existsSync(o.path)){let c=`video${extname(o.path)||".webm"}`,g=join(d,c);ee.push(br(o.path,g).then(()=>{})),p.video=`${u.join("/")}/${c}`;}return !p.screenshot&&!p.video?null:p}var ks=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,Ts="1.0";function Cs(t){let e=extname(t).toLowerCase();return [".png",".jpg",".jpeg",".gif",".bmp",".webp"].includes(e)?"screenshot":[".webm",".mp4",".avi",".mov"].includes(e)?"video":"other"}function Tr(t,e,r){let n=[];try{let s=readdirSync(t,{withFileTypes:!0});for(let a of s){if(!a.isFile())continue;let o=join(t,a.name),i=statSync(o);n.push({name:a.name,type:Cs(a.name),relativePath:`artifacts/${e}/${r}/${a.name}`,sizeBytes:i.size});}}catch{}return {testName:r,files:n}}function Ss(t,e){let r=join(t,e),n=[],s=0;try{let o=readdirSync(r,{withFileTypes:!0});for(let i of o){if(!i.isDirectory())continue;let l=Tr(join(r,i.name),e,i.name);n.push(l);for(let d of l.files)s+=d.sizeBytes;}}catch{}let a=e.replace(/^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})/,"$1T$2:$3:$4").replace(/-\d+$/,"");return n.sort((o,i)=>o.testName.localeCompare(i.testName)),{folderName:e,timestamp:a,totalSizeBytes:s,testCount:n.length,tests:n,isCurrentRun:false}}function Cr(t,e){let r=join(t,"artifacts"),n=[],s=[],a=0;try{let i=readdirSync(r,{withFileTypes:!0});for(let l of i)if(l.isDirectory())if(ks.test(l.name)){let d=Ss(r,l.name);n.push({...d,isCurrentRun:l.name===e});}else {let d=Tr(join(r,l.name),l.name,l.name);s.push(d);for(let u of d.files)a+=u.sizeBytes;}}catch{}n.sort((i,l)=>l.timestamp.localeCompare(i.timestamp)),s.length>0&&(s.sort((i,l)=>i.testName.localeCompare(l.testName)),n.push({folderName:"__legacy__",timestamp:"1970-01-01T00:00:00",totalSizeBytes:a,testCount:s.length,tests:s,isCurrentRun:false}));let o=n.reduce((i,l)=>i+l.totalSizeBytes,0);return {schemaVersion:Ts,generatedAt:new Date().toISOString(),artifactBaseDir:"artifacts",totalSizeBytes:o,runs:n,serverPort:null}}function Ls(t){let e=t,{root:r}=parse(e);for(;e!==r;){if(existsSync(join(e,".git")))return e;e=join(e,"..");}return null}function Rr(t){try{let e=Ls(t);if(!e)return;let r=join(e,".gitignore"),n=relative(e,t).replace(/\\/g,"/"),s=n.endsWith("/")?n:`${n}/`;if(existsSync(r)&&readFileSync(r,"utf-8").split(`
@@ -2556,7 +2556,7 @@ ${s}
2556
2556
  `}function Qe(t,e,r,n){if(n||t.total===0)return;let s=`\u250C${"\u2500".repeat(58)}\u2510
2557
2557
  `,a=`\u2514${"\u2500".repeat(58)}\u2518
2558
2558
  `,o=I(""),i=s;i+=I("TestRelic AI - Playwright Test Report"),i+=o;let l=[];if(t.passed>0&&l.push(`${t.passed} \u2713`),t.failed>0&&l.push(`${t.failed} \u2717`),t.flaky>0&&l.push(`${t.flaky} \u26A0`),t.skipped>0&&l.push(`${t.skipped} skipped`),t.timedout>0&&l.push(`${t.timedout} timedout`),i+=I(`Tests: ${t.total} total (${l.join(" ")})`),t.totalNavigations>0&&(i+=I(`Navigations: ${t.totalNavigations} visits across ${t.uniqueNavigationUrls} unique URLs`)),t.totalApiCalls>0){i+=I(`API Calls: ${t.totalApiCalls} calls across ${t.uniqueApiUrls} unique endpoints`);let d=Object.entries(t.apiCallsByMethod).filter(([,p])=>p>0).map(([p,f])=>`${p}: ${f}`);d.length>0&&(i+=I(` ${d.join(" ")}`));let u=Object.entries(t.apiCallsByStatusRange).filter(([,p])=>p>0).map(([p,f])=>`${p}: ${f}`);u.length>0&&(i+=I(` ${u.join(" ")}`)),t.apiResponseTime&&(i+=I(` Avg response: ${t.apiResponseTime.avg}ms P95: ${t.apiResponseTime.p95}ms`));}if(t.totalAssertions>0&&(i+=I(`Assertions: ${t.totalAssertions} total (${t.passedAssertions} \u2713 ${t.failedAssertions} \u2717)`)),t.totalActionSteps>0){let d=[],u=t.actionStepsByCategory;u.ui_action&&d.push(`${u.ui_action} UI`),u.assertion&&d.push(`${u.assertion} assertions`),u.custom_step&&d.push(`${u.custom_step} custom`);let p=d.length>0?` (${d.join(" ")})`:"";i+=I(`Actions: ${t.totalActionSteps} steps${p}`);}i+=I(`Report: ${r}`),i+=I(`Data: ${e}`),i+=a,i+=`For more information visit us at https://docs.testrelic.ai
2559
- `,process.stderr.write(i);}var Hs=new Set(["pw:api","expect","test.step"]);function Us(t){return t==="expect"?"assertion":t==="test.step"?"custom_step":"ui_action"}function et(t,e,r){if(Hs.has(t.category)){let n=[];for(let a of t.steps)et(a,e,n);let s=t.startTime.getTime()-e.getTime();r.push({title:t.title,category:Us(t.category),timestamp:t.startTime.toISOString(),duration:t.duration,videoOffset:s>=0?s/1e3:null,status:t.error?"failed":"passed",error:t.error?.message??null,children:n});}else for(let n of t.steps)et(n,e,r);}function Pr(t,e){let r=[];for(let n of t)et(n,e,r);return r}var $s=new Set(["localhost","127.0.0.1","0.0.0.0"]);function Mr(t){let e=new URL(t);if(e.protocol!=="https:"&&!(e.protocol==="http:"&&$s.has(e.hostname)))throw createError(ErrorCode.CLOUD_CONFIG_INVALID,`HTTPS is required for cloud communication. Got: ${e.protocol}//${e.hostname}`)}var Ws=3e3;async function tt(t){let e=new AbortController,r=setTimeout(()=>e.abort(),Ws);try{return (await fetch(`${t}/health`,{method:"GET",signal:e.signal})).ok}catch{return false}finally{clearTimeout(r);}}async function Nr(t){return new Promise(e=>setTimeout(e,t))}async function Er(t){try{let r=(await t.json()).error;if(r&&typeof r.message=="string"){let n=r.details;if(Array.isArray(n)&&n.length>0){let s=n.map(a=>`${a.field}: ${a.message}`).join(", ");return `${r.message} (${s})`}return r.message}}catch{}return `HTTP ${t.status}`}async function rt(t,e,r){let n=new AbortController,s=setTimeout(()=>n.abort(),r);try{let a=await fetch(`${t}/sdk/auth/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e}),signal:n.signal});if(a.ok){let i=await a.json();return {accessToken:i.accessToken,refreshToken:i.refreshToken,expiresIn:i.expiresIn,orgId:i.orgId,orgName:i.orgName,userId:i.userId,userName:i.userName}}if(a.status===429){let i=a.headers.get("Retry-After"),l=i?parseInt(i,10)*1e3:5e3;if(!isNaN(l)&&l>0){await Nr(l);let d=await fetch(`${t}/sdk/auth/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e}),signal:n.signal});if(d.ok){let u=await d.json();return {accessToken:u.accessToken,refreshToken:u.refreshToken,expiresIn:u.expiresIn,orgId:u.orgId,orgName:u.orgName,userId:u.userId,userName:u.userName}}}return {code:"rate_limited",message:"Rate limited during token exchange.",statusCode:429}}return a.status===400?{code:"validation_error",message:await Er(a),statusCode:400}:a.status===401?{code:"invalid_key",message:"API key is invalid or has been revoked.",statusCode:401}:a.status===403?{code:"expired_key",message:"API key has expired.",statusCode:403}:{code:"server_error",message:await Er(a),statusCode:a.status}}catch(a){return a instanceof DOMException&&a.name==="AbortError"?{code:"timeout",message:"Token exchange timed out.",statusCode:null}:{code:"network_error",message:"Failed to reach cloud for token exchange.",statusCode:null}}finally{clearTimeout(s);}}function nt(t){return "code"in t&&typeof t.code=="string"&&["invalid_key","expired_key","validation_error","rate_limited","server_error","network_error","timeout"].includes(t.code)}async function Fr(t,e,r){let n=new AbortController,s=setTimeout(()=>n.abort(),r);try{let a=await fetch(`${t}/sdk/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e}),signal:n.signal});if(a.status===429){let i=a.headers.get("Retry-After"),l=i?parseInt(i,10)*1e3:5e3;!isNaN(l)&&l>0&&(await Nr(l),a=await fetch(`${t}/sdk/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e}),signal:n.signal}));}if(!a.ok)return null;let o=await a.json();return {accessToken:o.accessToken,refreshToken:o.refreshToken,expiresIn:o.expiresIn}}catch{return null}finally{clearTimeout(s);}}async function Dr(t,e,r,n,s,a){let o=new AbortController,i=setTimeout(()=>o.abort(),s);try{let l={gitId:r,displayName:n};a&&(l.branch=a);let d=await fetch(`${t}/repos/resolve`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(l),signal:o.signal});if(!d.ok)return null;let u=await d.json();return {repoId:u.repoId,displayName:u.displayName}}catch{return null}finally{clearTimeout(i);}}var Ys=5e3;function B(t,e){try{return execSync(t,{cwd:e,timeout:Ys,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}}function Br(t){let e=B("git rev-parse --abbrev-ref HEAD",t),r=B("git rev-parse --short HEAD",t),n=B("git log -1 --pretty=%s",t),s=B("git log -1 --format=%an",t)??B("git config user.name",t),a=Zs(t),o=a?re(a):null;return {branch:e,commitSha:r,commitMessage:n,commitAuthor:s,remoteUrl:o}}function Zs(t){let e=B("git remote get-url origin",t);if(e)return e;let r=B("git remote",t);if(!r)return null;let n=r.split(`
2559
+ `,process.stderr.write(i);}var Hs=new Set(["pw:api","expect","test.step"]);function Us(t){return t==="expect"?"assertion":t==="test.step"?"custom_step":"ui_action"}function et(t,e,r){if(Hs.has(t.category)){let n=[];for(let a of t.steps)et(a,e,n);let s=t.startTime.getTime()-e.getTime();r.push({title:t.title,category:Us(t.category),timestamp:t.startTime.toISOString(),duration:t.duration,videoOffset:s>=0?s/1e3:null,status:t.error?"failed":"passed",error:t.error?.message??null,children:n});}else for(let n of t.steps)et(n,e,r);}function Pr(t,e){let r=[];for(let n of t)et(n,e,r);return r}var $s=new Set(["localhost","127.0.0.1","0.0.0.0"]);function Mr(t){let e=new URL(t);if(e.protocol!=="https:"&&!(e.protocol==="http:"&&$s.has(e.hostname)))throw createError(ErrorCode.CLOUD_CONFIG_INVALID,`HTTPS is required for cloud communication. Got: ${e.protocol}//${e.hostname}`)}var Vs=3e3;async function tt(t){let e=new AbortController,r=setTimeout(()=>e.abort(),Vs);try{return (await fetch(`${t}/health`,{method:"GET",signal:e.signal})).ok}catch{return false}finally{clearTimeout(r);}}async function Nr(t){return new Promise(e=>setTimeout(e,t))}async function Er(t){try{let r=(await t.json()).error;if(r&&typeof r.message=="string"){let n=r.details;if(Array.isArray(n)&&n.length>0){let s=n.map(a=>`${a.field}: ${a.message}`).join(", ");return `${r.message} (${s})`}return r.message}}catch{}return `HTTP ${t.status}`}async function rt(t,e,r){let n=new AbortController,s=setTimeout(()=>n.abort(),r);try{let a=await fetch(`${t}/sdk/auth/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e}),signal:n.signal});if(a.ok){let i=await a.json();return {accessToken:i.accessToken,refreshToken:i.refreshToken,expiresIn:i.expiresIn,orgId:i.orgId,orgName:i.orgName,userId:i.userId,userName:i.userName}}if(a.status===429){let i=a.headers.get("Retry-After"),l=i?parseInt(i,10)*1e3:5e3;if(!isNaN(l)&&l>0){await Nr(l);let d=await fetch(`${t}/sdk/auth/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:e}),signal:n.signal});if(d.ok){let u=await d.json();return {accessToken:u.accessToken,refreshToken:u.refreshToken,expiresIn:u.expiresIn,orgId:u.orgId,orgName:u.orgName,userId:u.userId,userName:u.userName}}}return {code:"rate_limited",message:"Rate limited during token exchange.",statusCode:429}}return a.status===400?{code:"validation_error",message:await Er(a),statusCode:400}:a.status===401?{code:"invalid_key",message:"API key is invalid or has been revoked.",statusCode:401}:a.status===403?{code:"expired_key",message:"API key has expired.",statusCode:403}:{code:"server_error",message:await Er(a),statusCode:a.status}}catch(a){return a instanceof DOMException&&a.name==="AbortError"?{code:"timeout",message:"Token exchange timed out.",statusCode:null}:{code:"network_error",message:"Failed to reach cloud for token exchange.",statusCode:null}}finally{clearTimeout(s);}}function nt(t){return "code"in t&&typeof t.code=="string"&&["invalid_key","expired_key","validation_error","rate_limited","server_error","network_error","timeout"].includes(t.code)}async function Fr(t,e,r){let n=new AbortController,s=setTimeout(()=>n.abort(),r);try{let a=await fetch(`${t}/sdk/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e}),signal:n.signal});if(a.status===429){let i=a.headers.get("Retry-After"),l=i?parseInt(i,10)*1e3:5e3;!isNaN(l)&&l>0&&(await Nr(l),a=await fetch(`${t}/sdk/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e}),signal:n.signal}));}if(!a.ok)return null;let o=await a.json();return {accessToken:o.accessToken,refreshToken:o.refreshToken,expiresIn:o.expiresIn}}catch{return null}finally{clearTimeout(s);}}async function Dr(t,e,r,n,s,a){let o=new AbortController,i=setTimeout(()=>o.abort(),s);try{let l={gitId:r,displayName:n};a&&(l.branch=a);let d=await fetch(`${t}/repos/resolve`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(l),signal:o.signal});if(!d.ok)return null;let u=await d.json();return {repoId:u.repoId,displayName:u.displayName}}catch{return null}finally{clearTimeout(i);}}var Ys=5e3;function B(t,e){try{return execSync(t,{cwd:e,timeout:Ys,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}}function Br(t){let e=B("git rev-parse --abbrev-ref HEAD",t),r=B("git rev-parse --short HEAD",t),n=B("git log -1 --pretty=%s",t),s=B("git log -1 --format=%an",t)??B("git config user.name",t),a=Zs(t),o=a?re(a):null;return {branch:e,commitSha:r,commitMessage:n,commitAuthor:s,remoteUrl:o}}function Zs(t){let e=B("git remote get-url origin",t);if(e)return e;let r=B("git remote",t);if(!r)return null;let n=r.split(`
2560
2560
  `)[0]?.trim();return n?B(`git remote get-url ${n}`,t):null}function re(t){let e=t.trim();return e=e.replace(/^[a-z+]+:\/\//,""),e=e.replace(/^[^@]+@/,""),e=e.replace(/:(?!\d)/,"/"),e=e.replace(/\.git$/,""),e=e.replace(/\/+$/,""),e=e.replace(/^[^@/]+@/,""),e.toLowerCase()}function Or(t){let e=t.split("/").filter(Boolean);return e[e.length-1]??t}function st(t){try{let e=readFileSync(join(t,"package.json"),"utf-8"),r=JSON.parse(e);return typeof r.name=="string"&&r.name.length>0?r.name:null}catch{return null}}function ne(t){let e=st(t);return e||`local/${basename(t)}`}var sa=1048576,aa="1.0.0",qr=10;function se(t,e,r,n,s,a,o,i){try{mkdirSync(t,{recursive:!0});let l=Date.now(),d=`${l}-${e}-${r}.json`,u=join(t,d),p={version:aa,queuedAt:new Date(l).toISOString(),reason:n,retryCount:0,targetEndpoint:s,method:a,payload:o,headers:i},f=u+".tmp";writeFileSync(f,JSON.stringify(p,null,2),"utf-8"),renameSync(f,u);}catch(l){l.code==="ENOSPC"?process.stderr.write(`\u26A0 TestRelic: Disk full \u2014 unable to queue upload data.
2561
2561
  `):process.stderr.write(`\u26A0 TestRelic: Unable to queue upload data.
2562
2562
  `);}}async function zr(t,e,r){let n;try{n=readdirSync(t).filter(a=>a.endsWith(".json")&&!a.endsWith(".tmp")).sort();}catch{return}if(n.length===0)return;let s=[];for(let a=0;a<n.length;a+=qr)s.push(n.slice(a,a+qr));for(let a of s)for(let o of a){let i=join(t,o);try{if(!statSync(i).isFile())continue;let d=readFileSync(i,"utf-8"),u=JSON.parse(d);if(!isValidQueueEntry(u)){process.stderr.write(`\u26A0 TestRelic: Corrupted queue file deleted: ${o}
@@ -2576,12 +2576,12 @@ ${s}
2576
2576
  `);break;default:this.setLocalMode(`auth_error_${r??"unknown"}`),process.stderr.write(`\u26A0 TestRelic: Cloud authentication failed. Running in local mode.
2577
2577
  `);break}}async resolveRepoId(){if(!this.config||!this.authState.accessToken)return;let e=this.gitMetadata?.remoteUrl?re(this.gitMetadata.remoteUrl):null,r=e?Or(e):this.config.projectName??ne(process.cwd()),n=e??this.config.projectName??ne(process.cwd()),s=this.readRepoCache(n);if(s){this.repoId=s.repoId;return}try{let a=await Dr(this.config.endpoint,this.authState.accessToken,n,r,this.config.timeout,this.gitMetadata?.branch);a&&(this.repoId=a.repoId,this.writeRepoCache(n,a.repoId,a.displayName));}catch{}!e&&!this.config.projectName&&!st(process.cwd())&&process.stderr.write(`\u2139 TestRelic: No git remote or package.json detected. Set project.name in .testrelic for stable project identity.
2578
2578
  `);}readRepoCache(e){if(!this.config)return null;let r=join(this.config.queueDirectory,"..","cache","repo.json");try{if(!existsSync(r))return null;let n=readFileSync(r,"utf-8"),s=JSON.parse(n);if(s.gitId!==e||Date.now()-s.resolvedAt>fa)return null;let a=this.hashApiKey();return a&&s.apiKeyHash!==a?null:s}catch{return null}}writeRepoCache(e,r,n){if(!this.config)return;let s=join(this.config.queueDirectory,"..","cache"),a=join(s,"repo.json");try{mkdirSync(s,{recursive:!0});let o={repoId:r,gitId:e,displayName:n,resolvedAt:Date.now(),apiKeyHash:this.hashApiKey()??""},i=a+".tmp";writeFileSync(i,JSON.stringify(o,null,2),"utf-8"),renameSync(i,a);}catch{}}hashApiKey(){return this.config?.apiKey?createHash("sha256").update(this.config.apiKey).digest("hex").substring(0,16):null}startBackgroundFlush(){if(!this.config||!this.authState.accessToken)return;let e=this.authState.accessToken,r=this.config.queueDirectory,n=this.config.endpoint;this.flushPromise=Promise.race([zr(r,n,e),new Promise(s=>setTimeout(s,$r))]).catch(()=>{});}startHealthCheck(){if(!this.config)return;let e=this.config.endpoint;this.healthCheckTimer=setInterval(async()=>{if(!this.isCloudMode()&&!(!this.failureReason||!["cloud_unreachable","auth_timeout","network_error"].includes(this.failureReason)))try{if(!await tt(e))return;if(this.config?.apiKey){let n=await rt(this.config.endpoint,this.config.apiKey,this.config.timeout);if(!nt(n)){let s=n;this.authState={mode:"cloud",accessToken:s.accessToken,refreshToken:s.refreshToken,expiresAt:Date.now()+s.expiresIn*1e3,orgId:s.orgId,orgName:s.orgName,userId:s.userId,userName:s.userName},this.failureReason=null,process.stderr.write(`\u2713 TestRelic: Cloud connectivity restored.
2579
- `),this.startBackgroundFlush();}}}catch{}},ga);}};var ha=new Set(["smoke","regression","nightly","ci"]);function ye(){let t=process.env.TESTRELIC_RUN_TYPE?.trim().toLowerCase();if(t&&ha.has(t))return t}var ya=1048576,ve=[1e3,3e3,9e3],be=3,va=40*1048576,ba=new Set(["e2e","mobile","unit"]);function dt(t){if(t&&t.length>0&&t.every(s=>s.testType==="api")){let s=new Map;for(let i of t){let l=i.apiProtocol??"rest";s.set(l,(s.get(l)??0)+1);}let a="rest",o=0;for(let[i,l]of s)l>o&&(o=l,a=i);return {testType:"api",apiProtocol:a,metadata:{testType:"api",primaryProtocol:a}}}let e=new Map;for(let s of t??[])ba.has(s.testType)&&e.set(s.testType,(e.get(s.testType)??0)+1);let r=null,n=0;for(let[s,a]of e)a>n&&(n=a,r=s);return {testType:r??"e2e"}}function ct(t,e,r,n,s,a){let o=a?.cloudPlatform?a.cloudPlatform:n?.provider&&n.provider!=="unknown"?n.provider:"local",i=ye(),l=dt(s),d=l.testType==="api"?l:null,u=d&&s?s.map(f=>f.apiProtocol?f:{...f,apiProtocol:d.apiProtocol}):s,p={runId:t.testRunId,repoGitId:e,startedAt:t.startedAt,summary:t.summary,timeline:t.timeline,environment:o,...i?{runType:i}:{},...d?{testType:d.testType,apiProtocol:d.apiProtocol,metadata:d.metadata}:{testType:l.testType},...u&&u.length>0?{tests:u}:{},...r?.branch?{branch:r.branch}:{},...r?.commitSha?{commit:r.commitSha}:{},...r?.commitMessage?{commitMessage:r.commitMessage}:{},...r?.commitAuthor?{commitAuthor:r.commitAuthor}:{},...t.completedAt?{finishedAt:t.completedAt}:{},...t.totalDuration?{duration:t.totalDuration}:{},...n?.provider?{ciProvider:n.provider}:{},...n?.runUrl?{ciRunUrl:n.runUrl}:{},...a?.cloudPlatform?{cloudPlatform:a.cloudPlatform}:{},...a?.cloudBuildId?{cloudBuildId:a.cloudBuildId}:{},...a?.cloudSessionId?{cloudSessionId:a.cloudSessionId}:{}};if(p.tests&&p.tests.length>0){let f=JSON.stringify(p);if(Buffer.byteLength(f,"utf-8")>va){let c=p.tests.map(({consoleLogs:g,networkRequests:h,apiCalls:m,...w})=>w);return {...p,tests:c}}}return p}function lt(t){return typeof t=="string"?Buffer.byteLength(t,"utf-8"):0}function ut(t){return Array.isArray(t)?t.map(e=>{let r=e.statusCode??e.responseStatusCode??null;return {...e.protocol!=null?{protocol:e.protocol}:{},method:e.method??null,url:e.url??null,statusCode:r,statusText:e.statusText??e.responseStatusText??null,ok:typeof r=="number"?r<400:e.ok??null,durationMs:e.durationMs??e.responseTimeMs??null,bytesIn:typeof e.bytesIn=="number"?e.bytesIn:lt(e.responseBody),bytesOut:typeof e.bytesOut=="number"?e.bytesOut:lt(e.requestBody),requestHeaders:e.requestHeaders??null,responseHeaders:e.responseHeaders??null,requestBody:e.requestBody??null,responseBody:e.responseBody??null,requestCookies:e.requestCookies??null,responseCookies:e.responseCookies??null}}):[]}function pt(t){return Array.isArray(t)?t.map(e=>{let r=e.responseStatusCode??e.statusCode??0,n=e.timestamp??null;return {method:e.method??"GET",url:e.url??"",status:r,statusCode:r,type:"xhr",size:lt(e.responseBody),duration:e.responseTimeMs??e.durationMs??0,responseTimeMs:e.responseTimeMs??e.durationMs??0,requestHeaders:e.requestHeaders??null,responseHeaders:e.responseHeaders??null,requestBody:e.requestBody??null,responseBody:e.responseBody??null,timestamp:n,startedAt:n}}):[]}function ft(t){if(!Array.isArray(t))return [];let e=r=>{if(r==null)return String(r);if(typeof r=="string")return r;try{return JSON.stringify(r)}catch{return String(r)}};return t.map(r=>{let n=r.status==="failed"?"failed":"passed",s=typeof r.expression=="string"&&r.expression.trim()?r.expression.trim():null,a=r.kind??r.type??"assertion",o=n==="failed"?`expected ${e(r.expected)}, received ${e(r.actual)}`:r.expected!==void 0?`expected ${e(r.expected)}`:null;return {kind:a,description:s??r.description??`${a} assertion`,status:n,detail:o}})}async function we(t){return new Promise(e=>setTimeout(e,t))}function wa(t){let e={};for(let[r,n]of Object.entries(t))n!=null&&(e[r]=n);return e}async function Wr(t,e,r){for(let n=0;n<be;n++)try{let s=await fetch(t,e);if(s.ok)return s;if(s.status===401&&r&&n===0){let a=await r();if(a){let o={...e,headers:{...e.headers,Authorization:`Bearer ${a}`}},i=await fetch(t,o);if(i.ok)return i}return null}if(s.status===429&&n<be-1){let a=s.headers.get("Retry-After"),o=a?parseInt(a,10)*1e3:ve[n];!isNaN(o)&&o>0?await we(o):await we(ve[n]);continue}if(s.status>=500&&n<be-1){await we(ve[n]);continue}return s}catch{if(n<be-1){await we(ve[n]);continue}return null}return null}function xa(t){let e=JSON.stringify(t),r={"Content-Type":"application/json"};if(Buffer.byteLength(e,"utf-8")>ya){let n=gzipSync(Buffer.from(e,"utf-8"));return r["Content-Encoding"]="gzip",{body:n,headers:r}}return {body:e,headers:r}}async function Vr(t,e,r,n){let s=`${t}/runs`,{body:a,headers:o}=xa(r);o.Authorization=`Bearer ${e}`;let i=await Wr(s,{method:"POST",headers:o,body:a},n);return i?.ok?{success:true,statusCode:i.status,error:null}:i?.status===409?{success:true,statusCode:409,error:null}:{success:false,reason:i?`Upload failed with status ${i.status}`:"Upload failed after retries",statusCode:i?.status??null,payload:r,targetEndpoint:s,method:"POST"}}async function Gr(t,e,r){let n=`${t}/runs/init`;try{let s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(wa(r))});return s.ok?{runId:(await s.json()).runId}:null}catch{return null}}function Jr(t,e,r,n){let s=`${t}/runs/${r}/tests`;fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n)}).catch(()=>{});}async function Kr(t,e,r,n){let s=`${t}/runs/${r}/finalize`;return (await Wr(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n)}))?.ok??false}function gt(t,e,r,n){let s=`${t}/runs/${r}/finalize`,a=new Date,o={finishedAt:a.toISOString(),duration:a.getTime()-new Date(n).getTime(),summary:{}};fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(o)}).catch(()=>{});}function Yr(t,e,r,n){let s=[],a=[],o=null,i=0,l=null,d=0,u=null,p=0,f=t.filter(h=>h.name===ATTACHMENT_NAME&&h.body),c=false;if(f.length>0)for(let h of f)try{let m=JSON.parse(h.body.toString());if(isTestRelicFilePayload(m)){s=s.concat(m.navigations),a=a.concat(m.apiAssertions),m.networkRequestsFile&&(o=m.networkRequestsFile,i+=m.networkRequestsCount),m.consoleLogsFile&&(l=m.consoleLogsFile,d+=m.consoleLogsCount),m.apiCallsFile&&(u=m.apiCallsFile,p+=m.apiCallsCount),c=!0;continue}if(isTestRelicDataPayload(m)){s=s.concat(m.navigations),Array.isArray(m.apiAssertions)&&(a=a.concat(m.apiAssertions)),i+=m.networkRequests?.length??0,p+=m.apiCalls?.length??0;let w=m.consoleLogs;Array.isArray(w)&&(d+=w.length),c=!0;}}catch{process.stderr.write(`[testrelic] Warning: Corrupt attachment for test "${r}"
2579
+ `),this.startBackgroundFlush();}}}catch{}},ga);}};var ha=new Set(["smoke","regression","nightly","ci"]);function ye(){let t=process.env.TESTRELIC_RUN_TYPE?.trim().toLowerCase();if(t&&ha.has(t))return t}var ya=1048576,ve=[1e3,3e3,9e3],be=3,va=40*1048576,ba=new Set(["e2e","mobile","unit"]);function dt(t){if(t&&t.length>0&&t.every(s=>s.testType==="api")){let s=new Map;for(let i of t){let l=i.apiProtocol??"rest";s.set(l,(s.get(l)??0)+1);}let a="rest",o=0;for(let[i,l]of s)l>o&&(o=l,a=i);return {testType:"api",apiProtocol:a,metadata:{testType:"api",primaryProtocol:a}}}let e=new Map;for(let s of t??[])ba.has(s.testType)&&e.set(s.testType,(e.get(s.testType)??0)+1);let r=null,n=0;for(let[s,a]of e)a>n&&(n=a,r=s);return {testType:r??"e2e"}}function ct(t,e,r,n,s,a){let o=a?.cloudPlatform?a.cloudPlatform:n?.provider&&n.provider!=="unknown"?n.provider:"local",i=ye(),l=dt(s),d=l.testType==="api"?l:null,u=d&&s?s.map(f=>f.apiProtocol?f:{...f,apiProtocol:d.apiProtocol}):s,p={runId:t.testRunId,repoGitId:e,startedAt:t.startedAt,summary:t.summary,timeline:t.timeline,environment:o,...i?{runType:i}:{},...d?{testType:d.testType,apiProtocol:d.apiProtocol,metadata:d.metadata}:{testType:l.testType},...u&&u.length>0?{tests:u}:{},...r?.branch?{branch:r.branch}:{},...r?.commitSha?{commit:r.commitSha}:{},...r?.commitMessage?{commitMessage:r.commitMessage}:{},...r?.commitAuthor?{commitAuthor:r.commitAuthor}:{},...t.completedAt?{finishedAt:t.completedAt}:{},...t.totalDuration?{duration:t.totalDuration}:{},...n?.provider?{ciProvider:n.provider}:{},...n?.runUrl?{ciRunUrl:n.runUrl}:{},...a?.cloudPlatform?{cloudPlatform:a.cloudPlatform}:{},...a?.cloudBuildId?{cloudBuildId:a.cloudBuildId}:{},...a?.cloudSessionId?{cloudSessionId:a.cloudSessionId}:{}};if(p.tests&&p.tests.length>0){let f=JSON.stringify(p);if(Buffer.byteLength(f,"utf-8")>va){let c=p.tests.map(({consoleLogs:g,networkRequests:h,apiCalls:m,...w})=>w);return {...p,tests:c}}}return p}function lt(t){return typeof t=="string"?Buffer.byteLength(t,"utf-8"):0}function ut(t){return Array.isArray(t)?t.map(e=>{let r=e.statusCode??e.responseStatusCode??null;return {...e.protocol!=null?{protocol:e.protocol}:{},method:e.method??null,url:e.url??null,statusCode:r,statusText:e.statusText??e.responseStatusText??null,ok:typeof r=="number"?r<400:e.ok??null,durationMs:e.durationMs??e.responseTimeMs??null,bytesIn:typeof e.bytesIn=="number"?e.bytesIn:lt(e.responseBody),bytesOut:typeof e.bytesOut=="number"?e.bytesOut:lt(e.requestBody),requestHeaders:e.requestHeaders??null,responseHeaders:e.responseHeaders??null,requestBody:e.requestBody??null,responseBody:e.responseBody??null,requestCookies:e.requestCookies??null,responseCookies:e.responseCookies??null}}):[]}function pt(t){return Array.isArray(t)?t.map(e=>{let r=e.responseStatusCode??e.statusCode??0,n=e.timestamp??null;return {method:e.method??"GET",url:e.url??"",status:r,statusCode:r,type:"xhr",size:lt(e.responseBody),duration:e.responseTimeMs??e.durationMs??0,responseTimeMs:e.responseTimeMs??e.durationMs??0,requestHeaders:e.requestHeaders??null,responseHeaders:e.responseHeaders??null,requestBody:e.requestBody??null,responseBody:e.responseBody??null,timestamp:n,startedAt:n}}):[]}function ft(t){if(!Array.isArray(t))return [];let e=r=>{if(r==null)return String(r);if(typeof r=="string")return r;try{return JSON.stringify(r)}catch{return String(r)}};return t.map(r=>{let n=r.status==="failed"?"failed":"passed",s=typeof r.expression=="string"&&r.expression.trim()?r.expression.trim():null,a=r.kind??r.type??"assertion",o=n==="failed"?`expected ${e(r.expected)}, received ${e(r.actual)}`:r.expected!==void 0?`expected ${e(r.expected)}`:null;return {kind:a,description:s??r.description??`${a} assertion`,status:n,detail:o}})}async function we(t){return new Promise(e=>setTimeout(e,t))}function wa(t){let e={};for(let[r,n]of Object.entries(t))n!=null&&(e[r]=n);return e}async function Vr(t,e,r){for(let n=0;n<be;n++)try{let s=await fetch(t,e);if(s.ok)return s;if(s.status===401&&r&&n===0){let a=await r();if(a){let o={...e,headers:{...e.headers,Authorization:`Bearer ${a}`}},i=await fetch(t,o);if(i.ok)return i}return null}if(s.status===429&&n<be-1){let a=s.headers.get("Retry-After"),o=a?parseInt(a,10)*1e3:ve[n];!isNaN(o)&&o>0?await we(o):await we(ve[n]);continue}if(s.status>=500&&n<be-1){await we(ve[n]);continue}return s}catch{if(n<be-1){await we(ve[n]);continue}return null}return null}function xa(t){let e=JSON.stringify(t),r={"Content-Type":"application/json"};if(Buffer.byteLength(e,"utf-8")>ya){let n=gzipSync(Buffer.from(e,"utf-8"));return r["Content-Encoding"]="gzip",{body:n,headers:r}}return {body:e,headers:r}}async function Wr(t,e,r,n){let s=`${t}/runs`,{body:a,headers:o}=xa(r);o.Authorization=`Bearer ${e}`;let i=await Vr(s,{method:"POST",headers:o,body:a},n);return i?.ok?{success:true,statusCode:i.status,error:null}:i?.status===409?{success:true,statusCode:409,error:null}:{success:false,reason:i?`Upload failed with status ${i.status}`:"Upload failed after retries",statusCode:i?.status??null,payload:r,targetEndpoint:s,method:"POST"}}async function Gr(t,e,r){let n=`${t}/runs/init`;try{let s=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(wa(r))});return s.ok?{runId:(await s.json()).runId}:null}catch{return null}}function Jr(t,e,r,n){let s=`${t}/runs/${r}/tests`;fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n)}).catch(()=>{});}async function Kr(t,e,r,n){let s=`${t}/runs/${r}/finalize`;return (await Vr(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n)}))?.ok??false}function gt(t,e,r,n){let s=`${t}/runs/${r}/finalize`,a=new Date,o={finishedAt:a.toISOString(),duration:a.getTime()-new Date(n).getTime(),summary:{}};fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(o)}).catch(()=>{});}function Yr(t,e,r,n){let s=[],a=[],o=null,i=0,l=null,d=0,u=null,p=0,f=t.filter(h=>h.name===ATTACHMENT_NAME&&h.body),c=false;if(f.length>0)for(let h of f)try{let m=JSON.parse(h.body.toString());if(isTestRelicFilePayload(m)){s=s.concat(m.navigations),a=a.concat(m.apiAssertions),m.networkRequestsFile&&(o=m.networkRequestsFile,i+=m.networkRequestsCount),m.consoleLogsFile&&(l=m.consoleLogsFile,d+=m.consoleLogsCount),m.apiCallsFile&&(u=m.apiCallsFile,p+=m.apiCallsCount),c=!0;continue}if(isTestRelicDataPayload(m)){s=s.concat(m.navigations),Array.isArray(m.apiAssertions)&&(a=a.concat(m.apiAssertions)),i+=m.networkRequests?.length??0,p+=m.apiCalls?.length??0;let w=m.consoleLogs;Array.isArray(w)&&(d+=w.length),c=!0;}}catch{process.stderr.write(`[testrelic] Warning: Corrupt attachment for test "${r}"
2580
2580
  `);}return c||(s=e.filter(h=>h.type==="lambdatest-navigation"&&h.description).map(h=>{try{return JSON.parse(h.description)}catch{return null}}).filter(h=>h!==null)),s.length===0&&i===0&&p===0&&!n&&!c&&process.stderr.write(`[testrelic] Warning: No data found for test "${r}". Make sure your tests import { test, expect } from '@testrelic/playwright-analytics/fixture' instead of '@playwright/test'. Without the TestRelic fixture, network logs, video sync, and timeline data cannot be captured.
2581
2581
  `),{navigations:s,apiAssertions:a,networkRequestsFile:o,networkRequestsCount:i,consoleLogsFile:l,consoleLogsCount:d,apiCallsFile:u,apiCallsCount:p}}function xe(t=process.env){let e=Sa(t.TESTRELIC_CLOUD_PLATFORM);if(e)return {cloudPlatform:e,cloudBuildId:t.TESTRELIC_CLOUD_BUILD_ID||void 0,cloudSessionId:t.TESTRELIC_CLOUD_SESSION_ID||void 0};if(t.BROWSERSTACK_USERNAME||t.BROWSERSTACK_ACCESS_KEY)return {cloudPlatform:"browserstack",cloudBuildId:t.BROWSERSTACK_BUILD_NAME||t.BROWSERSTACK_BUILD_ID||void 0,cloudSessionId:t.BROWSERSTACK_SESSION_ID||void 0};if(t.LT_USERNAME||t.LAMBDATEST_USERNAME||t.LT_ACCESS_KEY||t.LAMBDATEST_ACCESS_KEY)return {cloudPlatform:"lambdatest",cloudBuildId:t.LT_BUILD||t.LAMBDATEST_BUILD||void 0,cloudSessionId:t.LT_SESSION_ID||t.LAMBDATEST_SESSION_ID||void 0};let r=t.PLAYWRIGHT_WS_ENDPOINT;if(r){if(/cdp\.lambdatest\.com/i.test(r))return {cloudPlatform:"lambdatest"};if(/cdp\.browserstack\.com/i.test(r))return {cloudPlatform:"browserstack"}}return {}}function Sa(t){if(!t)return;let e=t.toLowerCase().trim();if(e==="browserstack"||e==="bs")return "browserstack";if(e==="lambdatest"||e==="lt")return "lambdatest"}var La=5,ke=[1e3,3e3,9e3],$=3,Pa={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".webm":"video/webm",".mp4":"video/mp4",".zip":"application/zip"},ht=0,mt=[];async function Ea(){ht>=La&&await new Promise(t=>mt.push(t)),ht++;}function Ma(){ht--,mt.length>0&&mt.shift()();}async function Te(t){return new Promise(e=>setTimeout(e,t))}function Na(t){let e=t.substring(t.lastIndexOf(".")).toLowerCase();return Pa[e]??"application/octet-stream"}function Fa(t){try{return statSync(t).size}catch{return 0}}async function Da(t,e,r,n,s){let a=`${t}/artifacts/upload-url`,o=JSON.stringify({runId:r.runId,testId:r.testId,fileName:basename(r.filePath),contentType:s,type:r.type,sizeBytes:n});for(let i=0;i<$;i++)try{let l=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:o});if(l.ok)return await l.json();if(l.status>=500&&i<$-1){await Te(ke[i]);continue}return null}catch{if(i<$-1){await Te(ke[i]);continue}return null}return null}async function Ba(t,e,r,n){for(let s=0;s<$;s++)try{let a=createReadStream(e),o=Readable.toWeb(a),i=await fetch(t,{method:"PUT",headers:{"Content-Type":r,"Content-Length":String(n)},body:o,duplex:"half"});if(i.ok)return !0;if(i.status>=500&&s<$-1){await Te(ke[s]);continue}return !1}catch{if(s<$-1){await Te(ke[s]);continue}return false}return false}async function Oa(t,e,r){let n=`${t}/artifacts/confirm`;try{return (await fetch(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({artifactId:r})})).ok}catch{return false}}async function qa(t,e,r,n){let s=Fa(r.filePath);if(s===0)return {success:false,storageKey:null,artifactId:null,error:"file_not_found_or_empty"};if(s>n*1024*1024)return {success:false,storageKey:null,artifactId:null,error:"file_too_large"};let a=Na(r.filePath);await Ea();try{let o=await Da(t,e,r,s,a);if(!o)return {success:!1,storageKey:null,artifactId:null,error:"upload_url_request_failed"};if(!await Ba(o.uploadUrl,r.filePath,a,s))return {success:!1,storageKey:o.storageKey,artifactId:o.artifactId,error:"presigned_put_failed"};let l=await Oa(t,e,o.artifactId);return {success:l,storageKey:o.storageKey,artifactId:o.artifactId,error:l?null:"confirm_failed"}}finally{Ma();}}async function Zr(t,e,r,n){let s=new Map,a=r.map(async o=>{let i=await qa(t,e,o,n);s.set(o.filePath,i);});return await Promise.allSettled(a),s}function yt(t){let r=t.getGitMetadata()?.remoteUrl;return r?re(r):t.getConfig()?.projectName??ne(process.cwd())}async function Qr(t,e,r,n,s){if(!t.isCloudMode()||e!=="realtime"&&e!=="both"||!await t.ensureValidToken())return null;let o=t.getGitMetadata(),i=F(),l=xe(),d=ye();return (await Gr(t.getEndpoint(),t.getAccessToken(),{runId:r,repoGitId:yt(t),branch:o?.branch??null,commit:o?.commitSha??null,commitMessage:o?.commitMessage??null,commitAuthor:o?.commitAuthor??null,startedAt:n,totalTests:null,ciProvider:i?.provider??null,ciRunUrl:i?.runUrl??null,environment:s??l.cloudPlatform??null,cloudPlatform:l.cloudPlatform??null,cloudBuildId:l.cloudBuildId??null,cloudSessionId:l.cloudSessionId??null,...d?{runType:d}:{},testType:"e2e"}))?.runId??null}var Ha=true,Ua=50;async function za(t,e,r,n){let s=new Map;if(!(e?.uploadArtifacts??Ha)||!await t.ensureValidToken())return s;let i=[],l=new Map;for(let c of n){if(c.artifacts.screenshot){let g=join(c.outputDir,c.artifacts.screenshot);i.push({filePath:g,runId:r,testId:c.testId,type:"screenshot"}),l.set(g,{testId:c.testId,field:"screenshot"});}if(c.artifacts.video){let g=join(c.outputDir,c.artifacts.video);i.push({filePath:g,runId:r,testId:c.testId,type:"video"}),l.set(g,{testId:c.testId,field:"video"});}}if(i.length===0)return s;let d=e?.artifactMaxSizeMb??Ua,u=await Zr(t.getEndpoint(),t.getAccessToken(),i,d),p=new Map;for(let[c,g]of u){if(!g.success||!g.storageKey)continue;let h=l.get(c);if(!h)continue;let m=p.get(h.testId)??{};h.field==="screenshot"&&(m.screenshotKey=g.storageKey),h.field==="video"&&(m.videoKey=g.storageKey),p.set(h.testId,m);}for(let c of n){let g=p.get(c.testId);s.set(c.testId,{...c.artifacts,...g?.screenshotKey?{screenshotKey:g.screenshotKey}:{},...g?.videoKey?{videoKey:g.videoKey}:{}});}let f=Array.from(u.values()).filter(c=>c.success).length;return f>0&&process.stderr.write(`\u2713 TestRelic: Uploaded ${f} artifact(s) to cloud storage.
2582
- `),s}async function vt(t,e,r,n,s,a,o,i,l,d,u){try{if(t.isCloudMode()&&s&&(r==="realtime"||r==="both")){let f=await t.ensureValidToken(),c=t.getGitMetadata(),g=dt(u),h={finishedAt:o,duration:i,summary:l,...c?.commitMessage?{commitMessage:c.commitMessage}:{},testType:g.testType,...g.testType==="api"?{apiProtocol:g.apiProtocol,metadata:g.metadata}:{}};if(f){if(!await Kr(t.getEndpoint(),t.getAccessToken(),s,h)){let w=e?.queueDirectory??".testrelic/queue";se(w,n,"finalize","finalize_failed_after_retries",`${t.getEndpoint()}/runs/${s}/finalize`,"POST",h,{"Content-Type":"application/json"});}}else {let m=e?.queueDirectory??".testrelic/queue";se(m,n,"finalize",t.getFailureReason()??"token_invalid",`${t.getEndpoint()}/runs/${s}/finalize`,"POST",h,{"Content-Type":"application/json"});}}let p=new Map;if(t.isCloudMode()&&d&&d.length>0&&(p=await za(t,e,n,d)),t.isCloudMode()&&(!r||r==="batch"||r==="both"))if(await t.ensureValidToken()){let c=t.getGitMetadata(),g=F(),h=yt(t),m=ja(a,p),w=ct(m,h,c,g,u,xe()),T=await Vr(t.getEndpoint(),t.getAccessToken(),w,async()=>await t.ensureValidToken()?t.getAccessToken():null);if(!T.success){let y=T,b=e?.queueDirectory??".testrelic/queue";se(b,n,"batch",y.reason,y.targetEndpoint,y.method,y.payload,{"Content-Type":"application/json"});}}else {let c=e?.queueDirectory??".testrelic/queue",g=t.getGitMetadata(),h=F(),m=yt(t),w=ct(a,m,g,h,void 0,xe());se(c,n,"batch",t.getFailureReason()??"token_invalid",`${t.getEndpoint()}/runs`,"POST",w,{"Content-Type":"application/json"});}await t.dispose();}catch{try{await t.dispose();}catch{}}}function ja(t,e){if(e.size===0)return t;let r=t.timeline.map(n=>{let s=n.testId;if(!s)return n;let a=e.get(s);return a?{...n,...a.screenshotKey?{screenshotKey:a.screenshotKey}:{},...a.videoKey?{videoKey:a.videoKey}:{}}:n});return {...t,timeline:r}}function U(t){try{return readFileSync(t,"utf-8").split(`
2582
+ `),s}async function vt(t,e,r,n,s,a,o,i,l,d,u){try{if(t.isCloudMode()&&s&&(r==="realtime"||r==="both")){let f=await t.ensureValidToken(),c=t.getGitMetadata(),g=dt(u),h={finishedAt:o,duration:i,summary:l,...c?.commitMessage?{commitMessage:c.commitMessage}:{},testType:g.testType,...g.testType==="api"?{apiProtocol:g.apiProtocol,metadata:g.metadata}:{}};if(f){if(!await Kr(t.getEndpoint(),t.getAccessToken(),s,h)){let w=e?.queueDirectory??".testrelic/queue";se(w,n,"finalize","finalize_failed_after_retries",`${t.getEndpoint()}/runs/${s}/finalize`,"POST",h,{"Content-Type":"application/json"});}}else {let m=e?.queueDirectory??".testrelic/queue";se(m,n,"finalize",t.getFailureReason()??"token_invalid",`${t.getEndpoint()}/runs/${s}/finalize`,"POST",h,{"Content-Type":"application/json"});}}let p=new Map;if(t.isCloudMode()&&d&&d.length>0&&(p=await za(t,e,n,d)),t.isCloudMode()&&(!r||r==="batch"||r==="both"))if(await t.ensureValidToken()){let c=t.getGitMetadata(),g=F(),h=yt(t),m=ja(a,p),w=ct(m,h,c,g,u,xe()),T=await Wr(t.getEndpoint(),t.getAccessToken(),w,async()=>await t.ensureValidToken()?t.getAccessToken():null);if(!T.success){let y=T,b=e?.queueDirectory??".testrelic/queue";se(b,n,"batch",y.reason,y.targetEndpoint,y.method,y.payload,{"Content-Type":"application/json"});}}else {let c=e?.queueDirectory??".testrelic/queue",g=t.getGitMetadata(),h=F(),m=yt(t),w=ct(a,m,g,h,void 0,xe());se(c,n,"batch",t.getFailureReason()??"token_invalid",`${t.getEndpoint()}/runs`,"POST",w,{"Content-Type":"application/json"});}await t.dispose();}catch{try{await t.dispose();}catch{}}}function ja(t,e){if(e.size===0)return t;let r=t.timeline.map(n=>{let s=n.testId;if(!s)return n;let a=e.get(s);return a?{...n,...a.screenshotKey?{screenshotKey:a.screenshotKey}:{},...a.videoKey?{videoKey:a.videoKey}:{}}:n});return {...t,timeline:r}}function U(t){try{return readFileSync(t,"utf-8").split(`
2583
2583
  `).filter(r=>r.length>0).map(r=>{try{return JSON.parse(r)}catch{return null}}).filter(r=>r!==null)}catch{return []}}function wt(t){switch(t){case "passed":return "passed";case "failed":return "failed";case "timedOut":return "timedout";case "skipped":return "skipped";case "interrupted":return "failed";default:return "failed"}}function Ya(t,e,r){let n=`${t}::${e}::${r}`;return createHash("sha256").update(n).digest("hex").substring(0,16)}function Za(t){return t.length<=3?"":t[t.length-2]}function Xa(t){let e=t.findIndex(r=>r.status==="passed");return e>0?`passed on retry ${e}`:null}function Qa(t){return process.env.BROWSERSTACK_USERNAME?"BrowserStack":t?{"github-actions":"GitHub Actions","gitlab-ci":"GitLab CI",jenkins:"Jenkins",circleci:"CircleCI","bitbucket-pipelines":"Bitbucket Pipelines"}[t.provider]??"CI":"Local"}function ei(){let t=platform();return t==="win32"?"Windows":t==="darwin"?"macOS":"Linux"}function ti(t){let e=t.parent?.project?.()?.use;if(!e)return;let{browserName:r,channel:n}=e;if(n){let a=n.toLowerCase();return a==="chrome"||a==="chrome-stable"?"Chrome":a.startsWith("chrome-beta")?"Chrome Beta":a.startsWith("chrome-dev")?"Chrome Dev":a.startsWith("chrome-canary")?"Chrome Canary":a==="msedge"||a==="msedge-stable"?"Microsoft Edge":a.startsWith("msedge-beta")?"Edge Beta":a.startsWith("msedge-dev")?"Edge Dev":a.startsWith("msedge-canary")?"Edge Canary":n}if(r){let a=r.toLowerCase();return a==="chromium"?"Chromium":a==="firefox"?"Firefox":a==="webkit"?"WebKit":r}let s=e.defaultBrowserType;if(s){let a=s.toLowerCase();return a==="chromium"?"Chromium":a==="firefox"?"Firefox":a==="webkit"?"WebKit":s}}function ri(t,e,r){let n=r.parent?.project?.(),s="unknown";n!==void 0&&(n.use.isMobile===true?s="mobile":s="e2e");let a=["e2e","api","unit","mobile"];for(let l of a)if(t.some(d=>d===`@${l}`||d===l))return l;let o=e.replace(/\\/g,"/"),i=["e2e","api","unit"];for(let l of i)if(o.includes(`/${l}/`))return l;return s}var ni="__testrelic_api_config";function si(t){return JSON.stringify(t,(e,r)=>r instanceof RegExp?{__regexp:true,source:r.source,flags:r.flags}:r)}var Ce=class{constructor(e){this.rootDir="";this.startedAt="";this.testRunId="";this.collectedTests=[];this.fixtureDataReceived=false;this.testCount=0;this.cloudClient=null;this.cloudRunId=null;this.runTimestamp="";this.pendingArtifactEntries=[];this.detectedOs="";this.detectedSource="";this.cloudTestsBuffer=[];this.activeReportMode="embedded";this.streamingWriter=null;this.testIndex=[];this.summaryCounters={total:0,passed:0,failed:0,flaky:0,skipped:0,timedOut:0,interrupted:0,totalApiCalls:0,totalAssertions:0,totalNavigations:0,totalNetworkRequests:0,totalConsoleLogs:0,totalActionSteps:0};this.config=$t(e),this.apiConfig=jt(e);}async onBegin(e,r){try{if(this.rootDir=e.rootDir,this.startedAt=new Date().toISOString(),this.testRunId=this.config.testRunId??randomUUID(),this.config.reportMode==="auto"){let a=r.allTests().length;this.activeReportMode=a>=this.config.streamingThreshold?"streaming":"embedded";}else this.activeReportMode=this.config.reportMode;let n=r.allTests().length;if(process.stderr.write(`[testrelic] Report mode: ${this.activeReportMode} (${n} tests)
2584
- `),this.activeReportMode==="streaming"){let a=dirname(this.config.outputPath);this.streamingWriter=new Z(a);let o=()=>{if(this.streamingWriter){try{this.streamingWriter.writeIndex(this.testIndex);let i={testRunId:this.testRunId??"",startedAt:this.startedAt,completedAt:new Date().toISOString(),totalDuration:Date.now()-new Date(this.startedAt).getTime(),...this.summaryCounters,metadata:null,reportMode:"streaming",files:[],enrichedSummary:null,validation:null,writeErrors:this.streamingWriter.getWriteErrors()};this.streamingWriter.writeSummary(i);}catch{}this.streamingWriter.dispose();}try{if(this.cloudClient?.isCloudMode()&&this.cloudRunId){let i=this.cloudClient.getAccessToken();i&&gt(this.cloudClient.getEndpoint(),i,this.cloudRunId,this.startedAt);}}catch{}};process.on("SIGTERM",o),process.on("SIGINT",o);}if(this.config.includeArtifacts){let a=dirname(this.config.outputPath);this.runTimestamp=xr(join(a,"artifacts"));try{Rr(join(a,"artifacts"));}catch{}}let s=F();this.detectedOs=ei(),this.detectedSource=Qa(s);try{this.cloudClient=new me(this.config.cloud),await this.cloudClient.initialize(),this.cloudRunId=await Qr(this.cloudClient,this.config.cloud?.uploadStrategy,this.testRunId,this.startedAt,this.detectedSource);}catch{this.cloudClient?.switchToLocalMode("init_error");}if(this.activeReportMode!=="streaming"){let a=()=>{try{if(this.cloudClient?.isCloudMode()&&this.cloudRunId){let o=this.cloudClient.getAccessToken();o&&gt(this.cloudClient.getEndpoint(),o,this.cloudRunId,this.startedAt);}}catch{}};process.on("SIGTERM",a),process.on("SIGINT",a);}}catch{}}onTestBegin(e,r){try{e.annotations.push({type:ni,description:si(this.apiConfig)});}catch{}}onTestEnd(e,r){try{let n=r,s=e.outcome(),a;s==="flaky"?a="flaky":s==="skipped"?a="skipped":a=wt(n.status);let o=n.startTime.toISOString(),i=new Date(n.startTime.getTime()+n.duration).toISOString(),l=e.tags?[...e.tags]:e.annotations.filter(A=>A.type==="tag").map(A=>A.description??""),d=Yr(n.attachments,e.annotations,e.title,a==="skipped");(d.navigations.length>0||d.networkRequestsCount>0||d.apiCallsCount>0)&&(this.fixtureDataReceived=!0);let u=null;if(a==="failed"||a==="flaky"){let R=(a==="flaky"?e.results.find(q=>q.status!=="passed")?.errors??[]:n.errors)[0];if(R){let q=Vt(this.config.redactPatterns),J=R.location?.line??null,K=null;this.config.includeCodeSnippets&&J!==null&&R.location?.file&&(K=Wt(R.location.file,J,this.config.codeContextLines),K&&(K=q(K))),u={message:q(R.message??"Unknown error"),line:J,code:K,stack:this.config.includeStackTrace&&R.stack?q(R.stack):null};}}let p=e.titlePath().filter(Boolean),f=relative(this.rootDir||".",e.location.file),c=Za(p),g=p.join(" > "),h=f,m=Ya(h,c,g),w=ri(l,h,e),T=w!=="mobile"&&d.apiCallsCount>0?"api":w,y=s==="flaky",b=Xa(e.results),C=wt(e.expectedStatus),v=wt(n.status),k=null;if(this.config.includeArtifacts&&a!=="skipped"&&n.attachments){let A=dirname(this.config.outputPath),R=p[p.length-1]??e.title;k=kr(n.attachments,R,n.retry,A,this.runTimestamp||void 0);}let S=this.config.includeActionSteps&&n.steps?Pr(n.steps,n.startTime):null,P=ti(e),E={titlePath:p,title:g,status:a,duration:n.duration,startedAt:o,completedAt:i,retryCount:e.results.length-1,retry:n.retry,tags:l,failure:u,specFile:f,navigations:d.navigations,testId:m,filePath:h,suiteName:c,testType:T,isFlaky:y,retryStatus:b,expectedStatus:C,actualStatus:v,artifacts:k,apiAssertions:d.apiAssertions,actions:S,networkRequestsFile:d.networkRequestsFile,networkRequestsCount:d.networkRequestsCount,consoleLogsFile:d.consoleLogsFile,consoleLogsCount:d.consoleLogsCount,apiCallsFile:d.apiCallsFile,apiCallsCount:d.apiCallsCount,browser:P,os:this.detectedOs||void 0,source:this.detectedSource||void 0},At=d.consoleLogsFile&&d.consoleLogsCount>0?U(d.consoleLogsFile):void 0,Ie=d.networkRequestsFile&&d.networkRequestsCount>0?U(d.networkRequestsFile):void 0,ae=d.apiCallsFile&&d.apiCallsCount>0?U(d.apiCallsFile):void 0,_t=ae?ut(ae):void 0,It=!Ie&&ae?pt(ae):void 0,Lt=d.apiAssertions&&d.apiAssertions.length>0?ft(d.apiAssertions):void 0;this.cloudTestsBuffer.push({testId:m,title:g,status:a,duration:n.duration,suiteName:c,filePath:h,testType:T,isFlaky:y,startedAt:o,completedAt:i,tags:l,failure:u,retry:n.retry,retryCount:e.results.length-1,retryStatus:b,browser:P,os:this.detectedOs||void 0,source:this.detectedSource||void 0,...S&&S.length>0?{actions:S}:{},...At?{consoleLogs:At}:{},...Ie?{networkRequests:Ie}:It?{networkRequests:It}:{},..._t?{apiCalls:_t}:{},...Lt?{protocolAssertions:Lt}:{}});try{let A=this.config.cloud?.uploadStrategy;if(this.cloudClient?.isCloudMode()&&this.cloudRunId&&(A==="realtime"||A==="both")){let R=this.cloudClient.getAccessToken();R&&Jr(this.cloudClient.getEndpoint(),R,this.cloudRunId,this.buildCloudTestPayload(E));}}catch{}if(this.activeReportMode==="streaming"&&this.streamingWriter){let A=Le(h,p,e.id??"",n.retry),R=n.retry===e.results.length-1,q={id:A,navigations:d.navigations,apiAssertions:d.apiAssertions,actions:S??[],artifacts:k,failureDiagnostic:u,hasNetworkFile:d.networkRequestsFile!==null,networkRequestsCount:d.networkRequestsCount,hasConsoleFile:d.consoleLogsFile!==null,consoleLogsCount:d.consoleLogsCount,hasApiCallsFile:d.apiCallsFile!==null,apiCallsCount:d.apiCallsCount,startedAt:o};this.streamingWriter.writeTestDetail(A,q,{networkRequestsFile:d.networkRequestsFile,consoleLogsFile:d.consoleLogsFile,apiCallsFile:d.apiCallsFile});let J={id:A,title:p[p.length-1]??e.title,titlePath:p,filePath:h,status:a,duration:n.duration,project:p[1]??"",retryIndex:n.retry,tags:l,hasNetworkData:d.networkRequestsCount>0,hasConsoleData:d.consoleLogsCount>0,hasArtifacts:k!==null,hasActionSteps:(S?.length??0)>0,errorMessage:u?.message?.split(`
2584
+ `),this.activeReportMode==="streaming"){let a=dirname(this.config.outputPath);this.streamingWriter=new Z(a);let o=()=>{if(this.streamingWriter){try{this.streamingWriter.writeIndex(this.testIndex);let i={testRunId:this.testRunId??"",startedAt:this.startedAt,completedAt:new Date().toISOString(),totalDuration:Date.now()-new Date(this.startedAt).getTime(),...this.summaryCounters,metadata:null,reportMode:"streaming",files:[],enrichedSummary:null,validation:null,writeErrors:this.streamingWriter.getWriteErrors()};this.streamingWriter.writeSummary(i);}catch{}this.streamingWriter.dispose();}try{if(this.cloudClient?.isCloudMode()&&this.cloudRunId){let i=this.cloudClient.getAccessToken();i&&gt(this.cloudClient.getEndpoint(),i,this.cloudRunId,this.startedAt);}}catch{}};process.on("SIGTERM",o),process.on("SIGINT",o);}if(this.config.includeArtifacts){let a=dirname(this.config.outputPath);this.runTimestamp=xr(join(a,"artifacts"));try{Rr(join(a,"artifacts"));}catch{}}let s=F();this.detectedOs=ei(),this.detectedSource=Qa(s);try{this.cloudClient=new me(this.config.cloud),await this.cloudClient.initialize(),this.cloudRunId=await Qr(this.cloudClient,this.config.cloud?.uploadStrategy,this.testRunId,this.startedAt,this.detectedSource);}catch{this.cloudClient?.switchToLocalMode("init_error");}if(this.activeReportMode!=="streaming"){let a=()=>{try{if(this.cloudClient?.isCloudMode()&&this.cloudRunId){let o=this.cloudClient.getAccessToken();o&&gt(this.cloudClient.getEndpoint(),o,this.cloudRunId,this.startedAt);}}catch{}};process.on("SIGTERM",a),process.on("SIGINT",a);}}catch{}}onTestBegin(e,r){try{e.annotations.push({type:ni,description:si(this.apiConfig)});}catch{}}onTestEnd(e,r){try{let n=r,s=e.outcome(),a;s==="flaky"?a="flaky":s==="skipped"?a="skipped":a=wt(n.status);let o=n.startTime.toISOString(),i=new Date(n.startTime.getTime()+n.duration).toISOString(),l=e.tags?[...e.tags]:e.annotations.filter(A=>A.type==="tag").map(A=>A.description??""),d=Yr(n.attachments,e.annotations,e.title,a==="skipped");(d.navigations.length>0||d.networkRequestsCount>0||d.apiCallsCount>0)&&(this.fixtureDataReceived=!0);let u=null;if(a==="failed"||a==="flaky"){let R=(a==="flaky"?e.results.find(q=>q.status!=="passed")?.errors??[]:n.errors)[0];if(R){let q=Wt(this.config.redactPatterns),J=R.location?.line??null,K=null;this.config.includeCodeSnippets&&J!==null&&R.location?.file&&(K=Vt(R.location.file,J,this.config.codeContextLines),K&&(K=q(K))),u={message:q(R.message??"Unknown error"),line:J,code:K,stack:this.config.includeStackTrace&&R.stack?q(R.stack):null};}}let p=e.titlePath().filter(Boolean),f=relative(this.rootDir||".",e.location.file),c=Za(p),g=p.join(" > "),h=f,m=Ya(h,c,g),w=ri(l,h,e),T=w!=="mobile"&&d.apiCallsCount>0?"api":w,y=s==="flaky",b=Xa(e.results),C=wt(e.expectedStatus),v=wt(n.status),k=null;if(this.config.includeArtifacts&&a!=="skipped"&&n.attachments){let A=dirname(this.config.outputPath),R=p[p.length-1]??e.title;k=kr(n.attachments,R,n.retry,A,this.runTimestamp||void 0);}let S=this.config.includeActionSteps&&n.steps?Pr(n.steps,n.startTime):null,P=ti(e),E={titlePath:p,title:g,status:a,duration:n.duration,startedAt:o,completedAt:i,retryCount:e.results.length-1,retry:n.retry,tags:l,failure:u,specFile:f,navigations:d.navigations,testId:m,filePath:h,suiteName:c,testType:T,isFlaky:y,retryStatus:b,expectedStatus:C,actualStatus:v,artifacts:k,apiAssertions:d.apiAssertions,actions:S,networkRequestsFile:d.networkRequestsFile,networkRequestsCount:d.networkRequestsCount,consoleLogsFile:d.consoleLogsFile,consoleLogsCount:d.consoleLogsCount,apiCallsFile:d.apiCallsFile,apiCallsCount:d.apiCallsCount,browser:P,os:this.detectedOs||void 0,source:this.detectedSource||void 0},At=d.consoleLogsFile&&d.consoleLogsCount>0?U(d.consoleLogsFile):void 0,Ie=d.networkRequestsFile&&d.networkRequestsCount>0?U(d.networkRequestsFile):void 0,ae=d.apiCallsFile&&d.apiCallsCount>0?U(d.apiCallsFile):void 0,_t=ae?ut(ae):void 0,It=!Ie&&ae?pt(ae):void 0,Lt=d.apiAssertions&&d.apiAssertions.length>0?ft(d.apiAssertions):void 0;this.cloudTestsBuffer.push({testId:m,title:g,status:a,duration:n.duration,suiteName:c,filePath:h,testType:T,isFlaky:y,startedAt:o,completedAt:i,tags:l,failure:u,retry:n.retry,retryCount:e.results.length-1,retryStatus:b,browser:P,os:this.detectedOs||void 0,source:this.detectedSource||void 0,...S&&S.length>0?{actions:S}:{},...At?{consoleLogs:At}:{},...Ie?{networkRequests:Ie}:It?{networkRequests:It}:{},..._t?{apiCalls:_t}:{},...Lt?{protocolAssertions:Lt}:{}});try{let A=this.config.cloud?.uploadStrategy;if(this.cloudClient?.isCloudMode()&&this.cloudRunId&&(A==="realtime"||A==="both")){let R=this.cloudClient.getAccessToken();R&&Jr(this.cloudClient.getEndpoint(),R,this.cloudRunId,this.buildCloudTestPayload(E));}}catch{}if(this.activeReportMode==="streaming"&&this.streamingWriter){let A=Le(h,p,e.id??"",n.retry),R=n.retry===e.results.length-1,q={id:A,navigations:d.navigations,apiAssertions:d.apiAssertions,actions:S??[],artifacts:k,failureDiagnostic:u,hasNetworkFile:d.networkRequestsFile!==null,networkRequestsCount:d.networkRequestsCount,hasConsoleFile:d.consoleLogsFile!==null,consoleLogsCount:d.consoleLogsCount,hasApiCallsFile:d.apiCallsFile!==null,apiCallsCount:d.apiCallsCount,startedAt:o};this.streamingWriter.writeTestDetail(A,q,{networkRequestsFile:d.networkRequestsFile,consoleLogsFile:d.consoleLogsFile,apiCallsFile:d.apiCallsFile});let J={id:A,title:p[p.length-1]??e.title,titlePath:p,filePath:h,status:a,duration:n.duration,project:p[1]??"",retryIndex:n.retry,tags:l,hasNetworkData:d.networkRequestsCount>0,hasConsoleData:d.consoleLogsCount>0,hasArtifacts:k!==null,hasActionSteps:(S?.length??0)>0,errorMessage:u?.message?.split(`
2585
2585
  `)[0]??null,networkCount:d.networkRequestsCount,consoleCount:d.consoleLogsCount,actionCount:S?.length??0,isRetry:!R};if(this.testIndex.push(J),R)switch(this.summaryCounters.total++,a){case "passed":this.summaryCounters.passed++;break;case "failed":this.summaryCounters.failed++;break;case "flaky":this.summaryCounters.flaky++;break;case "skipped":this.summaryCounters.skipped++;break;case "timedout":this.summaryCounters.timedOut++;break;default:this.summaryCounters.interrupted++;break}this.summaryCounters.totalApiCalls+=d.apiCallsCount,this.summaryCounters.totalAssertions+=d.apiAssertions.length,this.summaryCounters.totalNavigations+=d.navigations.length,this.summaryCounters.totalNetworkRequests+=d.networkRequestsCount,this.summaryCounters.totalConsoleLogs+=d.consoleLogsCount,this.summaryCounters.totalActionSteps+=S?.length??0,k&&this.pendingArtifactEntries.push({testId:m,artifacts:k,outputDir:dirname(this.config.outputPath)}),E.actions=null,E.apiAssertions=null,E.navigations=[],E.artifacts=null,E.failure=null,E.networkRequestsFile=null,E.consoleLogsFile=null,E.apiCallsFile=null;}this.activeReportMode!=="streaming"&&this.collectedTests.push(E),this.testCount++,this.checkMemoryPressure();}catch{}}async onEnd(e){try{let r=new Date().toISOString(),n=new Date(this.startedAt).getTime(),a=new Date(r).getTime()-n,o=this.activeReportMode==="streaming"?this.testIndex.some(l=>l.status!=="skipped"):this.collectedTests.some(l=>l.status!=="skipped");!this.fixtureDataReceived&&o&&process.stderr.write(`
2586
2586
  \u26A0 TestRelic: No fixture data received from any test.
2587
2587
  To enable network logs, video sync, and timeline tracking, import the TestRelic fixture:
@@ -2598,8 +2598,8 @@ ${s}
2598
2598
  `),this.switchToStreamingMode()):n>.8&&process.stderr.write(`[testrelic] WARNING: Memory pressure detected (${Math.round(r)} MB used).
2599
2599
  `);}catch{}}switchToStreamingMode(){try{if(this.activeReportMode==="streaming")return;this.activeReportMode="streaming";let e=dirname(this.config.outputPath);this.streamingWriter=new Z(e);for(let r of this.collectedTests){let n=Le(r.filePath,r.titlePath,r.testId,r.retry),s={id:n,navigations:r.navigations??[],apiAssertions:r.apiAssertions??[],actions:r.actions??[],artifacts:r.artifacts,failureDiagnostic:r.failure,hasNetworkFile:r.networkRequestsFile!==null,networkRequestsCount:r.networkRequestsCount,hasConsoleFile:r.consoleLogsFile!==null,consoleLogsCount:r.consoleLogsCount,hasApiCallsFile:r.apiCallsFile!==null,apiCallsCount:r.apiCallsCount,startedAt:r.startedAt};this.streamingWriter.writeTestDetail(n,s,{networkRequestsFile:r.networkRequestsFile,consoleLogsFile:r.consoleLogsFile,apiCallsFile:r.apiCallsFile});let a={id:n,title:r.titlePath[r.titlePath.length-1]??r.title,titlePath:r.titlePath,filePath:r.filePath,status:r.status,duration:r.duration,project:r.titlePath[1]??"",retryIndex:r.retry,tags:r.tags,hasNetworkData:r.networkRequestsCount>0,hasConsoleData:r.consoleLogsCount>0,hasArtifacts:r.artifacts!==null,hasActionSteps:(r.actions?.length??0)>0,errorMessage:r.failure?.message?.split(`
2600
2600
  `)[0]??null,networkCount:r.networkRequestsCount,consoleCount:r.consoleLogsCount,actionCount:r.actions?.length??0,isRetry:!1};switch(this.testIndex.push(a),this.summaryCounters.total++,r.status){case "passed":this.summaryCounters.passed++;break;case "failed":this.summaryCounters.failed++;break;case "flaky":this.summaryCounters.flaky++;break;case "skipped":this.summaryCounters.skipped++;break;case "timedout":this.summaryCounters.timedOut++;break;default:this.summaryCounters.interrupted++;break}this.summaryCounters.totalApiCalls+=r.apiCallsCount,this.summaryCounters.totalAssertions+=r.apiAssertions?.length??0,this.summaryCounters.totalNavigations+=r.navigations?.length??0,this.summaryCounters.totalNetworkRequests+=r.networkRequestsCount,this.summaryCounters.totalConsoleLogs+=r.consoleLogsCount,this.summaryCounters.totalActionSteps+=r.actions?.length??0;}this.collectedTests.length=0;}catch{}}buildTimeline(){let e=this.collectedTests.map(r=>({titlePath:r.titlePath,title:r.title,status:r.status,duration:r.duration,startedAt:r.startedAt,completedAt:r.completedAt,retryCount:r.retryCount,retry:r.retry,tags:r.tags,failure:r.failure,specFile:r.specFile,navigations:r.navigations,apiCalls:null,apiAssertions:r.apiAssertions,testId:r.testId,filePath:r.filePath,suiteName:r.suiteName,testType:r.testType,isFlaky:r.isFlaky,retryStatus:r.retryStatus,expectedStatus:r.expectedStatus,actualStatus:r.actualStatus,artifacts:r.artifacts,networkRequests:null,actions:r.actions,consoleLogs:null}));return Ir(e,{navigationTypes:this.config.navigationTypes})}readJsonlFile(e){if(!e)return null;let r=U(e);return r.length>0?r:null}toTestResult(e,r){let n=null,s=null,a=null;return r?.loadFiles&&(n=this.readJsonlFile(e.networkRequestsFile),s=this.readJsonlFile(e.consoleLogsFile),a=this.readJsonlFile(e.apiCallsFile)),{title:e.title,status:e.status,duration:e.duration,startedAt:e.startedAt,completedAt:e.completedAt,retryCount:e.retryCount,tags:e.tags,failure:e.failure,testId:e.testId,filePath:e.filePath,suiteName:e.suiteName,testType:e.testType,isFlaky:e.isFlaky,retryStatus:e.retryStatus,expectedStatus:e.expectedStatus,actualStatus:e.actualStatus,artifacts:e.artifacts,networkRequests:n,apiCalls:a,apiAssertions:e.apiAssertions,actions:e.actions??null,consoleLogs:s}}buildCloudTestPayload(e){let r={title:e.title,status:e.status,duration:e.duration,startedAt:e.startedAt,completedAt:e.completedAt,retry:e.retry,retryCount:e.retryCount,retryStatus:e.retryStatus,tags:e.tags,failure:e.failure,testId:e.testId,filePath:e.filePath,suiteName:e.suiteName,testType:e.testType,isFlaky:e.isFlaky,expectedStatus:e.expectedStatus,actualStatus:e.actualStatus,artifacts:e.artifacts,actions:e.actions??[],navigations:e.navigations??[],steps:e.actions??[],browser:e.browser,os:e.os,source:e.source};if(e.apiAssertions&&e.apiAssertions.length>0&&(r.protocolAssertions=ft(e.apiAssertions)),e.consoleLogsFile&&(r.consoleLogs=U(e.consoleLogsFile)),e.networkRequestsFile&&(r.networkRequests=U(e.networkRequestsFile)),e.apiCallsFile){let n=U(e.apiCallsFile);r.apiCalls=ut(n),(!r.networkRequests||r.networkRequests.length===0)&&(r.networkRequests=pt(n));}return r}writeReport(e){try{let r=JSON.stringify(e),n=this.config.outputPath,s=dirname(n);mkdirSync(s,{recursive:!0});let a=n+".tmp";writeFileSync(a,r,"utf-8"),renameSync(a,n);}catch(r){process.stderr.write(`[testrelic] Failed to write report: ${r instanceof Error?r.message:String(r)}
2601
- `);}}};var di=["text/","application/json","application/xml","application/javascript","application/x-www-form-urlencoded","application/graphql"];function ci(t){let e=t.toLowerCase();return di.some(r=>e.includes(r))}var Se=class t{constructor(e,r){this.page=e;this.records=[];this.listeners=[];this.navCounters=[];this.pendingRequests=new Map;this.networkWriter=null;this.consoleWriter=null;this.pendingBodyReads=[];this.requestIdCounter=0;this.networkRequestCount=0;this.consoleLogCount=0;this.includeNetworkStats=r?.includeNetworkStats??true,this.origGoto=e.goto.bind(e),this.origGoBack=e.goBack.bind(e),this.origGoForward=e.goForward.bind(e),this.origReload=e.reload.bind(e);try{this.includeNetworkStats&&(this.networkWriter=new M("network")),this.consoleWriter=new M("console");}catch{}this.interceptMethods(),this.attachListeners();}async init(){await this.injectSPADetection();}async finalizeCapturedRequests(){await Promise.allSettled(this.pendingBodyReads),this.pendingBodyReads=[];for(let[,e]of this.pendingRequests)this.networkWriter&&(this.networkWriter.append({url:e.url,method:e.method,resourceType:e.resourceType,statusCode:0,responseTimeMs:Date.now()-e.startTimeMs,startedAt:e.startedAt,requestHeaders:e.headers,requestBody:e.postData,responseBody:null,responseHeaders:null,contentType:null,responseSize:0,requestBodyTruncated:e.postDataTruncated,responseBodyTruncated:false,isBinary:false,error:"incomplete"}),this.networkRequestCount++);this.pendingRequests.clear(),this.networkWriter?.close(),this.consoleWriter?.close();}static mapConsoleType(e){switch(e){case "log":return "log";case "warning":return "warn";case "error":return "error";case "info":return "info";case "debug":return "debug";default:return "log"}}async getFileData(){this.assembleNetworkStats();let e=this.records.map(r=>({url:r.url,navigationType:r.navigationType,timestamp:r.timestamp,domContentLoadedAt:r.domContentLoadedAt,networkIdleAt:r.networkIdleAt,networkStats:r.networkStats}));return this.includeNetworkStats?await this.finalizeCapturedRequests():this.consoleWriter?.close(),{navigations:e,networkRequestsFile:this.networkWriter?.getCount()?this.networkWriter.getPath():null,networkRequestsCount:this.networkWriter?.getCount()??0,consoleLogsFile:this.consoleWriter?.getCount()?this.consoleWriter.getPath():null,consoleLogsCount:this.consoleWriter?.getCount()??0}}async flushLegacyAnnotations(e){}dispose(){this.page.goto=this.origGoto,this.page.goBack=this.origGoBack,this.page.goForward=this.origGoForward,this.page.reload=this.origReload;for(let{event:e,handler:r}of this.listeners)this.page.off(e,r);this.listeners=[],this.records=[],this.pendingRequests.clear(),this.pendingBodyReads=[],this.networkWriter?.close(),this.consoleWriter?.close();}getRecords(){return this.assembleNetworkStats(),this.records}interceptMethods(){let e=this,r=this.page;r.goto=async function(n,s){return e.recordNavigation(n,"goto"),e.origGoto(n,s)},r.goBack=async function(n){let s=await e.origGoBack(n);return e.recordNavigation(r.url(),"back"),s},r.goForward=async function(n){let s=await e.origGoForward(n);return e.recordNavigation(r.url(),"forward"),s},r.reload=async function(n){return e.recordNavigation(r.url(),"refresh"),e.origReload(n)};}attachListeners(){let e=()=>{this.lastDomContentLoaded=new Date().toISOString(),this.records.length>0&&(this.records[this.records.length-1].domContentLoadedAt=this.lastDomContentLoaded);};this.page.on("domcontentloaded",e),this.listeners.push({event:"domcontentloaded",handler:e});let r=s=>{try{let a=s;if(typeof a.parentFrame=="function"&&a.parentFrame()!==null)return;let o=a.url(),i=this.records[this.records.length-1];if(i&&Date.now()-new Date(i.timestamp).getTime()<50&&i.url===o)return;this.recordNavigation(o,"navigation");}catch{}};this.page.on("framenavigated",r),this.listeners.push({event:"framenavigated",handler:r});let n=s=>{try{let a=s,o=a.type(),i=a.text();if(o==="debug"&&i.startsWith("__testrelic_nav:")){try{let l=JSON.parse(i.slice(16));l.type&&l.url&&this.recordNavigation(l.url,l.type);}catch{}return}{let l=null;try{let u=a.location();u&&u.url&&(l=`${u.url}:${u.lineNumber}:${u.columnNumber}`);}catch{}let d=t.mapConsoleType(o);this.consoleWriter&&(this.consoleWriter.append({level:d,text:i,timestamp:new Date().toISOString(),location:l}),this.consoleLogCount++);}}catch{}};if(this.page.on("console",n),this.listeners.push({event:"console",handler:n}),this.includeNetworkStats){let s=i=>{let l=this.records.length-1,d=this.counterForNav(l);d&&d.totalRequests++;try{let u=i,p=String(this.requestIdCounter++),f=u.postData()??null,c={url:u.url(),method:u.method(),resourceType:this.mapResourceType(u.resourceType()),headers:u.headers(),postData:f,postDataTruncated:!1,startedAt:new Date().toISOString(),startTimeMs:Date.now(),navIndex:l};this.pendingRequests.set(p,c),i.__testrelic_id=p;}catch{}};this.page.on("request",s),this.listeners.push({event:"request",handler:s});let a=i=>{try{let l=i,d=l.request().__testrelic_id,u=d?this.pendingRequests.get(d):void 0,p=this.counterForNav(u?u.navIndex:this.records.length-1);if(p){let T=l.status();T>=400&&(p.failedRequests++,p.failedRequestUrls.push(T+" "+l.url()));let y=l.headers()["content-length"];y&&(p.totalBytes+=parseInt(y,10)||0);let b=l.request().resourceType(),C=this.mapResourceType(b);p.byType[C]++;}if(!d||!u)return;this.pendingRequests.delete(d);let f=Date.now()-u.startTimeMs,c=l.headers(),g=c["content-type"]??null,h=parseInt(c["content-length"]??"0",10)||0,m=g?!ci(g):!1,w=(async()=>{let T=null;if(!m)try{T=(await l.body()).toString("utf-8");}catch{}let y={url:u.url,method:u.method,resourceType:u.resourceType,statusCode:l.status(),responseTimeMs:f,startedAt:u.startedAt,requestHeaders:u.headers,requestBody:u.postData,responseBody:T,responseHeaders:c,contentType:g,responseSize:h,requestBodyTruncated:u.postDataTruncated,responseBodyTruncated:!1,isBinary:m,error:null};this.networkWriter&&(this.networkWriter.append(y),this.networkRequestCount++);})();this.pendingBodyReads.push(w);}catch{}};this.page.on("response",a),this.listeners.push({event:"response",handler:a});let o=i=>{let l=i.__testrelic_id,d=l?this.pendingRequests.get(l):void 0,u=this.counterForNav(d?d.navIndex:this.records.length-1);if(u){u.failedRequests++;try{let p=i;u.failedRequestUrls.push("ERR "+p.url());}catch{}}try{let p=i;if(!l||!d)return;this.pendingRequests.delete(l);let f={url:d.url,method:d.method,resourceType:d.resourceType,statusCode:0,responseTimeMs:Date.now()-d.startTimeMs,startedAt:d.startedAt,requestHeaders:d.headers,requestBody:d.postData,responseBody:null,responseHeaders:null,contentType:null,responseSize:0,requestBodyTruncated:d.postDataTruncated,responseBodyTruncated:!1,isBinary:!1,error:p.failure()?.errorText??"Unknown error"};this.networkWriter&&(this.networkWriter.append(f),this.networkRequestCount++);}catch{}};this.page.on("requestfailed",o),this.listeners.push({event:"requestfailed",handler:o});}}async injectSPADetection(){try{await this.page.addInitScript(()=>{let e=history.pushState.bind(history),r=history.replaceState.bind(history);history.pushState=function(...n){e(...n),console.debug("__testrelic_nav:"+JSON.stringify({type:"spa_route",url:location.href}));},history.replaceState=function(...n){r(...n),console.debug("__testrelic_nav:"+JSON.stringify({type:"spa_replace",url:location.href}));},window.addEventListener("popstate",()=>{console.debug("__testrelic_nav:"+JSON.stringify({type:"popstate",url:location.href}));}),window.addEventListener("hashchange",()=>{console.debug("__testrelic_nav:"+JSON.stringify({type:"hash_change",url:location.href}));});});}catch{}}recordNavigation(e,r){this.records.push({url:e,navigationType:r,timestamp:new Date().toISOString()}),this.includeNetworkStats&&this.navCounters.push(this.createNetworkCounter());}createNetworkCounter(){return {totalRequests:0,failedRequests:0,failedRequestUrls:[],totalBytes:0,byType:{xhr:0,document:0,script:0,stylesheet:0,image:0,font:0,other:0}}}counterForNav(e){return e>=0?this.navCounters[e]:void 0}assembleNetworkStats(){if(this.includeNetworkStats)for(let e=0;e<this.records.length;e++){let r=this.navCounters[e];r&&(this.records[e].networkStats={totalRequests:r.totalRequests,failedRequests:r.failedRequests,failedRequestUrls:[...r.failedRequestUrls],totalBytes:r.totalBytes,byType:{...r.byType}});}}mapResourceType(e){switch(e){case "xhr":case "fetch":return "xhr";case "document":return "document";case "script":return "script";case "stylesheet":return "stylesheet";case "image":return "image";case "font":return "font";default:return "other"}}};var kt=Symbol.for("__testrelic_call_id"),fi="__testrelic_api_assertions",z=new WeakMap,W=class{constructor(){this.assertions=[];this.currentCallId=null;}recordAssertion(e){this.assertions.push(e);}getAssertions(){return this.assertions}setCurrentCallId(e){this.currentCallId=e;}getCurrentCallId(){return this.currentCallId}getData(){return [...this.assertions]}flushLegacyAnnotations(e){this.assertions.length!==0&&e.annotations.push({type:fi,description:JSON.stringify(this.assertions)});}dispose(){this.assertions=[],this.currentCallId=null;}},rn=new Map;function gi(t){let e=rn.get(t);if(e)return e;try{let r=t.startsWith("file://")?fileURLToPath(t):t,s=readFileSync(r,"utf-8").split(`
2601
+ `);}}};var di=["text/","application/json","application/xml","application/javascript","application/x-www-form-urlencoded","application/graphql"];function ci(t){let e=t.toLowerCase();return di.some(r=>e.includes(r))}var Se=class t{constructor(e,r){this.page=e;this.records=[];this.listeners=[];this.navCounters=[];this.pendingRequests=new Map;this.networkWriter=null;this.consoleWriter=null;this.pendingBodyReads=[];this.requestIdCounter=0;this.networkRequestCount=0;this.consoleLogCount=0;this.includeNetworkStats=r?.includeNetworkStats??true,this.origGoto=e.goto.bind(e),this.origGoBack=e.goBack.bind(e),this.origGoForward=e.goForward.bind(e),this.origReload=e.reload.bind(e);try{this.includeNetworkStats&&(this.networkWriter=new M("network")),this.consoleWriter=new M("console");}catch{}this.interceptMethods(),this.attachListeners();}async init(){await this.injectSPADetection();}async finalizeCapturedRequests(){await Promise.allSettled(this.pendingBodyReads),this.pendingBodyReads=[];for(let[,e]of this.pendingRequests)this.networkWriter&&(this.networkWriter.append({url:e.url,method:e.method,resourceType:e.resourceType,statusCode:0,responseTimeMs:Date.now()-e.startTimeMs,startedAt:e.startedAt,requestHeaders:e.headers,requestBody:e.postData,responseBody:null,responseHeaders:null,contentType:null,responseSize:0,requestBodyTruncated:e.postDataTruncated,responseBodyTruncated:false,isBinary:false,error:"incomplete"}),this.networkRequestCount++);this.pendingRequests.clear(),this.networkWriter?.close(),this.consoleWriter?.close();}static mapConsoleType(e){switch(e){case "log":return "log";case "warning":return "warn";case "error":return "error";case "info":return "info";case "debug":return "debug";default:return "log"}}async getFileData(){this.assembleNetworkStats();let e=this.records.map(r=>({url:r.url,navigationType:r.navigationType,timestamp:r.timestamp,domContentLoadedAt:r.domContentLoadedAt,networkIdleAt:r.networkIdleAt,networkStats:r.networkStats}));return this.includeNetworkStats?await this.finalizeCapturedRequests():this.consoleWriter?.close(),{navigations:e,networkRequestsFile:this.networkWriter?.getCount()?this.networkWriter.getPath():null,networkRequestsCount:this.networkWriter?.getCount()??0,consoleLogsFile:this.consoleWriter?.getCount()?this.consoleWriter.getPath():null,consoleLogsCount:this.consoleWriter?.getCount()??0}}async flushLegacyAnnotations(e){}dispose(){this.page.goto=this.origGoto,this.page.goBack=this.origGoBack,this.page.goForward=this.origGoForward,this.page.reload=this.origReload;for(let{event:e,handler:r}of this.listeners)this.page.off(e,r);this.listeners=[],this.records=[],this.pendingRequests.clear(),this.pendingBodyReads=[],this.networkWriter?.close(),this.consoleWriter?.close();}getRecords(){return this.assembleNetworkStats(),this.records}interceptMethods(){let e=this,r=this.page;r.goto=async function(n,s){return e.recordNavigation(n,"goto"),e.origGoto(n,s)},r.goBack=async function(n){let s=await e.origGoBack(n);return e.recordNavigation(r.url(),"back"),s},r.goForward=async function(n){let s=await e.origGoForward(n);return e.recordNavigation(r.url(),"forward"),s},r.reload=async function(n){return e.recordNavigation(r.url(),"refresh"),e.origReload(n)};}attachListeners(){let e=()=>{this.lastDomContentLoaded=new Date().toISOString(),this.records.length>0&&(this.records[this.records.length-1].domContentLoadedAt=this.lastDomContentLoaded);};this.page.on("domcontentloaded",e),this.listeners.push({event:"domcontentloaded",handler:e});let r=s=>{try{let a=s;if(typeof a.parentFrame=="function"&&a.parentFrame()!==null)return;let o=a.url(),i=this.records[this.records.length-1];if(i&&Date.now()-new Date(i.timestamp).getTime()<50&&i.url===o)return;this.recordNavigation(o,"navigation");}catch{}};this.page.on("framenavigated",r),this.listeners.push({event:"framenavigated",handler:r});let n=s=>{try{let a=s,o=a.type(),i=a.text();if(o==="debug"&&i.startsWith("__testrelic_nav:")){try{let l=JSON.parse(i.slice(16));l.type&&l.url&&this.recordNavigation(l.url,l.type);}catch{}return}{let l=null;try{let u=a.location();u&&u.url&&(l=`${u.url}:${u.lineNumber}:${u.columnNumber}`);}catch{}let d=t.mapConsoleType(o);this.consoleWriter&&(this.consoleWriter.append({level:d,text:i,timestamp:new Date().toISOString(),location:l}),this.consoleLogCount++);}}catch{}};if(this.page.on("console",n),this.listeners.push({event:"console",handler:n}),this.includeNetworkStats){let s=i=>{let l=this.records.length-1,d=this.counterForNav(l);d&&d.totalRequests++;try{let u=i,p=String(this.requestIdCounter++),f=u.postData()??null,c={url:u.url(),method:u.method(),resourceType:this.mapResourceType(u.resourceType()),headers:u.headers(),postData:f,postDataTruncated:!1,startedAt:new Date().toISOString(),startTimeMs:Date.now(),navIndex:l};this.pendingRequests.set(p,c),i.__testrelic_id=p;}catch{}};this.page.on("request",s),this.listeners.push({event:"request",handler:s});let a=i=>{try{let l=i,d=l.request().__testrelic_id,u=d?this.pendingRequests.get(d):void 0,p=this.counterForNav(u?u.navIndex:this.records.length-1);if(p){let T=l.status();T>=400&&(p.failedRequests++,p.failedRequestUrls.push(T+" "+l.url()));let y=l.headers()["content-length"];y&&(p.totalBytes+=parseInt(y,10)||0);let b=l.request().resourceType(),C=this.mapResourceType(b);p.byType[C]++;}if(!d||!u)return;this.pendingRequests.delete(d);let f=Date.now()-u.startTimeMs,c=l.headers(),g=c["content-type"]??null,h=parseInt(c["content-length"]??"0",10)||0,m=g?!ci(g):!1,w=(async()=>{let T=null;if(!m)try{T=(await l.body()).toString("utf-8");}catch{}let y={url:u.url,method:u.method,resourceType:u.resourceType,statusCode:l.status(),responseTimeMs:f,startedAt:u.startedAt,requestHeaders:u.headers,requestBody:u.postData,responseBody:T,responseHeaders:c,contentType:g,responseSize:h,requestBodyTruncated:u.postDataTruncated,responseBodyTruncated:!1,isBinary:m,error:null};this.networkWriter&&(this.networkWriter.append(y),this.networkRequestCount++);})();this.pendingBodyReads.push(w);}catch{}};this.page.on("response",a),this.listeners.push({event:"response",handler:a});let o=i=>{let l=i.__testrelic_id,d=l?this.pendingRequests.get(l):void 0,u=this.counterForNav(d?d.navIndex:this.records.length-1);if(u){u.failedRequests++;try{let p=i;u.failedRequestUrls.push("ERR "+p.url());}catch{}}try{let p=i;if(!l||!d)return;this.pendingRequests.delete(l);let f={url:d.url,method:d.method,resourceType:d.resourceType,statusCode:0,responseTimeMs:Date.now()-d.startTimeMs,startedAt:d.startedAt,requestHeaders:d.headers,requestBody:d.postData,responseBody:null,responseHeaders:null,contentType:null,responseSize:0,requestBodyTruncated:d.postDataTruncated,responseBodyTruncated:!1,isBinary:!1,error:p.failure()?.errorText??"Unknown error"};this.networkWriter&&(this.networkWriter.append(f),this.networkRequestCount++);}catch{}};this.page.on("requestfailed",o),this.listeners.push({event:"requestfailed",handler:o});}}async injectSPADetection(){try{await this.page.addInitScript(()=>{let e=history.pushState.bind(history),r=history.replaceState.bind(history);history.pushState=function(...n){e(...n),console.debug("__testrelic_nav:"+JSON.stringify({type:"spa_route",url:location.href}));},history.replaceState=function(...n){r(...n),console.debug("__testrelic_nav:"+JSON.stringify({type:"spa_replace",url:location.href}));},window.addEventListener("popstate",()=>{console.debug("__testrelic_nav:"+JSON.stringify({type:"popstate",url:location.href}));}),window.addEventListener("hashchange",()=>{console.debug("__testrelic_nav:"+JSON.stringify({type:"hash_change",url:location.href}));});});}catch{}}recordNavigation(e,r){this.records.push({url:e,navigationType:r,timestamp:new Date().toISOString()}),this.includeNetworkStats&&this.navCounters.push(this.createNetworkCounter());}createNetworkCounter(){return {totalRequests:0,failedRequests:0,failedRequestUrls:[],totalBytes:0,byType:{xhr:0,document:0,script:0,stylesheet:0,image:0,font:0,other:0}}}counterForNav(e){return e>=0?this.navCounters[e]:void 0}assembleNetworkStats(){if(this.includeNetworkStats)for(let e=0;e<this.records.length;e++){let r=this.navCounters[e];r&&(this.records[e].networkStats={totalRequests:r.totalRequests,failedRequests:r.failedRequests,failedRequestUrls:[...r.failedRequestUrls],totalBytes:r.totalBytes,byType:{...r.byType}});}}mapResourceType(e){switch(e){case "xhr":case "fetch":return "xhr";case "document":return "document";case "script":return "script";case "stylesheet":return "stylesheet";case "image":return "image";case "font":return "font";default:return "other"}}};var kt=Symbol.for("__testrelic_call_id"),fi="__testrelic_api_assertions",z=new WeakMap,V=class{constructor(){this.assertions=[];this.currentCallId=null;}recordAssertion(e){this.assertions.push(e);}getAssertions(){return this.assertions}setCurrentCallId(e){this.currentCallId=e;}getCurrentCallId(){return this.currentCallId}getData(){return [...this.assertions]}flushLegacyAnnotations(e){this.assertions.length!==0&&e.annotations.push({type:fi,description:JSON.stringify(this.assertions)});}dispose(){this.assertions=[],this.currentCallId=null;}},rn=new Map;function gi(t){let e=rn.get(t);if(e)return e;try{let r=t.startsWith("file://")?fileURLToPath(t):t,s=readFileSync(r,"utf-8").split(`
2602
2602
  `);return rn.set(t,s),s}catch{return null}}function hi(){let e=new Error().stack;if(!e)return null;let r=e.split(`
2603
- `);for(let n of r){if(n.includes("/assertion-tracker.")||n.includes("/api-request-tracker.")||n.includes("node:internal")||n.includes(" at new Error")||n.includes(" at captureAssertionLocation")||n.includes(" at expectWrapper")||n.includes(" at wrappedMatcher"))continue;let s=n.match(/at\s+(?:.*?\s+\()?(.+?):(\d+):(\d+)\)?$/);if(s)return {file:s[1],line:parseInt(s[2],10),column:parseInt(s[3],10)}}return null}function mi(t,e){if(!t)return "custom";let r=t.toLowerCase();return r.includes(".status()")&&!r.includes(".statustext()")?r.includes(".ok()")?"statusOk":"status":r.includes(".ok()")?"statusOk":r.includes(".headers()")||r.includes(".headersarray()")?"header":r.includes("tomatchobject")||r.includes("toequal")?"bodyMatch":r.includes("tocontain")||r.includes("tostringcontaining")?"bodyContains":r.includes(".json()")||r.includes(".text()")?"bodyField":"custom"}function yi(t,e,r){let n=function(a,...o){let i=t(),l=e();if(!i||!l)return r(a,...o);let d=null;if(a!=null&&typeof a=="object"){let c=a[kt];typeof c=="string"&&(d=c);}if(!d&&a!==null&&a!==void 0&&typeof a=="object"&&(d=z.get(a)??null),d||(d=l.getCallIdForValue(a)),d||(d=i.getCurrentCallId()),!d)return r(a,...o);let u=hi(),p;if(u){let c=gi(u.file);c&&u.line>0&&u.line<=c.length&&(p=c[u.line-1].trim());}let f=r(a,...o);return d?on(f,{tracker:i,callId:d,received:a,location:u??{file:"unknown",line:0},expression:p}):f};for(let s of Object.keys(r))n[s]=r[s];return n}var sn=null,an=null;function V(t,e){sn=t,an=e;}function Re(t){return yi(()=>sn,()=>an,t)}function on(t,e){return new Proxy(t,{get(r,n,s){let a=Reflect.get(r,n,s);return typeof a!="function"||typeof n=="symbol"?a:n==="not"?on(a,e):function(...i){let l=i[0],d="passed",u=e.received,p=null;try{let f=a.apply(this??r,i);return f&&typeof f=="object"&&typeof f.then=="function"?f.then(()=>{xt(e,n,l,u,"passed");},c=>{throw xt(e,n,l,u,"failed"),c}):f}catch(f){if(d="failed",p=f,f instanceof Error&&f.message){let c=f.message.match(/Received:\s*(.+)/);c&&(u=c[1]);}throw f}finally{(p!==null||d==="passed")&&xt(e,n,l,u,d);}}}})}function xt(t,e,r,n,s){let a=mi(t.expression,t.received),o={callId:t.callId,type:a,expected:nn(r),actual:nn(n),status:s,location:t.location,expression:t.expression};t.tracker.recordAssertion(o);}function nn(t){if(t==null||typeof t=="string"||typeof t=="number"||typeof t=="boolean")return t;try{return JSON.stringify(t),t}catch{return String(t)}}var ln="[REDACTED]";function Ct(t,e){if(t===null||e.length===0)return t;let r=new Set(e.map(s=>s.toLowerCase())),n={};for(let s of Object.keys(t))Object.hasOwn(t,s)&&(n[s]=r.has(s.toLowerCase())?ln:t[s]);return n}function Ae(t,e){if(t===null||e.length===0)return t;let r;try{r=JSON.parse(t);}catch{return t}if(typeof r!="object"||r===null)return t;let n=new Set(e),s=Tt(r,n);return JSON.stringify(s)}function Tt(t,e){if(Array.isArray(t))return t.map(r=>Tt(r,e));if(typeof t=="object"&&t!==null){let r={};for(let n of Object.keys(t)){if(!Object.hasOwn(t,n))continue;let s=t[n];e.has(n)?r[n]=ln:r[n]=Tt(s,e);}return r}return t}function cn(t,e,r){if(r.length>0){for(let n of r)if(dn(t,n))return false}if(e.length>0){for(let n of e)if(dn(t,n))return true;return false}return true}function dn(t,e){try{return e instanceof RegExp?e.test(t):vi(e).test(t)}catch{return console.warn(`[testrelic] Invalid URL filter pattern: ${String(e)}`),false}}function vi(t){let e="",r=0;for(;r<t.length;){let n=t[r];n==="*"&&t[r+1]==="*"?(e+=".*",r+=2,t[r]==="/"&&r++):n==="*"?(e+="[^/]*",r++):n==="?"?(e+="[^/]",r++):".+^${}()|[]\\".includes(n)?(e+="\\"+n,r++):(e+=n,r++);}return new RegExp(e)}var bi=["get","post","put","patch","delete","head","fetch"],wi=["text/","application/json","application/xml","application/javascript","application/x-www-form-urlencoded","application/graphql"];function xi(t){let e=t.toLowerCase();return wi.some(r=>e.includes(r))}function ki(t){if(!t)return null;if(t.data!==void 0&&t.data!==null){let e=t.data;return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("base64"):JSON.stringify(e)}if(t.form!==void 0&&t.form!==null)return JSON.stringify(t.form);if(t.multipart!==void 0&&t.multipart!==null){let e=t.multipart,r={};for(let[n,s]of Object.entries(e))typeof s=="string"||typeof s=="number"||typeof s=="boolean"?r[n]=String(s):s&&typeof s=="object"&&"name"in s?r[n]=`[file: ${s.name}]`:r[n]="[binary]";return JSON.stringify(r)}return null}function un(t){return t?"\u2022\u2022\u2022\u2022":""}function Ti(t){if(!t)return [];let e;for(let[n,s]of Object.entries(t))if(n.toLowerCase()==="cookie"){e=s;break}if(!e)return [];let r=[];for(let n of e.split(";")){let s=n.trim();if(!s)continue;let a=s.indexOf("="),o=a===-1?s:s.slice(0,a).trim(),i=a===-1?"":s.slice(a+1).trim();o&&r.push({name:o,value:un(i)});}return r}function Ci(t){let e=[];for(let r of t){let n=r.trim();if(!n)continue;let s=n.split(";"),a=s[0].indexOf("=");if(a===-1)continue;let o=s[0].slice(0,a).trim(),i=s[0].slice(a+1).trim(),l=s.slice(1).map(d=>d.trim()).filter(Boolean).join(" \xB7 ")||void 0;o&&e.push({name:o,value:un(i),attributes:l});}return e}var _e=class _e{constructor(e,r,n){this.originals=new Map;this.apiCallWriter=null;this.callCounter=0;this.apiCallCount=0;this.disposed=false;this._lastCallId=null;this.primitiveCallIds=new Map;this.context=e,this.assertionTracker=r??null,this.apiConfig=n??_e.DEFAULT_API_CONFIG;try{this.apiCallWriter=new M("api-calls");}catch{}}get lastCallId(){return this._lastCallId}getCallIdForValue(e){return e!=null&&typeof e=="object"?z.get(e)??null:this.primitiveCallIds.get(e)??null}intercept(){for(let r of bi){let n=this.context[r].bind(this.context);this.originals.set(r,n),this.context[r]=this.createWrapper(r,n);}let e=this.context.dispose.bind(this.context);this.originals.set("dispose",e),this.context.dispose=async r=>(this.disposed=true,e(r));}getFileData(){return this.apiCallWriter?.close(),{apiCallsFile:this.apiCallWriter?.getCount()?this.apiCallWriter.getPath():null,apiCallsCount:this.apiCallWriter?.getCount()??0}}flushLegacyAnnotations(e){}dispose(){for(let[e,r]of this.originals)this.context[e]=r;this.originals.clear(),this.apiCallWriter?.close(),this.callCounter=0,this.apiCallCount=0,this._lastCallId=null,this.primitiveCallIds.clear();}get isDisposed(){return this.disposed}getCapturedCallCount(){return this.apiCallCount}tagResponseMethods(e,r){let n=this,s=e.headers.bind(e);e.headers=function(){let c=s();return z.set(c,r),c};let a=e.headersArray.bind(e);e.headersArray=function(){let c=a();return z.set(c,r),c};let o=e.json.bind(e);e.json=async function(){let c=await o();return c!=null&&typeof c=="object"&&z.set(c,r),c};let i=e.status.bind(e);e.status=function(){let c=i();return n.primitiveCallIds.set(c,r),c};let l=e.statusText.bind(e);e.statusText=function(){let c=l();return n.primitiveCallIds.set(c,r),c};let d=e.ok.bind(e);e.ok=function(){let c=d();return n.primitiveCallIds.set(c,r),c};let u=e.text.bind(e);e.text=async function(){let c=await u();return n.primitiveCallIds.set(c,r),c};let p=e.body.bind(e);e.body=async function(){let c=await p();return z.set(c,r),c};}createWrapper(e,r){let n=this;return async function(a,o){if(!cn(a,n.apiConfig.apiIncludeUrls,n.apiConfig.apiExcludeUrls))return r(a,o);let i=`api-call-${n.callCounter++}`,l=new Date().toISOString(),d=e==="fetch"?(o?.method??"GET").toUpperCase():e.toUpperCase(),u=ki(o),p=performance.now();n._lastCallId=i,n.assertionTracker&&n.assertionTracker.setCurrentCallId(i);let f;try{f=await r(a,o);}catch(c){let g=performance.now();try{let h=n.apiConfig.captureRequestBody?Ae(u,n.apiConfig.redactBodyFields):null,m={id:i,timestamp:l,method:d,url:a,requestHeaders:null,requestBody:h,responseStatusCode:null,responseStatusText:null,responseHeaders:null,responseBody:null,responseTimeMs:Math.round((g-p)*100)/100,isBinary:!1,error:c instanceof Error?c.message:String(c)};n.apiCallWriter&&(n.apiCallWriter.append(m),n.apiCallCount++);}catch{}throw c}try{let c=performance.now(),g=f.headers(),h=g["content-type"]??null,m=h?!xi(h):!1,w=null;n.apiConfig.captureRequestHeaders&&o?.headers&&(w=o.headers);let T=null;n.apiConfig.captureResponseHeaders&&(T=g);let y=n.apiConfig.captureRequestBody?u:null,b=null;if(n.apiConfig.captureResponseBody)try{m?b=(await f.body()).toString("base64"):b=await f.text();}catch{}let C=[],v=[];try{if(n.apiConfig.captureRequestHeaders&&(C=Ti(o?.headers)),n.apiConfig.captureResponseHeaders){let S=f.headersArray().filter(P=>P.name.toLowerCase()==="set-cookie").map(P=>P.value);v=Ci(S);}}catch{}w=Ct(w,n.apiConfig.redactHeaders),T=Ct(T,n.apiConfig.redactHeaders),y=Ae(y,n.apiConfig.redactBodyFields),b=Ae(b,n.apiConfig.redactBodyFields);let k={id:i,timestamp:l,method:d,url:f.url(),requestHeaders:w,requestBody:y,responseStatusCode:f.status(),responseStatusText:f.statusText(),responseHeaders:T,responseBody:b,requestCookies:C.length?C:null,responseCookies:v.length?v:null,responseTimeMs:Math.round((c-p)*100)/100,isBinary:m,error:null};n.apiCallWriter&&(n.apiCallWriter.append(k),n.apiCallCount++);}catch{}try{f[kt]=i,n.tagResponseMethods(f,i);}catch{}return f}}};_e.DEFAULT_API_CONFIG=Object.freeze({trackApiCalls:true,captureRequestHeaders:true,captureResponseHeaders:true,captureRequestBody:true,captureResponseBody:true,captureAssertions:true,redactHeaders:["authorization","cookie","set-cookie","x-api-key"],redactBodyFields:["password","secret","token","apiKey","api_key"],apiIncludeUrls:[],apiExcludeUrls:[]});var G=_e;Re(expect);var Ai="__testrelic_api_config",_i="__testrelic_config_trackApiCalls";function Rt(t){let e=t.annotations.find(n=>n.type===Ai&&n.description!==void 0);if(e)try{return JSON.parse(e.description,Ii)}catch{}let r=t.annotations.find(n=>n.type===_i&&n.description!==void 0);return r?{trackApiCalls:r.description!=="false",captureRequestHeaders:true,captureResponseHeaders:true,captureRequestBody:true,captureResponseBody:true,captureAssertions:true,redactHeaders:["authorization","cookie","set-cookie","x-api-key"],redactBodyFields:["password","secret","token","apiKey","api_key"],apiIncludeUrls:[],apiExcludeUrls:[]}:{trackApiCalls:true,captureRequestHeaders:true,captureResponseHeaders:true,captureRequestBody:true,captureResponseBody:true,captureAssertions:true,redactHeaders:["authorization","cookie","set-cookie","x-api-key"],redactBodyFields:["password","secret","token","apiKey","api_key"],apiIncludeUrls:[],apiExcludeUrls:[]}}function Ii(t,e){if(typeof e=="object"&&e!==null&&e.__regexp===true&&typeof e.source=="string"){let{source:r,flags:n}=e;return new RegExp(r,n)}return e}var hn={page:async({page:t},e,r)=>{let n=new Se(t);try{await n.init();}catch{}await e(t);try{let{navigations:s,networkRequestsFile:a,networkRequestsCount:o,consoleLogsFile:i,consoleLogsCount:l}=await n.getFileData(),d={testRelicData:!0,version:PAYLOAD_VERSION,navigations:s,apiAssertions:[],networkRequestsFile:a,networkRequestsCount:o,consoleLogsFile:i,consoleLogsCount:l,apiCallsFile:null,apiCallsCount:0};await r.attach(ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(d)),contentType:ATTACHMENT_CONTENT_TYPE});}catch{}n.dispose();},request:async({request:t},e,r)=>{let n=Rt(r);if(!n.trackApiCalls){await e(t);return}let s=new W,a=new G(t,s,n);a.intercept(),V(s,a);try{await e(t);}finally{V(null,null);}try{let{apiCallsFile:o,apiCallsCount:i}=a.getFileData(),l=n.captureAssertions?s.getData():[],d={testRelicData:!0,version:PAYLOAD_VERSION,navigations:[],apiAssertions:l,networkRequestsFile:null,networkRequestsCount:0,consoleLogsFile:null,consoleLogsCount:0,apiCallsFile:o,apiCallsCount:i};await r.attach(ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(d)),contentType:ATTACHMENT_CONTENT_TYPE});}catch{}a.dispose(),s.dispose();}};test.extend(hn);Re(expect);var Ni={request:async({request:t},e,r)=>{let n=Rt(r);if(!n.trackApiCalls){await e(t);return}let s=new W,a=new G(t,s,n);a.intercept(),V(s,a);let o=null;try{o=new M("api-console");}catch{}let i=0,l=process.stdout.write,d=process.stderr.write;process.stdout.write=function(u,...p){try{let f=typeof u=="string"?u:Buffer.isBuffer(u)?u.toString("utf-8"):String(u);!f.startsWith("[testrelic]")&&!f.startsWith("\u2139 TestRelic")&&!f.startsWith("\u2713 TestRelic")&&!f.startsWith("\u26A0 TestRelic")&&o&&(o.append({level:"stdout",text:f.replace(/\n$/,""),timestamp:new Date().toISOString(),location:null}),i++);}catch{}return l.apply(process.stdout,[u,...p])},process.stderr.write=function(u,...p){try{let f=typeof u=="string"?u:Buffer.isBuffer(u)?u.toString("utf-8"):String(u);!f.startsWith("[testrelic]")&&!f.startsWith("\u26A0 TestRelic")&&o&&(o.append({level:"stderr",text:f.replace(/\n$/,""),timestamp:new Date().toISOString(),location:null}),i++);}catch{}return d.apply(process.stderr,[u,...p])};try{await e(t);}finally{process.stdout.write=l,process.stderr.write=d,V(null,null);}try{o?.close();let{apiCallsFile:u,apiCallsCount:p}=a.getFileData(),f=n.captureAssertions?s.getData():[],c={testRelicData:!0,version:PAYLOAD_VERSION,navigations:[],apiAssertions:f,networkRequestsFile:null,networkRequestsCount:0,consoleLogsFile:i>0?o?.getPath()??null:null,consoleLogsCount:i,apiCallsFile:u,apiCallsCount:p};await r.attach(ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(c)),contentType:ATTACHMENT_CONTENT_TYPE});}catch{}a.dispose(),s.dispose();}};var mn="@testrelic/playwright-analytics";function Di(t){return Array.isArray(t)?t.some(e=>Array.isArray(e)&&typeof e[0]=="string"&&e[0]===mn):false}function Bi(t,e){let n={video:"on",screenshot:"on",trace:"on",...t.use??{}},s;Array.isArray(t.reporter)?s=t.reporter:typeof t.reporter=="string"?s=[[t.reporter]]:s=[["list"]];let a=Di(s)?s:[...s,[mn,e??{}]];return defineConfig({...t,use:n,reporter:a})}var yn=false;function Zd(t,e,r="manual_record"){if(!t||!t.annotations){yn||(yn=true,process.stderr.write(`[testrelic] recordNavigation: reporter not active, navigation not recorded
2603
+ `);for(let n of r){if(n.includes("/assertion-tracker.")||n.includes("/api-request-tracker.")||n.includes("node:internal")||n.includes(" at new Error")||n.includes(" at captureAssertionLocation")||n.includes(" at expectWrapper")||n.includes(" at wrappedMatcher"))continue;let s=n.match(/at\s+(?:.*?\s+\()?(.+?):(\d+):(\d+)\)?$/);if(s)return {file:s[1],line:parseInt(s[2],10),column:parseInt(s[3],10)}}return null}function mi(t,e){if(!t)return "custom";let r=t.toLowerCase();return r.includes(".status()")&&!r.includes(".statustext()")?r.includes(".ok()")?"statusOk":"status":r.includes(".ok()")?"statusOk":r.includes(".headers()")||r.includes(".headersarray()")?"header":r.includes("tomatchobject")||r.includes("toequal")?"bodyMatch":r.includes("tocontain")||r.includes("tostringcontaining")?"bodyContains":r.includes(".json()")||r.includes(".text()")?"bodyField":"custom"}function yi(t,e,r){let n=function(a,...o){let i=t(),l=e();if(!i||!l)return r(a,...o);let d=null;if(a!=null&&typeof a=="object"){let c=a[kt];typeof c=="string"&&(d=c);}if(!d&&a!==null&&a!==void 0&&typeof a=="object"&&(d=z.get(a)??null),d||(d=l.getCallIdForValue(a)),d||(d=i.getCurrentCallId()),!d)return r(a,...o);let u=hi(),p;if(u){let c=gi(u.file);c&&u.line>0&&u.line<=c.length&&(p=c[u.line-1].trim());}let f=r(a,...o);return d?on(f,{tracker:i,callId:d,received:a,location:u??{file:"unknown",line:0},expression:p}):f};for(let s of Object.keys(r))n[s]=r[s];return n}var sn=null,an=null;function W(t,e){sn=t,an=e;}function Re(t){return yi(()=>sn,()=>an,t)}function on(t,e){return new Proxy(t,{get(r,n,s){let a=Reflect.get(r,n,s);return typeof a!="function"||typeof n=="symbol"?a:n==="not"?on(a,e):function(...i){let l=i[0],d="passed",u=e.received,p=null;try{let f=a.apply(this??r,i);return f&&typeof f=="object"&&typeof f.then=="function"?f.then(()=>{xt(e,n,l,u,"passed");},c=>{throw xt(e,n,l,u,"failed"),c}):f}catch(f){if(d="failed",p=f,f instanceof Error&&f.message){let c=f.message.match(/Received:\s*(.+)/);c&&(u=c[1]);}throw f}finally{(p!==null||d==="passed")&&xt(e,n,l,u,d);}}}})}function xt(t,e,r,n,s){let a=mi(t.expression,t.received),o={callId:t.callId,type:a,expected:nn(r),actual:nn(n),status:s,location:t.location,expression:t.expression};t.tracker.recordAssertion(o);}function nn(t){if(t==null||typeof t=="string"||typeof t=="number"||typeof t=="boolean")return t;try{return JSON.stringify(t),t}catch{return String(t)}}var ln="[REDACTED]";function Ct(t,e){if(t===null||e.length===0)return t;let r=new Set(e.map(s=>s.toLowerCase())),n={};for(let s of Object.keys(t))Object.hasOwn(t,s)&&(n[s]=r.has(s.toLowerCase())?ln:t[s]);return n}function Ae(t,e){if(t===null||e.length===0)return t;let r;try{r=JSON.parse(t);}catch{return t}if(typeof r!="object"||r===null)return t;let n=new Set(e),s=Tt(r,n);return JSON.stringify(s)}function Tt(t,e){if(Array.isArray(t))return t.map(r=>Tt(r,e));if(typeof t=="object"&&t!==null){let r={};for(let n of Object.keys(t)){if(!Object.hasOwn(t,n))continue;let s=t[n];e.has(n)?r[n]=ln:r[n]=Tt(s,e);}return r}return t}function cn(t,e,r){if(r.length>0){for(let n of r)if(dn(t,n))return false}if(e.length>0){for(let n of e)if(dn(t,n))return true;return false}return true}function dn(t,e){try{return e instanceof RegExp?e.test(t):vi(e).test(t)}catch{return console.warn(`[testrelic] Invalid URL filter pattern: ${String(e)}`),false}}function vi(t){let e="",r=0;for(;r<t.length;){let n=t[r];n==="*"&&t[r+1]==="*"?(e+=".*",r+=2,t[r]==="/"&&r++):n==="*"?(e+="[^/]*",r++):n==="?"?(e+="[^/]",r++):".+^${}()|[]\\".includes(n)?(e+="\\"+n,r++):(e+=n,r++);}return new RegExp(e)}var bi=["get","post","put","patch","delete","head","fetch"],wi=["text/","application/json","application/xml","application/javascript","application/x-www-form-urlencoded","application/graphql"];function xi(t){let e=t.toLowerCase();return wi.some(r=>e.includes(r))}function ki(t){if(!t)return null;if(t.data!==void 0&&t.data!==null){let e=t.data;return typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("base64"):JSON.stringify(e)}if(t.form!==void 0&&t.form!==null)return JSON.stringify(t.form);if(t.multipart!==void 0&&t.multipart!==null){let e=t.multipart,r={};for(let[n,s]of Object.entries(e))typeof s=="string"||typeof s=="number"||typeof s=="boolean"?r[n]=String(s):s&&typeof s=="object"&&"name"in s?r[n]=`[file: ${s.name}]`:r[n]="[binary]";return JSON.stringify(r)}return null}function un(t){return t?"\u2022\u2022\u2022\u2022":""}function Ti(t){if(!t)return [];let e;for(let[n,s]of Object.entries(t))if(n.toLowerCase()==="cookie"){e=s;break}if(!e)return [];let r=[];for(let n of e.split(";")){let s=n.trim();if(!s)continue;let a=s.indexOf("="),o=a===-1?s:s.slice(0,a).trim(),i=a===-1?"":s.slice(a+1).trim();o&&r.push({name:o,value:un(i)});}return r}function Ci(t){let e=[];for(let r of t)for(let n of r.split(/,(?=\s*[A-Za-z0-9_.\-]+=)/)){let s=n.trim();if(!s)continue;let a=s.split(";"),o=a[0].indexOf("=");if(o===-1)continue;let i=a[0].slice(0,o).trim(),l=a[0].slice(o+1).trim(),d=a.slice(1).map(u=>u.trim()).filter(Boolean).join(" \xB7 ")||void 0;i&&e.push({name:i,value:un(l),attributes:d});}return e}var _e=class _e{constructor(e,r,n){this.originals=new Map;this.apiCallWriter=null;this.callCounter=0;this.apiCallCount=0;this.disposed=false;this._lastCallId=null;this.primitiveCallIds=new Map;this.context=e,this.assertionTracker=r??null,this.apiConfig=n??_e.DEFAULT_API_CONFIG;try{this.apiCallWriter=new M("api-calls");}catch{}}get lastCallId(){return this._lastCallId}getCallIdForValue(e){return e!=null&&typeof e=="object"?z.get(e)??null:this.primitiveCallIds.get(e)??null}intercept(){for(let r of bi){let n=this.context[r].bind(this.context);this.originals.set(r,n),this.context[r]=this.createWrapper(r,n);}let e=this.context.dispose.bind(this.context);this.originals.set("dispose",e),this.context.dispose=async r=>(this.disposed=true,e(r));}getFileData(){return this.apiCallWriter?.close(),{apiCallsFile:this.apiCallWriter?.getCount()?this.apiCallWriter.getPath():null,apiCallsCount:this.apiCallWriter?.getCount()??0}}flushLegacyAnnotations(e){}dispose(){for(let[e,r]of this.originals)this.context[e]=r;this.originals.clear(),this.apiCallWriter?.close(),this.callCounter=0,this.apiCallCount=0,this._lastCallId=null,this.primitiveCallIds.clear();}get isDisposed(){return this.disposed}getCapturedCallCount(){return this.apiCallCount}tagResponseMethods(e,r){let n=this,s=e.headers.bind(e);e.headers=function(){let c=s();return z.set(c,r),c};let a=e.headersArray.bind(e);e.headersArray=function(){let c=a();return z.set(c,r),c};let o=e.json.bind(e);e.json=async function(){let c=await o();return c!=null&&typeof c=="object"&&z.set(c,r),c};let i=e.status.bind(e);e.status=function(){let c=i();return n.primitiveCallIds.set(c,r),c};let l=e.statusText.bind(e);e.statusText=function(){let c=l();return n.primitiveCallIds.set(c,r),c};let d=e.ok.bind(e);e.ok=function(){let c=d();return n.primitiveCallIds.set(c,r),c};let u=e.text.bind(e);e.text=async function(){let c=await u();return n.primitiveCallIds.set(c,r),c};let p=e.body.bind(e);e.body=async function(){let c=await p();return z.set(c,r),c};}createWrapper(e,r){let n=this;return async function(a,o){if(!cn(a,n.apiConfig.apiIncludeUrls,n.apiConfig.apiExcludeUrls))return r(a,o);let i=`api-call-${n.callCounter++}`,l=new Date().toISOString(),d=e==="fetch"?(o?.method??"GET").toUpperCase():e.toUpperCase(),u=ki(o),p=performance.now();n._lastCallId=i,n.assertionTracker&&n.assertionTracker.setCurrentCallId(i);let f;try{f=await r(a,o);}catch(c){let g=performance.now();try{let h=n.apiConfig.captureRequestBody?Ae(u,n.apiConfig.redactBodyFields):null,m={id:i,timestamp:l,method:d,url:a,requestHeaders:null,requestBody:h,responseStatusCode:null,responseStatusText:null,responseHeaders:null,responseBody:null,responseTimeMs:Math.round((g-p)*100)/100,isBinary:!1,error:c instanceof Error?c.message:String(c)};n.apiCallWriter&&(n.apiCallWriter.append(m),n.apiCallCount++);}catch{}throw c}try{let c=performance.now(),g=f.headers(),h=g["content-type"]??null,m=h?!xi(h):!1,w=null;n.apiConfig.captureRequestHeaders&&o?.headers&&(w=o.headers);let T=null;n.apiConfig.captureResponseHeaders&&(T=g);let y=n.apiConfig.captureRequestBody?u:null,b=null;if(n.apiConfig.captureResponseBody)try{m?b=(await f.body()).toString("base64"):b=await f.text();}catch{}let C=[],v=[];try{if(n.apiConfig.captureRequestHeaders&&(C=Ti(o?.headers)),n.apiConfig.captureResponseHeaders){let S=f.headersArray().filter(P=>P.name.toLowerCase()==="set-cookie").map(P=>P.value);v=Ci(S);}}catch{}w=Ct(w,n.apiConfig.redactHeaders),T=Ct(T,n.apiConfig.redactHeaders),y=Ae(y,n.apiConfig.redactBodyFields),b=Ae(b,n.apiConfig.redactBodyFields);let k={id:i,timestamp:l,method:d,url:f.url(),requestHeaders:w,requestBody:y,responseStatusCode:f.status(),responseStatusText:f.statusText(),responseHeaders:T,responseBody:b,requestCookies:C.length?C:null,responseCookies:v.length?v:null,responseTimeMs:Math.round((c-p)*100)/100,isBinary:m,error:null};n.apiCallWriter&&(n.apiCallWriter.append(k),n.apiCallCount++);}catch{}try{f[kt]=i,n.tagResponseMethods(f,i);}catch{}return f}}};_e.DEFAULT_API_CONFIG=Object.freeze({trackApiCalls:true,captureRequestHeaders:true,captureResponseHeaders:true,captureRequestBody:true,captureResponseBody:true,captureAssertions:true,redactHeaders:["authorization","cookie","set-cookie","x-api-key"],redactBodyFields:["password","secret","token","apiKey","api_key"],apiIncludeUrls:[],apiExcludeUrls:[]});var G=_e;Re(expect);var Ai="__testrelic_api_config",_i="__testrelic_config_trackApiCalls";function Rt(t){let e=t.annotations.find(n=>n.type===Ai&&n.description!==void 0);if(e)try{return JSON.parse(e.description,Ii)}catch{}let r=t.annotations.find(n=>n.type===_i&&n.description!==void 0);return r?{trackApiCalls:r.description!=="false",captureRequestHeaders:true,captureResponseHeaders:true,captureRequestBody:true,captureResponseBody:true,captureAssertions:true,redactHeaders:["authorization","cookie","set-cookie","x-api-key"],redactBodyFields:["password","secret","token","apiKey","api_key"],apiIncludeUrls:[],apiExcludeUrls:[]}:{trackApiCalls:true,captureRequestHeaders:true,captureResponseHeaders:true,captureRequestBody:true,captureResponseBody:true,captureAssertions:true,redactHeaders:["authorization","cookie","set-cookie","x-api-key"],redactBodyFields:["password","secret","token","apiKey","api_key"],apiIncludeUrls:[],apiExcludeUrls:[]}}function Ii(t,e){if(typeof e=="object"&&e!==null&&e.__regexp===true&&typeof e.source=="string"){let{source:r,flags:n}=e;return new RegExp(r,n)}return e}var hn={page:async({page:t},e,r)=>{let n=new Se(t);try{await n.init();}catch{}await e(t);try{let{navigations:s,networkRequestsFile:a,networkRequestsCount:o,consoleLogsFile:i,consoleLogsCount:l}=await n.getFileData(),d={testRelicData:!0,version:PAYLOAD_VERSION,navigations:s,apiAssertions:[],networkRequestsFile:a,networkRequestsCount:o,consoleLogsFile:i,consoleLogsCount:l,apiCallsFile:null,apiCallsCount:0};await r.attach(ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(d)),contentType:ATTACHMENT_CONTENT_TYPE});}catch{}n.dispose();},request:async({request:t},e,r)=>{let n=Rt(r);if(!n.trackApiCalls){await e(t);return}let s=new V,a=new G(t,s,n);a.intercept(),W(s,a);try{await e(t);}finally{W(null,null);}try{let{apiCallsFile:o,apiCallsCount:i}=a.getFileData(),l=n.captureAssertions?s.getData():[],d={testRelicData:!0,version:PAYLOAD_VERSION,navigations:[],apiAssertions:l,networkRequestsFile:null,networkRequestsCount:0,consoleLogsFile:null,consoleLogsCount:0,apiCallsFile:o,apiCallsCount:i};await r.attach(ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(d)),contentType:ATTACHMENT_CONTENT_TYPE});}catch{}a.dispose(),s.dispose();}};test.extend(hn);Re(expect);var Ni={request:async({request:t},e,r)=>{let n=Rt(r);if(!n.trackApiCalls){await e(t);return}let s=new V,a=new G(t,s,n);a.intercept(),W(s,a);let o=null;try{o=new M("api-console");}catch{}let i=0,l=process.stdout.write,d=process.stderr.write;process.stdout.write=function(u,...p){try{let f=typeof u=="string"?u:Buffer.isBuffer(u)?u.toString("utf-8"):String(u);!f.startsWith("[testrelic]")&&!f.startsWith("\u2139 TestRelic")&&!f.startsWith("\u2713 TestRelic")&&!f.startsWith("\u26A0 TestRelic")&&o&&(o.append({level:"stdout",text:f.replace(/\n$/,""),timestamp:new Date().toISOString(),location:null}),i++);}catch{}return l.apply(process.stdout,[u,...p])},process.stderr.write=function(u,...p){try{let f=typeof u=="string"?u:Buffer.isBuffer(u)?u.toString("utf-8"):String(u);!f.startsWith("[testrelic]")&&!f.startsWith("\u26A0 TestRelic")&&o&&(o.append({level:"stderr",text:f.replace(/\n$/,""),timestamp:new Date().toISOString(),location:null}),i++);}catch{}return d.apply(process.stderr,[u,...p])};try{await e(t);}finally{process.stdout.write=l,process.stderr.write=d,W(null,null);}try{o?.close();let{apiCallsFile:u,apiCallsCount:p}=a.getFileData(),f=n.captureAssertions?s.getData():[],c={testRelicData:!0,version:PAYLOAD_VERSION,navigations:[],apiAssertions:f,networkRequestsFile:null,networkRequestsCount:0,consoleLogsFile:i>0?o?.getPath()??null:null,consoleLogsCount:i,apiCallsFile:u,apiCallsCount:p};await r.attach(ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(c)),contentType:ATTACHMENT_CONTENT_TYPE});}catch{}a.dispose(),s.dispose();}};var mn="@testrelic/playwright-analytics";function Di(t){return Array.isArray(t)?t.some(e=>Array.isArray(e)&&typeof e[0]=="string"&&e[0]===mn):false}function Bi(t,e){let n={video:"on",screenshot:"on",trace:"on",...t.use??{}},s;Array.isArray(t.reporter)?s=t.reporter:typeof t.reporter=="string"?s=[[t.reporter]]:s=[["list"]];let a=Di(s)?s:[...s,[mn,e??{}]];return defineConfig({...t,use:n,reporter:a})}var yn=false;function Zd(t,e,r="manual_record"){if(!t||!t.annotations){yn||(yn=true,process.stderr.write(`[testrelic] recordNavigation: reporter not active, navigation not recorded
2604
2604
  `));return}let n={url:e,navigationType:r,timestamp:new Date().toISOString()};t.annotations.push({type:"lambdatest-navigation",description:JSON.stringify(n)});}export{ie as SCHEMA_VERSION,Ce as default,Bi as defineConfig,Zd as recordNavigation,Ni as testRelicApiFixture,hn as testRelicFixture};//# sourceMappingURL=index.js.map
2605
2605
  //# sourceMappingURL=index.js.map