@testim/testim-cli 4.162.1 → 4.164.0
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/README.md +1 -1
- package/cli.js +3 -3
- package/cli.js.map +2 -2
- package/npm-shrinkwrap.json +660 -2048
- package/package.json +1 -1
- package/meta.json +0 -1
package/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#! /usr/bin/env node
|
|
2
|
-
"use strict";var XT=Object.create;var ui=Object.defineProperty;var YT=Object.getOwnPropertyDescriptor;var QT=Object.getOwnPropertyNames;var ZT=Object.getPrototypeOf,ew=Object.prototype.hasOwnProperty;var E=(s,e)=>()=>(s&&(e=s(s=0)),e);var z=(s,e)=>{for(var t in e)ui(s,t,{get:e[t],enumerable:!0})},bd=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of QT(e))!ew.call(s,n)&&n!==t&&ui(s,n,{get:()=>e[n],enumerable:!(r=YT(e,n))||r.enumerable});return s};var I=(s,e,t)=>(t=s!=null?XT(ZT(s)):{},bd(e||!s||!s.__esModule?ui(t,"default",{value:s,enumerable:!0}):t,s)),qe=s=>bd(ui({},"__esModule",{value:!0}),s);var je={};z(je,{log:()=>F,measure:()=>rw});function F(...s){if(!wd)return;let e=Date.now();console.log(`${e-tw} ${e-Td} `,...s),Td=e}function rw(s,e){if(!wd)return;let t=Date.now();try{s()}finally{console.log(e||s.name,"took",Date.now()-t)}}var wd,tw,Td,$e=E(()=>{"use strict";wd=process.env.MEASURE_TESTIM_CLI_PERFORMANCE,tw=Date.now(),Td=Date.now()});var Jt,Hr=E(()=>{"use strict";Jt="element-6066-11e4-a52e-4f735466cecf"});function re(s=16){let e="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890",t="";for(let r=0;r<s;r++){let n=Math.floor(Math.random()*e.length);t+=e[n]}return t}function ze(s,e,t,r,n){let i="";return n=n?encodeURIComponent(n):"master",e&&t&&(i=`${s}/#/project/${e}/branch/${n}/test/${t}`,r&&(i+=`?result-id=${r}`)),i}function mc(s,e){return`Basic ${Buffer.from(`${s}:${e}`).toString("base64")}`}function De(s){let e=/^(https?:\/\/)/i,t=new RegExp("^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$","i");return e.test(s)||t.test(s)}var fc=E(()=>{"use strict"});var hc,vd,Sd,bi=E(()=>{hc={ngrok:"4.3.3","v8-to-istanbul":"9.1.0","istanbul-lib-coverage":"3.2.0","@bcoe/v8-coverage":"0.2.3","convert-source-map":"1.7.0",multer:"2.0.1"},vd={"@applitools/eyes-sdk-core":"13.11.34-legacy.1","@applitools/spec-driver-webdriverio":"1.4.29","@segment/analytics-node":"2.1.3","@types/unzip-stream":"0.3.4",ajv:"6.12.6","body-parser":"1.20.3",chalk:"4.1.2","chrome-launcher":"0.15.0",commander:"10.0.0",compression:"1.8.1",cors:"2.8.5","data-uri-to-buffer":"2.0.2",dayjs:"1.11.8",eventsource:"3.0.6",express:"4.21.2",fkill:"7.2.1","https-proxy-agent":"7.0.2","istanbul-lib-report":"3.0.0","istanbul-reports":"3.1.5",jimp:"1.1.4",jsonwebtoken:"9.0.0",linkedom:"0.18.0",lodash:"4.17.21","memory-fs":"0.5.0",ms:"2.1.2","node-fetch":"2.7.0","object-hash":"3.0.0",ora:"5.4.1","p-limit":"4.0.0","p-retry":"4.6.2",pako:"1.0.11",portfinder:"1.0.28","promise-queue":"2.2.5",prompts:"2.4.2","proxy-agent":"6.3.1","rox-node":"5.4.12",semver:"7.6.0","serialize-error":"7.0.1","socket.io-client":"4.8.0","source-map-support":"0.5.19",superagent:"9.0.1","superagent-proxy":"3.0.0","test-exclude":"7.0.0","ua-parser-js":"0.7.39","unzip-stream":"0.3.4",uuid:"11.0.5","validate-npm-package-name":"3.0.0",webdriverio:"8.44.1",winston:"3.11.0","winston-transport":"4.6.0",ws:"8.17.1",xml2js:"0.6.2",yaml:"2.2.2"},Sd={node:">= 18.0.0"}});var fr,gr,Ed,xt,iw,ft,Id,Rd,Ti,rt,xd,he,Ad,Cd,wi,We,yc,Pd,vi,kd,Od,zR,KR,_d,Ld,Dd,Nd,bc,Tc,wc,vc,Md,Vs,Fd,Sc,Gs,oe=E(()=>{"use strict";fr=process.env.SERVICES_HOST||"
|
|
3
|
-
${l.msg}`));for(let u of aw)a[u]instanceof Error&&(l[u]={message:a[u].message,stack:a[u].stack,name:a[u].name,type:a[u].type,cause:a[u].cause,...a[u]});Object.keys(l).length>0&&(o&&!d&&(l.msg=o),m.text=JSON.stringify(l)),this.logger.addLog(m),r(null,!0)}setProxy(t){this.logger.setProxy(t)}async waitForFlush(){return await this.logger.waitForFlush()}}});function uw(){let s=[],e=()=>Promise.resolve(),t=r=>{};if(!We){let{CoralogixTransport:r}=(Wd(),qe($d)),n=new r({category:"ROOT"});s.push(n),e=()=>n.waitForFlush(),t=i=>n.setProxy(i)}if(Ad){let r={depth:5,colors:!0};s.push(new gt.transports.Console({format:gt.format.combine(gt.format.colorize({all:!0,colors:{info:"blue",error:"red",warning:"yellow"}}),gt.format.timestamp({format:"HH:mm:ss:SSS"}),gt.format.printf(n=>`[${n.timestamp}] ${n.level} ${n.category}: ${n.message} ${Ii.inspect(n.meta,r)}`))}))}return[s,e,t]}function Jd(s){Ic=s}function Xd(s){Kd=s}function Yd(s){We||!s||mw(s)}function Gd(s){return{projectId:Kd,time:new Date().toISOString(),region:Ut.getRegion(),...Ic&&!s&&{executionId:Ic}}}function P(s){return new Ut(hw.child({category:s}))}var Hd,gt,Ii,Ei,qd,cw,lw,Vd,zd,pw,dw,mw,fw,gw,hw,Ic,Kd,Ut,$=E(()=>{"use strict";Hd=I(require("node:os")),gt=I(require("winston"));oe();Ii=I(require("node:util")),Ei=I(require("chalk")),qd=I(require("dayjs"));B();cw=Hd.hostname(),lw=st();Vd={depth:5,colors:!0},zd=(s,e,t)=>{let r=`[${(0,qd.default)().format("HH:mm:ss:SSS")}]`,n=Ii.inspect(e,Vd),i=Ii.inspect(t,Vd);return`${Ei.default.white(r)} ${Ei.default.reset()}SessionPlayer-${Ei.default.red(s)} ${n} ${i}`},[pw,dw,mw]=uw(),fw=Cd?"debug":"info",gw={release:Boolean(!1),branch:"runner-v4.162.1"},hw=gt.createLogger({levels:gt.config.syslog.levels,level:fw,transports:pw,defaultMeta:{name:"runner",hostname:cw,nodeVersion:process.version,runnerVersion:lw,...gw}}),Ic=null,Kd=null;Ut=class{constructor(e){this._logger=e;this.debug=this.debug.bind(this),this.info=this.info.bind(this),this.warn=this.warn.bind(this),this.error=this.error.bind(this),this.fatal=this.fatal.bind(this)}static setRegion(e){Ut.region=e}static getRegion(){return Ut.region}debug(e,t={}){this.innerLog("debug",e,t)}info(e,t={}){this.innerLog("info",e,t)}warn(e,t={}){this.innerLog("warning",e,t)}error(e,t={}){this.innerLog("error",e,t)}fatal(e,t={}){this.innerLog("crit",e,t)}innerLog(e,t,r={}){let{executionId:n}=r;try{this._logger.log(e,{meta:r,message:t,...Gd(n)})}catch(i){try{this._logger.log("crit",{message:`failed to log message ${i.message}, ${i.stack}`,...Gd(n)})}catch{}}}waitForFlush(){return dw()}}});var Ci,qr,C,Xt,hr,At,Ri,zr,ce,Hs,nt,Yt,Ct,xi,Kr,Ai,qs,Y=E(()=>{"use strict";Ci=require("p-retry"),qr=class extends Error{constructor(){super(...arguments);this.name="NoArgsError"}},C=class extends Error{constructor(){super(...arguments);this.name="ArgError"}},Xt=class extends Error{constructor(){super(...arguments);this.name="StopRunOnError"}},hr=class extends Error{constructor(t,r){super(t instanceof Error?t.message:t,{cause:t});this.type=r}},At=class extends Ci.AbortError{},Ri=class extends Ci.AbortError{},zr=class extends Ci.AbortError{},ce=class extends Error{},Hs=class extends Error{},nt=class extends Error{constructor(){super(...arguments);this.name="GridError"}toString(){return this.message}},Yt=class extends nt{constructor(){super(...arguments);this.name="GridConcurrencyError"}},Ct=class extends Error{constructor(){super(...arguments);this.name="NpmPackageError"}},xi=class extends Error{constructor(){super(...arguments);this.message="selenium driver crashed";this.name="SeleniumCrashError"}},Kr=class extends Error{constructor(t){super(`Testim had missing write access to ${t}`);this.path=t}},Ai=class extends Error{constructor(e){super(`Package for CLI action need to have a CommonJS export which the package ${e} does not have`)}},qs=class extends Error{constructor(e=!1){let t="not implemented";e&&(t="should be implemented on descendant"),super(t)}}});function Rc(s){return!!s&&(typeof s=="object"||typeof s=="function")&&typeof s.then=="function"&&typeof s.catch=="function"}function pe(s){return(0,em.setTimeout)(s)}function xc(s,e){let t=new Promise((r,n)=>{e.onabort=()=>{n(e.reason)}});return Promise.race([s,t])}function le(s,e,t="Timeout Error"){Ti&&!Qd&&(Qd=!0,console.log("Debugger connected - timeouts were overridden to 10 minutes to improve debugging"));let r=new ce(t);return e=Ti?Number(Ti)||6e5:e,Promise.race([s,pe(e).then(()=>{throw r})])}async function se(s,e,{concurrency:t}={}){if(t){Zd||=(await import("p-limit")).default;let r=Zd(t);return await Promise.all(Array.from(s,(n,i)=>r(()=>e(n,i))))}return await Promise.all(Array.from(s,e))}function Qt(s){return new Promise((e,t)=>{s((r,n)=>r?t(r):e(n))})}var em,Qd,Zd,Ac=E(()=>{"use strict";em=require("timers/promises");Y();oe();Qd=!1});var Ks,tm,bw,zs,rm,Tw,ww,sm,nm=E(()=>{"use strict";Ks=I(require("lodash"));oe();tm=require("dns");$();Ac();bw=P("http-request-counters"),zs=!1,rm=async()=>{if(We)return!0;let s=["www.google.com","www.facebook.com","www.microsoft.com","testim.io"];try{let e=Boolean(await se(s,t=>tm.promises.lookup(t)));return e||(zs=!0),e}catch{return bw.error("network connectivity test failed"),zs=!0,!1}},Tw=Ks.throttle(rm,10*1e3),ww=60*1e3*15,sm=()=>{let s={call:new Map,success:new Map,fail:new Map};function e(n,i){let o=n.get(i)||0;n.set(i,o+1),setTimeout(()=>{let a=n.get(i)||1;n.set(i,a-1)},ww)}function t(n,i=n.name){return async function(...o){e(s.call,i);try{let a=await n.call(null,...o);return e(s.success,i),a}catch(a){throw e(s.fail,i),zs||Tw(),a}}}async function r(){if(zs||!await rm())return!1;let n=Ks.sum([...s.fail.values()]),i=Ks.sum([...s.call.values()]);return n<i*.1}return r.counters=s,t.counters=s,t.isNetworkHealthy=r,t.didNetworkConnectivityTestFail=()=>zs,t}});var Ke={};z(Ke,{deleteReq:()=>Js,didNetworkConnectivityTestFail:()=>Dc,download:()=>_c,get:()=>Te,getFullRes:()=>Rw,getText:()=>Ys,head:()=>xw,isNetworkHealthy:()=>Lc,post:()=>Ve,postForm:()=>Xs,postText:()=>kc,put:()=>Oc});function Sw(){return global.caFileContent}function Ew(s,e){let t=[];s.on("data",r=>{t.push(r)}),s.on("end",()=>{e(null,Buffer.concat(t))})}function Iw(){return!ht.default.Request.prototype.proxy&&global.SuperagentProxy&&global.SuperagentProxy(ht.default),global.proxyUri}function yr(s,e=!1){let t=Sw();t&&s.ca(t);let r=!e&&Iw();r&&s.proxy(r)}async function im(s,e,t={},r=Jr,n=0){let i=ht.default.post(s).send(e).timeout(r).set(t);yr(i),n&&i.retry(n);try{return await i}catch(o){throw o.url=s,o.originalRequestTimeout=r,o.additionalSetHeaders=t,o}}async function Pc(s,e,t={},r=Jr,{isBinary:n=!1,skipProxy:i=!1}={}){let o=ht.default.get(s).query(e||{}).timeout(r).set(t);return n&&o.buffer(!0),yr(o,i),await o}var ht,Cc,it,Jr,vw,Bt,Js,Ve,Xs,Ys,kc,Te,Rw,xw,Oc,_c,Lc,Dc,Ge=E(()=>{"use strict";ht=I(require("superagent"));$();nm();Cc=P("http-request"),it=sm(),Jr=parseInt(process.env.DEFAULT_REQUEST_TIMEOUT||"0",10)||3e4,vw=6e4;Bt=(s,e,t)=>{let r=e.response;e.response instanceof ht.default.Response&&typeof r.toError=="function"&&(e=e.response.toError(),e.requestHeaders=r==null?void 0:r.header,e.responseHeaders=r==null?void 0:r.headers);let n=new Error("").stack;throw Cc.error(s,{...t,error:e,logErrorAndRethrowStack:n}),e};Js=it(async(s,e={},t={},r=Jr)=>{try{let n=ht.default.delete(s).send(e).timeout(r).set(t);yr(n);let i=await n;return i.type==="text/plain"?i.text:i.body}catch(n){return Bt("failed to delete request",n,{url:s})}}),Ve=it(async({url:s,body:e,headers:t,timeout:r,retry:n})=>{try{let i=await im(s,e,t,r,n);return i.type==="text/plain"?i.text:i.body}catch(i){return Bt("failed to post request",i,{url:s})}});Xs=it(async(s,e,t,r={},n=Jr)=>{let i=ht.default.post(s).type("form").timeout(n).set(r);i.field(e),Object.entries(t).forEach(([o,a])=>{i.attach(o,a.buffer,a.fileName)}),yr(i);try{let o=await i;return o.type==="text/plain"?o.text:o.body}catch(o){return Bt("failed to post request",o,{url:s})}});Ys=it(async(s,e,t)=>{try{return(await Pc(s,e,t)).text}catch(r){return Bt("failed to getText request",r,{url:s,query:e})}}),kc=it(async({url:s,body:e,headers:t,timeout:r,retry:n})=>{try{return(await im(s,e,t,r,n)).text}catch(i){return Bt("failed to post request",i,{url:s})}}),Te=it(async(s,e,t,r,n)=>{try{return(await Pc(s,e,t,r,n)).body}catch(i){return Bt("failed to get request",i,{url:s,query:e})}}),Rw=it((s,e,t,r)=>Pc(s,e,t,r)),xw=it(async s=>{let e=ht.default.head(s).timeout(Jr);yr(e);try{return await e}catch(t){return Bt("failed to head request",t,{url:s})}}),Oc=it(async(s,e,t={},r=Jr)=>{let n=ht.default.put(s).send(e).timeout(r).set(t);yr(n);try{return(await n).body}catch(i){return Bt("failed to put request",i,{url:s})}}),_c=it(async s=>{Cc.info("start to download",{url:s});let e=ht.default.get(s).set("User-Agent","Testim.io").timeout(vw).buffer(!0).parse(Ew);yr(e);try{let t=await e;return Cc.info("finished to download",{url:s}),t}catch(t){return Bt("failed to download",t,{url:s})}}),Lc=it.isNetworkHealthy,Dc=it.didNetworkConnectivityTestFail});function yt(){let s;return require.main?(require.main.filename.includes("/src")||require.main.filename.includes("\\src")?s=jt.resolve(__dirname,"../../"):s=jt.resolve(__dirname,""),s):process.cwd()}function Pi(s,e){return De(s)?e||jt.join(process.cwd(),s.replace(/^.*[\\/]/,"")):e||jt.basename(s)}function st(){try{return require(`${__dirname}/package.json`).version}catch{return""}}function Fc(){try{return Sd.node}catch{return""}}async function cm(s,e,t=!0){let r=await ot.promises.readdir(s,{withFileTypes:!0});await ot.promises.mkdir(e,{recursive:t});for(let n of r){let i=jt.join(s,n.name),o=jt.join(e,n.name);n.isDirectory()?await cm(i,o):await ot.promises.copyFile(i,o)}}async function ye(s){try{return await ot.promises.access(s),!0}catch(e){if(e.code==="ENOENT")return!1;throw e}}var jt,om,am,ot,Aw,$t,Je,ki,Nc,at,Mc,lm=E(()=>{"use strict";jt=I(require("node:path"));fc();bi();om=I(require("unzip-stream")),am=I(require("p-retry")),ot=require("node:fs"),Aw=3;$t=async s=>{let e=await Promise.resolve().then(()=>(Ge(),Ke));return(0,am.default)(()=>e.download(s),{retries:Aw,factor:1})},Je=async(s,e)=>{let t=await $t(s);return ot.promises.writeFile(e,t.body)};ki=async(s,e)=>{let t=Pi(s,e);return De(s)?Je(s,t):ot.promises.copyFile(s,t)},Nc=async s=>De(s)?$t(s):ot.promises.readFile(s),at=async(s,e)=>(0,ot.createReadStream)(s).pipe(om.Extract({path:e})),Mc=s=>(0,ot.statSync)(s).size/1e6});var Wt={};z(Wt,{APPIUM_SESSION_MESSAGE:()=>Wc,CLI_MODE:()=>K,MOBILE_APP_SOURCE:()=>Oi,MOBILE_RUN_SKIP_REASON:()=>$c,REGION_CONFIG:()=>Yr,X_HEADER_RUNNER_ID:()=>Vc,gridMessages:()=>bt,gridTypes:()=>_,mobileWeb:()=>Bc,runnerStatus:()=>Uc,runnerTestStatus:()=>fe,socketEventTypes:()=>Pt,stepResult:()=>Xr,test:()=>jc,testRunStatus:()=>Qs,testStatus:()=>Xe,timeoutMessages:()=>Ae});var Ae,Qs,Uc,fe,Xe,bt,Bc,jc,Pt,K,_,Xr,Oi,$c,Wc,Vc,Yr,ae=E(()=>{"use strict";Ae={GET_BROWSER_TIMEOUT_MSG:"get-browser-timeout",TEST_START_TIMEOUT_MSG:"test-start-timeout",TEST_COMPLETE_TIMEOUT_MSG:"test-complete-timeout",TEST_REACHED_CUSTOM_TIMEOUT_MSG:"test-reached-custom-timeout"},Qs={COMPLETED:"completed"},Uc={RUNNING:"RUNNING",SKIPPED:"SKIPPED",FINISHED:"FINISHED",ABORTED:"ABORTED",QUEUED:"QUEUED",TIMEOUT:"TIMEOUT"},fe={PASSED:"PASSED",FAILED:"FAILED",ABORTED:"ABORTED",SKIPPED:"SKIPPED",QUEUED:"QUEUED",PENDING:"PENDING"},Xe={DRAFT:"draft",EVALUATING:"evaluating",ACTIVE:"active",QUARANTINE:"quarantine"},bt={NOT_FOUND:"The specified grid is not available",UNKNOWN:"Test couldn't get browser - unknown error"},Bc={MOBILE_WEB_REMOTE_RUN_HEADER_SPACING:50},jc={HIDDEN_PARAM:"TST_HIDDEN_PARAM"},Pt={TEST_RESULT_CREATED:"test-result-created",TEST_RESULT_UPDATED:"test-result-updated",REMOTE_STEP_SAVED:"remote-step-saved"},K={EXTENSION:"extension",SELENIUM:"selenium",APPIUM:"appium"},_={TESTIM_ENTERPRISE:"testimEnterprise",TESTIM:"testim",TESTIM_PRIVATE:"testimPrivate",LAMBDATEST:"lambdaTest",TESTIM_LAMBDATEST:"testimLambdaTest",DEVICE_FARM:"testimDF",HYBRID:"testimHybrid",BROWSERSTACK:"browserstack",SAUCELABS:"saucelabs",TESTIM_HEADSPIN:"testimHeadspin",TESTIM_TDC:"testimTDC",TESTIM_TVC:"testimTVC",P_CLOUDY:"pcloudy"},Xr={SETUP_TIMEOUT:"setup-timeout",NETWORK_ERROR:"network-error",GRID_ERROR:"grid-error",SELENIUM_ERROR:"selenium-error",BROWSER_CLOSED:"browser-closed",MOBILE_SESSION_ERROR:"mobile-session-error",UNKNOWN_ERROR:"unknown-error",KEEP_ALIVE_FAILED:"keep-alive-failed"},Oi={FROM_LIBRARY:"from-library",FROM_DEVICE:"from-device"},$c={APP_FROM_DEVICE:"app-from-device",VIRTUAL_BUILD:"virtual-build"},Wc={APP_NOT_EXIST_ON_DEVICE:"used to start the app doesn't exist or cannot be launched",APP_NEVER_STARTED:"never started",DEVICE_OS_VERSION_TOO_LOW:"DeviceOSVersionTooLow",TIMEOUT_ERROR:"Timeout awaiting 'request'",SAUCELABS_APP_IS_NOT_INSTALLED:"Original error: 'app' option is required for reinstall"},Vc="X-Testim-Runner-ID",Yr={TTL:1e3*60*60*24,CACHE_FN_NAME:"setRegionConfig"}});function Zs(s,e){var t,r,n,i,o,a;return(t=s.browserstack)!=null&&t.browserName||(r=s.saucelabs)!=null&&r.browserName?[(n=s.browser)==null?void 0:n.toLowerCase()]:(i=s.testConfigNames)!=null&&i.length||(o=s.testConfigIds)!=null&&o.length||s.testPlan.length||s.testPlanIds.length||!s.browser?[...new Set(e.map(c=>{var l;return(l=c.runConfig)==null?void 0:l.browserValue}))]:[(a=s.browser)==null?void 0:a.toLowerCase()]}function Cw(){let{argv:s}=process;if(s.includes("--remoteRunId"))return{remoteRunId:s[s.indexOf("--remoteRunId")+1],projectId:s[s.indexOf("--project")+1],token:s[s.indexOf("--token")+1]}}var en,um,Ye,Pw,kw,Ow,_w,Lw,Gc,Hc,pm=E(()=>{"use strict";ae();en=s=>{var e,t;return Boolean(((e=s.testPlan)==null?void 0:e.length)||((t=s.testPlanIds)==null?void 0:t.length))},um=s=>Boolean(s.resultId&&s.source==="remote-run"),Ye=(s,e)=>s.testStatus===Xe.QUARANTINE&&!um(e)&&!e.runQuarantinedTests;Pw=s=>Boolean(s.loginMode),kw=s=>Boolean(s.tunnelOnlyMode),Ow=s=>Boolean(s.createPrefechedData),_w=s=>Boolean(s.installLazyDepsMode),Lw=s=>Boolean(s.agentMode),Gc=(s,e)=>{s.forEach((t,r)=>{e.has(t)&&(s[r]=`--${t}`)})},Hc=s=>{let e=[];return Object.entries(s).forEach(([t,r])=>{r&&e.push(`--${t}`,r)}),e}});function Li(s=0){return _i.default.duration(s).format("HH:mm:ss.SSS")}function qc(s=0){return _i.default.duration(s).asSeconds()}var _i,dm,zc,mm=E(()=>{"use strict";_i=I(require("dayjs")),dm=I(require("dayjs/plugin/duration"));_i.default.extend(dm.default);zc=s=>{let e=Math.floor(s.asMinutes()),t=s.asSeconds()%60||0;return e>0?`${e} min ${Math.floor(t)} sec`:`${Math.floor(t)} sec`}});var tn,Qr,Zt,fm,Zr,gm=E(()=>{"use strict";ae();tn=s=>!(!s||"fileName"in s),Qr=(s,e)=>{if(e===_.TESTIM_TVC)return!1;if(s){if(s.appMetadata&&"iOSSupportedTargetDevice"in s.appMetadata)return s.appMetadata.iOSSupportedTargetDevice==="virtual";if("fileName"in s)return s.fileName.endsWith(".app")}return!1},Zt=s=>{var e,t;return((e=s.projectData)==null?void 0:e.type)==="ios"||((t=s.projectData)==null?void 0:t.type)==="android"},fm=s=>s===_.TESTIM_TVC,Zr=(s,e)=>fm(e)||!s.flags.allowAppFromDeviceRuns.isEnabled()});function Kc(s=4e3){let e=process.memoryUsage(),t=r=>Math.round(r/1024/1024*100)/100;return{isOverThreshold:t(e.rss)>s,rss:`${t(e.rss)} MB -> Resident Set Size - total memory allocated for the process execution`,heapTotal:`${t(e.heapTotal)} MB -> total size of the allocated heap`,heapUsed:`${t(e.heapUsed)} MB -> actual memory used during the execution`,external:`${t(e.external)} MB -> V8 external memory`}}var hm=E(()=>{"use strict"});var X={};z(X,{OSS:()=>es,TESTIM_BROWSER_DIR:()=>Vt,buildBasicHeader:()=>mc,calcPercentile:()=>Mi,copyDir:()=>cm,delay:()=>pe,doesPathExist:()=>ye,download:()=>$t,downloadAndSave:()=>Je,extractElementId:()=>Ne,formatTimeoutDuration:()=>zc,getArgsOnRemoteRunFailure:()=>Cw,getBrowserInfo:()=>Nw,getCdpAddressForHost:()=>wr,getCliLocation:()=>yt,getDuration:()=>Li,getDurationSec:()=>qc,getEnginesVersion:()=>Fc,getEnvironmentGitBranch:()=>Tr,getLinksFromUnescapeHTML:()=>nn,getLocalFileSizeInMB:()=>Mc,getMemorySnapshot:()=>Kc,getPlanType:()=>Ni,getRunConfigByBrowserName:()=>rn,getRunnerVersion:()=>st,getSource:()=>ki,getSourceAsBuffer:()=>Nc,getSourcePath:()=>Pi,getTestUrl:()=>ze,getUniqBrowsers:()=>Zs,groupTestsByRetries:()=>Xc,guid:()=>re,hasTestPlanFlag:()=>en,isAgentMode:()=>Lw,isAppFromDevice:()=>tn,isAppFromDeviceDisabled:()=>Zr,isCreatePrefetchedDataMode:()=>Ow,isInstallLazyDepsMode:()=>_w,isLoginMode:()=>Pw,isMobileProject:()=>Zt,isPromise:()=>Rc,isQuarantineAndNotRemoteRun:()=>Ye,isRemoteRun:()=>um,isTestimVirtualGrid:()=>fm,isTunnelOnlyMode:()=>kw,isURL:()=>De,promiseAbort:()=>xc,promiseFromCallback:()=>Qt,promiseMap:()=>se,promiseTimeout:()=>le,removePropertyFromObject:()=>Di,replaceArgsWithNoDashes:()=>Gc,sanitizeNumberValue:()=>br,shouldBlockVirtualIosBuild:()=>Qr,spreadObjectToArgs:()=>Hc,unescapeHTML:()=>sn,unzipFile:()=>at});function br(s,e){let t=Number(s);return Number.isNaN(t)||t<=0?e:t}function Nw(s){return s=s.toLowerCase(),Jc.find(e=>e.browserValue===s)}function rn(s,e,t){s=s==null?void 0:s.toLowerCase();let r=Jc.find(i=>i.browserName.toLowerCase()===s||s.includes(i.synonyms))||Jc[0],n=es.find(i=>i.osName==="Windows 10");return e&&(e.platform?n=es.find(i=>i.sl.platform===e.platform):e.platformName&&(n=es.find(i=>i.sl.platformName===e.platformName))),t&&(t.os_version?n=es.find(i=>i.bs.os_version===t.os_version):t.platform&&(n=es.find(i=>i.bs.platform===t.platform))),ts.merge(r,n)}function Tr(){return process.env.GIT_BRANCH||process.env.CIRCLE_BRANCH||process.env.TRAVIS_BRANCH||process.env.CI_BRANCH}function Di(s,e,t){for(let r in s)Object.hasOwn(s,r)&&(t(r,e)?delete s[r]:typeof s[r]=="object"&&Di(s[r],e,t))}function Ne(s){return s.ELEMENT||s[Jt]}function Ni(s){s||={};let e=Date.now(),t=s.expireAt||s.expireAT;return s.plan!=="free"?"pro":t?t<e?"free":"trial":"free"}function Xc(s=[]){return ts.chain(s).groupBy(e=>e.originalTestResultId||e.resultId).values().reduce((e,t)=>{if(!t)return e;if(t.length===1)return e.push(t[0]),e;let r=t.slice().sort((i,o)=>{let a=typeof i.retryCount=="number"?i.retryCount:1,c=typeof o.retryCount=="number"?o.retryCount:1;return a===c?i.startTime-o.startTime:(i.retryCount??0)-(o.retryCount??0)}),n=ts.cloneDeep(r.at(-1));return n&&(n.retryTestResults=r,e.push(n)),e},[]).compact().value()}function sn(s){return vm.parseFromString(`<html><body>${s}</body></html>`,"text/html").documentElement.textContent}function nn(s){return[...vm.parseFromString(`<html><body>${s}</body></html>`,"text/html").getElementsByTagName("a")].map(t=>t.href).filter(Boolean)}async function wr(s,e){let t=await Promise.resolve().then(()=>(Ge(),Ke));try{return(await t.get(`http://${s}/json/version`,void 0,void 0,e)).webSocketDebuggerUrl}catch{throw new Error("unable to connect to devtools server")}}var bm,ts,Tm,wm,Dw,Vt,ym,es,Jc,Mi,vm,B=E(()=>{"use strict";bm=I(require("os")),ts=I(require("lodash")),Tm=I(require("path")),wm=require("linkedom");Hr();lm();pm();mm();fc();Ac();gm();hm();Dw=bm.homedir(),Vt=Tm.join(Dw,".testim-browser-profile"),ym="133",es=[{osName:"Linux",bs:{os:"LINUX"},sl:{platform:"Linux"},lt:{platform:"Linux"}},{osName:"Windows 11",bs:{os:"WINDOWS",os_version:"11"},sl:{platform:"Windows 11"},lt:{platform:"Windows 11"}},{osName:"Windows 10",bs:{os:"WINDOWS",os_version:"10"},sl:{platform:"Windows 10"},lt:{platform:"Windows 10"}},{osName:"Windows 8",bs:{os:"WINDOWS",os_version:"8"},sl:{platform:"Windows 8"}},{osName:"Windows 8.1",bs:{os:"WINDOWS",os_version:"8.1"},sl:{platform:"Windows 8.1"}},{osName:"Windows 7",bs:{os:"WINDOWS",os_version:"7"},sl:{platform:"Windows 7"}},{osName:"Windows XP",bs:{os:"WINDOWS",os_version:"XP"},sl:{platform:"Windows XP"}},{osName:"macOS Sonoma",bs:{os:"OS X",os_version:"Sonoma",safari_version:"17"},sl:{},lt:{platform:"macOS Sonoma",safari_version:"17"}},{osName:"macOS Ventura",bs:{os:"OS X",os_version:"Ventura",safari_version:"16.5"},sl:{platform:"macOS 13",safari_version:"latest"},lt:{platform:"macOS Ventura",safari_version:"16"}},{osName:"macOS Monterey",bs:{os:"OS X",os_version:"Monterey",safari_version:"15.6"},sl:{platform:"macOS 12",safari_version:"latest"},lt:{platform:"macOS Monterey",safari_version:"15"}},{osName:"macOS Big Sur",bs:{os:"OS X",os_version:"Big Sur",safari_version:"14.1"},sl:{platform:"macOS 11",safari_version:"latest"}},{osName:"macOS Catalina",bs:{os:"OS X",os_version:"Catalina",safari_version:"13.1"},sl:{platform:"macOS 10.15",safari_version:"latest"}},{osName:"macOS Mojave",bs:{os:"OS X",os_version:"Mojave",safari_version:"12.1"},sl:{platform:"macOS 10.14",safari_version:"latest"}},{osName:"macOS High Sierra",bs:{os:"OS X",os_version:"High Sierra",safari_version:"11.1"},sl:{platform:"macOS 10.13",safari_version:"latest"}},{osName:"macOS Sierra",bs:{os:"OS X",os_version:"Sierra",safari_version:"10.1"},sl:{platform:"macOS 10.12",safari_version:"latest"}},{osName:"OS X El Capitan",bs:{os:"OS X",os_version:"El Capitan",safari_version:"9.1"},sl:{platform:"OS X 10.11",safari_version:"latest"}},{osName:"OS X Yosemite",bs:{os:"OS X",os_version:"Yosemite",safari_version:"8"},sl:{platform:"OS X 10.10",safari_version:"latest"}},{osName:"OS X Mavericks",bs:{os:"OS X",os_version:"Mavericks",safari_version:"7.1"},sl:{platform:"OS X 10.9",safari_version:"latest"}},{osName:"OS X Mountain Lion",bs:{os:"OS X",os_version:"Mountain Lion",safari_version:"6.2"},sl:{platform:"OS X 10.8",safari_version:"latest"}},{osName:"OS X Lion",bs:{os:"OS X",os_version:"Lion",safari_version:"6"},sl:{}},{osName:"OS X Snow Leopard",bs:{os:"OS X",os_version:"Snow Leopard",safari_version:"5.1"},sl:{}},{osName:"iOS",bs:{platform:"MAC"},sl:{platformName:"iOS",appiumVersion:"1.6.4"}},{osName:"Android",bs:{platform:"ANDROID"},sl:{platformName:"Android",appiumVersion:"1.6.4"}}],Jc=[{browserName:"Chrome",bs:{browser:"Chrome",browser_version:ym},sl:{browserName:"chrome",version:"94.0"},browserValue:"chrome"},{browserName:"Firefox",bs:{browser:"Firefox",browser_version:"89"},sl:{browserName:"firefox",version:"89.0"},browserValue:"firefox"},{browserName:"Safari",bs:{browser:"Safari"},sl:{browserName:"safari"},browserValue:"safari"},{browserName:"Edge Chromium",bs:{browser:"Edge",browser_version:ym},sl:{browserName:"MicrosoftEdge",version:"94"},synonyms:["edge-chromium"],browserValue:"edge-chromium",seleniumName:"MicrosoftEdge"},{browserName:"Browser",bs:{},sl:{browserName:"Browser"},browserValue:"browser"},{browserName:"Android",bs:{browserName:"android"},sl:{},browserValue:"android"},{browserName:"iPad",bs:{browserName:"iPad"},sl:{},browserValue:"ipad"},{browserName:"iPhone",bs:{browserName:"iPhone"},sl:{},browserValue:"iphone"}];Mi=(s,e)=>{if(s.length===0)return 0;if(typeof e!="number")throw new TypeError("p must be a number");if(s=[...s].sort((r,n)=>r-n),e<=0)return s[0];if(e>=100)return s.at(-1);let t=Math.ceil(s.length*(e/100))-1;return s[t]};vm=new wm.DOMParser});var Yc={};z(Yc,{$schema:()=>Mw,default:()=>$w,definitions:()=>Fw,properties:()=>jw,required:()=>Bw,type:()=>Uw});var Mw,Fw,Uw,Bw,jw,$w,Sm=E(()=>{Mw="http://json-schema.org/draft-07/schema#",Fw={request:{type:"object",required:["url"],additionalProperties:!1,properties:{url:{type:"string"},method:{type:"string",pattern:"^GET$|^HEAD$|^POST$|^PUT$|^DELETE$|^CONNECT$|^OPTIONS$|^TRACE$|^PATCH$"}}},header:{type:"object",required:["name","value"],additionalProperties:!1,properties:{name:{type:"string"},value:{type:"string"}}},cookie:{type:"object",required:["name","value"],additionalProperties:!1,properties:{name:{type:"string"},value:{type:"string"},path:{type:"string"},domain:{type:"string"},expires:{type:"string",format:"date-time"},httpOnly:{type:"boolean"},secure:{type:"boolean"}}},response:{type:"object",required:["status"],additionalProperties:!1,properties:{status:{type:"integer",minimum:100,exclusiveMaximum:600},headers:{type:"array",items:{$ref:"#/definitions/header"}},cookies:{type:"array",items:{$ref:"#/definitions/cookie"}},content:{type:"object",required:["text"],additionalProperties:!1,properties:{text:{type:"string"}}}}},redirectResponse:{type:"object",required:["redirectUrl"],additionalProperties:!1,properties:{redirectUrl:{type:"string"}}},passthroughResponse:{type:"object",required:["passthrough"],additionalProperties:!1,properties:{passthrough:{type:"boolean",enum:[!0]}}},entry:{type:"object",required:["request","response"],additionalProperties:!1,properties:{request:{$ref:"#/definitions/request"},response:{oneOf:[{$ref:"#/definitions/response"},{$ref:"#/definitions/redirectResponse"},{$ref:"#/definitions/passthroughResponse"}]},maxHits:{type:"integer",minimum:1}}}},Uw="object",Bw=["entries"],jw={version:{type:"string",enum:["1.2","1.2.0"]},creator:{type:"string"},entries:{type:"array",items:{$ref:"#/definitions/entry"}}},$w={$schema:Mw,definitions:Fw,type:Uw,required:Bw,properties:jw}});async function Pm(){try{return await le(Fi.promises.readFile($i()).then(async s=>{let e=await Cm;return Gw(e,s)}),3e4)}catch{return{}}}function Gw(s,e){let t=e.slice(0,16),r=e.slice(16),n=Buffer.from(s),i=ss.createDecipheriv("aes-256-cbc",Buffer.concat([n,Buffer.alloc(32)],32),t),o=i.update(r);return JSON.parse(Buffer.concat([o,i.final()]))}function kt(s,e,t=Ww,r=void 0){return async()=>{if(!Rm)return await s();let n=e;r&&(e+=JSON.stringify(r));let i=await Zc(e);if(i)return on.debug("cache hit:",{fnName:e}),i;if(on.debug("cache miss:",{fnName:e}),!xm)throw new Error(`Attempted to rebuild cache for ${n}. cache miss is not allowed with current run configuration`);let o=await s();return o&&await Hw(e,o,t),o}}async function Zc(s){let t=(await Wi)[s];if(!t)return;let{value:r,expiry:n}=t;if(!(n<Date.now())&&r)return r}async function Hw(s,e,t){if(Qc)throw on.error("calling set after waitForSave is not allowed",{key:s,ttl:t}),new Error("calling set after waitForSave is not allowed");try{let r=await Wi;r[s]={value:e,expiry:Date.now()+t},Am=new Promise(n=>{ji=n}),Vw(r)}catch{on.error("failed updating cache")}}async function ns(){let s=await Wi;Object.keys(s).forEach(e=>{delete s[e]})}function km(s){Rm=s}function qw(s=!0){xm=s}async function Om(){try{return Qc=!0,await Am}finally{Qc=!1}}function _m(s){Bi=s,Wi=Pm()}var Fi,Ui,ss,Em,on,Bi,Im,ji,Rm,xm,Qc,Am,Cm,Ww,$i,Wi,Vw,Lm,Dm,Ix,Nm,er=E(()=>{"use strict";Fi=I(require("fs")),Ui=I(require("path")),ss=I(require("crypto"));B();Em=require("lodash");$();on=P("local cache"),Bi=Ui.resolve(yt(),"testim-cache"),Rm=!0,xm=!0,Qc=!1,Am=new Promise(s=>{ji=s}),Cm=new Promise(s=>{Im=s}),Ww=1e3*60*60*3,$i=()=>Ui.resolve(Ui.resolve(Bi,"testim.cache"));Wi=Pm(),Vw=(0,Em.debounce)(async s=>{let e;try{let t=await Cm,r=ss.randomBytes(16),n=JSON.stringify(s),i=Buffer.from(t),o=ss.createCipheriv("aes-256-cbc",Buffer.concat([i,Buffer.alloc(32)],32),r),a=Buffer.concat([r,o.update(n),o.final()]);await ye(Bi)||await Fi.promises.mkdir(Bi,{recursive:!0}),await Fi.promises.writeFile($i(),a)}catch(t){on.error("failed saving cache",{err:t}),e=t}ji(e?{success:!1,error:e}:{success:!0})},200);Lm=Im,Dm=km.bind(void 0,!1),Ix=km.bind(void 0,!0),Nm=()=>qw(!1)});function Vi(){return{cliLocation:yt(),userInfo:is.userInfo(),platform:is.platform(),release:is.release()}}var is,el=E(()=>{"use strict";is=I(require("node:os"));B()});function zw(s){try{return Gi.resolve(Gi.dirname(require.resolve(`${s}/package.json`)),require(`${s}/package.json`).main||"")}catch(e){if(e.code==="ERR_PACKAGE_PATH_NOT_EXPORTED")return require.resolve(s);throw e}}function tr(s){let e=zw(s);return require(e)}var Gi,an=E(()=>{"use strict";Gi=I(require("path"))});function Kw(s){let t=/EACCES[^']+'(.+)'/.exec(s);return t===null?!1:t[1]}function Jw(s){return/The "to" argument must be of type string./.exec(s)}function Bm(s,e,t){let r=Kw(s),n=Jw(s);return r||n?(Um.info("Failed to install package due to insufficient write access",{...Vi(),package:t,path:r}),console.error(`
|
|
2
|
+
"use strict";var XT=Object.create;var ui=Object.defineProperty;var YT=Object.getOwnPropertyDescriptor;var QT=Object.getOwnPropertyNames;var ZT=Object.getPrototypeOf,ew=Object.prototype.hasOwnProperty;var E=(s,e)=>()=>(s&&(e=s(s=0)),e);var z=(s,e)=>{for(var t in e)ui(s,t,{get:e[t],enumerable:!0})},bd=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of QT(e))!ew.call(s,n)&&n!==t&&ui(s,n,{get:()=>e[n],enumerable:!(r=YT(e,n))||r.enumerable});return s};var I=(s,e,t)=>(t=s!=null?XT(ZT(s)):{},bd(e||!s||!s.__esModule?ui(t,"default",{value:s,enumerable:!0}):t,s)),qe=s=>bd(ui({},"__esModule",{value:!0}),s);var je={};z(je,{log:()=>F,measure:()=>rw});function F(...s){if(!wd)return;let e=Date.now();console.log(`${e-tw} ${e-Td} `,...s),Td=e}function rw(s,e){if(!wd)return;let t=Date.now();try{s()}finally{console.log(e||s.name,"took",Date.now()-t)}}var wd,tw,Td,$e=E(()=>{"use strict";wd=process.env.MEASURE_TESTIM_CLI_PERFORMANCE,tw=Date.now(),Td=Date.now()});var Jt,Hr=E(()=>{"use strict";Jt="element-6066-11e4-a52e-4f735466cecf"});function re(s=16){let e="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890",t="";for(let r=0;r<s;r++){let n=Math.floor(Math.random()*e.length);t+=e[n]}return t}function ze(s,e,t,r,n){let i="";return n=n?encodeURIComponent(n):"master",e&&t&&(i=`${s}/#/project/${e}/branch/${n}/test/${t}`,r&&(i+=`?result-id=${r}`)),i}function mc(s,e){return`Basic ${Buffer.from(`${s}:${e}`).toString("base64")}`}function De(s){let e=/^(https?:\/\/)/i,t=new RegExp("^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00a1-\\uffff][a-z0-9\\u00a1-\\uffff_-]{0,62})?[a-z0-9\\u00a1-\\uffff]\\.)+(?:[a-z\\u00a1-\\uffff]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?$","i");return e.test(s)||t.test(s)}var fc=E(()=>{"use strict"});var hc,vd,Sd,bi=E(()=>{hc={ngrok:"4.3.3","v8-to-istanbul":"9.1.0","istanbul-lib-coverage":"3.2.0","@bcoe/v8-coverage":"0.2.3","convert-source-map":"1.7.0",multer:"2.0.1"},vd={"@applitools/eyes-sdk-core":"13.11.34-legacy.1","@applitools/spec-driver-webdriverio":"1.4.29","@segment/analytics-node":"2.1.3","@types/unzip-stream":"0.3.4",ajv:"6.12.6","body-parser":"1.20.3",chalk:"4.1.2","chrome-launcher":"0.15.0",commander:"10.0.0",compression:"1.8.1",cors:"2.8.5","data-uri-to-buffer":"2.0.2",dayjs:"1.11.8",eventsource:"3.0.6",express:"4.21.2",fkill:"7.2.1","https-proxy-agent":"7.0.2","istanbul-lib-report":"3.0.0","istanbul-reports":"3.1.5",jimp:"1.1.4",jsonwebtoken:"9.0.0",linkedom:"0.18.0",lodash:"4.17.21","memory-fs":"0.5.0",ms:"2.1.2","node-fetch":"2.7.0","object-hash":"3.0.0",ora:"5.4.1","p-limit":"4.0.0","p-retry":"4.6.2",pako:"1.0.11",portfinder:"1.0.28","promise-queue":"2.2.5",prompts:"2.4.2","proxy-agent":"6.3.1","rox-node":"5.4.12",semver:"7.6.0","serialize-error":"7.0.1","socket.io-client":"4.8.0","source-map-support":"0.5.19",superagent:"9.0.1","superagent-proxy":"3.0.0","test-exclude":"7.0.0","ua-parser-js":"0.7.39","unzip-stream":"0.3.4",uuid:"11.0.5","validate-npm-package-name":"3.0.0",webdriverio:"8.44.1",winston:"3.11.0","winston-transport":"4.6.0",ws:"8.17.1",xml2js:"0.6.2",yaml:"2.2.2"},Sd={node:">= 18.0.0"}});var fr,gr,Ed,xt,iw,ft,Id,Rd,Ti,rt,xd,he,Ad,Cd,wi,We,yc,Pd,vi,kd,Od,zR,KR,_d,Ld,Dd,Nd,bc,Tc,wc,vc,Md,Vs,Fd,Sc,Gs,oe=E(()=>{"use strict";fr=process.env.SERVICES_HOST||"",gr="https://app.testim.io";process.env.GATEWAY_URL&&(process.env.CORALOGIX_URL=`${process.env.GATEWAY_URL}/testim/coralogix/api/v1/logs`,process.env.SERVICES_HOST=`${process.env.GATEWAY_URL}/testim/services`,process.env.EXTENSION_SERVICES_HOST=process.env.TUNNEL_GATEWAY?process.env.SERVICES_HOST:fr,fr=process.env.SERVICES_HOST);Ed=process.env.TESTIM_REGION||"us-west-2",xt=process.env.RUNNER_ENVIRONMENT||"production",iw={production:"",staging:".staging",development:".dev"},ft=process.env.EXTENSION_SP_S3_HOST||`https://playback-components${iw[xt]||""}.testim.io`,Id=parseInt(process.env.DISABLE_AGENT_ORIGIN_CHECK||"0",10),Rd=parseInt(process.env.DISABLE_DEBUGGER_INFINITE_TIMEOUT||"0",10),Ti=parseInt(process.env.OVERRIDE_TIMEOUTS||"0",10),rt=process.env.EDITOR_URL,xd=process.env.WEBSOCKET_HOST||`${fr}/ws`,he=()=>fr,Ad=parseInt(process.env.LOGGER_CONSOLE||"0",10),Cd=parseInt(process.env.LOGGER_DEBUG||"0",10),wi=parseInt(process.env.WEBDRIVER_DEBUG||"0",10),We=parseInt(process.env.IS_ON_PREM||"0",10),yc=process.env.REQUESTS_QUEUE_SIZE?parseInt(process.env.REQUESTS_QUEUE_SIZE,10):void 0,Pd=parseInt(process.env.DEBUG_MODE||"0",10),vi=process.env.TESTIM_CONCURRENT_WORKER_COUNT?parseInt(process.env.TESTIM_CONCURRENT_WORKER_COUNT,10):null,kd=process.env.ROLLOUT_KEY||"5b5560729601aa6484276518",Od=process.env.CORALOGIX_PRIVATE_KEY||"",zR=parseInt(process.env.DF_ENABLE_VIDEO||"0",10),KR=process.env.APPIUM_VERSION||"1.10.1",_d=process.env.GATEWAY_URL,Ld=()=>process.env.EXTENSION_SERVICES_HOST||fr,Dd=5*60*1e3,Nd=40,bc=process.env.HEADSPIN_MOBILE_API_BASE_URL||"https://api-dev.headspin.io",Tc=process.env.TDC_MOBILE_API_BASE_URL||"https://api.tdc.tricentis-cloud.com",wc=process.env.HEADSPIN_TDC_DEVICES_API_PATH||"v0",vc=process.env.HEADSPIN_TDC_APPS_API_PATH||"v1",Md=process.env.TVC_MOBILE_API_URL||"https://api.waldo.com",Vs=process.env.BROWSERSTACK_APPS_API_URL||"https://api-cloud.browserstack.com/app-automate",Fd=process.env.P_CLOUDY_DEFAULT_TEST_DURATION||60,Sc=process.env.P_CLOUDY_DEFAULT_ANDROID_DEVICE_NAME||"samsung",Gs=s=>{fr=s,process.env.SERVICES_HOST=s,process.env.EXTENSION_SERVICES_HOST=process.env.TUNNEL_GATEWAY?process.env.SERVICES_HOST:fr}});var Ud,Si,Bd=E(()=>{"use strict";Ud=I(require("superagent"));oe();Si=class{constructor(e){this.logs=[];this.url=process.env.CORALOGIX_URL||"https://ingress.coralogix.com/logs/v1/bulk",this.token=Od,this.applicationName=e.applicationName,this.subsystemName=e.subsystemName,this.flushIntervalMs=e.flushIntervalMs||2e3,this.maxBufferedLogsCount=e.maxBufferedLogsCount||50,this.interval=setInterval(()=>this.flushLogs(),this.flushIntervalMs)}addLog(e){this.logs.push(e),this.logs.length>=this.maxBufferedLogsCount&&this.flushLogs()}setProxy(e){this.proxy=e}async waitForFlush(){clearInterval(this.interval),await this.flushLogs()}async flushLogs(){try{if(this.logs.length===0)return;let e={applicationName:this.applicationName,subsystemName:this.subsystemName,logEntries:[...this.logs]};this.logs=[];let t=Ud.default.post(this.url).set("Content-Type","application/json; charset=UTF-8").set("Authorization",`Bearer ${this.token}`).send(e);this.proxy&&t.proxy(this.proxy),await t}catch{}}}});var $d={};z($d,{CoralogixTransport:()=>Ec});var jd,ow,aw,Ec,Wd=E(()=>{"use strict";jd=I(require("winston-transport"));Bd();ow={debug:1,silly:2,verbose:2,silent:2,info:3,http:3,warn:4,warning:4,error:5,critical:6,crit:6},aw=["err","error","reason","e"],Ec=class extends jd.default{constructor(t){super(t);this.name="Coralogix Transport",this.category=t.category,this.logger=new Si({applicationName:"testim",subsystemName:"runner"})}log(t,r){let{category:n,level:i,message:o,meta:a={},...c}=t,l={...a,...c},m={severity:ow[i],text:o,category:n||this.category};l.className&&(m.className=l.className),l.methodName&&(m.methodName=l.methodName),l.threadId&&(m.threadId=l.threadId),delete l.className,delete l.methodName,delete l.threadId,delete l.category,delete l.level,delete l.message;let d=!1;a instanceof Error&&(d=!0,l.msg=a.message+a.stack,o&&(l.msg=`${o}
|
|
3
|
+
${l.msg}`));for(let u of aw)a[u]instanceof Error&&(l[u]={message:a[u].message,stack:a[u].stack,name:a[u].name,type:a[u].type,cause:a[u].cause,...a[u]});Object.keys(l).length>0&&(o&&!d&&(l.msg=o),m.text=JSON.stringify(l)),this.logger.addLog(m),r(null,!0)}setProxy(t){this.logger.setProxy(t)}async waitForFlush(){return await this.logger.waitForFlush()}}});function uw(){let s=[],e=()=>Promise.resolve(),t=r=>{};if(!We){let{CoralogixTransport:r}=(Wd(),qe($d)),n=new r({category:"ROOT"});s.push(n),e=()=>n.waitForFlush(),t=i=>n.setProxy(i)}if(Ad){let r={depth:5,colors:!0};s.push(new gt.transports.Console({format:gt.format.combine(gt.format.colorize({all:!0,colors:{info:"blue",error:"red",warning:"yellow"}}),gt.format.timestamp({format:"HH:mm:ss:SSS"}),gt.format.printf(n=>`[${n.timestamp}] ${n.level} ${n.category}: ${n.message} ${Ii.inspect(n.meta,r)}`))}))}return[s,e,t]}function Jd(s){Ic=s}function Xd(s){Kd=s}function Yd(s){We||!s||mw(s)}function Gd(s){return{projectId:Kd,time:new Date().toISOString(),region:Ut.getRegion(),...Ic&&!s&&{executionId:Ic}}}function P(s){return new Ut(hw.child({category:s}))}var Hd,gt,Ii,Ei,qd,cw,lw,Vd,zd,pw,dw,mw,fw,gw,hw,Ic,Kd,Ut,$=E(()=>{"use strict";Hd=I(require("node:os")),gt=I(require("winston"));oe();Ii=I(require("node:util")),Ei=I(require("chalk")),qd=I(require("dayjs"));B();cw=Hd.hostname(),lw=st();Vd={depth:5,colors:!0},zd=(s,e,t)=>{let r=`[${(0,qd.default)().format("HH:mm:ss:SSS")}]`,n=Ii.inspect(e,Vd),i=Ii.inspect(t,Vd);return`${Ei.default.white(r)} ${Ei.default.reset()}SessionPlayer-${Ei.default.red(s)} ${n} ${i}`},[pw,dw,mw]=uw(),fw=Cd?"debug":"info",gw={release:Boolean(!1),branch:"test"},hw=gt.createLogger({levels:gt.config.syslog.levels,level:fw,transports:pw,defaultMeta:{name:"runner",hostname:cw,nodeVersion:process.version,runnerVersion:lw,...gw}}),Ic=null,Kd=null;Ut=class{constructor(e){this._logger=e;this.debug=this.debug.bind(this),this.info=this.info.bind(this),this.warn=this.warn.bind(this),this.error=this.error.bind(this),this.fatal=this.fatal.bind(this)}static setRegion(e){Ut.region=e}static getRegion(){return Ut.region}debug(e,t={}){this.innerLog("debug",e,t)}info(e,t={}){this.innerLog("info",e,t)}warn(e,t={}){this.innerLog("warning",e,t)}error(e,t={}){this.innerLog("error",e,t)}fatal(e,t={}){this.innerLog("crit",e,t)}innerLog(e,t,r={}){let{executionId:n}=r;try{this._logger.log(e,{meta:r,message:t,...Gd(n)})}catch(i){try{this._logger.log("crit",{message:`failed to log message ${i.message}, ${i.stack}`,...Gd(n)})}catch{}}}waitForFlush(){return dw()}}});var Ci,qr,C,Xt,hr,At,Ri,zr,ce,Hs,nt,Yt,Ct,xi,Kr,Ai,qs,Y=E(()=>{"use strict";Ci=require("p-retry"),qr=class extends Error{constructor(){super(...arguments);this.name="NoArgsError"}},C=class extends Error{constructor(){super(...arguments);this.name="ArgError"}},Xt=class extends Error{constructor(){super(...arguments);this.name="StopRunOnError"}},hr=class extends Error{constructor(t,r){super(t instanceof Error?t.message:t,{cause:t});this.type=r}},At=class extends Ci.AbortError{},Ri=class extends Ci.AbortError{},zr=class extends Ci.AbortError{},ce=class extends Error{},Hs=class extends Error{},nt=class extends Error{constructor(){super(...arguments);this.name="GridError"}toString(){return this.message}},Yt=class extends nt{constructor(){super(...arguments);this.name="GridConcurrencyError"}},Ct=class extends Error{constructor(){super(...arguments);this.name="NpmPackageError"}},xi=class extends Error{constructor(){super(...arguments);this.message="selenium driver crashed";this.name="SeleniumCrashError"}},Kr=class extends Error{constructor(t){super(`Testim had missing write access to ${t}`);this.path=t}},Ai=class extends Error{constructor(e){super(`Package for CLI action need to have a CommonJS export which the package ${e} does not have`)}},qs=class extends Error{constructor(e=!1){let t="not implemented";e&&(t="should be implemented on descendant"),super(t)}}});function Rc(s){return!!s&&(typeof s=="object"||typeof s=="function")&&typeof s.then=="function"&&typeof s.catch=="function"}function pe(s){return(0,em.setTimeout)(s)}function xc(s,e){let t=new Promise((r,n)=>{e.onabort=()=>{n(e.reason)}});return Promise.race([s,t])}function le(s,e,t="Timeout Error"){Ti&&!Qd&&(Qd=!0,console.log("Debugger connected - timeouts were overridden to 10 minutes to improve debugging"));let r=new ce(t);return e=Ti?Number(Ti)||6e5:e,Promise.race([s,pe(e).then(()=>{throw r})])}async function se(s,e,{concurrency:t}={}){if(t){Zd||=(await import("p-limit")).default;let r=Zd(t);return await Promise.all(Array.from(s,(n,i)=>r(()=>e(n,i))))}return await Promise.all(Array.from(s,e))}function Qt(s){return new Promise((e,t)=>{s((r,n)=>r?t(r):e(n))})}var em,Qd,Zd,Ac=E(()=>{"use strict";em=require("timers/promises");Y();oe();Qd=!1});var Ks,tm,bw,zs,rm,Tw,ww,sm,nm=E(()=>{"use strict";Ks=I(require("lodash"));oe();tm=require("dns");$();Ac();bw=P("http-request-counters"),zs=!1,rm=async()=>{if(We)return!0;let s=["www.google.com","www.facebook.com","www.microsoft.com","testim.io"];try{let e=Boolean(await se(s,t=>tm.promises.lookup(t)));return e||(zs=!0),e}catch{return bw.error("network connectivity test failed"),zs=!0,!1}},Tw=Ks.throttle(rm,10*1e3),ww=60*1e3*15,sm=()=>{let s={call:new Map,success:new Map,fail:new Map};function e(n,i){let o=n.get(i)||0;n.set(i,o+1),setTimeout(()=>{let a=n.get(i)||1;n.set(i,a-1)},ww)}function t(n,i=n.name){return async function(...o){e(s.call,i);try{let a=await n.call(null,...o);return e(s.success,i),a}catch(a){throw e(s.fail,i),zs||Tw(),a}}}async function r(){if(zs||!await rm())return!1;let n=Ks.sum([...s.fail.values()]),i=Ks.sum([...s.call.values()]);return n<i*.1}return r.counters=s,t.counters=s,t.isNetworkHealthy=r,t.didNetworkConnectivityTestFail=()=>zs,t}});var Ke={};z(Ke,{deleteReq:()=>Js,didNetworkConnectivityTestFail:()=>Dc,download:()=>_c,get:()=>Te,getFullRes:()=>Rw,getText:()=>Ys,head:()=>xw,isNetworkHealthy:()=>Lc,post:()=>Ve,postForm:()=>Xs,postText:()=>kc,put:()=>Oc});function Sw(){return global.caFileContent}function Ew(s,e){let t=[];s.on("data",r=>{t.push(r)}),s.on("end",()=>{e(null,Buffer.concat(t))})}function Iw(){return!ht.default.Request.prototype.proxy&&global.SuperagentProxy&&global.SuperagentProxy(ht.default),global.proxyUri}function yr(s,e=!1){let t=Sw();t&&s.ca(t);let r=!e&&Iw();r&&s.proxy(r)}async function im(s,e,t={},r=Jr,n=0){let i=ht.default.post(s).send(e).timeout(r).set(t);yr(i),n&&i.retry(n);try{return await i}catch(o){throw o.url=s,o.originalRequestTimeout=r,o.additionalSetHeaders=t,o}}async function Pc(s,e,t={},r=Jr,{isBinary:n=!1,skipProxy:i=!1}={}){let o=ht.default.get(s).query(e||{}).timeout(r).set(t);return n&&o.buffer(!0),yr(o,i),await o}var ht,Cc,it,Jr,vw,Bt,Js,Ve,Xs,Ys,kc,Te,Rw,xw,Oc,_c,Lc,Dc,Ge=E(()=>{"use strict";ht=I(require("superagent"));$();nm();Cc=P("http-request"),it=sm(),Jr=parseInt(process.env.DEFAULT_REQUEST_TIMEOUT||"0",10)||3e4,vw=6e4;Bt=(s,e,t)=>{let r=e.response;e.response instanceof ht.default.Response&&typeof r.toError=="function"&&(e=e.response.toError(),e.requestHeaders=r==null?void 0:r.header,e.responseHeaders=r==null?void 0:r.headers);let n=new Error("").stack;throw Cc.error(s,{...t,error:e,logErrorAndRethrowStack:n}),e};Js=it(async(s,e={},t={},r=Jr)=>{try{let n=ht.default.delete(s).send(e).timeout(r).set(t);yr(n);let i=await n;return i.type==="text/plain"?i.text:i.body}catch(n){return Bt("failed to delete request",n,{url:s})}}),Ve=it(async({url:s,body:e,headers:t,timeout:r,retry:n})=>{try{let i=await im(s,e,t,r,n);return i.type==="text/plain"?i.text:i.body}catch(i){return Bt("failed to post request",i,{url:s})}});Xs=it(async(s,e,t,r={},n=Jr)=>{let i=ht.default.post(s).type("form").timeout(n).set(r);i.field(e),Object.entries(t).forEach(([o,a])=>{i.attach(o,a.buffer,a.fileName)}),yr(i);try{let o=await i;return o.type==="text/plain"?o.text:o.body}catch(o){return Bt("failed to post request",o,{url:s})}});Ys=it(async(s,e,t)=>{try{return(await Pc(s,e,t)).text}catch(r){return Bt("failed to getText request",r,{url:s,query:e})}}),kc=it(async({url:s,body:e,headers:t,timeout:r,retry:n})=>{try{return(await im(s,e,t,r,n)).text}catch(i){return Bt("failed to post request",i,{url:s})}}),Te=it(async(s,e,t,r,n)=>{try{return(await Pc(s,e,t,r,n)).body}catch(i){return Bt("failed to get request",i,{url:s,query:e})}}),Rw=it((s,e,t,r)=>Pc(s,e,t,r)),xw=it(async s=>{let e=ht.default.head(s).timeout(Jr);yr(e);try{return await e}catch(t){return Bt("failed to head request",t,{url:s})}}),Oc=it(async(s,e,t={},r=Jr)=>{let n=ht.default.put(s).send(e).timeout(r).set(t);yr(n);try{return(await n).body}catch(i){return Bt("failed to put request",i,{url:s})}}),_c=it(async s=>{Cc.info("start to download",{url:s});let e=ht.default.get(s).set("User-Agent","Testim.io").timeout(vw).buffer(!0).parse(Ew);yr(e);try{let t=await e;return Cc.info("finished to download",{url:s}),t}catch(t){return Bt("failed to download",t,{url:s})}}),Lc=it.isNetworkHealthy,Dc=it.didNetworkConnectivityTestFail});function yt(){let s;return require.main?(require.main.filename.includes("/src")||require.main.filename.includes("\\src")?s=jt.resolve(__dirname,"../../"):s=jt.resolve(__dirname,""),s):process.cwd()}function Pi(s,e){return De(s)?e||jt.join(process.cwd(),s.replace(/^.*[\\/]/,"")):e||jt.basename(s)}function st(){try{return require(`${__dirname}/package.json`).version}catch{return""}}function Fc(){try{return Sd.node}catch{return""}}async function cm(s,e,t=!0){let r=await ot.promises.readdir(s,{withFileTypes:!0});await ot.promises.mkdir(e,{recursive:t});for(let n of r){let i=jt.join(s,n.name),o=jt.join(e,n.name);n.isDirectory()?await cm(i,o):await ot.promises.copyFile(i,o)}}async function ye(s){try{return await ot.promises.access(s),!0}catch(e){if(e.code==="ENOENT")return!1;throw e}}var jt,om,am,ot,Aw,$t,Je,ki,Nc,at,Mc,lm=E(()=>{"use strict";jt=I(require("node:path"));fc();bi();om=I(require("unzip-stream")),am=I(require("p-retry")),ot=require("node:fs"),Aw=3;$t=async s=>{let e=await Promise.resolve().then(()=>(Ge(),Ke));return(0,am.default)(()=>e.download(s),{retries:Aw,factor:1})},Je=async(s,e)=>{let t=await $t(s);return ot.promises.writeFile(e,t.body)};ki=async(s,e)=>{let t=Pi(s,e);return De(s)?Je(s,t):ot.promises.copyFile(s,t)},Nc=async s=>De(s)?$t(s):ot.promises.readFile(s),at=async(s,e)=>(0,ot.createReadStream)(s).pipe(om.Extract({path:e})),Mc=s=>(0,ot.statSync)(s).size/1e6});var Wt={};z(Wt,{APPIUM_SESSION_MESSAGE:()=>Wc,CLI_MODE:()=>K,MOBILE_APP_SOURCE:()=>Oi,MOBILE_RUN_SKIP_REASON:()=>$c,REGION_CONFIG:()=>Yr,X_HEADER_RUNNER_ID:()=>Vc,gridMessages:()=>bt,gridTypes:()=>_,mobileWeb:()=>Bc,runnerStatus:()=>Uc,runnerTestStatus:()=>fe,socketEventTypes:()=>Pt,stepResult:()=>Xr,test:()=>jc,testRunStatus:()=>Qs,testStatus:()=>Xe,timeoutMessages:()=>Ae});var Ae,Qs,Uc,fe,Xe,bt,Bc,jc,Pt,K,_,Xr,Oi,$c,Wc,Vc,Yr,ae=E(()=>{"use strict";Ae={GET_BROWSER_TIMEOUT_MSG:"get-browser-timeout",TEST_START_TIMEOUT_MSG:"test-start-timeout",TEST_COMPLETE_TIMEOUT_MSG:"test-complete-timeout",TEST_REACHED_CUSTOM_TIMEOUT_MSG:"test-reached-custom-timeout"},Qs={COMPLETED:"completed"},Uc={RUNNING:"RUNNING",SKIPPED:"SKIPPED",FINISHED:"FINISHED",ABORTED:"ABORTED",QUEUED:"QUEUED",TIMEOUT:"TIMEOUT"},fe={PASSED:"PASSED",FAILED:"FAILED",ABORTED:"ABORTED",SKIPPED:"SKIPPED",QUEUED:"QUEUED",PENDING:"PENDING"},Xe={DRAFT:"draft",EVALUATING:"evaluating",ACTIVE:"active",QUARANTINE:"quarantine"},bt={NOT_FOUND:"The specified grid is not available",UNKNOWN:"Test couldn't get browser - unknown error"},Bc={MOBILE_WEB_REMOTE_RUN_HEADER_SPACING:50},jc={HIDDEN_PARAM:"TST_HIDDEN_PARAM"},Pt={TEST_RESULT_CREATED:"test-result-created",TEST_RESULT_UPDATED:"test-result-updated",REMOTE_STEP_SAVED:"remote-step-saved"},K={EXTENSION:"extension",SELENIUM:"selenium",APPIUM:"appium"},_={TESTIM_ENTERPRISE:"testimEnterprise",TESTIM:"testim",TESTIM_PRIVATE:"testimPrivate",LAMBDATEST:"lambdaTest",TESTIM_LAMBDATEST:"testimLambdaTest",DEVICE_FARM:"testimDF",HYBRID:"testimHybrid",BROWSERSTACK:"browserstack",SAUCELABS:"saucelabs",TESTIM_HEADSPIN:"testimHeadspin",TESTIM_TDC:"testimTDC",TESTIM_TVC:"testimTVC",P_CLOUDY:"pcloudy"},Xr={SETUP_TIMEOUT:"setup-timeout",NETWORK_ERROR:"network-error",GRID_ERROR:"grid-error",SELENIUM_ERROR:"selenium-error",BROWSER_CLOSED:"browser-closed",MOBILE_SESSION_ERROR:"mobile-session-error",UNKNOWN_ERROR:"unknown-error",KEEP_ALIVE_FAILED:"keep-alive-failed"},Oi={FROM_LIBRARY:"from-library",FROM_DEVICE:"from-device"},$c={APP_FROM_DEVICE:"app-from-device",VIRTUAL_BUILD:"virtual-build"},Wc={APP_NOT_EXIST_ON_DEVICE:"used to start the app doesn't exist or cannot be launched",APP_NEVER_STARTED:"never started",DEVICE_OS_VERSION_TOO_LOW:"DeviceOSVersionTooLow",TIMEOUT_ERROR:"Timeout awaiting 'request'",SAUCELABS_APP_IS_NOT_INSTALLED:"Original error: 'app' option is required for reinstall"},Vc="X-Testim-Runner-ID",Yr={TTL:1e3*60*60*24,CACHE_FN_NAME:"setRegionConfig"}});function Zs(s,e){var t,r,n,i,o,a;return(t=s.browserstack)!=null&&t.browserName||(r=s.saucelabs)!=null&&r.browserName?[(n=s.browser)==null?void 0:n.toLowerCase()]:(i=s.testConfigNames)!=null&&i.length||(o=s.testConfigIds)!=null&&o.length||s.testPlan.length||s.testPlanIds.length||!s.browser?[...new Set(e.map(c=>{var l;return(l=c.runConfig)==null?void 0:l.browserValue}))]:[(a=s.browser)==null?void 0:a.toLowerCase()]}function Cw(){let{argv:s}=process;if(s.includes("--remoteRunId"))return{remoteRunId:s[s.indexOf("--remoteRunId")+1],projectId:s[s.indexOf("--project")+1],token:s[s.indexOf("--token")+1]}}var en,um,Ye,Pw,kw,Ow,_w,Lw,Gc,Hc,pm=E(()=>{"use strict";ae();en=s=>{var e,t;return Boolean(((e=s.testPlan)==null?void 0:e.length)||((t=s.testPlanIds)==null?void 0:t.length))},um=s=>Boolean(s.resultId&&s.source==="remote-run"),Ye=(s,e)=>s.testStatus===Xe.QUARANTINE&&!um(e)&&!e.runQuarantinedTests;Pw=s=>Boolean(s.loginMode),kw=s=>Boolean(s.tunnelOnlyMode),Ow=s=>Boolean(s.createPrefechedData),_w=s=>Boolean(s.installLazyDepsMode),Lw=s=>Boolean(s.agentMode),Gc=(s,e)=>{s.forEach((t,r)=>{e.has(t)&&(s[r]=`--${t}`)})},Hc=s=>{let e=[];return Object.entries(s).forEach(([t,r])=>{r&&e.push(`--${t}`,r)}),e}});function Li(s=0){return _i.default.duration(s).format("HH:mm:ss.SSS")}function qc(s=0){return _i.default.duration(s).asSeconds()}var _i,dm,zc,mm=E(()=>{"use strict";_i=I(require("dayjs")),dm=I(require("dayjs/plugin/duration"));_i.default.extend(dm.default);zc=s=>{let e=Math.floor(s.asMinutes()),t=s.asSeconds()%60||0;return e>0?`${e} min ${Math.floor(t)} sec`:`${Math.floor(t)} sec`}});var tn,Qr,Zt,fm,Zr,gm=E(()=>{"use strict";ae();tn=s=>!(!s||"fileName"in s),Qr=(s,e)=>{if(e===_.TESTIM_TVC)return!1;if(s){if(s.appMetadata&&"iOSSupportedTargetDevice"in s.appMetadata)return s.appMetadata.iOSSupportedTargetDevice==="virtual";if("fileName"in s)return s.fileName.endsWith(".app")}return!1},Zt=s=>{var e,t;return((e=s.projectData)==null?void 0:e.type)==="ios"||((t=s.projectData)==null?void 0:t.type)==="android"},fm=s=>s===_.TESTIM_TVC,Zr=(s,e)=>fm(e)||!s.flags.allowAppFromDeviceRuns.isEnabled()});function Kc(s=4e3){let e=process.memoryUsage(),t=r=>Math.round(r/1024/1024*100)/100;return{isOverThreshold:t(e.rss)>s,rss:`${t(e.rss)} MB -> Resident Set Size - total memory allocated for the process execution`,heapTotal:`${t(e.heapTotal)} MB -> total size of the allocated heap`,heapUsed:`${t(e.heapUsed)} MB -> actual memory used during the execution`,external:`${t(e.external)} MB -> V8 external memory`}}var hm=E(()=>{"use strict"});var X={};z(X,{OSS:()=>es,TESTIM_BROWSER_DIR:()=>Vt,buildBasicHeader:()=>mc,calcPercentile:()=>Mi,copyDir:()=>cm,delay:()=>pe,doesPathExist:()=>ye,download:()=>$t,downloadAndSave:()=>Je,extractElementId:()=>Ne,formatTimeoutDuration:()=>zc,getArgsOnRemoteRunFailure:()=>Cw,getBrowserInfo:()=>Nw,getCdpAddressForHost:()=>wr,getCliLocation:()=>yt,getDuration:()=>Li,getDurationSec:()=>qc,getEnginesVersion:()=>Fc,getEnvironmentGitBranch:()=>Tr,getLinksFromUnescapeHTML:()=>nn,getLocalFileSizeInMB:()=>Mc,getMemorySnapshot:()=>Kc,getPlanType:()=>Ni,getRunConfigByBrowserName:()=>rn,getRunnerVersion:()=>st,getSource:()=>ki,getSourceAsBuffer:()=>Nc,getSourcePath:()=>Pi,getTestUrl:()=>ze,getUniqBrowsers:()=>Zs,groupTestsByRetries:()=>Xc,guid:()=>re,hasTestPlanFlag:()=>en,isAgentMode:()=>Lw,isAppFromDevice:()=>tn,isAppFromDeviceDisabled:()=>Zr,isCreatePrefetchedDataMode:()=>Ow,isInstallLazyDepsMode:()=>_w,isLoginMode:()=>Pw,isMobileProject:()=>Zt,isPromise:()=>Rc,isQuarantineAndNotRemoteRun:()=>Ye,isRemoteRun:()=>um,isTestimVirtualGrid:()=>fm,isTunnelOnlyMode:()=>kw,isURL:()=>De,promiseAbort:()=>xc,promiseFromCallback:()=>Qt,promiseMap:()=>se,promiseTimeout:()=>le,removePropertyFromObject:()=>Di,replaceArgsWithNoDashes:()=>Gc,sanitizeNumberValue:()=>br,shouldBlockVirtualIosBuild:()=>Qr,spreadObjectToArgs:()=>Hc,unescapeHTML:()=>sn,unzipFile:()=>at});function br(s,e){let t=Number(s);return Number.isNaN(t)||t<=0?e:t}function Nw(s){return s=s.toLowerCase(),Jc.find(e=>e.browserValue===s)}function rn(s,e,t){s=s==null?void 0:s.toLowerCase();let r=Jc.find(i=>i.browserName.toLowerCase()===s||s.includes(i.synonyms))||Jc[0],n=es.find(i=>i.osName==="Windows 10");return e&&(e.platform?n=es.find(i=>i.sl.platform===e.platform):e.platformName&&(n=es.find(i=>i.sl.platformName===e.platformName))),t&&(t.os_version?n=es.find(i=>i.bs.os_version===t.os_version):t.platform&&(n=es.find(i=>i.bs.platform===t.platform))),ts.merge(r,n)}function Tr(){return process.env.GIT_BRANCH||process.env.CIRCLE_BRANCH||process.env.TRAVIS_BRANCH||process.env.CI_BRANCH}function Di(s,e,t){for(let r in s)Object.hasOwn(s,r)&&(t(r,e)?delete s[r]:typeof s[r]=="object"&&Di(s[r],e,t))}function Ne(s){return s.ELEMENT||s[Jt]}function Ni(s){s||={};let e=Date.now(),t=s.expireAt||s.expireAT;return s.plan!=="free"?"pro":t?t<e?"free":"trial":"free"}function Xc(s=[]){return ts.chain(s).groupBy(e=>e.originalTestResultId||e.resultId).values().reduce((e,t)=>{if(!t)return e;if(t.length===1)return e.push(t[0]),e;let r=t.slice().sort((i,o)=>{let a=typeof i.retryCount=="number"?i.retryCount:1,c=typeof o.retryCount=="number"?o.retryCount:1;return a===c?i.startTime-o.startTime:(i.retryCount??0)-(o.retryCount??0)}),n=ts.cloneDeep(r.at(-1));return n&&(n.retryTestResults=r,e.push(n)),e},[]).compact().value()}function sn(s){return vm.parseFromString(`<html><body>${s}</body></html>`,"text/html").documentElement.textContent}function nn(s){return[...vm.parseFromString(`<html><body>${s}</body></html>`,"text/html").getElementsByTagName("a")].map(t=>t.href).filter(Boolean)}async function wr(s,e){let t=await Promise.resolve().then(()=>(Ge(),Ke));try{return(await t.get(`http://${s}/json/version`,void 0,void 0,e)).webSocketDebuggerUrl}catch{throw new Error("unable to connect to devtools server")}}var bm,ts,Tm,wm,Dw,Vt,ym,es,Jc,Mi,vm,B=E(()=>{"use strict";bm=I(require("os")),ts=I(require("lodash")),Tm=I(require("path")),wm=require("linkedom");Hr();lm();pm();mm();fc();Ac();gm();hm();Dw=bm.homedir(),Vt=Tm.join(Dw,".testim-browser-profile"),ym="133",es=[{osName:"Linux",bs:{os:"LINUX"},sl:{platform:"Linux"},lt:{platform:"Linux"}},{osName:"Windows 11",bs:{os:"WINDOWS",os_version:"11"},sl:{platform:"Windows 11"},lt:{platform:"Windows 11"}},{osName:"Windows 10",bs:{os:"WINDOWS",os_version:"10"},sl:{platform:"Windows 10"},lt:{platform:"Windows 10"}},{osName:"Windows 8",bs:{os:"WINDOWS",os_version:"8"},sl:{platform:"Windows 8"}},{osName:"Windows 8.1",bs:{os:"WINDOWS",os_version:"8.1"},sl:{platform:"Windows 8.1"}},{osName:"Windows 7",bs:{os:"WINDOWS",os_version:"7"},sl:{platform:"Windows 7"}},{osName:"Windows XP",bs:{os:"WINDOWS",os_version:"XP"},sl:{platform:"Windows XP"}},{osName:"macOS Sonoma",bs:{os:"OS X",os_version:"Sonoma",safari_version:"17"},sl:{},lt:{platform:"macOS Sonoma",safari_version:"17"}},{osName:"macOS Ventura",bs:{os:"OS X",os_version:"Ventura",safari_version:"16.5"},sl:{platform:"macOS 13",safari_version:"latest"},lt:{platform:"macOS Ventura",safari_version:"16"}},{osName:"macOS Monterey",bs:{os:"OS X",os_version:"Monterey",safari_version:"15.6"},sl:{platform:"macOS 12",safari_version:"latest"},lt:{platform:"macOS Monterey",safari_version:"15"}},{osName:"macOS Big Sur",bs:{os:"OS X",os_version:"Big Sur",safari_version:"14.1"},sl:{platform:"macOS 11",safari_version:"latest"}},{osName:"macOS Catalina",bs:{os:"OS X",os_version:"Catalina",safari_version:"13.1"},sl:{platform:"macOS 10.15",safari_version:"latest"}},{osName:"macOS Mojave",bs:{os:"OS X",os_version:"Mojave",safari_version:"12.1"},sl:{platform:"macOS 10.14",safari_version:"latest"}},{osName:"macOS High Sierra",bs:{os:"OS X",os_version:"High Sierra",safari_version:"11.1"},sl:{platform:"macOS 10.13",safari_version:"latest"}},{osName:"macOS Sierra",bs:{os:"OS X",os_version:"Sierra",safari_version:"10.1"},sl:{platform:"macOS 10.12",safari_version:"latest"}},{osName:"OS X El Capitan",bs:{os:"OS X",os_version:"El Capitan",safari_version:"9.1"},sl:{platform:"OS X 10.11",safari_version:"latest"}},{osName:"OS X Yosemite",bs:{os:"OS X",os_version:"Yosemite",safari_version:"8"},sl:{platform:"OS X 10.10",safari_version:"latest"}},{osName:"OS X Mavericks",bs:{os:"OS X",os_version:"Mavericks",safari_version:"7.1"},sl:{platform:"OS X 10.9",safari_version:"latest"}},{osName:"OS X Mountain Lion",bs:{os:"OS X",os_version:"Mountain Lion",safari_version:"6.2"},sl:{platform:"OS X 10.8",safari_version:"latest"}},{osName:"OS X Lion",bs:{os:"OS X",os_version:"Lion",safari_version:"6"},sl:{}},{osName:"OS X Snow Leopard",bs:{os:"OS X",os_version:"Snow Leopard",safari_version:"5.1"},sl:{}},{osName:"iOS",bs:{platform:"MAC"},sl:{platformName:"iOS",appiumVersion:"1.6.4"}},{osName:"Android",bs:{platform:"ANDROID"},sl:{platformName:"Android",appiumVersion:"1.6.4"}}],Jc=[{browserName:"Chrome",bs:{browser:"Chrome",browser_version:ym},sl:{browserName:"chrome",version:"94.0"},browserValue:"chrome"},{browserName:"Firefox",bs:{browser:"Firefox",browser_version:"89"},sl:{browserName:"firefox",version:"89.0"},browserValue:"firefox"},{browserName:"Safari",bs:{browser:"Safari"},sl:{browserName:"safari"},browserValue:"safari"},{browserName:"Edge Chromium",bs:{browser:"Edge",browser_version:ym},sl:{browserName:"MicrosoftEdge",version:"94"},synonyms:["edge-chromium"],browserValue:"edge-chromium",seleniumName:"MicrosoftEdge"},{browserName:"Browser",bs:{},sl:{browserName:"Browser"},browserValue:"browser"},{browserName:"Android",bs:{browserName:"android"},sl:{},browserValue:"android"},{browserName:"iPad",bs:{browserName:"iPad"},sl:{},browserValue:"ipad"},{browserName:"iPhone",bs:{browserName:"iPhone"},sl:{},browserValue:"iphone"}];Mi=(s,e)=>{if(s.length===0)return 0;if(typeof e!="number")throw new TypeError("p must be a number");if(s=[...s].sort((r,n)=>r-n),e<=0)return s[0];if(e>=100)return s.at(-1);let t=Math.ceil(s.length*(e/100))-1;return s[t]};vm=new wm.DOMParser});var Yc={};z(Yc,{$schema:()=>Mw,default:()=>$w,definitions:()=>Fw,properties:()=>jw,required:()=>Bw,type:()=>Uw});var Mw,Fw,Uw,Bw,jw,$w,Sm=E(()=>{Mw="http://json-schema.org/draft-07/schema#",Fw={request:{type:"object",required:["url"],additionalProperties:!1,properties:{url:{type:"string"},method:{type:"string",pattern:"^GET$|^HEAD$|^POST$|^PUT$|^DELETE$|^CONNECT$|^OPTIONS$|^TRACE$|^PATCH$"}}},header:{type:"object",required:["name","value"],additionalProperties:!1,properties:{name:{type:"string"},value:{type:"string"}}},cookie:{type:"object",required:["name","value"],additionalProperties:!1,properties:{name:{type:"string"},value:{type:"string"},path:{type:"string"},domain:{type:"string"},expires:{type:"string",format:"date-time"},httpOnly:{type:"boolean"},secure:{type:"boolean"}}},response:{type:"object",required:["status"],additionalProperties:!1,properties:{status:{type:"integer",minimum:100,exclusiveMaximum:600},headers:{type:"array",items:{$ref:"#/definitions/header"}},cookies:{type:"array",items:{$ref:"#/definitions/cookie"}},content:{type:"object",required:["text"],additionalProperties:!1,properties:{text:{type:"string"}}}}},redirectResponse:{type:"object",required:["redirectUrl"],additionalProperties:!1,properties:{redirectUrl:{type:"string"}}},passthroughResponse:{type:"object",required:["passthrough"],additionalProperties:!1,properties:{passthrough:{type:"boolean",enum:[!0]}}},entry:{type:"object",required:["request","response"],additionalProperties:!1,properties:{request:{$ref:"#/definitions/request"},response:{oneOf:[{$ref:"#/definitions/response"},{$ref:"#/definitions/redirectResponse"},{$ref:"#/definitions/passthroughResponse"}]},maxHits:{type:"integer",minimum:1}}}},Uw="object",Bw=["entries"],jw={version:{type:"string",enum:["1.2","1.2.0"]},creator:{type:"string"},entries:{type:"array",items:{$ref:"#/definitions/entry"}}},$w={$schema:Mw,definitions:Fw,type:Uw,required:Bw,properties:jw}});async function Pm(){try{return await le(Fi.promises.readFile($i()).then(async s=>{let e=await Cm;return Gw(e,s)}),3e4)}catch{return{}}}function Gw(s,e){let t=e.slice(0,16),r=e.slice(16),n=Buffer.from(s),i=ss.createDecipheriv("aes-256-cbc",Buffer.concat([n,Buffer.alloc(32)],32),t),o=i.update(r);return JSON.parse(Buffer.concat([o,i.final()]))}function kt(s,e,t=Ww,r=void 0){return async()=>{if(!Rm)return await s();let n=e;r&&(e+=JSON.stringify(r));let i=await Zc(e);if(i)return on.debug("cache hit:",{fnName:e}),i;if(on.debug("cache miss:",{fnName:e}),!xm)throw new Error(`Attempted to rebuild cache for ${n}. cache miss is not allowed with current run configuration`);let o=await s();return o&&await Hw(e,o,t),o}}async function Zc(s){let t=(await Wi)[s];if(!t)return;let{value:r,expiry:n}=t;if(!(n<Date.now())&&r)return r}async function Hw(s,e,t){if(Qc)throw on.error("calling set after waitForSave is not allowed",{key:s,ttl:t}),new Error("calling set after waitForSave is not allowed");try{let r=await Wi;r[s]={value:e,expiry:Date.now()+t},Am=new Promise(n=>{ji=n}),Vw(r)}catch{on.error("failed updating cache")}}async function ns(){let s=await Wi;Object.keys(s).forEach(e=>{delete s[e]})}function km(s){Rm=s}function qw(s=!0){xm=s}async function Om(){try{return Qc=!0,await Am}finally{Qc=!1}}function _m(s){Bi=s,Wi=Pm()}var Fi,Ui,ss,Em,on,Bi,Im,ji,Rm,xm,Qc,Am,Cm,Ww,$i,Wi,Vw,Lm,Dm,Ix,Nm,er=E(()=>{"use strict";Fi=I(require("fs")),Ui=I(require("path")),ss=I(require("crypto"));B();Em=require("lodash");$();on=P("local cache"),Bi=Ui.resolve(yt(),"testim-cache"),Rm=!0,xm=!0,Qc=!1,Am=new Promise(s=>{ji=s}),Cm=new Promise(s=>{Im=s}),Ww=1e3*60*60*3,$i=()=>Ui.resolve(Ui.resolve(Bi,"testim.cache"));Wi=Pm(),Vw=(0,Em.debounce)(async s=>{let e;try{let t=await Cm,r=ss.randomBytes(16),n=JSON.stringify(s),i=Buffer.from(t),o=ss.createCipheriv("aes-256-cbc",Buffer.concat([i,Buffer.alloc(32)],32),r),a=Buffer.concat([r,o.update(n),o.final()]);await ye(Bi)||await Fi.promises.mkdir(Bi,{recursive:!0}),await Fi.promises.writeFile($i(),a)}catch(t){on.error("failed saving cache",{err:t}),e=t}ji(e?{success:!1,error:e}:{success:!0})},200);Lm=Im,Dm=km.bind(void 0,!1),Ix=km.bind(void 0,!0),Nm=()=>qw(!1)});function Vi(){return{cliLocation:yt(),userInfo:is.userInfo(),platform:is.platform(),release:is.release()}}var is,el=E(()=>{"use strict";is=I(require("node:os"));B()});function zw(s){try{return Gi.resolve(Gi.dirname(require.resolve(`${s}/package.json`)),require(`${s}/package.json`).main||"")}catch(e){if(e.code==="ERR_PACKAGE_PATH_NOT_EXPORTED")return require.resolve(s);throw e}}function tr(s){let e=zw(s);return require(e)}var Gi,an=E(()=>{"use strict";Gi=I(require("path"))});function Kw(s){let t=/EACCES[^']+'(.+)'/.exec(s);return t===null?!1:t[1]}function Jw(s){return/The "to" argument must be of type string./.exec(s)}function Bm(s,e,t){let r=Kw(s),n=Jw(s);return r||n?(Um.info("Failed to install package due to insufficient write access",{...Vi(),package:t,path:r}),console.error(`
|
|
4
4
|
|
|
5
5
|
Testim failed installing the package ${t||""} due to insufficient permissions.
|
|
6
6
|
This is probably due to an installation of @testim/testim-cli with sudo, and running it without sudo.
|
|
@@ -401,7 +401,7 @@ Please make sure the CLI has stable access to the internet. ${Dc()?"(Internal: n
|
|
|
401
401
|
`;return this.driver.executeJS(n,t.locatedElement)}async safariPreUploadActions(t){let r={width:"150px",height:"150px",left:"10px",top:"10px"};try{return await this.forceInputToBeVisible(t,r)}catch(n){throw ba.error("failed to set input file in Safari recovery",{err:n}),n}}async uploadFilesAndForceVisibility(t,r){try{this.driver.isSafari()&&await this.safariPreUploadActions(r),await this.uploadFiles(t,r)}catch(n){let i="The element is not editable",o="The element is not focusable",a="An element command could not be completed because the element is not visible on the page.",c="element not interactable",l="element is not pointer- or keyboard interactable",m="invalid element state: Element is not currently interactable and may not be manipulated",d="Element must not be hidden, disabled or read-only",u="is not reachable by keyboard",f=n?n.message:"";if(f===m||f.startsWith(d)||f.startsWith(i)||f.startsWith(o)||f.startsWith(a)||f.includes(u)||f.includes(c)||f.includes(l)){await this.forceInputToBeVisible(r),await this.uploadFiles(t,r);return}throw ba.error("failed to set input file",{err:n}),n}}async uploadFiles(t,r){for(let n of t)await this.driver.elementIdValue(Ne(r.seleniumElement),n)}async performAction(){let t=this.getTarget(),r=O.flags.overrideAzureStorageUrl.isEnabled(),n=O.flags.downloadToBase64.isEnabled(),{sessionPlayerInit:i,context:o,step:a,stepActionUtils:c,driver:l}=this,m=await i.utils.addTokenToFileUrls(o.project.id,a.fileUrls,c.testimServicesApi,r,ba);if(m.length===0)throw new Error("No files urls to upload");if(n&&(m=await Promise.all(m.map(async({name:u,url:f})=>{let h=await $t(f);return{name:u,url:`data:${h.type};base64,${Buffer.from(h.body).toString("base64")}`}}))),l.isSafari()||l.isFirefox()||l.isEdgeChromium()){await this.driver.executeJS(`
|
|
402
402
|
const getLocatedElement = ${this.sessionPlayerInit.codeSnippets.getLocatedElementCode};
|
|
403
403
|
const downloadAndUploadFile = ${BE()};
|
|
404
|
-
return downloadAndUploadFile.apply(null, arguments);`,t.locatedElement,m);return}let d=await Dy(m,this.uploadFile);await this.uploadFilesAndForceVisibility(d,t)}}});var wa,va,Fy=E(()=>{"use strict";wa=require("url");me();va=class extends H{async updateBaseUrl(e){let t=new wa.URL(e),r=new wa.URL(this.context.recordedBaseUrl),n=new wa.URL(this.context.baseUrl);return t.host===r.host&&r.host!==n.host&&(t.host=n.host),t.href}async performAction(){let e=this.context.data.testimNavigationStepDestination||this.context.data.url;if(this.step.openInNewTab){await this.driver.client.newWindow(e);return}let t=await this.updateBaseUrl(e);await this.driver.url(t)}}});var Sa,Uy=E(()=>{"use strict";me();B();Sa=class extends H{async performAction(){await pe(this.step.durationMS||0)}}});var Ea,By=E(()=>{"use strict";me();Ea=class extends H{async execute(){try{return await this.driver.reloadTab(),{success:!0}}catch(e){return{success:!1,reason:e.message}}}}});var Zn,jy=E(()=>{"use strict";me();Zn=class extends H{async runApiInAut(e){var n;e.withCredentials=!0;let t=this.context.data.timeToPlayStep+3e3,{apiCall:r}=this.sessionPlayerInit;try{let i=await this.driver.executeCodeAsync(r,t,e);return(i==null?void 0:i.value)||{}}catch(i){throw(n=i==null?void 0:i.message)!=null&&n.includes("Javascript execution context no longer exists")?new Error('The page refreshed or changed while executing this step. Please consider unchecking "Send via web page" if this is expected.'):i}}runApiInBg(e){let{apiCall:t}=this.sessionPlayerInit;return t(e)}async performAction(){let{sessionPlayerInit:{commonConstants:e},step:t,context:r}=this,n={id:t.id,url:r.apiUrl,method:t.method,headers:r.apiHeaders,body:r.apiBody,timeout:r.data.maxTotalStepTime,omitCookies:t.omitCookies,forceUseFetch:["android","ios"].includes(r.project.type),formData:t.formData,fileUrls:r.fileUrls},i=t.sendViaWebApp?await this.runApiInAut(n):await this.runApiInBg(n),o=i.result||{},a={method:t.method,status:o.status,url:t.url};return i.success?o.status===0?{result:o,resultInfo:a,shouldRetry:!1,success:!1,reason:"Connection problem",errorType:e.stepResult.API_REQUEST_NETWORK_ERROR}:{result:o,resultInfo:a,shouldRetry:!1,success:!0}:{result:o,resultInfo:a,shouldRetry:!1,success:!1,reason:o.error||e.error.REQUEST_TIMED_OUT,errorType:o.exception?void 0:o.error?e.stepResult.API_FAILURE:e.stepResult.API_REQUEST_NETWORK_ERROR}}}});var Ia,$y=E(()=>{"use strict";me();Ia=class extends H{async performAction(){let e=this.step.extractTextParamName,t=await this.stepActionUtils.extractTargetText(this.getTarget());return this.context.data.exports||={},this.context.data.exports[e]=t,{success:!0,data:this.context.data}}}});var Wy,Ju,Xu,Vy=E(()=>{"use strict";Wy=I(require("@applitools/spec-driver-webdriverio"));bi();we();Ju=class{constructor(){let{EyeSdkBuilder:e}=Z(),t=vd["@applitools/eyes-sdk-core"]||"N/A",{makeSDK:r}=require("@applitools/eyes-sdk-core");this.sdk=r({name:"Testim.io",version:`4.0.1/eyes-sdk-core/${t}`,spec:Wy.default}),this.handleApplitoolsSdkResult=e.handleApplitoolsSdkResult}async getManager(e,t,r,n){let{EyeSdkBuilder:i}=Z(),o=await this.sdk.makeManager({type:e?"ufg":"classic",concurrency:t});return i.rememberCreatedBatch(r,n),o}},Xu=new Ju});var Hy,Gy,ei,qy=E(()=>{"use strict";Hy=I(require("lodash"));me();$();Vy();Gy=P("pixel-validation-step-action"),ei=class extends H{async performAction(){var d,u;let{shouldUseVisualGrid:t,applitoolsSdkConfig:r,applitoolsSdkLogger:n,testResultId:i}=this.context;this.runContext=this.context.getRunContext(void 0);let o=((d=this.runContext.incomingParams)==null?void 0:d.final)||{},a=((u=r.batch)==null?void 0:u.id)||i,c=await Xu.getManager(t,this.context.config.applitoolsConcurrency||5,a,this.runContext.applitoolsIntegrationData),l=this.getTarget()||{},m;try{let f=await c.openEyes({driver:this.driver.client,config:r,logger:n}),g={region:this.step.action==="element"&&l.seleniumElement||void 0,fully:this.step.action==="stitched"};Hy.isPlainObject(o.applitoolsStepSettings)&&(Object.assign(g,o.applitoolsStepSettings),Gy.info("Applitools SDK step executed with applitoolsStepSettings parameter",{applitoolsStepSettings:o.applitoolsStepSettings})),await f.check({settings:g}),m={isApplitoolsSdkResult:!0,success:!0,eyesResults:await f.close()}}catch(f){Gy.error("Applitools SDK step failed",{err:f,info:f.info}),m={isApplitoolsSdkResult:!0,success:!1,err:f}}return await Xu.handleApplitoolsSdkResult(this.context,m,this.step)}}});var Os,Yu=E(()=>{"use strict";Rs();Y();ua();Os=class extends cr{async executeCliCode(){var h,g,y;let{step:e,context:t}=this,r=this.stepActionUtils.driver.isMobile;if(!((y=(g=(h=t.company)==null?void 0:h.activePlan)==null?void 0:g.premiumFeatures)==null?void 0:y.cliAction)&&!r)return{success:"skipped",reason:"CLI action is not enabled in your current plan"};let{code:i="",id:o=""}=e,{incomingParams:a,testResultId:c,retryIndex:l,stepResultId:m}=t,d={config:t.config,data:t.data},u=t.data.timeToPlayStep,f=await Is(i,o,a,d,c,l,m,u);return this.checkCodeResponse(f)}async performAction(){try{return await this.executeCliCode()}catch(e){let{stepResult:t}=this.sessionPlayerInit.commonConstants;return e instanceof ce?{success:!1,errorType:t.ACTION_TIMEOUT}:{success:!1,reason:e.message,exception:e}}}}});var lr,zy=E(()=>{"use strict";Yu();lr=class extends Os{isFailedResult(e){return e===!1}}});var Ra,Ky=E(()=>{"use strict";Yu();Ra=class extends Os{isFailedResult(e){return!e}}});var xa,Jy=E(()=>{"use strict";Rs();me();Y();xa=class extends H{async performAction(){let{stepId:e,packageData:t,resultId:r,retryIndex:n,stepResultId:i,timeToPlayBeforeExec:o}=this.context;try{return{data:await Es(e,r,n,t,i,o),success:!0}}catch(a){return a instanceof Ct?{success:!1,code:"invalid-node-package",message:a.message}:a instanceof ce?{success:!1,code:"timeout"}:{success:!1,reason:a.message,exception:a}}}}});var Ur,Xy=E(()=>{"use strict";me();Ur=class extends H{async performAction(){return{success:"skipped",reason:"This step can run only in \u2018extension\u2019 run mode with either Chrome or Edge Chromium"}}}});var be,Yy=E(()=>{"use strict";me();be=class extends H{async performAction(){var r,n;let{sfdc:e}=this.sessionPlayerInit,t=e.sfdcNewSePage(this.driver,this.context.sfdcLogHandler||((i,o)=>this.context.playback.sfdcAddLog(i,o)));t.log.info(`BEGIN STEP '${(n=(r=this.step).getStepPreview)==null?void 0:n.call(r)}'`);try{let i=this.context.sfdcTestActions;if(i===void 0)throw new Error("No test actions were compiled");return{success:!0,reason:await e.sfdcExecute(t,i,this.context)}}catch(i){return{success:!1,reason:i.reason||i.message,exception:i,shouldRetry:!1}}finally{t.releaseObjects()}}}});var Aa,Qy=E(()=>{"use strict";me();Aa=class extends H{async performAction(){var r,n;let{sfdc:e}=this.sessionPlayerInit,t=e.sfdcNewSePage(this.driver,this.context.sfdcLogHandler||((i,o)=>this.context.playback.sfdcAddLog(i,o)));t.log.info(`BEGIN STEP '${(n=(r=this.step).getStepPreview)==null?void 0:n.call(r)}'`);try{return{success:!0,reason:await e.sfdcExecuteRecordedStep(t,this.step.recordedData,this.context)}}catch(i){return{success:!1,reason:i.reason||i.message,exception:i,shouldRetry:!1}}finally{t.releaseObjects()}}}});var Ca,Zy=E(()=>{"use strict";me();Ca=class extends H{async performAction(){let{sfdc:e}=this.sessionPlayerInit,t=e.sfdcNewSePage(this.driver,this.context.sfdcLogHandler);try{return await e.sfdcExecuteJavascript(t,this.step.code||"",this.context),{success:!0}}catch(r){return{success:!1,reason:r.reason||r.message,exception:r,shouldRetry:!1}}finally{t.releaseObjects()}}}});function jE(s,e){Object.keys(s).forEach(t=>{e.registerStepAction(t,s[t])})}function Pa(s,e){jE($E,e),e.registerLocateStepActionUtils(Jn.getUtils(s))}var $E,Qu=E(()=>{"use strict";Jh();Qh();ay();cy();uy();my();hy();yy();by();Ty();Sy();Ey();Iy();Ay();ky();My();Fy();Uy();By();jy();$y();qy();zy();Ky();Jy();Xy();Yy();Qy();Zy();$E={locate:Jn,scroll:ia,mouse:oa,submit:fa,text:ca,"special-key":pa,"user-code":zt,"validation-code-step":zt,"wait-for-code-step":zt,"action-code-step":zt,"condition-step":ks,"skip-code-step":ks,"element-code-step":ks,"evaluate-expression":aa,"text-validation":Yn,"wait-for-text-validation":Yn,"select-option":ma,"drop-file":ya,"input-file":Ta,hover:ga,navigation:va,wheel:ha,sleep:Sa,refresh:Ea,"keyboard-shortcut-step":da,"api-validation":Zn,"api-action":Zn,"api-code-step":zt,"extract-text":Ia,"simple-ui-verification":ei,"wait-for-simple-ui-verification":ei,"cli-validation-download-file":Ur,"cli-wait-for-download-file":Ur,"network-validation-step":Ur,"cli-validation-code-step":lr,"cli-wait-for-code-step":lr,"cli-action-code-step":lr,"cli-api-code-step":lr,"cli-condition-step":Ra,"node-package":xa,"email-code-step":zt,"cli-email-code-step":lr,"sfdc-internal-test-step":Ca,"sfdc-recorded-step":Aa,"sfdc-step-login":be,"sfdc-step-loginas":be,"sfdc-step-logout":be,"sfdc-step-sobjectcreate":be,"sfdc-step-sobjectdelete":be,"sfdc-step-findrecord":be,"sfdc-step-quickaction":be,"sfdc-step-sobjectedit":be,"sfdc-step-sobjectvalidate":be,"sfdc-step-launchapp":be,"sfdc-step-wait-for-page-load":be,"sfdc-step-closeconsoletabs":be,"sfdc-step-relatedlistaction":be,"sfdc-step-permission-validation":be,"sfdc-step-convert-lead-to-opportunity":be,"sfdc-step-quotelineeditor":be,"sfdc-document-validation":Ur,"sfdc-step-flow-screen-completion":be,"sfdc-step-sobjectverifyoptions":be}});var eb,WE,_s,Zu=E(()=>{"use strict";eb=["simple-ui-verification","wait-for-simple-ui-verification"],WE=[...eb,"custom-validation","sfdc-internal-test-step","sfdc-recorded-step","sfdc-step-login","sfdc-step-loginas","sfdc-step-logout","sfdc-step-sobjectcreate","sfdc-step-sobjectdelete","sfdc-step-findrecord","sfdc-step-quickaction","sfdc-step-sobjectvalidate","sfdc-step-launchapp","sfdc-step-wait-for-page-load","sfdc-step-closeconsoletabs","sfdc-step-sobjectedit","sfdc-step-relatedlistaction","sfdc-step-permission-validation","sfdc-step-convert-lead-to-opportunity","sfdc-step-quotelineeditor","sfdc-document-validation","sfdc-step-flow-screen-completion","sfdc-step-sobjectverifyoptions"],_s=class{constructor(e){this.isDebuggerConnected=e;this.totalStepTime=0;this.currentRetryStart=0;this.totalStepTimesReport=[];this.currentRetryTimes=[];this.currentRetryTimesReport={};this.resetStepVariables(),this.resetRetryVariables()}resetStepVariables(e,t){this.currentRetryTimes=t||[],this.totalStepTime=e||0,this.totalStepTimesReport=[],this.currentRetryTimesReport={};let r=Date.now();this.currentRetryStart=r,this.lastUpdateTime=r}resetRetryVariables(){let e=Date.now();this.currentRetryStart=e,this.lastUpdateTime=e,this.totalStepTimesReport.push(this.currentRetryTimesReport),this.currentRetryTimesReport={}}initStepRun(e){let t=i=>{let o=this.getTotalStepTimeLeftToPlay(e,i),a=5e3;return o<=a?[a]:[Math.max(a,o/3)]};e.setStartTimestamp();let r=this.getTotalStepRunTime(e),n=WE.includes(e.stepType)?[r]:t(r);this.resetStepVariables(r,n),e.context.data.maxTotalStepTime=r}initRetryTime(){this.resetRetryVariables()}getTotalStepRunTime(e){let r=e.context.config.stepTimeout;return eb.includes(e.stepType)&&(r=e.context.config.applitoolsStepTimeout||18e5),e.step.type.startsWith("sfdc-")&&(r=e.step.defaultTimeout),e.step.useStepTimeout&&e.step.stepTimeout?e.step.stepTimeout:r}getTotalStepTimeLeftToPlay(e,t=this.totalStepTime){let r=Date.now()-e.startTimestamp;return t-r}getCurrentRetryTime(e){return e.retryIndex<this.currentRetryTimes.length?this.currentRetryTimes[e.retryIndex]:this.getTotalStepTimeLeftToPlay(e)}getTotalCurrentRetryTimeLeft(e){let t=Date.now()-this.currentRetryStart;return this.getCurrentRetryTime(e)-t+1e3}getTabTimeout(e){return this.getTotalCurrentRetryTimeLeft(e)}getDynamicParentTimeout(e){return this.getTotalCurrentRetryTimeLeft(e)}getFrameTimeout(e){return this.getTotalCurrentRetryTimeLeft(e)}getLocateTimeout(e){return this.getTotalCurrentRetryTimeLeft(e)}getActionTimeout(e){if(this.isDebuggerConnected)return 6e5;let t=5e3,r=e.step.type,n=3e4;return r==="sleep"?e.step.durationMS+t:Math.max(this.getTotalStepTimeLeftToPlay(e),n)}}});var rb={};z(rb,{SeleniumTestPlayer:()=>ti});var tb,VE,ti,ep=E(()=>{"use strict";B();tb=require("@applitools/eyes-sdk-core");Bn();Y();$();Vu();Gh();zu();sa();zh();Ku();we();Qu();Zu();oe();VE=P("SeleniumTestPlayer"),ti=class{constructor(e,t,r,n,i=void 0,o=void 0){this.id=e;this.playbackTimeoutCalculator=new _s(na());let{SessionPlayer:a,commonConstants:c,StepActionFactory:l}=Z();this.driver=n??new Or;let m=new ra(this.driver);this.stepActionFactory=new l(m),Pa(this.driver,this.stepActionFactory),this.tabService=this.driver.tabService||new ea(this.driver),this.driver.tabService=this.tabService,this.tabService.createSesion(e);let d=qh(this.driver);this.sessionPlayer=new a(e,{tabService:this.tabService,cookieUtils:new Ps(this.driver),FrameLocator:d,portSelector:ta,LocateElementPlayer:null,stepActionUtils:m,stepActionFactory:this.stepActionFactory,playbackTimeoutCalculator:this.playbackTimeoutCalculator,makeSDK:tb.makeSDK}),this.sessionPlayer.setShouldMonitorPerformance(Boolean(r)),this.tabService.setAddFrameHandlerCallBack(this.sessionPlayer.addPlaybackFrameHandler.bind(this.sessionPlayer)),this.sessionPlayer.playbackManager.isRemoteSession=!0,this.sessionPlayer.playbackManager.isLocalRun=!1,this.sessionPlayer.playbackManager.testRetryCount=i,this.sessionPlayer.playbackManager.previousTestResultId=o,this.sessionPlayer.playbackManager.userParamsData=t||{},this.onStepCompleted=this.onStepCompleted.bind(this),this.sessionPlayer.playbackManager.on(c.playback.RESULT,this.onStepCompleted)}onStepCompleted(e,t,r,n){n!=null&&n.isTabOpener&&this.tabService.addNewPopup(this.id,n.id).catch(()=>null)}async onDone(){var r,n;let{commonConstants:e}=Z(),t=1e3*60*2;try{await le((r=this.driver)==null?void 0:r.end(),t)}catch(i){i instanceof ce&&await((n=this.driver)==null?void 0:n.forceEnd().catch(()=>null))}this.sessionPlayer.playbackManager.off(e.playback.RESULT,this.onStepCompleted),Object.assign(this,{sessionPlayer:null,tabService:null,stepActionFactory:null,driver:null})}clearSessionTabs(){this.tabService.clearAllTabs(this.id)}async addTab(e,t={loadInfo:!0}){let r=await this.driver.getTabIds();if(!Array.isArray(r)){VE.error("addTab: driver.getTabIds() returned a non-array",{ids:r});return}let n=r.at(-1);await this.tabService.addNewTab(this.id,n,e,t),await this.sessionPlayer.addPlaybackFrameHandler(n,void 0,{emptyPage:!0})}async addAllTabs(e,t={loadInfo:!0,checkForMainTab:!0,takeScreenshots:!0},r=[]){let n=await this.driver.getTabIds(),i=[new URL(rt||gr).hostname].concat(r);for(let o of n.reverse()){await this.tabService.addNewTab(this.id,o,e,{...t,forceSwitch:!0});let a=this.tabService.getTabInfo(this.id,o);if(i.some(c=>a.url.includes(c))){this.tabService.removeTabInfo(this.id,o);continue}await this.sessionPlayer.addPlaybackFrameHandler(o,void 0,{emptyPage:!0})}if(this.tabService.tabCount(this.id)===1){let o=this.tabService.getMainTabInfo(this.id),a=this.tabService.getTabUtils(this.id,o);await this.tabService.switchTab(a.tabId,this.id,{forceSwitch:!0})}this.tabService.fixMissingMainTab(this.id)}getSessionId(){return this.driver.getSessionId()}}});var rp={};z(rp,{WorkerSelenium:()=>tp});function HE(s){let{playback:e}=Z().commonConstants;for(let t of Object.values(e))s.playbackManager.on(t,()=>F(`Got event ${t}`))}var ka,GE,tp,sp=E(()=>{"use strict";B();$e();zn();$();Lt();Fo();ae();$u();Y();ep();we();lt();ka=P("worker-selenium"),GE=1e9,tp=class extends Nt{initPlayer(t){return new ti(this.id,t.runParams,this.options.shouldMonitorPerformance,void 0,t.retryCount,t.previousTestResultId)}async getBrowserOnce(t,r,n,i){F("in WorkerSelenium getBrowserOnce"),Q.onGetSession(this.id,this.testName,t.runMode);let{driver:o}=n;this.windowUtils=new Cs(this.id,o),n.clearSessionTabs();let{browserValue:a}=this.testRunConfig,c=t.baseUrl;try{let l=this.options.useLocalChromeDriver;await o.init({projectData:this.options.projectData,browserOptions:this.options,testName:this.testName,testRunConfig:this.testRunConfig,gridInfo:i,customExtensionLocalLocation:r,executionId:this.executionId,testResultId:this.testResultId,seleniumPerfStats:t.seleniumPerfStats,fastInit:l,lambdatestService:this.lambdatestService,printFinalCaps:this.options.printFinalCaps,mode:K.SELENIUM}),F("in WorkerSelenium after driver.init"),await n.addTab(void 0,{skipLoadInfo:l}),F("in WorkerSelenium after addTab"),l||await this.windowUtils.navigate(c,GE),await this.windowUtils.validatePageIsAvailable(),F("in WorkerSelenium after navigate")}catch(l){let m=l.message&&(l.message.startsWith("Malformed URL")||l.message.includes("Reached error page: about:neterror"))&&a==="firefox",d=l.message&&l.message==="invalid argument";throw l instanceof At||m||d?new At(`Page '${c}' is not available`):(ka.error("failed to navigate to page",{baseUrl:c,err:l,whitelistedPublicIp:Zi(),initializedFromCache:eo()}),l)}}async runTestOnce(t,r){var d;let{manifestVersion:n,localAssetService:i}=Z(),{driver:o,sessionPlayer:a}=r,c=n||"runner";Q.onWaitToTestComplete(this.id),HE(a),a.playbackManager.executionId=t.executionId,a.playbackManager.executionName=t.executionName,this.options.mode===K.SELENIUM&&a.setLightweightMode(this.options.lightweightMode),t.sfdcCredential&&a.setSfdcCredential(t.sfdcCredential),i.initialize({serverUrl:this.options.localRCASaver});let l=null;(d=this.options.lightweightMode)!=null&&d.preloadTests&&(l=(await Wn(this.options))[this.testId]);let m=async()=>le(new Promise((u,f)=>{a.playByTestId({testId:this.testId,executionId:this.executionId,resultId:this.testResultId,baseUrl:this.baseUrl,userData:this.userData,version:c,resolve:u,isLocalRun:!1,overrideTestConfigId:this.overrideTestConfigId,branch:this.branch,incognito:!1,remoteRunId:t.remoteRunId,preloadedTest:l}).catch(f)}),this.testRunTimeout,Ae.TEST_COMPLETE_TIMEOUT_MSG).catch(u=>{var f;throw u instanceof ce&&((f=a.stopPlayingOnTestTimeout)==null||f.call(a)),u}).then(async u=>{await i.drain(),u.stepsResults=null,u.resultId=this.testResultId,o.isAlive()||(ka.warn(`possible grid unresponsive for test ${this.testId}, result ${this.testResultId} (execution: ${this.executionId})`),u.gridIssues="could not validate grid is alive");let f=o.maxKeepAliveGap();f>=3e4&&(ka.warn(`possible browser keep alive issue ${this.testId}, result ${this.testResultId} (execution: ${this.executionId})`),u.keepAliveIssue=f);let g={...u,...t.seleniumPerfStats.getStats()};return this.lambdatestService.isLambdatestRun()&&await o.executeJS(`lambda-status=${g.success?"passed":"failed"}`).catch(()=>{}),g});o.start(),F("right before super.runTestOnce in workerSelenium");try{await super.runTestOnce(t,r),F("right after super.runTestOnce in workerSelenium");let u=await m();return F("right after runSeleniumTest"),u}catch(u){throw ka.error("failed to run test once",{err:u}),u}}}});var sb,nb,He,qE,zE,np,Et,Oa=E(()=>{"use strict";sb=I(require("ora")),nb=require("jimp");oe();Ge();ge();$();ae();we();de();He=P("mobile-grid-service"),qE="https://tdc.tricentis-cloud.com",zE="https://ui.headspin.io",np=class{constructor(){this.gridsAppIdGetter={[_.TESTIM_TDC]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("testimTdcAppId",t),[_.TESTIM_TVC]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("testimTvcAppId",t),[_.P_CLOUDY]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("pCloudyAppId",t),[_.TESTIM_HEADSPIN]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("headSpinAppId",t),[_.BROWSERSTACK]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("browserStackAppId",t),[_.SAUCELABS]:({testRunHandler:e,mobileApp:t,gridHost:r})=>e.getSauceLabsAppPath(r,t)}}isTdcOrHeadSpinGrid(e){return e===_.TESTIM_TDC||e===_.TESTIM_HEADSPIN}getLockDeviceApiUrl(e){let t=this.getBaseApiUrl(e);return this.isTdcOrHeadSpinGrid(e.type)?`${t}/lock`:""}getBaseApiUrl(e){let{type:t,apiUrl:r}=e;return t===_.TESTIM_HEADSPIN?`${r||bc}/${wc}/devices`:t===_.TESTIM_TDC?`${r||Tc}/${wc}/devices`:""}getHeaders(e){return{...this.isTdcOrHeadSpinGrid(e.type)&&{"Content-Type":"application/json",Authorization:`Bearer ${e.accessToken}`}}}buildRequestBody(e,t){return{...this.isTdcOrHeadSpinGrid(e.type)&&{device_id:t}}}async lockDevice(e,t){let r=this.getLockDeviceApiUrl(e),n=this.getHeaders(e),i=this.buildRequestBody(e,t);try{await Ve({url:r,headers:n,body:i})}catch(o){throw He.debug(`error while locking device ${t}`,{error:o}),o.status===401?new Error(`failed to lock device ${t}, device may be already locked and in use`):o}}async getHeadSpinDeviceConnection(e,t){let n=`${this.getBaseApiUrl(e)}/device_id:${t}/automation-config`;try{let i=await Te(n,void 0,this.getHeaders(e));return this.extractHeadSpinDeviceConnection(i,e.accessToken)}catch(i){throw He.error("error while getting automation config for device",{error:i,deviceId:t}),i}}async getPCloudyAuthToken(e,t,r){let n=await Ys(`https://${e}/api/access`,void 0,{Authorization:`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`});return JSON.parse(n).result.token}extractHeadSpinDeviceConnection(e,t){let r=Object.keys(e)[0],n=e[r].driver_url,i=new URL(n);return{hostname:i.hostname,port:Number(i.port),protocol:i.protocol.slice(0,-1),path:`/v0/${t}/wd/hub`}}async getGridDirectConnection(e,t){let r={};return this.isTdcOrHeadSpinGrid(e.type)&&(r=await this.getHeadSpinDeviceConnection(e,t)),r}getGridConnection(e){var r;if(this.isTdcOrHeadSpinGrid(e.type)){let n=(r=e.host)!=null&&r.includes("ulb.tdc.tricentis-cloud.com")?`/ulb/appium/v0/${e.accessToken}/wd/hub`:`/v0/${e.accessToken}/wd/hub`;return{protocol:e.protocol||"https",hostname:e.host,port:e.port,path:n}}if(e.type===_.TESTIM_TVC)return{protocol:e.protocol||"https",hostname:e.host,port:443,path:"/wd/hub"};if(e.type===_.P_CLOUDY)return{protocol:e.protocol||"https",hostname:e.host,port:443,path:"/appiumcloud/wd/hub",user:e.user,key:e.key};if([_.BROWSERSTACK,_.SAUCELABS].includes(e.type))return{protocol:e.protocol||"https",hostname:e.host,port:443,path:"/wd/hub",user:e.user,key:e.key}}async getDeviceNameFromSessionCaps({capabilities:e,gridType:t,projectId:r,projectType:n,companyId:i,gridId:o}){var a,c,l;if(t===_.TESTIM_HEADSPIN||t===_.TESTIM_TDC){let m=await si({projectId:r,projectType:n,companyId:i,gridId:o,selectors:`device_id:${e.udid}`});return((a=m==null?void 0:m[0])==null?void 0:a.name)||e.device}if(t===_.BROWSERSTACK)return((c=e.mobile)==null?void 0:c.version.split("-")[0])||((l=e.desired)==null?void 0:l.deviceName);if(t===_.SAUCELABS)return e.testobject_device_name;if(t===_.P_CLOUDY){if(e.pCloudy_DeviceFullName){let m=e.pCloudy_DeviceFullName.split("_");return`${m[0]} ${m[1]}`}return e.deviceModel}return e.device}async updateDeviceOnRemoteTestResult(e,t,r,n,i=!1){let{executionId:o,testId:a,testResultId:c}=e,{project:l,projectData:{type:m}={},company:{companyId:d=""}={},gridData:{gridId:u="",type:f=""}={}}=n,h=t.capabilities,g=h.platformName,y;if(f===_.TESTIM_TVC){let{getTvcDeviceInfoFromSessionCaps:v}=Z();y=v(t.capabilities,i)}else y=await this.getDeviceFromAppiumCapabilities(h,t,r,g,f,l,m,d,u,i);let T=await this.buildRemoteResultLink(n.gridData,t.sessionId,h);return await Cr(l,o,a,c,"RUNNING",{device:y,...T&&{remoteResultLink:T}}),He.info("device details updated on testResult",{testResultId:c,executionId:o,testId:a,device:y,remoteResultLink:T,gridType:f}),y}getOsVersion(e,t){var n;let r=e.platformVersion;return!r&&t===_.BROWSERSTACK?(n=e.mobile)==null?void 0:n.version.split("-")[1]:r}async getScaleFactorAndSize(e,t,r,n,i){if(e.pixelRatio&&typeof e.deviceScreenSize=="string"){let o=e.deviceScreenSize.split("x"),a=Number(o[0]),c=Number(o[1]);return{scaleFactor:e.pixelRatio,width:a,height:c}}try{let{AppiumApi:o}=Z(),a=new o(t,r.sessionId,null,i),[c,l]=await Promise.all([a.getScreenshot(),a.getDeviceSize()]),m=Buffer.from(c,"base64"),d=await nb.Jimp.fromBuffer(m),u=d.bitmap.width,f=d.bitmap.height;return{scaleFactor:u/l.width,width:u,height:f}}catch(o){return He.warn("failed to get device scale factor from appium, applying default scale factor",{err:o}),{scaleFactor:n==="android"?1:2}}}async getDeviceFromAppiumCapabilities(e,t,r,n,i,o,a,c,l,m){let[d,u]=await Promise.all([this.getScaleFactorAndSize(e,r,t,n,m),this.getDeviceNameFromSessionCaps({capabilities:e,gridType:i,projectId:o,projectType:a,companyId:c,gridId:l})]),f=this.getOsVersion(e,i);return{name:u??"",model:e.deviceModel,udid:e.udid,osVersion:f,osType:n,isVirtual:!1,...d}}async buildRemoteResultLink(e,t,r){return e.type===_.BROWSERSTACK?(await this.fetchWithUserAndPasswordAuth({url:`${Vs}/sessions/${t}.json`,user:e.user,key:e.key})).automation_session.public_url:e.type===_.SAUCELABS?r.testobject_test_report_url:e.type===_.TESTIM_TVC?r.replayUrl:e.type===_.TESTIM_HEADSPIN||e.type===_.TESTIM_TDC?`${e.type===_.TESTIM_HEADSPIN?zE:qE}/sessions/${t}/waterfall`:""}async getTmaDeviceDetails(e,t){let n=(await Te(`${e}/api/devices`)).find(i=>i.udid===t);if(!n)throw new Error(`device ${t} not found`);return{udid:n.udid,name:n.name,model:n.model,height:n.height,width:n.width,geo:"local",osVersion:n.osVersion,osType:n.deviceType.toLowerCase(),scaleFactor:n.scaleFactor??0,isVirtual:n.virtual??!1,minApiVersion:n.minApiVersion}}async updateTmaDeviceDetails(e,t,r){let{executionId:n,testId:i,testResultId:o}=r,{project:a,localTmaUrl:c}=t,l=await this.getTmaDeviceDetails(c,e);return await Cr(a,n,i,o,"RUNNING",{device:l}),He.info("device details updated on testResult",{testResultId:o,executionId:n,testId:i,device:l}),l}async getGridAppId({gridData:e,testRunHandler:t,projectId:r}){let n=e.type,i=t.mobileApp,o=this.gridsAppIdGetter[n]({testRunHandler:t,mobileApp:i,gridHost:e.host});return o?(O.flags.allowFixingAppIdStructure.isEnabled()&&(He.info("fixing gridAppId structure",{gridAppId:o,projectId:r,testResultId:t.testResultId,executionId:t.executionId}),await op({gridAppId:o,gridId:e.gridId,projectId:r,gridType:n,appId:i.appId,gridHost:e.host})),o):t.getAppPathByGridType(n,e.gridId,i)}async getMobileAppDataByAppId({appId:e,projectId:t,token:r}){let n=await ri({appId:e,projectId:t});return{appUrl:`${he()}/storage${n.filePath}?access_token=${r}`,mobileApp:n}}calculateUploadRequestTimeOut(e){let t=0,r=Math.ceil(e/1024);return t=(Math.ceil(r/(Nd*60))+1)*60*1e3,Math.max(Dd,t)}async uploadAppToGrid({projectId:e,testRunHandler:t,mobileApp:r,gridId:n,gridType:i}){let a={[_.BROWSERSTACK]:{name:"Browserstack"},[_.TESTIM_TVC]:{name:"Mobile Virtual Grid"},[_.P_CLOUDY]:{name:"pCloudy"}}[i].name;if(t.isAppFromDevice)throw new Error(`Application from your device, ${a} grid dose not support application from device. Please choose a compatible application for testing.`);let c=r||t.mobileApp,l=(0,sb.default)(`uploading app to ${a} please wait..`).start();try{He.info(`uploading app to ${a} during test run`,{mobileApp:r,projectId:e,testResultId:t.testResultId,executionId:t.executionId});let m=await ip({projectId:e,gridId:n,app:c,timeout:this.calculateUploadRequestTimeOut(c.fileSize)});return l.succeed(`app uploaded successfully to ${a}`),m.gridAppId}catch(m){throw l.fail(`failed to upload app to ${a}`),He.error(`failed to upload app to ${a}`,{error:m,mobileApp:r,projectId:e,testResultId:t.testResultId,executionId:t.executionId}),new Error(`failed to upload app to ${a}`)}}async verifyAppAlreadyUploaded({testRunHandler:e,pendingAppUploads:t,projectId:r,gridId:n,gridType:i,mobileAppId:o}){let a=t.get(o);if(a!=null&&a.isUploaded)return a.uploadedAppId;let c=await this.uploadAppToGrid({projectId:r,testRunHandler:e,gridId:n,gridType:i});return t.set(o,{isUploaded:!0,uploadedAppId:c}),c}async getAppIdFromGridOrTestimPublicLink({testRunHandler:e,options:t,pendingAppUploads:r}){let n="",i,{executionId:o,testResultId:a}=e,{appId:c="",project:l,authData:{token:m=""}={},gridData:d={}}=t,{gridId:u="",type:f=""}=d;if(!c&&e.isAppFromDevice)return n;if(c){He.info("getting appData by appId",{appId:c,projectId:l,testResultId:a,executionId:o});let T=await this.getMobileAppDataByAppId({appId:c,projectId:l,token:m});n=T.appUrl,i=T.mobileApp,e.nativeApp=i}else He.info("no appId setting appPath from app associated with the test",{projectId:l,testResultId:a,executionId:o}),n=e.downloadableAppPublicLink||"";let h=c||e.mobileApp.appId,g=await this.getGridAppId({projectId:l,gridData:d,testRunHandler:e}),y=f===_.BROWSERSTACK||f===_.TESTIM_TVC||f===_.P_CLOUDY;if(g){let T=t.projectData.type,v=await this.verifyAppStillExistsOnGrid({gridAppId:g,gridData:d,projectType:T});v&&(He.info("app exists on grid, using gridAppId",{gridAppId:g,projectId:l,testResultId:a,executionId:o,mobileAppId:h}),n=g),!v&&y&&(He.info("app not exists on grid, uploading it",{gridAppId:g,projectId:l,testResultId:a,executionId:o,mobileAppId:h}),n=await this.verifyAppAlreadyUploaded({testRunHandler:e,pendingAppUploads:r,projectId:l,gridId:u,gridType:f,mobileAppId:h})),!v&&!y&&He.info("app not exists on grid, using testimStorage url",{projectId:l,testResultId:a,executionId:o})}return!g&&y&&(n=await this.verifyAppAlreadyUploaded({testRunHandler:e,pendingAppUploads:r,projectId:l,gridId:u,gridType:f,mobileAppId:h})),n}async verifyAppStillExistsOnGrid({gridAppId:e,gridData:t,projectType:r}){var m,d;let{accessToken:n,user:i,host:o,key:a,type:c,apiUrl:l}=t;if(c===_.BROWSERSTACK){let u=`${Vs}/recent_apps`,f=await this.fetchWithUserAndPasswordAuth({url:u,user:i,key:a});return Array.isArray(f)?f.some(h=>h.app_url===e):!1}if(c===_.SAUCELABS){let u=`https://${o==null?void 0:o.replace("ondemand","api")}/v1/storage/files`;return(await this.fetchWithUserAndPasswordAuth({url:u,user:i,key:a})).items.some(h=>h.id===e)}if(c===_.TESTIM_HEADSPIN||c===_.TESTIM_TDC){let u=`${l}/${vc}/apps`;return l||(u=`${c===_.TESTIM_HEADSPIN?bc:Tc}/${vc}/apps`),(await this.fetchWithTokenAuth({url:u,accessToken:n,authType:"Bearer"})).apps.some(h=>h.app_id===e)}if(c===_.TESTIM_TVC){let u=`${Md}/versions/${e}/info`,f=t[`${r}Token`];try{return await this.fetchWithTokenAuth({url:u,accessToken:f,authType:"Upload-Token",userAgent:"Testim-CLI"}),!0}catch(h){return h.status!==404&&He.error("error while verifying app exists on TVC",{error:h}),!1}}if(c===_.P_CLOUDY){let u=await this.getPCloudyAuthToken(o,i,a),f=`https://${o}/api/drive`,h=await kc({url:f,body:{token:u,filter:"all"},headers:{contentType:null}});return(d=(m=JSON.parse(h).result)==null?void 0:m.files)==null?void 0:d.some(y=>y.file===e)}throw new Error(`grid type ${c} is not supported`)}async fetchWithUserAndPasswordAuth({url:e,user:t,key:r}){let n={Authorization:`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`};return await Te(e,void 0,n)}async fetchWithTokenAuth({url:e,accessToken:t,authType:r,userAgent:n}){let i={Authorization:`${r} ${t}`,...n&&{"User-Agent":n}};return await Te(e,void 0,i)}},Et=new np});function ib({nativeAppMetadata:s,appPath:e,gridInfo:t}){if(!s&&!e||!s)throw Error("Application not specified. Please provide the required application for execution and try again.");if(!s.id&&!s.activity&&!s.packageName)throw Error("The application appears to be corrupted. Please ensure the application is in a valid state before running the test.");if(t.mode!=="local"&&!KE.includes(t.type))throw Error(`unsupported grid was detected please make sure to select supported mobile grid (${t.type})`)}function JE({deviceUdid:s,gridInfo:e,testRunConfig:t}){let{staticAllocation:r}=(t==null?void 0:t.mobile)||{};if(e.type!==_.TESTIM_TDC&&e.type!==_.TESTIM_HEADSPIN)throw Error("unsupported grid was detected please make sure to select supported mobile grid for direct connection");if(!s&&!(r!=null&&r.deviceUdid))throw Error("missing device udid or test run config is not static");if(!s&&(r!=null&&r.deviceUdid)&&r.deviceUdid.split(",").length!==1)throw Error("provided static config contains multi devices")}function XE(s){let{testName:e,executionId:t,testResultId:r,customTag:n}=s,i=[{executionId:t},{testResultId:r}];return e&&i.push({testName:e}),n&&i.push({customTag:n}),i}function YE(s,e,t){let{fullReset:r,setNoReset:n,skipLoadBalancer:i}=e,o=s===_.TESTIM_TDC,a=s===_.TESTIM_HEADSPIN,c=o?"tdc":"headspin",l=a&&O.flags.enableBatchHeadSpin.isEnabled(),m=o&&(O.flags.enableBatchTDC.isEnabled()||O.flags.headSpinTdcEnableFlagCapability.isEnabled()),d=O.flags.increaseTDCRequestTimeout.isEnabled();return{[`${c}:capture.video`]:!0,...O.flags.tdcHsPreventNetworkCapture.isEnabled()&&{[`${c}:capture.network`]:!1},...i&&{[`${c}:controlLock`]:!0},[`${c}:retryNewSessionFailure`]:!1,[`${c}:sessionTags`]:XE(t),[`${c}:enableBatch`]:l||m,...!r&&{"appium:noReset":n},...d&&{[`${c}:newCommandTimeout`]:600,"appium:newCommandTimeout":600}}}function _a(s){return"id"in s?s.id:s.packageName}function QE(s,e){return{[`${e===_.TESTIM_TDC?"tdc":"headspin"}:app.id`]:s}}function ZE({projectType:s,sessionCaps:e,options:t,nativeAppMetadata:r,appPath:n,androidActivityWait:i}){let{fullReset:o,setNoReset:a}=t,c={"appium:app":n},l=n==null?void 0:n.startsWith("http");n&&!l&&(c=QE(n,t.gridData.type));let d=()=>o===void 0&&n?!0:typeof o=="string"?o!=="false":o;switch(s){case"ios":return{...e,platformName:"iOS","appium:autoAcceptAlerts":!0,"appium:automationName":"XCUITest","appium:fullReset":d(),...r&&{"appium:bundleId":_a(r)},...n&&c};case"android":return{...e,platformName:"Android","appium:fullReset":!!o,"appium:autoGrantPermissions":!a,"appium:automationName":"UiAutomator2",...i&&{"appium:appWaitActivity":`${i}, *`},...r&&{"appium:appPackage":_a(r),"appium:appActivity":r.activity??".*"},...n&&c};default:throw Error(`unsupported mobile project ${s}`)}}function jr({projectType:s,sessionCaps:e,nativeAppMetadata:t,appPath:r,androidActivityWait:n,appiumPrefix:i="",shouldRunInEnhancedMode:o}){switch(s){case"ios":return{platformName:"iOS",[`${i}autoAcceptAlerts`]:!0,[`${i}automationName`]:o?"WaldoTestim":"XCUITest",[`${i}fullReset`]:!0,...t&&{[`${i}bundleId`]:_a(t)},...r&&{[`${i}app`]:r},...e};case"android":return{platformName:"Android",[`${i}autoGrantPermissions`]:!0,[`${i}automationName`]:o?"WaldoTestim":"UiAutomator2",...n&&{[`${i}appWaitActivity`]:`${n}, *`},...t&&{[`${i}appPackage`]:_a(t),[`${i}appActivity`]:t.activity??".*"},...r&&{[`${i}app`]:r},...e};default:throw Error(`unsupported mobile project ${s}`)}}function ob({projectType:s,nativeAppMetadata:e,appPath:t,androidActivityWait:r,sessionTags:n,options:i,gridInfo:o,shouldRunInEnhancedMode:a}){let c=YE(o.type,i,n);return ZE({projectType:s,sessionCaps:c,options:i,nativeAppMetadata:e,appPath:t,androidActivityWait:r,shouldRunInEnhancedMode:a})}function Da({osVersion:s,mobileConfig:e}){let{staticAllocation:t,dynamicAllocation:r}=e;return s||(t!=null&&t.osVersion?t==null?void 0:t.osVersion:r!=null&&r.osVersionRegex?r==null?void 0:r.osVersionRegex:".*")}function Na({deviceName:s,mobileConfig:e,projectType:t,gridType:r}){let{staticAllocation:n,dynamicAllocation:i}=e,o=r===_.P_CLOUDY;return s||(n!=null&&n.deviceName?o?n.deviceUdid:n.deviceName:i!=null&&i.deviceNameRegex?t==="android"&&i.deviceNameRegex===".*"&&o?Sc:i.deviceNameRegex:t==="ios"&&r===_.BROWSERSTACK?"iPhone.*":o?t==="ios"?"apple":Sc:".*")}function eI(s,e){let{androidToken:t,iosToken:r}=s,n=e==="ios";if(!t&&!r)throw Error("missing access token for testim virtual cloud");if(n&&!r)throw Error("missing ios token for testim virtual cloud");if(!n&&!t)throw Error("missing android token for testim virtual cloud");return n?r:t}function tI(s){return{"appium:appiumVersion":"2.0.0","appium:platformVersion":"10",...La(s,Ls)}}function ab(s,e,t){return s?Object.entries(s).reduce((r,[n,i])=>{if(e(n)){if(!t)return r[n]=i,r;let o=n.replace(t,"");r[o]=i}return r},{}):{}}function rI(s){return ab(s,e=>e.startsWith("browserstack."),"browserstack.")}function sI(s){return ab(s,e=>!e.startsWith("browserstack."))}function cb(s){return!s||!lb(s)?"2.0.0":s}function lb(s){return s.split(".")[0]==="2"||s.includes("appium2")||["latest","stable"].includes(s)}function ub({osVersion:s,projectType:e,appiumVersion:t,isBrowserStack:r=!1}){let n=/^(1[4-9](\.\d+){0,2})$|^\^\(\?=1[4-9]((\.\d+){0,2})\.\*\)\.\*$/,i=/^(10(\.\d+){0,2})$|^\^\(\?=10((\.\d+){0,2})\.\*\)\.\*$/,o=/^(1[7-9](\.\d+){0,2})$|^\^\(\?=1[7-9]((\.\d+){0,2})\.\*\)\.\*$/,a=r&&i.test(s),c=e==="android"&&(n.test(s)||a),l=e==="ios"&&o.test(s),m=c||l;if(t){let d=lb(t);return!d&&m?(console.warn(`Appium 2 is required for version: ${s}, forcing appium 2 for current session.`),!0):d}return m}function La(s,e){let t={};return Object.entries(s).forEach(([r,n])=>{let i=`${e}${r}`;t[i]=n}),t}async function nI({projectType:s,nativeAppMetadata:e,appPath:t,androidActivityWait:r,options:n,gridInfo:i,sessionTags:o,testRunConfig:a,shouldRunInEnhancedMode:c}){let{osVersion:l,deviceName:m}=n,d=(a==null?void 0:a.mobile)||{},{type:u}=i,f=eI(i,s),h=await si({gridId:i.gridId,projectType:s,projectId:n.project,companyId:n.company.companyId}),g=h==null?void 0:h.find(({udid:w})=>{var S;return((S=d.staticAllocation)==null?void 0:S.deviceUdid)===w}),y=(g==null?void 0:g.osVersion)??Da({osVersion:l,mobileConfig:d}),T=(g==null?void 0:g.name)??Na({deviceName:m,mobileConfig:d,projectType:s,gridType:u}),v=ze(n.editorUrl,n.project,o.testId,o.testResultId,o.branch),b={device:T,os_version:y,"waldo:displayName":`${o.testName}-${o.executionId}-${o.testResultId}`,"waldo:externalUrl":v,...c&&{"waldo:automationName":"WaldoTestim"},"waldo:options":{token:f}};return jr({projectType:s,sessionCaps:b,nativeAppMetadata:e,appPath:t,androidActivityWait:r,shouldRunInEnhancedMode:c})}function iI({projectType:s,nativeAppMetadata:e,appPath:t,androidActivityWait:r,options:n,gridInfo:i,sessionTags:o,testRunConfig:a}){let{osVersion:c,deviceName:l}=n,m=(a==null?void 0:a.mobile)||{},{user:d,key:u,type:f}=i,h=O.flags.enableAppium2pCloudy.isEnabled(),g=Da({osVersion:c,mobileConfig:m}),y=Na({deviceName:l,mobileConfig:m,projectType:s,gridType:f}),T=/^[a-zA-Z]+$/.test(y),v={...g!==".*"&&{pCloudy_DeviceVersion:g},...T&&{pCloudy_DeviceManufacturer:y},...!T&&{pCloudy_DeviceFullName:y}},b={pCloudy_Username:d,pCloudy_ApiKey:u,pCloudy_Individual:o.pCloudyIndividual,pCloudy_EnableVideo:!0,pCloudy_EnablePerformanceData:!0,pCloudy_EnableDeviceLogs:!0,...v,pCloudy_DurationInMinutes:n.duration?Number(n.duration):Number(Fd),pCloudy_ApplicationName:t,appiumVersion:"1.21.0",newCommandTimeout:600,lunchTimeout:"90000",uiautomator2ServerInstallTimeout:15e4,uiautomator2ServerLaunchTimeout:2e5};return h&&(b=tI(b)),t="",jr({projectType:s,sessionCaps:b,nativeAppMetadata:e,appPath:t,androidActivityWait:r,...h&&{appiumPrefix:Ls}})}function oI({projectType:s,nativeAppMetadata:e,appPath:t,androidActivityWait:r,options:n,gridInfo:i,sessionTags:o,testRunConfig:a}){let{osVersion:c,deviceName:l}=n,m=(a==null?void 0:a.mobile)||{},{type:d}=i,u=Da({osVersion:c,mobileConfig:m}),f=Na({deviceName:l,mobileConfig:m,projectType:s,gridType:d}),h=(0,Br.omit)({...n.saucelabs},["automationName","platformName"]),g={...h["sauce:options"]};if(delete h["sauce:options"],ub({osVersion:h.platformVersion||u,projectType:s,appiumVersion:g.appiumVersion})){let T={debug:!0,networkLogs:!0},v={user:i.user,key:i.key,name:o.testResultId,build:o.executionId,appiumVersion:cb(g.appiumVersion??"stable"),deviceName:f,tags:Object.values(o)},b={"appium:platformVersion":u,"appium:deviceName":f,...La(h,Ls),"sauce:options":{...T,...v,...(0,Br.omit)(g,"appiumVersion")}};return jr({projectType:s,sessionCaps:b,appiumPrefix:Ls,nativeAppMetadata:e,appPath:t,androidActivityWait:r})}let y={"saucelabs.user":i.user,"saucelabs.key":i.key,platformVersion:u,deviceName:f,tags:Object.values(o),name:o.testResultId,build:o.executionId,...h,...g};return jr({projectType:s,sessionCaps:y,nativeAppMetadata:e,appPath:t,androidActivityWait:r})}function aI({projectData:s,projectType:e,nativeAppMetadata:t,appPath:r,androidActivityWait:n,options:i,gridInfo:o,sessionTags:a,testRunConfig:c}){let{osVersion:l,deviceName:m}=i,d=(c==null?void 0:c.mobile)||{},{type:u}=o,f=Da({osVersion:l,mobileConfig:d}),h=Na({deviceName:m,mobileConfig:d,projectType:e,gridType:u}),g=rI(i.browserstack),y=(0,Br.omit)(sI(i.browserstack),["automationName","platformName","project","build","name"]),T={buildName:`${a.executionName} - ${a.executionId}`,projectName:`${s.name} - ${s.projectId}`,sessionName:`${a.testName} - ${a.testId}`},v=O.flags.enableAppium2BrowserStack.isEnabled();if(v||ub({osVersion:y.platformVersion||f,projectType:e,isBrowserStack:!0,appiumVersion:g.appiumVersion})){let w={...T,userName:o.user,accessKey:o.key,appiumVersion:v?"2.0.1":cb(g.appiumVersion),debug:!0,networkLogs:!0},S={"appium:platformVersion":f,"appium:deviceName":h,...La(y,Ls),"bstack:options":{...w,...(0,Br.omit)(g,"appiumVersion")}};return jr({projectType:e,sessionCaps:S,appiumPrefix:Ls,nativeAppMetadata:t,appPath:r,androidActivityWait:n})}let b={...T,os_version:y.platformVersion||f,device:y.deviceName||h,realDevice:!0,buildTags:Object.values(a).join(","),"browserstack.user":o.user,"browserstack.key":o.key,"browserstack.debug":!0,"browserstack.networkLogs":!0,...y,...La(g,"browserstack.")};return jr({projectType:e,sessionCaps:b,nativeAppMetadata:t,appPath:r,androidActivityWait:n})}async function cI(s){if(_.TESTIM_TDC===s.gridInfo.type||_.TESTIM_HEADSPIN===s.gridInfo.type)return ob(s);if(_.TESTIM_TVC===s.gridInfo.type)return await nI(s);if(_.P_CLOUDY===s.gridInfo.type)return iI(s);if(_.SAUCELABS===s.gridInfo.type)return oI(s);if(_.BROWSERSTACK===s.gridInfo.type)return aI(s);throw new Error(`unsupported grid type ${s.gridInfo.type}`)}function lI(s,e){var l,m;let{staticAllocation:t,dynamicAllocation:r,type:n}=e||{},{deviceName:i,osVersion:o,deviceUdid:a}=s,c={};return n==="dynamic"&&(!i&&((l=r==null?void 0:r.selector)!=null&&l.manufacturer)&&(c.manufacturer=r.selector.manufacturer),!o&&((m=r==null?void 0:r.selector)!=null&&m.osVersion)&&(c.os_version=r.selector.osVersion)),n==="static"&&!a&&(t!=null&&t.deviceUdid)&&(c.device_id=t.deviceUdid),i&&(c.manufacturer=i),o&&(c.os_version=o),a&&(c.device_id=a,delete c.os_version,delete c.manufacturer),c}async function pb(s){let{gridInfo:e,nativeAppMetadata:t,options:r,appPath:n,testRunConfig:i}=s,{selectedGrid:o}=(i==null?void 0:i.mobile)||{};if(i!=null&&i.mobile&&(o==null?void 0:o.type)!==e.type)throw Error(`selected grid type ${o.type} is not equal to grid type ${e.type}`);ib({nativeAppMetadata:t,appPath:n,gridInfo:e});let a=Et.getGridConnection(e),c=await cI(s);if(e.type===_.TESTIM_HEADSPIN||e.type===_.TESTIM_TDC){let y=e.type===_.TESTIM_HEADSPIN?"headspin":"tdc",T=lI(r,i==null?void 0:i.mobile);if(!(0,Br.isEmpty)(T)){let v=Object.entries(T).map(([b,w])=>w.split(",").map(S=>S===".*"||S==="="?"":`${b}:${S}`).join(",")).join(" ").trim();c[`${y}:selector`]=v}}let l=e.type===_.TESTIM_TVC?{alwaysMatch:c}:c,m=O.flags.increaseTDCRequestTimeout.isEnabled(),d=0,u=(0,ap.default)("2m"),f=(0,ap.default)("12m"),h=br(O.flags.appiumConnectionRetryCount.getValue(),d),g=br(O.flags.appiumConnectionRequestTimeout.getValue(),u);return m&&g<f&&(g=f),{...a,desiredCapabilities:c,connectionRetryTimeout:g,capabilities:l,connectionRetryCount:h,logLevel:r.appiumLogLevel}}async function db(s){var h,g;let{projectType:e,gridInfo:t,nativeAppMetadata:r,options:n,appPath:i,androidActivityWait:o,sessionTags:a,testRunConfig:c}=s,{deviceUdid:l}=n;ib({nativeAppMetadata:r,appPath:i,gridInfo:t}),JE({deviceUdid:l,gridInfo:t,testRunConfig:c});let m=l||((g=(h=c.mobile)==null?void 0:h.staticAllocation)==null?void 0:g.deviceUdid),d=await Et.getGridDirectConnection(t,m),f=ob({projectType:e,nativeAppMetadata:r,appPath:i,androidActivityWait:o,options:n,sessionTags:a,testRunConfig:c,gridInfo:t});return m&&(f["appium:udid"]=m),{...d,desiredCapabilities:f,capabilities:f,connectionRetryCount:0,logLevel:n.appiumLogLevel}}function mb(s){let{projectType:e,nativeAppMetadata:t,appPath:r,androidActivityWait:n}=s,o=jr({projectType:e,sessionCaps:{dontStopAppOnReset:!0,fullReset:!1},nativeAppMetadata:t,appPath:r,androidActivityWait:n});return e==="ios"&&delete o.app,o}function fb(s){var t,r;let e={...s};return delete e.path,delete e.user,delete e.key,delete e.desiredCapabilities,delete e.capabilities["saucelabs.user"],delete e.capabilities["saucelabs.key"],delete e.capabilities["browserstack.user"],delete e.capabilities["browserstack.key"],(t=e.capabilities["sauce:options"])==null||delete t.user,(r=e.capabilities["sauce:options"])==null||delete r.key,delete e.capabilities.key,delete e.capabilities.user,e}var ap,Br,Ls,KE,cp=E(()=>{"use strict";ap=I(require("ms"));de();ae();Oa();Br=require("lodash");B();oe();ge();Ls="appium:",KE=[_.BROWSERSTACK,_.SAUCELABS,_.TESTIM_HEADSPIN,_.TESTIM_TDC,_.TESTIM_TVC,_.P_CLOUDY]});var Ma,hb=E(()=>{"use strict";Ma=class{constructor(){this.sessionTabs={}}on(){}tabCount(){}getAllOpenTabIds(){return[]}isSessionTab(){return!1}getAllTabInfos(){return{}}async addNewTab(){}addOpenerStepId(){}addOpenerStep(){}getTabUtilsByTabIdAndSessionId(){}getTabUtilsByTabId(){return{}}getTabInfo(){return{}}getTabUtils(){return{}}getMainTabInfo(){}getMainTabUtils(){return{}}getMainTabId(){return null}async isMainTabExists(){return!1}clearAllTabs(){}async switchTab(){}async getTabDetails(){}async isMainTabIncognito(){return!1}async getTabIdByTabInfo(){return NaN}}});var Fa,yb=E(()=>{"use strict";B();Fa=class{constructor(e){this.driver=e;this._abortedSteps=[];this.unescapeHTML=sn;this.getLinksFromUnescapeHTML=nn}resetAbort(){this._abortedSteps.length=0}abort(e){this._abortedSteps.push(e)}get abortedSteps(){return this._abortedSteps}async executeInAut(e,t){throw new Error("not implemented (mobile)")}extractTargetText(e){throw new Error("not implemented (mobile)")}getCookie(e){throw new Error("not implemented (mobile)")}setCookie(e){throw new Error("not implemented (mobile)")}async getNextDynamicParent(e,t){throw new Error("not implemented (mobile)")}}});var lp,Ua,bb=E(()=>{"use strict";$();lp=P("mobile-frame-locator-mock"),Ua=class{foundFrameCallback(){return lp.info("foundFrameCallback-mock invoked"),{}}locate(){return lp.info("locate-mock invoked"),{}}async findFrame(){return lp.info("findFrame-mock invoked"),{}}}});var uI,wb,Tb,Ds,up=E(()=>{"use strict";uI=I(require("webdriverio")),wb=require("@applitools/eyes-sdk-core");hb();zu();$();yb();Ku();we();Qu();bb();Zu();Tb=P("appium-test-player"),Ds=class{constructor(e,t,r,n=uI,i=void 0,o=void 0){this.id=e;this.driver=n;let{SessionPlayer:a,commonConstants:c,StepActionFactory:l,MobileLocateElementPlayer:m}=Z(),d=new Fa(this.driver);this.stepActionFactory=new l(d),Pa(this.driver,this.stepActionFactory),this.playbackTimeoutCalculator=new _s(na()),this.sessionPlayer=new a(e,{tabService:new Ma,cookieUtils:void 0,FrameLocator:Ua,portSelector:ta,LocateElementPlayer:m,stepActionUtils:d,stepActionFactory:this.stepActionFactory,playbackTimeoutCalculator:this.playbackTimeoutCalculator,makeSDK:wb.makeSDK}),this.sessionPlayer.setShouldMonitorPerformance(Boolean(r)),this.sessionPlayer.playbackManager.isRemoteSession=!0,this.sessionPlayer.playbackManager.isLocalRun=!1,this.sessionPlayer.playbackManager.testRetryCount=i,this.sessionPlayer.playbackManager.previousTestResultId=o,this.sessionPlayer.playbackManager.userParamsData=t||{},this.onStepCompleted=this.onStepCompleted.bind(this),this.sessionPlayer.playbackManager.on(c.playback.RESULT,this.onStepCompleted)}onStepCompleted(e,t,r,n){}async onDone(){let{playbackManager:e}=this.sessionPlayer,{executionId:t,testResult:{resultId:r}={},appiumApi:n}=e,i={executionId:t,testResultId:r,sessionId:n==null?void 0:n.sessionId};try{n!=null&&n.sessionId&&(await(n==null?void 0:n.endSession()),Tb.info("appium session deleted",{...i}))}catch(o){Tb.error("error while deleting appium session",{...i,error:o})}finally{let{commonConstants:o}=Z();e.off(o.playback.RESULT)}}getSessionId(){var e;return(e=this.sessionPlayer.playbackManager.appiumApi)==null?void 0:e.sessionId}}});async function pI(s){return await Te(`${s}/api/status`)}async function vb(s,e){return await Te(`${s}/api/devices/${e}/status`)}async function Sb(s){if((await pI(s)).fsmState!=="Ready")throw new Error("TMA is not ready")}var Eb=E(()=>{"use strict";Ge()});var Ib={};z(Ib,{WorkerLocalTma:()=>fp});var $r,pp,dp,mp,fp,Rb=E(()=>{"use strict";Ge();cp();zn();B();$();Lt();up();we();Eb();Oa();$r=P("worker-appium"),pp=class extends Error{},dp=class extends Error{},mp=class extends Error{},fp=class extends Nt{constructor(){super(...arguments);this.baseDevicePath=(t,r)=>`${t}/api/devices/${r}`}initPlayer(t){return new Ds(this.id,t.runParams,this.options.shouldMonitorPerformance,void 0,t.retryCount,t.previousTestResultId)}async initAndGetAppiumAPI(t){if(t.sessionPlayer.playbackManager.appiumApi)return t.sessionPlayer.playbackManager.appiumApi;let{AppiumApi:r}=Z(),{DOMParser:n}=await import("linkedom"),i=new r(this.sessionData.serverAddress,this.sessionData.sessionId,n,!1);return t.sessionPlayer.playbackManager.appiumApi=i,i}async getBrowserOnce(t,r,n,i){var S;if(Q.onGetSession(this.id,this.testName,t.runMode),!this.options.localTmaUrl||!this.options.deviceUdid)throw new Error("Missing localTmaUrl or deviceUdid");let{localTmaUrl:o,deviceUdid:a,projectData:c}=this.options;await Sb(o);let{project:l,authData:{token:m=""}={}}=this.options,{driver:d}=n,u=c.type,f=this.options.appId;if(f){let{mobileApp:A}=await Et.getMobileAppDataByAppId({appId:f,projectId:l,token:m});t.nativeApp=A}let h=u==="android"?t.androidActivityWait:null,g=t.nativeAppMetadata,y=t.downloadableAppPublicLink,T=t.appPackageNameOrBundleId;if(!g)throw new Error("Application not specified. Please provide the required application for execution and try again.");if(!T)throw new Error("The application appears to be corrupted. Please ensure the application is in a valid state before running the test.");let[{appInstalled:v,version:b},w]=await Promise.all([this.getAppStateFromDevice(o,a,T),vb(o,a)]).catch(A=>{throw this.handleDeviceNotFoundError(A),A});if($r.info("device status and app state",{deviceStatus:w,appInstalled:v,version:b,executionId:this.executionId,testResultId:this.testResultId}),!v&&t.isAppFromDevice&&!f)throw new Error("The application is not installed on the target device. Please ensure the application is installed and try again.");!v&&y&&(await this.installApp(o,a,y),$r.info("Application installed successfully",{deviceUdid:a,executionId:this.executionId,testResultId:this.testResultId}));try{let A={testName:this.testName,executionId:this.executionId,testResultId:this.testResultId,project:`${(S=this.options.projectData)==null?void 0:S.name}-${this.options.project}`},D=mb({projectType:u,nativeAppMetadata:g,appPath:y,androidActivityWait:h,sessionTags:A,gridInfo:i,options:this.options,testRunConfig:this.testRunConfig}),V={capabilities:{udid:a,...D}};$r.info("requesting new appium session from TMA",{tmaSessionSettings:V,executionId:this.executionId,testResultId:this.testResultId});let x=await this.requestNewAppiumSessionFromTma(o,V,g);this.sessionData=x;let R=await d.attach({sessionId:x.sessionId,capabilities:D,options:{capabilities:D}});this.device=await Et.updateTmaDeviceDetails(a,this.options,t),$r.info(`init new appium session with local TMA testName: ${this.testName}`,{sessionId:R.sessionId,testResultId:this.testResultId,nativeAppMetadata:g,sessionCaps:R.capabilities})}catch(A){throw $r.error("failed to start application",{err:A}),A}}async requestNewAppiumSessionFromTma(t,r,n){var i,o;try{let a=await Ve({url:`${t}/api/session`,headers:{"Content-Type":"application/json"},body:r,timeout:6e4}),c={name:n.name,version:n.version};return{...a,appInfo:c,env:"local-tma"}}catch(a){this.handleDeviceNotFoundError(a);let c=(o=(i=a.response)==null?void 0:i.body)==null?void 0:o.message;throw a.status===500&&typeof c=="string"&&c.startsWith("Failed to create driver session")?new mp(c):a}}async getAppStateFromDevice(t,r,n){let i=this.options.projectData.type==="ios"?"bundles":"apps",o=`${this.baseDevicePath(t,r)}/${i}`,c=(await Te(o)).find(l=>"id"in l?l.id===n:l.packageName===n);return c?{appInstalled:!0,version:c.version}:{appInstalled:!1,version:""}}async installApp(t,r,n){var i,o;try{let a=await $t(n);await Xs(`${this.baseDevicePath(t,r)}/apps`,{},{file:{buffer:a.body,fileName:"app"}})}catch(a){this.handleDeviceNotFoundError(a);let c=(o=(i=a.response)==null?void 0:i.body)==null?void 0:o.message,l="Failed to install app";throw c&&(l=`${l}: ${c}`),new dp(l,{cause:a})}}handleDeviceNotFoundError(t){var n,i;let r=(i=(n=t.response)==null?void 0:n.body)==null?void 0:i.message;if(t.status===404&&typeof r=="string"&&(r!=null&&r.startsWith("Ensure that the requested device")))throw new pp(`Device Unavailable: Please ensure that the specified device ${this.options.deviceUdid} is currently connected`)}async runTestOnce(t,r){let{manifestVersion:n,localAssetService:i}=Z(),{sessionPlayer:o}=r,a=n||"runner";Q.onWaitToTestComplete(this.id),o.playbackManager.executionId=t.executionId,o.playbackManager.executionName=t.executionName,o.playbackManager.appiumSessionData={...this.sessionData,device:this.device,nativeApp:t.nativeApp},await this.initAndGetAppiumAPI(r),i.initialize({serverUrl:this.options.localRCASaver});let c=async()=>{try{let l=await new Promise((d,u)=>{o.playByTestId({testId:this.testId,executionId:this.executionId,resultId:this.testResultId,baseUrl:this.baseUrl,userData:this.userData,version:a,resolve:d,isLocalRun:!1,overrideTestConfigId:this.overrideTestConfigId,branch:this.branch,remoteRunId:t.remoteRunId}).catch(u)});return await i.drain(),l.stepsResults=null,l.resultId=this.testResultId,{...l,...t.seleniumPerfStats.getStats()}}catch(l){throw $r.error("error while running appium tests",{err:l}),l}};try{return await super.runTestOnce(t,r),await c()}catch(l){throw $r.error("failed to run test once",{err:l}),l}}}});var Ab={};z(Ab,{WorkerAppium:()=>gp});var xb,Wr,gp,Cb=E(()=>{"use strict";B();cp();xb=require("linkedom");zn();$();Lt();up();we();Oa();ae();fs();Wr=P("worker-appium"),gp=class extends Nt{initPlayer(t){return new Ds(this.id,t.runParams,this.options.shouldMonitorPerformance,void 0,t.retryCount,t.previousTestResultId)}async getBrowserOnce(t,r,n,i){let o=this.options.projectData.type,a=(o==="android"||o==="ios")&&await t.isTestRecordedWithEnhancedMode();if(i.type!==_.TESTIM_TVC&&a)throw Error("The provided test(s) were authored in Enhanced Mode and can run only on VMG!");Q.onGetSession(this.id,this.testName,t.runMode);let{driver:c}=n,l=await Et.getAppIdFromGridOrTestimPublicLink({testRunHandler:t,options:this.options,pendingAppUploads:this.executionQueue.pendingAppUploads}),m=o==="android"?t.androidActivityWait:null,d=t.nativeAppMetadata;if(!d)throw new Error("Application not specified. Please provide the required application for execution and try again.");try{let u={testName:this.testName,executionId:this.executionId,executionName:t.executionName,testResultId:this.testResultId,project:`${this.options.projectData.name}-${this.options.project}`,...this.options.customTag&&{customTag:this.options.customTag},testId:this.testId,branch:this.branch,pCloudyIndividual:`${this.executionId}-${this.uniqueId}`},f={projectData:this.options.projectData,projectType:o,nativeAppMetadata:d,appPath:l,androidActivityWait:m,sessionTags:u,gridInfo:i,options:this.options,testRunConfig:this.testRunConfig,shouldRunInEnhancedMode:a},h;this.options.skipLoadBalancer&&this.options.deviceUdid?(this.options.lockDevice&&await Et.lockDevice(i,this.options.deviceUdid),h=await db(f)):h=await pb({...f,shouldRunInEnhancedMode:a}),Wr.info("starting appium session",{testResultId:this.testResultId,executionId:this.executionId,sessionTags:u,nativeAppMetadata:d,capabilities:fb(h)}),h.headers={"User-Agent":this.getUserAgentString()};let g=this.getServerAddressFromGrid();this.activeSession=await c.remote(h),this.device=await Et.updateDeviceOnRemoteTestResult(t,this.activeSession,g,this.options,a);let y=`${g}/session/${this.activeSession.sessionId}`;this.updateSlotData(y),Wr.info("appium session started successfully",{sessionId:this.activeSession.sessionId,testResultId:this.testResultId,executionId:this.executionId,sessionCaps:this.activeSession.capabilities})}catch(u){throw Wr.error("failed to start application",{testResultId:this.testResultId,executionId:this.executionId,err:u}),u}}startKeepAlive(t){let{errors:r}=Z(),n=async()=>{try{await t.getOrientation()}catch(i){Wr.error("failed to keep appium session alive",{err:i}),r!=null&&r.AppiumSessionTerminatedError&&i instanceof r.AppiumSessionTerminatedError&&this.stopKeepAlive()}};this.keepAliveIndex=setInterval(n,25e3)}stopKeepAlive(){this.keepAliveIndex&&clearTimeout(this.keepAliveIndex)}updateSlotData(t){try{this.options.slotService==="redis"&&Hf(this.options.company.companyId,this.options.projectData.projectId,{testResultId:this.testResultId,executionId:this.executionId,type:"execution",source:this.options.source,sessionUrl:t},this.id)}catch(r){Wr.error("failed to update slot data",{err:r})}}getServerAddressFromGrid(){let{host:t,port:r,accessToken:n,type:i}=this.options.gridData;return i===_.TESTIM_HEADSPIN||i===_.TESTIM_TDC?`https://${t}:${r}/v0/${n}/wd/hub`:i===_.P_CLOUDY?`https://${t}/appiumcloud/wd/hub`:`https://${t}:${r}/wd/hub`}getDirectAddressConnection(){let{protocol:t,hostname:r,port:n,path:i}=this.activeSession.options;if(t&&r&&n&&i)return`${t}://${r}:${n}${i}`}async runTestOnce(t,r){var f,h,g;let{manifestVersion:n,AppiumApi:i,localAssetService:o}=Z(),{sessionPlayer:a}=r,c=n||"runner",l=this.options.timeout;Q.onWaitToTestComplete(this.id),a.playbackManager.executionId=t.executionId,a.playbackManager.executionName=t.executionName;let m;if(this.options.skipLoadBalancer){let y=this.options.deviceUdid||((f=this.testRunConfig.mobile)==null?void 0:f.staticAllocation.deviceUdid),{protocol:T,hostname:v,port:b,path:w}=await Et.getHeadSpinDeviceConnection(this.options.gridData,y);m=`${T}://${v}:${b}${w}`}else m=this.getDirectAddressConnection()||this.getServerAddressFromGrid();let d=this.activeSession.capabilities;a.playbackManager.appiumSessionData={env:"remote",capabilities:d,sessionId:this.activeSession.sessionId,sessionToken:this.options.gridData.accessToken,gridType:this.options.gridData.type,projectType:this.options.projectData.type,gridId:this.options.gridData.gridId,companyId:(h=this.options.company)==null?void 0:h.companyId,device:this.device,nativeApp:t.nativeApp},a.playbackManager.appiumApi=new i(m,this.activeSession.sessionId,xb.DOMParser,((g=this.device)==null?void 0:g.domMode)==="enhanced"),this.startKeepAlive(a.playbackManager.appiumApi),o.initialize({serverUrl:this.options.localRCASaver});let u=async()=>{try{let y=await new Promise((v,b)=>{a.playByTestId({testId:this.testId,executionId:this.executionId,resultId:this.testResultId,baseUrl:this.baseUrl,userData:this.userData,version:c,resolve:v,isLocalRun:!1,overrideTestConfigId:this.overrideTestConfigId,branch:this.branch,remoteRunId:t.remoteRunId}).catch(b)});return this.stopKeepAlive(),await o.drain(),y.stepsResults=null,y.resultId=this.testResultId,{...y,...t.seleniumPerfStats.getStats()}}catch(y){throw Wr.error("error while running appium tests",{testResultId:this.testResultId,executionId:this.executionId,err:y}),this.stopKeepAlive(),y}};try{return await super.runTestOnce(t,r),await le(u(),l,Ae.TEST_REACHED_CUSTOM_TIMEOUT_MSG)}catch(y){throw Wr.error("failed to run test once",{err:y}),y}}getUserAgentString(){return"Testim/CI-Branch:runner-v4.162.1"}}});var Ba,Pb=E(()=>{"use strict";B();Bn();Y();Ba=class{constructor(e){this.id=e;this.driver=new Or}async onDone(){try{await le(this.driver.end(),12e4)}catch(t){t instanceof ce&&await this.driver.forceEnd().catch(()=>null)}this.driver=null}getSessionId(){return this.driver.getSessionId()}}});async function kb(){let s=await Promise.any(dI.map(async e=>{try{return await Te(e)}catch{return null}}));return s==null?void 0:s.ip}var dI,ja,$a=E(()=>{"use strict";Ge();dI=["https://api.ipify.org?format=json","https://ipinfo.io/json","https://api.my-ip.io/ip.json"];ja=({timeout:s})=>({timeout:s,...global.proxyUri&&{agent:new global.ProxyAgent(global.proxyUri)}})});var Ob,Wa,_b=E(()=>{"use strict";Ob=I(require("ws"));B();$a();Wa=class{constructor(){this._cdpWs=null;this._cdpUrl=null;this._cdpCallbacks=new Map}async initSession(e,t=500){await this.stopSession(),this._cdpUrl=e,await this.initCDPWebsocket(t)}async initCDPWebsocket(e=500){if(this._cdpWs)return this._cdpWs;let t=ja({timeout:e}),r=new Ob.default(this._cdpUrl,t),n=Qt(o=>{r.once("open",o)}),i=Qt(o=>{r.once("error",o)}).catch(()=>{r.close(),r.removeAllListeners()});return r.on("message",o=>this.onCDPMessage(o)),this._cdpWs=Promise.race([n,i]).then(()=>r),this._cdpWs}onCDPMessage(e){var n;let t=JSON.parse(e),r=this._cdpCallbacks.get(t.id);r&&(this._cdpCallbacks.delete(t.id),t.error?r.reject(new Error(t.error)):(n=t.result.exceptionDetails)!=null&&n.exception?r.reject(new Error(t.result.exceptionDetails.exception.description)):r.resolve(t.result))}async stopSession(){let e=this._cdpWs;if(this._cdpUrl=null,this._cdpWs=null,this._cdpCallbacks.clear(),e)try{return(await e).close()}catch{return}}async cdpCommand(e,t,r){let n=await this.initCDPWebsocket();this._lastWsId||=0;let i=this._lastWsId++,o=new Promise((c,l)=>{this._cdpCallbacks.set(i,{resolve:c,reject:l})}),a={method:e,params:t,id:i};return r&&Object.assign(a,{sessionId:r}),n.send(JSON.stringify(a)),o}}});var Ga,hp,Va,Lb=E(()=>{"use strict";B();Ga=I(require("chrome-launcher"));Lo();_b();Pn();hp=class{constructor(e){this.sessionId=e;this._isAlive=!1;this.cdpTestRunner=new Wa}async init(e){var h,g,y,T;let{browserOptions:t,testName:r,testRunConfig:n,gridInfo:i,customExtensionLocalLocation:o,executionId:a,testResultId:c,printFinalCaps:l,mode:m}=e,d=_o({browserOptions:t,testName:r,testRunConfig:n,gridInfo:i,customExtensionLocalLocation:o,executionId:a,testResultId:c,printFinalCaps:l,mode:m}),u=[...((h=d.desiredCapabilities)==null?void 0:h.chromeOptions.args)??[],...((T=(y=(g=d.capabilities)==null?void 0:g.alwaysMatch)==null?void 0:y["goog:chromeOptions"])==null?void 0:T.args)??[],...Ga.Launcher.defaultFlags().filter(v=>v!=="--disable-extensions")];this.chrome=await Ga.launch({chromeFlags:u,startingUrl:void 0,ignoreDefaultFlags:!0}),this.chrome.process.once("exit",()=>{this._isAlive=!1}),this.chrome.process.once("close",()=>{this._isAlive=!1}),this._isAlive=!0;let f=await wr(`localhost:${this.chrome.port}`);await this.cdpTestRunner.initSession(f),gs(()=>this.chrome.kill())}isAlive(){return this._isAlive}start(){}async stop(){await this.cdpTestRunner.stopSession(),this.chrome&&await this.chrome.kill(),this._isAlive=!1}getSessionId(){return this.sessionId}},Va=class{constructor(e){this.id=e;this.sessionId=re();this.driver=new hp(this.sessionId)}async onDone(){return this.driver.stop()}getSessionId(){return this.sessionId}}});var yp={};z(yp,{WorkerExtension:()=>ni});function mI(s){return s instanceof Error&&"type"in s&&typeof s.type=="string"}function Db(s){return mI(s)?s:new Error(s)}var et,ni,Ha=E(()=>{"use strict";$e();Y();zn();B();$();Lt();ae();Pb();Lb();lt();et=P("worker-ext"),ni=class extends Nt{initPlayer(){return this.options.useChromeLauncher?new Va(this.id):new Ba(this.id)}async _getBrowserOnce(e,t,r,n){var o;let{driver:i}=r;try{return await i.init({projectData:this.options.projectData,overrideConfiguration:e.overrideTestConfig,browserOptions:this.options,testId:e.testId,testName:this.testName,testRunConfig:this.testRunConfig,gridInfo:n,customExtensionLocalLocation:t,executionId:this.executionId,executionName:e.executionName,testResultId:this.testResultId,seleniumPerfStats:e.seleniumPerfStats,fastInit:(o=this.options.lightweightMode)==null?void 0:o.general,lambdatestService:this.lambdatestService,printFinalCaps:this.options.printFinalCaps,mode:K.EXTENSION})}catch(a){throw et.error("failed to get browser",{err:a,gridInfo:n,whitelistedPublicIp:Zi(),initializedFromCache:eo(),testId:e.testId,resultId:e.testResultId,publicIps:this.options.publicIps}),a}}async getBrowserOnce(e,t,r,n){return Q.onGetSession(this.id,this.testName,e.runMode),this._getBrowserOnce(e,t,r,n)}isUsingChromeLauncher(e){return Boolean(this.options.useChromeLauncher)}async updateTestStatusOnGrid(e,t,r){var i;let n=t?"passed":"failed";if(this.lambdatestService.isLambdatestRun()&&await e.executeJS(`lambda-status=${n}`),"browserstack"in this.options&&((i=this.options.browserstack)!=null&&i["browserstack.user"])){let o={action:"setSessionStatus",arguments:{status:n,reason:r}};await e.execute(`browserstack_executor: ${JSON.stringify(o)}`)}}async runTestOnce(e,t){let{testResultId:r,executionId:n,testId:i}=this;F("WorkerExtension runTestOnce");let o=async m=>{let d=this.options.timeoutWasGiven?Math.max(1e4,this.options.timeout):this.options.testStartTimeout;try{return await le(e.runTestUsingCDP(m.cdpTestRunner),d,Ae.TEST_START_TIMEOUT_MSG)}catch(u){if(!(u instanceof ce))throw u;return et.warn("timeout while running test using CDP. Running checkViaRestAPIIfTestStarted",{testResultId:r}),await e.checkViaRestAPIIfTestStarted()}},a=async(m,d,u)=>{try{let f=await m.url(d);return u.driverUrlFinished=!0,f}catch(f){throw et.error("error from driver.url",{err:f,testResultId:r,executionId:n,testId:i,url:d,urlLength:d.length}),f}},c=async m=>{let d=await e.onStarted(this.options.testStartTimeout);return m.testRunHandlerOnStartedHadFinished=!0,d},l=async()=>{var g;if(F("WorkerExtension runExtTest"),((g=this.options.lightweightMode)==null?void 0:g.disableRemoteStep)||this.options.disableSockets||e.listenToRemoteStep(t.driver),this.isUsingChromeLauncher(t)){Q.onWaitToTestStart(this.id),Q.onWaitToTestComplete(this.id);try{return{...await o(t.driver),...e.seleniumPerfStats.getStats()}}catch(y){throw et.warn("failed to run test via CDP",{err:y}),y}}let{driver:d}=t,u={driverUrlFinished:!1,testRunHandlerOnStartedHadFinished:!1};try{let v=function(w){e.onCompletedCleanup(),et.warn("on browser closed error detected",{err:w,testResultId:r,executionId:n,testId:i}),d.unregisterToClosedBrowser(v),d.unregisterToKeepAliveFailed(b),w.type=Xr.BROWSER_CLOSED,T.abort(w)},b=function(w){d.unregisterToClosedBrowser(v),d.unregisterToKeepAliveFailed(b),et.warn("on keep alive failed error detected",{err:w,testResultId:r,executionId:n,testId:i}),w.type=Xr.KEEP_ALIVE_FAILED,T.abort(w)};var f=v,h=b;let y=await e.getRunTestUrl();Q.onWaitToTestStart(this.id);try{await le(Promise.all([a(t.driver,y,u),c(u)]),this.options.testStartTimeout,Ae.TEST_START_TIMEOUT_MSG)}catch(w){if(!(w instanceof ce))throw w;et.warn("timeout occurred (see log's payload). Running checkViaRestAPIIfTestStarted",{testResultId:r,executionId:n,testId:i,...u}),await e.checkViaRestAPIIfTestStarted()}Q.onWaitToTestComplete(this.id);let T=new AbortController;d.registerToClosedBrowser(v),d.registerToKeepAliveFailed(b);try{let w=le(e.onCompleted(),this.testRunTimeout,Ae.TEST_COMPLETE_TIMEOUT_MSG),S=await xc(w,T.signal);d.unregisterToClosedBrowser(v),d.unregisterToKeepAliveFailed(b);try{await this.updateTestStatusOnGrid(d,Boolean(S.success),S.reason)}catch(V){et.error("Could not update the grid about the test status",{err:V})}d.isAlive()||(et.warn(`possible grid unresponsive for test ${this.testId}, result ${this.testResultId} (execution: ${this.executionId})`),S.gridIssues="could not validate grid is alive");let A=d.maxKeepAliveGap();return A>=3e4&&(et.warn(`possible browser keep alive issue ${this.testId}, result ${this.testResultId} (execution: ${this.executionId})`),S.keepAliveIssue=A),{...S,...e.seleniumPerfStats.getStats()}}catch(w){throw et.warn("timeout wait until test completed",{err:w,testResultId:r,executionId:n,testId:i}),Db(w)}finally{d.unregisterToClosedBrowser(v),d.unregisterToKeepAliveFailed(b)}}catch(y){throw et.warn("failed to start url",{err:y}),Db(y)}};t.driver.start();try{return await super.runTestOnce(e,t),F("WorkerExtension super.runTestOnce"),await l()}catch(m){throw et.error("failed to run test",{err:m,testId:e.testId,resultId:e.testResultId}),m}}}});var Tp={};z(Tp,{WorkerExtensionSingleBrowser:()=>bp});var fI,gI,bp,wp=E(()=>{"use strict";$e();B();$();Bu();Lt();Ha();fI=P("base-worker"),gI=500,bp=class extends ni{async _releasePlayer(){if(!this.testPlayer)return;let{projectId:t}=this.userData||{};await qn(this.id,this.releaseSlotOnTestFinished,t,this.options.company.companyId,this.options.slotService,this.testPlayer),this.testPlayer=null}onQueueCompleted(){return this._releasePlayer()}async getBrowserOnce(t,r,n,i){return Q.onGetSession(this.id,`worker ${this.id}`,t.runMode),this._getBrowserOnce(t,r,n,i)}async getTestPlayer(t,r){return this.testPlayer&&!this.testPlayer.driver.isAlive()&&(fI.warn("WorkerExtensionSingleBrowser is releasing a dead player",{workerId:this.id}),await this._releasePlayer()),this.testPlayer||(this.testPlayer=await super.getTestPlayer(t,r)),this.testPlayer}async runTest(t,r,n){let i=this.handleQuarantine(t);if(i)return i;F("before runTest onTestStarted single browser");let o=await this.onTestStarted(this.id,t.testId,t.testResultId,n,t.retryKey);t.baseUrl=o.config.baseUrl;let a=await this.getTestPlayer(t,r);return t.markClearBrowser(),await this.runTestOnce(t,a)}async runTestCleanup(){var t;if(!this.executionQueue.hasMoreTests()){await this.onQueueCompleted();return}(t=this.options.lightweightMode)!=null&&t.general&&await pe(gI)}}});var vp,qa,Nb=E(()=>{"use strict";Bn();oe();$e();Cl();lt();wu();Y();$();ae();Rh();Go();vp=P("worker-manager"),qa=class{constructor(e){this.customExtensionLocalLocation=e;this.workerIdCount=0;this.parallelCount=0;this.workers=new Map;this.combinedTestResults={};this.workerUniqueIds=[];this.onWorkerFinished=async(e,...t)=>{this.workers.has(e)&&(this.workers.delete(e),this.executionQueue.hasMoreTests()&&this.workers.size<this.parallelCount&&this.runWorker(...t))};this.runWorker=async(...e)=>{let t=++this.workerIdCount;this.workers.set(t,null);let r=this.executionQueue.getNext();if(!r){this.workers.delete(t);return}let n=this.workerUniqueIds[t%this.parallelCount],i=await this.createWorker(r.runConfig.browserValue,...e);this.workers.set(t,i),i.id=t,i.uniqueId=n,i.run(r,this.onWorkerFinished,...e)}}async getWorkerType({mode:e,localTmaUrl:t},r){if(e)switch(e){case K.SELENIUM:return(await Promise.resolve().then(()=>(sp(),rp))).WorkerSelenium;case K.APPIUM:return t?(await Promise.resolve().then(()=>(Rb(),Ib))).WorkerLocalTma:(await Promise.resolve().then(()=>(Cb(),Ab))).WorkerAppium;default:return jn.isFeatureAvailableForProject("useSameBrowserForMultiTests")?(await Promise.resolve().then(()=>(wp(),Tp))).WorkerExtensionSingleBrowser:(await Promise.resolve().then(()=>(Ha(),yp))).WorkerExtension}else switch(r){case(Nr.find(n=>n===r)&&jn.isFeatureAvailableForProject("useSameBrowserForMultiTests")):return(await Promise.resolve().then(()=>(wp(),Tp))).WorkerExtensionSingleBrowser;case Nr.find(n=>n===r):return(await Promise.resolve().then(()=>(Ha(),yp))).WorkerExtension;case Hn.find(n=>n===r):return(await Promise.resolve().then(()=>(sp(),rp))).WorkerSelenium;default:throw new C(`browser ${r} is not supported`)}}async createWorker(e,...t){let r=t[0],n=await this.getWorkerType({mode:r.mode,localTmaUrl:r.localTmaUrl},e);try{return F("before new Worker",r.mode),new n(this.executionQueue,...t)}finally{F("after new Worker",r.mode)}}async runTests(e,t,r,n,i,o,a,c){if(e&&e.length===0)return;let l=!1,m=0,d=(u,f)=>new Promise(h=>{var ie,Ie,It,Gr,k,N,j,J;let g=i.project,y=e.length;this.parallelCount=a,this.workerUniqueIds=this.generateUniqueIds(this.parallelCount),this.executionQueue=new Vo(r,n,e,i,o,t),this.combinedTestResults={};let T=((ie=i.company)==null?void 0:ie.ucid)||"",v=(Ie=i.company)==null?void 0:Ie.companyId,b=(It=i.company)==null?void 0:It.name,w=i.source||"cli",S=i.user,A=(Gr=i.company)==null?void 0:Gr.planType,D=(k=i.company)==null?void 0:k.isStartUp,V=(N=i.projectData)==null?void 0:N.name,x=(j=i.projectData)==null?void 0:j.type,R=i.lightweightMode,L=(J=i.gridData)==null?void 0:J.type,M=(_e,Rt,ve,uc,li,pc)=>(m++,Cf({executionId:r,projectId:g,testId:Rt,resultId:ve,ucid:T,companyId:v,companyName:b,projectName:V,companyPlan:A,source:w,user:S,lightweightMode:R,isStartUp:D,projectType:x,appSource:pc,gridType:L}),t.testStartAndReport(_e,r,ve,uc,li)),G=async(_e,Rt,ve,uc,li,pc)=>{var gd,hd,yd;m--;let tt={...(R==null?void 0:R.onlyTestIdsNoSuite)&&{show:!0},...ve.seleniumStats&&{seleniumStats:ve.seleniumStats},...ve.gridIssues&&{gridIssues:ve.gridIssues},...ve.keepAliveIssue&&{keepAliveIssue:ve.keepAliveIssue},...i.host&&{gridHost:i.host}};if(ve.seleniumPerfMarks&&(t.concatSeleniumPerfMarks(ve.seleniumPerfMarks),delete ve.seleniumPerfMarks),i.grid||i.gridId?(tt.gridName=i.grid||((gd=i.gridData)==null?void 0:gd.name),tt.gridType=(hd=i.gridData)==null?void 0:hd.type,tt.gridProvider=(yd=i.gridData)==null?void 0:yd.provider):i.localTmaUrl?(tt.gridName="local-tma-from-options",tt.gridType="local-tma"):i.useLocalChromeDriver?(tt.gridName="local-chrome-driver-from-options",tt.gridType="local-chrome"):i.useChromeLauncher?(tt.gridName="chrome-launcher-from-options",tt.gridType="local-chrome"):i.browserstack?tt.gridName="browserstack-from-options":i.saucelabs&&(tt.gridName="saucelabs-from-options"),await t.testEndAndReport(_e,ve,r,uc,li,tt).catch(JT=>vp.error("testEndAndReport threw an error",{err:JT})),li)return;this.combinedTestResults[ve.resultId]=ve,Pf({executionId:r,projectId:g,testId:Rt,resultId:ve.resultId,result:ve,ucid:T,companyId:v,companyName:b,projectName:V,companyPlan:A,source:w,user:S,lightweightMode:R,logger:vp,isStartUp:D,projectType:x,appSource:pc}),c&&!ve.success&&(this.executionQueue.stop(),l=!0),(Object.keys(this.combinedTestResults).length===y||l&&m===0)&&h(this.combinedTestResults)},W=(_e,Rt)=>{this.combinedTestResults[Rt.resultId]=Rt,t.onTestIgnored(_e,Rt.resultId),m--,(Object.keys(this.combinedTestResults).length===y||l&&m===0)&&h(this.combinedTestResults)},q=(_e,Rt)=>t.onGridSlot(_e,Rt);for(i.userData={loginData:{...Ir(),refreshToken:Yi(),authData:Ir(),token:u,userAccessKey:f},projectId:i.project,company:i.company,servicesUrl:he()},F("in localStrategy before createWorker");this.workers.size<this.parallelCount&&this.executionQueue.hasMoreTests();)this.runWorker(i,this.customExtensionLocalLocation,r,M,G,q,W)});try{let u=await Ot(),f=await Qi(),h=await d(u,f);if(this.workers.size>0&&this.workers.clear(),l)throw new Xt;return h}catch(u){throw vp.error("failed running parallel workers",{executionId:r,err:u}),u}}generateUniqueIds(e){return Array.from({length:e},(t,r)=>`worker-${r+1}`)}}});var ii,Mb,za,Sp,Ep,Vr,Ip=E(()=>{"use strict";ii=I(require("lodash"));B();$();oe();ae();$e();cs();Al();Cl();ge();Mb=require("uuid");_f();B();Lt();hg();Y();Nb();de();Go();({CLI_MODE:za}=Wt),Sp=P("test-plan-runner"),Ep=class{constructor(e){this.customExtensionLocalLocation=e;this.startTime=Date.now()}static get id(){return Ep._id}async runTestAllPhases(e,t,r,n,i,o,a,c){let l={},m=new qa(this.customExtensionLocalLocation),d=async()=>{let g=i.beforeParallel||1,y=!0,T=await m.runTests(e,c,o,a,i,n,g,y);Object.assign(l,T)},u=async()=>{let g=vi||i.parallel,y=!1;F("right before this.workerManager.runTests");let T=await m.runTests(t,c,o,a,i,n,g,y);F("right after this.workerManager.runTests"),Object.assign(l,T)},f=async()=>{let g=i.afterParallel||1,y=!1,T=await m.runTests(r,c,o,a,i,n,g,y);Object.assign(l,T)};kf({executionId:o,projectId:i.project}),F("right before runBeforeTests");try{return await d(),F("right before runTestPlanTests"),await u(),F("right after runTestPlanTests"),await f(),l}catch(g){if(Sp.error("error running test plan",{err:g}),g instanceof Xt)return c.markAllQueuedTests(o,fe.ABORTED,"aborted",!1);throw g}finally{await h()}async function h(){var y,T,v,b;if((y=i.lightweightMode)!=null&&y.disablePixelValidation)return;if(i.mode===za.SELENIUM){let[{getSessionPlayer:w},{makeSDK:S}]=await Promise.all([Promise.resolve().then(()=>(we(),ir)),import("@applitools/eyes-sdk-core")]),{EyeSdkBuilder:A}=w();await A.closeBatch(o,S);return}let g;try{if(!((b=(v=(T=i.company)==null?void 0:T.activePlan)==null?void 0:v.premiumFeatures)!=null&&b.applitools)||(g=await Cp(i.project),ii.default.isEmpty(g)||!o))return;let{runKey:w,url:S}=g,A=require("@applitools/eyes-sdk-core").makeSDK({name:"Testim.io",version:"4.0.0",spec:{}}),D=1e4;await le(A.closeBatches({settings:{batchIds:[o],serverUrl:S,apiKey:w}}),D)}catch{}}}async runTestPlan(e,t,r,n,i,o,a,c){var b,w,S;let l=re(),m=n.project;Jd(l),e.forEach(A=>Object.assign(A,{isBeforeTestPlan:!0})),r.forEach(A=>Object.assign(A,{isAfterTestPlan:!0}));let d=[...e,...t,...r],u=new Eo(d,n,o,a),f=ii.default.chain(d).map(A=>{var D;return((D=A.overrideTestConfig)==null?void 0:D.name)||""}).uniq().compact().value(),h=(f==null?void 0:f.length)===1?f[0]:null,g=(b=n.lightweightMode)!=null&&b.onlyTestIdsNoSuite?[]:d.map(A=>A.name),y=(w=n.lightweightMode)!=null&&w.onlyTestIdsNoSuite?{beforeTests:e,tests:t,afterTests:r}:u.executionStart(l,m,this.startTime,i,g);F("before testListInfoPromise");let T=await y;(S=n.lightweightMode)!=null&&S.onlyTestIdsNoSuite||Q.onTestPlanStarted(T.beforeTests,T.tests,T.afterTests,i,l,c,h),F("before runTestAllPhases");let v=await this.runTestAllPhases(T.beforeTests,T.tests,T.afterTests,a,n,l,i||"All Tests",u);return F("before executionEnd"),await u.executionEnd(l),F("after executionEnd"),{results:v,executionId:l,testPlanName:i,configName:h}}isJsonString(e){try{JSON.parse(e)}catch{return!1}return!0}handleReportFailure(e,t){try{e.text?t=e.text:t=JSON.stringify(e)}catch{}console.error(ue.colorString(ue.FgMagenta,t)),process.exit(-1)}async reportTestRunnerStarted(e,t){try{return await Rp(e,t.testOptimization)}catch(r){return this.handleReportFailure(r,"Failed Report: Test Runner Started")}}async reportTestRunnerFinished(e){try{return await xp(e)}catch(t){return this.handleReportFailure(t,"Failed Report: Test Runner Finished")}}async runTestPlans(e,t){Sp.info("start to run test plan",{options:{...e,token:void 0,userParamsData:void 0},branchToUse:t});function r(m){return ii.default.flattenDeep(Object.values(m)).reduce((d,u)=>d.concat(u.beforeTests,u.tests,u.afterTests),[])}let n={},i={},o=e.project,a={testPlans:[],testPlansData:{}};O.flags.enableTestPlanAggregation.isEnabled()?(await se(e.testPlanIds,async m=>{let d=await oi(o,e.testPlan,[m],t,e.intersections);d.testPlans.forEach(u=>{a.testPlans.push(u);let f=u._id;a.testPlansData[f]=d.testPlansData[f]})}),await se(e.testPlan,async m=>{let d=await oi(o,[m],e.testPlanIds,t,e.intersections);d.testPlans.forEach(u=>{a.testPlans.push(u);let f=u._id;a.testPlansData[f]=d.testPlansData[f]})})):a=await oi(o,e.testPlan,e.testPlanIds,t,e.intersections);let c=a.testPlans,l=a.testPlansData;if(!c||c.length===0)throw new C(`no test plan to run ${e.testPlan}`);if(!l||Object.keys(l).length===0){if(e.passZeroTests)return[];throw new C(`no test to run in test plan ${e.testPlan}`)}return e.mode!==za.APPIUM&&await Fu(e,r(l)),await se(c,async m=>{var h;let d=m.testPlanId;n[d]={};let u={...e};u.baseUrl||=m.startUrl,u.appId||=((h=m.mobileApp)==null?void 0:h.appId)||void 0,u.gridId||=m.gridId,e.grid&&delete u.gridId,u.gridData=await hf(e,m);let f=u.overrideExecutionName||m.name;return await se(l[d],async g=>{let y=await this.runTestPlan(g.beforeTests,g.tests,g.afterTests,u,f,d,t);Q.onTestPlanFinished(y.results,m.name,this.startTime,y.executionId,!1),n[d][y.executionId]=y.results;let T=Object.keys(n[d]).map(S=>({executionId:S,status:Mu(n[d][S])})),v=Object.keys(n[d]).map(S=>n[d][S]).reduce((S,A)=>Object.assign(S,A),{}),b=Mu(v);Object.assign(i,v);let w=b?T[0].executionId:T.find(S=>!S.status).executionId;return await Ap(o,d,{success:b,executions:T,executionId:w}),y})})}async runAnonymousTestPlan(e,t){var c;Sp.info("start to run anonymous",{options:{...e,token:void 0},branchToUse:t}),F("before getSuite");let r=await Ah(e,t);if(F("after getSuite"),!((c=r==null?void 0:r.tests[0])!=null&&c.length)){if(e.rerunFailedByRunId)throw new C("No failed tests found in the provided run");if(e.passZeroTests)return[];throw new C("No tests to run")}t="branch"in r&&r.branch||t;let n=r;if(e.rerunFailedByRunId&&!n.runName){if(!n.runExists)throw new C("Invalid run ID - no such run.");n.runName===""&&(n.runName=`rerun-${e.rerunFailedByRunId}`)}let i=e.overrideExecutionName||n.runName||[].concat(e.label,e.name,e.suites).join(" "),o=!0;F("Right before validateConfig + runAnonymousTestPlan tests map");let a;return e.appId&&e.mode===za.APPIUM&&(a=await ri({appId:e.appId,projectId:e.project})),await se(r.tests,async l=>{if(a&&l.forEach(d=>{"nativeApp"in d&&(d.nativeApp=a)}),e.resultId){let d=l[0];d.resultId=e.resultId,l=[d]}e.mode!==za.APPIUM&&await Fu(e,l),F("right before runTestPlan");let m=await this.runTestPlan([],l,[],e,i,null,t,o);return F("right after runTestPlan"),await Q.onTestPlanFinished(m.results,i,this.startTime,m.executionId,o),m})}async run(e){let t=vn(),r=[];await this.reportTestRunnerStarted(e.project,e),en(e)?r=await this.runTestPlans(e,t):r=await this.runAnonymousTestPlan(e,t),await this.reportTestRunnerFinished(e.project);let n=ii.default.flattenDeep(r);return F("right before onAllTestPlansFinished"),await Q.onAllTestPlansFinished(n),F("right after onAllTestPlansFinished"),n.map(i=>i.results).reduce((i,o)=>Object.assign(i,o),{})}},Vr=Ep;Vr._id=(0,Mb.v4)()});var Ce={};z(Ce,{addTestRetry:()=>au,clearTestResult:()=>Du,deleteCloudflareTunnel:()=>Mp,fetchLambdatestConfig:()=>uu,fixGridAppIDStructure:()=>op,forceUpdateCloudflareTunnelRoutes:()=>Np,getAllGrids:()=>xl,getAppDetails:()=>ri,getApplitoolsIntegrationData:()=>Cp,getBrowserStackSessionMetaData:()=>RI,getCloudflareTunnel:()=>Dp,getEditorUrl:()=>SI,getGridSlot:()=>Rl,getHybridGridProvider:()=>Il,getLabFeaturesByProjectId:()=>vu,getMobileDevicesFromGrid:()=>si,getRealData:()=>eu,getS3Artifact:()=>_n,getS3ArtifactText:()=>Zl,getSuiteTestList:()=>Uu,getTestPlan:()=>vI,getTestPlanTestList:()=>oi,getTestResults:()=>Dr,getUsageForCurrentBillingPeriod:()=>_p,initializeUserWithAuth:()=>Lp,isTestResultCompleted:()=>Lu,keepAliveCompanySlots:()=>Yl,keepAliveGrid:()=>Sl,loadSfdcCredential:()=>Op,loadTest:()=>Vn,releaseCompanySlot:()=>Jl,releaseGridSlot:()=>El,reportExecutionFinished:()=>Io,reportExecutionStarted:()=>ou,reportRunnerFinished:()=>xp,reportRunnerStarted:()=>Rp,requestCompanySlot:()=>Kl,saveRemoteStep:()=>Eu,saveTestPlanResult:()=>Ap,updateCompanySlot:()=>Xl,updateExecutionTests:()=>iu,updateRemoteRunFailure:()=>Fp,updateTestDataArtifact:()=>Ro,updateTestResult:()=>Jo,updateTestStatus:()=>Cr,uploadAppToGrid:()=>ip,uploadRunDataArtifact:()=>Nu,validateUserAccessKey:()=>wl});async function Ns(){let s=await Ot();if(!s)throw new Error("Failed to get token from server");return{[Vc]:Vr.id,Authorization:`Bearer ${s}`}}async function Re({url:s,body:e,headers:t={},timeout:r,retry:n}){let i=await Ns(),o={...t,...i};return Ve({url:`${he()}${s||""}`,body:e,headers:o,timeout:r,retry:n})}async function TI(s,e,t,r={},n=void 0){let i=await Ns(),o={...r,...i};return await Xs(`${he()}${s||""}`,e,t,o,n)}async function ai(s,e){let t=await Ns();return await Oc(`${he()}${s||""}`,e,t)}async function Ub(s,e){let t=await Ns();return await Js(`${he()}${s||""}`,e,t)}async function wI(s,e){let t=await Ns();return await Ys(`${he()}${s||""}`,e||void 0,t)}async function ke(s,e,t,r){let n=await Ns();return await Te(`${he()}${s||""}`,e||void 0,n,r,t)}function _n(s,e){return(0,ee.default)(()=>ke(`/storage${s}`,null,{isBinary:!0},e),{retries:te,factor:1})}function Zl(s){return(0,ee.default)(()=>wI(`/storage${s}`))}async function Rp(s,e){return await Re({url:"/test-runner",body:{projectId:s,testOptimization:e}})}async function xp(s){return await Ub("/test-runner",{projectId:s})}async function vI(s,e){let t=n=>n===null?[]:typeof n=="string"&&JSON.parse(n)||n;return(await(0,ee.default)(()=>ke("/testPlan",{projectId:s,name:e.join(",")}),{retries:te,factor:1})).map(({testConfigIds:n,beforeAllLabels:i,testLabels:o,afterAllLabels:a,...c})=>Object.assign(c,{testConfigIds:t(n),beforeAllLabels:t(i),testLabels:t(o),afterAllLabels:t(a)}))}async function Op({branch:s,projectId:e}){let t=await(0,ee.default)(()=>ke(`/branch/branchData/${encodeURIComponent(s)}`,{projectId:e}),{retries:te,factor:1});return t==null?void 0:t.sfdcCredential}function Vn({testId:s,branch:e,projectId:t,skipSharedSteps:r=!1,useBranchMap:n=!0}){return(0,ee.default)(()=>ke(`/test/${s}`,{projectId:t,branch:e,skipSharedSteps:r,useBranchMap:n}),{retries:te,factor:1})}function Ap(s,e,t){return(0,ee.default)(()=>Re({url:"/testPlan/result",body:{projectId:s,testPlanId:e,result:t}}),{retries:te,factor:1})}function Cr(s,e,t,r,n,i,o=te){return(0,ee.default)(()=>ai("/result/run/test",{runId:e,testId:t,resultId:r,status:n,projectId:s,runnerVersion:hI,...i}),{retries:o,factor:1})}function iu(s,e,t,r,n,i,o,a){return(0,ee.default)(()=>ai("/result/run/tests",{runId:s,runnerStatuses:e,status:t,reason:r,success:n,startTime:i,endTime:o,projectId:a}),{retries:te,factor:1})}async function ou({executionId:s,projectId:e,labels:t,startTime:r,executions:n,config:i,resultLabels:o,remoteRunId:a,localRunUserId:c,isLocalRun:l,intersections:m}){let{isCi:d}=await Promise.resolve().then(()=>(no(),Rf));return Re({timeout:9e4,url:"/result/run",body:{runId:s,projectId:e,labels:t,startTime:r,execution:n,status:"RUNNING",config:i,resultLabels:o,remoteRunId:a,intersections:m,metadata:{isCiRun:d,localRunUserId:c,isLocalRun:l}},retry:3})}function Io(s,e,t,r,n={},i=void 0,o=void 0){let a=Date.now();return(0,ee.default)(()=>ai("/result/run",{runId:e,projectId:t,endTime:a,status:s,success:r,tmsOptions:n,remoteRunId:i,resultExtraData:o}),{retries:te,factor:1})}async function oi(s,e,t,r,n){return(0,ee.default)(()=>Re({url:"/testPlan/list",body:{projectId:s,names:e,planIds:t,branch:r,intersections:n},timeout:12e4}),{retries:te,factor:1})}function Uu({projectId:s,labels:e,testIds:t,testNames:r,testConfigNames:n,suiteNames:i,suiteIds:o,branch:a,rerunFailedByRunId:c,testConfigIds:l,intersections:m}){return(0,ee.default)(()=>Re({url:"/suite/v2/list",body:{projectId:s,labels:e,testIds:t,testNames:r,testConfigNames:n,suiteNames:i,suiteIds:o,branch:a,rerunFailedByRunId:c,testConfigIds:l,intersections:m}}),{retries:te,factor:1})}async function ri({appId:s,projectId:e}){try{return await(0,ee.default)(()=>ke(`/mobile-app/app/${s}?projectId=${e}`),{retries:te,factor:1})}catch(t){throw new Error(`Could not load app with the ID ${s}`,{cause:t})}}async function _p(s){try{return await(0,ee.default)(()=>ke(`/plan/project/${s}/usage-current-billing-period`),{retries:te,factor:1})}catch(e){Mt.error("failed getting usage for current billing period",{projectId:s,error:e});return}}function Lu(s,e,t){return(0,ee.default)(()=>ke(`/result/${s}/isComplete`,{projectId:e,testRetryKey:t}),{retries:te,factor:1})}function Dr(s,e,t,r){return(0,ee.default)(()=>ke(`/test/v2/${s}/result/${e}`,{projectId:t,branch:r}),{retries:te,factor:1})}function Sl(s,e){return Re({url:`/grid/keep-alive?reqId=${re()}`,body:{projectId:s,slots:e},timeout:1e4})}function El(s,e,t,r,n){return Re({url:`/grid/release?reqId=${re()}`,body:{companyId:s,projectId:e,slotId:t,gridId:r,browser:n}})}function Il(s){return Re({url:"/grid/hybrid/provider",body:s})}function Rl(s){return(0,ee.default)(()=>ke("/grid/grid-slot",{...s,reqId:re()}),{retries:te,factor:1})}async function Lp({projectId:s,token:e,branchName:t,lightweightMode:r,localGrid:n,publicIp:i,gridId:o,grid:a,clientCliVersion:c,clientNodeVersion:l,clientNpmVersion:m}){var d,u;try{return await(0,ee.default)(()=>Ve({url:`${he()}/executions/initialize`,body:{projectId:s,token:e,branchName:t||"master",lightweightMode:r,localGrid:n,publicIp:i,gridId:o,gridName:a,clientCliVersion:c,clientNodeVersion:l,clientNpmVersion:m},timeout:6e4}),{retries:te,factor:1})}catch(f){if(Mt.error("error initializing info from server",f),(d=f.message)!=null&&d.includes("Bad Request"))throw new C("Error trying to retrieve CLI token. Your CLI token and project might not match. Please make sure to pass `--project` and `--token` that match to each other or make sure they match in your ~/.testim file.");if((u=f.code)!=null&&u.includes("ENOTFOUND"))throw new C("Due to network connectivity issues, Testim CLI has been unable to connect to the Testim backend.");if(f.text)try{let h=JSON.parse(f.text),g=h.clientMessage.color||"red",y=h.clientMessage.bgColor||"bgBlack";console.log(Pp.default[y](Pp.default[g](h.clientMessage.text))),h.exitCode&&process.exit(h.exitCode)}catch{Mt.error("Error parsing error message from server",f)}throw f}}async function SI(){if(rt)return{editorUrl:rt};try{return await(0,ee.default)(()=>ke("/system-info/editor-url"),{retries:te,onFailedAttempt:s=>{if(s.attemptNumber>=te)throw s},factor:1})}catch(s){return Mt.error("cannot retrieve editor-url from server",{err:s}),{editorUrl:"https://app.testim.io"}}}function xl(s){return(0,ee.default)(()=>ke("/grid",{companyId:s}),{retries:te,factor:1})}function eu(s,e,t){return(0,ee.default)(()=>ke(`/real-data/${e}?${t}&projectId=${s}`),{retries:te,factor:1})}function Jo(s,e,t,r,n){return(0,ee.default)(()=>Re({url:"/result/test",body:{projectId:s,resultId:e,testId:t,testResult:r,remoteRunId:n}}),{retries:te,factor:1})}function Du(s,e,t,r){return(0,ee.default)(()=>Re({url:"/result/test/clear",body:{projectId:s,resultId:e,testId:t,testResult:r}}),{retries:te,factor:1})}function Eu(s,e,t,r){return(0,ee.default)(()=>Re({url:"/remoteStep",body:{projectId:s,resultId:e,stepId:t,remoteStep:r}}),{retries:te,factor:1})}function EI(s){return s.startsWith("/")?s:`/${s}`}function II(s,e,t){let r=EI(s);return t&&(r=`/${t}${r}`),e&&(r=`/${e}${r}`),r}async function Bb(s,e,t,r,n,i="application/octet-stream"){let o=null;i==="application/json"&&(o=".json");let a=`${n}_${re()}${o||""}`,c=`${e}/${t}/${a}`,l=II(c,bI,s),m=Buffer.from(Fb.gzip(r,{level:3})),d={file:{fileName:a,buffer:m}};return await(0,ee.default)(()=>TI(`/storage${l}`,{},d,{"X-Asset-Encoding":"gzip"}),{retries:te,factor:1}),l}function au({projectId:s,runId:e,testId:t,newResultId:r,originalTestResultId:n,previousTestResultId:i,testResult:o}){return(0,ee.default)(()=>Re({url:"/result/test/retry",body:{projectId:s,newResultId:r,originalTestResultId:n,previousTestResultId:i,testId:t,runId:e,testResult:o}}),{retries:te,factor:1})}async function Cp(s){try{return await ke(`/integration/applitools/v3/connected?projectId=${s}`)}catch(e){return Mt.warn("could'nt get applitools integration data.",{err:e}),{}}}async function Dp(s,e){try{return await ai("/tunnel",{companyId:s,routes:e})}catch(t){return Mt.warn("could'nt get tunnel.",{err:t}),{}}}async function Np(s,e){try{return await Re({url:`/tunnel/${e}`,body:{companyId:s}})}catch(t){Mt.warn("could'nt get tunnel.",{err:t});return}}async function Mp(s,e){try{return await Ub(`/tunnel/${e}`,{companyId:s})}catch(t){Mt.warn("could'nt get tunnel.",{err:t});return}}function Fp(s){return Ve({url:`${he()}/result/remoteRunFailure`,body:s})}async function si({projectId:s,projectType:e,gridId:t,companyId:r,selectors:n}){let i=`${yI}/mobileDevices/${t}/${r}?projectType=${e}`;i=n?`${i}&selectors=${encodeURIComponent(n)}`:i;try{return await(0,ee.default)(()=>ke(i,{projectId:s}),{retries:te,factor:1})}catch(o){return Mt.warn("could'nt get devices from headspin grid.",{err:o}),null}}async function ip({projectId:s,gridId:e,app:t,timeout:r}){return(0,ee.default)(()=>Re({url:`/mobile-app/app/upload-to-grid?projectId=${s}&gridId=${e}`,body:t,timeout:r}),{retries:te,factor:1})}async function op(s){return(0,ee.default)(()=>Re({url:"/mobile-app/app/fix-grid-app-id",body:s}),{retries:te,factor:1})}async function Kl(s,e){return(0,ee.default)(()=>Re({url:"/slot-management/request-slot",body:{companyId:s,projectId:e}}),{retries:te,factor:1})}async function Jl(s,e,t){return(0,ee.default)(()=>Re({url:"/slot-management/release-slot",body:{companyId:s,projectId:e,slotId:t}}),{retries:te,factor:1})}async function Xl(s,e,t){return(0,ee.default)(()=>ai("/slot-management/update-slot",{slotId:t.slotId,companyId:s,projectId:e,slot:t}),{retries:te,factor:1})}function Yl(s,e,t){return Re({url:`/slot-management/keep-alive?reqId=${re()}`,body:{slots:t,companyId:s,projectId:e},timeout:1e4})}async function RI(s,e){return await Te(`${Vs}/sessions/${s}`,void 0,{Authorization:`Basic ${Buffer.from(`${e.user}:${e.key}`).toString("base64")}`})}async function wl(s){try{return await ke("/v2/project/validateUserAccessKey",s),!0}catch(e){return Mt.error("error validating user access key",{error:e}),!1}}var Pp,ur,Fb,ee,kp,hI,Mt,te,yI,bI,uu,vu,Nu,Ro,ge=E(()=>{"use strict";Pp=I(require("chalk")),ur=I(require("lodash")),Fb=I(require("pako"));B();oe();ae();Ge();lt();ee=I(require("p-retry")),kp=I(require("object-hash"));Y();$();Ip();hI=st(),Mt=P("testim service api"),te=3,yI="/grid",bI="test-result-artifacts";uu=async s=>(0,ee.default)(()=>ke("/grid/lt/config",{companyId:s}),{retries:te,factor:1}),vu=async s=>(0,ee.default)(()=>ke(`/labFeature/v2/project/${s}`),{retries:te,factor:1});Nu=ur.memoize(async(s,e,t,r)=>{if(!ur.isEmpty(r))return await Bb(s,e,t,JSON.stringify(r),"test-run-data","application/json")},(s,e,t,r)=>`${(0,kp.default)(r)}:${e}:${t}`),Ro=ur.memoize(async(s,e,t,r,n)=>!r||ur.isEmpty(r)?void 0:await Bb(s,e,t,JSON.stringify((()=>{let o=ur.clone(r);if(n!=null&&n.hiddenParams){let a=n.hiddenParams||[];(Array.isArray(a)?a:Object.keys(a)).forEach(l=>{o[l]&&Object.assign(o,{[l]:jc.HIDDEN_PARAM})})}return o})()),"test-test-data","application/json"),(s,e,t,r)=>`${(0,kp.default)(r)}:${e}:${t}`)});function Ka(){return st()}var Up=E(()=>{"use strict";B()});function CI(s){K.EXTENSION!==s&&process.nextTick(()=>{try{(we(),qe(ir)).getSessionPlayer()}catch{}})}function PI(s){var e,t;(t=(e=s.clientConfig)==null?void 0:e.clientMessages)!=null&&t.length&&s.clientConfig.clientMessages.forEach(r=>{let n=r.color||"yellow",i=r.bgColor||"bgBlack";console.log(Bp.default[i](Bp.default[n](r.text)))})}function kI(s,e){let{serviceUrl:t}=s;Gs(t),kt(async()=>s,Yr.CACHE_FN_NAME,Yr.TTL,{serviceUrl:t})(),Ut.setRegion(Tg[bs(e)])}async function ci(s){let{project:e,token:t,userAccessKey:r,lightweightMode:n,useLocalChromeDriver:i,useChromeLauncher:o,mode:a,gridId:c,grid:l}=s,m=Boolean(n==null?void 0:n.general),d=Boolean(i||o),u=m?AI:xI,f=Ka(),h=Fc(),g=await Vm(),y=null;if(O.flags.getPublicIpFrom3rdPartyServices.isEnabled()&&!d)try{y=await kb()}catch(b){jb.error("failed to get public ip",b)}let T=!0;F("before initializeUserWithAuth");let v=await kt(async()=>(CI(a),T=!1,await Lp({projectId:e,token:t,branchName:s.branch,lightweightMode:n,localGrid:d,publicIp:y,gridId:c,grid:l,clientCliVersion:f,clientNodeVersion:h,clientNpmVersion:g})),"initializeUserWithAuth",u,{project:e,token:t,branchName:s.branch,lightweightModeGeneral:m,localGrid:d,gridId:c,grid:l,publicIp:y})();return PI(v),kI(v.clientConfig,e),s.publicIps=[v.clientPublicIp],F("after initializeUserWithAuth"),y&&v.clientPublicIp&&v.clientPublicIp!==y&&(jb.error("public ip mismatch",{publicIpFromExternalService:y,publicIpFromServices:v.clientPublicIp}),s.publicIps.push(y)),uf(v.authData,{projectId:e,token:t,userAccessKey:r,publicIp:v.clientPublicIp,initializedFromCache:T}),v}var Bp,jb,xI,AI,$b=E(()=>{"use strict";Bp=I(require("chalk"));$e();ge();er();lt();$a();ae();$();de();Up();B();os();oe();Ao();jb=P("initializeUserWithAuth"),xI=1e3*60*5,AI=1e3*60*60*10});async function Gb(s){var r;let e=Promise.resolve();s.useLocalChromeDriver&&(s.chromeBinaryLocation=s.downloadBrowser?await Xi():s.chromeBinaryLocation,e=ln({projectId:s.project,userId:s.user},{chromeBinaryLocation:s.chromeBinaryLocation},Boolean((r=s.lightweightMode)==null?void 0:r.general)),s.useLocalChromeDriver=!0),!s.playerRequirePath&&s.mode!==K.EXTENSION&&await Sr(s.playerLocation,s.canary),s.mode!==K.SELENIUM&&s.mode!==K.APPIUM&&!s.ext&&await ul(s.extensionLocation);let t;if(s.installCustomExtension){let n=Boolean(s.useLocalChromeDriver||s.useChromeLauncher);t=await ll(s.installCustomExtension,n)}return await e,t}async function Hb(s){var o;OI.info("prepare MockNetwork",{location:s});let e=await Nc(s),t=Buffer.isBuffer(e)?e:e.body;if(t.byteLength>Wb*1e6)throw new Error(`${jp} exceeded ${Wb}MB`);let r;try{r=JSON.parse(t.toString("utf-8"))}catch(a){throw new Error(`${jp} cannot be parsed.${Ja.EOL}${a}`)}let n=new Vb.default;if(!n.validate(Yc,r)){let a=(o=n.errors)==null?void 0:o.map((c,l)=>`${++l}) ${c.dataPath} ${c.message}`).join(Ja.EOL);throw new Error(`${jp} is malformed.${Ja.EOL}${a}`)}return r.entries}var Ja,Vb,Wb,jp,OI,$p=E(()=>{"use strict";Ja=I(require("node:os"));B();Sm();pn();Vb=I(require("ajv"));ae();fl();$();$b();Wb=1,jp="JSON file supplied to --mock-network-pattern",OI=P("prepare runner")});function Xb(s){return s.start&&ls(null,"cli-start-command",{downloadBrowser:Boolean(s.downloadBrowser)}),!!(s.startV2||s.start||s.agent)}async function Yb(s){let e=!!s.start;if(Number.isNaN(s.agentPort))throw new C("Agent port is not number");let t=xo(s);return console.log("Start Testim CLI on Agent mode"),{project:s.project,token:s.token,agentMode:!0,agentPort:s.agentPort,agentBind:s.agentBind,openEditor:s.openEditor,startTestimBrowser:e,ext:s.ext,extensionPath:s.extensionPath,playerLocation:s.playerPath||t,canary:s.canary,playerPath:s.playerPath,playerRequirePath:s.playerRequirePath,downloadBrowser:Boolean(s.downloadBrowser)}}var Qb=E(()=>{"use strict";Dn();us();Y()});var Ms,Hp,Zb=E(()=>{"use strict";Ms="SECRETS",Hp={get secretsKey(){return Ms},get proxySecrets(){return new Proxy({},{get(s,e){return`${Ms}.${e}`}})},injectProxySecretsStoreToGlobal(){Object.assign(globalThis,{[Ms]:this.proxySecrets})},containsSecrets(s){return typeof s=="string"?s.includes(Ms):JSON.stringify(s).includes(Ms)},extractSecretKeysFromCode(s){let e=new Set,r=(typeof s=="string"?s:JSON.stringify(s)).match(new RegExp(`${Ms}\\.\\w+`,"g"));return r==null||r.map(n=>{let i=n.split(".")[1];i&&e.add(i)}),e},replaceValuesWithDecryptedSecrets({testData:s,secretsRecord:e}){let r=this.secretsKey.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=new RegExp(`^${r}\\.(\\w+)$`),i=o=>{Array.isArray(o)?o.forEach((a,c)=>{if(typeof a=="string"){let l=a.match(n);if(l){let m=l[1];o[c]=e[m]??a}}else typeof a=="object"&&a!==null&&i(a)}):o&&typeof o=="object"&&Object.entries(o).forEach(([a,c])=>{if(typeof c=="string"){let l=c.match(n);if(l){let m=l[1];o[a]=e[m]??c}}else typeof c=="object"&&c!==null&&i(c)})};i(s)}}});var Xp={};z(Xp,{doLogin:()=>Jp,getProjectId:()=>FI,getToken:()=>UI});async function FI(){return rT("projectId")}async function UI(){return rT("token")}function tT(s,e){return Promise.race([s,pe(e).then(()=>{throw new ce("timeout")})])}async function BI(){let s=(await import("express")).default(),e=async function(){return tT(new Promise(n=>{s.get("/loginInfo",(i,o)=>{n(JSON.parse(Buffer.from(i.query.info,"base64").toString())),o.status(200).end()})}),6e4).catch(()=>null)}();await new Promise((r,n)=>{let i=s.listen(42543,o=>{o&&n(o),r(i.address().port)})});try{let{getEditorUrl:r}=await Promise.resolve().then(()=>(ge(),Ce)),{editorUrl:n}=await r();ho(`${n}/#/new-test`)}catch{console.log(`Unable to open Testim automatically - please manually go to ${rt||gr}`)}return await e}async function Jp({overwriteExisting:s=!0,projects:e=null}={}){let t=qp.homedir(),r=zp.join(t,".testim");if(await ye(r)&&!s)return;let i={},[{default:o},{default:a}]=await Promise.all([import("prompts"),import("ora")]),c=a("Getting credentials from Tricentis Testim extension ...").start();if(e||(e=await tT(BI(),62e3).catch(()=>null)),e!=null&&e.token){i.token=e.token,i.projectId=e.projectId,c.succeed(),await eT(r,i);return}if(e!=null&&e.length){c.succeed();let l=e.length===1?{project:e[0]}:await o({type:"select",name:"project",message:"There are multiple projects associated with your user account. Please select the project you would like to connect to:",choices:e.map(m=>({title:m.name,value:m}))});i.token=l.project.ci.token,i.projectId=l.project.id,await eT(r,i);return}c.fail(),console.log("Error getting credentials - please pass `--token` and `--project` to the CLI or try again")}async function eT(s,e){await Kp.promises.writeFile(s,Ya.stringify(e)),console.log(`Testim credentials saved in '${s}'`)}async function rT(s){let e=qp.homedir(),t=zp.join(e,".testim"),r=await ye(t),n={};if(r)try{n=Ya.parse((await Kp.promises.readFile(t)).toString())}catch{}return n||={},n[s]}var qp,zp,Ya,Kp,Qa=E(()=>{"use strict";qp=I(require("os")),zp=I(require("path")),Ya=I(require("yaml"));B();Kp=require("fs");Y();Gl();oe()});var pT={};z(pT,{process:()=>KI,program:()=>p});var Qp,aT,Za,cT,Kt,Fe,lT,jI,Me,ed,$I,WI,nT,uT,VI,Zp,ec,td,Yp,Ft,iT,GI,HI,p,qI,zI,oT,KI,rd=E(()=>{"use strict";Qp=I(require("ms")),aT=I(require("chalk")),Za=I(require("node:fs")),cT=I(require("node:url")),Kt=I(require("lodash")),Fe=I(require("node:path"));B();Dn();Qb();er();lT=require("commander");ae();Y();Hr();B();de();Zb();Go();Ao();oe();jI=s=>s.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),Me=(s,e)=>(e.push(s),e),ed=new lT.Command,$I=s=>s.split(","),WI=(s,e)=>!s||s.length===0?e:s,nT=["enable-heavy-ad-intervention","heavy-ad-privacy-mitigations","use-fake-device-for-media-stream","use-fake-ui-for-media-stream","proxy-server"],uT=()=>{function s(g){return g.includes("-h, --help")}function e(g){return g.includes("--params [params-json-string]")}function t(g){return g.includes("--ext")||g.includes("--extension-path")||g.includes("--headless-extension-download-path")}function r(g){return g.includes("--player-path")||g.includes("--player-require-path")}function n(g){return g.includes("--executionId")||g.includes("--source")||g.includes("--resultId")||g.includes("--remoteRunId")||g.includes("--schedulerId")}function i(g){return g.includes("--get-browser-timeout")||g.includes("--get-browser-retries")||g.includes("--get-session-timeout")||g.includes("--get-session-retries")||g.includes("--driver-request-timeout")||g.includes("--driver-request-retries")}function o(g){return g.includes("--user")}function a(g){return g.includes("shouldMonitorPerformance")}function c(g){return g.includes("--save-rca-locally")}function l(g){return g.includes("--exit-code-ignore-failing-tests")}function m(g){return g.includes("--high-speed")}function d(g){return g.includes("--urls")}function u(g){return g.includes("--test-start-timeout")}function f(g){return g.includes("--install-lazy-deps")}function h(g){return g.includes("--print-final-caps")||g.includes("--print-grids")}ed.help(g=>g.split(`
|
|
404
|
+
return downloadAndUploadFile.apply(null, arguments);`,t.locatedElement,m);return}let d=await Dy(m,this.uploadFile);await this.uploadFilesAndForceVisibility(d,t)}}});var wa,va,Fy=E(()=>{"use strict";wa=require("url");me();va=class extends H{async updateBaseUrl(e){let t=new wa.URL(e),r=new wa.URL(this.context.recordedBaseUrl),n=new wa.URL(this.context.baseUrl);return t.host===r.host&&r.host!==n.host&&(t.host=n.host),t.href}async performAction(){let e=this.context.data.testimNavigationStepDestination||this.context.data.url;if(this.step.openInNewTab){await this.driver.client.newWindow(e);return}let t=await this.updateBaseUrl(e);await this.driver.url(t)}}});var Sa,Uy=E(()=>{"use strict";me();B();Sa=class extends H{async performAction(){await pe(this.step.durationMS||0)}}});var Ea,By=E(()=>{"use strict";me();Ea=class extends H{async execute(){try{return await this.driver.reloadTab(),{success:!0}}catch(e){return{success:!1,reason:e.message}}}}});var Zn,jy=E(()=>{"use strict";me();Zn=class extends H{async runApiInAut(e){var n;e.withCredentials=!0;let t=this.context.data.timeToPlayStep+3e3,{apiCall:r}=this.sessionPlayerInit;try{let i=await this.driver.executeCodeAsync(r,t,e);return(i==null?void 0:i.value)||{}}catch(i){throw(n=i==null?void 0:i.message)!=null&&n.includes("Javascript execution context no longer exists")?new Error('The page refreshed or changed while executing this step. Please consider unchecking "Send via web page" if this is expected.'):i}}runApiInBg(e){let{apiCall:t}=this.sessionPlayerInit;return t(e)}async performAction(){let{sessionPlayerInit:{commonConstants:e},step:t,context:r}=this,n={id:t.id,url:r.apiUrl,method:t.method,headers:r.apiHeaders,body:r.apiBody,timeout:r.data.maxTotalStepTime,omitCookies:t.omitCookies,forceUseFetch:["android","ios"].includes(r.project.type),formData:t.formData,fileUrls:r.fileUrls},i=t.sendViaWebApp?await this.runApiInAut(n):await this.runApiInBg(n),o=i.result||{},a={method:t.method,status:o.status,url:t.url};return i.success?o.status===0?{result:o,resultInfo:a,shouldRetry:!1,success:!1,reason:"Connection problem",errorType:e.stepResult.API_REQUEST_NETWORK_ERROR}:{result:o,resultInfo:a,shouldRetry:!1,success:!0}:{result:o,resultInfo:a,shouldRetry:!1,success:!1,reason:o.error||e.error.REQUEST_TIMED_OUT,errorType:o.exception?void 0:o.error?e.stepResult.API_FAILURE:e.stepResult.API_REQUEST_NETWORK_ERROR}}}});var Ia,$y=E(()=>{"use strict";me();Ia=class extends H{async performAction(){let e=this.step.extractTextParamName,t=await this.stepActionUtils.extractTargetText(this.getTarget());return this.context.data.exports||={},this.context.data.exports[e]=t,{success:!0,data:this.context.data}}}});var Wy,Ju,Xu,Vy=E(()=>{"use strict";Wy=I(require("@applitools/spec-driver-webdriverio"));bi();we();Ju=class{constructor(){let{EyeSdkBuilder:e}=Z(),t=vd["@applitools/eyes-sdk-core"]||"N/A",{makeSDK:r}=require("@applitools/eyes-sdk-core");this.sdk=r({name:"Testim.io",version:`4.0.1/eyes-sdk-core/${t}`,spec:Wy.default}),this.handleApplitoolsSdkResult=e.handleApplitoolsSdkResult}async getManager(e,t,r,n){let{EyeSdkBuilder:i}=Z(),o=await this.sdk.makeManager({type:e?"ufg":"classic",concurrency:t});return i.rememberCreatedBatch(r,n),o}},Xu=new Ju});var Hy,Gy,ei,qy=E(()=>{"use strict";Hy=I(require("lodash"));me();$();Vy();Gy=P("pixel-validation-step-action"),ei=class extends H{async performAction(){var d,u;let{shouldUseVisualGrid:t,applitoolsSdkConfig:r,applitoolsSdkLogger:n,testResultId:i}=this.context;this.runContext=this.context.getRunContext(void 0);let o=((d=this.runContext.incomingParams)==null?void 0:d.final)||{},a=((u=r.batch)==null?void 0:u.id)||i,c=await Xu.getManager(t,this.context.config.applitoolsConcurrency||5,a,this.runContext.applitoolsIntegrationData),l=this.getTarget()||{},m;try{let f=await c.openEyes({driver:this.driver.client,config:r,logger:n}),g={region:this.step.action==="element"&&l.seleniumElement||void 0,fully:this.step.action==="stitched"};Hy.isPlainObject(o.applitoolsStepSettings)&&(Object.assign(g,o.applitoolsStepSettings),Gy.info("Applitools SDK step executed with applitoolsStepSettings parameter",{applitoolsStepSettings:o.applitoolsStepSettings})),await f.check({settings:g}),m={isApplitoolsSdkResult:!0,success:!0,eyesResults:await f.close()}}catch(f){Gy.error("Applitools SDK step failed",{err:f,info:f.info}),m={isApplitoolsSdkResult:!0,success:!1,err:f}}return await Xu.handleApplitoolsSdkResult(this.context,m,this.step)}}});var Os,Yu=E(()=>{"use strict";Rs();Y();ua();Os=class extends cr{async executeCliCode(){var h,g,y;let{step:e,context:t}=this,r=this.stepActionUtils.driver.isMobile;if(!((y=(g=(h=t.company)==null?void 0:h.activePlan)==null?void 0:g.premiumFeatures)==null?void 0:y.cliAction)&&!r)return{success:"skipped",reason:"CLI action is not enabled in your current plan"};let{code:i="",id:o=""}=e,{incomingParams:a,testResultId:c,retryIndex:l,stepResultId:m}=t,d={config:t.config,data:t.data},u=t.data.timeToPlayStep,f=await Is(i,o,a,d,c,l,m,u);return this.checkCodeResponse(f)}async performAction(){try{return await this.executeCliCode()}catch(e){let{stepResult:t}=this.sessionPlayerInit.commonConstants;return e instanceof ce?{success:!1,errorType:t.ACTION_TIMEOUT}:{success:!1,reason:e.message,exception:e}}}}});var lr,zy=E(()=>{"use strict";Yu();lr=class extends Os{isFailedResult(e){return e===!1}}});var Ra,Ky=E(()=>{"use strict";Yu();Ra=class extends Os{isFailedResult(e){return!e}}});var xa,Jy=E(()=>{"use strict";Rs();me();Y();xa=class extends H{async performAction(){let{stepId:e,packageData:t,resultId:r,retryIndex:n,stepResultId:i,timeToPlayBeforeExec:o}=this.context;try{return{data:await Es(e,r,n,t,i,o),success:!0}}catch(a){return a instanceof Ct?{success:!1,code:"invalid-node-package",message:a.message}:a instanceof ce?{success:!1,code:"timeout"}:{success:!1,reason:a.message,exception:a}}}}});var Ur,Xy=E(()=>{"use strict";me();Ur=class extends H{async performAction(){return{success:"skipped",reason:"This step can run only in \u2018extension\u2019 run mode with either Chrome or Edge Chromium"}}}});var be,Yy=E(()=>{"use strict";me();be=class extends H{async performAction(){var r,n;let{sfdc:e}=this.sessionPlayerInit,t=e.sfdcNewSePage(this.driver,this.context.sfdcLogHandler||((i,o)=>this.context.playback.sfdcAddLog(i,o)));t.log.info(`BEGIN STEP '${(n=(r=this.step).getStepPreview)==null?void 0:n.call(r)}'`);try{let i=this.context.sfdcTestActions;if(i===void 0)throw new Error("No test actions were compiled");return{success:!0,reason:await e.sfdcExecute(t,i,this.context)}}catch(i){return{success:!1,reason:i.reason||i.message,exception:i,shouldRetry:!1}}finally{t.releaseObjects()}}}});var Aa,Qy=E(()=>{"use strict";me();Aa=class extends H{async performAction(){var r,n;let{sfdc:e}=this.sessionPlayerInit,t=e.sfdcNewSePage(this.driver,this.context.sfdcLogHandler||((i,o)=>this.context.playback.sfdcAddLog(i,o)));t.log.info(`BEGIN STEP '${(n=(r=this.step).getStepPreview)==null?void 0:n.call(r)}'`);try{return{success:!0,reason:await e.sfdcExecuteRecordedStep(t,this.step.recordedData,this.context)}}catch(i){return{success:!1,reason:i.reason||i.message,exception:i,shouldRetry:!1}}finally{t.releaseObjects()}}}});var Ca,Zy=E(()=>{"use strict";me();Ca=class extends H{async performAction(){let{sfdc:e}=this.sessionPlayerInit,t=e.sfdcNewSePage(this.driver,this.context.sfdcLogHandler);try{return await e.sfdcExecuteJavascript(t,this.step.code||"",this.context),{success:!0}}catch(r){return{success:!1,reason:r.reason||r.message,exception:r,shouldRetry:!1}}finally{t.releaseObjects()}}}});function jE(s,e){Object.keys(s).forEach(t=>{e.registerStepAction(t,s[t])})}function Pa(s,e){jE($E,e),e.registerLocateStepActionUtils(Jn.getUtils(s))}var $E,Qu=E(()=>{"use strict";Jh();Qh();ay();cy();uy();my();hy();yy();by();Ty();Sy();Ey();Iy();Ay();ky();My();Fy();Uy();By();jy();$y();qy();zy();Ky();Jy();Xy();Yy();Qy();Zy();$E={locate:Jn,scroll:ia,mouse:oa,submit:fa,text:ca,"special-key":pa,"user-code":zt,"validation-code-step":zt,"wait-for-code-step":zt,"action-code-step":zt,"condition-step":ks,"skip-code-step":ks,"element-code-step":ks,"evaluate-expression":aa,"text-validation":Yn,"wait-for-text-validation":Yn,"select-option":ma,"drop-file":ya,"input-file":Ta,hover:ga,navigation:va,wheel:ha,sleep:Sa,refresh:Ea,"keyboard-shortcut-step":da,"api-validation":Zn,"api-action":Zn,"api-code-step":zt,"extract-text":Ia,"simple-ui-verification":ei,"wait-for-simple-ui-verification":ei,"cli-validation-download-file":Ur,"cli-wait-for-download-file":Ur,"network-validation-step":Ur,"cli-validation-code-step":lr,"cli-wait-for-code-step":lr,"cli-action-code-step":lr,"cli-api-code-step":lr,"cli-condition-step":Ra,"node-package":xa,"email-code-step":zt,"cli-email-code-step":lr,"sfdc-internal-test-step":Ca,"sfdc-recorded-step":Aa,"sfdc-step-login":be,"sfdc-step-loginas":be,"sfdc-step-logout":be,"sfdc-step-sobjectcreate":be,"sfdc-step-sobjectdelete":be,"sfdc-step-findrecord":be,"sfdc-step-quickaction":be,"sfdc-step-sobjectedit":be,"sfdc-step-sobjectvalidate":be,"sfdc-step-launchapp":be,"sfdc-step-wait-for-page-load":be,"sfdc-step-closeconsoletabs":be,"sfdc-step-relatedlistaction":be,"sfdc-step-permission-validation":be,"sfdc-step-convert-lead-to-opportunity":be,"sfdc-step-quotelineeditor":be,"sfdc-document-validation":Ur,"sfdc-step-flow-screen-completion":be,"sfdc-step-sobjectverifyoptions":be}});var eb,WE,_s,Zu=E(()=>{"use strict";eb=["simple-ui-verification","wait-for-simple-ui-verification"],WE=[...eb,"custom-validation","sfdc-internal-test-step","sfdc-recorded-step","sfdc-step-login","sfdc-step-loginas","sfdc-step-logout","sfdc-step-sobjectcreate","sfdc-step-sobjectdelete","sfdc-step-findrecord","sfdc-step-quickaction","sfdc-step-sobjectvalidate","sfdc-step-launchapp","sfdc-step-wait-for-page-load","sfdc-step-closeconsoletabs","sfdc-step-sobjectedit","sfdc-step-relatedlistaction","sfdc-step-permission-validation","sfdc-step-convert-lead-to-opportunity","sfdc-step-quotelineeditor","sfdc-document-validation","sfdc-step-flow-screen-completion","sfdc-step-sobjectverifyoptions"],_s=class{constructor(e){this.isDebuggerConnected=e;this.totalStepTime=0;this.currentRetryStart=0;this.totalStepTimesReport=[];this.currentRetryTimes=[];this.currentRetryTimesReport={};this.resetStepVariables(),this.resetRetryVariables()}resetStepVariables(e,t){this.currentRetryTimes=t||[],this.totalStepTime=e||0,this.totalStepTimesReport=[],this.currentRetryTimesReport={};let r=Date.now();this.currentRetryStart=r,this.lastUpdateTime=r}resetRetryVariables(){let e=Date.now();this.currentRetryStart=e,this.lastUpdateTime=e,this.totalStepTimesReport.push(this.currentRetryTimesReport),this.currentRetryTimesReport={}}initStepRun(e){let t=i=>{let o=this.getTotalStepTimeLeftToPlay(e,i),a=5e3;return o<=a?[a]:[Math.max(a,o/3)]};e.setStartTimestamp();let r=this.getTotalStepRunTime(e),n=WE.includes(e.stepType)?[r]:t(r);this.resetStepVariables(r,n),e.context.data.maxTotalStepTime=r}initRetryTime(){this.resetRetryVariables()}getTotalStepRunTime(e){let r=e.context.config.stepTimeout;return eb.includes(e.stepType)&&(r=e.context.config.applitoolsStepTimeout||18e5),e.step.type.startsWith("sfdc-")&&(r=e.step.defaultTimeout),e.step.useStepTimeout&&e.step.stepTimeout?e.step.stepTimeout:r}getTotalStepTimeLeftToPlay(e,t=this.totalStepTime){let r=Date.now()-e.startTimestamp;return t-r}getCurrentRetryTime(e){return e.retryIndex<this.currentRetryTimes.length?this.currentRetryTimes[e.retryIndex]:this.getTotalStepTimeLeftToPlay(e)}getTotalCurrentRetryTimeLeft(e){let t=Date.now()-this.currentRetryStart;return this.getCurrentRetryTime(e)-t+1e3}getTabTimeout(e){return this.getTotalCurrentRetryTimeLeft(e)}getDynamicParentTimeout(e){return this.getTotalCurrentRetryTimeLeft(e)}getFrameTimeout(e){return this.getTotalCurrentRetryTimeLeft(e)}getLocateTimeout(e){return this.getTotalCurrentRetryTimeLeft(e)}getActionTimeout(e){if(this.isDebuggerConnected)return 6e5;let t=5e3,r=e.step.type,n=3e4;return r==="sleep"?e.step.durationMS+t:Math.max(this.getTotalStepTimeLeftToPlay(e),n)}}});var rb={};z(rb,{SeleniumTestPlayer:()=>ti});var tb,VE,ti,ep=E(()=>{"use strict";B();tb=require("@applitools/eyes-sdk-core");Bn();Y();$();Vu();Gh();zu();sa();zh();Ku();we();Qu();Zu();oe();VE=P("SeleniumTestPlayer"),ti=class{constructor(e,t,r,n,i=void 0,o=void 0){this.id=e;this.playbackTimeoutCalculator=new _s(na());let{SessionPlayer:a,commonConstants:c,StepActionFactory:l}=Z();this.driver=n??new Or;let m=new ra(this.driver);this.stepActionFactory=new l(m),Pa(this.driver,this.stepActionFactory),this.tabService=this.driver.tabService||new ea(this.driver),this.driver.tabService=this.tabService,this.tabService.createSesion(e);let d=qh(this.driver);this.sessionPlayer=new a(e,{tabService:this.tabService,cookieUtils:new Ps(this.driver),FrameLocator:d,portSelector:ta,LocateElementPlayer:null,stepActionUtils:m,stepActionFactory:this.stepActionFactory,playbackTimeoutCalculator:this.playbackTimeoutCalculator,makeSDK:tb.makeSDK}),this.sessionPlayer.setShouldMonitorPerformance(Boolean(r)),this.tabService.setAddFrameHandlerCallBack(this.sessionPlayer.addPlaybackFrameHandler.bind(this.sessionPlayer)),this.sessionPlayer.playbackManager.isRemoteSession=!0,this.sessionPlayer.playbackManager.isLocalRun=!1,this.sessionPlayer.playbackManager.testRetryCount=i,this.sessionPlayer.playbackManager.previousTestResultId=o,this.sessionPlayer.playbackManager.userParamsData=t||{},this.onStepCompleted=this.onStepCompleted.bind(this),this.sessionPlayer.playbackManager.on(c.playback.RESULT,this.onStepCompleted)}onStepCompleted(e,t,r,n){n!=null&&n.isTabOpener&&this.tabService.addNewPopup(this.id,n.id).catch(()=>null)}async onDone(){var r,n;let{commonConstants:e}=Z(),t=1e3*60*2;try{await le((r=this.driver)==null?void 0:r.end(),t)}catch(i){i instanceof ce&&await((n=this.driver)==null?void 0:n.forceEnd().catch(()=>null))}this.sessionPlayer.playbackManager.off(e.playback.RESULT,this.onStepCompleted),Object.assign(this,{sessionPlayer:null,tabService:null,stepActionFactory:null,driver:null})}clearSessionTabs(){this.tabService.clearAllTabs(this.id)}async addTab(e,t={loadInfo:!0}){let r=await this.driver.getTabIds();if(!Array.isArray(r)){VE.error("addTab: driver.getTabIds() returned a non-array",{ids:r});return}let n=r.at(-1);await this.tabService.addNewTab(this.id,n,e,t),await this.sessionPlayer.addPlaybackFrameHandler(n,void 0,{emptyPage:!0})}async addAllTabs(e,t={loadInfo:!0,checkForMainTab:!0,takeScreenshots:!0},r=[]){let n=await this.driver.getTabIds(),i=[new URL(rt||gr).hostname].concat(r);for(let o of n.reverse()){await this.tabService.addNewTab(this.id,o,e,{...t,forceSwitch:!0});let a=this.tabService.getTabInfo(this.id,o);if(i.some(c=>a.url.includes(c))){this.tabService.removeTabInfo(this.id,o);continue}await this.sessionPlayer.addPlaybackFrameHandler(o,void 0,{emptyPage:!0})}if(this.tabService.tabCount(this.id)===1){let o=this.tabService.getMainTabInfo(this.id),a=this.tabService.getTabUtils(this.id,o);await this.tabService.switchTab(a.tabId,this.id,{forceSwitch:!0})}this.tabService.fixMissingMainTab(this.id)}getSessionId(){return this.driver.getSessionId()}}});var rp={};z(rp,{WorkerSelenium:()=>tp});function HE(s){let{playback:e}=Z().commonConstants;for(let t of Object.values(e))s.playbackManager.on(t,()=>F(`Got event ${t}`))}var ka,GE,tp,sp=E(()=>{"use strict";B();$e();zn();$();Lt();Fo();ae();$u();Y();ep();we();lt();ka=P("worker-selenium"),GE=1e9,tp=class extends Nt{initPlayer(t){return new ti(this.id,t.runParams,this.options.shouldMonitorPerformance,void 0,t.retryCount,t.previousTestResultId)}async getBrowserOnce(t,r,n,i){F("in WorkerSelenium getBrowserOnce"),Q.onGetSession(this.id,this.testName,t.runMode);let{driver:o}=n;this.windowUtils=new Cs(this.id,o),n.clearSessionTabs();let{browserValue:a}=this.testRunConfig,c=t.baseUrl;try{let l=this.options.useLocalChromeDriver;await o.init({projectData:this.options.projectData,browserOptions:this.options,testName:this.testName,testRunConfig:this.testRunConfig,gridInfo:i,customExtensionLocalLocation:r,executionId:this.executionId,testResultId:this.testResultId,seleniumPerfStats:t.seleniumPerfStats,fastInit:l,lambdatestService:this.lambdatestService,printFinalCaps:this.options.printFinalCaps,mode:K.SELENIUM}),F("in WorkerSelenium after driver.init"),await n.addTab(void 0,{skipLoadInfo:l}),F("in WorkerSelenium after addTab"),l||await this.windowUtils.navigate(c,GE),await this.windowUtils.validatePageIsAvailable(),F("in WorkerSelenium after navigate")}catch(l){let m=l.message&&(l.message.startsWith("Malformed URL")||l.message.includes("Reached error page: about:neterror"))&&a==="firefox",d=l.message&&l.message==="invalid argument";throw l instanceof At||m||d?new At(`Page '${c}' is not available`):(ka.error("failed to navigate to page",{baseUrl:c,err:l,whitelistedPublicIp:Zi(),initializedFromCache:eo()}),l)}}async runTestOnce(t,r){var d;let{manifestVersion:n,localAssetService:i}=Z(),{driver:o,sessionPlayer:a}=r,c=n||"runner";Q.onWaitToTestComplete(this.id),HE(a),a.playbackManager.executionId=t.executionId,a.playbackManager.executionName=t.executionName,this.options.mode===K.SELENIUM&&a.setLightweightMode(this.options.lightweightMode),t.sfdcCredential&&a.setSfdcCredential(t.sfdcCredential),i.initialize({serverUrl:this.options.localRCASaver});let l=null;(d=this.options.lightweightMode)!=null&&d.preloadTests&&(l=(await Wn(this.options))[this.testId]);let m=async()=>le(new Promise((u,f)=>{a.playByTestId({testId:this.testId,executionId:this.executionId,resultId:this.testResultId,baseUrl:this.baseUrl,userData:this.userData,version:c,resolve:u,isLocalRun:!1,overrideTestConfigId:this.overrideTestConfigId,branch:this.branch,incognito:!1,remoteRunId:t.remoteRunId,preloadedTest:l}).catch(f)}),this.testRunTimeout,Ae.TEST_COMPLETE_TIMEOUT_MSG).catch(u=>{var f;throw u instanceof ce&&((f=a.stopPlayingOnTestTimeout)==null||f.call(a)),u}).then(async u=>{await i.drain(),u.stepsResults=null,u.resultId=this.testResultId,o.isAlive()||(ka.warn(`possible grid unresponsive for test ${this.testId}, result ${this.testResultId} (execution: ${this.executionId})`),u.gridIssues="could not validate grid is alive");let f=o.maxKeepAliveGap();f>=3e4&&(ka.warn(`possible browser keep alive issue ${this.testId}, result ${this.testResultId} (execution: ${this.executionId})`),u.keepAliveIssue=f);let g={...u,...t.seleniumPerfStats.getStats()};return this.lambdatestService.isLambdatestRun()&&await o.executeJS(`lambda-status=${g.success?"passed":"failed"}`).catch(()=>{}),g});o.start(),F("right before super.runTestOnce in workerSelenium");try{await super.runTestOnce(t,r),F("right after super.runTestOnce in workerSelenium");let u=await m();return F("right after runSeleniumTest"),u}catch(u){throw ka.error("failed to run test once",{err:u}),u}}}});var sb,nb,He,qE,zE,np,Et,Oa=E(()=>{"use strict";sb=I(require("ora")),nb=require("jimp");oe();Ge();ge();$();ae();we();de();He=P("mobile-grid-service"),qE="https://tdc.tricentis-cloud.com",zE="https://ui.headspin.io",np=class{constructor(){this.gridsAppIdGetter={[_.TESTIM_TDC]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("testimTdcAppId",t),[_.TESTIM_TVC]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("testimTvcAppId",t),[_.P_CLOUDY]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("pCloudyAppId",t),[_.TESTIM_HEADSPIN]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("headSpinAppId",t),[_.BROWSERSTACK]:({testRunHandler:e,mobileApp:t})=>e.getAppPath("browserStackAppId",t),[_.SAUCELABS]:({testRunHandler:e,mobileApp:t,gridHost:r})=>e.getSauceLabsAppPath(r,t)}}isTdcOrHeadSpinGrid(e){return e===_.TESTIM_TDC||e===_.TESTIM_HEADSPIN}getLockDeviceApiUrl(e){let t=this.getBaseApiUrl(e);return this.isTdcOrHeadSpinGrid(e.type)?`${t}/lock`:""}getBaseApiUrl(e){let{type:t,apiUrl:r}=e;return t===_.TESTIM_HEADSPIN?`${r||bc}/${wc}/devices`:t===_.TESTIM_TDC?`${r||Tc}/${wc}/devices`:""}getHeaders(e){return{...this.isTdcOrHeadSpinGrid(e.type)&&{"Content-Type":"application/json",Authorization:`Bearer ${e.accessToken}`}}}buildRequestBody(e,t){return{...this.isTdcOrHeadSpinGrid(e.type)&&{device_id:t}}}async lockDevice(e,t){let r=this.getLockDeviceApiUrl(e),n=this.getHeaders(e),i=this.buildRequestBody(e,t);try{await Ve({url:r,headers:n,body:i})}catch(o){throw He.debug(`error while locking device ${t}`,{error:o}),o.status===401?new Error(`failed to lock device ${t}, device may be already locked and in use`):o}}async getHeadSpinDeviceConnection(e,t){let n=`${this.getBaseApiUrl(e)}/device_id:${t}/automation-config`;try{let i=await Te(n,void 0,this.getHeaders(e));return this.extractHeadSpinDeviceConnection(i,e.accessToken)}catch(i){throw He.error("error while getting automation config for device",{error:i,deviceId:t}),i}}async getPCloudyAuthToken(e,t,r){let n=await Ys(`https://${e}/api/access`,void 0,{Authorization:`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`});return JSON.parse(n).result.token}extractHeadSpinDeviceConnection(e,t){let r=Object.keys(e)[0],n=e[r].driver_url,i=new URL(n);return{hostname:i.hostname,port:Number(i.port),protocol:i.protocol.slice(0,-1),path:`/v0/${t}/wd/hub`}}async getGridDirectConnection(e,t){let r={};return this.isTdcOrHeadSpinGrid(e.type)&&(r=await this.getHeadSpinDeviceConnection(e,t)),r}getGridConnection(e){var r;if(this.isTdcOrHeadSpinGrid(e.type)){let n=(r=e.host)!=null&&r.includes("ulb.tdc.tricentis-cloud.com")?`/ulb/appium/v0/${e.accessToken}/wd/hub`:`/v0/${e.accessToken}/wd/hub`;return{protocol:e.protocol||"https",hostname:e.host,port:e.port,path:n}}if(e.type===_.TESTIM_TVC)return{protocol:e.protocol||"https",hostname:e.host,port:443,path:"/wd/hub"};if(e.type===_.P_CLOUDY)return{protocol:e.protocol||"https",hostname:e.host,port:443,path:"/appiumcloud/wd/hub",user:e.user,key:e.key};if([_.BROWSERSTACK,_.SAUCELABS].includes(e.type))return{protocol:e.protocol||"https",hostname:e.host,port:443,path:"/wd/hub",user:e.user,key:e.key}}async getDeviceNameFromSessionCaps({capabilities:e,gridType:t,projectId:r,projectType:n,companyId:i,gridId:o}){var a,c,l;if(t===_.TESTIM_HEADSPIN||t===_.TESTIM_TDC){let m=await si({projectId:r,projectType:n,companyId:i,gridId:o,selectors:`device_id:${e.udid}`});return((a=m==null?void 0:m[0])==null?void 0:a.name)||e.device}if(t===_.BROWSERSTACK)return((c=e.mobile)==null?void 0:c.version.split("-")[0])||((l=e.desired)==null?void 0:l.deviceName);if(t===_.SAUCELABS)return e.testobject_device_name;if(t===_.P_CLOUDY){if(e.pCloudy_DeviceFullName){let m=e.pCloudy_DeviceFullName.split("_");return`${m[0]} ${m[1]}`}return e.deviceModel}return e.device}async updateDeviceOnRemoteTestResult(e,t,r,n,i=!1){let{executionId:o,testId:a,testResultId:c}=e,{project:l,projectData:{type:m}={},company:{companyId:d=""}={},gridData:{gridId:u="",type:f=""}={}}=n,h=t.capabilities,g=h.platformName,y;if(f===_.TESTIM_TVC){let{getTvcDeviceInfoFromSessionCaps:v}=Z();y=v(t.capabilities,i)}else y=await this.getDeviceFromAppiumCapabilities(h,t,r,g,f,l,m,d,u,i);let T=await this.buildRemoteResultLink(n.gridData,t.sessionId,h);return await Cr(l,o,a,c,"RUNNING",{device:y,...T&&{remoteResultLink:T}}),He.info("device details updated on testResult",{testResultId:c,executionId:o,testId:a,device:y,remoteResultLink:T,gridType:f}),y}getOsVersion(e,t){var n;let r=e.platformVersion;return!r&&t===_.BROWSERSTACK?(n=e.mobile)==null?void 0:n.version.split("-")[1]:r}async getScaleFactorAndSize(e,t,r,n,i){if(e.pixelRatio&&typeof e.deviceScreenSize=="string"){let o=e.deviceScreenSize.split("x"),a=Number(o[0]),c=Number(o[1]);return{scaleFactor:e.pixelRatio,width:a,height:c}}try{let{AppiumApi:o}=Z(),a=new o(t,r.sessionId,null,i),[c,l]=await Promise.all([a.getScreenshot(),a.getDeviceSize()]),m=Buffer.from(c,"base64"),d=await nb.Jimp.fromBuffer(m),u=d.bitmap.width,f=d.bitmap.height;return{scaleFactor:u/l.width,width:u,height:f}}catch(o){return He.warn("failed to get device scale factor from appium, applying default scale factor",{err:o}),{scaleFactor:n==="android"?1:2}}}async getDeviceFromAppiumCapabilities(e,t,r,n,i,o,a,c,l,m){let[d,u]=await Promise.all([this.getScaleFactorAndSize(e,r,t,n,m),this.getDeviceNameFromSessionCaps({capabilities:e,gridType:i,projectId:o,projectType:a,companyId:c,gridId:l})]),f=this.getOsVersion(e,i);return{name:u??"",model:e.deviceModel,udid:e.udid,osVersion:f,osType:n,isVirtual:!1,...d}}async buildRemoteResultLink(e,t,r){return e.type===_.BROWSERSTACK?(await this.fetchWithUserAndPasswordAuth({url:`${Vs}/sessions/${t}.json`,user:e.user,key:e.key})).automation_session.public_url:e.type===_.SAUCELABS?r.testobject_test_report_url:e.type===_.TESTIM_TVC?r.replayUrl:e.type===_.TESTIM_HEADSPIN||e.type===_.TESTIM_TDC?`${e.type===_.TESTIM_HEADSPIN?zE:qE}/sessions/${t}/waterfall`:""}async getTmaDeviceDetails(e,t){let n=(await Te(`${e}/api/devices`)).find(i=>i.udid===t);if(!n)throw new Error(`device ${t} not found`);return{udid:n.udid,name:n.name,model:n.model,height:n.height,width:n.width,geo:"local",osVersion:n.osVersion,osType:n.deviceType.toLowerCase(),scaleFactor:n.scaleFactor??0,isVirtual:n.virtual??!1,minApiVersion:n.minApiVersion}}async updateTmaDeviceDetails(e,t,r){let{executionId:n,testId:i,testResultId:o}=r,{project:a,localTmaUrl:c}=t,l=await this.getTmaDeviceDetails(c,e);return await Cr(a,n,i,o,"RUNNING",{device:l}),He.info("device details updated on testResult",{testResultId:o,executionId:n,testId:i,device:l}),l}async getGridAppId({gridData:e,testRunHandler:t,projectId:r}){let n=e.type,i=t.mobileApp,o=this.gridsAppIdGetter[n]({testRunHandler:t,mobileApp:i,gridHost:e.host});return o?(O.flags.allowFixingAppIdStructure.isEnabled()&&(He.info("fixing gridAppId structure",{gridAppId:o,projectId:r,testResultId:t.testResultId,executionId:t.executionId}),await op({gridAppId:o,gridId:e.gridId,projectId:r,gridType:n,appId:i.appId,gridHost:e.host})),o):t.getAppPathByGridType(n,e.gridId,i)}async getMobileAppDataByAppId({appId:e,projectId:t,token:r}){let n=await ri({appId:e,projectId:t});return{appUrl:`${he()}/storage${n.filePath}?access_token=${r}`,mobileApp:n}}calculateUploadRequestTimeOut(e){let t=0,r=Math.ceil(e/1024);return t=(Math.ceil(r/(Nd*60))+1)*60*1e3,Math.max(Dd,t)}async uploadAppToGrid({projectId:e,testRunHandler:t,mobileApp:r,gridId:n,gridType:i}){let a={[_.BROWSERSTACK]:{name:"Browserstack"},[_.TESTIM_TVC]:{name:"Mobile Virtual Grid"},[_.P_CLOUDY]:{name:"pCloudy"}}[i].name;if(t.isAppFromDevice)throw new Error(`Application from your device, ${a} grid dose not support application from device. Please choose a compatible application for testing.`);let c=r||t.mobileApp,l=(0,sb.default)(`uploading app to ${a} please wait..`).start();try{He.info(`uploading app to ${a} during test run`,{mobileApp:r,projectId:e,testResultId:t.testResultId,executionId:t.executionId});let m=await ip({projectId:e,gridId:n,app:c,timeout:this.calculateUploadRequestTimeOut(c.fileSize)});return l.succeed(`app uploaded successfully to ${a}`),m.gridAppId}catch(m){throw l.fail(`failed to upload app to ${a}`),He.error(`failed to upload app to ${a}`,{error:m,mobileApp:r,projectId:e,testResultId:t.testResultId,executionId:t.executionId}),new Error(`failed to upload app to ${a}`)}}async verifyAppAlreadyUploaded({testRunHandler:e,pendingAppUploads:t,projectId:r,gridId:n,gridType:i,mobileAppId:o}){let a=t.get(o);if(a!=null&&a.isUploaded)return a.uploadedAppId;let c=await this.uploadAppToGrid({projectId:r,testRunHandler:e,gridId:n,gridType:i});return t.set(o,{isUploaded:!0,uploadedAppId:c}),c}async getAppIdFromGridOrTestimPublicLink({testRunHandler:e,options:t,pendingAppUploads:r}){let n="",i,{executionId:o,testResultId:a}=e,{appId:c="",project:l,authData:{token:m=""}={},gridData:d={}}=t,{gridId:u="",type:f=""}=d;if(!c&&e.isAppFromDevice)return n;if(c){He.info("getting appData by appId",{appId:c,projectId:l,testResultId:a,executionId:o});let T=await this.getMobileAppDataByAppId({appId:c,projectId:l,token:m});n=T.appUrl,i=T.mobileApp,e.nativeApp=i}else He.info("no appId setting appPath from app associated with the test",{projectId:l,testResultId:a,executionId:o}),n=e.downloadableAppPublicLink||"";let h=c||e.mobileApp.appId,g=await this.getGridAppId({projectId:l,gridData:d,testRunHandler:e}),y=f===_.BROWSERSTACK||f===_.TESTIM_TVC||f===_.P_CLOUDY;if(g){let T=t.projectData.type,v=await this.verifyAppStillExistsOnGrid({gridAppId:g,gridData:d,projectType:T});v&&(He.info("app exists on grid, using gridAppId",{gridAppId:g,projectId:l,testResultId:a,executionId:o,mobileAppId:h}),n=g),!v&&y&&(He.info("app not exists on grid, uploading it",{gridAppId:g,projectId:l,testResultId:a,executionId:o,mobileAppId:h}),n=await this.verifyAppAlreadyUploaded({testRunHandler:e,pendingAppUploads:r,projectId:l,gridId:u,gridType:f,mobileAppId:h})),!v&&!y&&He.info("app not exists on grid, using testimStorage url",{projectId:l,testResultId:a,executionId:o})}return!g&&y&&(n=await this.verifyAppAlreadyUploaded({testRunHandler:e,pendingAppUploads:r,projectId:l,gridId:u,gridType:f,mobileAppId:h})),n}async verifyAppStillExistsOnGrid({gridAppId:e,gridData:t,projectType:r}){var m,d;let{accessToken:n,user:i,host:o,key:a,type:c,apiUrl:l}=t;if(c===_.BROWSERSTACK){let u=`${Vs}/recent_apps`,f=await this.fetchWithUserAndPasswordAuth({url:u,user:i,key:a});return Array.isArray(f)?f.some(h=>h.app_url===e):!1}if(c===_.SAUCELABS){let u=`https://${o==null?void 0:o.replace("ondemand","api")}/v1/storage/files`;return(await this.fetchWithUserAndPasswordAuth({url:u,user:i,key:a})).items.some(h=>h.id===e)}if(c===_.TESTIM_HEADSPIN||c===_.TESTIM_TDC){let u=`${l}/${vc}/apps`;return l||(u=`${c===_.TESTIM_HEADSPIN?bc:Tc}/${vc}/apps`),(await this.fetchWithTokenAuth({url:u,accessToken:n,authType:"Bearer"})).apps.some(h=>h.app_id===e)}if(c===_.TESTIM_TVC){let u=`${Md}/versions/${e}/info`,f=t[`${r}Token`];try{return await this.fetchWithTokenAuth({url:u,accessToken:f,authType:"Upload-Token",userAgent:"Testim-CLI"}),!0}catch(h){return h.status!==404&&He.error("error while verifying app exists on TVC",{error:h}),!1}}if(c===_.P_CLOUDY){let u=await this.getPCloudyAuthToken(o,i,a),f=`https://${o}/api/drive`,h=await kc({url:f,body:{token:u,filter:"all"},headers:{contentType:null}});return(d=(m=JSON.parse(h).result)==null?void 0:m.files)==null?void 0:d.some(y=>y.file===e)}throw new Error(`grid type ${c} is not supported`)}async fetchWithUserAndPasswordAuth({url:e,user:t,key:r}){let n={Authorization:`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`};return await Te(e,void 0,n)}async fetchWithTokenAuth({url:e,accessToken:t,authType:r,userAgent:n}){let i={Authorization:`${r} ${t}`,...n&&{"User-Agent":n}};return await Te(e,void 0,i)}},Et=new np});function ib({nativeAppMetadata:s,appPath:e,gridInfo:t}){if(!s&&!e||!s)throw Error("Application not specified. Please provide the required application for execution and try again.");if(!s.id&&!s.activity&&!s.packageName)throw Error("The application appears to be corrupted. Please ensure the application is in a valid state before running the test.");if(t.mode!=="local"&&!KE.includes(t.type))throw Error(`unsupported grid was detected please make sure to select supported mobile grid (${t.type})`)}function JE({deviceUdid:s,gridInfo:e,testRunConfig:t}){let{staticAllocation:r}=(t==null?void 0:t.mobile)||{};if(e.type!==_.TESTIM_TDC&&e.type!==_.TESTIM_HEADSPIN)throw Error("unsupported grid was detected please make sure to select supported mobile grid for direct connection");if(!s&&!(r!=null&&r.deviceUdid))throw Error("missing device udid or test run config is not static");if(!s&&(r!=null&&r.deviceUdid)&&r.deviceUdid.split(",").length!==1)throw Error("provided static config contains multi devices")}function XE(s){let{testName:e,executionId:t,testResultId:r,customTag:n}=s,i=[{executionId:t},{testResultId:r}];return e&&i.push({testName:e}),n&&i.push({customTag:n}),i}function YE(s,e,t){let{fullReset:r,setNoReset:n,skipLoadBalancer:i}=e,o=s===_.TESTIM_TDC,a=s===_.TESTIM_HEADSPIN,c=o?"tdc":"headspin",l=a&&O.flags.enableBatchHeadSpin.isEnabled(),m=o&&(O.flags.enableBatchTDC.isEnabled()||O.flags.headSpinTdcEnableFlagCapability.isEnabled()),d=O.flags.increaseTDCRequestTimeout.isEnabled();return{[`${c}:capture.video`]:!0,...O.flags.tdcHsPreventNetworkCapture.isEnabled()&&{[`${c}:capture.network`]:!1},...i&&{[`${c}:controlLock`]:!0},[`${c}:retryNewSessionFailure`]:!1,[`${c}:sessionTags`]:XE(t),[`${c}:enableBatch`]:l||m,...!r&&{"appium:noReset":n},...d&&{[`${c}:newCommandTimeout`]:600,"appium:newCommandTimeout":600}}}function _a(s){return"id"in s?s.id:s.packageName}function QE(s,e){return{[`${e===_.TESTIM_TDC?"tdc":"headspin"}:app.id`]:s}}function ZE({projectType:s,sessionCaps:e,options:t,nativeAppMetadata:r,appPath:n,androidActivityWait:i}){let{fullReset:o,setNoReset:a}=t,c={"appium:app":n},l=n==null?void 0:n.startsWith("http");n&&!l&&(c=QE(n,t.gridData.type));let d=()=>o===void 0&&n?!0:typeof o=="string"?o!=="false":o;switch(s){case"ios":return{...e,platformName:"iOS","appium:autoAcceptAlerts":!0,"appium:automationName":"XCUITest","appium:fullReset":d(),...r&&{"appium:bundleId":_a(r)},...n&&c};case"android":return{...e,platformName:"Android","appium:fullReset":!!o,"appium:autoGrantPermissions":!a,"appium:automationName":"UiAutomator2",...i&&{"appium:appWaitActivity":`${i}, *`},...r&&{"appium:appPackage":_a(r),"appium:appActivity":r.activity??".*"},...n&&c};default:throw Error(`unsupported mobile project ${s}`)}}function jr({projectType:s,sessionCaps:e,nativeAppMetadata:t,appPath:r,androidActivityWait:n,appiumPrefix:i="",shouldRunInEnhancedMode:o}){switch(s){case"ios":return{platformName:"iOS",[`${i}autoAcceptAlerts`]:!0,[`${i}automationName`]:o?"WaldoTestim":"XCUITest",[`${i}fullReset`]:!0,...t&&{[`${i}bundleId`]:_a(t)},...r&&{[`${i}app`]:r},...e};case"android":return{platformName:"Android",[`${i}autoGrantPermissions`]:!0,[`${i}automationName`]:o?"WaldoTestim":"UiAutomator2",...n&&{[`${i}appWaitActivity`]:`${n}, *`},...t&&{[`${i}appPackage`]:_a(t),[`${i}appActivity`]:t.activity??".*"},...r&&{[`${i}app`]:r},...e};default:throw Error(`unsupported mobile project ${s}`)}}function ob({projectType:s,nativeAppMetadata:e,appPath:t,androidActivityWait:r,sessionTags:n,options:i,gridInfo:o,shouldRunInEnhancedMode:a}){let c=YE(o.type,i,n);return ZE({projectType:s,sessionCaps:c,options:i,nativeAppMetadata:e,appPath:t,androidActivityWait:r,shouldRunInEnhancedMode:a})}function Da({osVersion:s,mobileConfig:e}){let{staticAllocation:t,dynamicAllocation:r}=e;return s||(t!=null&&t.osVersion?t==null?void 0:t.osVersion:r!=null&&r.osVersionRegex?r==null?void 0:r.osVersionRegex:".*")}function Na({deviceName:s,mobileConfig:e,projectType:t,gridType:r}){let{staticAllocation:n,dynamicAllocation:i}=e,o=r===_.P_CLOUDY;return s||(n!=null&&n.deviceName?o?n.deviceUdid:n.deviceName:i!=null&&i.deviceNameRegex?t==="android"&&i.deviceNameRegex===".*"&&o?Sc:i.deviceNameRegex:t==="ios"&&r===_.BROWSERSTACK?"iPhone.*":o?t==="ios"?"apple":Sc:".*")}function eI(s,e){let{androidToken:t,iosToken:r}=s,n=e==="ios";if(!t&&!r)throw Error("missing access token for testim virtual cloud");if(n&&!r)throw Error("missing ios token for testim virtual cloud");if(!n&&!t)throw Error("missing android token for testim virtual cloud");return n?r:t}function tI(s){return{"appium:appiumVersion":"2.0.0","appium:platformVersion":"10",...La(s,Ls)}}function ab(s,e,t){return s?Object.entries(s).reduce((r,[n,i])=>{if(e(n)){if(!t)return r[n]=i,r;let o=n.replace(t,"");r[o]=i}return r},{}):{}}function rI(s){return ab(s,e=>e.startsWith("browserstack."),"browserstack.")}function sI(s){return ab(s,e=>!e.startsWith("browserstack."))}function cb(s){return!s||!lb(s)?"2.0.0":s}function lb(s){return s.split(".")[0]==="2"||s.includes("appium2")||["latest","stable"].includes(s)}function ub({osVersion:s,projectType:e,appiumVersion:t,isBrowserStack:r=!1}){let n=/^(1[4-9](\.\d+){0,2})$|^\^\(\?=1[4-9]((\.\d+){0,2})\.\*\)\.\*$/,i=/^(10(\.\d+){0,2})$|^\^\(\?=10((\.\d+){0,2})\.\*\)\.\*$/,o=/^(1[7-9](\.\d+){0,2})$|^\^\(\?=1[7-9]((\.\d+){0,2})\.\*\)\.\*$/,a=r&&i.test(s),c=e==="android"&&(n.test(s)||a),l=e==="ios"&&o.test(s),m=c||l;if(t){let d=lb(t);return!d&&m?(console.warn(`Appium 2 is required for version: ${s}, forcing appium 2 for current session.`),!0):d}return m}function La(s,e){let t={};return Object.entries(s).forEach(([r,n])=>{let i=`${e}${r}`;t[i]=n}),t}async function nI({projectType:s,nativeAppMetadata:e,appPath:t,androidActivityWait:r,options:n,gridInfo:i,sessionTags:o,testRunConfig:a,shouldRunInEnhancedMode:c}){let{osVersion:l,deviceName:m}=n,d=(a==null?void 0:a.mobile)||{},{type:u}=i,f=eI(i,s),h=await si({gridId:i.gridId,projectType:s,projectId:n.project,companyId:n.company.companyId}),g=h==null?void 0:h.find(({udid:w})=>{var S;return((S=d.staticAllocation)==null?void 0:S.deviceUdid)===w}),y=(g==null?void 0:g.osVersion)??Da({osVersion:l,mobileConfig:d}),T=(g==null?void 0:g.name)??Na({deviceName:m,mobileConfig:d,projectType:s,gridType:u}),v=ze(n.editorUrl,n.project,o.testId,o.testResultId,o.branch),b={device:T,os_version:y,"waldo:displayName":`${o.testName}-${o.executionId}-${o.testResultId}`,"waldo:externalUrl":v,...c&&{"waldo:automationName":"WaldoTestim"},"waldo:options":{token:f}};return jr({projectType:s,sessionCaps:b,nativeAppMetadata:e,appPath:t,androidActivityWait:r,shouldRunInEnhancedMode:c})}function iI({projectType:s,nativeAppMetadata:e,appPath:t,androidActivityWait:r,options:n,gridInfo:i,sessionTags:o,testRunConfig:a}){let{osVersion:c,deviceName:l}=n,m=(a==null?void 0:a.mobile)||{},{user:d,key:u,type:f}=i,h=O.flags.enableAppium2pCloudy.isEnabled(),g=Da({osVersion:c,mobileConfig:m}),y=Na({deviceName:l,mobileConfig:m,projectType:s,gridType:f}),T=/^[a-zA-Z]+$/.test(y),v={...g!==".*"&&{pCloudy_DeviceVersion:g},...T&&{pCloudy_DeviceManufacturer:y},...!T&&{pCloudy_DeviceFullName:y}},b={pCloudy_Username:d,pCloudy_ApiKey:u,pCloudy_Individual:o.pCloudyIndividual,pCloudy_EnableVideo:!0,pCloudy_EnablePerformanceData:!0,pCloudy_EnableDeviceLogs:!0,...v,pCloudy_DurationInMinutes:n.duration?Number(n.duration):Number(Fd),pCloudy_ApplicationName:t,appiumVersion:"1.21.0",newCommandTimeout:600,lunchTimeout:"90000",uiautomator2ServerInstallTimeout:15e4,uiautomator2ServerLaunchTimeout:2e5};return h&&(b=tI(b)),t="",jr({projectType:s,sessionCaps:b,nativeAppMetadata:e,appPath:t,androidActivityWait:r,...h&&{appiumPrefix:Ls}})}function oI({projectType:s,nativeAppMetadata:e,appPath:t,androidActivityWait:r,options:n,gridInfo:i,sessionTags:o,testRunConfig:a}){let{osVersion:c,deviceName:l}=n,m=(a==null?void 0:a.mobile)||{},{type:d}=i,u=Da({osVersion:c,mobileConfig:m}),f=Na({deviceName:l,mobileConfig:m,projectType:s,gridType:d}),h=(0,Br.omit)({...n.saucelabs},["automationName","platformName"]),g={...h["sauce:options"]};if(delete h["sauce:options"],ub({osVersion:h.platformVersion||u,projectType:s,appiumVersion:g.appiumVersion})){let T={debug:!0,networkLogs:!0},v={user:i.user,key:i.key,name:o.testResultId,build:o.executionId,appiumVersion:cb(g.appiumVersion??"stable"),deviceName:f,tags:Object.values(o)},b={"appium:platformVersion":u,"appium:deviceName":f,...La(h,Ls),"sauce:options":{...T,...v,...(0,Br.omit)(g,"appiumVersion")}};return jr({projectType:s,sessionCaps:b,appiumPrefix:Ls,nativeAppMetadata:e,appPath:t,androidActivityWait:r})}let y={"saucelabs.user":i.user,"saucelabs.key":i.key,platformVersion:u,deviceName:f,tags:Object.values(o),name:o.testResultId,build:o.executionId,...h,...g};return jr({projectType:s,sessionCaps:y,nativeAppMetadata:e,appPath:t,androidActivityWait:r})}function aI({projectData:s,projectType:e,nativeAppMetadata:t,appPath:r,androidActivityWait:n,options:i,gridInfo:o,sessionTags:a,testRunConfig:c}){let{osVersion:l,deviceName:m}=i,d=(c==null?void 0:c.mobile)||{},{type:u}=o,f=Da({osVersion:l,mobileConfig:d}),h=Na({deviceName:m,mobileConfig:d,projectType:e,gridType:u}),g=rI(i.browserstack),y=(0,Br.omit)(sI(i.browserstack),["automationName","platformName","project","build","name"]),T={buildName:`${a.executionName} - ${a.executionId}`,projectName:`${s.name} - ${s.projectId}`,sessionName:`${a.testName} - ${a.testId}`},v=O.flags.enableAppium2BrowserStack.isEnabled();if(v||ub({osVersion:y.platformVersion||f,projectType:e,isBrowserStack:!0,appiumVersion:g.appiumVersion})){let w={...T,userName:o.user,accessKey:o.key,appiumVersion:v?"2.0.1":cb(g.appiumVersion),debug:!0,networkLogs:!0},S={"appium:platformVersion":f,"appium:deviceName":h,...La(y,Ls),"bstack:options":{...w,...(0,Br.omit)(g,"appiumVersion")}};return jr({projectType:e,sessionCaps:S,appiumPrefix:Ls,nativeAppMetadata:t,appPath:r,androidActivityWait:n})}let b={...T,os_version:y.platformVersion||f,device:y.deviceName||h,realDevice:!0,buildTags:Object.values(a).join(","),"browserstack.user":o.user,"browserstack.key":o.key,"browserstack.debug":!0,"browserstack.networkLogs":!0,...y,...La(g,"browserstack.")};return jr({projectType:e,sessionCaps:b,nativeAppMetadata:t,appPath:r,androidActivityWait:n})}async function cI(s){if(_.TESTIM_TDC===s.gridInfo.type||_.TESTIM_HEADSPIN===s.gridInfo.type)return ob(s);if(_.TESTIM_TVC===s.gridInfo.type)return await nI(s);if(_.P_CLOUDY===s.gridInfo.type)return iI(s);if(_.SAUCELABS===s.gridInfo.type)return oI(s);if(_.BROWSERSTACK===s.gridInfo.type)return aI(s);throw new Error(`unsupported grid type ${s.gridInfo.type}`)}function lI(s,e){var l,m;let{staticAllocation:t,dynamicAllocation:r,type:n}=e||{},{deviceName:i,osVersion:o,deviceUdid:a}=s,c={};return n==="dynamic"&&(!i&&((l=r==null?void 0:r.selector)!=null&&l.manufacturer)&&(c.manufacturer=r.selector.manufacturer),!o&&((m=r==null?void 0:r.selector)!=null&&m.osVersion)&&(c.os_version=r.selector.osVersion)),n==="static"&&!a&&(t!=null&&t.deviceUdid)&&(c.device_id=t.deviceUdid),i&&(c.manufacturer=i),o&&(c.os_version=o),a&&(c.device_id=a,delete c.os_version,delete c.manufacturer),c}async function pb(s){let{gridInfo:e,nativeAppMetadata:t,options:r,appPath:n,testRunConfig:i}=s,{selectedGrid:o}=(i==null?void 0:i.mobile)||{};if(i!=null&&i.mobile&&(o==null?void 0:o.type)!==e.type)throw Error(`selected grid type ${o.type} is not equal to grid type ${e.type}`);ib({nativeAppMetadata:t,appPath:n,gridInfo:e});let a=Et.getGridConnection(e),c=await cI(s);if(e.type===_.TESTIM_HEADSPIN||e.type===_.TESTIM_TDC){let y=e.type===_.TESTIM_HEADSPIN?"headspin":"tdc",T=lI(r,i==null?void 0:i.mobile);if(!(0,Br.isEmpty)(T)){let v=Object.entries(T).map(([b,w])=>w.split(",").map(S=>S===".*"||S==="="?"":`${b}:${S}`).join(",")).join(" ").trim();c[`${y}:selector`]=v}}let l=e.type===_.TESTIM_TVC?{alwaysMatch:c}:c,m=O.flags.increaseTDCRequestTimeout.isEnabled(),d=0,u=(0,ap.default)("2m"),f=(0,ap.default)("12m"),h=br(O.flags.appiumConnectionRetryCount.getValue(),d),g=br(O.flags.appiumConnectionRequestTimeout.getValue(),u);return m&&g<f&&(g=f),{...a,desiredCapabilities:c,connectionRetryTimeout:g,capabilities:l,connectionRetryCount:h,logLevel:r.appiumLogLevel}}async function db(s){var h,g;let{projectType:e,gridInfo:t,nativeAppMetadata:r,options:n,appPath:i,androidActivityWait:o,sessionTags:a,testRunConfig:c}=s,{deviceUdid:l}=n;ib({nativeAppMetadata:r,appPath:i,gridInfo:t}),JE({deviceUdid:l,gridInfo:t,testRunConfig:c});let m=l||((g=(h=c.mobile)==null?void 0:h.staticAllocation)==null?void 0:g.deviceUdid),d=await Et.getGridDirectConnection(t,m),f=ob({projectType:e,nativeAppMetadata:r,appPath:i,androidActivityWait:o,options:n,sessionTags:a,testRunConfig:c,gridInfo:t});return m&&(f["appium:udid"]=m),{...d,desiredCapabilities:f,capabilities:f,connectionRetryCount:0,logLevel:n.appiumLogLevel}}function mb(s){let{projectType:e,nativeAppMetadata:t,appPath:r,androidActivityWait:n}=s,o=jr({projectType:e,sessionCaps:{dontStopAppOnReset:!0,fullReset:!1},nativeAppMetadata:t,appPath:r,androidActivityWait:n});return e==="ios"&&delete o.app,o}function fb(s){var t,r;let e={...s};return delete e.path,delete e.user,delete e.key,delete e.desiredCapabilities,delete e.capabilities["saucelabs.user"],delete e.capabilities["saucelabs.key"],delete e.capabilities["browserstack.user"],delete e.capabilities["browserstack.key"],(t=e.capabilities["sauce:options"])==null||delete t.user,(r=e.capabilities["sauce:options"])==null||delete r.key,delete e.capabilities.key,delete e.capabilities.user,e}var ap,Br,Ls,KE,cp=E(()=>{"use strict";ap=I(require("ms"));de();ae();Oa();Br=require("lodash");B();oe();ge();Ls="appium:",KE=[_.BROWSERSTACK,_.SAUCELABS,_.TESTIM_HEADSPIN,_.TESTIM_TDC,_.TESTIM_TVC,_.P_CLOUDY]});var Ma,hb=E(()=>{"use strict";Ma=class{constructor(){this.sessionTabs={}}on(){}tabCount(){}getAllOpenTabIds(){return[]}isSessionTab(){return!1}getAllTabInfos(){return{}}async addNewTab(){}addOpenerStepId(){}addOpenerStep(){}getTabUtilsByTabIdAndSessionId(){}getTabUtilsByTabId(){return{}}getTabInfo(){return{}}getTabUtils(){return{}}getMainTabInfo(){}getMainTabUtils(){return{}}getMainTabId(){return null}async isMainTabExists(){return!1}clearAllTabs(){}async switchTab(){}async getTabDetails(){}async isMainTabIncognito(){return!1}async getTabIdByTabInfo(){return NaN}}});var Fa,yb=E(()=>{"use strict";B();Fa=class{constructor(e){this.driver=e;this._abortedSteps=[];this.unescapeHTML=sn;this.getLinksFromUnescapeHTML=nn}resetAbort(){this._abortedSteps.length=0}abort(e){this._abortedSteps.push(e)}get abortedSteps(){return this._abortedSteps}async executeInAut(e,t){throw new Error("not implemented (mobile)")}extractTargetText(e){throw new Error("not implemented (mobile)")}getCookie(e){throw new Error("not implemented (mobile)")}setCookie(e){throw new Error("not implemented (mobile)")}async getNextDynamicParent(e,t){throw new Error("not implemented (mobile)")}}});var lp,Ua,bb=E(()=>{"use strict";$();lp=P("mobile-frame-locator-mock"),Ua=class{foundFrameCallback(){return lp.info("foundFrameCallback-mock invoked"),{}}locate(){return lp.info("locate-mock invoked"),{}}async findFrame(){return lp.info("findFrame-mock invoked"),{}}}});var uI,wb,Tb,Ds,up=E(()=>{"use strict";uI=I(require("webdriverio")),wb=require("@applitools/eyes-sdk-core");hb();zu();$();yb();Ku();we();Qu();bb();Zu();Tb=P("appium-test-player"),Ds=class{constructor(e,t,r,n=uI,i=void 0,o=void 0){this.id=e;this.driver=n;let{SessionPlayer:a,commonConstants:c,StepActionFactory:l,MobileLocateElementPlayer:m}=Z(),d=new Fa(this.driver);this.stepActionFactory=new l(d),Pa(this.driver,this.stepActionFactory),this.playbackTimeoutCalculator=new _s(na()),this.sessionPlayer=new a(e,{tabService:new Ma,cookieUtils:void 0,FrameLocator:Ua,portSelector:ta,LocateElementPlayer:m,stepActionUtils:d,stepActionFactory:this.stepActionFactory,playbackTimeoutCalculator:this.playbackTimeoutCalculator,makeSDK:wb.makeSDK}),this.sessionPlayer.setShouldMonitorPerformance(Boolean(r)),this.sessionPlayer.playbackManager.isRemoteSession=!0,this.sessionPlayer.playbackManager.isLocalRun=!1,this.sessionPlayer.playbackManager.testRetryCount=i,this.sessionPlayer.playbackManager.previousTestResultId=o,this.sessionPlayer.playbackManager.userParamsData=t||{},this.onStepCompleted=this.onStepCompleted.bind(this),this.sessionPlayer.playbackManager.on(c.playback.RESULT,this.onStepCompleted)}onStepCompleted(e,t,r,n){}async onDone(){let{playbackManager:e}=this.sessionPlayer,{executionId:t,testResult:{resultId:r}={},appiumApi:n}=e,i={executionId:t,testResultId:r,sessionId:n==null?void 0:n.sessionId};try{n!=null&&n.sessionId&&(await(n==null?void 0:n.endSession()),Tb.info("appium session deleted",{...i}))}catch(o){Tb.error("error while deleting appium session",{...i,error:o})}finally{let{commonConstants:o}=Z();e.off(o.playback.RESULT)}}getSessionId(){var e;return(e=this.sessionPlayer.playbackManager.appiumApi)==null?void 0:e.sessionId}}});async function pI(s){return await Te(`${s}/api/status`)}async function vb(s,e){return await Te(`${s}/api/devices/${e}/status`)}async function Sb(s){if((await pI(s)).fsmState!=="Ready")throw new Error("TMA is not ready")}var Eb=E(()=>{"use strict";Ge()});var Ib={};z(Ib,{WorkerLocalTma:()=>fp});var $r,pp,dp,mp,fp,Rb=E(()=>{"use strict";Ge();cp();zn();B();$();Lt();up();we();Eb();Oa();$r=P("worker-appium"),pp=class extends Error{},dp=class extends Error{},mp=class extends Error{},fp=class extends Nt{constructor(){super(...arguments);this.baseDevicePath=(t,r)=>`${t}/api/devices/${r}`}initPlayer(t){return new Ds(this.id,t.runParams,this.options.shouldMonitorPerformance,void 0,t.retryCount,t.previousTestResultId)}async initAndGetAppiumAPI(t){if(t.sessionPlayer.playbackManager.appiumApi)return t.sessionPlayer.playbackManager.appiumApi;let{AppiumApi:r}=Z(),{DOMParser:n}=await import("linkedom"),i=new r(this.sessionData.serverAddress,this.sessionData.sessionId,n,!1);return t.sessionPlayer.playbackManager.appiumApi=i,i}async getBrowserOnce(t,r,n,i){var S;if(Q.onGetSession(this.id,this.testName,t.runMode),!this.options.localTmaUrl||!this.options.deviceUdid)throw new Error("Missing localTmaUrl or deviceUdid");let{localTmaUrl:o,deviceUdid:a,projectData:c}=this.options;await Sb(o);let{project:l,authData:{token:m=""}={}}=this.options,{driver:d}=n,u=c.type,f=this.options.appId;if(f){let{mobileApp:A}=await Et.getMobileAppDataByAppId({appId:f,projectId:l,token:m});t.nativeApp=A}let h=u==="android"?t.androidActivityWait:null,g=t.nativeAppMetadata,y=t.downloadableAppPublicLink,T=t.appPackageNameOrBundleId;if(!g)throw new Error("Application not specified. Please provide the required application for execution and try again.");if(!T)throw new Error("The application appears to be corrupted. Please ensure the application is in a valid state before running the test.");let[{appInstalled:v,version:b},w]=await Promise.all([this.getAppStateFromDevice(o,a,T),vb(o,a)]).catch(A=>{throw this.handleDeviceNotFoundError(A),A});if($r.info("device status and app state",{deviceStatus:w,appInstalled:v,version:b,executionId:this.executionId,testResultId:this.testResultId}),!v&&t.isAppFromDevice&&!f)throw new Error("The application is not installed on the target device. Please ensure the application is installed and try again.");!v&&y&&(await this.installApp(o,a,y),$r.info("Application installed successfully",{deviceUdid:a,executionId:this.executionId,testResultId:this.testResultId}));try{let A={testName:this.testName,executionId:this.executionId,testResultId:this.testResultId,project:`${(S=this.options.projectData)==null?void 0:S.name}-${this.options.project}`},D=mb({projectType:u,nativeAppMetadata:g,appPath:y,androidActivityWait:h,sessionTags:A,gridInfo:i,options:this.options,testRunConfig:this.testRunConfig}),V={capabilities:{udid:a,...D}};$r.info("requesting new appium session from TMA",{tmaSessionSettings:V,executionId:this.executionId,testResultId:this.testResultId});let x=await this.requestNewAppiumSessionFromTma(o,V,g);this.sessionData=x;let R=await d.attach({sessionId:x.sessionId,capabilities:D,options:{capabilities:D}});this.device=await Et.updateTmaDeviceDetails(a,this.options,t),$r.info(`init new appium session with local TMA testName: ${this.testName}`,{sessionId:R.sessionId,testResultId:this.testResultId,nativeAppMetadata:g,sessionCaps:R.capabilities})}catch(A){throw $r.error("failed to start application",{err:A}),A}}async requestNewAppiumSessionFromTma(t,r,n){var i,o;try{let a=await Ve({url:`${t}/api/session`,headers:{"Content-Type":"application/json"},body:r,timeout:6e4}),c={name:n.name,version:n.version};return{...a,appInfo:c,env:"local-tma"}}catch(a){this.handleDeviceNotFoundError(a);let c=(o=(i=a.response)==null?void 0:i.body)==null?void 0:o.message;throw a.status===500&&typeof c=="string"&&c.startsWith("Failed to create driver session")?new mp(c):a}}async getAppStateFromDevice(t,r,n){let i=this.options.projectData.type==="ios"?"bundles":"apps",o=`${this.baseDevicePath(t,r)}/${i}`,c=(await Te(o)).find(l=>"id"in l?l.id===n:l.packageName===n);return c?{appInstalled:!0,version:c.version}:{appInstalled:!1,version:""}}async installApp(t,r,n){var i,o;try{let a=await $t(n);await Xs(`${this.baseDevicePath(t,r)}/apps`,{},{file:{buffer:a.body,fileName:"app"}})}catch(a){this.handleDeviceNotFoundError(a);let c=(o=(i=a.response)==null?void 0:i.body)==null?void 0:o.message,l="Failed to install app";throw c&&(l=`${l}: ${c}`),new dp(l,{cause:a})}}handleDeviceNotFoundError(t){var n,i;let r=(i=(n=t.response)==null?void 0:n.body)==null?void 0:i.message;if(t.status===404&&typeof r=="string"&&(r!=null&&r.startsWith("Ensure that the requested device")))throw new pp(`Device Unavailable: Please ensure that the specified device ${this.options.deviceUdid} is currently connected`)}async runTestOnce(t,r){let{manifestVersion:n,localAssetService:i}=Z(),{sessionPlayer:o}=r,a=n||"runner";Q.onWaitToTestComplete(this.id),o.playbackManager.executionId=t.executionId,o.playbackManager.executionName=t.executionName,o.playbackManager.appiumSessionData={...this.sessionData,device:this.device,nativeApp:t.nativeApp},await this.initAndGetAppiumAPI(r),i.initialize({serverUrl:this.options.localRCASaver});let c=async()=>{try{let l=await new Promise((d,u)=>{o.playByTestId({testId:this.testId,executionId:this.executionId,resultId:this.testResultId,baseUrl:this.baseUrl,userData:this.userData,version:a,resolve:d,isLocalRun:!1,overrideTestConfigId:this.overrideTestConfigId,branch:this.branch,remoteRunId:t.remoteRunId}).catch(u)});return await i.drain(),l.stepsResults=null,l.resultId=this.testResultId,{...l,...t.seleniumPerfStats.getStats()}}catch(l){throw $r.error("error while running appium tests",{err:l}),l}};try{return await super.runTestOnce(t,r),await c()}catch(l){throw $r.error("failed to run test once",{err:l}),l}}}});var Ab={};z(Ab,{WorkerAppium:()=>gp});var xb,Wr,gp,Cb=E(()=>{"use strict";B();cp();xb=require("linkedom");zn();$();Lt();up();we();Oa();ae();fs();Wr=P("worker-appium"),gp=class extends Nt{initPlayer(t){return new Ds(this.id,t.runParams,this.options.shouldMonitorPerformance,void 0,t.retryCount,t.previousTestResultId)}async getBrowserOnce(t,r,n,i){let o=this.options.projectData.type,a=(o==="android"||o==="ios")&&await t.isTestRecordedWithEnhancedMode();if(i.type!==_.TESTIM_TVC&&a)throw Error("The provided test(s) were authored in Enhanced Mode and can run only on VMG!");Q.onGetSession(this.id,this.testName,t.runMode);let{driver:c}=n,l=await Et.getAppIdFromGridOrTestimPublicLink({testRunHandler:t,options:this.options,pendingAppUploads:this.executionQueue.pendingAppUploads}),m=o==="android"?t.androidActivityWait:null,d=t.nativeAppMetadata;if(!d)throw new Error("Application not specified. Please provide the required application for execution and try again.");try{let u={testName:this.testName,executionId:this.executionId,executionName:t.executionName,testResultId:this.testResultId,project:`${this.options.projectData.name}-${this.options.project}`,...this.options.customTag&&{customTag:this.options.customTag},testId:this.testId,branch:this.branch,pCloudyIndividual:`${this.executionId}-${this.uniqueId}`},f={projectData:this.options.projectData,projectType:o,nativeAppMetadata:d,appPath:l,androidActivityWait:m,sessionTags:u,gridInfo:i,options:this.options,testRunConfig:this.testRunConfig,shouldRunInEnhancedMode:a},h;this.options.skipLoadBalancer&&this.options.deviceUdid?(this.options.lockDevice&&await Et.lockDevice(i,this.options.deviceUdid),h=await db(f)):h=await pb({...f,shouldRunInEnhancedMode:a}),Wr.info("starting appium session",{testResultId:this.testResultId,executionId:this.executionId,sessionTags:u,nativeAppMetadata:d,capabilities:fb(h)}),h.headers={"User-Agent":this.getUserAgentString()};let g=this.getServerAddressFromGrid();this.activeSession=await c.remote(h),this.device=await Et.updateDeviceOnRemoteTestResult(t,this.activeSession,g,this.options,a);let y=`${g}/session/${this.activeSession.sessionId}`;this.updateSlotData(y),Wr.info("appium session started successfully",{sessionId:this.activeSession.sessionId,testResultId:this.testResultId,executionId:this.executionId,sessionCaps:this.activeSession.capabilities})}catch(u){throw Wr.error("failed to start application",{testResultId:this.testResultId,executionId:this.executionId,err:u}),u}}startKeepAlive(t){let{errors:r}=Z(),n=async()=>{try{await t.getOrientation()}catch(i){Wr.error("failed to keep appium session alive",{err:i}),r!=null&&r.AppiumSessionTerminatedError&&i instanceof r.AppiumSessionTerminatedError&&this.stopKeepAlive()}};this.keepAliveIndex=setInterval(n,25e3)}stopKeepAlive(){this.keepAliveIndex&&clearTimeout(this.keepAliveIndex)}updateSlotData(t){try{this.options.slotService==="redis"&&Hf(this.options.company.companyId,this.options.projectData.projectId,{testResultId:this.testResultId,executionId:this.executionId,type:"execution",source:this.options.source,sessionUrl:t},this.id)}catch(r){Wr.error("failed to update slot data",{err:r})}}getServerAddressFromGrid(){let{host:t,port:r,accessToken:n,type:i}=this.options.gridData;return i===_.TESTIM_HEADSPIN||i===_.TESTIM_TDC?`https://${t}:${r}/v0/${n}/wd/hub`:i===_.P_CLOUDY?`https://${t}/appiumcloud/wd/hub`:`https://${t}:${r}/wd/hub`}getDirectAddressConnection(){let{protocol:t,hostname:r,port:n,path:i}=this.activeSession.options;if(t&&r&&n&&i)return`${t}://${r}:${n}${i}`}async runTestOnce(t,r){var f,h,g;let{manifestVersion:n,AppiumApi:i,localAssetService:o}=Z(),{sessionPlayer:a}=r,c=n||"runner",l=this.options.timeout;Q.onWaitToTestComplete(this.id),a.playbackManager.executionId=t.executionId,a.playbackManager.executionName=t.executionName;let m;if(this.options.skipLoadBalancer){let y=this.options.deviceUdid||((f=this.testRunConfig.mobile)==null?void 0:f.staticAllocation.deviceUdid),{protocol:T,hostname:v,port:b,path:w}=await Et.getHeadSpinDeviceConnection(this.options.gridData,y);m=`${T}://${v}:${b}${w}`}else m=this.getDirectAddressConnection()||this.getServerAddressFromGrid();let d=this.activeSession.capabilities;a.playbackManager.appiumSessionData={env:"remote",capabilities:d,sessionId:this.activeSession.sessionId,sessionToken:this.options.gridData.accessToken,gridType:this.options.gridData.type,projectType:this.options.projectData.type,gridId:this.options.gridData.gridId,companyId:(h=this.options.company)==null?void 0:h.companyId,device:this.device,nativeApp:t.nativeApp},a.playbackManager.appiumApi=new i(m,this.activeSession.sessionId,xb.DOMParser,((g=this.device)==null?void 0:g.domMode)==="enhanced"),this.startKeepAlive(a.playbackManager.appiumApi),o.initialize({serverUrl:this.options.localRCASaver});let u=async()=>{try{let y=await new Promise((v,b)=>{a.playByTestId({testId:this.testId,executionId:this.executionId,resultId:this.testResultId,baseUrl:this.baseUrl,userData:this.userData,version:c,resolve:v,isLocalRun:!1,overrideTestConfigId:this.overrideTestConfigId,branch:this.branch,remoteRunId:t.remoteRunId}).catch(b)});return this.stopKeepAlive(),await o.drain(),y.stepsResults=null,y.resultId=this.testResultId,{...y,...t.seleniumPerfStats.getStats()}}catch(y){throw Wr.error("error while running appium tests",{testResultId:this.testResultId,executionId:this.executionId,err:y}),this.stopKeepAlive(),y}};try{return await super.runTestOnce(t,r),await le(u(),l,Ae.TEST_REACHED_CUSTOM_TIMEOUT_MSG)}catch(y){throw Wr.error("failed to run test once",{err:y}),y}}getUserAgentString(){return"Testim/CI-Branch:test"}}});var Ba,Pb=E(()=>{"use strict";B();Bn();Y();Ba=class{constructor(e){this.id=e;this.driver=new Or}async onDone(){try{await le(this.driver.end(),12e4)}catch(t){t instanceof ce&&await this.driver.forceEnd().catch(()=>null)}this.driver=null}getSessionId(){return this.driver.getSessionId()}}});async function kb(){let s=await Promise.any(dI.map(async e=>{try{return await Te(e)}catch{return null}}));return s==null?void 0:s.ip}var dI,ja,$a=E(()=>{"use strict";Ge();dI=["https://api.ipify.org?format=json","https://ipinfo.io/json","https://api.my-ip.io/ip.json"];ja=({timeout:s})=>({timeout:s,...global.proxyUri&&{agent:new global.ProxyAgent(global.proxyUri)}})});var Ob,Wa,_b=E(()=>{"use strict";Ob=I(require("ws"));B();$a();Wa=class{constructor(){this._cdpWs=null;this._cdpUrl=null;this._cdpCallbacks=new Map}async initSession(e,t=500){await this.stopSession(),this._cdpUrl=e,await this.initCDPWebsocket(t)}async initCDPWebsocket(e=500){if(this._cdpWs)return this._cdpWs;let t=ja({timeout:e}),r=new Ob.default(this._cdpUrl,t),n=Qt(o=>{r.once("open",o)}),i=Qt(o=>{r.once("error",o)}).catch(()=>{r.close(),r.removeAllListeners()});return r.on("message",o=>this.onCDPMessage(o)),this._cdpWs=Promise.race([n,i]).then(()=>r),this._cdpWs}onCDPMessage(e){var n;let t=JSON.parse(e),r=this._cdpCallbacks.get(t.id);r&&(this._cdpCallbacks.delete(t.id),t.error?r.reject(new Error(t.error)):(n=t.result.exceptionDetails)!=null&&n.exception?r.reject(new Error(t.result.exceptionDetails.exception.description)):r.resolve(t.result))}async stopSession(){let e=this._cdpWs;if(this._cdpUrl=null,this._cdpWs=null,this._cdpCallbacks.clear(),e)try{return(await e).close()}catch{return}}async cdpCommand(e,t,r){let n=await this.initCDPWebsocket();this._lastWsId||=0;let i=this._lastWsId++,o=new Promise((c,l)=>{this._cdpCallbacks.set(i,{resolve:c,reject:l})}),a={method:e,params:t,id:i};return r&&Object.assign(a,{sessionId:r}),n.send(JSON.stringify(a)),o}}});var Ga,hp,Va,Lb=E(()=>{"use strict";B();Ga=I(require("chrome-launcher"));Lo();_b();Pn();hp=class{constructor(e){this.sessionId=e;this._isAlive=!1;this.cdpTestRunner=new Wa}async init(e){var h,g,y,T;let{browserOptions:t,testName:r,testRunConfig:n,gridInfo:i,customExtensionLocalLocation:o,executionId:a,testResultId:c,printFinalCaps:l,mode:m}=e,d=_o({browserOptions:t,testName:r,testRunConfig:n,gridInfo:i,customExtensionLocalLocation:o,executionId:a,testResultId:c,printFinalCaps:l,mode:m}),u=[...((h=d.desiredCapabilities)==null?void 0:h.chromeOptions.args)??[],...((T=(y=(g=d.capabilities)==null?void 0:g.alwaysMatch)==null?void 0:y["goog:chromeOptions"])==null?void 0:T.args)??[],...Ga.Launcher.defaultFlags().filter(v=>v!=="--disable-extensions")];this.chrome=await Ga.launch({chromeFlags:u,startingUrl:void 0,ignoreDefaultFlags:!0}),this.chrome.process.once("exit",()=>{this._isAlive=!1}),this.chrome.process.once("close",()=>{this._isAlive=!1}),this._isAlive=!0;let f=await wr(`localhost:${this.chrome.port}`);await this.cdpTestRunner.initSession(f),gs(()=>this.chrome.kill())}isAlive(){return this._isAlive}start(){}async stop(){await this.cdpTestRunner.stopSession(),this.chrome&&await this.chrome.kill(),this._isAlive=!1}getSessionId(){return this.sessionId}},Va=class{constructor(e){this.id=e;this.sessionId=re();this.driver=new hp(this.sessionId)}async onDone(){return this.driver.stop()}getSessionId(){return this.sessionId}}});var yp={};z(yp,{WorkerExtension:()=>ni});function mI(s){return s instanceof Error&&"type"in s&&typeof s.type=="string"}function Db(s){return mI(s)?s:new Error(s)}var et,ni,Ha=E(()=>{"use strict";$e();Y();zn();B();$();Lt();ae();Pb();Lb();lt();et=P("worker-ext"),ni=class extends Nt{initPlayer(){return this.options.useChromeLauncher?new Va(this.id):new Ba(this.id)}async _getBrowserOnce(e,t,r,n){var o;let{driver:i}=r;try{return await i.init({projectData:this.options.projectData,overrideConfiguration:e.overrideTestConfig,browserOptions:this.options,testId:e.testId,testName:this.testName,testRunConfig:this.testRunConfig,gridInfo:n,customExtensionLocalLocation:t,executionId:this.executionId,executionName:e.executionName,testResultId:this.testResultId,seleniumPerfStats:e.seleniumPerfStats,fastInit:(o=this.options.lightweightMode)==null?void 0:o.general,lambdatestService:this.lambdatestService,printFinalCaps:this.options.printFinalCaps,mode:K.EXTENSION})}catch(a){throw et.error("failed to get browser",{err:a,gridInfo:n,whitelistedPublicIp:Zi(),initializedFromCache:eo(),testId:e.testId,resultId:e.testResultId,publicIps:this.options.publicIps}),a}}async getBrowserOnce(e,t,r,n){return Q.onGetSession(this.id,this.testName,e.runMode),this._getBrowserOnce(e,t,r,n)}isUsingChromeLauncher(e){return Boolean(this.options.useChromeLauncher)}async updateTestStatusOnGrid(e,t,r){var i;let n=t?"passed":"failed";if(this.lambdatestService.isLambdatestRun()&&await e.executeJS(`lambda-status=${n}`),"browserstack"in this.options&&((i=this.options.browserstack)!=null&&i["browserstack.user"])){let o={action:"setSessionStatus",arguments:{status:n,reason:r}};await e.execute(`browserstack_executor: ${JSON.stringify(o)}`)}}async runTestOnce(e,t){let{testResultId:r,executionId:n,testId:i}=this;F("WorkerExtension runTestOnce");let o=async m=>{let d=this.options.timeoutWasGiven?Math.max(1e4,this.options.timeout):this.options.testStartTimeout;try{return await le(e.runTestUsingCDP(m.cdpTestRunner),d,Ae.TEST_START_TIMEOUT_MSG)}catch(u){if(!(u instanceof ce))throw u;return et.warn("timeout while running test using CDP. Running checkViaRestAPIIfTestStarted",{testResultId:r}),await e.checkViaRestAPIIfTestStarted()}},a=async(m,d,u)=>{try{let f=await m.url(d);return u.driverUrlFinished=!0,f}catch(f){throw et.error("error from driver.url",{err:f,testResultId:r,executionId:n,testId:i,url:d,urlLength:d.length}),f}},c=async m=>{let d=await e.onStarted(this.options.testStartTimeout);return m.testRunHandlerOnStartedHadFinished=!0,d},l=async()=>{var g;if(F("WorkerExtension runExtTest"),((g=this.options.lightweightMode)==null?void 0:g.disableRemoteStep)||this.options.disableSockets||e.listenToRemoteStep(t.driver),this.isUsingChromeLauncher(t)){Q.onWaitToTestStart(this.id),Q.onWaitToTestComplete(this.id);try{return{...await o(t.driver),...e.seleniumPerfStats.getStats()}}catch(y){throw et.warn("failed to run test via CDP",{err:y}),y}}let{driver:d}=t,u={driverUrlFinished:!1,testRunHandlerOnStartedHadFinished:!1};try{let v=function(w){e.onCompletedCleanup(),et.warn("on browser closed error detected",{err:w,testResultId:r,executionId:n,testId:i}),d.unregisterToClosedBrowser(v),d.unregisterToKeepAliveFailed(b),w.type=Xr.BROWSER_CLOSED,T.abort(w)},b=function(w){d.unregisterToClosedBrowser(v),d.unregisterToKeepAliveFailed(b),et.warn("on keep alive failed error detected",{err:w,testResultId:r,executionId:n,testId:i}),w.type=Xr.KEEP_ALIVE_FAILED,T.abort(w)};var f=v,h=b;let y=await e.getRunTestUrl();Q.onWaitToTestStart(this.id);try{await le(Promise.all([a(t.driver,y,u),c(u)]),this.options.testStartTimeout,Ae.TEST_START_TIMEOUT_MSG)}catch(w){if(!(w instanceof ce))throw w;et.warn("timeout occurred (see log's payload). Running checkViaRestAPIIfTestStarted",{testResultId:r,executionId:n,testId:i,...u}),await e.checkViaRestAPIIfTestStarted()}Q.onWaitToTestComplete(this.id);let T=new AbortController;d.registerToClosedBrowser(v),d.registerToKeepAliveFailed(b);try{let w=le(e.onCompleted(),this.testRunTimeout,Ae.TEST_COMPLETE_TIMEOUT_MSG),S=await xc(w,T.signal);d.unregisterToClosedBrowser(v),d.unregisterToKeepAliveFailed(b);try{await this.updateTestStatusOnGrid(d,Boolean(S.success),S.reason)}catch(V){et.error("Could not update the grid about the test status",{err:V})}d.isAlive()||(et.warn(`possible grid unresponsive for test ${this.testId}, result ${this.testResultId} (execution: ${this.executionId})`),S.gridIssues="could not validate grid is alive");let A=d.maxKeepAliveGap();return A>=3e4&&(et.warn(`possible browser keep alive issue ${this.testId}, result ${this.testResultId} (execution: ${this.executionId})`),S.keepAliveIssue=A),{...S,...e.seleniumPerfStats.getStats()}}catch(w){throw et.warn("timeout wait until test completed",{err:w,testResultId:r,executionId:n,testId:i}),Db(w)}finally{d.unregisterToClosedBrowser(v),d.unregisterToKeepAliveFailed(b)}}catch(y){throw et.warn("failed to start url",{err:y}),Db(y)}};t.driver.start();try{return await super.runTestOnce(e,t),F("WorkerExtension super.runTestOnce"),await l()}catch(m){throw et.error("failed to run test",{err:m,testId:e.testId,resultId:e.testResultId}),m}}}});var Tp={};z(Tp,{WorkerExtensionSingleBrowser:()=>bp});var fI,gI,bp,wp=E(()=>{"use strict";$e();B();$();Bu();Lt();Ha();fI=P("base-worker"),gI=500,bp=class extends ni{async _releasePlayer(){if(!this.testPlayer)return;let{projectId:t}=this.userData||{};await qn(this.id,this.releaseSlotOnTestFinished,t,this.options.company.companyId,this.options.slotService,this.testPlayer),this.testPlayer=null}onQueueCompleted(){return this._releasePlayer()}async getBrowserOnce(t,r,n,i){return Q.onGetSession(this.id,`worker ${this.id}`,t.runMode),this._getBrowserOnce(t,r,n,i)}async getTestPlayer(t,r){return this.testPlayer&&!this.testPlayer.driver.isAlive()&&(fI.warn("WorkerExtensionSingleBrowser is releasing a dead player",{workerId:this.id}),await this._releasePlayer()),this.testPlayer||(this.testPlayer=await super.getTestPlayer(t,r)),this.testPlayer}async runTest(t,r,n){let i=this.handleQuarantine(t);if(i)return i;F("before runTest onTestStarted single browser");let o=await this.onTestStarted(this.id,t.testId,t.testResultId,n,t.retryKey);t.baseUrl=o.config.baseUrl;let a=await this.getTestPlayer(t,r);return t.markClearBrowser(),await this.runTestOnce(t,a)}async runTestCleanup(){var t;if(!this.executionQueue.hasMoreTests()){await this.onQueueCompleted();return}(t=this.options.lightweightMode)!=null&&t.general&&await pe(gI)}}});var vp,qa,Nb=E(()=>{"use strict";Bn();oe();$e();Cl();lt();wu();Y();$();ae();Rh();Go();vp=P("worker-manager"),qa=class{constructor(e){this.customExtensionLocalLocation=e;this.workerIdCount=0;this.parallelCount=0;this.workers=new Map;this.combinedTestResults={};this.workerUniqueIds=[];this.onWorkerFinished=async(e,...t)=>{this.workers.has(e)&&(this.workers.delete(e),this.executionQueue.hasMoreTests()&&this.workers.size<this.parallelCount&&this.runWorker(...t))};this.runWorker=async(...e)=>{let t=++this.workerIdCount;this.workers.set(t,null);let r=this.executionQueue.getNext();if(!r){this.workers.delete(t);return}let n=this.workerUniqueIds[t%this.parallelCount],i=await this.createWorker(r.runConfig.browserValue,...e);this.workers.set(t,i),i.id=t,i.uniqueId=n,i.run(r,this.onWorkerFinished,...e)}}async getWorkerType({mode:e,localTmaUrl:t},r){if(e)switch(e){case K.SELENIUM:return(await Promise.resolve().then(()=>(sp(),rp))).WorkerSelenium;case K.APPIUM:return t?(await Promise.resolve().then(()=>(Rb(),Ib))).WorkerLocalTma:(await Promise.resolve().then(()=>(Cb(),Ab))).WorkerAppium;default:return jn.isFeatureAvailableForProject("useSameBrowserForMultiTests")?(await Promise.resolve().then(()=>(wp(),Tp))).WorkerExtensionSingleBrowser:(await Promise.resolve().then(()=>(Ha(),yp))).WorkerExtension}else switch(r){case(Nr.find(n=>n===r)&&jn.isFeatureAvailableForProject("useSameBrowserForMultiTests")):return(await Promise.resolve().then(()=>(wp(),Tp))).WorkerExtensionSingleBrowser;case Nr.find(n=>n===r):return(await Promise.resolve().then(()=>(Ha(),yp))).WorkerExtension;case Hn.find(n=>n===r):return(await Promise.resolve().then(()=>(sp(),rp))).WorkerSelenium;default:throw new C(`browser ${r} is not supported`)}}async createWorker(e,...t){let r=t[0],n=await this.getWorkerType({mode:r.mode,localTmaUrl:r.localTmaUrl},e);try{return F("before new Worker",r.mode),new n(this.executionQueue,...t)}finally{F("after new Worker",r.mode)}}async runTests(e,t,r,n,i,o,a,c){if(e&&e.length===0)return;let l=!1,m=0,d=(u,f)=>new Promise(h=>{var ie,Ie,It,Gr,k,N,j,J;let g=i.project,y=e.length;this.parallelCount=a,this.workerUniqueIds=this.generateUniqueIds(this.parallelCount),this.executionQueue=new Vo(r,n,e,i,o,t),this.combinedTestResults={};let T=((ie=i.company)==null?void 0:ie.ucid)||"",v=(Ie=i.company)==null?void 0:Ie.companyId,b=(It=i.company)==null?void 0:It.name,w=i.source||"cli",S=i.user,A=(Gr=i.company)==null?void 0:Gr.planType,D=(k=i.company)==null?void 0:k.isStartUp,V=(N=i.projectData)==null?void 0:N.name,x=(j=i.projectData)==null?void 0:j.type,R=i.lightweightMode,L=(J=i.gridData)==null?void 0:J.type,M=(_e,Rt,ve,uc,li,pc)=>(m++,Cf({executionId:r,projectId:g,testId:Rt,resultId:ve,ucid:T,companyId:v,companyName:b,projectName:V,companyPlan:A,source:w,user:S,lightweightMode:R,isStartUp:D,projectType:x,appSource:pc,gridType:L}),t.testStartAndReport(_e,r,ve,uc,li)),G=async(_e,Rt,ve,uc,li,pc)=>{var gd,hd,yd;m--;let tt={...(R==null?void 0:R.onlyTestIdsNoSuite)&&{show:!0},...ve.seleniumStats&&{seleniumStats:ve.seleniumStats},...ve.gridIssues&&{gridIssues:ve.gridIssues},...ve.keepAliveIssue&&{keepAliveIssue:ve.keepAliveIssue},...i.host&&{gridHost:i.host}};if(ve.seleniumPerfMarks&&(t.concatSeleniumPerfMarks(ve.seleniumPerfMarks),delete ve.seleniumPerfMarks),i.grid||i.gridId?(tt.gridName=i.grid||((gd=i.gridData)==null?void 0:gd.name),tt.gridType=(hd=i.gridData)==null?void 0:hd.type,tt.gridProvider=(yd=i.gridData)==null?void 0:yd.provider):i.localTmaUrl?(tt.gridName="local-tma-from-options",tt.gridType="local-tma"):i.useLocalChromeDriver?(tt.gridName="local-chrome-driver-from-options",tt.gridType="local-chrome"):i.useChromeLauncher?(tt.gridName="chrome-launcher-from-options",tt.gridType="local-chrome"):i.browserstack?tt.gridName="browserstack-from-options":i.saucelabs&&(tt.gridName="saucelabs-from-options"),await t.testEndAndReport(_e,ve,r,uc,li,tt).catch(JT=>vp.error("testEndAndReport threw an error",{err:JT})),li)return;this.combinedTestResults[ve.resultId]=ve,Pf({executionId:r,projectId:g,testId:Rt,resultId:ve.resultId,result:ve,ucid:T,companyId:v,companyName:b,projectName:V,companyPlan:A,source:w,user:S,lightweightMode:R,logger:vp,isStartUp:D,projectType:x,appSource:pc}),c&&!ve.success&&(this.executionQueue.stop(),l=!0),(Object.keys(this.combinedTestResults).length===y||l&&m===0)&&h(this.combinedTestResults)},W=(_e,Rt)=>{this.combinedTestResults[Rt.resultId]=Rt,t.onTestIgnored(_e,Rt.resultId),m--,(Object.keys(this.combinedTestResults).length===y||l&&m===0)&&h(this.combinedTestResults)},q=(_e,Rt)=>t.onGridSlot(_e,Rt);for(i.userData={loginData:{...Ir(),refreshToken:Yi(),authData:Ir(),token:u,userAccessKey:f},projectId:i.project,company:i.company,servicesUrl:he()},F("in localStrategy before createWorker");this.workers.size<this.parallelCount&&this.executionQueue.hasMoreTests();)this.runWorker(i,this.customExtensionLocalLocation,r,M,G,q,W)});try{let u=await Ot(),f=await Qi(),h=await d(u,f);if(this.workers.size>0&&this.workers.clear(),l)throw new Xt;return h}catch(u){throw vp.error("failed running parallel workers",{executionId:r,err:u}),u}}generateUniqueIds(e){return Array.from({length:e},(t,r)=>`worker-${r+1}`)}}});var ii,Mb,za,Sp,Ep,Vr,Ip=E(()=>{"use strict";ii=I(require("lodash"));B();$();oe();ae();$e();cs();Al();Cl();ge();Mb=require("uuid");_f();B();Lt();hg();Y();Nb();de();Go();({CLI_MODE:za}=Wt),Sp=P("test-plan-runner"),Ep=class{constructor(e){this.customExtensionLocalLocation=e;this.startTime=Date.now()}static get id(){return Ep._id}async runTestAllPhases(e,t,r,n,i,o,a,c){let l={},m=new qa(this.customExtensionLocalLocation),d=async()=>{let g=i.beforeParallel||1,y=!0,T=await m.runTests(e,c,o,a,i,n,g,y);Object.assign(l,T)},u=async()=>{let g=vi||i.parallel,y=!1;F("right before this.workerManager.runTests");let T=await m.runTests(t,c,o,a,i,n,g,y);F("right after this.workerManager.runTests"),Object.assign(l,T)},f=async()=>{let g=i.afterParallel||1,y=!1,T=await m.runTests(r,c,o,a,i,n,g,y);Object.assign(l,T)};kf({executionId:o,projectId:i.project}),F("right before runBeforeTests");try{return await d(),F("right before runTestPlanTests"),await u(),F("right after runTestPlanTests"),await f(),l}catch(g){if(Sp.error("error running test plan",{err:g}),g instanceof Xt)return c.markAllQueuedTests(o,fe.ABORTED,"aborted",!1);throw g}finally{await h()}async function h(){var y,T,v,b;if((y=i.lightweightMode)!=null&&y.disablePixelValidation)return;if(i.mode===za.SELENIUM){let[{getSessionPlayer:w},{makeSDK:S}]=await Promise.all([Promise.resolve().then(()=>(we(),ir)),import("@applitools/eyes-sdk-core")]),{EyeSdkBuilder:A}=w();await A.closeBatch(o,S);return}let g;try{if(!((b=(v=(T=i.company)==null?void 0:T.activePlan)==null?void 0:v.premiumFeatures)!=null&&b.applitools)||(g=await Cp(i.project),ii.default.isEmpty(g)||!o))return;let{runKey:w,url:S}=g,A=require("@applitools/eyes-sdk-core").makeSDK({name:"Testim.io",version:"4.0.0",spec:{}}),D=1e4;await le(A.closeBatches({settings:{batchIds:[o],serverUrl:S,apiKey:w}}),D)}catch{}}}async runTestPlan(e,t,r,n,i,o,a,c){var b,w,S;let l=re(),m=n.project;Jd(l),e.forEach(A=>Object.assign(A,{isBeforeTestPlan:!0})),r.forEach(A=>Object.assign(A,{isAfterTestPlan:!0}));let d=[...e,...t,...r],u=new Eo(d,n,o,a),f=ii.default.chain(d).map(A=>{var D;return((D=A.overrideTestConfig)==null?void 0:D.name)||""}).uniq().compact().value(),h=(f==null?void 0:f.length)===1?f[0]:null,g=(b=n.lightweightMode)!=null&&b.onlyTestIdsNoSuite?[]:d.map(A=>A.name),y=(w=n.lightweightMode)!=null&&w.onlyTestIdsNoSuite?{beforeTests:e,tests:t,afterTests:r}:u.executionStart(l,m,this.startTime,i,g);F("before testListInfoPromise");let T=await y;(S=n.lightweightMode)!=null&&S.onlyTestIdsNoSuite||Q.onTestPlanStarted(T.beforeTests,T.tests,T.afterTests,i,l,c,h),F("before runTestAllPhases");let v=await this.runTestAllPhases(T.beforeTests,T.tests,T.afterTests,a,n,l,i||"All Tests",u);return F("before executionEnd"),await u.executionEnd(l),F("after executionEnd"),{results:v,executionId:l,testPlanName:i,configName:h}}isJsonString(e){try{JSON.parse(e)}catch{return!1}return!0}handleReportFailure(e,t){try{e.text?t=e.text:t=JSON.stringify(e)}catch{}console.error(ue.colorString(ue.FgMagenta,t)),process.exit(-1)}async reportTestRunnerStarted(e,t){try{return await Rp(e,t.testOptimization)}catch(r){return this.handleReportFailure(r,"Failed Report: Test Runner Started")}}async reportTestRunnerFinished(e){try{return await xp(e)}catch(t){return this.handleReportFailure(t,"Failed Report: Test Runner Finished")}}async runTestPlans(e,t){Sp.info("start to run test plan",{options:{...e,token:void 0,userParamsData:void 0},branchToUse:t});function r(m){return ii.default.flattenDeep(Object.values(m)).reduce((d,u)=>d.concat(u.beforeTests,u.tests,u.afterTests),[])}let n={},i={},o=e.project,a={testPlans:[],testPlansData:{}};O.flags.enableTestPlanAggregation.isEnabled()?(await se(e.testPlanIds,async m=>{let d=await oi(o,e.testPlan,[m],t,e.intersections);d.testPlans.forEach(u=>{a.testPlans.push(u);let f=u._id;a.testPlansData[f]=d.testPlansData[f]})}),await se(e.testPlan,async m=>{let d=await oi(o,[m],e.testPlanIds,t,e.intersections);d.testPlans.forEach(u=>{a.testPlans.push(u);let f=u._id;a.testPlansData[f]=d.testPlansData[f]})})):a=await oi(o,e.testPlan,e.testPlanIds,t,e.intersections);let c=a.testPlans,l=a.testPlansData;if(!c||c.length===0)throw new C(`no test plan to run ${e.testPlan}`);if(!l||Object.keys(l).length===0){if(e.passZeroTests)return[];throw new C(`no test to run in test plan ${e.testPlan}`)}return e.mode!==za.APPIUM&&await Fu(e,r(l)),await se(c,async m=>{var h;let d=m.testPlanId;n[d]={};let u={...e};u.baseUrl||=m.startUrl,u.appId||=((h=m.mobileApp)==null?void 0:h.appId)||void 0,u.gridId||=m.gridId,e.grid&&delete u.gridId,u.gridData=await hf(e,m);let f=u.overrideExecutionName||m.name;return await se(l[d],async g=>{let y=await this.runTestPlan(g.beforeTests,g.tests,g.afterTests,u,f,d,t);Q.onTestPlanFinished(y.results,m.name,this.startTime,y.executionId,!1),n[d][y.executionId]=y.results;let T=Object.keys(n[d]).map(S=>({executionId:S,status:Mu(n[d][S])})),v=Object.keys(n[d]).map(S=>n[d][S]).reduce((S,A)=>Object.assign(S,A),{}),b=Mu(v);Object.assign(i,v);let w=b?T[0].executionId:T.find(S=>!S.status).executionId;return await Ap(o,d,{success:b,executions:T,executionId:w}),y})})}async runAnonymousTestPlan(e,t){var c;Sp.info("start to run anonymous",{options:{...e,token:void 0},branchToUse:t}),F("before getSuite");let r=await Ah(e,t);if(F("after getSuite"),!((c=r==null?void 0:r.tests[0])!=null&&c.length)){if(e.rerunFailedByRunId)throw new C("No failed tests found in the provided run");if(e.passZeroTests)return[];throw new C("No tests to run")}t="branch"in r&&r.branch||t;let n=r;if(e.rerunFailedByRunId&&!n.runName){if(!n.runExists)throw new C("Invalid run ID - no such run.");n.runName===""&&(n.runName=`rerun-${e.rerunFailedByRunId}`)}let i=e.overrideExecutionName||n.runName||[].concat(e.label,e.name,e.suites).join(" "),o=!0;F("Right before validateConfig + runAnonymousTestPlan tests map");let a;return e.appId&&e.mode===za.APPIUM&&(a=await ri({appId:e.appId,projectId:e.project})),await se(r.tests,async l=>{if(a&&l.forEach(d=>{"nativeApp"in d&&(d.nativeApp=a)}),e.resultId){let d=l[0];d.resultId=e.resultId,l=[d]}e.mode!==za.APPIUM&&await Fu(e,l),F("right before runTestPlan");let m=await this.runTestPlan([],l,[],e,i,null,t,o);return F("right after runTestPlan"),await Q.onTestPlanFinished(m.results,i,this.startTime,m.executionId,o),m})}async run(e){let t=vn(),r=[];await this.reportTestRunnerStarted(e.project,e),en(e)?r=await this.runTestPlans(e,t):r=await this.runAnonymousTestPlan(e,t),await this.reportTestRunnerFinished(e.project);let n=ii.default.flattenDeep(r);return F("right before onAllTestPlansFinished"),await Q.onAllTestPlansFinished(n),F("right after onAllTestPlansFinished"),n.map(i=>i.results).reduce((i,o)=>Object.assign(i,o),{})}},Vr=Ep;Vr._id=(0,Mb.v4)()});var Ce={};z(Ce,{addTestRetry:()=>au,clearTestResult:()=>Du,deleteCloudflareTunnel:()=>Mp,fetchLambdatestConfig:()=>uu,fixGridAppIDStructure:()=>op,forceUpdateCloudflareTunnelRoutes:()=>Np,getAllGrids:()=>xl,getAppDetails:()=>ri,getApplitoolsIntegrationData:()=>Cp,getBrowserStackSessionMetaData:()=>RI,getCloudflareTunnel:()=>Dp,getEditorUrl:()=>SI,getGridSlot:()=>Rl,getHybridGridProvider:()=>Il,getLabFeaturesByProjectId:()=>vu,getMobileDevicesFromGrid:()=>si,getRealData:()=>eu,getS3Artifact:()=>_n,getS3ArtifactText:()=>Zl,getSuiteTestList:()=>Uu,getTestPlan:()=>vI,getTestPlanTestList:()=>oi,getTestResults:()=>Dr,getUsageForCurrentBillingPeriod:()=>_p,initializeUserWithAuth:()=>Lp,isTestResultCompleted:()=>Lu,keepAliveCompanySlots:()=>Yl,keepAliveGrid:()=>Sl,loadSfdcCredential:()=>Op,loadTest:()=>Vn,releaseCompanySlot:()=>Jl,releaseGridSlot:()=>El,reportExecutionFinished:()=>Io,reportExecutionStarted:()=>ou,reportRunnerFinished:()=>xp,reportRunnerStarted:()=>Rp,requestCompanySlot:()=>Kl,saveRemoteStep:()=>Eu,saveTestPlanResult:()=>Ap,updateCompanySlot:()=>Xl,updateExecutionTests:()=>iu,updateRemoteRunFailure:()=>Fp,updateTestDataArtifact:()=>Ro,updateTestResult:()=>Jo,updateTestStatus:()=>Cr,uploadAppToGrid:()=>ip,uploadRunDataArtifact:()=>Nu,validateUserAccessKey:()=>wl});async function Ns(){let s=await Ot();if(!s)throw new Error("Failed to get token from server");return{[Vc]:Vr.id,Authorization:`Bearer ${s}`}}async function Re({url:s,body:e,headers:t={},timeout:r,retry:n}){let i=await Ns(),o={...t,...i};return Ve({url:`${he()}${s||""}`,body:e,headers:o,timeout:r,retry:n})}async function TI(s,e,t,r={},n=void 0){let i=await Ns(),o={...r,...i};return await Xs(`${he()}${s||""}`,e,t,o,n)}async function ai(s,e){let t=await Ns();return await Oc(`${he()}${s||""}`,e,t)}async function Ub(s,e){let t=await Ns();return await Js(`${he()}${s||""}`,e,t)}async function wI(s,e){let t=await Ns();return await Ys(`${he()}${s||""}`,e||void 0,t)}async function ke(s,e,t,r){let n=await Ns();return await Te(`${he()}${s||""}`,e||void 0,n,r,t)}function _n(s,e){return(0,ee.default)(()=>ke(`/storage${s}`,null,{isBinary:!0},e),{retries:te,factor:1})}function Zl(s){return(0,ee.default)(()=>wI(`/storage${s}`))}async function Rp(s,e){return await Re({url:"/test-runner",body:{projectId:s,testOptimization:e}})}async function xp(s){return await Ub("/test-runner",{projectId:s})}async function vI(s,e){let t=n=>n===null?[]:typeof n=="string"&&JSON.parse(n)||n;return(await(0,ee.default)(()=>ke("/testPlan",{projectId:s,name:e.join(",")}),{retries:te,factor:1})).map(({testConfigIds:n,beforeAllLabels:i,testLabels:o,afterAllLabels:a,...c})=>Object.assign(c,{testConfigIds:t(n),beforeAllLabels:t(i),testLabels:t(o),afterAllLabels:t(a)}))}async function Op({branch:s,projectId:e}){let t=await(0,ee.default)(()=>ke(`/branch/branchData/${encodeURIComponent(s)}`,{projectId:e}),{retries:te,factor:1});return t==null?void 0:t.sfdcCredential}function Vn({testId:s,branch:e,projectId:t,skipSharedSteps:r=!1,useBranchMap:n=!0}){return(0,ee.default)(()=>ke(`/test/${s}`,{projectId:t,branch:e,skipSharedSteps:r,useBranchMap:n}),{retries:te,factor:1})}function Ap(s,e,t){return(0,ee.default)(()=>Re({url:"/testPlan/result",body:{projectId:s,testPlanId:e,result:t}}),{retries:te,factor:1})}function Cr(s,e,t,r,n,i,o=te){return(0,ee.default)(()=>ai("/result/run/test",{runId:e,testId:t,resultId:r,status:n,projectId:s,runnerVersion:hI,...i}),{retries:o,factor:1})}function iu(s,e,t,r,n,i,o,a){return(0,ee.default)(()=>ai("/result/run/tests",{runId:s,runnerStatuses:e,status:t,reason:r,success:n,startTime:i,endTime:o,projectId:a}),{retries:te,factor:1})}async function ou({executionId:s,projectId:e,labels:t,startTime:r,executions:n,config:i,resultLabels:o,remoteRunId:a,localRunUserId:c,isLocalRun:l,intersections:m}){let{isCi:d}=await Promise.resolve().then(()=>(no(),Rf));return Re({timeout:9e4,url:"/result/run",body:{runId:s,projectId:e,labels:t,startTime:r,execution:n,status:"RUNNING",config:i,resultLabels:o,remoteRunId:a,intersections:m,metadata:{isCiRun:d,localRunUserId:c,isLocalRun:l}},retry:3})}function Io(s,e,t,r,n={},i=void 0,o=void 0){let a=Date.now();return(0,ee.default)(()=>ai("/result/run",{runId:e,projectId:t,endTime:a,status:s,success:r,tmsOptions:n,remoteRunId:i,resultExtraData:o}),{retries:te,factor:1})}async function oi(s,e,t,r,n){return(0,ee.default)(()=>Re({url:"/testPlan/list",body:{projectId:s,names:e,planIds:t,branch:r,intersections:n},timeout:12e4}),{retries:te,factor:1})}function Uu({projectId:s,labels:e,testIds:t,testNames:r,testConfigNames:n,suiteNames:i,suiteIds:o,branch:a,rerunFailedByRunId:c,testConfigIds:l,intersections:m}){return(0,ee.default)(()=>Re({url:"/suite/v2/list",body:{projectId:s,labels:e,testIds:t,testNames:r,testConfigNames:n,suiteNames:i,suiteIds:o,branch:a,rerunFailedByRunId:c,testConfigIds:l,intersections:m}}),{retries:te,factor:1})}async function ri({appId:s,projectId:e}){try{return await(0,ee.default)(()=>ke(`/mobile-app/app/${s}?projectId=${e}`),{retries:te,factor:1})}catch(t){throw new Error(`Could not load app with the ID ${s}`,{cause:t})}}async function _p(s){try{return await(0,ee.default)(()=>ke(`/plan/project/${s}/usage-current-billing-period`),{retries:te,factor:1})}catch(e){Mt.error("failed getting usage for current billing period",{projectId:s,error:e});return}}function Lu(s,e,t){return(0,ee.default)(()=>ke(`/result/${s}/isComplete`,{projectId:e,testRetryKey:t}),{retries:te,factor:1})}function Dr(s,e,t,r){return(0,ee.default)(()=>ke(`/test/v2/${s}/result/${e}`,{projectId:t,branch:r}),{retries:te,factor:1})}function Sl(s,e){return Re({url:`/grid/keep-alive?reqId=${re()}`,body:{projectId:s,slots:e},timeout:1e4})}function El(s,e,t,r,n){return Re({url:`/grid/release?reqId=${re()}`,body:{companyId:s,projectId:e,slotId:t,gridId:r,browser:n}})}function Il(s){return Re({url:"/grid/hybrid/provider",body:s})}function Rl(s){return(0,ee.default)(()=>ke("/grid/grid-slot",{...s,reqId:re()}),{retries:te,factor:1})}async function Lp({projectId:s,token:e,branchName:t,lightweightMode:r,localGrid:n,publicIp:i,gridId:o,grid:a,clientCliVersion:c,clientNodeVersion:l,clientNpmVersion:m}){var d,u;try{return await(0,ee.default)(()=>Ve({url:`${he()}/executions/initialize`,body:{projectId:s,token:e,branchName:t||"master",lightweightMode:r,localGrid:n,publicIp:i,gridId:o,gridName:a,clientCliVersion:c,clientNodeVersion:l,clientNpmVersion:m},timeout:6e4}),{retries:te,factor:1})}catch(f){if(Mt.error("error initializing info from server",f),(d=f.message)!=null&&d.includes("Bad Request"))throw new C("Error trying to retrieve CLI token. Your CLI token and project might not match. Please make sure to pass `--project` and `--token` that match to each other or make sure they match in your ~/.testim file.");if((u=f.code)!=null&&u.includes("ENOTFOUND"))throw new C("Due to network connectivity issues, Testim CLI has been unable to connect to the Testim backend.");if(f.text)try{let h=JSON.parse(f.text),g=h.clientMessage.color||"red",y=h.clientMessage.bgColor||"bgBlack";console.log(Pp.default[y](Pp.default[g](h.clientMessage.text))),h.exitCode&&process.exit(h.exitCode)}catch{Mt.error("Error parsing error message from server",f)}throw f}}async function SI(){if(rt)return{editorUrl:rt};try{return await(0,ee.default)(()=>ke("/system-info/editor-url"),{retries:te,onFailedAttempt:s=>{if(s.attemptNumber>=te)throw s},factor:1})}catch(s){return Mt.error("cannot retrieve editor-url from server",{err:s}),{editorUrl:"https://app.testim.io"}}}function xl(s){return(0,ee.default)(()=>ke("/grid",{companyId:s}),{retries:te,factor:1})}function eu(s,e,t){return(0,ee.default)(()=>ke(`/real-data/${e}?${t}&projectId=${s}`),{retries:te,factor:1})}function Jo(s,e,t,r,n){return(0,ee.default)(()=>Re({url:"/result/test",body:{projectId:s,resultId:e,testId:t,testResult:r,remoteRunId:n}}),{retries:te,factor:1})}function Du(s,e,t,r){return(0,ee.default)(()=>Re({url:"/result/test/clear",body:{projectId:s,resultId:e,testId:t,testResult:r}}),{retries:te,factor:1})}function Eu(s,e,t,r){return(0,ee.default)(()=>Re({url:"/remoteStep",body:{projectId:s,resultId:e,stepId:t,remoteStep:r}}),{retries:te,factor:1})}function EI(s){return s.startsWith("/")?s:`/${s}`}function II(s,e,t){let r=EI(s);return t&&(r=`/${t}${r}`),e&&(r=`/${e}${r}`),r}async function Bb(s,e,t,r,n,i="application/octet-stream"){let o=null;i==="application/json"&&(o=".json");let a=`${n}_${re()}${o||""}`,c=`${e}/${t}/${a}`,l=II(c,bI,s),m=Buffer.from(Fb.gzip(r,{level:3})),d={file:{fileName:a,buffer:m}};return await(0,ee.default)(()=>TI(`/storage${l}`,{},d,{"X-Asset-Encoding":"gzip"}),{retries:te,factor:1}),l}function au({projectId:s,runId:e,testId:t,newResultId:r,originalTestResultId:n,previousTestResultId:i,testResult:o}){return(0,ee.default)(()=>Re({url:"/result/test/retry",body:{projectId:s,newResultId:r,originalTestResultId:n,previousTestResultId:i,testId:t,runId:e,testResult:o}}),{retries:te,factor:1})}async function Cp(s){try{return await ke(`/integration/applitools/v3/connected?projectId=${s}`)}catch(e){return Mt.warn("could'nt get applitools integration data.",{err:e}),{}}}async function Dp(s,e){try{return await ai("/tunnel",{companyId:s,routes:e})}catch(t){return Mt.warn("could'nt get tunnel.",{err:t}),{}}}async function Np(s,e){try{return await Re({url:`/tunnel/${e}`,body:{companyId:s}})}catch(t){Mt.warn("could'nt get tunnel.",{err:t});return}}async function Mp(s,e){try{return await Ub(`/tunnel/${e}`,{companyId:s})}catch(t){Mt.warn("could'nt get tunnel.",{err:t});return}}function Fp(s){return Ve({url:`${he()}/result/remoteRunFailure`,body:s})}async function si({projectId:s,projectType:e,gridId:t,companyId:r,selectors:n}){let i=`${yI}/mobileDevices/${t}/${r}?projectType=${e}`;i=n?`${i}&selectors=${encodeURIComponent(n)}`:i;try{return await(0,ee.default)(()=>ke(i,{projectId:s}),{retries:te,factor:1})}catch(o){return Mt.warn("could'nt get devices from headspin grid.",{err:o}),null}}async function ip({projectId:s,gridId:e,app:t,timeout:r}){return(0,ee.default)(()=>Re({url:`/mobile-app/app/upload-to-grid?projectId=${s}&gridId=${e}`,body:t,timeout:r}),{retries:te,factor:1})}async function op(s){return(0,ee.default)(()=>Re({url:"/mobile-app/app/fix-grid-app-id",body:s}),{retries:te,factor:1})}async function Kl(s,e){return(0,ee.default)(()=>Re({url:"/slot-management/request-slot",body:{companyId:s,projectId:e}}),{retries:te,factor:1})}async function Jl(s,e,t){return(0,ee.default)(()=>Re({url:"/slot-management/release-slot",body:{companyId:s,projectId:e,slotId:t}}),{retries:te,factor:1})}async function Xl(s,e,t){return(0,ee.default)(()=>ai("/slot-management/update-slot",{slotId:t.slotId,companyId:s,projectId:e,slot:t}),{retries:te,factor:1})}function Yl(s,e,t){return Re({url:`/slot-management/keep-alive?reqId=${re()}`,body:{slots:t,companyId:s,projectId:e},timeout:1e4})}async function RI(s,e){return await Te(`${Vs}/sessions/${s}`,void 0,{Authorization:`Basic ${Buffer.from(`${e.user}:${e.key}`).toString("base64")}`})}async function wl(s){try{return await ke("/v2/project/validateUserAccessKey",s),!0}catch(e){return Mt.error("error validating user access key",{error:e}),!1}}var Pp,ur,Fb,ee,kp,hI,Mt,te,yI,bI,uu,vu,Nu,Ro,ge=E(()=>{"use strict";Pp=I(require("chalk")),ur=I(require("lodash")),Fb=I(require("pako"));B();oe();ae();Ge();lt();ee=I(require("p-retry")),kp=I(require("object-hash"));Y();$();Ip();hI=st(),Mt=P("testim service api"),te=3,yI="/grid",bI="test-result-artifacts";uu=async s=>(0,ee.default)(()=>ke("/grid/lt/config",{companyId:s}),{retries:te,factor:1}),vu=async s=>(0,ee.default)(()=>ke(`/labFeature/v2/project/${s}`),{retries:te,factor:1});Nu=ur.memoize(async(s,e,t,r)=>{if(!ur.isEmpty(r))return await Bb(s,e,t,JSON.stringify(r),"test-run-data","application/json")},(s,e,t,r)=>`${(0,kp.default)(r)}:${e}:${t}`),Ro=ur.memoize(async(s,e,t,r,n)=>!r||ur.isEmpty(r)?void 0:await Bb(s,e,t,JSON.stringify((()=>{let o=ur.clone(r);if(n!=null&&n.hiddenParams){let a=n.hiddenParams||[];(Array.isArray(a)?a:Object.keys(a)).forEach(l=>{o[l]&&Object.assign(o,{[l]:jc.HIDDEN_PARAM})})}return o})()),"test-test-data","application/json"),(s,e,t,r)=>`${(0,kp.default)(r)}:${e}:${t}`)});function Ka(){return st()}var Up=E(()=>{"use strict";B()});function CI(s){K.EXTENSION!==s&&process.nextTick(()=>{try{(we(),qe(ir)).getSessionPlayer()}catch{}})}function PI(s){var e,t;(t=(e=s.clientConfig)==null?void 0:e.clientMessages)!=null&&t.length&&s.clientConfig.clientMessages.forEach(r=>{let n=r.color||"yellow",i=r.bgColor||"bgBlack";console.log(Bp.default[i](Bp.default[n](r.text)))})}function kI(s,e){let{serviceUrl:t}=s;Gs(t),kt(async()=>s,Yr.CACHE_FN_NAME,Yr.TTL,{serviceUrl:t})(),Ut.setRegion(Tg[bs(e)])}async function ci(s){let{project:e,token:t,userAccessKey:r,lightweightMode:n,useLocalChromeDriver:i,useChromeLauncher:o,mode:a,gridId:c,grid:l}=s,m=Boolean(n==null?void 0:n.general),d=Boolean(i||o),u=m?AI:xI,f=Ka(),h=Fc(),g=await Vm(),y=null;if(O.flags.getPublicIpFrom3rdPartyServices.isEnabled()&&!d)try{y=await kb()}catch(b){jb.error("failed to get public ip",b)}let T=!0;F("before initializeUserWithAuth");let v=await kt(async()=>(CI(a),T=!1,await Lp({projectId:e,token:t,branchName:s.branch,lightweightMode:n,localGrid:d,publicIp:y,gridId:c,grid:l,clientCliVersion:f,clientNodeVersion:h,clientNpmVersion:g})),"initializeUserWithAuth",u,{project:e,token:t,branchName:s.branch,lightweightModeGeneral:m,localGrid:d,gridId:c,grid:l,publicIp:y})();return PI(v),kI(v.clientConfig,e),s.publicIps=[v.clientPublicIp],F("after initializeUserWithAuth"),y&&v.clientPublicIp&&v.clientPublicIp!==y&&(jb.error("public ip mismatch",{publicIpFromExternalService:y,publicIpFromServices:v.clientPublicIp}),s.publicIps.push(y)),uf(v.authData,{projectId:e,token:t,userAccessKey:r,publicIp:v.clientPublicIp,initializedFromCache:T}),v}var Bp,jb,xI,AI,$b=E(()=>{"use strict";Bp=I(require("chalk"));$e();ge();er();lt();$a();ae();$();de();Up();B();os();oe();Ao();jb=P("initializeUserWithAuth"),xI=1e3*60*5,AI=1e3*60*60*10});async function Gb(s){var r;let e=Promise.resolve();s.useLocalChromeDriver&&(s.chromeBinaryLocation=s.downloadBrowser?await Xi():s.chromeBinaryLocation,e=ln({projectId:s.project,userId:s.user},{chromeBinaryLocation:s.chromeBinaryLocation},Boolean((r=s.lightweightMode)==null?void 0:r.general)),s.useLocalChromeDriver=!0),!s.playerRequirePath&&s.mode!==K.EXTENSION&&await Sr(s.playerLocation,s.canary),s.mode!==K.SELENIUM&&s.mode!==K.APPIUM&&!s.ext&&await ul(s.extensionLocation);let t;if(s.installCustomExtension){let n=Boolean(s.useLocalChromeDriver||s.useChromeLauncher);t=await ll(s.installCustomExtension,n)}return await e,t}async function Hb(s){var o;OI.info("prepare MockNetwork",{location:s});let e=await Nc(s),t=Buffer.isBuffer(e)?e:e.body;if(t.byteLength>Wb*1e6)throw new Error(`${jp} exceeded ${Wb}MB`);let r;try{r=JSON.parse(t.toString("utf-8"))}catch(a){throw new Error(`${jp} cannot be parsed.${Ja.EOL}${a}`)}let n=new Vb.default;if(!n.validate(Yc,r)){let a=(o=n.errors)==null?void 0:o.map((c,l)=>`${++l}) ${c.dataPath} ${c.message}`).join(Ja.EOL);throw new Error(`${jp} is malformed.${Ja.EOL}${a}`)}return r.entries}var Ja,Vb,Wb,jp,OI,$p=E(()=>{"use strict";Ja=I(require("node:os"));B();Sm();pn();Vb=I(require("ajv"));ae();fl();$();$b();Wb=1,jp="JSON file supplied to --mock-network-pattern",OI=P("prepare runner")});function Xb(s){return s.start&&ls(null,"cli-start-command",{downloadBrowser:Boolean(s.downloadBrowser)}),!!(s.startV2||s.start||s.agent)}async function Yb(s){let e=!!s.start;if(Number.isNaN(s.agentPort))throw new C("Agent port is not number");let t=xo(s);return console.log("Start Testim CLI on Agent mode"),{project:s.project,token:s.token,agentMode:!0,agentPort:s.agentPort,agentBind:s.agentBind,openEditor:s.openEditor,startTestimBrowser:e,ext:s.ext,extensionPath:s.extensionPath,playerLocation:s.playerPath||t,canary:s.canary,playerPath:s.playerPath,playerRequirePath:s.playerRequirePath,downloadBrowser:Boolean(s.downloadBrowser)}}var Qb=E(()=>{"use strict";Dn();us();Y()});var Ms,Hp,Zb=E(()=>{"use strict";Ms="SECRETS",Hp={get secretsKey(){return Ms},get proxySecrets(){return new Proxy({},{get(s,e){return`${Ms}.${e}`}})},injectProxySecretsStoreToGlobal(){Object.assign(globalThis,{[Ms]:this.proxySecrets})},containsSecrets(s){return typeof s=="string"?s.includes(Ms):JSON.stringify(s).includes(Ms)},extractSecretKeysFromCode(s){let e=new Set,r=(typeof s=="string"?s:JSON.stringify(s)).match(new RegExp(`${Ms}\\.\\w+`,"g"));return r==null||r.map(n=>{let i=n.split(".")[1];i&&e.add(i)}),e},replaceValuesWithDecryptedSecrets({testData:s,secretsRecord:e}){let r=this.secretsKey.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=new RegExp(`^${r}\\.(\\w+)$`),i=o=>{Array.isArray(o)?o.forEach((a,c)=>{if(typeof a=="string"){let l=a.match(n);if(l){let m=l[1];o[c]=e[m]??a}}else typeof a=="object"&&a!==null&&i(a)}):o&&typeof o=="object"&&Object.entries(o).forEach(([a,c])=>{if(typeof c=="string"){let l=c.match(n);if(l){let m=l[1];o[a]=e[m]??c}}else typeof c=="object"&&c!==null&&i(c)})};i(s)}}});var Xp={};z(Xp,{doLogin:()=>Jp,getProjectId:()=>FI,getToken:()=>UI});async function FI(){return rT("projectId")}async function UI(){return rT("token")}function tT(s,e){return Promise.race([s,pe(e).then(()=>{throw new ce("timeout")})])}async function BI(){let s=(await import("express")).default(),e=async function(){return tT(new Promise(n=>{s.get("/loginInfo",(i,o)=>{n(JSON.parse(Buffer.from(i.query.info,"base64").toString())),o.status(200).end()})}),6e4).catch(()=>null)}();await new Promise((r,n)=>{let i=s.listen(42543,o=>{o&&n(o),r(i.address().port)})});try{let{getEditorUrl:r}=await Promise.resolve().then(()=>(ge(),Ce)),{editorUrl:n}=await r();ho(`${n}/#/new-test`)}catch{console.log(`Unable to open Testim automatically - please manually go to ${rt||gr}`)}return await e}async function Jp({overwriteExisting:s=!0,projects:e=null}={}){let t=qp.homedir(),r=zp.join(t,".testim");if(await ye(r)&&!s)return;let i={},[{default:o},{default:a}]=await Promise.all([import("prompts"),import("ora")]),c=a("Getting credentials from Tricentis Testim extension ...").start();if(e||(e=await tT(BI(),62e3).catch(()=>null)),e!=null&&e.token){i.token=e.token,i.projectId=e.projectId,c.succeed(),await eT(r,i);return}if(e!=null&&e.length){c.succeed();let l=e.length===1?{project:e[0]}:await o({type:"select",name:"project",message:"There are multiple projects associated with your user account. Please select the project you would like to connect to:",choices:e.map(m=>({title:m.name,value:m}))});i.token=l.project.ci.token,i.projectId=l.project.id,await eT(r,i);return}c.fail(),console.log("Error getting credentials - please pass `--token` and `--project` to the CLI or try again")}async function eT(s,e){await Kp.promises.writeFile(s,Ya.stringify(e)),console.log(`Testim credentials saved in '${s}'`)}async function rT(s){let e=qp.homedir(),t=zp.join(e,".testim"),r=await ye(t),n={};if(r)try{n=Ya.parse((await Kp.promises.readFile(t)).toString())}catch{}return n||={},n[s]}var qp,zp,Ya,Kp,Qa=E(()=>{"use strict";qp=I(require("os")),zp=I(require("path")),Ya=I(require("yaml"));B();Kp=require("fs");Y();Gl();oe()});var pT={};z(pT,{process:()=>KI,program:()=>p});var Qp,aT,Za,cT,Kt,Fe,lT,jI,Me,ed,$I,WI,nT,uT,VI,Zp,ec,td,Yp,Ft,iT,GI,HI,p,qI,zI,oT,KI,rd=E(()=>{"use strict";Qp=I(require("ms")),aT=I(require("chalk")),Za=I(require("node:fs")),cT=I(require("node:url")),Kt=I(require("lodash")),Fe=I(require("node:path"));B();Dn();Qb();er();lT=require("commander");ae();Y();Hr();B();de();Zb();Go();Ao();oe();jI=s=>s.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),Me=(s,e)=>(e.push(s),e),ed=new lT.Command,$I=s=>s.split(","),WI=(s,e)=>!s||s.length===0?e:s,nT=["enable-heavy-ad-intervention","heavy-ad-privacy-mitigations","use-fake-device-for-media-stream","use-fake-ui-for-media-stream","proxy-server"],uT=()=>{function s(g){return g.includes("-h, --help")}function e(g){return g.includes("--params [params-json-string]")}function t(g){return g.includes("--ext")||g.includes("--extension-path")||g.includes("--headless-extension-download-path")}function r(g){return g.includes("--player-path")||g.includes("--player-require-path")}function n(g){return g.includes("--executionId")||g.includes("--source")||g.includes("--resultId")||g.includes("--remoteRunId")||g.includes("--schedulerId")}function i(g){return g.includes("--get-browser-timeout")||g.includes("--get-browser-retries")||g.includes("--get-session-timeout")||g.includes("--get-session-retries")||g.includes("--driver-request-timeout")||g.includes("--driver-request-retries")}function o(g){return g.includes("--user")}function a(g){return g.includes("shouldMonitorPerformance")}function c(g){return g.includes("--save-rca-locally")}function l(g){return g.includes("--exit-code-ignore-failing-tests")}function m(g){return g.includes("--high-speed")}function d(g){return g.includes("--urls")}function u(g){return g.includes("--test-start-timeout")}function f(g){return g.includes("--install-lazy-deps")}function h(g){return g.includes("--print-final-caps")||g.includes("--print-grids")}ed.help(g=>g.split(`
|
|
405
405
|
`).filter(T=>!t(T)&&!e(T)&&!s(T)&&!r(T)&&!n(T)&&!a(T)&&!o(T)&&!i(T)&&!c(T)&&!l(T)&&!m(T)&&!d(T)&&!u(T)&&!f(T)&&!h(T)).join(`
|
|
406
406
|
`))},VI=(s,e)=>{let t=e?`Please use ${e} instead.`:"";console.log(aT.default.yellow(`
|
|
407
407
|
WARNING: ${s} is deprecated. ${t}
|