UNPKG

@currents/playwright

Version:

Playwright integration and reporter for [Currents](https://currents.dev/playwright) - a cloud dashboard for debugging, troubleshooting and analysing parallel CI tests supporting Cypress and Playwright.

37 lines (34 loc) 40.8 kB
"use strict";var tn=Object.create;var k=Object.defineProperty;var rn=Object.getOwnPropertyDescriptor;var nn=Object.getOwnPropertyNames;var on=Object.getPrototypeOf,sn=Object.prototype.hasOwnProperty;var u=(e,t)=>()=>(e&&(t=e(e=0)),t);var ce=(e,t)=>{for(var r in t)k(e,r,{get:t[r],enumerable:!0})},Ye=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of nn(t))!sn.call(e,s)&&s!==r&&k(e,s,{get:()=>t[s],enumerable:!(o=rn(t,s))||o.enumerable});return e};var l=(e,t,r)=>(r=e!=null?tn(on(e)):{},Ye(t||!e||!e.__esModule?k(r,"default",{value:e,enumerable:!0}):r,e)),an=e=>Ye(k({},"__esModule",{value:!0}),e);var n=u(()=>{"use strict"});var ze,qe=u(()=>{ze={name:"@currents/playwright",version:"1.14.1",main:"./dist/index.js",author:{name:"Currents Software Inc",email:"hello@currents.dev",url:"https://currents.dev"},license:"MIT",homepage:"https://currents.dev",repository:{type:"git",url:"https://github.com/currents-dev/currents-playwright-changelog.git"},scripts:{test:"vitest",rm:"rimraf dist",lint:'TIMING=1 eslint "**/*.ts*"',build:"tsup-node --minify --dts",dev:"tsup-node --watch --dts",release:"release-it --verbose","publish:npm":"npm run rm && npm run build && ./publish.js","release-ci":"npm run rm && npm run build && ./publish.js -t latest"},bin:{pwc:"./dist/bin/pwc.js","pwc-p":"./dist/bin/pwc-p.js"},devDependencies:{"@playwright/test":"^1.44.0","@release-it/conventional-changelog":"^7.0.2","@types/async-retry":"^1.4.5","@types/babel__code-frame":"^7.0.3","@types/debug":"^4.1.12","@types/getos":"^3.0.4","@types/json-stringify-safe":"^5.0.3","@types/lodash":"^4.17.15","@types/pluralize":"^0.0.33","@types/proxy-from-env":"^1.0.4","@types/randomstring":"^1.3.0","@types/regexp.escape":"^2.0.0","@types/shelljs":"^0.8.16","@types/stack-utils":"^2.0.3","@types/tmp":"^0.2.6","@types/ws":"^8.18.1",eslint:"^9.23.0","eslint-config-custom":"*",msw:"^2.8.2","release-it":"^19.0.3",rimraf:"^6.0.1",tsconfig:"*",tsup:"^8.5.0",typescript:"^5.8.3",vitest:"^3.2.3",wtfnode:"^0.10.0"},dependencies:{"@babel/code-frame":"^7.27.1","@commander-js/extra-typings":"^12.1.0","@currents/commit-info":"1.0.1-beta.0","async-retry":"^1.3.3",axios:"^1.9.0","axios-retry":"^4.5.0",c12:"^1.11.2",chalk:"^4.1.2",commander:"^12.1.0","date-fns":"^4.1.0",debug:"^4.3.7",dotenv:"^16.5.0",execa:"^9.5.3",getos:"^3.2.1","https-proxy-agent":"^7.0.5","istanbul-lib-coverage":"^3.2.2","json-stringify-safe":"^5.0.1","lil-http-terminator":"^1.2.3",lodash:"^4.17.21",nanoid:"^3.3.8","object-sizeof":"^2.6.5","p-debounce":"^2.1.0","p-map":"^4.0.0","p-queue":"6.6.2",pino:"^9.6.0",pluralize:"^8.0.0","pretty-ms":"^7.0.1","proxy-from-env":"^1.1.0","regexp.escape":"^2.0.1","source-map-support":"^0.5.21","stack-utils":"^2.0.6",tmp:"^0.2.3","tmp-promise":"^3.0.3","ts-pattern":"^5.7.1",ws:"^8.18.2"},files:["dist","!**/*.map","!**/*/*.map","**/*.LEGAL.txt","LICENSE.md","README.md","CHANGELOG.md"],keywords:["playwright","playwright dashboard","cloud dashboard","reporter","currents","tests reporter","sorry cypress","ci"],exports:{".":{import:"./dist/index.js",require:"./dist/index.js"},"./discovery":{import:"./dist/reporters/discovery.js",require:"./dist/reporters/discovery.js"},"./orchestration":{import:"./dist/orchestration/index.js",require:"./dist/orchestration/index.js"},"./package.json":"./package.json"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},"release-it":{npm:{publish:!1},github:{release:!0},plugins:{"@release-it/conventional-changelog":{preset:"angular",header:"# Changelog",ignoreVersion:!0,infile:"../../CHANGELOG.md"}},git:{commitMessage:"chore: release v${version}",tagName:"v${version}"},hooks:{"before:github:release":"npm run --prefix ../../ update-public-changelog"}}}});var H,pe=u(()=>{"use strict";n();qe();H=ze.version});function j(e={}){let t=Qe.default.create(e);return t.interceptors.request.use(r=>{let o={...r},s=t.getUri(r),a=Ze.default.getProxyForUrl(s);return a&&(ln("Using HTTP proxy %s for %s ",a,s),o.proxy=!1,o.httpsAgent=cn(a)),o}),t}function cn(e){return G||(G=new Xe.HttpsProxyAgent(e),G)}var Qe,Xe,Ze,ln,G,de=u(()=>{"use strict";n();Qe=l(require("axios")),Xe=require("https-proxy-agent"),Ze=l(require("proxy-from-env"));_();ln=c.extend("axios");G=null});var me,et,tt=u(()=>{"use strict";n();me=()=>process.env.CURRENTS_API_URL??"https://cy.currents.dev",et=()=>3e4});function rt(e){pn.push(e)}var pn,ge=u(()=>{"use strict";n();pn=[]});var nt,ot,st=u(()=>{"use strict";n();nt=[],ot=[]});var I,$,fe,b,p,C,Ee,dn,v,_e,wo,vo,Mo,Fo,ko,Ho,Go,jo,g,$o,it=u(()=>{"use strict";n();I=l(require("chalk")),$=l(require("util"));_();ge();st();fe=(...e)=>{let t=$.default.format(...e);rt(t),console.log(t)},b=fe,p=(...e)=>{let t=$.default.format(...e);return ot.push(t),c("WARNING: ",t),fe(I.default.bgYellow.black(" WARNING "),t)},C=(...e)=>{let t=$.default.format(...e);return nt.push(t),c("ERROR: ",t),fe(I.default.bgRed.white(" ERROR "),t)},Ee=()=>console.log(` `+dn()+` `),dn=()=>I.default.dim(Array(64).fill("=").join("")),v=(e=2)=>console.log(Array(e).fill("").join(` `)),_e=I.default.cyan,wo=I.default.blueBright,vo=I.default.red,Mo=I.default.yellow,Fo=I.default.green,ko=I.default.gray,Ho=I.default.white,Go=I.default.black,jo=I.default.magenta,g=I.default.dim,$o=I.default.bold});var S=u(()=>{"use strict";n();ge();it()});var at,ut,lt=u(()=>{"use strict";n();at=l(require("events"));_();Re();ut=new at.default});var Ie,pt,ct,dt,mt=u(()=>{"use strict";n();S();lt();Ie={cancellationReason:null},pt=e=>{Ie.cancellationReason||(Ie.cancellationReason=e)},ct=()=>Ie.cancellationReason,dt=({showWarning:e=!0}={})=>{let t=ct();t&&(e&&p("%s",t),ut.emit("runCancelled",t))}});var Re=u(()=>{"use strict";n();mt()});var gt,y,V=u(()=>{"use strict";n();gt=require("nanoid"),y=(0,gt.customAlphabet)("abcdefghijklmnopqrstuvwxyz",10)});var ft,gn,Et,_t=u(()=>{"use strict";n();ft=require("ts-pattern"),gn={outcome:null,scannerConfig:null,currentsConfig:null,internalConfig:null},Et=()=>gn});function Tt(e){(0,R.match)(e).when(It.isAxiosError,fn).otherwise(()=>{p("Unexpected error while sending network request: %s",e)})}function fn(e){return(0,R.match)(e).with({code:"ECONNABORTED"},()=>{p("Network connection aborted")}).with({code:"ECONNREFUSED"},()=>{p("Network connection aborted")}).with({code:"ECONNRESET"},()=>{p("Network connection reset")}).with({code:"ETIMEDOUT"},()=>{p("Network connection timeout")}).with({response:R.P.not(R.P.nullish)},t=>{En(t,{status:t.response.status,data:t.response.data})}).otherwise(t=>{p(`[currents] Unexpected network error: %s %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,payload:e.response?.config.data,requestId:M(e)})})}function En(e,{status:t,data:r}){(0,R.match)(t).with(401,()=>{p(`[currents] ${e.response?.config.method} ${e.response?.config.url}} - 401 Unauthorized Request from cloud service`)}).with(400,()=>{p(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 400 Bad Request from cloud service: %o`,r)}).with(429,()=>{p(`[currents] ${e.response?.config.method} ${e.response?.config.url} - 429 Too Many Requests from cloud service`)}).with(422,()=>{_n(e,r)}).otherwise(()=>{p(`[currents] Unexpected network response: %s %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,requestId:M(e)})})}function _n(e,t){(0,R.match)(t).with({code:Ce.MISSING_SUITE,message:R.P.string,errors:R.P.array(R.P.string)},async r=>{let{message:o,errors:s}=r;v(1),C(...Rt(o,s)),W({id:y(),text:(0,Ct.default)(Et(),null,2)}).then(a=>{C(`Please share this URL with Currents support for further investigation: ${a}`)}).catch(a=>{p("Failed to upload debug artifact: %s",a)}),v(1)}).with({code:Ce.RUN_CANCELLED,message:R.P.string},r=>{pt(r.message),dt()}).with({code:Ce.RUN_EXPIRED,message:R.P.string},r=>{p(r.message)}).with({message:R.P.string,errors:R.P.array(R.P.string)},r=>{let{message:o,errors:s}=r;v(1),p(...Rt(o,s)),v(1)}).otherwise(()=>{p(`[currents] Unexpected network response: %s %O`,e.message,{method:e.response?.config.method,url:e.response?.config.url,status:e.response?.status,requestId:M(e)})})}function Rt(e,t){return ht.default.isString(e)?t?.length===0?[e]:[e,` ${(t??[]).map(r=>` - ${r}`).join(` `)} `]:["Unexpected network error"]}function M(e){return e?.response?.headers["apigw-requestid"]}var It,Ct,ht,R,Ce,he=u(()=>{"use strict";n();It=require("axios"),Ct=l(require("json-stringify-safe")),ht=l(require("lodash")),R=require("ts-pattern");Re();V();S();Te();_t();Ce={RUN_CANCELLED:"RUN_CANCELLED",RUN_EXPIRED:"RUN_EXPIRED",MISSING_SUITE:"MISSING_SUITE"}});function bt(e,t,r){let o=r.method?.toUpperCase(),s=r.url,a=M(t),d=(0,St.default)(Oe(e)),E=`Network request '${o} ${s}' failed: '${t.message}'.${a?` Request ID: ${a}.`:""} Next attempt is in ${d} (${e}/${r["axios-retry"]?.retries||Ue()}).`;Ot(E),p(E)}var Se,St,Ot,Oe,Ut,Ue,Lt=u(()=>{"use strict";n();Se=require("axios"),St=l(require("pretty-ms"));_();S();he();Ot=c.extend("http"),Oe=e=>[3*1e3,15*1e3,30*1e3][e-1],Ut=e=>(Ot("isRetriableError: %o",{message:e.message,code:"code"in e?e.code:void 0,status:"response"in e?e.response?.status:void 0,headers:"response"in e?e.response?.headers:void 0,data:"response"in e?e.response?.data:void 0,isAxiosError:(0,Se.isAxiosError)(e)}),"code"in e&&e.code&&["ECONNABORTED","ECONNREFUSED","ECONNRESET","ETIMEDOUT","ENETRESET","ENOTFOUND","EAI_AGAIN"].includes(e.code)?!0:(0,Se.isAxiosError)(e)?[429,500,502,503,504].includes(e.response?.status??0):!1),Ue=()=>3});function Ft(e){Mt["x-pw-version"]=e??"0.0.0"}function hn(){let e=j({baseURL:me(),timeout:et(),transitional:{clarifyTimeoutError:!0}});return e.interceptors.request.use(async t=>{let{currentsOptions:r}=t,o={...Cn,...r};return o.enableCompression&&(0,Bt.default)(t.data)>o.compressThresholdBytes?(t.headers["Content-Encoding"]="gzip",{...t,data:await In((0,Dt.default)(t.data))}):t}),e.interceptors.request.use(t=>{let r=t["axios-retry"]?.retryCount??0,o=A();t.headers.set({...Mt,"Accept-Encoding":"gzip, deflate, br","x-currents-idempotency-key":t.headers["x-currents-idempotency-key"]??(0,xt.nanoid)(),"x-pwc-request-attempt":r,"x-currents-key":o?.recordKey??null}),o?.orchestrationId&&t.headers.set("x-currents-orchestration-id",o.orchestrationId),o?.machineId&&t.headers.set("x-currents-machine-id",o.machineId),t.headers.get("Content-Type")||t.headers.set("Content-Type","application/json");let s={...Nt.default.pick(t,"method","url","headers"),data:Buffer.isBuffer(t.data)?"buffer":t.data};return r?Pt("network request retry: %o",yt({...s,isRetry:!0})):Pt("network request: %o",yt(s)),t}),(0,At.default)(e,{retries:Ue(),retryCondition:Ut,retryDelay:Oe,shouldResetTimeout:!0,onRetry:bt}),e}function kt(){return K||(K=hn(),K)}function yt(e){return{method:e.method,baseUrl:me(),url:e.url,data:e.isRetry?"<retry>":Tn(e.data),headers:{...e.headers,"x-currents-key":"***"}}}function Tn(e){return e?.results?.raw?{...e,results:{...e.results,raw:"***"}}:e}var At,Dt,Nt,xt,Bt,wt,vt,Pt,Rn,Mt,In,K,Cn,be=u(()=>{"use strict";n();At=l(require("axios-retry")),Dt=l(require("json-stringify-safe")),Nt=l(require("lodash")),xt=require("nanoid"),Bt=l(require("object-sizeof")),wt=require("util"),vt=l(require("zlib"));D();_();pe();de();tt();Lt();Pt=c.extend("http"),Rn=1024*1024*1,Mt={"x-pw-version":"0.0.0","x-pwc-version":H},In=(0,wt.promisify)(vt.default.gzip);K=null,Cn={enableCompression:!1,compressThresholdBytes:Rn}});async function N(e,t=kt){try{let r=await t().request(e);return Ht("network response: %o",{...Gt.default.omit(r,"request","config"),url:r.config.url,method:r.config.method}),r}catch(r){let o=r;throw Ht("network error: %o",{code:o.code,message:o.message,url:o.config?.url,method:o.config?.method,status:o.response?.status,headers:o.response?.headers,data:o.response?.data}),Tt(o),o}}var Gt,Ht,jt=u(()=>{"use strict";n();Gt=l(require("lodash"));_();be();he();Ht=c.extend("http")});var Le=u(()=>{"use strict";n();jt()});var $t={};ce($t,{getDebugUrl:()=>Sn});var Sn,Vt=u(()=>{"use strict";n();Le();Sn=({runId:e,type:t})=>N({method:"POST",url:"runs/debug-logs",data:{type:t,runId:e}}).then(r=>r.data)});function On(e,t){return Yt({path:e,name:null,uploadUrl:t,contentType:"text/plain"},"text/plain",void 0)}async function Yt(e,t,r){let o=await Kt.default.readFile(e.path);return Pe("Uploading file %s",e.uploadUrl,{buffer:Buffer.byteLength(o)}),qt(o,e.uploadUrl,t,r)}async function Un(e,t,r){return Pe("Uploading buffer %s",e.name,{buffer:Buffer.byteLength(e.buffer)}),qt(e.buffer,e.uploadUrl,t,r)}async function bn(e,t,r,o){return j().request({method:"put",url:t,data:e,onUploadProgress:o,headers:{"Content-Disposition":"inline","Content-Type":r}})}async function qt(...e){await(0,Wt.default)(async()=>{await bn(...e)},{retries:5,onRetry:(t,r)=>{if(Pe(`Upload failed %d out of 5 attempts: %s %o`,r,t.message,t.response?.data),r===5){C(`Cannot upload after ${r} times: ${t.message}`);return}p(`Upload failed ${r} out of 5 attempts: ${t.message}`)}})}var Wt,Kt,Pe,Jt,zt=u(()=>{"use strict";n();Wt=l(require("async-retry")),Kt=l(require("fs/promises"));_();de();S();Pe=c.extend("upload"),Jt=(s=>(s.PNG="image/png",s.WEBM="video/webm",s.TEXT="text/plain",s.ZIP="application/zip",s))(Jt||{})});var Qt={};ce(Qt,{ContentType:()=>Jt,sendBuffer:()=>Un,sendPath:()=>Yt,uploadText:()=>On});var Xt=u(()=>{"use strict";n();zt()});async function W(e){let{getDebugUrl:t}=await Promise.resolve().then(()=>(Vt(),$t));try{let{readUrl:r,uploadUrl:o}=await t({runId:e.id,type:"pw-debug"}),{uploadText:s,sendBuffer:a}=await Promise.resolve().then(()=>(Xt(),Qt));return"text"in e&&await a({name:`${e.id}-discovery-debug.log`,buffer:Buffer.from(e.text,"utf-8"),contentType:"text/plain",uploadUrl:o},"text/plain",void 0),"path"in e&&await s(e.path,o),r}catch{return null}}var ye,Ae=u(()=>{"use strict";n();ye=l(require("debug"))});function Ln(e){return e==="false"?!1:e==="remote"?"remote":e==="full"?"full":!!e}var Zt,er,tr=u(()=>{"use strict";n();Zt=require("@commander-js/extra-typings"),er=new Zt.Option("--pwc-debug [boolean | 'remote' | 'full']","enable debug logs for the reporter. Specify 'remote' to upload logs to Currents. Specify 'full' to dump the debug logs to stdout and upload to Currents.").argParser(Ln).env("CURRENTS_DEBUG")});var rr,nr,or=u(()=>{"use strict";n();rr=require("@commander-js/extra-typings");tr();nr=()=>new rr.Command().allowUnknownOption().addOption(er).helpOption(!1)});var L,sr,Ne,ir,ar,De,J,xe=u(()=>{"use strict";n();L=l(require("debug")),sr=l(require("fs")),Ne=l(require("path")),ir=l(require("util")),ar=require("fs/promises");V();S();or();Ae();L.default.useColors=function(){return!1};De=L.default.log,J=class e{constructor(t="core"){this.source=t;this.pipelines={};if(this.mode=nr().parse().opts().pwcDebug??!1,this.debug=(0,L.default)(`currents:remote-debug:${this.source}`),!this.mode)return this;if(!this.shouldEnableDebug())return this;let r=process.env.DEBUG?`${process.env.DEBUG},currents*`:"currents*";if(L.default.enable(r),!this.shouldUploadRemoteDebug())return this;let o=y(),s=Ne.default.resolve(".currents-debug"),a=Ne.default.resolve(s,`${o}.log`);(0,ar.mkdir)(s,{recursive:!0}),b(g(`\u{1F47E} Initiated remote ${this.source} debug log collection:`),g(a));let d=sr.default.createWriteStream(a,{flags:"a"});return L.default.log=(...E)=>{this.mode&&(d.write(`${ir.default.formatWithOptions({colors:!1},...E)} `),this.shouldMuteLocalStdout()||De(...E))},this.pipelines[o]={id:o,writeStream:d,type:this.source,tempFilePath:a},this}static factory(t="core"){return this.instance||(this.instance=new e(t)),this.instance}getDebugMode(){return this.mode}async finalize({runId:t}={runId:void 0}){try{let r=Object.keys(this.pipelines);r.length===0&&(this.debug("No debug pipelines found"),L.default.log=De);for(let o of r)await this.uploadDebug(o,t??y())}catch{}finally{L.default.log=De}}async uploadDebug(t,r){let o=this.pipelines[t];if(!o){this.debug("No debug pipeline found for id %s",t);return}b(g(`\u{1F47E} ${o.type} debug log written:`),g(o?.tempFilePath));try{let s=await W({id:r,path:o.tempFilePath});o?.writeStream.end(),b(g(`\u{1F47E} ${o.type} debug log uploaded:`),g(s))}catch(s){p(`Failed to upload ${o.type}} debug log ${g(o.tempFilePath)}: ${s.message}`)}}shouldEnableDebug(){return this.mode==="full"||this.mode==="remote"||this.mode===!0}shouldUploadRemoteDebug(){return this.mode==="full"||this.mode==="remote"}shouldMuteLocalStdout(){return this.mode==="remote"}}});var Te=u(()=>{"use strict";n();Ae();xe()});var c,_=u(()=>{"use strict";n();Te();c=(0,ye.default)("currents")});var Y,ur=u(()=>{"use strict";n();Y=class extends Error{}});var F,Be=u(()=>{"use strict";n();F={guide:{ciBuildId:"https://docs.currents.dev/guides/ci-build-id",integration:"https://docs.currents.dev/integration-with-playwright/currents-playwright"}}});function cr(e){if(!e)return;if(e==="false")return!1;let t=parseInt(e,10);if(isNaN(t)||t<1)throw new lr.CommanderError(255,"Invalid argument provided.","--pwc-cancel-after-failures must be a positive integer or 'false', provided: "+e);return t}var lr,pr=u(()=>{"use strict";n();lr=require("commander")});function q(e){return h[e]?.env}function z(e){return h[e].cli}function dr(e){return h[e].name}function mr(){return{projectId:process.env[h.projectId.env],recordKey:process.env[h.recordKey.env],ciBuildId:process.env[h.ciBuildId.env],tag:process.env[h.tag.env]?process.env[h.tag.env]?.split(",").map(e=>e.trim()):void 0,cancelAfterFailures:cr(process.env[h.cancelAfterFailures.env]),disableTitleTags:process.env[h.disableTitleTags.env],testSuiteFile:process.env[h.testSuiteFile.env],machineId:process.env[h.machineId.env],orchestrationId:process.env[h.orchestrationId.env]}}var h,we=u(()=>{"use strict";n();pr();h={currentsConfigFile:{name:"Currents Config File Path",env:"CURRENTS_CONFIG_FILE_PATH",cli:"--pwc-config"},ciBuildId:{name:"CI Build ID",env:"CURRENTS_CI_BUILD_ID",cli:"--ci-build-id"},recordKey:{name:"Record Key",env:"CURRENTS_RECORD_KEY",cli:"--key"},projectId:{name:"Project ID",env:"CURRENTS_PROJECT_ID",cli:"--project-id"},tag:{name:"Currents Tag",env:"CURRENTS_TAG",cli:"--tag"},cancelAfterFailures:{name:"Currents Cancel After Failures",env:"CURRENTS_CANCEL_AFTER_FAILURES",cli:"--pwc-cancel-after-failures"},disableTitleTags:{name:"Disable Title Tags",env:"CURRENTS_DISABLE_TITLE_TAGS",cli:"--pwc-disable-title-tags"},testSuiteFile:{name:"Test Suite File",env:"CURRENTS_TEST_SUITE_FILE",cli:"--pwc-test-suite-file"},machineId:{name:"Machine ID",env:"CURRENTS_MACHINE_ID",cli:"--pwc-machine-id"},orchestrationId:{name:"Orchestration ID",env:"CURRENTS_ORCHESTRATION_ID",cli:"--pwc-orchestration-id"},outputFile:{name:"Output File",env:"CURRENTS_OUTPUT_FILE",cli:"--pwc-output-file"},batchSize:{name:"Batch Size",env:"CURRENTS_BATCH_SIZE",cli:"--pwc-batch-size"}}});function x(){if(ve)return ve;if(process.env.CURRENTS_PWC_CLI_CONFIG_PATH)try{let e=JSON.parse(fr.default.readFileSync(process.env.CURRENTS_PWC_CLI_CONFIG_PATH).toString());return gr("Options from serialized CLI config file: %o",e),ve=e,e}catch(e){return gr("Could not read CLI config file: %o",e),{}}return{}}var fr,gr,ve,Me=u(()=>{"use strict";n();fr=l(require("fs"));_();gr=c.extend("cli-options-serializer"),ve=null});function Er(e,t,r={validationFn:Ge}){Fe("reporter options: %o",e),Fe("config file options: %o",t);let o={...T(ke),...T(t),...T(e),...T(x()),...T(mr()),orchestration:{...T(ke.orchestration),...T(t?.orchestration),...T(e?.orchestration),...T(x().orchestration)},coverage:{...T(ke.coverage),...T(t?.coverage),...T(e?.coverage),...T(x().coverage)}};r.validationFn(o),He=o,Fe("resolved currents config: %o",He)}function Ge(e){Pn.forEach(t=>{if(!e[t])throw C(`${dr(t)} is required for Currents Reporter. Use the following methods: - environment variable: ${g(q(t))} - CLI flag: ${g(z(t))} - reporter configuration option ${g(t)} in ${g("playwright.config.ts")} \u{1F4D6} ${F.guide.integration}`),new Y("Missing required config variable")})}function T(e){return Object.entries(e??{}).reduce((t,[r,o])=>o===void 0?t:{...t,[r]:o},{})}function A(){return He}function _r(e){e.preserveOutput!=="always"&&p(`The "preserveOutput" property in your Playwright config is set to ${e.preserveOutput}. This may cause artifacts to be removed before they are uploaded to Currents. We recommend setting it to "always".`)}var Fe,Pn,ke,He,Rr=u(()=>{"use strict";n();_();ur();Be();S();we();Me();Fe=c.extend("config"),Pn=["projectId","recordKey"],ke={removeTitleTags:!1,disableTitleTags:!1,orchestration:{skipReporterInjection:!1},coverage:{projects:!1}},He=null});function je(e){let t=new WeakMap;function r(o){if(typeof o=="object"&&o!==null){if(t.has(o))return"[Circular]";t.set(o,!0)}}return(0,Ir.cloneDeepWith)(e,r)}function Q(e){let r=Object.getOwnPropertySymbols(e).find(s=>s.toString().match(/configInternalSymbol/))??Object.getOwnPropertyNames(e).find(s=>s.match(/_internal/));return r?e[r]:(p("Could not extract internal playwright configuration"),null)}function Cr(e){return e.reduce((t,r)=>(r&&r.id&&r.workers!==void 0&&(t[r.id]=r.workers),t),{})}function hr(e){return e?.fullConfig?.config?.projects?.reduce((t,r)=>(r&&r.name&&r.use&&r.use.currentsBatchSize!==void 0&&(t[r.name]=r.use.currentsBatchSize),t),{})}var Ir,Tr=u(()=>{"use strict";n();Ir=require("lodash");S()});var D=u(()=>{"use strict";n();Rr();we();Me();Tr()});var fo={};ce(fo,{default:()=>go});module.exports=an(fo);n();n();var Zr=require("nanoid");D();n();D();_();S();n();var Sr=require("c12");function Or(e){return(0,Sr.loadConfig)({name:"currents",configFile:e})}n();S();function Ur(e=()=>!1){let t=Date.now(),r=yn();for(;!e();)if(Date.now()-t>r)throw C(`Could not load Currents config after ${r}ms, exiting...`),new Error("Could not load Currents config")}function yn(e=5e3){let t=Number(process.env.CURRENTS_CONFIG_LOAD_TIMEOUT_MS);return isNaN(t)||t<1?e:t}var br=c.extend("config-loader"),X=class{constructor(t,r=a=>{},o=()=>{process.exit(1)},s={validationFn:Ge}){this.reporterOptions=t;this.onSuccess=r;this.onFailure=o;this.options=s;this._configLoaded=!1;this._promise=null}start(){return this._promise=Or(x().pwcConfigPath).then(async t=>{this.onSuccess(t),Er(this.reporterOptions,t.config,{validationFn:this.options.validationFn})}).catch(t=>{C("Could not load currents configuration: %O",t),this.onFailure()}).finally(()=>{this._configLoaded=!0}),this}waitSync(){return br("Waiting to load config..."),Ur(()=>this._configLoaded),this}load(){return this._promise||(br("Starting config loader"),this.start()),this._promise}};_();n();var f=require("lodash");_();V();var Z=c.extend("ci"),An=(e,...t)=>(0,f.chain)(t).compact().join(e).value(),Dn=(e,t)=>(0,f.set)(e,(0,f.camelCase)(t),process.env[t]),m=e=>(0,f.transform)(e,Dn,{}),Nn=()=>process.env.TF_BUILD&&process.env.TF_BUILD_BUILDNUMBER,xn=()=>process.env.TF_BUILD&&process.env.AZURE_HTTP_USER_AGENT,Bn=()=>(0,f.some)(process.env,(e,t)=>/^CODEBUILD_/.test(t)),wn=()=>process.env.bamboo_buildNumber,vn=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&process.env.CODESHIP,Mn=()=>process.env.CI_NAME&&process.env.CI_NAME==="codeship"&&!process.env.CODESHIP,Fn=()=>(0,f.some)(process.env,(e,t)=>/^CONCOURSE_/.test(t)),kn=()=>process.env.GITLAB_CI||process.env.CI_SERVER_NAME&&/^GitLab/.test(process.env.CI_SERVER_NAME),Hn=()=>process.env.GCP_PROJECT||process.env.GCLOUD_PROJECT||process.env.GOOGLE_CLOUD_PROJECT,Gn=()=>process.env.JENKINS_URL||process.env.JENKINS_HOME||process.env.JENKINS_VERSION||process.env.HUDSON_URL||process.env.HUDSON_HOME,jn=()=>process.env.WERCKER||process.env.WERCKER_MAIN_PIPELINE_STARTED,$n={appveyor:"APPVEYOR",azure:xn,awsCodeBuild:Bn,bamboo:wn,bitbucket:"BITBUCKET_BUILD_NUMBER",buildkite:"BUILDKITE",circle:"CIRCLECI",codeshipBasic:vn,codeshipPro:Mn,concourse:Fn,codeFresh:"CF_BUILD_ID",drone:"DRONE",githubActions:"GITHUB_ACTIONS",gitlab:kn,goCD:"GO_JOB_NAME",googleCloud:Hn,jenkins:Gn,semaphore:"SEMAPHORE",shippable:"SHIPPABLE",teamcity:"TEAMCITY_VERSION",teamfoundation:Nn,travis:"TRAVIS",wercker:jn,netlify:"NETLIFY",layerci:"LAYERCI"};function Vn(){let{env:e}=process;return(0,f.findKey)($n,t=>{if((0,f.isString)(t))return e[t];if((0,f.isFunction)(t))return t()})}var Lr=()=>({appveyor:m(["APPVEYOR_JOB_ID","APPVEYOR_ACCOUNT_NAME","APPVEYOR_PROJECT_SLUG","APPVEYOR_BUILD_NUMBER","APPVEYOR_BUILD_VERSION","APPVEYOR_PULL_REQUEST_NUMBER","APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH"]),azure:m(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID","BUILD_REPOSITORY_URI","SYSTEM_TEAMPROJECT","SYSTEM_COLLECTIONURI"]),awsCodeBuild:m(["CODEBUILD_BUILD_ID","CODEBUILD_BUILD_NUMBER","CODEBUILD_RESOLVED_SOURCE_VERSION","CODEBUILD_SOURCE_REPO_URL","CODEBUILD_SOURCE_VERSION"]),bamboo:m(["bamboo_buildNumber","bamboo_buildResultsUrl","bamboo_planRepository_repositoryUrl","bamboo_buildKey"]),bitbucket:m(["BITBUCKET_REPO_SLUG","BITBUCKET_REPO_OWNER","BITBUCKET_BUILD_NUMBER","BITBUCKET_PARALLEL_STEP","BITBUCKET_STEP_RUN_NUMBER","BITBUCKET_PR_ID","BITBUCKET_PR_DESTINATION_BRANCH","BITBUCKET_PR_DESTINATION_COMMIT"]),buildkite:m(["BUILDKITE_REPO","BUILDKITE_SOURCE","BUILDKITE_JOB_ID","BUILDKITE_BUILD_ID","BUILDKITE_BUILD_URL","BUILDKITE_BUILD_NUMBER","BUILDKITE_PULL_REQUEST","BUILDKITE_PULL_REQUEST_REPO","BUILDKITE_PULL_REQUEST_BASE_BRANCH"]),circle:m(["CIRCLE_JOB","CIRCLE_BUILD_NUM","CIRCLE_BUILD_URL","CIRCLE_PR_NUMBER","CIRCLE_PR_REPONAME","CIRCLE_PR_USERNAME","CIRCLE_COMPARE_URL","CIRCLE_WORKFLOW_ID","CIRCLE_PULL_REQUEST","CIRCLE_REPOSITORY_URL","CI_PULL_REQUEST"]),codeshipBasic:m(["CI_BUILD_ID","CI_REPO_NAME","CI_BUILD_URL","CI_PROJECT_ID","CI_BUILD_NUMBER","CI_PULL_REQUEST"]),codeshipPro:m(["CI_BUILD_ID","CI_REPO_NAME","CI_PROJECT_ID"]),concourse:m(["BUILD_ID","BUILD_NAME","BUILD_JOB_NAME","BUILD_PIPELINE_NAME","BUILD_TEAM_NAME","ATC_EXTERNAL_URL"]),codeFresh:m(["CF_BUILD_ID","CF_BUILD_URL","CF_CURRENT_ATTEMPT","CF_STEP_NAME","CF_PIPELINE_NAME","CF_PIPELINE_TRIGGER_ID","CF_PULL_REQUEST_ID","CF_PULL_REQUEST_IS_FORK","CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_TARGET"]),drone:m(["DRONE_JOB_NUMBER","DRONE_BUILD_LINK","DRONE_BUILD_NUMBER","DRONE_PULL_REQUEST"]),githubActions:m(["GITHUB_WORKFLOW","GITHUB_ACTION","GITHUB_EVENT_NAME","GITHUB_RUN_ID","GITHUB_RUN_ATTEMPT","GITHUB_REPOSITORY"]),gitlab:m(["CI_PIPELINE_ID","CI_PIPELINE_URL","CI_BUILD_ID","CI_JOB_ID","CI_JOB_URL","CI_JOB_NAME","GITLAB_HOST","CI_PROJECT_ID","CI_PROJECT_URL","CI_REPOSITORY_URL","CI_ENVIRONMENT_URL","CI_DEFAULT_BRANCH"]),goCD:m(["GO_SERVER_URL","GO_ENVIRONMENT_NAME","GO_PIPELINE_NAME","GO_PIPELINE_COUNTER","GO_PIPELINE_LABEL","GO_STAGE_NAME","GO_STAGE_COUNTER","GO_JOB_NAME","GO_TRIGGER_USER","GO_REVISION","GO_TO_REVISION","GO_FROM_REVISION","GO_MATERIAL_HAS_CHANGED"]),googleCloud:m(["BUILD_ID","PROJECT_ID","REPO_NAME","BRANCH_NAME","TAG_NAME","COMMIT_SHA","SHORT_SHA"]),jenkins:m(["BUILD_ID","BUILD_URL","BUILD_NUMBER","ghprbPullId"]),semaphore:m(["SEMAPHORE_BRANCH_ID","SEMAPHORE_BUILD_NUMBER","SEMAPHORE_CURRENT_JOB","SEMAPHORE_CURRENT_THREAD","SEMAPHORE_EXECUTABLE_UUID","SEMAPHORE_GIT_BRANCH","SEMAPHORE_GIT_DIR","SEMAPHORE_GIT_REF","SEMAPHORE_GIT_REF_TYPE","SEMAPHORE_GIT_REPO_SLUG","SEMAPHORE_GIT_SHA","SEMAPHORE_GIT_URL","SEMAPHORE_JOB_COUNT","SEMAPHORE_JOB_ID","SEMAPHORE_JOB_NAME","SEMAPHORE_JOB_UUID","SEMAPHORE_PIPELINE_ID","SEMAPHORE_PLATFORM","SEMAPHORE_PROJECT_DIR","SEMAPHORE_PROJECT_HASH_ID","SEMAPHORE_PROJECT_ID","SEMAPHORE_PROJECT_NAME","SEMAPHORE_PROJECT_UUID","SEMAPHORE_REPO_SLUG","SEMAPHORE_TRIGGER_SOURCE","SEMAPHORE_WORKFLOW_ID","PULL_REQUEST_NUMBER"]),shippable:m(["SHIPPABLE_BUILD_ID","SHIPPABLE_BUILD_NUMBER","SHIPPABLE_COMMIT_RANGE","SHIPPABLE_CONTAINER_NAME","SHIPPABLE_JOB_ID","SHIPPABLE_JOB_NUMBER","SHIPPABLE_REPO_SLUG","IS_FORK","IS_GIT_TAG","IS_PRERELEASE","IS_RELEASE","REPOSITORY_URL","REPO_FULL_NAME","REPO_NAME","BUILD_URL","BASE_BRANCH","HEAD_BRANCH","IS_PULL_REQUEST","PULL_REQUEST","PULL_REQUEST_BASE_BRANCH","PULL_REQUEST_REPO_FULL_NAME"]),teamcity:null,teamfoundation:m(["BUILD_BUILDID","BUILD_BUILDNUMBER","BUILD_CONTAINERID"]),travis:m(["TRAVIS_JOB_ID","TRAVIS_BUILD_ID","TRAVIS_BUILD_WEB_URL","TRAVIS_REPO_SLUG","TRAVIS_JOB_NUMBER","TRAVIS_EVENT_TYPE","TRAVIS_COMMIT_RANGE","TRAVIS_BUILD_NUMBER","TRAVIS_PULL_REQUEST","TRAVIS_PULL_REQUEST_BRANCH","TRAVIS_PULL_REQUEST_SHA"]),wercker:null,netlify:m(["BUILD_ID","CONTEXT","URL","DEPLOY_URL","DEPLOY_PRIME_URL","DEPLOY_ID"]),layerci:m(["LAYERCI_JOB_ID","LAYERCI_RUNNER_ID","RETRY_INDEX","LAYERCI_PULL_REQUEST","LAYERCI_REPO_NAME","LAYERCI_REPO_OWNER","LAYERCI_BRANCH","GIT_TAG"])}),Wn=()=>{let{env:e}=process;return{appveyor:{sha:e.APPVEYOR_REPO_COMMIT,branch:e.APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH||e.APPVEYOR_REPO_BRANCH,message:An(` `,e.APPVEYOR_REPO_COMMIT_MESSAGE,e.APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED),authorName:e.APPVEYOR_REPO_COMMIT_AUTHOR,authorEmail:e.APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL},awsCodeBuild:{sha:e.CODEBUILD_RESOLVED_SOURCE_VERSION,remoteOrigin:e.CODEBUILD_SOURCE_REPO_URL},azure:{sha:e.BUILD_SOURCEVERSION,branch:e.BUILD_SOURCEBRANCHNAME,message:e.BUILD_SOURCEVERSIONMESSAGE,authorName:e.BUILD_SOURCEVERSIONAUTHOR,authorEmail:e.BUILD_REQUESTEDFOREMAIL},bamboo:{sha:e.bamboo_planRepository_revision,branch:e.bamboo_planRepository_branch,authorName:e.bamboo_planRepository_username,remoteOrigin:e.bamboo_planRepository_repositoryURL},bitbucket:{sha:e.BITBUCKET_COMMIT,branch:e.BITBUCKET_BRANCH},buildkite:{sha:e.BUILDKITE_COMMIT,branch:e.BUILDKITE_BRANCH,message:e.BUILDKITE_MESSAGE,authorName:e.BUILDKITE_BUILD_CREATOR,authorEmail:e.BUILDKITE_BUILD_CREATOR_EMAIL,remoteOrigin:e.BUILDKITE_REPO,defaultBranch:e.BUILDKITE_PIPELINE_DEFAULT_BRANCH},circle:{sha:e.CIRCLE_SHA1,branch:e.CIRCLE_BRANCH,authorName:e.CIRCLE_USERNAME,remoteOrigin:e.CIRCLE_REPOSITORY_URL},codeshipBasic:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeshipPro:{sha:e.CI_COMMIT_ID,branch:e.CI_BRANCH,message:e.CI_COMMIT_MESSAGE,authorName:e.CI_COMMITTER_NAME,authorEmail:e.CI_COMMITTER_EMAIL},codeFresh:{sha:e.CF_REVISION,branch:e.CF_BRANCH,message:e.CF_COMMIT_MESSAGE,authorName:e.CF_COMMIT_AUTHOR},drone:{sha:e.DRONE_COMMIT_SHA,branch:e.DRONE_SOURCE_BRANCH,message:e.DRONE_COMMIT_MESSAGE,authorName:e.DRONE_COMMIT_AUTHOR,authorEmail:e.DRONE_COMMIT_AUTHOR_EMAIL,remoteOrigin:e.DRONE_GIT_HTTP_URL,defaultBranch:e.DRONE_REPO_BRANCH},githubActions:{sha:e.GITHUB_SHA,branch:e.GH_BRANCH||e.GITHUB_REF,defaultBranch:e.GITHUB_BASE_REF,remoteBranch:e.GITHUB_HEAD_REF,runAttempt:e.GITHUB_RUN_ATTEMPT},gitlab:{sha:e.CI_COMMIT_SHA,branch:e.CI_COMMIT_REF_NAME,message:e.CI_COMMIT_MESSAGE,authorName:e.GITLAB_USER_NAME,authorEmail:e.GITLAB_USER_EMAIL,remoteOrigin:e.CI_REPOSITORY_URL,defaultBranch:e.CI_DEFAULT_BRANCH},googleCloud:{sha:e.COMMIT_SHA,branch:e.BRANCH_NAME},jenkins:{sha:e.GIT_COMMIT,branch:e.GIT_BRANCH},semaphore:{sha:e.SEMAPHORE_GIT_SHA,branch:e.SEMAPHORE_GIT_BRANCH,remoteOrigin:e.SEMAPHORE_GIT_REPO_SLUG},shippable:{sha:e.COMMIT,branch:e.BRANCH,message:e.COMMIT_MESSAGE,authorName:e.COMMITTER},snap:null,teamcity:null,teamfoundation:{sha:e.BUILD_SOURCEVERSION,branch:e.BUILD_SOURCEBRANCHNAME,message:e.BUILD_SOURCEVERSIONMESSAGE,authorName:e.BUILD_SOURCEVERSIONAUTHOR},travis:{sha:e.TRAVIS_PULL_REQUEST_SHA||e.TRAVIS_COMMIT,branch:e.TRAVIS_PULL_REQUEST_BRANCH||e.TRAVIS_BRANCH,message:e.TRAVIS_COMMIT_MESSAGE},wercker:null,netlify:{sha:e.COMMIT_REF,branch:e.BRANCH,remoteOrigin:e.REPOSITORY_URL},layerci:{sha:e.GIT_COMMIT,branch:e.LAYERCI_BRANCH,message:e.GIT_COMMIT_TITLE}}},Pr=e=>{let t=yr();return t?(0,f.chain)(e()).get(t).value():{}};function Kn(){return(0,f.chain)(Lr()).omitBy(f.isNull).keys().value()}function yr(){let e=Vn();return Z("detected CI provider name: %s",e),e||null}function Jn(){return Pr(Lr)}function Ar(){return Pr(Wn)}function Yn(e){return e&&Kn().includes(e)}function Dr(e){let t=Jn(),r=yr(),o=qn(e,r);return Z("detected CI provider: %s",r),Z("detected CI params: %O",t),Z("detected CI build ID: %o",o),{params:t,provider:r,ciBuildId:o}}function qn(e,t){return e?{source:"user",value:e}:Yn(t)?{source:"server",value:null}:{source:"random",value:`auto:${y()}`}}n();var xr=require("@currents/commit-info"),Br=require("lodash");n();var ee=require("lodash");_();var $e=c.extend("ci-git");function Nr(e){$e("git commit existing info: %O",e);let t=Ar();$e("commit info from provider environment variables: %O",t);let r=(0,ee.transform)(e,(o,s,a)=>{let d=s||(t?t[a]:null);return o[a]=(0,ee.defaultTo)(d,null)});return $e("combined git and environment variables from provider: %O",r),r}var zn=async()=>{let e=await(0,xr.commitInfo)();return Nr({branch:e.branch,remoteOrigin:e.remote,authorEmail:e.email,authorName:e.author,message:e.message,sha:e.sha,ghaEventData:e.ghaEventData})},wr=(0,Br.memoize)(zn);n();var vr=require("@babel/code-frame"),Mr=l(require("chalk")),Ve=l(require("fs")),B=l(require("path")),Fr=l(require("stack-utils")),kr=l(require("url"));function Qn(e){let t=e.split(` `),r=t.findIndex(d=>d.startsWith(" at "));r===-1&&(r=t.length);let o=t.slice(0,r).join(` `),s=t.slice(r),a;for(let d of s){let{frame:E,fileName:U}=to(d);if(!(!E||!U)&&!Xn(U)){a={file:U,column:E.column||0,line:E.line||0};break}}return{message:o,stackLines:s,location:a}}function Xn(e){return e.includes(`${B.default.sep}node_modules${B.default.sep}`)}function Zn(e,t){return B.default.relative(e.rootDir,t)||B.default.basename(t)}function Hr(e,t,r,o){let s=t.stack,a=[],d;if(s){let E=Qn(s);if(a.push(E.message),d=E.location,d)if(!t.snippet&&(!o||Ve.default.realpathSync(o)!==d.file)&&(a.push(""),a.push(Mr.default.gray(" at ")+`${Zn(e,d.file)}:${d.line}`)),a.push(""),t.snippet)a.push(t.snippet);else try{let U=Ve.default.readFileSync(d.file,"utf8"),le=(0,vr.codeFrameColumns)(U,{start:d},{highlightCode:r});a.push(le)}catch{}a.push(""),a.push(E.stackLines.join(` `))}else t.message?a.push(t.message):t.value&&a.push(t.value);return{location:d,message:a.join(` `)}}var eo=new Fr.default;function to(e){let t=eo.parseLine(e);if(!t)return{frame:null,fileName:null};let r=null;return t.file&&(r=t.file.startsWith("file://")?kr.default.fileURLToPath(t.file):B.default.resolve(process.cwd(),t.file)),{frame:t,fileName:r}}be();n();var no=l(require("fs")),jr=require("path");D();_();n();var te=l(require("fs")),ro=require("tmp-promise");function Gr(e){try{let t=te.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}var re=c.extend("last-failed"),oo=".last-run.json";function $r(e){let t=Q(e);if(!t?.cliLastFailed&&!t?.testIdMatcher)return re("CLI last failed option is not enabled. Skipping retrieval of last run data."),null;let r=(t.projects??[]).reduce((s,{project:a})=>(a.name&&a.outputDir&&(s[a.name]=a.outputDir),s),{});if(Object.keys(r).length===0)return re("No projects with outputDir found. Skipping retrieval."),null;let o=Object.entries(r).map(([s,a])=>{let d=(0,jr.join)(a,oo),E=Gr(d);return E||re("No last run data found for project %s",s),{project:s,path:d,data:E}});return re("Last run data retrieved: %O",o),o}Be();n();n();var io=require("lodash");n();var ne=l(require("path"));function Vr(e,t){return so(ne.default.relative(t,e.file))}function so(e){return e.split(ne.default.sep).join(ne.default.posix.sep)}function We(e){let t=e.titlePath(),r=Wr(e).title;return t.slice(t.indexOf(r)+1,t.length)}function Wr(e){let t=e.parent;for(;t.parent?.location;)t=t.parent;return t}function Kr(e,t){let r=Wr(e).location;return Vr(r,t.rootDir)}function Jr(e){return e.id??e._id}function Yr(e){if(e._only)return!0;let t=e.parent;for(;t.parent;){if(t._only)return!0;t=t.parent}return!1}function oe(e){if(!e)return"__currents_no_project__";let r=("__projectId"in e?e.__projectId:"").trim(),o=e.name.trim()?r:`project${r?`-0${r}`:""}`;if(o.length>256)throw new Error(`Project name is too long for ${o}`);return o}function qr(e,t){return e.suites.map(r=>{let o=t.projects.find(s=>s.name===r.title);return{name:oe(r.project()),tags:(o?.metadata?.pwc?.tags??[]).map(s=>s.trim()),tests:ao(r,t)}})}function ao(e,t){let r=e.allTests().map(o=>({isOnly:Yr(o),title:We(o),spec:Kr(o,t),tags:uo(o),testId:Jr(o)}));return r.some(o=>o.isOnly)?r.filter(o=>o.isOnly):r}function uo(e){let t=(We(e).join(" ").match(/@(\S+)/g)??[]).filter(Boolean).map(r=>r);return Array.from(new Set([...t,...e.tags??[]].map(r=>r.trim()).map(r=>r.replace("@",""))))}S();xe();n();n();var zr=l(require("ws"));_();var se=c.extend("ws"),P=null;async function Ke(e){await lo(),P&&(se("sending message to ws: %o, %o",P.url,e),P.send(JSON.stringify(e)))}function Qr(){P&&P.close()}async function lo(){if(P){se("ws already initialized");return}let e=parseInt(process.env.CURRENTS_PWCP_WSS_PORT);se("setting port to %s",e),await new Promise(t=>{P=new zr.default(`ws://localhost:${e}`),P.on("open",()=>{se("ws opened"),t(null)})})}n();var co=l(require("http"));_();var po=l(require("lil-http-terminator")),Xr=require("ts-pattern"),mo=l(require("ws")),Ga=c.extend("wss");n();Le();var ie=class{async create(t){return N({url:"/orchestration-v1",method:"POST",data:JSON.stringify(t)})}async createTask(t){return N({url:`/orchestration-v1/${t.id}/task`,method:"POST",data:JSON.stringify({machineId:t.machineId,runId:t.runId})})}async resetRun(t){return N({url:`/runs/v1/${t.runId}/reset`,method:"PUT",data:JSON.stringify({...t,isBatchedOr8n:!0})})}};n();var Je=l(require("pluralize"));D();pe();S();var ae=class{constructor(t,r,o=A()){this.pwConfig=t;this.suite=r;this.currentsConfig=o}getIntro(t){return[`\u{1F4E6} Currents reporter: ${g([`${_e(H)}`,t.ciBuildId?` - ci build id: ${t.ciBuildId}`:null,` - project id: ${this.currentsConfig?.projectId}`,` - orchestration id: ${t.sessionId}`,t.machineId?` - machine id: ${t.machineId}`:null].filter(Boolean).join(` `))}`,[`\u{1F3AD} Playwright: ${g([`${_e(this.pwConfig.version)}`,`${this.suite.allTests().length} ${(0,Je.default)("test",this.suite.allTests().length)} in ${this.suite.suites.length} ${(0,Je.default)("project",this.suite.suites.length)} [${this.suite.suites.map(r=>oe(r.project())).join(", ")}]`,this.pwConfig.shard?["shard",`${this.pwConfig.shard.current}/${this.pwConfig.shard.total}`].join(" "):null].filter(r=>r).join(" "))} `].filter(r=>r).join(" | ")].join(` `)}};var w=c.extend("orchestration-reporter"),ue=class{constructor(t){this.pwConfig=null;this.pwSuite=null;this.lastRunData=null;this.fullSuite=null;this.printer=null;this.remoteDebug=J.factory("or8n"),this.configLoader=new X(t).start()}printsToStdio(){return!0}onBegin(t,r){Ft(t.version),this.configLoader.waitSync(),w("Starting orchestration discovery"),this.pwConfig=t,this.pwSuite=r,_r(t),w("Discovering test suite config: %O",t),this.fullSuite=qr(this.pwSuite,t),w("Full suite response %O",this.fullSuite),this.printer=new ae(t,r),this.lastRunData=$r(t),w("Last run data %O",this.lastRunData)}onError(t){C(`Global error reported by test runner: %s`,Hr(this.pwConfig,t,!0).message)}getOrchestrationAPI(){return new ie}async onEnd(){if(this.pwConfig?.projects.forEach(O=>{if(!O.name)throw new Error("currents panic: playwright projects must have a name for orchestration")}),!this.fullSuite)throw new Error("currents panic: cannot detect full test suite");let t=A(),r=await wr(),o=Dr(t?.ciBuildId);if(o.ciBuildId.source==="random")throw C(`Currents failed to detect CI build ID for this environment. Please use one of the following to set CI build ID: - use environment variable: ${g(q("ciBuildId"))} - as CLI flag command: ${g(z("ciBuildId"))} - as reporter configuration option ${g("ciBuildId")} in ${g("playwright.config.ts")} \u{1F4D6} ${F.guide.ciBuildId} \u{1F4D6} ${F.guide.integration} `),new Error("We could not determine a unique CI Build ID");this.fullSuite.flatMap(O=>O.tests).length===0&&(Ee(),p("No tests detected"),Ee());let s=this.pwConfig?Q(this.pwConfig):null,a=t?.orchestration?.batchSize,d=je(s?.projects),E=this.pwConfig?.workers,U=Cr(d),le=hr(d[0]),en={ci:o,suite:this.fullSuite,commit:r,clientId:(0,Zr.nanoid)(),config:je(this.pwConfig),projectId:t?.projectId,ciBuildId:o.ciBuildId.value,recordKey:t?.recordKey,machineId:t?.machineId,globalWorkers:E,globalBatchSize:a,projectWorkers:U,projectBatchSizes:le};if(b("\u{1F680} Starting orchestration session..."),process.env.CURRENTS_PWCP_DRY_RUN){console.log("Dry run enabled, skipping orchestration creation");return}try{let{data:O}=await this.getOrchestrationAPI().create(en);b(this.printer.getIntro({sessionId:O.id,ciBuildId:o.ciBuildId.value,machineId:O.machineId})),process.env.CURRENTS_PWCP_DRY_RUN||await Ke({type:"discovery:creation-success",payload:{...O,cliArgs:s?.cliArgs??null,suite:this.fullSuite,lastRunData:this.lastRunData}})}catch(O){b(this.printer.getIntro({sessionId:void 0,machineId:null,ciBuildId:o.ciBuildId.value})),C("Could not create new orchestration session"),await Ke({type:"discovery:creation-failure",payload:O})}finally{w("Discovery done"),await Qr(),w("WS closed"),await this.remoteDebug.finalize()}}};var go=ue; /*! For license information please see index.js.LEGAL.txt */ //# sourceMappingURL=index.js.map