@testrelic/playwright-analytics 2.16.2-next.152 → 2.16.2-next.155

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.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
  `),false}}moveFile(e,r){try{fs$1.renameSync(e,r);}catch{try{fs$1.copyFileSync(e,r);try{fs$1.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=path.join(this.reportDir,"index.json"),n=r+".tmp",s=JSON.stringify(e);fs$1.writeFileSync(n,s,"utf-8"),fs$1.renameSync(n,r),this.totalBytesWritten+=Buffer.byteLength(s,"utf-8");}writeCompactIndex(e){let r=path.join(this.reportDir,"index-compact.json"),n=r+".tmp",s=e.map(({titlePath:o,project:i,...d})=>d),a=JSON.stringify(s);fs$1.writeFileSync(n,a,"utf-8"),fs$1.renameSync(n,r),this.totalBytesWritten+=Buffer.byteLength(a,"utf-8");}writeSummary(e){let r=path.join(this.reportDir,"summary.json"),n=r+".tmp",s=JSON.stringify(e);fs$1.writeFileSync(n,s,"utf-8"),fs$1.renameSync(n,r),this.totalBytesWritten+=Buffer.byteLength(s,"utf-8");}writeManifest(e){let r=path.join(this.reportDir,"manifest.json"),n=r+".tmp",s=JSON.stringify(e);fs$1.writeFileSync(n,s,"utf-8"),fs$1.renameSync(n,r),this.totalBytesWritten+=Buffer.byteLength(s,"utf-8");}computeTotalSize(){return this.totalBytesWritten}dispose(){}};var Er=".testrelic",ba="testrelic-config.json",xa=".testrelic",wa=5,ka=new Set(["__proto__","constructor","prototype"]),Mr=Object.freeze({apiKey:null,endpoint:"https://platform.testrelic.ai/api/v1",uploadStrategy:"batch",timeout:3e4,uploadBudgetMs:12e4,projectName:null,queueMaxAge:6048e5,queueDirectory:`${Er}/queue`,uploadArtifacts:true,artifactMaxSizeMb:50}),Ca={s:1e3,m:60*1e3,h:3600*1e3,d:1440*60*1e3};function Lr(t){let e=path.resolve(t);for(let r=0;r<=wa;r++){let n=path.join(e,Er,ba);if(fs$1.existsSync(n))try{if(fs$1.statSync(n).isFile())return n}catch{}let s=path.join(e,xa);if(fs$1.existsSync(s))try{if(fs$1.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=path.dirname(e);if(a===e)break;e=a;}return null}function Nr(t){try{let e=fs$1.readFileSync(t,"utf-8"),r=JSON.parse(e);return typeof r!="object"||r===null||Array.isArray(r)||!Dr(r)?null:r}catch{return null}}function Dr(t){for(let e of Object.keys(t)){if(ka.has(e))return false;let r=t[e];if(typeof r=="object"&&r!==null&&!Array.isArray(r)&&!Dr(r))return false}return true}function Fr(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 tt(t){let e=Object.create(null);for(let r of Object.keys(t)){let n=t[r];typeof n=="string"&&n.startsWith("$")?e[r]=Fr(n):typeof n=="object"&&n!==null&&!Array.isArray(n)?e[r]=tt(n):e[r]=n;}return e}function Pr(t){let e=/^(\d+)\s*([smhd])$/.exec(t.trim());if(!e)return null;let r=parseInt(e[1],10),n=e[2],s=Ca[n];return !s||r<=0?null:r*s}function Br(t,e){let r=Object.create(null);if(Object.assign(r,Mr),t){let d=t.cloud;d&&typeof d=="object"&&(typeof d.endpoint=="string"&&(r.endpoint=d.endpoint),typeof d.upload=="string"&&(r.uploadStrategy=d.upload),typeof d.timeout=="number"&&(r.timeout=d.timeout),typeof d.uploadBudgetMs=="number"&&(r.uploadBudgetMs=d.uploadBudgetMs),typeof d.apiKey=="string"&&d.apiKey.length>0&&(r.apiKey=d.apiKey));let l=t["testrelic-repo"]??t.project;l&&typeof l=="object"&&typeof l.name=="string"&&(r.projectName=l.name),t.project&&!t["testrelic-repo"]&&process.stderr.write(`[testrelic] Deprecation: "project" key in config is deprecated. Rename it to "testrelic-repo".
5
- `);let c=t.queue;if(c&&typeof c=="object"){if(typeof c.maxAge=="string"){let u=Pr(c.maxAge);u!==null&&(r.queueMaxAge=u);}typeof c.directory=="string"&&(r.queueDirectory=c.directory);}}if(e){if(typeof e.apiKey=="string"&&e.apiKey.length>0){let d=e.apiKey.startsWith("$")?Fr(e.apiKey):e.apiKey;d&&(r.apiKey=d);}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.uploadBudgetMs=="number"&&(r.uploadBudgetMs=e.uploadBudgetMs),typeof e.projectName=="string"&&(r.projectName=e.projectName),typeof e.queueMaxAge=="string"){let d=Pr(e.queueMaxAge);d!==null&&(r.queueMaxAge=d);}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&&core.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 d=parseInt(o,10);!isNaN(d)&&d>=1e3&&d<=12e4&&(r.timeout=d);}let i=Object.freeze(r);return core.isValidCloudConfig(i)?i:Mr}var Aa=[/AKIA[A-Z0-9]{16}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,/-----BEGIN\s+(RSA\s+)?PRIVATE\sKEY-----[\s\S]*?-----END/g,/\/\/[^:]+:[^@]+@/g],_a=["authorization","cookie","set-cookie","x-api-key"],Ia=["password","secret","token","apiKey","api_key"];function Or(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??[..._a],e.redactBodyFields=t?.redactBodyFields??[...Ia],e.apiIncludeUrls=t?.apiIncludeUrls??[],e.apiExcludeUrls=t?.apiExcludeUrls??[],Object.freeze(e)}function qr(t){if(t!==void 0&&!core.isValidConfig(t))throw core.createError(core.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.captureNavigation=t?.captureNavigation??true,e.navigationTypes=t?.navigationTypes??null,e.redactPatterns=[...Aa,...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=Lr(process.cwd()),s=n?Nr(n):null,a=s?tt(s):null,o=Br(a,t?.cloud);return e.cloud=o.apiKey?o:null,e.reportMode=t?.reportMode??"streaming",e.streamingThreshold=t?.streamingThreshold??0,Object.freeze(e)}var Ce="1.7.0";function Hr(t,e,r){try{let s=fs$1.readFileSync(t,"utf-8").split(`
5
+ `);let c=t.queue;if(c&&typeof c=="object"){if(typeof c.maxAge=="string"){let u=Pr(c.maxAge);u!==null&&(r.queueMaxAge=u);}typeof c.directory=="string"&&(r.queueDirectory=c.directory);}}if(e){if(typeof e.apiKey=="string"&&e.apiKey.length>0){let d=e.apiKey.startsWith("$")?Fr(e.apiKey):e.apiKey;d&&(r.apiKey=d);}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.uploadBudgetMs=="number"&&(r.uploadBudgetMs=e.uploadBudgetMs),typeof e.projectName=="string"&&(r.projectName=e.projectName),typeof e.queueMaxAge=="string"){let d=Pr(e.queueMaxAge);d!==null&&(r.queueMaxAge=d);}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&&core.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 d=parseInt(o,10);!isNaN(d)&&d>=1e3&&d<=12e4&&(r.timeout=d);}let i=Object.freeze(r);return core.isValidCloudConfig(i)?i:Mr}var Aa=[/AKIA[A-Z0-9]{16}/g,/Bearer\s+[A-Za-z0-9\-._~+/]+=*/g,/-----BEGIN\s+(RSA\s+)?PRIVATE\sKEY-----[\s\S]*?-----END/g,/\/\/[^:]+:[^@]+@/g],_a=["authorization","cookie","set-cookie","x-api-key"],Ia=["password","secret","token","apiKey","api_key"];function Or(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??[..._a],e.redactBodyFields=t?.redactBodyFields??[...Ia],e.apiIncludeUrls=t?.apiIncludeUrls??[],e.apiExcludeUrls=t?.apiExcludeUrls??[],Object.freeze(e)}function qr(t){if(t!==void 0&&!core.isValidConfig(t))throw core.createError(core.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.captureNavigation=t?.captureNavigation??true,e.navigationTypes=t?.navigationTypes??null,e.redactPatterns=[...Aa,...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=Lr(process.cwd()),s=n?Nr(n):null,a=s?tt(s):null,o=Br(a,t?.cloud);return e.cloud=o.apiKey?o:null,e.reportMode=t?.reportMode??"streaming",e.streamingThreshold=t?.streamingThreshold??0,Object.freeze(e)}var Ce="1.8.0";function Hr(t,e,r){try{let s=fs$1.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 d=a;d<=o;d++){let l=d===e?">":" ",c=String(d).padStart(String(o).length," ");i.push(`${l} ${c} | ${s[d-1]}`);}return i.join(`
7
7
  `)}catch{return null}}function Ur(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 Pa(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 Ea(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 La(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 Na(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 Da(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 Fa=[Pa,Ea,La,Na,Da];function V(t){let e=process.env;for(let r of Fa){let n=r(e);if(n)return n}return null}var rt=`
8
8
  /* Theme Variables */
@@ -4252,17 +4252,17 @@ ${o?`<script id="artifact-manifest-data" type="application/json">${o}</script>`:
4252
4252
  </body>
4253
4253
  </html>`}function Ct(t){try{let e=process.platform,r,n;e==="darwin"?(r="open",n=[t]):e==="win32"?(r="cmd",n=["/c","start","",t]):(r="xdg-open",n=[t]),child_process.execFile(r,n,s=>{s&&process.stderr.write(`[testrelic] Failed to open browser: ${s.message}
4254
4254
  `);});}catch{}}var jr=path.join(os$1.tmpdir(),"testrelic-data"),H=class{constructor(e){this.count=0;this.closed=false;fs$1.mkdirSync(jr,{recursive:true}),this.filePath=path.join(jr,`${e}-${crypto.randomUUID().substring(0,8)}.jsonl`),this.fd=fs$1.openSync(this.filePath,"w");}append(e){if(this.closed)return;let r=JSON.stringify(e)+`
4255
- `;fs$1.writeSync(this.fd,r),this.count++;}getPath(){return this.filePath}getCount(){return this.count}close(){if(!this.closed){this.closed=true;try{fs$1.closeSync(this.fd);}catch{}}}cleanup(){try{fs$1.unlinkSync(this.filePath);}catch{}}};async function $r(t,e,r,n){let s=(e-1)*r,a=[],o=0,i=readline.createInterface({input:fs$1.createReadStream(t,{encoding:"utf-8"}),crlfDelay:1/0});for await(let c of i)if(c.length!==0){if(o>=s&&a.length<r)try{a.push(JSON.parse(c));}catch{}if(o++,a.length>=r&&n!==void 0)break}let d=n??o,l=Math.max(1,Math.ceil(d/r));return {items:a,total:d,page:e,pageSize:r,totalPages:l}}var Jr=/^[a-f0-9]{12}$/,Rt=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,Yr=500;function T(t,e,r){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(r));}function Xr(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 Te(t){try{return fs$1.existsSync(t)?JSON.parse(fs$1.readFileSync(t,"utf-8")):null}catch{return null}}function Re(t){let e=0;try{let r=fs$1.readdirSync(t,{withFileTypes:!0});for(let n of r){let s=path.join(t,n.name);n.isFile()?e+=fs$1.statSync(s).size:n.isDirectory()&&(e+=Re(s));}}catch{}return e}function Zr(t,e,r,n){let s=Te(path.join(r,"index.json"));T(e,200,{status:"ok",reportMode:"streaming",testCount:s?.length??0,uptime:Math.floor((Date.now()-n)/1e3)});}function Qr(t,e,r){let n=Te(path.join(r,"summary.json"));if(!n){T(e,404,{error:"Summary not found"});return}T(e,200,n);}function en(t,e,r){let n=Te(path.join(r,"index.json"));if(!n){T(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(Yr,Math.max(1,parseInt(a.get("pageSize")??"100",10)||100)),d=a.get("status")?.split(",").filter(Boolean)??null,l=a.get("file")??null,c=a.get("search")?.toLowerCase()??null,u=a.get("tag")?.split(",").filter(Boolean)??null,h=a.get("sort")??"file",f=a.get("order")==="desc"?-1:1,p=n;d&&d.length>0&&(p=p.filter(b=>d.includes(b.status))),l&&(p=p.filter(b=>b.filePath===l||b.filePath.startsWith(l+"/"))),c&&(p=p.filter(b=>b.title.toLowerCase().includes(c)||b.filePath.toLowerCase().includes(c))),u&&u.length>0&&(p=p.filter(b=>u.some(k=>b.tags.includes(k)))),p=[...p].sort((b,k)=>{let R=0;switch(h){case "duration":R=b.duration-k.duration;break;case "status":R=b.status.localeCompare(k.status);break;case "title":R=b.title.localeCompare(k.title);break;default:R=b.filePath.localeCompare(k.filePath);break}return R*f});let m=p.length,g=Math.max(1,Math.ceil(m/i)),v=(o-1)*i,y=p.slice(v,v+i);T(e,200,{tests:y,pagination:{page:o,pageSize:i,totalItems:m,totalPages:g},filters:{status:d,file:l,search:c,tag:u}});}function tn(t,e,r,n){if(!Jr.test(n)){T(e,400,{error:"Invalid test ID format"});return}let s=path.join(r,"tests",n,"meta.json"),a=path.join(r,"tests",`${n}.json`),o=fs$1.existsSync(s)?s:fs$1.existsSync(a)?a:null;if(!o){T(e,404,{error:`Test not found: ${n}`});return}try{let i=fs$1.readFileSync(o,"utf-8");e.writeHead(200,{"Content-Type":"application/json"}),e.end(i);}catch(i){T(e,500,{error:i instanceof Error?i.message:String(i)});}}async function rn(t,e,r,n,s){if(!Jr.test(n)){T(e,400,{error:"Invalid test ID format"});return}let o=path.join(r,"tests",n,{network:"network.jsonl",console:"console.jsonl","api-calls":"api-calls.jsonl"}[s]);if(!fs$1.existsSync(o)){T(e,200,{items:[],total:0,page:1,pageSize:50,totalPages:0});return}try{let d=new URL(t.url??"/",`http://${t.headers.host}`).searchParams,l=Math.max(1,parseInt(d.get("page")??"1",10)||1),c=Math.min(Yr,Math.max(1,parseInt(d.get("pageSize")??"50",10)||50)),u,h=path.join(r,"tests",n,"meta.json");if(fs$1.existsSync(h))try{let p=JSON.parse(fs$1.readFileSync(h,"utf-8"));switch(s){case "network":u=p.networkRequestsCount;break;case "console":u=p.consoleLogsCount;break;case "api-calls":u=p.apiCallsCount;break}}catch{}let f=await $r(o,l,c,u);T(e,200,f);}catch(i){T(e,500,{error:i instanceof Error?i.message:String(i)});}}function nn(t,e,r){let n=Te(path.join(r,"index.json"));if(!n){T(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));T(e,200,{files:a});}function sn(t,e,r){if(!fs$1.existsSync(r)){T(e,200,{runs:[],totalSizeBytes:0});return}try{let n=[],s=0,a=fs$1.readdirSync(r,{withFileTypes:!0});for(let o of a){if(!o.isDirectory()||!Rt.test(o.name))continue;let i=path.join(r,o.name),d=Re(i),l=fs$1.readdirSync(i,{withFileTypes:!0}).filter(c=>c.isDirectory());n.push({folderName:o.name,totalSizeBytes:d,testCount:l.length}),s+=d;}n.sort((o,i)=>i.folderName.localeCompare(o.folderName)),T(e,200,{runs:n,totalSizeBytes:s});}catch(n){T(e,500,{error:n instanceof Error?n.message:String(n)});}}function an(t,e,r){try{let n=0,s=0;if(fs$1.existsSync(r)){let a=fs$1.readdirSync(r,{withFileTypes:!0});for(let o of a){if(!o.isDirectory()||!Rt.test(o.name))continue;let i=path.join(r,o.name),d=Re(i);fs$1.rmSync(i,{recursive:!0,force:!0}),s+=d,n++;}}T(e,200,{deletedCount:n,freedBytes:s});}catch(n){T(e,500,{error:n instanceof Error?n.message:String(n)});}}function on(t,e,r,n){if(!Rt.test(n)){T(e,400,{error:"Invalid folder name"});return}let s=path.join(r,n);try{if(!fs$1.statSync(s).isDirectory()){T(e,404,{error:"Not found"});return}}catch{T(e,404,{error:"Not found"});return}try{let a=Re(s);fs$1.rmSync(s,{recursive:!0,force:!0}),T(e,200,{deleted:n,freedBytes:a});}catch(a){T(e,500,{error:a instanceof Error?a.message:String(a)});}}function ln(t,e,r){T(e,200,{status:"shutting_down"}),r.close();}function At(t,e,r){if(!fs$1.existsSync(r)){T(e,404,{error:"File not found"});return}try{let n=fs$1.statSync(r).size,s=path.extname(r).toLowerCase(),a=Ya[s]??"application/octet-stream",o=Ja(t.headers.range,n);if(o==="unsatisfiable"){e.writeHead(416,{"Content-Range":`bytes */${n}`,"Accept-Ranges":"bytes"}),e.end();return}if(o){e.writeHead(206,{"Content-Type":a,"Content-Length":o.end-o.start+1,"Content-Range":`bytes ${o.start}-${o.end}/${n}`,"Accept-Ranges":"bytes"}),Gr(fs$1.createReadStream(r,{start:o.start,end:o.end}),e);return}e.writeHead(200,{"Content-Type":a,"Content-Length":n,"Accept-Ranges":"bytes"}),Gr(fs$1.createReadStream(r),e);}catch(n){T(e,500,{error:n instanceof Error?n.message:String(n)});}}function Gr(t,e){t.on("error",()=>{t.destroy(),e.destroy();}),e.on("close",()=>{t.destroy();}),t.pipe(e);}function Ja(t,e){if(!t)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(t.trim());if(!r)return null;let[,n,s]=r;if(n===""&&s==="")return null;let a,o;if(n===""){let i=Number(s);if(i<=0)return "unsatisfiable";a=Math.max(0,e-i),o=e-1;}else a=Number(n),o=s===""?e-1:Math.min(Number(s),e-1);return !Number.isFinite(a)||!Number.isFinite(o)?null:e===0||a>=e||a>o?"unsatisfiable":{start:a,end:o}}var Ya={".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 ei=9323,ti=10,ri=1800*1e3;function me(t,e){return new Promise((r,n)=>{let s=e?.port??ei,a=Date.now(),o,i=0,d=fs$1.existsSync(path.join(t,"artifacts"))?path.join(t,"artifacts"):fs$1.existsSync(path.join(t,"..","artifacts"))?path.join(t,"..","artifacts"):path.join(t,"artifacts");function l(){clearTimeout(o),o=setTimeout(()=>{u.close();},ri);}let c=e?.htmlPath??null;if(!c){let f=path.dirname(t);try{let p=fs$1.readdirSync(f).find(m=>m.endsWith(".html"));p&&(c=path.join(f,p));}catch{}}let u=http.createServer((f,p)=>{if(l(),Xr(p),f.method==="OPTIONS"){p.writeHead(204),p.end();return}let m;try{m=new URL(f.url??"/",`http://${f.headers.host??"localhost"}`).pathname;}catch{T(p,400,{error:"Invalid URL"});return}if(f.method==="GET"&&(m==="/"||m==="/index.html")){if(c&&fs$1.existsSync(c)){At(f,p,c);return}T(p,404,{error:"HTML report not found"});return}if(f.method==="GET"&&m==="/api/health"){Zr(f,p,t,a);return}if(f.method==="GET"&&m==="/api/summary"){Qr(f,p,t);return}if(f.method==="GET"&&m==="/api/tests"){en(f,p,t);return}if(f.method==="GET"&&m==="/api/files"){nn(f,p,t);return}let g=m.match(/^\/api\/tests\/([a-f0-9]+)\/(network|console|api-calls)$/);if(f.method==="GET"&&g){rn(f,p,t,g[1],g[2]);return}let v=m.match(/^\/api\/tests\/([a-f0-9]+)$/);if(f.method==="GET"&&v){tn(f,p,t,v[1]);return}if(f.method==="GET"&&m==="/api/artifacts"){sn(f,p,d);return}if(f.method==="DELETE"&&m==="/api/artifacts"){an(f,p,d);return}let y=m.match(/^\/api\/artifacts\/(.+)$/);if(f.method==="DELETE"&&y){on(f,p,d,decodeURIComponent(y[1]));return}if(f.method==="GET"&&m.startsWith("/artifacts/")){let b=decodeURIComponent(m.slice(11));if(b.includes("..")||b.includes("\0")){T(p,400,{error:"Invalid path"});return}At(f,p,path.join(d,b));return}if(f.method==="POST"&&m==="/api/shutdown"){ln(f,p,u);return}T(p,404,{error:"Not found"});});function h(f){let p=m=>{m.code==="EADDRINUSE"&&i<ti?(i++,h(f+1)):n(m);};u.once("error",p),u.listen(f,"127.0.0.1",()=>{u.removeListener("error",p);let m=u.address();if(!m||typeof m=="string"){n(new Error("Failed to get server address"));return}l(),r({port:m.port,dispose:()=>new Promise(g=>{clearTimeout(o),u.close(()=>g());})});});}h(s);})}async function dn(t){let e=await me(t);return {port:e.port,dispose:e.dispose}}function ai(t,e,r){let n=JSON.stringify(t),s=r?JSON.stringify(r):null;return zr(n,e,s)}async function It(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,d=path.dirname(i);fs$1.mkdirSync(d,{recursive:!0});let l="",c="[]",u=null;if(a){l=JSON.stringify({...t.summary,testRunId:t.testRunId,startedAt:t.startedAt,completedAt:t.completedAt,totalDuration:t.totalDuration,ci:t.ci,metadata:t.metadata,shardRunIds:t.shardRunIds});let f=path.dirname(e.outputPath),p=path.join(f,".testrelic-report");try{let m=path.join(p,"index-compact.json"),g=path.join(p,"index.json");fs$1.existsSync(m)?c=fs$1.readFileSync(m,"utf-8"):fs$1.existsSync(g)&&(c=fs$1.readFileSync(g,"utf-8"));}catch{}u=r?JSON.stringify(r):null,o=kt(l,c,null,u);}else o=ai(t,null,r);let h=i+".tmp";if(fs$1.writeFileSync(h,o,"utf-8"),fs$1.renameSync(h,i),a){if(t.ci===null){let f=path.dirname(e.outputPath),p=path.join(f,".testrelic-report"),m=path.resolve(i);try{if(await oi(),n=await li(p),!n){s=await me(p,{htmlPath:m}),n=s.port;let g=setInterval(()=>{},6e4),v=()=>{clearInterval(g),s?.dispose();};process.on("SIGINT",v),process.on("SIGTERM",v),setTimeout(v,1800*1e3).unref();}if(n){process.stderr.write(`
4255
+ `;fs$1.writeSync(this.fd,r),this.count++;}getPath(){return this.filePath}getCount(){return this.count}close(){if(!this.closed){this.closed=true;try{fs$1.closeSync(this.fd);}catch{}}}cleanup(){try{fs$1.unlinkSync(this.filePath);}catch{}}};async function $r(t,e,r,n){let s=(e-1)*r,a=[],o=0,i=readline.createInterface({input:fs$1.createReadStream(t,{encoding:"utf-8"}),crlfDelay:1/0});for await(let c of i)if(c.length!==0){if(o>=s&&a.length<r)try{a.push(JSON.parse(c));}catch{}if(o++,a.length>=r&&n!==void 0)break}let d=n??o,l=Math.max(1,Math.ceil(d/r));return {items:a,total:d,page:e,pageSize:r,totalPages:l}}var Jr=/^[a-f0-9]{12}$/,Rt=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,Yr=500;function R(t,e,r){t.writeHead(e,{"Content-Type":"application/json"}),t.end(JSON.stringify(r));}function Xr(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 Te(t){try{return fs$1.existsSync(t)?JSON.parse(fs$1.readFileSync(t,"utf-8")):null}catch{return null}}function Re(t){let e=0;try{let r=fs$1.readdirSync(t,{withFileTypes:!0});for(let n of r){let s=path.join(t,n.name);n.isFile()?e+=fs$1.statSync(s).size:n.isDirectory()&&(e+=Re(s));}}catch{}return e}function Zr(t,e,r,n){let s=Te(path.join(r,"index.json"));R(e,200,{status:"ok",reportMode:"streaming",testCount:s?.length??0,uptime:Math.floor((Date.now()-n)/1e3)});}function Qr(t,e,r){let n=Te(path.join(r,"summary.json"));if(!n){R(e,404,{error:"Summary not found"});return}R(e,200,n);}function en(t,e,r){let n=Te(path.join(r,"index.json"));if(!n){R(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(Yr,Math.max(1,parseInt(a.get("pageSize")??"100",10)||100)),d=a.get("status")?.split(",").filter(Boolean)??null,l=a.get("file")??null,c=a.get("search")?.toLowerCase()??null,u=a.get("tag")?.split(",").filter(Boolean)??null,h=a.get("sort")??"file",f=a.get("order")==="desc"?-1:1,p=n;d&&d.length>0&&(p=p.filter(b=>d.includes(b.status))),l&&(p=p.filter(b=>b.filePath===l||b.filePath.startsWith(l+"/"))),c&&(p=p.filter(b=>b.title.toLowerCase().includes(c)||b.filePath.toLowerCase().includes(c))),u&&u.length>0&&(p=p.filter(b=>u.some(k=>b.tags.includes(k)))),p=[...p].sort((b,k)=>{let T=0;switch(h){case "duration":T=b.duration-k.duration;break;case "status":T=b.status.localeCompare(k.status);break;case "title":T=b.title.localeCompare(k.title);break;default:T=b.filePath.localeCompare(k.filePath);break}return T*f});let m=p.length,g=Math.max(1,Math.ceil(m/i)),v=(o-1)*i,y=p.slice(v,v+i);R(e,200,{tests:y,pagination:{page:o,pageSize:i,totalItems:m,totalPages:g},filters:{status:d,file:l,search:c,tag:u}});}function tn(t,e,r,n){if(!Jr.test(n)){R(e,400,{error:"Invalid test ID format"});return}let s=path.join(r,"tests",n,"meta.json"),a=path.join(r,"tests",`${n}.json`),o=fs$1.existsSync(s)?s:fs$1.existsSync(a)?a:null;if(!o){R(e,404,{error:`Test not found: ${n}`});return}try{let i=fs$1.readFileSync(o,"utf-8");e.writeHead(200,{"Content-Type":"application/json"}),e.end(i);}catch(i){R(e,500,{error:i instanceof Error?i.message:String(i)});}}async function rn(t,e,r,n,s){if(!Jr.test(n)){R(e,400,{error:"Invalid test ID format"});return}let o=path.join(r,"tests",n,{network:"network.jsonl",console:"console.jsonl","api-calls":"api-calls.jsonl"}[s]);if(!fs$1.existsSync(o)){R(e,200,{items:[],total:0,page:1,pageSize:50,totalPages:0});return}try{let d=new URL(t.url??"/",`http://${t.headers.host}`).searchParams,l=Math.max(1,parseInt(d.get("page")??"1",10)||1),c=Math.min(Yr,Math.max(1,parseInt(d.get("pageSize")??"50",10)||50)),u,h=path.join(r,"tests",n,"meta.json");if(fs$1.existsSync(h))try{let p=JSON.parse(fs$1.readFileSync(h,"utf-8"));switch(s){case "network":u=p.networkRequestsCount;break;case "console":u=p.consoleLogsCount;break;case "api-calls":u=p.apiCallsCount;break}}catch{}let f=await $r(o,l,c,u);R(e,200,f);}catch(i){R(e,500,{error:i instanceof Error?i.message:String(i)});}}function nn(t,e,r){let n=Te(path.join(r,"index.json"));if(!n){R(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));R(e,200,{files:a});}function sn(t,e,r){if(!fs$1.existsSync(r)){R(e,200,{runs:[],totalSizeBytes:0});return}try{let n=[],s=0,a=fs$1.readdirSync(r,{withFileTypes:!0});for(let o of a){if(!o.isDirectory()||!Rt.test(o.name))continue;let i=path.join(r,o.name),d=Re(i),l=fs$1.readdirSync(i,{withFileTypes:!0}).filter(c=>c.isDirectory());n.push({folderName:o.name,totalSizeBytes:d,testCount:l.length}),s+=d;}n.sort((o,i)=>i.folderName.localeCompare(o.folderName)),R(e,200,{runs:n,totalSizeBytes:s});}catch(n){R(e,500,{error:n instanceof Error?n.message:String(n)});}}function an(t,e,r){try{let n=0,s=0;if(fs$1.existsSync(r)){let a=fs$1.readdirSync(r,{withFileTypes:!0});for(let o of a){if(!o.isDirectory()||!Rt.test(o.name))continue;let i=path.join(r,o.name),d=Re(i);fs$1.rmSync(i,{recursive:!0,force:!0}),s+=d,n++;}}R(e,200,{deletedCount:n,freedBytes:s});}catch(n){R(e,500,{error:n instanceof Error?n.message:String(n)});}}function on(t,e,r,n){if(!Rt.test(n)){R(e,400,{error:"Invalid folder name"});return}let s=path.join(r,n);try{if(!fs$1.statSync(s).isDirectory()){R(e,404,{error:"Not found"});return}}catch{R(e,404,{error:"Not found"});return}try{let a=Re(s);fs$1.rmSync(s,{recursive:!0,force:!0}),R(e,200,{deleted:n,freedBytes:a});}catch(a){R(e,500,{error:a instanceof Error?a.message:String(a)});}}function ln(t,e,r){R(e,200,{status:"shutting_down"}),r.close();}function At(t,e,r){if(!fs$1.existsSync(r)){R(e,404,{error:"File not found"});return}try{let n=fs$1.statSync(r).size,s=path.extname(r).toLowerCase(),a=Ya[s]??"application/octet-stream",o=Ja(t.headers.range,n);if(o==="unsatisfiable"){e.writeHead(416,{"Content-Range":`bytes */${n}`,"Accept-Ranges":"bytes"}),e.end();return}if(o){e.writeHead(206,{"Content-Type":a,"Content-Length":o.end-o.start+1,"Content-Range":`bytes ${o.start}-${o.end}/${n}`,"Accept-Ranges":"bytes"}),Gr(fs$1.createReadStream(r,{start:o.start,end:o.end}),e);return}e.writeHead(200,{"Content-Type":a,"Content-Length":n,"Accept-Ranges":"bytes"}),Gr(fs$1.createReadStream(r),e);}catch(n){R(e,500,{error:n instanceof Error?n.message:String(n)});}}function Gr(t,e){t.on("error",()=>{t.destroy(),e.destroy();}),e.on("close",()=>{t.destroy();}),t.pipe(e);}function Ja(t,e){if(!t)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(t.trim());if(!r)return null;let[,n,s]=r;if(n===""&&s==="")return null;let a,o;if(n===""){let i=Number(s);if(i<=0)return "unsatisfiable";a=Math.max(0,e-i),o=e-1;}else a=Number(n),o=s===""?e-1:Math.min(Number(s),e-1);return !Number.isFinite(a)||!Number.isFinite(o)?null:e===0||a>=e||a>o?"unsatisfiable":{start:a,end:o}}var Ya={".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 ei=9323,ti=10,ri=1800*1e3;function me(t,e){return new Promise((r,n)=>{let s=e?.port??ei,a=Date.now(),o,i=0,d=fs$1.existsSync(path.join(t,"artifacts"))?path.join(t,"artifacts"):fs$1.existsSync(path.join(t,"..","artifacts"))?path.join(t,"..","artifacts"):path.join(t,"artifacts");function l(){clearTimeout(o),o=setTimeout(()=>{u.close();},ri);}let c=e?.htmlPath??null;if(!c){let f=path.dirname(t);try{let p=fs$1.readdirSync(f).find(m=>m.endsWith(".html"));p&&(c=path.join(f,p));}catch{}}let u=http.createServer((f,p)=>{if(l(),Xr(p),f.method==="OPTIONS"){p.writeHead(204),p.end();return}let m;try{m=new URL(f.url??"/",`http://${f.headers.host??"localhost"}`).pathname;}catch{R(p,400,{error:"Invalid URL"});return}if(f.method==="GET"&&(m==="/"||m==="/index.html")){if(c&&fs$1.existsSync(c)){At(f,p,c);return}R(p,404,{error:"HTML report not found"});return}if(f.method==="GET"&&m==="/api/health"){Zr(f,p,t,a);return}if(f.method==="GET"&&m==="/api/summary"){Qr(f,p,t);return}if(f.method==="GET"&&m==="/api/tests"){en(f,p,t);return}if(f.method==="GET"&&m==="/api/files"){nn(f,p,t);return}let g=m.match(/^\/api\/tests\/([a-f0-9]+)\/(network|console|api-calls)$/);if(f.method==="GET"&&g){rn(f,p,t,g[1],g[2]);return}let v=m.match(/^\/api\/tests\/([a-f0-9]+)$/);if(f.method==="GET"&&v){tn(f,p,t,v[1]);return}if(f.method==="GET"&&m==="/api/artifacts"){sn(f,p,d);return}if(f.method==="DELETE"&&m==="/api/artifacts"){an(f,p,d);return}let y=m.match(/^\/api\/artifacts\/(.+)$/);if(f.method==="DELETE"&&y){on(f,p,d,decodeURIComponent(y[1]));return}if(f.method==="GET"&&m.startsWith("/artifacts/")){let b=decodeURIComponent(m.slice(11));if(b.includes("..")||b.includes("\0")){R(p,400,{error:"Invalid path"});return}At(f,p,path.join(d,b));return}if(f.method==="POST"&&m==="/api/shutdown"){ln(f,p,u);return}R(p,404,{error:"Not found"});});function h(f){let p=m=>{m.code==="EADDRINUSE"&&i<ti?(i++,h(f+1)):n(m);};u.once("error",p),u.listen(f,"127.0.0.1",()=>{u.removeListener("error",p);let m=u.address();if(!m||typeof m=="string"){n(new Error("Failed to get server address"));return}l(),r({port:m.port,dispose:()=>new Promise(g=>{clearTimeout(o),u.close(()=>g());})});});}h(s);})}async function dn(t){let e=await me(t);return {port:e.port,dispose:e.dispose}}function ai(t,e,r){let n=JSON.stringify(t),s=r?JSON.stringify(r):null;return zr(n,e,s)}async function It(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,d=path.dirname(i);fs$1.mkdirSync(d,{recursive:!0});let l="",c="[]",u=null;if(a){l=JSON.stringify({...t.summary,testRunId:t.testRunId,startedAt:t.startedAt,completedAt:t.completedAt,totalDuration:t.totalDuration,ci:t.ci,metadata:t.metadata,shardRunIds:t.shardRunIds});let f=path.dirname(e.outputPath),p=path.join(f,".testrelic-report");try{let m=path.join(p,"index-compact.json"),g=path.join(p,"index.json");fs$1.existsSync(m)?c=fs$1.readFileSync(m,"utf-8"):fs$1.existsSync(g)&&(c=fs$1.readFileSync(g,"utf-8"));}catch{}u=r?JSON.stringify(r):null,o=kt(l,c,null,u);}else o=ai(t,null,r);let h=i+".tmp";if(fs$1.writeFileSync(h,o,"utf-8"),fs$1.renameSync(h,i),a){if(t.ci===null){let f=path.dirname(e.outputPath),p=path.join(f,".testrelic-report"),m=path.resolve(i);try{if(await oi(),n=await li(p),!n){s=await me(p,{htmlPath:m}),n=s.port;let g=setInterval(()=>{},6e4),v=()=>{clearInterval(g),s?.dispose();};process.on("SIGINT",v),process.on("SIGTERM",v),setTimeout(v,1800*1e3).unref();}if(n){process.stderr.write(`
4256
4256
  Report server: http://127.0.0.1:${n}
4257
4257
  `);try{let g=kt(l,c,n,u),v=i+".tmp";fs$1.writeFileSync(v,g,"utf-8"),fs$1.renameSync(v,i);}catch{}}}catch{}}}else if(e.openReport&&t.ci===null&&e.includeArtifacts){let f=path.dirname(e.outputPath),p=path.join(f,"artifacts");if(fs$1.existsSync(p))try{let m=await dn(p);n=m.port,process.on("exit",()=>{m.dispose();});}catch{}}if(e.openReport&&t.ci===null)if(a&&n)Ct(`http://127.0.0.1:${n}`);else {let f=path.resolve(i);Ct(f);}}catch(n){process.stderr.write(`[testrelic] Failed to write HTML report: ${n instanceof Error?n.message:String(n)}
4258
- `);}}var Ie=9323,gn=10;async function ii(){for(let t=Ie;t<Ie+gn;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 oi(){for(let t=Ie;t<Ie+gn;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 li(t){let r=[path.join(__dirname,"cli.cjs"),path.join(__dirname,"cli.js"),path.join(__dirname,"..","dist","cli.cjs"),path.join(__dirname,"..","dist","cli.js")].find(n=>fs$1.existsSync(n));if(!r){let n=await me(t);return process.on("exit",()=>{n?.dispose();}),n.port}return new Promise(n=>{let s=child_process.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(),ii().then(n));},5e3);s.stderr?.on("data",d=>{a+=d.toString();let l=a.match(/127\.0\.0\.1:(\d+)/);l&&!o&&(o=true,clearTimeout(i),s.stderr?.removeAllListeners(),s.unref(),n(Number(l[1])));}),s.on("error",()=>{o||(o=true,clearTimeout(i),n(null));}),s.on("exit",()=>{o||(o=true,clearTimeout(i),n(null));}),s.unref();})}var hn=Buffer.from([137,80,78,71,13,10,26,10]),di=16,ci=20,Me=24;function mn(t){if(t.length<Me||!t.subarray(0,hn.length).equals(hn))return null;let e=t.readUInt32BE(di),r=t.readUInt32BE(ci);return e===0||r===0?null:{width:e,height:r}}var ui=/(\d+) pixels \(ratio [\d.]+ of all image pixels\) are different/,vn=/Expected an image (\d+)px by (\d+)px, received (\d+)px by (\d+)px/;function yn(t){return t?vn.test(t):false}var pi=/^\s*Snapshot:\s*(.+?)\s*$/m;function bn(t){if(!t)return {};let e={},r=ui.exec(t);if(r){let a=Number.parseInt(r[1],10);Number.isFinite(a)&&(e.diffPixels=a);}let n=vn.exec(t);if(n){let[,a,o,i,d]=n,l=[a,o,i,d].map(c=>Number.parseInt(c,10));l.every(c=>Number.isFinite(c))&&(e.expectedWidth=l[0],e.expectedHeight=l[1],e.actualWidth=l[2],e.actualHeight=l[3]);}let s=pi.exec(t);return s&&(e.snapshotName=s[1]),e}function xn(t,e){if(t===void 0||!e)return;let r=e.width*e.height;if(!(r<=0))return t/r}var bi=20,Mt=0,Pt=[];async function ve(t,e){Mt>=bi&&await new Promise(r=>Pt.push(r)),Mt++;try{return await promises.copyFile(t,e),!0}catch{return false}finally{Mt--,Pt.length>0&&Pt.shift()();}}var W=[];async function Cn(){W.length!==0&&(await Promise.allSettled(W),W.length=0);}function Sn(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(!fs$1.existsSync(path.join(t,n)))return n;let s=1;for(;fs$1.existsSync(path.join(t,`${n}-${s}`));)s++;return `${n}-${s}`}function Et(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"}var xi=8;function Tn(t,e,r){let n=Et(t),s=r?Et(r).substring(0,xi):"";return s&&(n+=`--${s}`),e>0&&(n+=`--retry-${e}`),n}function Rn(t,e,r,n,s,a){let o=t.find(p=>p.name==="screenshot"&&p.path),i=t.find(p=>p.name==="video"&&p.path),d=t.find(p=>p.name==="trace"&&p.path);if(!o&&!i&&!d)return null;let l=Tn(e,r,a),c=s?["artifacts",s,l]:["artifacts",l],u=path.join(n,...c),h=c,f={};try{fs$1.mkdirSync(u,{recursive:!0});}catch{return null}if(o?.path&&fs$1.existsSync(o.path)){let m=`screenshot${path.extname(o.path)||".png"}`,g=path.join(u,m);W.push(ve(o.path,g).then(()=>{})),f.screenshot=`${h.join("/")}/${m}`;}if(i?.path&&fs$1.existsSync(i.path)){let m=`video${path.extname(i.path)||".webm"}`,g=path.join(u,m);W.push(ve(i.path,g).then(()=>{})),f.video=`${h.join("/")}/${m}`;}if(d?.path&&fs$1.existsSync(d.path)){let m=`trace${path.extname(d.path)||".zip"}`,g=path.join(u,m);W.push(ve(d.path,g).then(()=>{})),f.trace=`${h.join("/")}/${m}`;}return !f.screenshot&&!f.video&&!f.trace?null:f}var Lt="visual",wi=6;function ki(t){let e=crypto.createHash("sha256").update(t).digest("hex").substring(0,wi);return `${Et(t)}--${e}`}function wn(t){let e=null;try{e=fs$1.openSync(t,"r");let r=Buffer.alloc(Me),n=fs$1.readSync(e,r,0,Me,0);return mn(r.subarray(0,n))}catch{return null}finally{if(e!==null)try{fs$1.closeSync(e);}catch{}}}var kn=[{key:"expectedPath",dest:"baseline",field:"baseline"},{key:"actualPath",dest:"actual",field:"actual"},{key:"diffPath",dest:"diff",field:"diff"},{key:"previousPath",dest:"previous",field:"previous"}],Ci=[{key:"baselineDomPath",dest:"baseline.dom.json",field:"baselineDom"},{key:"actualDomPath",dest:"actual.dom.json",field:"actualDom"}];function Si(t,e,r,n){let s=ki(t.name),a=path.join(e,s),o=kn.some(p=>t[p.key]);if(o||t.dom)try{fs$1.mkdirSync(a,{recursive:!0});}catch{return null}let i={},d=false;for(let p of kn){let m=t[p.key];if(!m||!fs$1.existsSync(m))continue;let g=path.extname(m)||".png",v=`${p.dest}${g}`;W.push(ve(m,path.join(a,v)).then(()=>{})),i[p.field]=`${r}/${Lt}/${s}/${v}`,d=true;}let l=t.dom;if(l)for(let p of Ci){let m=l[p.key];!m||!fs$1.existsSync(m)||(W.push(ve(m,path.join(a,p.dest)).then(()=>{})),i[p.field]=`${r}/${Lt}/${s}/${p.dest}`);}if(!d&&o)return null;let c=t.expectedPath?wn(t.expectedPath):t.actualPath?wn(t.actualPath):null,u=xn(t.diffPixels,c),h=t.committedPath??t.expectedPath,f=h?path.relative(n,h).replace(/\\/g,"/"):void 0;return {name:t.name,status:t.status,source:t.source,...i,...f?{baselinePath:f}:{},...c?{width:c.width,height:c.height}:{},...t.actualWidth!==void 0?{actualWidth:t.actualWidth}:{},...t.actualHeight!==void 0?{actualHeight:t.actualHeight}:{},...t.diffPixels!==void 0?{diffPixels:t.diffPixels}:{},...u!==void 0?{diffPixelRatio:u}:{},...l?{domChanges:l.changes,domChangeCount:l.total,domRootCauses:l.rootCauses,domTruncated:l.truncated,domCaptureBox:l.captureBox}:{}}}function An(t,e,r,n,s,a,o=process.cwd()){if(t.length===0)return null;let i=Tn(e,r,a),d=s?["artifacts",s,i]:["artifacts",i],l=path.join(n,...d,Lt),c=d.join("/");try{fs$1.mkdirSync(l,{recursive:!0});}catch{return null}let u=[];for(let h of t){let f=Si(h,l,c,o);f&&u.push(f);}return u.length>0?u:null}function _n(t){let{styleProps:e,defaults:r,inherited:n,maxNodes:s,maxText:a,maskBoxes:o,viewportBox:i,fullPage:d}=t,l={};for(let S=0;S<n.length;S++)l[n[S]]=true;let c=window.scrollX||window.pageXOffset||0,u=window.scrollY||window.pageYOffset||0,h=[],f=0,p=[];for(let S=0;S<o.length;S++){let w=o[S];p.push([w[0]+c,w[1]+u,w[2],w[3]]);}function m(S,w,A,x){for(let C=0;C<p.length;C++){let _=p[C];if(S<_[0]+_[2]&&S+A>_[0]&&w<_[1]+_[3]&&w+x>_[1])return true}return false}function g(S){let w=S.parentElement;if(!w)return 0;let A=w.children,x=0;for(let C=0;C<A.length;C++){let _=A[C];if(_===S)break;_.tagName===S.tagName&&x++;}return x}function v(S){let w="",A=S.childNodes;for(let x=0;x<A.length;x++){let C=A[x];C.nodeType===3&&(w+=C.nodeValue??"");}return w=w.replace(/\s+/g," ").trim(),w.length>a?w.slice(0,a):w}function y(S,w){let A;for(let x=0;x<e.length;x++){let C=e[x],_=S.getPropertyValue(C);if(_){if(l[C]){if(w&&w.getPropertyValue(C)===_)continue}else if(r[C]===_)continue;A||(A={}),A[C]=_;}}return A}let b=[{el:document.body,parentPath:"",parentComputed:null}];for(;b.length>0;){let S=b.pop(),w=S.el,A=window.getComputedStyle(w);if(A.display==="none")continue;let x=w.tagName.toLowerCase(),C=w.id?"#"+w.id:S.parentPath?S.parentPath+">"+x+"["+g(w)+"]":x,_=w.children;for(let E=_.length-1;E>=0;E--)b.push({el:_[E],parentPath:C,parentComputed:A});if(A.visibility==="hidden")continue;let L=w.getBoundingClientRect();if(L.width<=0||L.height<=0)continue;if(h.length>=s){f++;continue}let z=Math.round(L.left+c),ce=Math.round(L.top+u),ue=Math.round(L.width),pe=Math.round(L.height),I={p:C,t:x,r:[z,ce,ue,pe]};w.id&&(I.i=w.id);let M=w.getAttribute("class");M&&(I.c=M.replace(/\s+/g," ").trim());let N=v(w);N&&(I.x=N);let j=y(A,S.parentComputed);j&&(I.s=j),m(z,ce,ue,pe)&&(I.m=1),h.push(I);}let k=Math.max(document.documentElement.scrollWidth,window.innerWidth),R=Math.max(document.documentElement.scrollHeight,window.innerHeight),P;return i?P=[Math.round(i[0]+c),Math.round(i[1]+u),Math.round(i[2]),Math.round(i[3])]:d?P=[0,0,k,R]:P=[Math.round(c),Math.round(u),window.innerWidth,window.innerHeight],{version:"1.0",url:location.href,viewport:{width:window.innerWidth,height:window.innerHeight},content:{width:k,height:R},captureBox:P,nodes:h,truncatedNodes:f}}var Mi=["display","position","color","background-color","background-image","border-top-width","border-right-width","border-bottom-width","border-left-width","border-color","border-style","border-radius","box-shadow","opacity","transform","margin-top","margin-right","margin-bottom","margin-left","padding-top","padding-right","padding-bottom","padding-left","font-family","font-size","font-weight","line-height","letter-spacing","text-align","text-decoration-line","text-transform","flex-direction","justify-content","align-items","gap","z-index","overflow"],Pi={position:"static","background-color":"rgba(0, 0, 0, 0)","background-image":"none","border-top-width":"0px","border-right-width":"0px","border-bottom-width":"0px","border-left-width":"0px","border-style":"none","border-radius":"0px","box-shadow":"none",opacity:"1",transform:"none","margin-top":"0px","margin-right":"0px","margin-bottom":"0px","margin-left":"0px","padding-top":"0px","padding-right":"0px","padding-bottom":"0px","padding-left":"0px","text-decoration-line":"none","flex-direction":"row","justify-content":"normal","align-items":"normal",gap:"normal","z-index":"auto",overflow:"visible"},Ei=["color","font-family","font-size","font-weight","line-height","letter-spacing","text-align","text-transform"],Li=1024*1024,Ni=1500,Di=200;async function Fi(t){let e=[];for(let r of t)try{let n=await r.boundingBox();n&&e.push([n.x,n.y,n.width,n.height]);}catch{}return e}async function In(t){let e=t.config??{};try{let r=t.maskLocators?.length?await Fi(t.maskLocators):[],n=null;if(t.bounded){let a=await t.bounded.boundingBox();a&&(n=[a.x,a.y,a.width,a.height]);}let s={styleProps:Mi,defaults:Pi,inherited:Ei,maxNodes:e.maxNodes??Ni,maxText:e.maxText??Di,maskBoxes:r,viewportBox:n,fullPage:t.fullPage===!0};return await t.target.evaluate(_n,s)}catch{return null}}function Mn(t,e=Li){let r=JSON.stringify(t);if(Buffer.byteLength(r,"utf-8")<=e)return {json:r,truncatedBytes:false};let n=t.nodes.slice(),s=0;for(;n.length>0&&Buffer.byteLength(r,"utf-8")>e;){let a=Math.max(1,Math.floor(n.length*.1));n.splice(-a,a),s+=a,r=JSON.stringify({...t,nodes:n,truncatedNodes:t.truncatedNodes+s});}return {json:r,truncatedBytes:true}}function Pn(t){return t.replace(/\.[A-Za-z0-9]+$/,"")+".dom.json"}function En(t){try{if(!fs$1.existsSync(t))return null;let e=JSON.parse(fs$1.readFileSync(t,"utf-8"));return Bi(e)?e:null}catch{return null}}function Ln(t,e){try{return fs$1.mkdirSync(path.dirname(t),{recursive:!0}),fs$1.writeFileSync(t,e,"utf-8"),!0}catch{return false}}function Bi(t){if(typeof t!="object"||t===null)return false;let e=t;return typeof e.version=="string"&&Array.isArray(e.nodes)&&Array.isArray(e.captureBox)&&e.captureBox.length===4}var Oi=new Set(["moved","resized"]);function Ee(t){return t.some(e=>!Oi.has(e))}function Dt(t){let e=t.t;if(t.i&&(e+="#"+t.i),t.c){let r=t.c.split(" ").filter(Boolean).slice(0,3);r.length>0&&(e+="."+r.join("."));}return e}function qi(t,e){let r=[],n=Math.abs(t.r[0]-e.r[0]),s=Math.abs(t.r[1]-e.r[1]),a=Math.abs(t.r[2]-e.r[2]),o=Math.abs(t.r[3]-e.r[3]);return (n>1||s>1)&&r.push("moved"),(a>1||o>1)&&r.push("resized"),r}function Hi(t,e){let r=t.s??{},n=e.s??{},s=new Set([...Object.keys(r),...Object.keys(n)]),a=[];for(let o of s){let i=r[o],d=n[o];i!==d&&a.push({prop:o,from:i??"(initial)",to:d??"(initial)"});}return a.sort((o,i)=>o.prop.localeCompare(i.prop)),a}function Nn(t){return t.i?"i:"+t.t+"#"+t.i:t.c?"c:"+t.t+"."+t.c:null}function Ui(t,e){let r=new Map;for(let u of t)r.set(u.p,u);let n=[],s=[],a=new Set;for(let u of e){let h=r.get(u.p);if(h&&h.t!==u.t){s.push(u);continue}h&&!a.has(h)?(a.add(h),n.push({before:h,after:u})):s.push(u);}let o=t.filter(u=>!a.has(u)),i=new Map;for(let u of o){let h=Nn(u);if(!h)continue;let f=i.get(h);f?f.push(u):i.set(h,[u]);}let d=[],l=new Set;for(let u of s){let h=Nn(u),p=(h?i.get(h):void 0)?.find(m=>!l.has(m));p?(l.add(p),n.push({before:p,after:u})):d.push(u);}let c=o.filter(u=>!l.has(u));return {pairs:n,removed:c,added:d}}function zi(t,e){let r=[];return (t.i??"")!==(e.i??"")&&r.push({prop:"id",from:t.i??"(none)",to:e.i??"(none)"}),(t.c??"")!==(e.c??"")&&r.push({prop:"class",from:t.c??"(none)",to:e.c??"(none)"}),r}function Ft(t,e){let r=(e[2]??0)*(e[3]??0);return r<=0?0:Math.min(1,t.r[2]*t.r[3]/r)}function Dn(t,e,r={}){let n=r.maxChanges??50,s=r.includeText!==false,a=r.includeStyles!==false,o=t.nodes.filter(p=>p.m!==1),i=e.nodes.filter(p=>p.m!==1),{pairs:d,removed:l,added:c}=Ui(o,i),u=[];for(let{before:p,after:m}of d){let g=qi(p,m),v=a?Hi(p,m):[];v.length>0&&g.push("restyled");let y=zi(p,m);y.length>0&&g.push("attrs");let b=s&&(p.x??"")!==(m.x??"");if(b&&g.push("text"),g.length===0)continue;let k=Ft(m,e.captureBox);u.push({score:k,change:{path:m.p,label:Dt(m),kinds:g,rect:m.r,baselineRect:p.r,areaPct:k,...y.length>0?{attrs:y}:{},...v.length>0?{styles:v}:{},...b?{text:{from:p.x??"",to:m.x??""}}:{}}});}for(let p of c){let m=Ft(p,e.captureBox);u.push({score:m,change:{path:p.p,label:Dt(p),kinds:["added"],rect:p.r,areaPct:m}});}for(let p of l){let m=Ft(p,t.captureBox);u.push({score:m,change:{path:p.p,label:Dt(p),kinds:["removed"],baselineRect:p.r,areaPct:m}});}let h=u.filter(p=>Ee(p.change.kinds)).length;return u.sort((p,m)=>{if(h>0){let g=Ee(p.change.kinds)?1:0,v=Ee(m.change.kinds)?1:0;if(g!==v)return v-g}return m.score-p.score}),{changes:u.slice(0,n).map((p,m)=>({rank:m+1,...p.change,...h>0&&!Ee(p.change.kinds)?{consequence:true}:{}})),total:u.length,rootCauses:h}}var ji="__testrelic_snapshot_path_probe__.png",Fn=Symbol.for("testrelic.snapshotPathWarned");function Vi(){let t=globalThis,e=t[Fn];return e||(e={warned:false},t[Fn]=e),e}function Le(t){try{let e=t.snapshotPath(ji,{kind:"screenshot"});return typeof e=="string"&&!e.includes("[object Object]")}catch{return false}}function Ne(t){let e=Vi();e.warned||(e.warned=true,process.stderr.write(`[testrelic] ${t} needs Playwright >= 1.51 for testInfo.snapshotPath(name, { kind }); this project's Playwright resolves that call the older way. Everything else in the reporter is unaffected \u2014 upgrade Playwright to enable it.
4258
+ `);}}var Ie=9323,gn=10;async function ii(){for(let t=Ie;t<Ie+gn;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 oi(){for(let t=Ie;t<Ie+gn;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 li(t){let r=[path.join(__dirname,"cli.cjs"),path.join(__dirname,"cli.js"),path.join(__dirname,"..","dist","cli.cjs"),path.join(__dirname,"..","dist","cli.js")].find(n=>fs$1.existsSync(n));if(!r){let n=await me(t);return process.on("exit",()=>{n?.dispose();}),n.port}return new Promise(n=>{let s=child_process.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(),ii().then(n));},5e3);s.stderr?.on("data",d=>{a+=d.toString();let l=a.match(/127\.0\.0\.1:(\d+)/);l&&!o&&(o=true,clearTimeout(i),s.stderr?.removeAllListeners(),s.unref(),n(Number(l[1])));}),s.on("error",()=>{o||(o=true,clearTimeout(i),n(null));}),s.on("exit",()=>{o||(o=true,clearTimeout(i),n(null));}),s.unref();})}var hn=Buffer.from([137,80,78,71,13,10,26,10]),di=16,ci=20,Me=24;function mn(t){if(t.length<Me||!t.subarray(0,hn.length).equals(hn))return null;let e=t.readUInt32BE(di),r=t.readUInt32BE(ci);return e===0||r===0?null:{width:e,height:r}}var ui=/(\d+) pixels \(ratio [\d.]+ of all image pixels\) are different/,vn=/Expected an image (\d+)px by (\d+)px, received (\d+)px by (\d+)px/;function yn(t){return t?vn.test(t):false}var pi=/^\s*Snapshot:\s*(.+?)\s*$/m;function bn(t){if(!t)return {};let e={},r=ui.exec(t);if(r){let a=Number.parseInt(r[1],10);Number.isFinite(a)&&(e.diffPixels=a);}let n=vn.exec(t);if(n){let[,a,o,i,d]=n,l=[a,o,i,d].map(c=>Number.parseInt(c,10));l.every(c=>Number.isFinite(c))&&(e.expectedWidth=l[0],e.expectedHeight=l[1],e.actualWidth=l[2],e.actualHeight=l[3]);}let s=pi.exec(t);return s&&(e.snapshotName=s[1]),e}function xn(t,e){if(t===void 0||!e)return;let r=e.width*e.height;if(!(r<=0))return t/r}var bi=20,Mt=0,Pt=[];async function ve(t,e){Mt>=bi&&await new Promise(r=>Pt.push(r)),Mt++;try{return await promises.copyFile(t,e),!0}catch{return false}finally{Mt--,Pt.length>0&&Pt.shift()();}}var W=[];async function Cn(){W.length!==0&&(await Promise.allSettled(W),W.length=0);}function Sn(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(!fs$1.existsSync(path.join(t,n)))return n;let s=1;for(;fs$1.existsSync(path.join(t,`${n}-${s}`));)s++;return `${n}-${s}`}function Et(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"}var xi=8;function Tn(t,e,r){let n=Et(t),s=r?Et(r).substring(0,xi):"";return s&&(n+=`--${s}`),e>0&&(n+=`--retry-${e}`),n}function Rn(t,e,r,n,s,a){let o=t.find(p=>p.name==="screenshot"&&p.path),i=t.find(p=>p.name==="video"&&p.path),d=t.find(p=>p.name==="trace"&&p.path);if(!o&&!i&&!d)return null;let l=Tn(e,r,a),c=s?["artifacts",s,l]:["artifacts",l],u=path.join(n,...c),h=c,f={};try{fs$1.mkdirSync(u,{recursive:!0});}catch{return null}if(o?.path&&fs$1.existsSync(o.path)){let m=`screenshot${path.extname(o.path)||".png"}`,g=path.join(u,m);W.push(ve(o.path,g).then(()=>{})),f.screenshot=`${h.join("/")}/${m}`;}if(i?.path&&fs$1.existsSync(i.path)){let m=`video${path.extname(i.path)||".webm"}`,g=path.join(u,m);W.push(ve(i.path,g).then(()=>{})),f.video=`${h.join("/")}/${m}`;}if(d?.path&&fs$1.existsSync(d.path)){let m=`trace${path.extname(d.path)||".zip"}`,g=path.join(u,m);W.push(ve(d.path,g).then(()=>{})),f.trace=`${h.join("/")}/${m}`;}return !f.screenshot&&!f.video&&!f.trace?null:f}var Lt="visual",wi=6;function ki(t){let e=crypto.createHash("sha256").update(t).digest("hex").substring(0,wi);return `${Et(t)}--${e}`}function wn(t){let e=null;try{e=fs$1.openSync(t,"r");let r=Buffer.alloc(Me),n=fs$1.readSync(e,r,0,Me,0);return mn(r.subarray(0,n))}catch{return null}finally{if(e!==null)try{fs$1.closeSync(e);}catch{}}}var kn=[{key:"expectedPath",dest:"baseline",field:"baseline"},{key:"actualPath",dest:"actual",field:"actual"},{key:"diffPath",dest:"diff",field:"diff"},{key:"previousPath",dest:"previous",field:"previous"}],Ci=[{key:"baselineDomPath",dest:"baseline.dom.json",field:"baselineDom"},{key:"actualDomPath",dest:"actual.dom.json",field:"actualDom"}];function Si(t,e,r,n){let s=ki(t.name),a=path.join(e,s),o=kn.some(p=>t[p.key]);if(o||t.dom)try{fs$1.mkdirSync(a,{recursive:!0});}catch{return null}let i={},d=false;for(let p of kn){let m=t[p.key];if(!m||!fs$1.existsSync(m))continue;let g=path.extname(m)||".png",v=`${p.dest}${g}`;W.push(ve(m,path.join(a,v)).then(()=>{})),i[p.field]=`${r}/${Lt}/${s}/${v}`,d=true;}let l=t.dom;if(l)for(let p of Ci){let m=l[p.key];!m||!fs$1.existsSync(m)||(W.push(ve(m,path.join(a,p.dest)).then(()=>{})),i[p.field]=`${r}/${Lt}/${s}/${p.dest}`);}if(!d&&o)return null;let c=t.expectedPath?wn(t.expectedPath):t.actualPath?wn(t.actualPath):null,u=xn(t.diffPixels,c),h=t.committedPath??t.expectedPath,f=h?path.relative(n,h).replace(/\\/g,"/"):void 0;return {name:t.name,status:t.status,source:t.source,...i,...f?{baselinePath:f}:{},...c?{width:c.width,height:c.height}:{},...t.actualWidth!==void 0?{actualWidth:t.actualWidth}:{},...t.actualHeight!==void 0?{actualHeight:t.actualHeight}:{},...t.diffPixels!==void 0?{diffPixels:t.diffPixels}:{},...u!==void 0?{diffPixelRatio:u}:{},...l?{domChanges:l.changes,domChangeCount:l.total,domRootCauses:l.rootCauses,domTruncated:l.truncated,domCaptureBox:l.captureBox}:{}}}function An(t,e,r,n,s,a,o=process.cwd()){if(t.length===0)return null;let i=Tn(e,r,a),d=s?["artifacts",s,i]:["artifacts",i],l=path.join(n,...d,Lt),c=d.join("/");try{fs$1.mkdirSync(l,{recursive:!0});}catch{return null}let u=[];for(let h of t){let f=Si(h,l,c,o);f&&u.push(f);}return u.length>0?u:null}function _n(t){let{styleProps:e,defaults:r,inherited:n,maxNodes:s,maxText:a,maskBoxes:o,viewportBox:i,fullPage:d}=t,l={};for(let S=0;S<n.length;S++)l[n[S]]=true;let c=window.scrollX||window.pageXOffset||0,u=window.scrollY||window.pageYOffset||0,h=[],f=0,p=[];for(let S=0;S<o.length;S++){let w=o[S];p.push([w[0]+c,w[1]+u,w[2],w[3]]);}function m(S,w,A,x){for(let C=0;C<p.length;C++){let _=p[C];if(S<_[0]+_[2]&&S+A>_[0]&&w<_[1]+_[3]&&w+x>_[1])return true}return false}function g(S){let w=S.parentElement;if(!w)return 0;let A=w.children,x=0;for(let C=0;C<A.length;C++){let _=A[C];if(_===S)break;_.tagName===S.tagName&&x++;}return x}function v(S){let w="",A=S.childNodes;for(let x=0;x<A.length;x++){let C=A[x];C.nodeType===3&&(w+=C.nodeValue??"");}return w=w.replace(/\s+/g," ").trim(),w.length>a?w.slice(0,a):w}function y(S,w){let A;for(let x=0;x<e.length;x++){let C=e[x],_=S.getPropertyValue(C);if(_){if(l[C]){if(w&&w.getPropertyValue(C)===_)continue}else if(r[C]===_)continue;A||(A={}),A[C]=_;}}return A}let b=[{el:document.body,parentPath:"",parentComputed:null}];for(;b.length>0;){let S=b.pop(),w=S.el,A=window.getComputedStyle(w);if(A.display==="none")continue;let x=w.tagName.toLowerCase(),C=w.id?"#"+w.id:S.parentPath?S.parentPath+">"+x+"["+g(w)+"]":x,_=w.children;for(let E=_.length-1;E>=0;E--)b.push({el:_[E],parentPath:C,parentComputed:A});if(A.visibility==="hidden")continue;let L=w.getBoundingClientRect();if(L.width<=0||L.height<=0)continue;if(h.length>=s){f++;continue}let z=Math.round(L.left+c),ce=Math.round(L.top+u),ue=Math.round(L.width),pe=Math.round(L.height),I={p:C,t:x,r:[z,ce,ue,pe]};w.id&&(I.i=w.id);let M=w.getAttribute("class");M&&(I.c=M.replace(/\s+/g," ").trim());let N=v(w);N&&(I.x=N);let j=y(A,S.parentComputed);j&&(I.s=j),m(z,ce,ue,pe)&&(I.m=1),h.push(I);}let k=Math.max(document.documentElement.scrollWidth,window.innerWidth),T=Math.max(document.documentElement.scrollHeight,window.innerHeight),P;return i?P=[Math.round(i[0]+c),Math.round(i[1]+u),Math.round(i[2]),Math.round(i[3])]:d?P=[0,0,k,T]:P=[Math.round(c),Math.round(u),window.innerWidth,window.innerHeight],{version:"1.0",url:location.href,viewport:{width:window.innerWidth,height:window.innerHeight},content:{width:k,height:T},captureBox:P,nodes:h,truncatedNodes:f}}var Mi=["display","position","color","background-color","background-image","border-top-width","border-right-width","border-bottom-width","border-left-width","border-color","border-style","border-radius","box-shadow","opacity","transform","margin-top","margin-right","margin-bottom","margin-left","padding-top","padding-right","padding-bottom","padding-left","font-family","font-size","font-weight","line-height","letter-spacing","text-align","text-decoration-line","text-transform","flex-direction","justify-content","align-items","gap","z-index","overflow"],Pi={position:"static","background-color":"rgba(0, 0, 0, 0)","background-image":"none","border-top-width":"0px","border-right-width":"0px","border-bottom-width":"0px","border-left-width":"0px","border-style":"none","border-radius":"0px","box-shadow":"none",opacity:"1",transform:"none","margin-top":"0px","margin-right":"0px","margin-bottom":"0px","margin-left":"0px","padding-top":"0px","padding-right":"0px","padding-bottom":"0px","padding-left":"0px","text-decoration-line":"none","flex-direction":"row","justify-content":"normal","align-items":"normal",gap:"normal","z-index":"auto",overflow:"visible"},Ei=["color","font-family","font-size","font-weight","line-height","letter-spacing","text-align","text-transform"],Li=1024*1024,Ni=1500,Di=200;async function Fi(t){let e=[];for(let r of t)try{let n=await r.boundingBox();n&&e.push([n.x,n.y,n.width,n.height]);}catch{}return e}async function In(t){let e=t.config??{};try{let r=t.maskLocators?.length?await Fi(t.maskLocators):[],n=null;if(t.bounded){let a=await t.bounded.boundingBox();a&&(n=[a.x,a.y,a.width,a.height]);}let s={styleProps:Mi,defaults:Pi,inherited:Ei,maxNodes:e.maxNodes??Ni,maxText:e.maxText??Di,maskBoxes:r,viewportBox:n,fullPage:t.fullPage===!0};return await t.target.evaluate(_n,s)}catch{return null}}function Mn(t,e=Li){let r=JSON.stringify(t);if(Buffer.byteLength(r,"utf-8")<=e)return {json:r,truncatedBytes:false};let n=t.nodes.slice(),s=0;for(;n.length>0&&Buffer.byteLength(r,"utf-8")>e;){let a=Math.max(1,Math.floor(n.length*.1));n.splice(-a,a),s+=a,r=JSON.stringify({...t,nodes:n,truncatedNodes:t.truncatedNodes+s});}return {json:r,truncatedBytes:true}}function Pn(t){return t.replace(/\.[A-Za-z0-9]+$/,"")+".dom.json"}function En(t){try{if(!fs$1.existsSync(t))return null;let e=JSON.parse(fs$1.readFileSync(t,"utf-8"));return Bi(e)?e:null}catch{return null}}function Ln(t,e){try{return fs$1.mkdirSync(path.dirname(t),{recursive:!0}),fs$1.writeFileSync(t,e,"utf-8"),!0}catch{return false}}function Bi(t){if(typeof t!="object"||t===null)return false;let e=t;return typeof e.version=="string"&&Array.isArray(e.nodes)&&Array.isArray(e.captureBox)&&e.captureBox.length===4}var Oi=new Set(["moved","resized"]);function Ee(t){return t.some(e=>!Oi.has(e))}function Dt(t){let e=t.t;if(t.i&&(e+="#"+t.i),t.c){let r=t.c.split(" ").filter(Boolean).slice(0,3);r.length>0&&(e+="."+r.join("."));}return e}function qi(t,e){let r=[],n=Math.abs(t.r[0]-e.r[0]),s=Math.abs(t.r[1]-e.r[1]),a=Math.abs(t.r[2]-e.r[2]),o=Math.abs(t.r[3]-e.r[3]);return (n>1||s>1)&&r.push("moved"),(a>1||o>1)&&r.push("resized"),r}function Hi(t,e){let r=t.s??{},n=e.s??{},s=new Set([...Object.keys(r),...Object.keys(n)]),a=[];for(let o of s){let i=r[o],d=n[o];i!==d&&a.push({prop:o,from:i??"(initial)",to:d??"(initial)"});}return a.sort((o,i)=>o.prop.localeCompare(i.prop)),a}function Nn(t){return t.i?"i:"+t.t+"#"+t.i:t.c?"c:"+t.t+"."+t.c:null}function Ui(t,e){let r=new Map;for(let u of t)r.set(u.p,u);let n=[],s=[],a=new Set;for(let u of e){let h=r.get(u.p);if(h&&h.t!==u.t){s.push(u);continue}h&&!a.has(h)?(a.add(h),n.push({before:h,after:u})):s.push(u);}let o=t.filter(u=>!a.has(u)),i=new Map;for(let u of o){let h=Nn(u);if(!h)continue;let f=i.get(h);f?f.push(u):i.set(h,[u]);}let d=[],l=new Set;for(let u of s){let h=Nn(u),p=(h?i.get(h):void 0)?.find(m=>!l.has(m));p?(l.add(p),n.push({before:p,after:u})):d.push(u);}let c=o.filter(u=>!l.has(u));return {pairs:n,removed:c,added:d}}function zi(t,e){let r=[];return (t.i??"")!==(e.i??"")&&r.push({prop:"id",from:t.i??"(none)",to:e.i??"(none)"}),(t.c??"")!==(e.c??"")&&r.push({prop:"class",from:t.c??"(none)",to:e.c??"(none)"}),r}function Ft(t,e){let r=(e[2]??0)*(e[3]??0);return r<=0?0:Math.min(1,t.r[2]*t.r[3]/r)}function Dn(t,e,r={}){let n=r.maxChanges??50,s=r.includeText!==false,a=r.includeStyles!==false,o=t.nodes.filter(p=>p.m!==1),i=e.nodes.filter(p=>p.m!==1),{pairs:d,removed:l,added:c}=Ui(o,i),u=[];for(let{before:p,after:m}of d){let g=qi(p,m),v=a?Hi(p,m):[];v.length>0&&g.push("restyled");let y=zi(p,m);y.length>0&&g.push("attrs");let b=s&&(p.x??"")!==(m.x??"");if(b&&g.push("text"),g.length===0)continue;let k=Ft(m,e.captureBox);u.push({score:k,change:{path:m.p,label:Dt(m),kinds:g,rect:m.r,baselineRect:p.r,areaPct:k,...y.length>0?{attrs:y}:{},...v.length>0?{styles:v}:{},...b?{text:{from:p.x??"",to:m.x??""}}:{}}});}for(let p of c){let m=Ft(p,e.captureBox);u.push({score:m,change:{path:p.p,label:Dt(p),kinds:["added"],rect:p.r,areaPct:m}});}for(let p of l){let m=Ft(p,t.captureBox);u.push({score:m,change:{path:p.p,label:Dt(p),kinds:["removed"],baselineRect:p.r,areaPct:m}});}let h=u.filter(p=>Ee(p.change.kinds)).length;return u.sort((p,m)=>{if(h>0){let g=Ee(p.change.kinds)?1:0,v=Ee(m.change.kinds)?1:0;if(g!==v)return v-g}return m.score-p.score}),{changes:u.slice(0,n).map((p,m)=>({rank:m+1,...p.change,...h>0&&!Ee(p.change.kinds)?{consequence:true}:{}})),total:u.length,rootCauses:h}}var ji="__testrelic_snapshot_path_probe__.png",Fn=Symbol.for("testrelic.snapshotPathWarned");function Vi(){let t=globalThis,e=t[Fn];return e||(e={warned:false},t[Fn]=e),e}function Le(t){try{let e=t.snapshotPath(ji,{kind:"screenshot"});return typeof e=="string"&&!e.includes("[object Object]")}catch{return false}}function Ne(t){let e=Vi();e.warned||(e.warned=true,process.stderr.write(`[testrelic] ${t} needs Playwright >= 1.51 for testInfo.snapshotPath(name, { kind }); this project's Playwright resolves that call the older way. Everything else in the reporter is unaffected \u2014 upgrade Playwright to enable it.
4259
4259
  `));}var Bt="testrelic-visual-dom",Ji=new Set(["toHaveScreenshot","toMatchVisualBaseline"]);function Bn(t){if(typeof t!="object"||t===null)return false;let e=t;return typeof e.boundingBox=="function"&&typeof e.page=="function"}function Yi(t){if(typeof t!="object"||t===null)return false;let e=t;return typeof e.evaluate=="function"&&typeof e.screenshot=="function"}function Xi(t){let e=t[0];if(typeof e=="string")return e;if(Array.isArray(e))return e.join("/");if(typeof e=="object"&&e!==null){let r=e.name;if(typeof r=="string")return r}return null}function Zi(t){for(let e of t)if(typeof e=="object"&&e!==null&&!Array.isArray(e))return e;return {}}function Qi(t){let e=t.mask;return Array.isArray(e)?e.filter(r=>typeof r=="object"&&r!==null&&typeof r.boundingBox=="function"):[]}function eo(t){return /\.(png|jpg|jpeg)$/i.test(t)?t:`${t}.png`}var to=/^(.+)-(expected|actual|diff|previous)\.[A-Za-z0-9]+$/;function ro(t,e,r){let n=t.attachments;for(let s=e;s<n.length;s++){let a=to.exec(n[s]?.name??"");if(a)return a[1]}return r}async function no(t){let e=Zi(t.args),r=Bn(t.received)?t.received:null,n=r?r.page():t.received;return In({target:n,bounded:r,maskLocators:Qi(e),fullPage:e.fullPage===true})}function so(t){let e=t.config?.updateSnapshots;return e==="all"||e==="changed"}async function ao(t,e){let r=Xi(t.args);if(!r)return;if(!Le(t.testInfo)){Ne("DOM comparison");return}let n=t.testInfo.snapshotPath(eo(r),{kind:"screenshot"}),s=Pn(n),a=ro(t.testInfo,t.attachedBefore,path.basename(n,path.extname(n))),o=Mn(e),d=so(t.testInfo)?null:En(s);if(!d){Ln(s,o.json);return}let{changes:l,total:c,rootCauses:u}=Dn(d,e),h;try{h=t.testInfo.outputPath(`${a}.actual.dom.json`),fs$1.writeFileSync(h,o.json,"utf-8");}catch{h=void 0;}let f={stem:a,changes:l,total:c,rootCauses:u,truncated:o.truncatedBytes||e.truncatedNodes>0,captureBox:e.captureBox,...fs$1.existsSync(s)?{baselineDomPath:s}:{},...h?{actualDomPath:h}:{}};await t.testInfo.attach(Bt,{body:Buffer.from(JSON.stringify([f])),contentType:"application/json"});}function On(t,e){let r=function(o,...i){let d=t(o,...i);return !(Bn(o)||Yi(o))||typeof d!="object"||d===null?d:new Proxy(d,{get(c,u,h){let f=Reflect.get(c,u,h);if(typeof u!="string"||!Ji.has(u)||typeof f!="function")return f;let p=f;return async function(...g){let v=e(),y=null,b=v?.attachments.length??0;if(v)try{y=await no({received:o,args:g,testInfo:v,attachedBefore:b});}catch{}try{return await p.apply(c,g)}finally{if(v&&y)try{await ao({received:o,args:g,testInfo:v,attachedBefore:b},y);}catch{}}}}})},n=t,s=r;for(let a of Object.keys(n))s[a]=n[a];return r}var Ot="testrelic-visual",io=/^(.+)-(expected|actual|diff|previous)(\.[A-Za-z0-9]+)$/;function oo(t){let e=new Map;for(let r of t)if(!(r.name!==Ot||!r.body))try{let n=JSON.parse(r.body.toString("utf-8"));if(!Array.isArray(n))continue;for(let s of n){let a=co(s);a&&e.set(a.stem,a);}}catch{}return e}var lo=["passed","failed","new","updated"];function co(t){if(typeof t!="object"||t===null)return null;let e=t;return typeof e.stem!="string"||!e.stem||typeof e.name!="string"||!e.name||typeof e.status!="string"||!lo.includes(e.status)?null:{stem:e.stem,name:e.name,status:e.status,...typeof e.committedPath=="string"&&e.committedPath?{committedPath:e.committedPath}:{}}}function uo(t){let e=new Map;for(let r of t)if(!(r.name!==Bt||!r.body))try{let n=JSON.parse(r.body.toString("utf-8"));if(!Array.isArray(n))continue;for(let s of n){if(typeof s!="object"||s===null)continue;let a=s;typeof a.stem!="string"||!Array.isArray(a.changes)||e.set(a.stem,s);}}catch{}return e}function po(t){let e=new Map;for(let r of t){if(!r.path)continue;let n=io.exec(r.name);if(!n)continue;let[,s,a]=n,o=e.get(s)??{};o[a]=r.path,e.set(s,o);}return e}function fo(t){return !!(t.actual&&(t.expected||t.diff))}function go(t,e,r){return t.diff||yn(r)?"failed":e?"updated":"new"}function ho(t,e){if(t.length===0)return null;if(t.length===1)return t[0];if(!e)return null;let r=e.replace(/\.[A-Za-z0-9]+$/,""),n=t.filter(s=>s===r||s.endsWith(`/${r}`));return n.length===1?n[0]:null}function Un(t,e={}){if(t.length===0)return [];let r=oo(t),n=uo(t),s=po(t);if(s.size===0&&r.size===0)return [];let a=e.updatingSnapshots===true,o=[];for(let[i,d]of s){let l=r.get(i);!l&&!fo(d)||o.push({name:l?.name??i,status:l?.status??go(d,a,e.failureMessage),source:l?"toMatchVisualBaseline":"toHaveScreenshot",...d.expected?{expectedPath:d.expected}:{},...l?.committedPath?{committedPath:l.committedPath}:{},...d.actual?{actualPath:d.actual}:{},...d.diff?{diffPath:d.diff}:{},...d.previous?{previousPath:d.previous}:{},...n.has(i)?{dom:n.get(i)}:{}});}for(let[i,d]of r)s.has(i)||o.push({name:d.name,status:d.status,source:"toMatchVisualBaseline",...d.committedPath?{committedPath:d.committedPath}:{},...n.has(i)?{dom:n.get(i)}:{}});return mo(o,s,e.failureMessage)}function mo(t,e,r){let n=bn(r);if(n.diffPixels===void 0&&n.actualWidth===void 0)return [...t];let s=t.filter(o=>o.status==="failed"&&qn(o)).map(o=>Hn(o,e)),a=ho(s,n.snapshotName);return a===null?[...t]:t.map(o=>qn(o)&&Hn(o,e)===a?{...o,...n.diffPixels!==void 0?{diffPixels:n.diffPixels}:{},...n.actualWidth!==void 0?{actualWidth:n.actualWidth}:{},...n.actualHeight!==void 0?{actualHeight:n.actualHeight}:{}}:o)}function qn(t){return !!(t.expectedPath||t.actualPath||t.diffPath||t.previousPath)}function Hn(t,e){if(e.has(t.name))return t.name;for(let[r,n]of e)if(n.actual===t.actualPath&&n.expected===t.expectedPath&&n.diff===t.diffPath)return r;return t.name}var vo=new RegExp("[\x1B\x9B][[\\]()#;?]*(?:\\d{1,4}(?:;\\d{0,4})*)?[0-9A-PR-TZcf-nqry=><]","g");function se(t){return !t||t.indexOf("\x1B")===-1&&t.indexOf("\x9B")===-1?t:t.replace(vo,"")}function zn(t){return t==null?null:se(t)}var yo=/^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(-\d+)?$/,bo="1.0",qt="visual";function Wn(t){let e=path.extname(t).toLowerCase();return [".png",".jpg",".jpeg",".gif",".bmp",".webp"].includes(e)?"screenshot":[".webm",".mp4",".avi",".mov"].includes(e)?"video":e===".zip"&&path.basename(t,e)==="trace"?"trace":"other"}function xo(t){if(t.endsWith(".dom.json"))return "dom";let e=path.basename(t,path.extname(t));return e==="baseline"?"baseline":e==="diff"?"diff":Wn(t)}function wo(t,e,r){let n=[];try{for(let s of fs$1.readdirSync(t,{withFileTypes:!0})){if(!s.isFile())continue;let a=fs$1.statSync(path.join(t,s.name));n.push({name:`${qt}/${r}/${s.name}`,type:xo(s.name),relativePath:`${e}/${qt}/${r}/${s.name}`,sizeBytes:a.size});}}catch{}return n}function Gn(t,e,r){let n=[],s=`artifacts/${e}/${r}`;try{let a=fs$1.readdirSync(t,{withFileTypes:!0});for(let o of a){if(o.isDirectory()&&o.name===qt){let l=path.join(t,o.name);for(let c of fs$1.readdirSync(l,{withFileTypes:!0}))c.isDirectory()&&n.push(...wo(path.join(l,c.name),s,c.name));continue}if(!o.isFile())continue;let i=path.join(t,o.name),d=fs$1.statSync(i);n.push({name:o.name,type:Wn(o.name),relativePath:`${s}/${o.name}`,sizeBytes:d.size});}}catch{}return {testName:r,files:n}}function ko(t,e){let r=path.join(t,e),n=[],s=0;try{let o=fs$1.readdirSync(r,{withFileTypes:!0});for(let i of o){if(!i.isDirectory())continue;let d=Gn(path.join(r,i.name),e,i.name);n.push(d);for(let l of d.files)s+=l.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 Kn(t,e){let r=path.join(t,"artifacts"),n=[],s=[],a=0;try{let i=fs$1.readdirSync(r,{withFileTypes:!0});for(let d of i)if(d.isDirectory())if(yo.test(d.name)){let l=ko(r,d.name);n.push({...l,isCurrentRun:d.name===e});}else {let l=Gn(path.join(r,d.name),d.name,d.name);s.push(l);for(let c of l.files)a+=c.sizeBytes;}}catch{}n.sort((i,d)=>d.timestamp.localeCompare(i.timestamp)),s.length>0&&(s.sort((i,d)=>i.testName.localeCompare(d.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,d)=>i+d.totalSizeBytes,0);return {schemaVersion:bo,generatedAt:new Date().toISOString(),artifactBaseDir:"artifacts",totalSizeBytes:o,runs:n,serverPort:null}}var _o=256;function Io(t){let e=path.resolve(t);for(let r=0;r<_o;r++){if(fs$1.existsSync(path.join(e,".git")))return e;let n=path.dirname(e);if(n===e)return null;e=n;}return null}function Xn(t){try{let e=Io(t);if(!e)return;let r=path.join(e,".gitignore"),n=path.relative(e,t).replace(/\\/g,"/"),s=n.endsWith("/")?n:`${n}/`;if(fs$1.existsSync(r)&&fs$1.readFileSync(r,"utf-8").split(`
4260
4260
  `).map(d=>d.trim()).some(d=>d===s||d===n))return;let a=`
4261
4261
  # TestRelic test artifacts
4262
4262
  ${s}
4263
4263
  `;fs$1.appendFileSync(r,a,"utf-8");}catch{}}var Zn=Symbol("testrelic.timeout"),Qn=3e4,Ht=12e4,Ut=6e4,es=15e3;async function Q(t,e,r){let n,s=new Promise(a=>{n=setTimeout(()=>a(Zn),e),typeof n?.unref=="function"&&n.unref();});try{let a=await Promise.race([t(),s]);if(a===Zn){process.stderr.write(`[testrelic] ${r} timed out after ${Math.round(e/1e3)}s \u2014 continuing without it. Your tests are unaffected.
4264
4264
  `);return}return a}catch(a){process.stderr.write(`[testrelic] ${r} failed \u2014 continuing without it. Your tests are unaffected. (${a instanceof Error?a.message:String(a)})
4265
- `);return}finally{n&&clearTimeout(n);}}function ns(t,e){let r=[];for(let n of t){let s=Mo(n),a=Po(n),o=Eo(n,s,a,e),i=Lo(n,s,a);if(o.length===0&&i.length===0){r.push({type:"navigation",url:"about:blank",timestamp:n.startedAt,durationOnUrl:n.duration,navigationType:"dummy",domContentLoadedAt:null,networkIdleAt:null,networkStats:null,specFile:n.specFile,test:s,tests:[a],_testTitle:n.title});continue}r.push(...o,...i);}return r.sort(No),Do(r,t),r.map((n,s)=>n.type==="navigation"?{...{index:s,type:"navigation",url:n.url,timestamp:n.timestamp,durationOnUrl:n.durationOnUrl??0,navigationType:n.navigationType,domContentLoadedAt:n.domContentLoadedAt??null,networkIdleAt:n.networkIdleAt??null,networkStats:n.networkStats??null,specFile:n.specFile,test:n.test},tests:n.tests}:{...{index:s,type:"api_call",callId:n.callId,method:n.method,url:n.url,timestamp:n.timestamp,responseTime:n.responseTime??null,request:n.request,response:n.response??null,...n.error?{error:n.error}:{},assertions:n.assertions??[],specFile:n.specFile,test:n.test},tests:n.tests})}function Mo(t){return {title:t.title,fullTitle:t.titlePath,status:t.status,duration:t.duration,retries:t.retryCount,retry:t.retry,tags:t.tags,failure:t.failure}}function Po(t){return {title:t.title,status:t.status,duration:t.duration,startedAt:t.startedAt,completedAt:t.completedAt,retryCount:t.retryCount,tags:t.tags,failure:t.failure,testId:t.testId,filePath:t.filePath,suiteName:t.suiteName,testType:t.testType,isFlaky:t.isFlaky,retryStatus:t.retryStatus,expectedStatus:t.expectedStatus,actualStatus:t.actualStatus,artifacts:t.artifacts,networkRequests:t.networkRequests,apiCalls:t.apiCalls,apiAssertions:t.apiAssertions,actions:t.actions,consoleLogs:t.consoleLogs}}function Eo(t,e,r,n){let s=[];for(let a of t.navigations)n.navigationTypes!==null&&!n.navigationTypes.includes(a.navigationType)||s.push({type:"navigation",url:a.url,timestamp:a.timestamp,durationOnUrl:0,navigationType:a.navigationType,domContentLoadedAt:a.domContentLoadedAt??null,networkIdleAt:a.networkIdleAt??null,networkStats:a.networkStats??null,specFile:t.specFile,test:e,tests:[r],_testTitle:t.title});return s}function Lo(t,e,r){if(!t.apiCalls||t.apiCalls.length===0)return [];let n=t.apiAssertions??[];return t.apiCalls.map(s=>{let a=n.filter(i=>i.callId===s.id).map(i=>({type:i.type,expected:i.expected,actual:i.actual,status:i.status,location:i.location,...i.expression!==void 0?{expression:i.expression}:{}})),o=null;return s.responseStatusCode!==null&&s.responseStatusText!==null&&(o={statusCode:s.responseStatusCode,statusText:s.responseStatusText,headers:s.responseHeaders,body:rs(s.responseBody)}),{type:"api_call",callId:s.id,method:s.method,url:s.url,timestamp:s.timestamp,responseTime:s.error?null:s.responseTimeMs,request:{headers:s.requestHeaders,body:rs(s.requestBody)},response:o,...s.error?{error:s.error}:{},assertions:a,specFile:t.specFile,test:e,tests:[r],_testTitle:t.title}})}function No(t,e){let r=new Date(t.timestamp).getTime(),n=new Date(e.timestamp).getTime();if(r!==n)return r-n;let s={navigation:0,api_call:1},a=s[t.type],o=s[e.type];return a!==o?a-o:t.type==="api_call"&&e.type==="api_call"&&t.callId&&e.callId?ts(t.callId)-ts(e.callId):0}function ts(t){let e=t.match(/(\d+)$/);return e?parseInt(e[1],10):0}function Do(t,e){for(let r=0;r<t.length;r++){let n=t[r];if(n.type!=="navigation")continue;let s=new Date(n.timestamp).getTime(),a=null;for(let o=r+1;o<t.length;o++)if(t[o]._testTitle===n._testTitle){a=new Date(t[o].timestamp).getTime();break}if(a!==null)n.durationOnUrl=Math.max(0,a-s);else {let o=e.find(i=>i.title===n._testTitle);if(o){let i=new Date(o.completedAt).getTime();n.durationOnUrl=Math.max(0,i-s);}}}}function rs(t){if(t==null)return null;try{return JSON.parse(t)}catch{return t}}function ee(t,e){let r=t.length,n=Math.min(Math.ceil(e/100*r)-1,r-1);return t[Math.max(0,n)]}function zt(t){try{let e=new URL(t);return e.origin+e.pathname}catch{return t}}function Fo(t){return t==null?"error":t>=200&&t<300?"2xx":t>=300&&t<400?"3xx":t>=400&&t<500?"4xx":t>=500&&t<600?"5xx":"error"}function ss(t,e){let r=0,n=0,s=0,a=0,o=0;for(let x of t)switch(x.status){case "passed":r++;break;case "failed":n++;break;case "flaky":s++;break;case "skipped":a++;break;case "timedout":o++;break}let i=[];for(let x of t)x.apiCalls&&i.push(...x.apiCalls);let d=i.length,l=new Set,c={},u={"2xx":0,"3xx":0,"4xx":0,"5xx":0,error:0},h=[];for(let x of i)l.add(zt(x.url)),c[x.method]=(c[x.method]??0)+1,u[Fo(x.responseStatusCode)]+=1,h.push(x.responseTimeMs);let f=null;if(h.length>0){let x=[...h].sort((_,L)=>_-L),C=x.reduce((_,L)=>_+L,0);f={avg:Math.round(C/x.length),min:x[0],max:x[x.length-1],p50:ee(x,50),p95:ee(x,95),p99:ee(x,99)};}let p=0,m=0,g=0;for(let x of t)if(x.apiAssertions)for(let C of x.apiAssertions)p++,C.status==="passed"?m++:g++;let v=0,y=new Set;for(let x of t){v+=x.navigations.length;for(let C of x.navigations)y.add(C.url);}let b=0,k={};function R(x){for(let C of x)b++,k[C.category]=(k[C.category]??0)+1,C.children.length>0&&R(C.children);}for(let x of t)x.actions&&R(x.actions);let P=0,S=0,w=0,A=0;for(let x of t)if(x.visual)for(let C of x.visual)P++,C.status==="failed"?S++:(C.status==="new"||C.status==="updated")&&w++,A+=C.domChangeCount??0;return {total:t.length,passed:r,failed:n,flaky:s,skipped:a,timedout:o,totalApiCalls:d,uniqueApiUrls:l.size,apiCallsByMethod:c,apiCallsByStatusRange:u,apiResponseTime:f,totalAssertions:p,passedAssertions:m,failedAssertions:g,totalNavigations:v,uniqueNavigationUrls:y.size,totalTimelineSteps:e,totalActionSteps:b,actionStepsByCategory:k,visualChecks:P,visualFailures:S,visualNew:w,visualDomChanges:A}}function Bo(t){let e=56-t.length;return e>0?t+" ".repeat(e):t}function F(t){return `\u2502 ${Bo(t)} \u2502
4265
+ `);return}finally{n&&clearTimeout(n);}}function ns(t,e){let r=[];for(let n of t){let s=Mo(n),a=Po(n),o=Eo(n,s,a,e),i=Lo(n,s,a);if(o.length===0&&i.length===0){r.push({type:"navigation",url:"about:blank",timestamp:n.startedAt,durationOnUrl:n.duration,navigationType:"dummy",domContentLoadedAt:null,networkIdleAt:null,networkStats:null,specFile:n.specFile,test:s,tests:[a],_testTitle:n.title});continue}r.push(...o,...i);}return r.sort(No),Do(r,t),r.map((n,s)=>n.type==="navigation"?{...{index:s,type:"navigation",url:n.url,timestamp:n.timestamp,durationOnUrl:n.durationOnUrl??0,navigationType:n.navigationType,domContentLoadedAt:n.domContentLoadedAt??null,networkIdleAt:n.networkIdleAt??null,networkStats:n.networkStats??null,specFile:n.specFile,test:n.test},tests:n.tests}:{...{index:s,type:"api_call",callId:n.callId,method:n.method,url:n.url,timestamp:n.timestamp,responseTime:n.responseTime??null,request:n.request,response:n.response??null,...n.error?{error:n.error}:{},assertions:n.assertions??[],specFile:n.specFile,test:n.test},tests:n.tests})}function Mo(t){return {title:t.title,fullTitle:t.titlePath,status:t.status,duration:t.duration,retries:t.retryCount,retry:t.retry,tags:t.tags,failure:t.failure}}function Po(t){return {title:t.title,status:t.status,duration:t.duration,startedAt:t.startedAt,completedAt:t.completedAt,retryCount:t.retryCount,tags:t.tags,failure:t.failure,testId:t.testId,filePath:t.filePath,suiteName:t.suiteName,testType:t.testType,isFlaky:t.isFlaky,retryStatus:t.retryStatus,expectedStatus:t.expectedStatus,actualStatus:t.actualStatus,artifacts:t.artifacts,networkRequests:t.networkRequests,apiCalls:t.apiCalls,apiAssertions:t.apiAssertions,actions:t.actions,consoleLogs:t.consoleLogs}}function Eo(t,e,r,n){let s=[];for(let a of t.navigations)n.navigationTypes!==null&&!n.navigationTypes.includes(a.navigationType)||s.push({type:"navigation",url:a.url,timestamp:a.timestamp,durationOnUrl:0,navigationType:a.navigationType,domContentLoadedAt:a.domContentLoadedAt??null,networkIdleAt:a.networkIdleAt??null,networkStats:a.networkStats??null,specFile:t.specFile,test:e,tests:[r],_testTitle:t.title});return s}function Lo(t,e,r){if(!t.apiCalls||t.apiCalls.length===0)return [];let n=t.apiAssertions??[];return t.apiCalls.map(s=>{let a=n.filter(i=>i.callId===s.id).map(i=>({type:i.type,expected:i.expected,actual:i.actual,status:i.status,location:i.location,...i.expression!==void 0?{expression:i.expression}:{}})),o=null;return s.responseStatusCode!==null&&s.responseStatusText!==null&&(o={statusCode:s.responseStatusCode,statusText:s.responseStatusText,headers:s.responseHeaders,body:rs(s.responseBody)}),{type:"api_call",callId:s.id,method:s.method,url:s.url,timestamp:s.timestamp,responseTime:s.error?null:s.responseTimeMs,request:{headers:s.requestHeaders,body:rs(s.requestBody)},response:o,...s.error?{error:s.error}:{},assertions:a,specFile:t.specFile,test:e,tests:[r],_testTitle:t.title}})}function No(t,e){let r=new Date(t.timestamp).getTime(),n=new Date(e.timestamp).getTime();if(r!==n)return r-n;let s={navigation:0,api_call:1},a=s[t.type],o=s[e.type];return a!==o?a-o:t.type==="api_call"&&e.type==="api_call"&&t.callId&&e.callId?ts(t.callId)-ts(e.callId):0}function ts(t){let e=t.match(/(\d+)$/);return e?parseInt(e[1],10):0}function Do(t,e){for(let r=0;r<t.length;r++){let n=t[r];if(n.type!=="navigation")continue;let s=new Date(n.timestamp).getTime(),a=null;for(let o=r+1;o<t.length;o++)if(t[o]._testTitle===n._testTitle){a=new Date(t[o].timestamp).getTime();break}if(a!==null)n.durationOnUrl=Math.max(0,a-s);else {let o=e.find(i=>i.title===n._testTitle);if(o){let i=new Date(o.completedAt).getTime();n.durationOnUrl=Math.max(0,i-s);}}}}function rs(t){if(t==null)return null;try{return JSON.parse(t)}catch{return t}}function ee(t,e){let r=t.length,n=Math.min(Math.ceil(e/100*r)-1,r-1);return t[Math.max(0,n)]}function zt(t){try{let e=new URL(t);return e.origin+e.pathname}catch{return t}}function Fo(t){return t==null?"error":t>=200&&t<300?"2xx":t>=300&&t<400?"3xx":t>=400&&t<500?"4xx":t>=500&&t<600?"5xx":"error"}function ss(t,e){let r=0,n=0,s=0,a=0,o=0;for(let x of t)switch(x.status){case "passed":r++;break;case "failed":n++;break;case "flaky":s++;break;case "skipped":a++;break;case "timedout":o++;break}let i=[];for(let x of t)x.apiCalls&&i.push(...x.apiCalls);let d=i.length,l=new Set,c={},u={"2xx":0,"3xx":0,"4xx":0,"5xx":0,error:0},h=[];for(let x of i)l.add(zt(x.url)),c[x.method]=(c[x.method]??0)+1,u[Fo(x.responseStatusCode)]+=1,h.push(x.responseTimeMs);let f=null;if(h.length>0){let x=[...h].sort((_,L)=>_-L),C=x.reduce((_,L)=>_+L,0);f={avg:Math.round(C/x.length),min:x[0],max:x[x.length-1],p50:ee(x,50),p95:ee(x,95),p99:ee(x,99)};}let p=0,m=0,g=0;for(let x of t)if(x.apiAssertions)for(let C of x.apiAssertions)p++,C.status==="passed"?m++:g++;let v=0,y=new Set;for(let x of t){v+=x.navigations.length;for(let C of x.navigations)y.add(C.url);}let b=0,k={};function T(x){for(let C of x)b++,k[C.category]=(k[C.category]??0)+1,C.children.length>0&&T(C.children);}for(let x of t)x.actions&&T(x.actions);let P=0,S=0,w=0,A=0;for(let x of t)if(x.visual)for(let C of x.visual)P++,C.status==="failed"?S++:(C.status==="new"||C.status==="updated")&&w++,A+=C.domChangeCount??0;return {total:t.length,passed:r,failed:n,flaky:s,skipped:a,timedout:o,totalApiCalls:d,uniqueApiUrls:l.size,apiCallsByMethod:c,apiCallsByStatusRange:u,apiResponseTime:f,totalAssertions:p,passedAssertions:m,failedAssertions:g,totalNavigations:v,uniqueNavigationUrls:y.size,totalTimelineSteps:e,totalActionSteps:b,actionStepsByCategory:k,visualChecks:P,visualFailures:S,visualNew:w,visualDomChanges:A}}function Bo(t){let e=56-t.length;return e>0?t+" ".repeat(e):t}function F(t){return `\u2502 ${Bo(t)} \u2502
4266
4266
  `}function jt(t,e,r,n){if(n||t.total===0)return;let s=`\u250C${"\u2500".repeat(58)}\u2510
4267
4267
  `,a=`\u2514${"\u2500".repeat(58)}\u2518
4268
4268
  `,o=F(""),i=s;i+=F("TestRelic AI - Playwright Test Report"),i+=o;let d=[];if(t.passed>0&&d.push(`${t.passed} \u2713`),t.failed>0&&d.push(`${t.failed} \u2717`),t.flaky>0&&d.push(`${t.flaky} \u26A0`),t.skipped>0&&d.push(`${t.skipped} skipped`),t.timedout>0&&d.push(`${t.timedout} timedout`),i+=F(`Tests: ${t.total} total (${d.join(" ")})`),t.totalNavigations>0&&(i+=F(`Navigations: ${t.totalNavigations} visits across ${t.uniqueNavigationUrls} unique URLs`)),t.totalApiCalls>0){i+=F(`API Calls: ${t.totalApiCalls} calls across ${t.uniqueApiUrls} unique endpoints`);let l=Object.entries(t.apiCallsByMethod).filter(([,u])=>u>0).map(([u,h])=>`${u}: ${h}`);l.length>0&&(i+=F(` ${l.join(" ")}`));let c=Object.entries(t.apiCallsByStatusRange).filter(([,u])=>u>0).map(([u,h])=>`${u}: ${h}`);c.length>0&&(i+=F(` ${c.join(" ")}`)),t.apiResponseTime&&(i+=F(` Avg response: ${t.apiResponseTime.avg}ms P95: ${t.apiResponseTime.p95}ms`));}if(t.totalAssertions>0&&(i+=F(`Assertions: ${t.totalAssertions} total (${t.passedAssertions} \u2713 ${t.failedAssertions} \u2717)`)),t.totalActionSteps>0){let l=[],c=t.actionStepsByCategory;c.ui_action&&l.push(`${c.ui_action} UI`),c.assertion&&l.push(`${c.assertion} assertions`),c.custom_step&&l.push(`${c.custom_step} custom`);let u=l.length>0?` (${l.join(" ")})`:"";i+=F(`Actions: ${t.totalActionSteps} steps${u}`);}i+=F(`Report: ${r}`),i+=F(`Data: ${e}`),i+=a,i+=`For more information visit us at https://docs.testrelic.ai
@@ -4296,12 +4296,12 @@ ${s}
4296
4296
  `);}readRepoCache(e){if(!this.config)return null;let r=path.join(this.config.queueDirectory,"..","cache","repo.json");try{if(!fs$1.existsSync(r))return null;let n=fs$1.readFileSync(r,"utf-8"),s=JSON.parse(n);if(s.gitId!==e||Date.now()-s.resolvedAt>xl)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=path.join(this.config.queueDirectory,"..","cache"),a=path.join(s,"repo.json");try{fs$1.mkdirSync(s,{recursive:!0});let o={repoId:r,gitId:e,displayName:n,resolvedAt:Date.now(),apiKeyHash:this.hashApiKey()??""},i=a+".tmp";fs$1.writeFileSync(i,JSON.stringify(o,null,2),"utf-8"),fs$1.renameSync(i,a);}catch{}}hashApiKey(){return this.config?.apiKey?crypto.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([Rs(r,n,e),Is(_s)]).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 $t(e))return;if(this.config?.apiKey){let n=await Wt(this.config.endpoint,this.config.apiKey,this.config.timeout);if(!Gt(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.
4297
4297
  `),this.startBackgroundFlush();}}}catch{}},wl),typeof this.healthCheckTimer?.unref=="function"&&this.healthCheckTimer.unref();}};function Tl(t,e){return e?t?{"2xx":t["2xx"]+e["2xx"],"3xx":t["3xx"]+e["3xx"],"4xx":t["4xx"]+e["4xx"],"5xx":t["5xx"]+e["5xx"],error:t.error+e.error}:{...e}:t}function Ms(t,e,r,n){let s=[],a=[],o=null,i=0,d=null,l=0,c=null,u=0,h=null,f=t.filter(g=>g.name===core.ATTACHMENT_NAME&&g.body),p=false;if(f.length>0)for(let g of f)try{let v=JSON.parse(g.body.toString());if(core.isTestRelicFilePayload(v)){s=s.concat(v.navigations),a=a.concat(v.apiAssertions),v.networkRequestsFile&&(o=v.networkRequestsFile,i+=v.networkRequestsCount),v.consoleLogsFile&&(d=v.consoleLogsFile,l+=v.consoleLogsCount),v.apiCallsFile&&(c=v.apiCallsFile,u+=v.apiCallsCount),h=Tl(h,v.apiStatusMix),p=!0;continue}if(core.isTestRelicDataPayload(v)){s=s.concat(v.navigations),Array.isArray(v.apiAssertions)&&(a=a.concat(v.apiAssertions)),i+=v.networkRequests?.length??0,u+=v.apiCalls?.length??0;let y=v.consoleLogs;Array.isArray(y)&&(l+=y.length),p=!0;}}catch{process.stderr.write(`[testrelic] Warning: Corrupt attachment for test "${r}"
4298
4298
  `);}return p||(s=e.filter(g=>g.type==="lambdatest-navigation"&&g.description).map(g=>{try{return JSON.parse(g.description)}catch{return null}}).filter(g=>g!==null)),s.length===0&&i===0&&u===0&&!n&&!p&&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 Test Navigation data cannot be captured.
4299
- `),{navigations:s,apiAssertions:a,networkRequestsFile:o,networkRequestsCount:i,consoleLogsFile:d,consoleLogsCount:l,apiCallsFile:c,apiCallsCount:u,apiStatusMix:h}}function Ue(t=process.env){let e=Rl(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 Rl(t){if(!t)return;let e=t.toLowerCase().trim();if(e==="browserstack"||e==="bs")return "browserstack";if(e==="lambdatest"||e==="lt")return "lambdatest"}var Pl=5,ze=[1e3,3e3,9e3],ie=3,lr=3e4,El={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".webm":"video/webm",".mp4":"video/mp4",".zip":"application/zip",".json":"application/json"},ir=0,or=[];async function Ll(){ir>=Pl&&await new Promise(t=>or.push(t)),ir++;}function Nl(){ir--,or.length>0&&or.shift()();}async function je(t){return new Promise(e=>setTimeout(e,t))}function Dl(t){let e=t.substring(t.lastIndexOf(".")).toLowerCase();return El[e]??"application/octet-stream"}function Fl(t){try{return fs$1.statSync(t).size}catch{return 0}}async function Bl(t,e,r,n,s){let a=`${t}/artifacts/upload-url`,o=JSON.stringify({runId:r.runId,testId:r.testId,fileName:path.basename(r.filePath),contentType:s,type:r.type,sizeBytes:n});for(let i=0;i<ie;i++)try{let d=await J(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:o},lr);if(d.ok)return await d.json();if(d.status>=500&&i<ie-1){await je(ze[i]);continue}return null}catch{if(i<ie-1){await je(ze[i]);continue}return null}return null}async function Ol(t,e,r,n){let s=fs(n,lr);for(let a=0;a<ie;a++)try{let o=fs$1.createReadStream(e),i=stream.Readable.toWeb(o),d=await J(t,{method:"PUT",headers:{"Content-Type":r,"Content-Length":String(n)},body:i,duplex:"half"},s);if(d.ok)return !0;if(d.status>=500&&a<ie-1){await je(ze[a]);continue}return !1}catch{if(a<ie-1){await je(ze[a]);continue}return false}return false}async function ql(t,e,r){let n=`${t}/artifacts/confirm`;try{return (await J(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({artifactId:r})},lr)).ok}catch{return false}}async function Hl(t,e,r,n){let s=Fl(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=Dl(r.filePath);await Ll();try{let o=await Bl(t,e,r,s,a);if(!o)return {success:!1,storageKey:null,artifactId:null,error:"upload_url_request_failed"};if(!await Ol(o.uploadUrl,r.filePath,a,s))return {success:!1,storageKey:o.storageKey,artifactId:o.artifactId,error:"presigned_put_failed"};let d=await ql(t,e,o.artifactId);return {success:d,storageKey:o.storageKey,artifactId:o.artifactId,error:d?null:"confirm_failed"}}finally{Nl();}}async function Ps(t,e,r,n,s){let a=new Map,o=r.map(async i=>{if(s?.expired()){a.set(i.filePath,{success:false,storageKey:null,artifactId:null,error:"upload_budget_exhausted"});return}let d=await Hl(t,e,i,n);a.set(i.filePath,d);});return await Promise.allSettled(o),a}function cr(t){let r=t.getGitMetadata()?.remoteUrl;return r?be(r):t.getConfig()?.projectName??xe(process.cwd())}async function Es(t,e,r,n,s){if(!t.isCloudMode()||e!=="realtime"&&e!=="both"||!await t.ensureValidToken())return null;let o=t.getGitMetadata(),i=V(),d=Ue(),l=De();return (await ys(t.getEndpoint(),t.getAccessToken(),{runId:r,repoGitId:cr(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??d.cloudPlatform??null,cloudPlatform:d.cloudPlatform??null,cloudBuildId:d.cloudBuildId??null,cloudSessionId:d.cloudSessionId??null,...l?{runType:l}:{},testType:"e2e"}))?.runId??null}var zl=[{field:"baseline",keyField:"baselineKey",type:"baseline"},{field:"actual",keyField:"actualKey",type:"screenshot"},{field:"diff",keyField:"diffKey",type:"diff"},{field:"baselineDom",keyField:"baselineDomKey",type:"dom"},{field:"actualDom",keyField:"actualDomKey",type:"dom"}],jl=true,Vl=50,dr={keyMap:new Map,visualKeyMap:new Map,total:0,uploaded:0};async function $l(t,e,r,n,s){let a=new Map,o=new Map;if(!(e?.uploadArtifacts??jl)||!await t.ensureValidToken())return dr;let l=[],c=new Map,u=new Map;for(let g of n){if(g.artifacts.screenshot){let y=path.join(g.outputDir,g.artifacts.screenshot);l.push({filePath:y,runId:r,testId:g.testId,type:"screenshot"}),c.set(y,{testId:g.testId,field:"screenshot"});}if(g.artifacts.video){let y=path.join(g.outputDir,g.artifacts.video);l.push({filePath:y,runId:r,testId:g.testId,type:"video"}),c.set(y,{testId:g.testId,field:"video"});}if(g.artifacts.trace){let y=path.join(g.outputDir,g.artifacts.trace);l.push({filePath:y,runId:r,testId:g.testId,type:"trace"}),c.set(y,{testId:g.testId,field:"trace"});}let v=g.visual??[];for(let y=0;y<v.length;y++){let b=v[y];if(b)for(let k of zl){let R=b[k.field];if(!R)continue;let P=path.join(g.outputDir,R);l.push({filePath:P,runId:r,testId:g.testId,type:k.type}),c.set(P,{testId:g.testId,field:"visual",visualIndex:y,visualKey:k.keyField});}}}if(l.length===0)return dr;let h=e?.artifactMaxSizeMb??Vl,f=await Ps(t.getEndpoint(),t.getAccessToken(),l,h,s),p=new Map;for(let[g,v]of f){if(!v.success||!v.storageKey)continue;let y=c.get(g);if(!y)continue;let b=p.get(y.testId)??{};if(y.field==="screenshot"&&(b.screenshotKey=v.storageKey),y.field==="video"&&(b.videoKey=v.storageKey),y.field==="trace"&&(b.traceKey=v.storageKey),y.field==="visual"&&y.visualIndex!==void 0&&y.visualKey){let k=u.get(y.testId)??new Map,R=k.get(y.visualIndex)??{};R[y.visualKey]=v.storageKey,k.set(y.visualIndex,R),u.set(y.testId,k);}p.set(y.testId,b);}for(let g of n){if(g.visual&&g.visual.length>0){let y=u.get(g.testId);o.set(g.testId,g.visual.map((b,k)=>({...b,...y?.get(k)??{}})));}let v=p.get(g.testId);a.set(g.testId,{...g.artifacts,...v?.screenshotKey?{screenshotKey:v.screenshotKey}:{},...v?.videoKey?{videoKey:v.videoKey}:{},...v?.traceKey?{traceKey:v.traceKey}:{}});}let m=Array.from(f.values()).filter(g=>g.success).length;return m>0&&process.stderr.write(`\u2713 TestRelic: Uploaded ${m} artifact(s) to cloud storage.
4300
- `),{keyMap:a,visualKeyMap:o,total:l.length,uploaded:m}}async function ur(t,e,r,n,s,a,o,i,d,l,c){let u={realtimeFinalizeAttempted:false,realtimeFinalized:false,batchAttempted:false,batchAcknowledged:false,artifactsTotal:0,artifactsUploaded:0,failureReason:null},h=new Fe(e?.uploadBudgetMs??12e4),f=p=>{u.failureReason||(u.failureReason=p);};try{if(t.isCloudMode()&&s&&(r==="realtime"||r==="both")){u.realtimeFinalizeAttempted=!0;let g=await t.ensureValidToken(),v=t.getGitMetadata(),y=Yt(c),b={finishedAt:o,duration:i,summary:d,...v?.commitMessage?{commitMessage:v.commitMessage}:{},testType:y.testType,...y.testType==="api"?{apiProtocol:y.apiProtocol,metadata:y.metadata}:{}};if(g){let k=await xs(t.getEndpoint(),t.getAccessToken(),s,b);if(u.realtimeFinalized=k,!k){f("finalize_failed_after_retries");let R=e?.queueDirectory??".testrelic/queue";we(R,n,"finalize","finalize_failed_after_retries",`${t.getEndpoint()}/runs/${s}/finalize`,"POST",b,{"Content-Type":"application/json"});}}else {f(t.getFailureReason()??"token_invalid");let k=e?.queueDirectory??".testrelic/queue";we(k,n,"finalize",t.getFailureReason()??"token_invalid",`${t.getEndpoint()}/runs/${s}/finalize`,"POST",b,{"Content-Type":"application/json"});}}let p=new Map,m=new Map;if(t.isCloudMode()&&l&&l.length>0){let g=await $l(t,e,n,l,h);p=g.keyMap,m=g.visualKeyMap,u.artifactsTotal=g.total,u.artifactsUploaded=g.uploaded;}if(t.isCloudMode()&&(!r||r==="batch"||r==="both"))if(u.batchAttempted=!0,await t.ensureValidToken()){let v=t.getGitMetadata(),y=V(),b=cr(t),k=Gl(Kl(a,p),m),R=Xt(k,b,v,y,Wl(c,m),Ue()),P=await vs(t.getEndpoint(),t.getAccessToken(),R,async()=>await t.ensureValidToken()?t.getAccessToken():null,e?.timeout,h);if(u.batchAcknowledged=P.success,!P.success){let S=P;f(S.reason);let w=e?.queueDirectory??".testrelic/queue";we(w,n,"batch",S.reason,S.targetEndpoint,S.method,S.payload,{"Content-Type":"application/json"});}}else {f(t.getFailureReason()??"token_invalid");let v=e?.queueDirectory??".testrelic/queue",y=t.getGitMetadata(),b=V(),k=cr(t),R=Xt(a,k,y,b,void 0,Ue());we(v,n,"batch",t.getFailureReason()??"token_invalid",`${t.getEndpoint()}/runs`,"POST",R,{"Content-Type":"application/json"});}await t.dispose();}catch(p){f(p instanceof Error?p.message:"unexpected_upload_error");try{await t.dispose();}catch{}}return u}function Wl(t,e){return !t||e.size===0?t:t.map(r=>{let n=e.get(r.testId);return n?{...r,visual:n}:r})}function Gl(t,e){if(e.size===0)return t;let r=t.timeline.map(n=>{let s=n.tests;if(!Array.isArray(s))return n;let a=false,o=s.map(i=>{let d=i.testId;if(!d)return i;let l=e.get(d);return l?(a=true,{...i,visual:l}):i});return a?{...n,tests:o}:n});return {...t,timeline:r}}function Kl(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}}var Jl=new Set(["batch","realtime","both"]),ke=Object.freeze({attempted:false,acknowledged:false,runId:null,endpoint:null,finalized:false,artifactsUploaded:0,artifactsTotal:0,detail:"cloud reporting was never initialised"});function Yl(t){switch(t){case "no_api_key":return "cloud mode off \u2014 no API key configured";case "cloud_unreachable":case "network_error":return "cloud endpoint unreachable \u2014 the run stayed local";case "invalid_api_key":return "API key rejected as invalid or revoked \u2014 the run stayed local";case "expired_api_key":return "API key has expired \u2014 the run stayed local";case "validation_error":return "API key format rejected \u2014 the run stayed local";case "rate_limited":return "rate limited during authentication \u2014 the run stayed local";case "auth_timeout":return "authentication timed out \u2014 the run stayed local";case "token_expired_no_refresh":case "token_refresh_failed":case "token_refresh_error":return "access token could not be refreshed \u2014 the run stayed local";case "init_error":return "cloud initialisation timed out \u2014 the run stayed local";case "unexpected_error":return "cloud initialisation failed \u2014 the run stayed local";default:return t?`cloud mode off (${t}) \u2014 the run stayed local`:"cloud mode off \u2014 the run stayed local"}}function Ls(t,e,r){if(!t)return ke;if(!t.isCloudMode())return {...ke,detail:Yl(t.getFailureReason())};let n=e??"batch";if(!Jl.has(n))return {...ke,detail:`upload strategy '${n}' is not recognised \u2014 nothing was sent`};let s=t.getEndpoint(),a=n==="realtime"||n==="both";return a&&r?{attempted:true,acknowledged:true,runId:r,endpoint:s,finalized:false,artifactsUploaded:0,artifactsTotal:0,detail:null}:{attempted:true,acknowledged:false,runId:null,endpoint:s,finalized:false,artifactsUploaded:0,artifactsTotal:0,detail:a?"run init failed \u2014 the platform did not acknowledge this run":`upload runs at the end of the run under the '${n}' strategy \u2014 not sent yet`}}function pr(t,e,r){if(!t.attempted)return t;if(!e)return {...t,detail:t.acknowledged?"upload timed out before it completed \u2014 the run may be incomplete on the platform":"upload timed out before the platform acknowledged this run",acknowledged:t.acknowledged};let n=t.acknowledged||e.batchAcknowledged,s=t.runId??(e.batchAcknowledged?r:null),a=e.realtimeFinalizeAttempted?e.realtimeFinalized:e.batchAcknowledged,o=null;return n?a||(o="run acknowledged but not closed out \u2014 finalize failed and was queued for retry"):o=e.failureReason?`upload failed (${e.failureReason}) \u2014 queued locally for retry`:"upload failed \u2014 the platform did not acknowledge this run",{attempted:true,acknowledged:n,runId:s,endpoint:t.endpoint,finalized:a,artifactsUploaded:e.artifactsUploaded,artifactsTotal:e.artifactsTotal,detail:o}}function Y(t){try{return fs$1.readFileSync(t,"utf-8").split(`
4299
+ `),{navigations:s,apiAssertions:a,networkRequestsFile:o,networkRequestsCount:i,consoleLogsFile:d,consoleLogsCount:l,apiCallsFile:c,apiCallsCount:u,apiStatusMix:h}}function Ue(t=process.env){let e=Rl(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 Rl(t){if(!t)return;let e=t.toLowerCase().trim();if(e==="browserstack"||e==="bs")return "browserstack";if(e==="lambdatest"||e==="lt")return "lambdatest"}var Pl=5,ze=[1e3,3e3,9e3],ie=3,lr=3e4,El={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".webm":"video/webm",".mp4":"video/mp4",".zip":"application/zip",".json":"application/json"},ir=0,or=[];async function Ll(){ir>=Pl&&await new Promise(t=>or.push(t)),ir++;}function Nl(){ir--,or.length>0&&or.shift()();}async function je(t){return new Promise(e=>setTimeout(e,t))}function Dl(t){let e=t.substring(t.lastIndexOf(".")).toLowerCase();return El[e]??"application/octet-stream"}function Fl(t){try{return fs$1.statSync(t).size}catch{return 0}}async function Bl(t,e,r,n,s){let a=`${t}/artifacts/upload-url`,o=JSON.stringify({runId:r.runId,testId:r.testId,fileName:path.basename(r.filePath),contentType:s,type:r.type,sizeBytes:n});for(let i=0;i<ie;i++)try{let d=await J(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:o},lr);if(d.ok)return await d.json();if(d.status>=500&&i<ie-1){await je(ze[i]);continue}return null}catch{if(i<ie-1){await je(ze[i]);continue}return null}return null}async function Ol(t,e,r,n){let s=fs(n,lr);for(let a=0;a<ie;a++)try{let o=fs$1.createReadStream(e),i=stream.Readable.toWeb(o),d=await J(t,{method:"PUT",headers:{"Content-Type":r,"Content-Length":String(n)},body:i,duplex:"half"},s);if(d.ok)return !0;if(d.status>=500&&a<ie-1){await je(ze[a]);continue}return !1}catch{if(a<ie-1){await je(ze[a]);continue}return false}return false}async function ql(t,e,r){let n=`${t}/artifacts/confirm`;try{return (await J(n,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({artifactId:r})},lr)).ok}catch{return false}}async function Hl(t,e,r,n){let s=Fl(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=Dl(r.filePath);await Ll();try{let o=await Bl(t,e,r,s,a);if(!o)return {success:!1,storageKey:null,artifactId:null,error:"upload_url_request_failed"};if(!await Ol(o.uploadUrl,r.filePath,a,s))return {success:!1,storageKey:o.storageKey,artifactId:o.artifactId,error:"presigned_put_failed"};let d=await ql(t,e,o.artifactId);return {success:d,storageKey:o.storageKey,artifactId:o.artifactId,error:d?null:"confirm_failed"}}finally{Nl();}}async function Ps(t,e,r,n,s){let a=new Map,o=r.map(async i=>{if(s?.expired()){a.set(i.filePath,{success:false,storageKey:null,artifactId:null,error:"upload_budget_exhausted"});return}let d=await Hl(t,e,i,n);a.set(i.filePath,d);});return await Promise.allSettled(o),a}function cr(t){let r=t.getGitMetadata()?.remoteUrl;return r?be(r):t.getConfig()?.projectName??xe(process.cwd())}async function Es(t,e,r,n,s){if(!t.isCloudMode()||e!=="realtime"&&e!=="both"||!await t.ensureValidToken())return null;let o=t.getGitMetadata(),i=V(),d=Ue(),l=De();return (await ys(t.getEndpoint(),t.getAccessToken(),{runId:r,repoGitId:cr(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??d.cloudPlatform??null,cloudPlatform:d.cloudPlatform??null,cloudBuildId:d.cloudBuildId??null,cloudSessionId:d.cloudSessionId??null,...l?{runType:l}:{},testType:"e2e"}))?.runId??null}var zl=[{field:"baseline",keyField:"baselineKey",type:"baseline"},{field:"actual",keyField:"actualKey",type:"screenshot"},{field:"diff",keyField:"diffKey",type:"diff"},{field:"baselineDom",keyField:"baselineDomKey",type:"dom"},{field:"actualDom",keyField:"actualDomKey",type:"dom"}],jl=true,Vl=50,dr={keyMap:new Map,visualKeyMap:new Map,total:0,uploaded:0};async function $l(t,e,r,n,s){let a=new Map,o=new Map;if(!(e?.uploadArtifacts??jl)||!await t.ensureValidToken())return dr;let l=[],c=new Map,u=new Map;for(let g of n){if(g.artifacts.screenshot){let y=path.join(g.outputDir,g.artifacts.screenshot);l.push({filePath:y,runId:r,testId:g.testId,type:"screenshot"}),c.set(y,{testId:g.testId,field:"screenshot"});}if(g.artifacts.video){let y=path.join(g.outputDir,g.artifacts.video);l.push({filePath:y,runId:r,testId:g.testId,type:"video"}),c.set(y,{testId:g.testId,field:"video"});}if(g.artifacts.trace){let y=path.join(g.outputDir,g.artifacts.trace);l.push({filePath:y,runId:r,testId:g.testId,type:"trace"}),c.set(y,{testId:g.testId,field:"trace"});}let v=g.visual??[];for(let y=0;y<v.length;y++){let b=v[y];if(b)for(let k of zl){let T=b[k.field];if(!T)continue;let P=path.join(g.outputDir,T);l.push({filePath:P,runId:r,testId:g.testId,type:k.type}),c.set(P,{testId:g.testId,field:"visual",visualIndex:y,visualKey:k.keyField});}}}if(l.length===0)return dr;let h=e?.artifactMaxSizeMb??Vl,f=await Ps(t.getEndpoint(),t.getAccessToken(),l,h,s),p=new Map;for(let[g,v]of f){if(!v.success||!v.storageKey)continue;let y=c.get(g);if(!y)continue;let b=p.get(y.testId)??{};if(y.field==="screenshot"&&(b.screenshotKey=v.storageKey),y.field==="video"&&(b.videoKey=v.storageKey),y.field==="trace"&&(b.traceKey=v.storageKey),y.field==="visual"&&y.visualIndex!==void 0&&y.visualKey){let k=u.get(y.testId)??new Map,T=k.get(y.visualIndex)??{};T[y.visualKey]=v.storageKey,k.set(y.visualIndex,T),u.set(y.testId,k);}p.set(y.testId,b);}for(let g of n){if(g.visual&&g.visual.length>0){let y=u.get(g.testId);o.set(g.testId,g.visual.map((b,k)=>({...b,...y?.get(k)??{}})));}let v=p.get(g.testId);a.set(g.testId,{...g.artifacts,...v?.screenshotKey?{screenshotKey:v.screenshotKey}:{},...v?.videoKey?{videoKey:v.videoKey}:{},...v?.traceKey?{traceKey:v.traceKey}:{}});}let m=Array.from(f.values()).filter(g=>g.success).length;return m>0&&process.stderr.write(`\u2713 TestRelic: Uploaded ${m} artifact(s) to cloud storage.
4300
+ `),{keyMap:a,visualKeyMap:o,total:l.length,uploaded:m}}async function ur(t,e,r,n,s,a,o,i,d,l,c){let u={realtimeFinalizeAttempted:false,realtimeFinalized:false,batchAttempted:false,batchAcknowledged:false,artifactsTotal:0,artifactsUploaded:0,failureReason:null},h=new Fe(e?.uploadBudgetMs??12e4),f=p=>{u.failureReason||(u.failureReason=p);};try{if(t.isCloudMode()&&s&&(r==="realtime"||r==="both")){u.realtimeFinalizeAttempted=!0;let g=await t.ensureValidToken(),v=t.getGitMetadata(),y=Yt(c),b={finishedAt:o,duration:i,summary:d,...v?.commitMessage?{commitMessage:v.commitMessage}:{},testType:y.testType,...y.testType==="api"?{apiProtocol:y.apiProtocol,metadata:y.metadata}:{}};if(g){let k=await xs(t.getEndpoint(),t.getAccessToken(),s,b);if(u.realtimeFinalized=k,!k){f("finalize_failed_after_retries");let T=e?.queueDirectory??".testrelic/queue";we(T,n,"finalize","finalize_failed_after_retries",`${t.getEndpoint()}/runs/${s}/finalize`,"POST",b,{"Content-Type":"application/json"});}}else {f(t.getFailureReason()??"token_invalid");let k=e?.queueDirectory??".testrelic/queue";we(k,n,"finalize",t.getFailureReason()??"token_invalid",`${t.getEndpoint()}/runs/${s}/finalize`,"POST",b,{"Content-Type":"application/json"});}}let p=new Map,m=new Map;if(t.isCloudMode()&&l&&l.length>0){let g=await $l(t,e,n,l,h);p=g.keyMap,m=g.visualKeyMap,u.artifactsTotal=g.total,u.artifactsUploaded=g.uploaded;}if(t.isCloudMode()&&(!r||r==="batch"||r==="both"))if(u.batchAttempted=!0,await t.ensureValidToken()){let v=t.getGitMetadata(),y=V(),b=cr(t),k=Gl(Kl(a,p),m),T=Xt(k,b,v,y,Wl(c,m),Ue()),P=await vs(t.getEndpoint(),t.getAccessToken(),T,async()=>await t.ensureValidToken()?t.getAccessToken():null,e?.timeout,h);if(u.batchAcknowledged=P.success,!P.success){let S=P;f(S.reason);let w=e?.queueDirectory??".testrelic/queue";we(w,n,"batch",S.reason,S.targetEndpoint,S.method,S.payload,{"Content-Type":"application/json"});}}else {f(t.getFailureReason()??"token_invalid");let v=e?.queueDirectory??".testrelic/queue",y=t.getGitMetadata(),b=V(),k=cr(t),T=Xt(a,k,y,b,void 0,Ue());we(v,n,"batch",t.getFailureReason()??"token_invalid",`${t.getEndpoint()}/runs`,"POST",T,{"Content-Type":"application/json"});}await t.dispose();}catch(p){f(p instanceof Error?p.message:"unexpected_upload_error");try{await t.dispose();}catch{}}return u}function Wl(t,e){return !t||e.size===0?t:t.map(r=>{let n=e.get(r.testId);return n?{...r,visual:n}:r})}function Gl(t,e){if(e.size===0)return t;let r=t.timeline.map(n=>{let s=n.tests;if(!Array.isArray(s))return n;let a=false,o=s.map(i=>{let d=i.testId;if(!d)return i;let l=e.get(d);return l?(a=true,{...i,visual:l}):i});return a?{...n,tests:o}:n});return {...t,timeline:r}}function Kl(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}}var Jl=new Set(["batch","realtime","both"]),ke=Object.freeze({attempted:false,acknowledged:false,runId:null,endpoint:null,finalized:false,artifactsUploaded:0,artifactsTotal:0,detail:"cloud reporting was never initialised"});function Yl(t){switch(t){case "no_api_key":return "cloud mode off \u2014 no API key configured";case "cloud_unreachable":case "network_error":return "cloud endpoint unreachable \u2014 the run stayed local";case "invalid_api_key":return "API key rejected as invalid or revoked \u2014 the run stayed local";case "expired_api_key":return "API key has expired \u2014 the run stayed local";case "validation_error":return "API key format rejected \u2014 the run stayed local";case "rate_limited":return "rate limited during authentication \u2014 the run stayed local";case "auth_timeout":return "authentication timed out \u2014 the run stayed local";case "token_expired_no_refresh":case "token_refresh_failed":case "token_refresh_error":return "access token could not be refreshed \u2014 the run stayed local";case "init_error":return "cloud initialisation timed out \u2014 the run stayed local";case "unexpected_error":return "cloud initialisation failed \u2014 the run stayed local";default:return t?`cloud mode off (${t}) \u2014 the run stayed local`:"cloud mode off \u2014 the run stayed local"}}function Ls(t,e,r){if(!t)return ke;if(!t.isCloudMode())return {...ke,detail:Yl(t.getFailureReason())};let n=e??"batch";if(!Jl.has(n))return {...ke,detail:`upload strategy '${n}' is not recognised \u2014 nothing was sent`};let s=t.getEndpoint(),a=n==="realtime"||n==="both";return a&&r?{attempted:true,acknowledged:true,runId:r,endpoint:s,finalized:false,artifactsUploaded:0,artifactsTotal:0,detail:null}:{attempted:true,acknowledged:false,runId:null,endpoint:s,finalized:false,artifactsUploaded:0,artifactsTotal:0,detail:a?"run init failed \u2014 the platform did not acknowledge this run":`upload runs at the end of the run under the '${n}' strategy \u2014 not sent yet`}}function pr(t,e,r){if(!t.attempted)return t;if(!e)return {...t,detail:t.acknowledged?"upload timed out before it completed \u2014 the run may be incomplete on the platform":"upload timed out before the platform acknowledged this run",acknowledged:t.acknowledged};let n=t.acknowledged||e.batchAcknowledged,s=t.runId??(e.batchAcknowledged?r:null),a=e.realtimeFinalizeAttempted?e.realtimeFinalized:e.batchAcknowledged,o=null;return n?a||(o="run acknowledged but not closed out \u2014 finalize failed and was queued for retry"):o=e.failureReason?`upload failed (${e.failureReason}) \u2014 queued locally for retry`:"upload failed \u2014 the platform did not acknowledge this run",{attempted:true,acknowledged:n,runId:s,endpoint:t.endpoint,finalized:a,artifactsUploaded:e.artifactsUploaded,artifactsTotal:e.artifactsTotal,detail:o}}function Y(t){try{return fs$1.readFileSync(t,"utf-8").split(`
4301
4301
  `).filter(r=>r.length>0).map(r=>{try{return JSON.parse(r)}catch{return null}}).filter(r=>r!==null)}catch{return []}}function nd(t){if(!t)return null;let e=t.split(`
4302
4302
  `).map(a=>a.trim()).filter(Boolean);if(e.length===0)return null;let r=e.filter(a=>!/^Error:\s*expect\(/.test(a));if(r.length===0)return e[0]??null;let n=r[0],s=r[1];return s!==void 0&&/^Received:/.test(s)&&/^Expected:/.test(n)?`${n} \xB7 ${s}`:n}function gr(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 sd(t,e,r){let n=`${t}::${e}::${r}`;return crypto.createHash("sha256").update(n).digest("hex").substring(0,16)}function ad(t){return t.length<=3?"":t[t.length-2]}function id(t){let e=t.findIndex(r=>r.status==="passed");return e>0?`passed on retry ${e}`:null}function Hs(t){return t===null?"error":t>=200&&t<300?"2xx":t>=300&&t<400?"3xx":t>=400&&t<500?"4xx":t>=500&&t<600?"5xx":"error"}function od(t){let e={"2xx":0,"3xx":0,"4xx":0,"5xx":0,error:0},r=e;for(let n of t){let s=typeof n.responseStatusCode=="number"?n.responseStatusCode:null;r[Hs(s)]++;}return e}function Bs(t){if(t){for(let e of t)if(e.status==="failed")return {type:e.type,expected:Os(e.expected),actual:Os(e.actual),...e.expression?{expression:e.expression}:{}}}}function Os(t){if(t===void 0)return "undefined";if(t===null)return "null";let e;if(typeof t=="string")e=t;else try{e=JSON.stringify(t)??String(t);}catch{e=String(t);}return e.length>200?e.slice(0,200)+"\u2026":e}function $e(t,e){if(!t)return 0;let r=0;for(let n of t)n.status===e&&r++;return r}function Us(t,e){for(let r of t)e[r.category]=(e[r.category]??0)+1,r.children.length>0&&Us(r.children,e);}function ld(t){if(t.length===0)return null;let e=[...t].sort((n,s)=>n-s),r=e.reduce((n,s)=>n+s,0);return {avg:Math.round(r/e.length),min:e[0],max:e[e.length-1],p50:ee(e,50),p95:ee(e,95),p99:ee(e,99)}}var zs=2e5,We=1e5;function qs(t,e,r,n,s,a,o){let i={retryIndex:t,apiCalls:e?.length??0,apiUrls:[],methodCounts:{},statusRanges:{"2xx":0,"3xx":0,"4xx":0,"5xx":0,error:0},responseTimes:[],passedAssertions:0,failedAssertions:0,assertions:r.length,navigations:n.length,navUrls:[],networkRequests:s,consoleLogs:a,actionSteps:o?.length??0,actionCategories:{}};if(e){let l=new Set;for(let c of e){let u=typeof c.method=="string"?c.method:"OTHER";i.methodCounts[u]=(i.methodCounts[u]??0)+1;let h=typeof c.url=="string"?c.url:null;h&&l.size<We&&l.add(zt(h));let f=typeof c.responseStatusCode=="number"?c.responseStatusCode:typeof c.statusCode=="number"?c.statusCode:null,p=f!==null&&Number.isFinite(f)?f:null;i.statusRanges[Hs(p)]++;let m=typeof c.responseTimeMs=="number"?c.responseTimeMs:typeof c.durationMs=="number"?c.durationMs:null;m!==null&&Number.isFinite(m)&&i.responseTimes.length<zs&&i.responseTimes.push(m);}i.apiUrls=Array.from(l);}for(let l of r)l.status==="passed"?i.passedAssertions++:i.failedAssertions++;let d=new Set;for(let l of n)l.url&&d.size<We&&d.add(l.url);return i.navUrls=Array.from(d),o&&Us(o,i.actionCategories),i}function dd(){return {apiUrlSet:new Set,methodCounts:{},statusRanges:{"2xx":0,"3xx":0,"4xx":0,"5xx":0,error:0},responseTimes:[],passedAssertions:0,failedAssertions:0,navUrlSet:new Set,actionCategoryCounts:{},volApiCalls:0,volAssertions:0,volNavigations:0,volNetworkRequests:0,volConsoleLogs:0,volActionSteps:0}}function cd(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 ud(){let t=os$1.platform();return t==="win32"?"Windows":t==="darwin"?"macOS":"Linux"}function pd(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 fd(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 d of a)if(t.some(l=>l===`@${d}`||l===d))return d;let o=e.replace(/\\/g,"/"),i=["e2e","api","unit"];for(let d of i)if(o.includes(`/${d}/`))return d;return s}var gd="__testrelic_api_config";function hd(t){return JSON.stringify(t,(e,r)=>r instanceof RegExp?{__regexp:true,source:r.source,flags:r.flags}:r)}var Ge=class{constructor(e){this.rootDir="";this.configDir="";this.startedAt="";this.testRunId="";this.collectedTests=[];this.fixtureDataReceived=false;this.navigationsCaptured=false;this.memoryPressureWarned=false;this.testCount=0;this.cloudClient=null;this.cloudRunId=null;this.runTimestamp="";this.updatingSnapshots=false;this.cloudReceipt=ke;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,visualChecks:0,visualFailures:0,visualDomChanges:0};this.streamingTestAgg=new Map;this.config=qr(e),this.apiConfig=Or(e);}upsertAggContribution(e,r){let n=this.streamingTestAgg.get(e);(!n||r.retryIndex>n.retryIndex)&&this.streamingTestAgg.set(e,r);}async onBegin(e,r){try{this.rootDir=e.rootDir,this.configDir=e.configFile?path.dirname(e.configFile):"";let n=e.updateSnapshots;if(this.updatingSnapshots=n==="all"||n==="changed",this.startedAt=new Date().toISOString(),this.testRunId=this.config.testRunId??crypto.randomUUID(),this.config.reportMode==="auto"){let i=r.allTests().length;this.activeReportMode=i>=this.config.streamingThreshold?"streaming":"embedded";}else this.activeReportMode=this.config.reportMode;let s=r.allTests().length;if(process.stderr.write(`[testrelic] Report mode: ${this.activeReportMode} (${s} tests)
4303
- `),this.activeReportMode==="streaming"){let i=path.dirname(this.config.outputPath);this.streamingWriter=new he(i);let d=()=>{if(this.streamingWriter){try{this.streamingWriter.writeIndex(this.testIndex);let l={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(),cloudUpload:this.cloudReceipt};this.streamingWriter.writeSummary(l);}catch{}this.streamingWriter.dispose();}try{if(this.cloudClient?.isCloudMode()&&this.cloudRunId){let l=this.cloudClient.getAccessToken();l&&rr(this.cloudClient.getEndpoint(),l,this.cloudRunId,this.startedAt);}}catch{}};process.on("SIGTERM",d),process.on("SIGINT",d);}if(this.config.includeArtifacts){let i=path.dirname(this.config.outputPath);this.runTimestamp=Sn(path.join(i,"artifacts"));try{Xn(path.join(i,"artifacts"));}catch{}}let a=V();this.detectedOs=ud(),this.detectedSource=cd(a);let o=await Q(async()=>(this.cloudClient=new He(this.config.cloud),await this.cloudClient.initialize(),Es(this.cloudClient,this.config.cloud?.uploadStrategy,this.testRunId,this.startedAt,this.detectedSource)),Qn,"Cloud initialization");if(this.cloudRunId=o??null,o===void 0&&this.cloudClient?.switchToLocalMode("init_error"),this.cloudReceipt=Ls(this.cloudClient,this.config.cloud?.uploadStrategy,this.cloudRunId),this.activeReportMode!=="streaming"){let i=()=>{try{if(this.cloudClient?.isCloudMode()&&this.cloudRunId){let d=this.cloudClient.getAccessToken();d&&rr(this.cloudClient.getEndpoint(),d,this.cloudRunId,this.startedAt);}}catch{}};process.on("SIGTERM",i),process.on("SIGINT",i);}}catch{}}onTestBegin(e,r){try{e.annotations.push({type:gd,description:hd(this.apiConfig)});}catch{}}onTestEnd(e,r){try{let n=r,s=e.outcome(),a;s==="flaky"?a="flaky":s==="skipped"?a="skipped":a=gr(n.status);let o=n.startTime.toISOString(),i=new Date(n.startTime.getTime()+n.duration).toISOString(),d=e.tags?[...e.tags]:e.annotations.filter(I=>I.type==="tag").map(I=>I.description??""),l=Ms(n.attachments,e.annotations,e.title,a==="skipped");(l.navigations.length>0||l.networkRequestsCount>0||l.apiCallsCount>0)&&(this.fixtureDataReceived=!0),l.navigations.length>0&&(this.navigationsCaptured=!0),!this.config.captureNavigation&&l.navigations.length>0&&(l={...l,navigations:[]});let c=null;if(a==="failed"||a==="flaky"){let M=(a==="flaky"?e.results.find(N=>N.status!=="passed")?.errors??[]:n.errors)[0];if(M){let N=Ur(this.config.redactPatterns),j=M.location?.file??null,E=l.apiAssertions.find(ca=>ca.status==="failed")?.location??null,re=E!==null&&(j===null||path.resolve(j)!==path.resolve(e.location.file)),Sr=re?E.file:j,Ze=re?E.line:M.location?.line??null,fe=null;this.config.includeCodeSnippets&&Ze!==null&&Sr&&(fe=Hr(Sr,Ze,this.config.codeContextLines),fe&&(fe=N(fe))),c={message:N(se(M.message??"Unknown error")),line:Ze,code:fe,stack:this.config.includeStackTrace&&M.stack?N(se(M.stack)):null};}}let u=e.titlePath().filter(Boolean),h=path.relative(this.rootDir||".",e.location.file).replace(/\\/g,"/"),f=ad(u),p=u.join(" > "),m=h,g=sd(m,f,p),v=fd(d,m,e),y=v!=="mobile"&&l.apiCallsCount>0?"api":v,b=s==="flaky",k=id(e.results),R=gr(e.expectedStatus),P=gr(n.status),S=null;if(this.config.includeArtifacts&&a!=="skipped"&&n.attachments){let I=path.dirname(this.config.outputPath),M=u[u.length-1]??e.title;S=Rn(n.attachments,M,n.retry,I,this.runTimestamp||void 0,g);}let w=null;if(this.config.includeArtifacts&&a!=="skipped"&&n.attachments)try{let I=Un(n.attachments,{updatingSnapshots:this.updatingSnapshots,failureMessage:n.errors.map(M=>M.message??"").join(`
4304
- `)});if(I.length>0){let M=path.dirname(this.config.outputPath),N=u[u.length-1]??e.title;w=An(I,N,n.retry,M,this.runTimestamp||void 0,g,this.configDir||this.rootDir||process.cwd());}}catch{}let A=this.config.includeActionSteps&&n.steps?as(n.steps,n.startTime):null,x=pd(e),C={titlePath:u,title:p,status:a,duration:n.duration,startedAt:o,completedAt:i,retryCount:e.results.length-1,retry:n.retry,tags:d,failure:c,specFile:h,navigations:l.navigations,testId:g,filePath:m,suiteName:f,testType:y,isFlaky:b,retryStatus:k,expectedStatus:R,actualStatus:P,artifacts:S,visual:w,apiAssertions:l.apiAssertions,actions:A,networkRequestsFile:l.networkRequestsFile,networkRequestsCount:l.networkRequestsCount,consoleLogsFile:l.consoleLogsFile,consoleLogsCount:l.consoleLogsCount,apiCallsFile:l.apiCallsFile,apiCallsCount:l.apiCallsCount,apiStatusMix:l.apiStatusMix,browser:x,os:this.detectedOs||void 0,source:this.detectedSource||void 0},_=l.consoleLogsFile&&l.consoleLogsCount>0?Y(l.consoleLogsFile):void 0,L=l.networkRequestsFile&&l.networkRequestsCount>0?Y(l.networkRequestsFile):void 0,z=l.apiCallsFile&&l.apiCallsCount>0?Y(l.apiCallsFile):void 0,ce=z?Zt(z):void 0,ue=!L&&z?Qt(z):void 0,pe=l.apiAssertions&&l.apiAssertions.length>0?er(l.apiAssertions):void 0;this.cloudTestsBuffer.push({testId:g,title:p,status:a,duration:n.duration,suiteName:f,filePath:m,testType:y,isFlaky:b,startedAt:o,completedAt:i,tags:d,failure:c,retry:n.retry,retryCount:e.results.length-1,retryStatus:k,browser:x,os:this.detectedOs||void 0,source:this.detectedSource||void 0,...A&&A.length>0?{actions:A}:{},...l.navigations&&l.navigations.length>0?{navigations:l.navigations}:{},..._?{consoleLogs:_}:{},...L?{networkRequests:L}:ue?{networkRequests:ue}:{},...ce?{apiCalls:ce}:{},...pe?{protocolAssertions:pe}:{},...w&&w.length>0?{visual:w}:{}});try{let I=this.config.cloud?.uploadStrategy;if(this.cloudClient?.isCloudMode()&&this.cloudRunId&&(I==="realtime"||I==="both")){let M=this.cloudClient.getAccessToken();M&&bs(this.cloudClient.getEndpoint(),M,this.cloudRunId,this.buildCloudTestPayload(C));}}catch{}if(this.activeReportMode==="streaming"&&this.streamingWriter){let I=Qe(m,u,e.id??"",n.retry),M=n.retry===e.results.length-1,N={id:I,navigations:l.navigations,apiAssertions:l.apiAssertions,actions:A??[],artifacts:S,visual:w,failureDiagnostic:c,hasNetworkFile:l.networkRequestsFile!==null,networkRequestsCount:l.networkRequestsCount,hasConsoleFile:l.consoleLogsFile!==null,consoleLogsCount:l.consoleLogsCount,hasApiCallsFile:l.apiCallsFile!==null,apiCallsCount:l.apiCallsCount,startedAt:o};this.streamingWriter.writeTestDetail(I,N,{networkRequestsFile:l.networkRequestsFile,consoleLogsFile:l.consoleLogsFile,apiCallsFile:l.apiCallsFile});let j={id:I,title:u[u.length-1]??e.title,titlePath:u,filePath:m,status:a,duration:n.duration,project:u[1]??"",retryIndex:n.retry,tags:d,hasNetworkData:l.networkRequestsCount>0,hasConsoleData:l.consoleLogsCount>0,hasArtifacts:S!==null,hasActionSteps:(A?.length??0)>0,visualCount:w?.length??0,visualFailedCount:w?.filter(E=>E.status==="failed").length??0,domChangeCount:w?.reduce((E,re)=>E+(re.domChangeCount??0),0)??0,...(()=>{let E=w?.find(re=>re.diff);return E?.diff?{visualDiffPath:E.diff}:{}})(),errorMessage:nd(c?.message),networkCount:l.networkRequestsCount,consoleCount:l.consoleLogsCount,actionCount:A?.length??0,testType:y,apiCallCount:l.apiCallsCount,...l.apiStatusMix?{apiStatusMix:l.apiStatusMix}:{},assertionsPassed:$e(l.apiAssertions,"passed"),assertionsFailed:$e(l.apiAssertions,"failed"),...(()=>{let E=Bs(l.apiAssertions);return E?{firstFailedAssertion:E}:{}})(),isRetry:!M,retryGroupKey:et(m,u,e.id??"")};if(this.testIndex.push(j),M)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.upsertAggContribution(`${m}::${u.join(" > ")}`,qs(n.retry,z,l.apiAssertions,l.navigations,l.networkRequestsCount,l.consoleLogsCount,A)),(S||w)&&this.pendingArtifactEntries.push({testId:g,artifacts:S??{},visual:w,outputDir:path.dirname(this.config.outputPath)}),C.actions=null,C.apiAssertions=null,C.navigations=[],C.artifacts=null,C.failure=null,C.networkRequestsFile=null,C.consoleLogsFile=null,C.apiCallsFile=null;}this.activeReportMode!=="streaming"&&this.collectedTests.push(C),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(d=>d.status!=="skipped"):this.collectedTests.some(d=>d.status!=="skipped");!this.fixtureDataReceived&&o&&process.stderr.write(`
4303
+ `),this.activeReportMode==="streaming"){let i=path.dirname(this.config.outputPath);this.streamingWriter=new he(i);let d=()=>{if(this.streamingWriter){try{this.streamingWriter.writeIndex(this.testIndex);let l={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(),cloudUpload:this.cloudReceipt};this.streamingWriter.writeSummary(l);}catch{}this.streamingWriter.dispose();}try{if(this.cloudClient?.isCloudMode()&&this.cloudRunId){let l=this.cloudClient.getAccessToken();l&&rr(this.cloudClient.getEndpoint(),l,this.cloudRunId,this.startedAt);}}catch{}};process.on("SIGTERM",d),process.on("SIGINT",d);}if(this.config.includeArtifacts){let i=path.dirname(this.config.outputPath);this.runTimestamp=Sn(path.join(i,"artifacts"));try{Xn(path.join(i,"artifacts"));}catch{}}let a=V();this.detectedOs=ud(),this.detectedSource=cd(a);let o=await Q(async()=>(this.cloudClient=new He(this.config.cloud),await this.cloudClient.initialize(),Es(this.cloudClient,this.config.cloud?.uploadStrategy,this.testRunId,this.startedAt,this.detectedSource)),Qn,"Cloud initialization");if(this.cloudRunId=o??null,o===void 0&&this.cloudClient?.switchToLocalMode("init_error"),this.cloudReceipt=Ls(this.cloudClient,this.config.cloud?.uploadStrategy,this.cloudRunId),this.activeReportMode!=="streaming"){let i=()=>{try{if(this.cloudClient?.isCloudMode()&&this.cloudRunId){let d=this.cloudClient.getAccessToken();d&&rr(this.cloudClient.getEndpoint(),d,this.cloudRunId,this.startedAt);}}catch{}};process.on("SIGTERM",i),process.on("SIGINT",i);}}catch{}}onTestBegin(e,r){try{e.annotations.push({type:gd,description:hd(this.apiConfig)});}catch{}}onTestEnd(e,r){try{let n=r,s=e.outcome(),a;s==="flaky"?a="flaky":s==="skipped"?a="skipped":a=gr(n.status);let o=n.startTime.toISOString(),i=new Date(n.startTime.getTime()+n.duration).toISOString(),d=e.tags?[...e.tags]:e.annotations.filter(I=>I.type==="tag").map(I=>I.description??""),l=Ms(n.attachments,e.annotations,e.title,a==="skipped");(l.navigations.length>0||l.networkRequestsCount>0||l.apiCallsCount>0)&&(this.fixtureDataReceived=!0),l.navigations.length>0&&(this.navigationsCaptured=!0),!this.config.captureNavigation&&l.navigations.length>0&&(l={...l,navigations:[]});let c=null;if(a==="failed"||a==="flaky"){let M=(a==="flaky"?e.results.find(N=>N.status!=="passed")?.errors??[]:n.errors)[0];if(M){let N=Ur(this.config.redactPatterns),j=M.location?.file??null,E=l.apiAssertions.find(ca=>ca.status==="failed")?.location??null,re=E!==null&&(j===null||path.resolve(j)!==path.resolve(e.location.file)),Sr=re?E.file:j,Ze=re?E.line:M.location?.line??null,fe=null;this.config.includeCodeSnippets&&Ze!==null&&Sr&&(fe=Hr(Sr,Ze,this.config.codeContextLines),fe&&(fe=N(fe))),c={message:N(se(M.message??"Unknown error")),line:Ze,code:fe,stack:this.config.includeStackTrace&&M.stack?N(se(M.stack)):null};}}let u=e.titlePath().filter(Boolean),h=path.relative(this.rootDir||".",e.location.file).replace(/\\/g,"/"),f=ad(u),p=u.join(" > "),m=h,g=sd(m,f,p),v=fd(d,m,e),y=v!=="mobile"&&l.apiCallsCount>0?"api":v,b=s==="flaky",k=id(e.results),T=gr(e.expectedStatus),P=gr(n.status),S=null;if(this.config.includeArtifacts&&a!=="skipped"&&n.attachments){let I=path.dirname(this.config.outputPath),M=u[u.length-1]??e.title;S=Rn(n.attachments,M,n.retry,I,this.runTimestamp||void 0,g);}let w=null;if(this.config.includeArtifacts&&a!=="skipped"&&n.attachments)try{let I=Un(n.attachments,{updatingSnapshots:this.updatingSnapshots,failureMessage:n.errors.map(M=>M.message??"").join(`
4304
+ `)});if(I.length>0){let M=path.dirname(this.config.outputPath),N=u[u.length-1]??e.title;w=An(I,N,n.retry,M,this.runTimestamp||void 0,g,this.configDir||this.rootDir||process.cwd());}}catch{}let A=this.config.includeActionSteps&&n.steps?as(n.steps,n.startTime):null,x=pd(e),C={titlePath:u,title:p,status:a,duration:n.duration,startedAt:o,completedAt:i,retryCount:e.results.length-1,retry:n.retry,tags:d,failure:c,specFile:h,navigations:l.navigations,testId:g,filePath:m,suiteName:f,testType:y,isFlaky:b,retryStatus:k,expectedStatus:T,actualStatus:P,artifacts:S,visual:w,apiAssertions:l.apiAssertions,actions:A,networkRequestsFile:l.networkRequestsFile,networkRequestsCount:l.networkRequestsCount,consoleLogsFile:l.consoleLogsFile,consoleLogsCount:l.consoleLogsCount,apiCallsFile:l.apiCallsFile,apiCallsCount:l.apiCallsCount,apiStatusMix:l.apiStatusMix,browser:x,os:this.detectedOs||void 0,source:this.detectedSource||void 0},_=l.consoleLogsFile&&l.consoleLogsCount>0?Y(l.consoleLogsFile):void 0,L=l.networkRequestsFile&&l.networkRequestsCount>0?Y(l.networkRequestsFile):void 0,z=l.apiCallsFile&&l.apiCallsCount>0?Y(l.apiCallsFile):void 0,ce=z?Zt(z):void 0,ue=!L&&z?Qt(z):void 0,pe=l.apiAssertions&&l.apiAssertions.length>0?er(l.apiAssertions):void 0;this.cloudTestsBuffer.push({testId:g,title:p,status:a,duration:n.duration,suiteName:f,filePath:m,testType:y,isFlaky:b,startedAt:o,completedAt:i,tags:d,failure:c,retry:n.retry,retryCount:e.results.length-1,retryStatus:k,browser:x,os:this.detectedOs||void 0,source:this.detectedSource||void 0,...A&&A.length>0?{actions:A}:{},...l.navigations&&l.navigations.length>0?{navigations:l.navigations}:{},..._?{consoleLogs:_}:{},...L?{networkRequests:L}:ue?{networkRequests:ue}:{},...ce?{apiCalls:ce}:{},...pe?{protocolAssertions:pe}:{},...w&&w.length>0?{visual:w}:{}});try{let I=this.config.cloud?.uploadStrategy;if(this.cloudClient?.isCloudMode()&&this.cloudRunId&&(I==="realtime"||I==="both")){let M=this.cloudClient.getAccessToken();M&&bs(this.cloudClient.getEndpoint(),M,this.cloudRunId,this.buildCloudTestPayload(C));}}catch{}if(this.activeReportMode==="streaming"&&this.streamingWriter){let I=Qe(m,u,e.id??"",n.retry),M=n.retry===e.results.length-1,N={id:I,navigations:l.navigations,apiAssertions:l.apiAssertions,actions:A??[],artifacts:S,visual:w,failureDiagnostic:c,hasNetworkFile:l.networkRequestsFile!==null,networkRequestsCount:l.networkRequestsCount,hasConsoleFile:l.consoleLogsFile!==null,consoleLogsCount:l.consoleLogsCount,hasApiCallsFile:l.apiCallsFile!==null,apiCallsCount:l.apiCallsCount,startedAt:o};this.streamingWriter.writeTestDetail(I,N,{networkRequestsFile:l.networkRequestsFile,consoleLogsFile:l.consoleLogsFile,apiCallsFile:l.apiCallsFile});let j={id:I,title:u[u.length-1]??e.title,titlePath:u,filePath:m,status:a,...T!=="passed"?{expectedStatus:T}:{},duration:n.duration,project:u[1]??"",retryIndex:n.retry,tags:d,hasNetworkData:l.networkRequestsCount>0,hasConsoleData:l.consoleLogsCount>0,hasArtifacts:S!==null,hasActionSteps:(A?.length??0)>0,visualCount:w?.length??0,visualFailedCount:w?.filter(E=>E.status==="failed").length??0,domChangeCount:w?.reduce((E,re)=>E+(re.domChangeCount??0),0)??0,...(()=>{let E=w?.find(re=>re.diff);return E?.diff?{visualDiffPath:E.diff}:{}})(),errorMessage:nd(c?.message),networkCount:l.networkRequestsCount,consoleCount:l.consoleLogsCount,actionCount:A?.length??0,testType:y,apiCallCount:l.apiCallsCount,...l.apiStatusMix?{apiStatusMix:l.apiStatusMix}:{},assertionsPassed:$e(l.apiAssertions,"passed"),assertionsFailed:$e(l.apiAssertions,"failed"),...(()=>{let E=Bs(l.apiAssertions);return E?{firstFailedAssertion:E}:{}})(),isRetry:!M,retryGroupKey:et(m,u,e.id??"")};if(this.testIndex.push(j),M)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.upsertAggContribution(`${m}::${u.join(" > ")}`,qs(n.retry,z,l.apiAssertions,l.navigations,l.networkRequestsCount,l.consoleLogsCount,A)),(S||w)&&this.pendingArtifactEntries.push({testId:g,artifacts:S??{},visual:w,outputDir:path.dirname(this.config.outputPath)}),C.actions=null,C.apiAssertions=null,C.navigations=[],C.artifacts=null,C.failure=null,C.networkRequestsFile=null,C.consoleLogsFile=null,C.apiCallsFile=null;}this.activeReportMode!=="streaming"&&this.collectedTests.push(C),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(d=>d.status!=="skipped"):this.collectedTests.some(d=>d.status!=="skipped");!this.fixtureDataReceived&&o&&process.stderr.write(`
4305
4305
  \u26A0 TestRelic: No fixture data received from any test.
4306
4306
  To enable network logs, video sync, and Test Navigation tracking, import the TestRelic fixture:
4307
4307
  import { test, expect } from '@testrelic/playwright-analytics/fixture';
@@ -4317,12 +4317,12 @@ ${s}
4317
4317
  `),this.streamingWriter.getWriteErrors().length>0&&process.stderr.write(`[testrelic] WARNING: ${this.streamingWriter.getWriteErrors().length} write error(s) during streaming
4318
4318
  `);let m=this.streamingWriter;try{if(this.cloudClient){let g=this.buildStreamingReport(h,u,e,r),v=this.collectArtifactEntries(),y=this.cloudTestsBuffer.slice();this.cloudTestsBuffer.length=0;let b=await ur(this.cloudClient,this.config.cloud,this.config.cloud?.uploadStrategy,this.testRunId,this.cloudRunId,g,e,r,u,v,y);this.cloudReceipt=pr(this.cloudReceipt,b,this.testRunId);let k={...h,cloudUpload:this.cloudReceipt};try{m.writeSummary(k);}catch{}}}finally{m.dispose();}this.testIndex.length=0,this.collectedTests.length=0,this.pendingArtifactEntries.length=0,this.cloudTestsBuffer.length=0,this.streamingWriter=null,this.cloudClient=null;}buildStreamingReport(e,r,n,s){return {schemaVersion:Ce,testRunId:this.testRunId,startedAt:this.startedAt,completedAt:n,totalDuration:s,summary:r,ci:V(),metadata:this.config.metadata,timeline:[],shardRunIds:null}}printsToStdio(){return false}checkMemoryPressure(){try{let e=process.memoryUsage(),r=e.heapUsed/1024/1024;if(r<200)return;let n=e.heapUsed/e.heapTotal;n>.9&&this.activeReportMode==="embedded"?(process.stderr.write(`[testrelic] WARNING: High memory (${Math.round(r)} MB). Auto-switching to streaming mode.
4319
4319
  `),this.switchToStreamingMode()):n>.8&&r>=500&&!this.memoryPressureWarned&&(this.memoryPressureWarned=!0,process.stderr.write(`[testrelic] WARNING: Memory pressure detected (${Math.round(r)} MB used).
4320
- `));}catch{}}switchToStreamingMode(){try{if(this.activeReportMode==="streaming")return;this.activeReportMode="streaming";let e=path.dirname(this.config.outputPath);this.streamingWriter=new he(e);for(let r of this.collectedTests){let n=Qe(r.filePath,r.titlePath,r.testId,r.retry),s=r.apiCallsFile&&r.apiCallsCount>0?Y(r.apiCallsFile):void 0,a={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,a,{networkRequestsFile:r.networkRequestsFile,consoleLogsFile:r.consoleLogsFile,apiCallsFile:r.apiCallsFile});let o={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(`
4320
+ `));}catch{}}switchToStreamingMode(){try{if(this.activeReportMode==="streaming")return;this.activeReportMode="streaming";let e=path.dirname(this.config.outputPath);this.streamingWriter=new he(e);for(let r of this.collectedTests){let n=Qe(r.filePath,r.titlePath,r.testId,r.retry),s=r.apiCallsFile&&r.apiCallsCount>0?Y(r.apiCallsFile):void 0,a={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,a,{networkRequestsFile:r.networkRequestsFile,consoleLogsFile:r.consoleLogsFile,apiCallsFile:r.apiCallsFile});let o={id:n,title:r.titlePath[r.titlePath.length-1]??r.title,titlePath:r.titlePath,filePath:r.filePath,status:r.status,...r.expectedStatus!=="passed"?{expectedStatus:r.expectedStatus}:{},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(`
4321
4321
  `)[0]??null,networkCount:r.networkRequestsCount,consoleCount:r.consoleLogsCount,actionCount:r.actions?.length??0,testType:r.testType,apiCallCount:r.apiCallsCount,...r.apiStatusMix?{apiStatusMix:r.apiStatusMix}:s?{apiStatusMix:od(s)}:{},assertionsPassed:$e(r.apiAssertions,"passed"),assertionsFailed:$e(r.apiAssertions,"failed"),...(()=>{let i=Bs(r.apiAssertions);return i?{firstFailedAssertion:i}:{}})(),isRetry:!1,retryGroupKey:et(r.filePath,r.titlePath,r.testId)};switch(this.testIndex.push(o),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.upsertAggContribution(`${r.filePath}::${r.titlePath.join(" > ")}`,qs(r.retry,s,r.apiAssertions??[],r.navigations??[],r.networkRequestsCount,r.consoleLogsCount,r.actions??null));}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 ns(e,{navigationTypes:this.config.navigationTypes})}readJsonlFile(e){if(!e)return null;let r=Y(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,visual:e.visual,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,visual:e.visual??[],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=er(e.apiAssertions)),e.consoleLogsFile&&(r.consoleLogs=Y(e.consoleLogsFile)),e.networkRequestsFile&&(r.networkRequests=Y(e.networkRequestsFile)),e.apiCallsFile){let n=Y(e.apiCallsFile);r.apiCalls=Zt(n),(!r.networkRequests||r.networkRequests.length===0)&&(r.networkRequests=Qt(n));}return r}writeReport(e){try{let r=JSON.stringify(e),n=this.config.outputPath,s=path.dirname(n);fs$1.mkdirSync(s,{recursive:!0});let a=n+".tmp";fs$1.writeFileSync(a,r,"utf-8"),fs$1.renameSync(a,n);}catch(r){process.stderr.write(`[testrelic] Failed to write report: ${r instanceof Error?r.message:String(r)}
4322
- `);}}};var xd=["text/","application/json","application/xml","application/javascript","application/x-www-form-urlencoded","application/graphql"];function wd(t){let e=t.toLowerCase();return xd.some(r=>e.includes(r))}var Ke=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 H("network")),this.consoleWriter=new H("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(){let e=t.asPatchable(this.page);e.goto=this.origGoto,e.goBack=this.origGoBack,e.goForward=this.origGoForward,e.reload=this.origReload;for(let{event:r,handler:n}of this.listeners)this.page.off(r,n);this.listeners=[],this.records=[],this.pendingRequests.clear(),this.pendingBodyReads=[],this.networkWriter?.close(),this.consoleWriter?.close();}getRecords(){return this.assembleNetworkStats(),this.records}static asPatchable(e){return e}interceptMethods(){let e=this.page,r=t.asPatchable(e);r.goto=async(n,s)=>(this.recordNavigation(n,"goto"),this.origGoto(n,s)),r.goBack=async n=>{let s=await this.origGoBack(n);return this.recordNavigation(e.url(),"back"),s},r.goForward=async n=>{let s=await this.origGoForward(n);return this.recordNavigation(e.url(),"forward"),s},r.reload=async n=>(this.recordNavigation(e.url(),"refresh"),this.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 d=JSON.parse(i.slice(16));d.type&&d.url&&this.recordNavigation(d.url,d.type);}catch{}return}{let d=null;try{let c=a.location();c&&c.url&&(d=`${c.url}:${c.lineNumber}:${c.columnNumber}`);}catch{}let l=t.mapConsoleType(o);this.consoleWriter&&(this.consoleWriter.append({level:l,text:i,timestamp:new Date().toISOString(),location:d}),this.consoleLogCount++);}}catch{}};if(this.page.on("console",n),this.listeners.push({event:"console",handler:n}),this.includeNetworkStats){let s=i=>{let d=this.records.length-1,l=this.counterForNav(d);l&&l.totalRequests++;try{let c=i,u=String(this.requestIdCounter++),h=c.postData()??null,f={url:c.url(),method:c.method(),resourceType:this.mapResourceType(c.resourceType()),headers:c.headers(),postData:h,postDataTruncated:!1,startedAt:new Date().toISOString(),startTimeMs:Date.now(),navIndex:d};this.pendingRequests.set(u,f),i.__testrelic_id=u;}catch{}};this.page.on("request",s),this.listeners.push({event:"request",handler:s});let a=i=>{try{let d=i,l=d.request().__testrelic_id,c=l?this.pendingRequests.get(l):void 0,u=this.counterForNav(c?c.navIndex:this.records.length-1);if(u){let y=d.status();y>=400&&(u.failedRequests++,u.failedRequestUrls.push(y+" "+d.url()));let b=d.headers()["content-length"];b&&(u.totalBytes+=parseInt(b,10)||0);let k=d.request().resourceType(),R=this.mapResourceType(k);u.byType[R]++;}if(!l||!c)return;this.pendingRequests.delete(l);let h=Date.now()-c.startTimeMs,f=d.headers(),p=f["content-type"]??null,m=parseInt(f["content-length"]??"0",10)||0,g=p?!wd(p):!1,v=(async()=>{let y=null;if(!g)try{y=(await d.body()).toString("utf-8");}catch{}let b={url:c.url,method:c.method,resourceType:c.resourceType,statusCode:d.status(),responseTimeMs:h,startedAt:c.startedAt,requestHeaders:c.headers,requestBody:c.postData,responseBody:y,responseHeaders:f,contentType:p,responseSize:m,requestBodyTruncated:c.postDataTruncated,responseBodyTruncated:!1,isBinary:g,error:null};this.networkWriter&&(this.networkWriter.append(b),this.networkRequestCount++);})();this.pendingBodyReads.push(v);}catch{}};this.page.on("response",a),this.listeners.push({event:"response",handler:a});let o=i=>{let d=i.__testrelic_id,l=d?this.pendingRequests.get(d):void 0,c=this.counterForNav(l?l.navIndex:this.records.length-1);if(c){c.failedRequests++;try{let u=i;c.failedRequestUrls.push("ERR "+u.url());}catch{}}try{let u=i;if(!d||!l)return;this.pendingRequests.delete(d);let h={url:l.url,method:l.method,resourceType:l.resourceType,statusCode:0,responseTimeMs:Date.now()-l.startTimeMs,startedAt:l.startedAt,requestHeaders:l.headers,requestBody:l.postData,responseBody:null,responseHeaders:null,contentType:null,responseSize:0,requestBodyTruncated:l.postDataTruncated,responseBodyTruncated:!1,isBinary:!1,error:u.failure()?.errorText??"Unknown error"};this.networkWriter&&(this.networkWriter.append(h),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 vr=Symbol.for("__testrelic_call_id"),Cd="__testrelic_api_assertions",te=new WeakMap,oe=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:Cd,description:JSON.stringify(this.assertions)});}dispose(){this.assertions=[],this.currentCallId=null;}},js=new Map;function Sd(t){let e=js.get(t);if(e)return e;try{let r=t.startsWith("file://")?url.fileURLToPath(t):t,s=fs$1.readFileSync(r,"utf-8").split(`
4322
+ `);}}};var xd=["text/","application/json","application/xml","application/javascript","application/x-www-form-urlencoded","application/graphql"];function wd(t){let e=t.toLowerCase();return xd.some(r=>e.includes(r))}var Ke=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 H("network")),this.consoleWriter=new H("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(){let e=t.asPatchable(this.page);e.goto=this.origGoto,e.goBack=this.origGoBack,e.goForward=this.origGoForward,e.reload=this.origReload;for(let{event:r,handler:n}of this.listeners)this.page.off(r,n);this.listeners=[],this.records=[],this.pendingRequests.clear(),this.pendingBodyReads=[],this.networkWriter?.close(),this.consoleWriter?.close();}getRecords(){return this.assembleNetworkStats(),this.records}static asPatchable(e){return e}interceptMethods(){let e=this.page,r=t.asPatchable(e);r.goto=async(n,s)=>(this.recordNavigation(n,"goto"),this.origGoto(n,s)),r.goBack=async n=>{let s=await this.origGoBack(n);return this.recordNavigation(e.url(),"back"),s},r.goForward=async n=>{let s=await this.origGoForward(n);return this.recordNavigation(e.url(),"forward"),s},r.reload=async n=>(this.recordNavigation(e.url(),"refresh"),this.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 d=JSON.parse(i.slice(16));d.type&&d.url&&this.recordNavigation(d.url,d.type);}catch{}return}{let d=null;try{let c=a.location();c&&c.url&&(d=`${c.url}:${c.lineNumber}:${c.columnNumber}`);}catch{}let l=t.mapConsoleType(o);this.consoleWriter&&(this.consoleWriter.append({level:l,text:i,timestamp:new Date().toISOString(),location:d}),this.consoleLogCount++);}}catch{}};if(this.page.on("console",n),this.listeners.push({event:"console",handler:n}),this.includeNetworkStats){let s=i=>{let d=this.records.length-1,l=this.counterForNav(d);l&&l.totalRequests++;try{let c=i,u=String(this.requestIdCounter++),h=c.postData()??null,f={url:c.url(),method:c.method(),resourceType:this.mapResourceType(c.resourceType()),headers:c.headers(),postData:h,postDataTruncated:!1,startedAt:new Date().toISOString(),startTimeMs:Date.now(),navIndex:d};this.pendingRequests.set(u,f),i.__testrelic_id=u;}catch{}};this.page.on("request",s),this.listeners.push({event:"request",handler:s});let a=i=>{try{let d=i,l=d.request().__testrelic_id,c=l?this.pendingRequests.get(l):void 0,u=this.counterForNav(c?c.navIndex:this.records.length-1);if(u){let y=d.status();y>=400&&(u.failedRequests++,u.failedRequestUrls.push(y+" "+d.url()));let b=d.headers()["content-length"];b&&(u.totalBytes+=parseInt(b,10)||0);let k=d.request().resourceType(),T=this.mapResourceType(k);u.byType[T]++;}if(!l||!c)return;this.pendingRequests.delete(l);let h=Date.now()-c.startTimeMs,f=d.headers(),p=f["content-type"]??null,m=parseInt(f["content-length"]??"0",10)||0,g=p?!wd(p):!1,v=(async()=>{let y=null;if(!g)try{y=(await d.body()).toString("utf-8");}catch{}let b={url:c.url,method:c.method,resourceType:c.resourceType,statusCode:d.status(),responseTimeMs:h,startedAt:c.startedAt,requestHeaders:c.headers,requestBody:c.postData,responseBody:y,responseHeaders:f,contentType:p,responseSize:m,requestBodyTruncated:c.postDataTruncated,responseBodyTruncated:!1,isBinary:g,error:null};this.networkWriter&&(this.networkWriter.append(b),this.networkRequestCount++);})();this.pendingBodyReads.push(v);}catch{}};this.page.on("response",a),this.listeners.push({event:"response",handler:a});let o=i=>{let d=i.__testrelic_id,l=d?this.pendingRequests.get(d):void 0,c=this.counterForNav(l?l.navIndex:this.records.length-1);if(c){c.failedRequests++;try{let u=i;c.failedRequestUrls.push("ERR "+u.url());}catch{}}try{let u=i;if(!d||!l)return;this.pendingRequests.delete(d);let h={url:l.url,method:l.method,resourceType:l.resourceType,statusCode:0,responseTimeMs:Date.now()-l.startTimeMs,startedAt:l.startedAt,requestHeaders:l.headers,requestBody:l.postData,responseBody:null,responseHeaders:null,contentType:null,responseSize:0,requestBodyTruncated:l.postDataTruncated,responseBodyTruncated:!1,isBinary:!1,error:u.failure()?.errorText??"Unknown error"};this.networkWriter&&(this.networkWriter.append(h),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 vr=Symbol.for("__testrelic_call_id"),Cd="__testrelic_api_assertions",te=new WeakMap,oe=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:Cd,description:JSON.stringify(this.assertions)});}dispose(){this.assertions=[],this.currentCallId=null;}},js=new Map;function Sd(t){let e=js.get(t);if(e)return e;try{let r=t.startsWith("file://")?url.fileURLToPath(t):t,s=fs$1.readFileSync(r,"utf-8").split(`
4323
4323
  `);return js.set(t,s),s}catch{return null}}var Vs=(()=>{let t=new Error().stack;if(!t)return null;for(let e of t.split(`
4324
4324
  `)){let r=e.match(/at\s+(?:.*?\s+\()?(.+?):\d+:\d+\)?$/);if(!r||r[1].startsWith("node:"))continue;let n=Math.max(r[1].lastIndexOf("/"),r[1].lastIndexOf("\\"));return n>0?r[1].slice(0,n+1):null}return null})();function Td(t){if(!t.startsWith("file:"))return t;try{return url.fileURLToPath(t)}catch{return t}}function Rd(){let e=new Error().stack;if(!e)return null;let r=e.split(`
4325
4325
  `);return $s(r,true)??$s(r,false)}function $s(t,e){for(let r of t){if(e&&Vs!==null&&r.includes(Vs)||r.includes("node_modules")||r.includes("node:internal")||r.includes(" at new Error")||r.includes(" at captureAssertionLocation")||r.includes(" at findFrame")||r.includes(" at expectWrapper")||r.includes(" at wrappedMatcher"))continue;let n=r.match(/at\s+(?:.*?\s+\()?(.+?):(\d+):(\d+)\)?$/);if(n)return {file:Td(n[1]),line:parseInt(n[2],10),column:parseInt(n[3],10)}}return null}function Ad(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 _d(t,e,r){let n=function(i,...d){let l=t(),c=e();if(!l||!c)return r(i,...d);let u=null;if(i!=null&&typeof i=="object"){let m=i[vr];typeof m=="string"&&(u=m);}if(!u&&i!==null&&i!==void 0&&typeof i=="object"&&(u=te.get(i)??null),u||(u=c.getCallIdForValue(i)),u||(u=l.getCurrentCallId()),!u)return r(i,...d);let h=Rd(),f;if(h){let m=Sd(h.file);m&&h.line>0&&h.line<=m.length&&(f=m[h.line-1].trim());}let p=r(i,...d);return u?Js(p,{tracker:l,callId:u,received:i,location:h??{file:"unknown",line:0},expression:f}):p},s=r,a=n;for(let o of Object.keys(s))a[o]=s[o];return n}var Ws=Symbol.for("testrelic.activeAssertionContext");function mr(){let t=globalThis,e=t[Ws];return e||(e={tracker:null,apiTracker:null},t[Ws]=e),e}function le(t,e){let r=mr();r.tracker=t,r.apiTracker=e;}function Je(t){return _d(()=>mr().tracker,()=>mr().apiTracker,t)}function Js(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"?Js(a,e):function(...i){let d=i[0],l="passed",c=e.received,u=null;try{let h=a.apply(this??r,i);return h&&typeof h=="object"&&typeof h.then=="function"?h.then(()=>{hr(e,n,d,c,"passed");},f=>{throw hr(e,n,d,c,"failed"),f}):h}catch(h){if(l="failed",u=h,h instanceof Error&&h.message){let f=h.message.match(/Received:\s*(.+)/);f&&(c=f[1]);}throw h}finally{(u!==null||l==="passed")&&hr(e,n,d,c,l);}}}})}function hr(t,e,r,n,s){let a=Ad(t.expression,t.received),o={callId:t.callId,type:a,expected:Gs(r),actual:Gs(n),status:s,location:t.location,expression:t.expression};t.tracker.recordAssertion(o);}function Gs(t){if(t==null)return t;if(typeof t=="string")return se(t);if(typeof t=="number"||typeof t=="boolean")return t;try{return JSON.stringify(t),t}catch{return String(t)}}var Ys="[REDACTED]";function br(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.prototype.hasOwnProperty.call(t,s)&&(n[s]=r.has(s.toLowerCase())?Ys:t[s]);return n}function Ye(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.map(a=>a.toLowerCase())),s=yr(r,n);return JSON.stringify(s)}function yr(t,e){if(Array.isArray(t))return t.map(r=>yr(r,e));if(typeof t=="object"&&t!==null){let r={};for(let n of Object.keys(t)){if(!Object.prototype.hasOwnProperty.call(t,n))continue;let s=t[n];e.has(n.toLowerCase())?r[n]=Ys:r[n]=yr(s,e);}return r}return t}var Id=new Set(["access_token","api_key","token","sig"]);function xr(t){if(!t)return t;let e;try{e=new URL(t);}catch{return t}let r=false;for(let n of [...e.searchParams.keys()])Id.has(n.toLowerCase())&&(e.searchParams.delete(n),r=true);return r?e.toString():t}function Zs(t,e,r){if(r.length>0){for(let n of r)if(Xs(t,n))return false}if(e.length>0){for(let n of e)if(Xs(t,n))return true;return false}return true}function Xs(t,e){try{return e instanceof RegExp?e.test(t):Md(e).test(t)}catch{return process.stderr.write(`[testrelic] Invalid URL filter pattern: ${String(e)}
4326
- `),false}}function Md(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 Pd=["get","post","put","patch","delete","head","fetch"],Ed=["text/","application/json","application/xml","application/javascript","application/x-www-form-urlencoded","application/graphql"];function Ld(t){let e=t.toLowerCase();return Ed.some(r=>e.includes(r))}function Nd(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 Qs(t){return t?"\u2022\u2022\u2022\u2022":""}function Dd(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:Qs(i)});}return r}function Fd(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(),d=a[0].slice(o+1).trim(),l=a.slice(1).map(c=>c.trim()).filter(Boolean).join(" \xB7 ")||void 0;i&&e.push({name:i,value:Qs(d),attributes:l});}return e}var Xe=class Xe{constructor(e,r,n){this.originals=new Map;this.apiCallWriter=null;this.statusMix={"2xx":0,"3xx":0,"4xx":0,"5xx":0,error:0};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??Xe.DEFAULT_API_CONFIG;try{this.apiCallWriter=new H("api-calls");}catch{}}get lastCallId(){return this._lastCallId}getCallIdForValue(e){return e!=null&&typeof e=="object"?te.get(e)??null:this.primitiveCallIds.get(e)??null}intercept(){for(let r of Pd){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));}tallyStatus(e){if(e===null||e<=0){this.statusMix.error++;return}if(e>=500){this.statusMix["5xx"]++;return}if(e>=400){this.statusMix["4xx"]++;return}if(e>=300){this.statusMix["3xx"]++;return}if(e>=200){this.statusMix["2xx"]++;return}this.statusMix.error++;}getFileData(){return this.apiCallWriter?.close(),{apiCallsFile:this.apiCallWriter?.getCount()?this.apiCallWriter.getPath():null,apiCallsCount:this.apiCallWriter?.getCount()??0,apiStatusMix:{...this.statusMix}}}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{primitiveCallIds:n}=this,s=e.headers.bind(e);e.headers=function(){let f=s();return te.set(f,r),f};let a=e.headersArray.bind(e);e.headersArray=function(){let f=a();return te.set(f,r),f};let o=e.json.bind(e);e.json=async function(){let f=await o();return f!=null&&typeof f=="object"&&te.set(f,r),f};let i=e.status.bind(e);e.status=function(){let f=i();return n.set(f,r),f};let d=e.statusText.bind(e);e.statusText=function(){let f=d();return n.set(f,r),f};let l=e.ok.bind(e);e.ok=function(){let f=l();return n.set(f,r),f};let c=e.text.bind(e);e.text=async function(){let f=await c();return n.set(f,r),f};let u=e.body.bind(e);e.body=async function(){let f=await u();return te.set(f,r),f};}createWrapper(e,r){return async(n,s)=>{if(!Zs(n,this.apiConfig.apiIncludeUrls,this.apiConfig.apiExcludeUrls))return r(n,s);let a=`api-call-${this.callCounter++}`,o=new Date().toISOString(),i=e==="fetch"?(s?.method??"GET").toUpperCase():e.toUpperCase(),d=Nd(s),l=perf_hooks.performance.now();this._lastCallId=a,this.assertionTracker&&this.assertionTracker.setCurrentCallId(a);let c;try{c=await r(n,s);}catch(u){let h=perf_hooks.performance.now();try{let f=this.apiConfig.captureRequestBody?Ye(d,this.apiConfig.redactBodyFields):null,p={id:a,timestamp:o,method:i,url:xr(n),requestHeaders:null,requestBody:f,responseStatusCode:null,responseStatusText:null,responseHeaders:null,responseBody:null,responseTimeMs:Math.round((h-l)*100)/100,isBinary:!1,error:u instanceof Error?u.message:String(u)};this.apiCallWriter&&(this.apiCallWriter.append(p),this.apiCallCount++,this.tallyStatus(null));}catch{}throw u}try{let u=perf_hooks.performance.now(),h=c.headers(),f=h["content-type"]??null,p=f?!Ld(f):!1,m=null;this.apiConfig.captureRequestHeaders&&s?.headers&&(m=s.headers);let g=null;this.apiConfig.captureResponseHeaders&&(g=h);let v=this.apiConfig.captureRequestBody?d:null,y=null;if(this.apiConfig.captureResponseBody)try{p?y=(await c.body()).toString("base64"):y=await c.text();}catch{}let b=[],k=[];try{if(this.apiConfig.captureRequestHeaders&&(b=Dd(s?.headers)),this.apiConfig.captureResponseHeaders){let P=c.headersArray().filter(S=>S.name.toLowerCase()==="set-cookie").map(S=>S.value);k=Fd(P);}}catch{}m=br(m,this.apiConfig.redactHeaders),g=br(g,this.apiConfig.redactHeaders),v=Ye(v,this.apiConfig.redactBodyFields),y=Ye(y,this.apiConfig.redactBodyFields);let R={id:a,timestamp:o,method:i,url:xr(c.url()),requestHeaders:m,requestBody:v,responseStatusCode:c.status(),responseStatusText:c.statusText(),responseHeaders:g,responseBody:y,requestCookies:b.length?b:null,responseCookies:k.length?k:null,responseTimeMs:Math.round((u-l)*100)/100,isBinary:p,error:null};this.apiCallWriter&&(this.apiCallWriter.append(R),this.apiCallCount++,this.tallyStatus(R.responseStatusCode));}catch{}try{c[vr]=a,this.tagResponseMethods(c,a);}catch{}return c}}};Xe.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 de=Xe;var Hd=[".png",".jpg",".jpeg"],Ud=/A snapshot doesn't exist at /;function zd(t){return t.wrote?t.existedBefore?"updated":"new":t.pass?"passed":"failed"}function jd(t){return t.status==="failed"&&!t.hadBaseline}function ea(t){if(!t)return null;try{let e=fs$1.statSync(t);return {size:e.size,mtimeMs:e.mtimeMs}}catch{return null}}function Vd(t,e){if(!Le(t))return null;try{return t.snapshotPath(e,{kind:"screenshot"})}catch{return null}}function $d(t){let e=t.toLowerCase();return Hd.some(r=>e.endsWith(r))?t:`${t}.png`}function Wd(){try{return test.test.info()}catch{return null}}function Gd(t,e,r){let n=a=>/^(.+)-(expected|actual|diff|previous)\.[A-Za-z0-9]+$/.exec(a)?.[1]??null,s=t.slice(e);if(r){for(let a of s)if(a.path===r&&/-expected\.[A-Za-z0-9]+$/.test(a.name))return n(a.name)}for(let a of s){let o=n(a.name);if(o)return o}return null}function Kd(t,e){return e?path.basename(e,path.extname(e)||".png"):t.replace(/\.[A-Za-z0-9]+$/,"")}async function Jd(t,e){if(e===null)return Ne("Attaching the baseline of a passing comparison"),null;try{let r=path.extname(e)||".png",n=path.basename(e,r);return await t.attach(`${n}-expected${r}`,{path:e}),n}catch{return null}}async function Yd(t,e){try{await t.attach(Ot,{body:Buffer.from(JSON.stringify([e])),contentType:"application/json"});}catch{}}async function kr(t,e,r={}){let n={...r};delete n.tags;let s=$d(e),a=Wd(),o=a?.attachments.length??0,i=a?.errors?.length??0,d=a?Vd(a,s):null,l=ea(d),c=true,u="";try{await test.expect(t).toHaveScreenshot(s,n);}catch(h){c=false,u=h instanceof Error?h.message:String(h);}if(a){let h=ea(d),f=d!==null?h!==null&&(l===null||l.size!==h.size||l.mtimeMs!==h.mtimeMs):(a.errors??[]).slice(i).some(v=>Ud.test(v.message??"")),p=zd({pass:c,wrote:f,existedBefore:l!==null}),g=(p==="passed"||p==="updated"?await Jd(a,d):Gd(a.attachments,o,d))??(jd({status:p,hadBaseline:l!==null})?Kd(s,d):null);g&&await Yd(a,{stem:g,name:e,status:p,...d?{committedPath:d}:{}});}return {pass:c,name:"toMatchVisualBaseline",message:()=>c?`Expected "${e}" to differ from its visual baseline, but it matched.`:u}}test.expect.extend({toMatchVisualBaseline:kr});function Qd(){try{return test.test.info()}catch{return null}}On(Je(test.expect),Qd);var ec="__testrelic_api_config",tc="__testrelic_config_trackApiCalls";function Cr(t){let e=t.annotations.find(n=>n.type===ec&&n.description!==void 0);if(e)try{return JSON.parse(e.description,rc)}catch{}let r=t.annotations.find(n=>n.type===tc&&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 rc(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 oa={page:async({page:t},e,r)=>{let n=new Ke(t);try{await n.init();}catch{}await e(t);try{let{navigations:s,networkRequestsFile:a,networkRequestsCount:o,consoleLogsFile:i,consoleLogsCount:d}=await n.getFileData(),l={testRelicData:!0,version:core.PAYLOAD_VERSION,navigations:s,apiAssertions:[],networkRequestsFile:a,networkRequestsCount:o,consoleLogsFile:i,consoleLogsCount:d,apiCallsFile:null,apiCallsCount:0};await r.attach(core.ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(l)),contentType:core.ATTACHMENT_CONTENT_TYPE});}catch{}n.dispose();},request:async({request:t},e,r)=>{let n=Cr(r);if(!n.trackApiCalls){await e(t);return}let s=new oe,a=new de(t,s,n);a.intercept(),le(s,a);try{await e(t);}finally{le(null,null);}try{let{apiCallsFile:o,apiCallsCount:i,apiStatusMix:d}=a.getFileData(),l=n.captureAssertions?s.getData():[],c={testRelicData:!0,version:core.PAYLOAD_VERSION,navigations:[],apiAssertions:l,networkRequestsFile:null,networkRequestsCount:0,consoleLogsFile:null,consoleLogsCount:0,apiCallsFile:o,apiCallsCount:i,apiStatusMix:d};await r.attach(core.ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(c)),contentType:core.ATTACHMENT_CONTENT_TYPE});}catch{}a.dispose(),s.dispose();}};test.test.extend(oa);Je(test.expect);var oc={request:async({request:t},e,r)=>{let n=Cr(r);if(!n.trackApiCalls){await e(t);return}let s=new oe,a=new de(t,s,n);a.intercept(),le(s,a);let o=null;try{o=new H("api-console");}catch{}let i=0,d=process.stdout.write,l=process.stderr.write;process.stdout.write=function(c,...u){try{let h=typeof c=="string"?c:Buffer.isBuffer(c)?c.toString("utf-8"):String(c);!h.startsWith("[testrelic]")&&!h.startsWith("\u2139 TestRelic")&&!h.startsWith("\u2713 TestRelic")&&!h.startsWith("\u26A0 TestRelic")&&o&&(o.append({level:"stdout",text:h.replace(/\n$/,""),timestamp:new Date().toISOString(),location:null}),i++);}catch{}return d.apply(process.stdout,[c,...u])},process.stderr.write=function(c,...u){try{let h=typeof c=="string"?c:Buffer.isBuffer(c)?c.toString("utf-8"):String(c);!h.startsWith("[testrelic]")&&!h.startsWith("\u26A0 TestRelic")&&o&&(o.append({level:"stderr",text:h.replace(/\n$/,""),timestamp:new Date().toISOString(),location:null}),i++);}catch{}return l.apply(process.stderr,[c,...u])};try{await e(t);}finally{process.stdout.write=d,process.stderr.write=l,le(null,null);}try{o?.close();let{apiCallsFile:c,apiCallsCount:u,apiStatusMix:h}=a.getFileData(),f=n.captureAssertions?s.getData():[],p={testRelicData:!0,version:core.PAYLOAD_VERSION,navigations:[],apiAssertions:f,networkRequestsFile:null,networkRequestsCount:0,consoleLogsFile:i>0?o?.getPath()??null:null,consoleLogsCount:i,apiCallsFile:c,apiCallsCount:u,apiStatusMix:h};await r.attach(core.ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(p)),contentType:core.ATTACHMENT_CONTENT_TYPE});}catch{}a.dispose(),s.dispose();}};var la="@testrelic/playwright-analytics";function dc(t){return Array.isArray(t)?t.some(e=>Array.isArray(e)&&typeof e[0]=="string"&&e[0]===la):false}function cc(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=dc(s)?s:[...s,[la,e??{}]];return test.defineConfig({...t,use:n,reporter:a})}var da=false;function _g(t,e,r="manual_record"){if(!t||!t.annotations){da||(da=true,process.stderr.write(`[testrelic] recordNavigation: reporter not active, navigation not recorded
4326
+ `),false}}function Md(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 Pd=["get","post","put","patch","delete","head","fetch"],Ed=["text/","application/json","application/xml","application/javascript","application/x-www-form-urlencoded","application/graphql"];function Ld(t){let e=t.toLowerCase();return Ed.some(r=>e.includes(r))}function Nd(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 Qs(t){return t?"\u2022\u2022\u2022\u2022":""}function Dd(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:Qs(i)});}return r}function Fd(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(),d=a[0].slice(o+1).trim(),l=a.slice(1).map(c=>c.trim()).filter(Boolean).join(" \xB7 ")||void 0;i&&e.push({name:i,value:Qs(d),attributes:l});}return e}var Xe=class Xe{constructor(e,r,n){this.originals=new Map;this.apiCallWriter=null;this.statusMix={"2xx":0,"3xx":0,"4xx":0,"5xx":0,error:0};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??Xe.DEFAULT_API_CONFIG;try{this.apiCallWriter=new H("api-calls");}catch{}}get lastCallId(){return this._lastCallId}getCallIdForValue(e){return e!=null&&typeof e=="object"?te.get(e)??null:this.primitiveCallIds.get(e)??null}intercept(){for(let r of Pd){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));}tallyStatus(e){if(e===null||e<=0){this.statusMix.error++;return}if(e>=500){this.statusMix["5xx"]++;return}if(e>=400){this.statusMix["4xx"]++;return}if(e>=300){this.statusMix["3xx"]++;return}if(e>=200){this.statusMix["2xx"]++;return}this.statusMix.error++;}getFileData(){return this.apiCallWriter?.close(),{apiCallsFile:this.apiCallWriter?.getCount()?this.apiCallWriter.getPath():null,apiCallsCount:this.apiCallWriter?.getCount()??0,apiStatusMix:{...this.statusMix}}}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{primitiveCallIds:n}=this,s=e.headers.bind(e);e.headers=function(){let f=s();return te.set(f,r),f};let a=e.headersArray.bind(e);e.headersArray=function(){let f=a();return te.set(f,r),f};let o=e.json.bind(e);e.json=async function(){let f=await o();return f!=null&&typeof f=="object"&&te.set(f,r),f};let i=e.status.bind(e);e.status=function(){let f=i();return n.set(f,r),f};let d=e.statusText.bind(e);e.statusText=function(){let f=d();return n.set(f,r),f};let l=e.ok.bind(e);e.ok=function(){let f=l();return n.set(f,r),f};let c=e.text.bind(e);e.text=async function(){let f=await c();return n.set(f,r),f};let u=e.body.bind(e);e.body=async function(){let f=await u();return te.set(f,r),f};}createWrapper(e,r){return async(n,s)=>{if(!Zs(n,this.apiConfig.apiIncludeUrls,this.apiConfig.apiExcludeUrls))return r(n,s);let a=`api-call-${this.callCounter++}`,o=new Date().toISOString(),i=e==="fetch"?(s?.method??"GET").toUpperCase():e.toUpperCase(),d=Nd(s),l=perf_hooks.performance.now();this._lastCallId=a,this.assertionTracker&&this.assertionTracker.setCurrentCallId(a);let c;try{c=await r(n,s);}catch(u){let h=perf_hooks.performance.now();try{let f=this.apiConfig.captureRequestBody?Ye(d,this.apiConfig.redactBodyFields):null,p={id:a,timestamp:o,method:i,url:xr(n),requestHeaders:null,requestBody:f,responseStatusCode:null,responseStatusText:null,responseHeaders:null,responseBody:null,responseTimeMs:Math.round((h-l)*100)/100,isBinary:!1,error:u instanceof Error?u.message:String(u)};this.apiCallWriter&&(this.apiCallWriter.append(p),this.apiCallCount++,this.tallyStatus(null));}catch{}throw u}try{let u=perf_hooks.performance.now(),h=c.headers(),f=h["content-type"]??null,p=f?!Ld(f):!1,m=null;this.apiConfig.captureRequestHeaders&&s?.headers&&(m=s.headers);let g=null;this.apiConfig.captureResponseHeaders&&(g=h);let v=this.apiConfig.captureRequestBody?d:null,y=null;if(this.apiConfig.captureResponseBody)try{p?y=(await c.body()).toString("base64"):y=await c.text();}catch{}let b=[],k=[];try{if(this.apiConfig.captureRequestHeaders&&(b=Dd(s?.headers)),this.apiConfig.captureResponseHeaders){let P=c.headersArray().filter(S=>S.name.toLowerCase()==="set-cookie").map(S=>S.value);k=Fd(P);}}catch{}m=br(m,this.apiConfig.redactHeaders),g=br(g,this.apiConfig.redactHeaders),v=Ye(v,this.apiConfig.redactBodyFields),y=Ye(y,this.apiConfig.redactBodyFields);let T={id:a,timestamp:o,method:i,url:xr(c.url()),requestHeaders:m,requestBody:v,responseStatusCode:c.status(),responseStatusText:c.statusText(),responseHeaders:g,responseBody:y,requestCookies:b.length?b:null,responseCookies:k.length?k:null,responseTimeMs:Math.round((u-l)*100)/100,isBinary:p,error:null};this.apiCallWriter&&(this.apiCallWriter.append(T),this.apiCallCount++,this.tallyStatus(T.responseStatusCode));}catch{}try{c[vr]=a,this.tagResponseMethods(c,a);}catch{}return c}}};Xe.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 de=Xe;var Hd=[".png",".jpg",".jpeg"],Ud=/A snapshot doesn't exist at /;function zd(t){return t.wrote?t.existedBefore?"updated":"new":t.pass?"passed":"failed"}function jd(t){return t.status==="failed"&&!t.hadBaseline}function ea(t){if(!t)return null;try{let e=fs$1.statSync(t);return {size:e.size,mtimeMs:e.mtimeMs}}catch{return null}}function Vd(t,e){if(!Le(t))return null;try{return t.snapshotPath(e,{kind:"screenshot"})}catch{return null}}function $d(t){let e=t.toLowerCase();return Hd.some(r=>e.endsWith(r))?t:`${t}.png`}function Wd(){try{return test.test.info()}catch{return null}}function Gd(t,e,r){let n=a=>/^(.+)-(expected|actual|diff|previous)\.[A-Za-z0-9]+$/.exec(a)?.[1]??null,s=t.slice(e);if(r){for(let a of s)if(a.path===r&&/-expected\.[A-Za-z0-9]+$/.test(a.name))return n(a.name)}for(let a of s){let o=n(a.name);if(o)return o}return null}function Kd(t,e){return e?path.basename(e,path.extname(e)||".png"):t.replace(/\.[A-Za-z0-9]+$/,"")}async function Jd(t,e){if(e===null)return Ne("Attaching the baseline of a passing comparison"),null;try{let r=path.extname(e)||".png",n=path.basename(e,r);return await t.attach(`${n}-expected${r}`,{path:e}),n}catch{return null}}async function Yd(t,e){try{await t.attach(Ot,{body:Buffer.from(JSON.stringify([e])),contentType:"application/json"});}catch{}}async function kr(t,e,r={}){let n={...r};delete n.tags;let s=$d(e),a=Wd(),o=a?.attachments.length??0,i=a?.errors?.length??0,d=a?Vd(a,s):null,l=ea(d),c=true,u="";try{await test.expect(t).toHaveScreenshot(s,n);}catch(h){c=false,u=h instanceof Error?h.message:String(h);}if(a){let h=ea(d),f=d!==null?h!==null&&(l===null||l.size!==h.size||l.mtimeMs!==h.mtimeMs):(a.errors??[]).slice(i).some(v=>Ud.test(v.message??"")),p=zd({pass:c,wrote:f,existedBefore:l!==null}),g=(p==="passed"||p==="updated"?await Jd(a,d):Gd(a.attachments,o,d))??(jd({status:p,hadBaseline:l!==null})?Kd(s,d):null);g&&await Yd(a,{stem:g,name:e,status:p,...d?{committedPath:d}:{}});}return {pass:c,name:"toMatchVisualBaseline",message:()=>c?`Expected "${e}" to differ from its visual baseline, but it matched.`:u}}test.expect.extend({toMatchVisualBaseline:kr});function Qd(){try{return test.test.info()}catch{return null}}On(Je(test.expect),Qd);var ec="__testrelic_api_config",tc="__testrelic_config_trackApiCalls";function Cr(t){let e=t.annotations.find(n=>n.type===ec&&n.description!==void 0);if(e)try{return JSON.parse(e.description,rc)}catch{}let r=t.annotations.find(n=>n.type===tc&&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 rc(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 oa={page:async({page:t},e,r)=>{let n=new Ke(t);try{await n.init();}catch{}await e(t);try{let{navigations:s,networkRequestsFile:a,networkRequestsCount:o,consoleLogsFile:i,consoleLogsCount:d}=await n.getFileData(),l={testRelicData:!0,version:core.PAYLOAD_VERSION,navigations:s,apiAssertions:[],networkRequestsFile:a,networkRequestsCount:o,consoleLogsFile:i,consoleLogsCount:d,apiCallsFile:null,apiCallsCount:0};await r.attach(core.ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(l)),contentType:core.ATTACHMENT_CONTENT_TYPE});}catch{}n.dispose();},request:async({request:t},e,r)=>{let n=Cr(r);if(!n.trackApiCalls){await e(t);return}let s=new oe,a=new de(t,s,n);a.intercept(),le(s,a);try{await e(t);}finally{le(null,null);}try{let{apiCallsFile:o,apiCallsCount:i,apiStatusMix:d}=a.getFileData(),l=n.captureAssertions?s.getData():[],c={testRelicData:!0,version:core.PAYLOAD_VERSION,navigations:[],apiAssertions:l,networkRequestsFile:null,networkRequestsCount:0,consoleLogsFile:null,consoleLogsCount:0,apiCallsFile:o,apiCallsCount:i,apiStatusMix:d};await r.attach(core.ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(c)),contentType:core.ATTACHMENT_CONTENT_TYPE});}catch{}a.dispose(),s.dispose();}};test.test.extend(oa);Je(test.expect);var oc={request:async({request:t},e,r)=>{let n=Cr(r);if(!n.trackApiCalls){await e(t);return}let s=new oe,a=new de(t,s,n);a.intercept(),le(s,a);let o=null;try{o=new H("api-console");}catch{}let i=0,d=process.stdout.write,l=process.stderr.write;process.stdout.write=function(c,...u){try{let h=typeof c=="string"?c:Buffer.isBuffer(c)?c.toString("utf-8"):String(c);!h.startsWith("[testrelic]")&&!h.startsWith("\u2139 TestRelic")&&!h.startsWith("\u2713 TestRelic")&&!h.startsWith("\u26A0 TestRelic")&&o&&(o.append({level:"stdout",text:h.replace(/\n$/,""),timestamp:new Date().toISOString(),location:null}),i++);}catch{}return d.apply(process.stdout,[c,...u])},process.stderr.write=function(c,...u){try{let h=typeof c=="string"?c:Buffer.isBuffer(c)?c.toString("utf-8"):String(c);!h.startsWith("[testrelic]")&&!h.startsWith("\u26A0 TestRelic")&&o&&(o.append({level:"stderr",text:h.replace(/\n$/,""),timestamp:new Date().toISOString(),location:null}),i++);}catch{}return l.apply(process.stderr,[c,...u])};try{await e(t);}finally{process.stdout.write=d,process.stderr.write=l,le(null,null);}try{o?.close();let{apiCallsFile:c,apiCallsCount:u,apiStatusMix:h}=a.getFileData(),f=n.captureAssertions?s.getData():[],p={testRelicData:!0,version:core.PAYLOAD_VERSION,navigations:[],apiAssertions:f,networkRequestsFile:null,networkRequestsCount:0,consoleLogsFile:i>0?o?.getPath()??null:null,consoleLogsCount:i,apiCallsFile:c,apiCallsCount:u,apiStatusMix:h};await r.attach(core.ATTACHMENT_NAME,{body:Buffer.from(JSON.stringify(p)),contentType:core.ATTACHMENT_CONTENT_TYPE});}catch{}a.dispose(),s.dispose();}};var la="@testrelic/playwright-analytics";function dc(t){return Array.isArray(t)?t.some(e=>Array.isArray(e)&&typeof e[0]=="string"&&e[0]===la):false}function cc(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=dc(s)?s:[...s,[la,e??{}]];return test.defineConfig({...t,use:n,reporter:a})}var da=false;function _g(t,e,r="manual_record"){if(!t||!t.annotations){da||(da=true,process.stderr.write(`[testrelic] recordNavigation: reporter not active, navigation not recorded
4327
4327
  `));return}let n={url:e,navigationType:r,timestamp:new Date().toISOString()};t.annotations.push({type:"lambdatest-navigation",description:JSON.stringify(n)});}Object.defineProperty(exports,"ATTACHMENT_CONTENT_TYPE",{enumerable:true,get:function(){return core.ATTACHMENT_CONTENT_TYPE}});Object.defineProperty(exports,"ATTACHMENT_NAME",{enumerable:true,get:function(){return core.ATTACHMENT_NAME}});Object.defineProperty(exports,"PAYLOAD_VERSION",{enumerable:true,get:function(){return core.PAYLOAD_VERSION}});Object.defineProperty(exports,"isTestRelicDataPayload",{enumerable:true,get:function(){return core.isTestRelicDataPayload}});exports.SCHEMA_VERSION=Ce;exports.default=Ge;exports.defineConfig=cc;exports.recordNavigation=_g;exports.testRelicApiFixture=oc;exports.testRelicFixture=oa;//# sourceMappingURL=index.cjs.map
4328
4328
  //# sourceMappingURL=index.cjs.map