@testim/testim-cli 4.120.0 → 4.121.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/cli.js +1 -1
- package/cli.js.map +2 -2
- package/npm-shrinkwrap.json +5 -5
- package/package.json +1 -1
package/cli.js
CHANGED
|
@@ -13,7 +13,7 @@ Testim had missing write access to ${r||e}
|
|
|
13
13
|
- installed where chromedriver expects it (see https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver#requirements).
|
|
14
14
|
- exists in your PATH environment variables.
|
|
15
15
|
3. Try adding --chrome-binary-location flag to Testim CLI specifying the exact location of chrome binary in your computer (e.g on Windows "C:/Program Files/Google/Chrome/Application/chrome.exe").
|
|
16
|
-
4. You can always use a standalone Selenium grid and providing it's details with the --host and --port flags (see https://www.npmjs.com/package/selenium-standalone)`)),n.fail(a),o}}async function Uw(){let s=`${Ds}/extension/sessionPlayer_LATEST_RELEASE`;return(await Nt(s)).body.toString("utf8")}async function Fw(s,e){if(!_e(s)||_e(s)&&e||Oe)return s;let t=await Uw();return`${s}-${t}`}function Yc(){let s=ft();return Zr.resolve(s,"testim-bin")}function Bw(){let s=Yc();return Zr.resolve(s,"sessionPlayer.zip")}async function Fm(s,e,t=!1){try{return await Ti(s,e),await st(e,Yc())}catch(r){if(t)throw r;return await Fm(s,e,!0)}}async function br(s,e){Fi.info("prepare player",{location:s,canary:e});let t=Bw();return ht(async()=>{let r=await Fw(s,e);return await Fm(r,t),{}},"preparePlayer",Um,[s,e,t])()}var Dm,Mm,Zr,Nm,Fi,Um,zc,Lm,tn=w(()=>{"use strict";Dm=S(require("ms")),Mm=S(require("fs")),Zr=S(require("path"));pe();Bt();Nm=require("serialize-error");W();jc();J();F();Fi=C("prepare runner and testim start"),Um=(0,Dm.default)("0.5 day"),zc=16,Lm=`The size of the custom extension is more than ${zc}MB`});function jw(){let s=rn.type().toLowerCase();return s==="darwin"?rn.arch()==="arm"?"mac_arm":"mac":s==="windows_nt"?rn.arch()==="x64"?"win64":"win32":"linux"}async function ji(){let s=jw(),e="https://storage.googleapis.com/chromium-browser-snapshots",t={linux:"Linux_x64",mac:"Mac",mac_arm:"Mac_Arm",win32:"Win",win64:"Win_x64"};if(!(s in t))throw new A(`Unsupported platform: ${s}`);let r=parseInt(sn,10)>591479?"chrome-win":"chrome-win32",n={linux:"chrome-linux",mac:"chrome-mac",mac_arm:"chrome-mac",win32:r,win64:r},i={linux:"chrome",mac:"Chromium.app/Contents/MacOS/Chromium",mac_arm:"Chromium.app/Contents/MacOS/Chromium",win32:"chrome.exe",win64:"chrome.exe"},o=`${e}/${t[s]}/${sn}/${n[s]}.zip`,a=Bi.join(Xc,n[s]),l=`${a}.zip`,c=Bi.join(a,i[s]);if(await ge(c))return c;if(!await ge(l)){let m=(0,Qc.default)("Downloading Chromium").start();try{await Bm.promises.mkdir(Xc),await Je(o,l)}catch(u){let g=`Failed to download Chromium: ${u.message}`;throw m.fail(g),new Error(g)}m.succeed()}let d=(0,Qc.default)("Extracting Chromium").start();try{await st(l,Xc)}catch(m){let u=`Failed to extract Chromium: ${m.message}`;throw d.fail(u),new Error(u)}return d.succeed(),c}var Bm,rn,Bi,Qc,sn,Xc,Zc=w(()=>{"use strict";Bm=S(require("fs")),rn=S(require("os")),Bi=S(require("path")),Qc=S(require("ora"));J();F();sn="1000968",Xc=Bi.join(Ft,`chrome-${sn}`)});async function Wm(s,e){return Tr=s,sl=e,await el()}function Vm(s,e){Tr=e.projectId,sl=e.token,nn=e.userAccessKey,nt=s.token,an=nl(nt),cn=s.refreshToken,tl=s.ngrokToken,rl=s.isNgrokWhitelisted,jm=e.publicIp,$m=e.initializedFromCache}function Ww(s=Tr,e=sl){return ht(()=>(on.info("request to get cli token from server"),Ve({url:`${fe}/auth/token`,body:{projectId:s,token:e}})),"getTokenV3",$w*10,{projectId:s,token:e})()}async function Vw(){on.info("request to refresh JWT cli token from server");let s=await Ve({url:`${fe}/auth/refreshToken`,body:{token:nt,refreshToken:cn}});return nt=s.token,an=nl(nt),s.refreshToken&&(cn=s.refreshToken),nt}async function el(){try{let s=await Ww();return on.info("successfully get cli token from server"),nt=s.token,an=nl(nt),cn=s.refreshToken,tl=s.ngrokToken,rl=s.isNgrokWhitelisted,nt}catch(s){throw s.message.includes("Unauthorized")?new A("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."):(on.error(`While trying to retrieve CLI token. caught error: ${s}`,{projectId:Tr}),new A(`While trying to retrieve CLI token, caught error: ${s}`))}}function nl(s){return require("jsonwebtoken").decode(s).exp*1e3}async function xt(){if(!an)return el();let s=O.flags.accessTokenExpiryMargin.getValue();if(an<Date.now()+4*s)try{return await Vw()}catch(e){return on.error("failed to refresh token, executing fallback",e),el()}return nt}function $i(){return cn}function wr(){return nt?{uid:require("jsonwebtoken").decode(nt).id,ngrokToken:tl,isNgrokWhitelisted:rl}:{}}async function Wi(){if(!nn||!Tr)return;if(await il({userAccessKey:nn,projectId:Tr}))return nn;let e=`user access key "${nn}" is invalid for project "${Tr}"`;throw new A(e)}function Vi(){return jm}function Gi(){return $m}var on,nt,an,cn,tl,rl,Tr,sl,nn,jm,$m,$w,it=w(()=>{"use strict";pe();Ge();Bt();J();W();he();le();on=C("testim-custom-token"),Tr=null,sl=null,$w=5*60*1e3});var Gm={};H(Gm,{isCi:()=>es});var es,Hi=w(()=>{"use strict";es=Boolean(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.BUILD_NUMBER||process.env.RUN_ID||!1)});var Ae={};H(Ae,{addTestRetry:()=>Pl,clearTestResult:()=>Al,deleteCloudflareTunnel:()=>Ll,fetchLambdatestConfig:()=>El,fixGridAppIDStructure:()=>Ul,forceUpdateCloudflareTunnelRoutes:()=>Ol,getAllGrids:()=>Sl,getAppDetails:()=>pn,getApplitoolsIntegrationData:()=>kl,getBrowserStackSessionMetaData:()=>Zw,getCloudflareTunnel:()=>_l,getEditorUrl:()=>Yw,getGridById:()=>zi,getGridByName:()=>wl,getHybridGridProvider:()=>Tl,getLabFeaturesByProjectId:()=>Il,getMobileDevicesFromGrid:()=>Ml,getRealData:()=>Rl,getS3Artifact:()=>un,getS3ArtifactText:()=>al,getSuiteTestList:()=>fl,getTestPlan:()=>Jw,getTestPlanTestList:()=>ml,getTestResults:()=>Sr,getUsageForCurrentBillingPeriod:()=>gl,initializeUserWithAuth:()=>vl,isTestResultCompleted:()=>hl,keepAliveCompanySlots:()=>$l,keepAliveGrid:()=>yl,loadSfdcCredential:()=>cl,loadTest:()=>ll,releaseCompanySlot:()=>Bl,releaseGridSlot:()=>bl,reportExecutionFinished:()=>qi,reportExecutionStarted:()=>dl,requestCompanySlot:()=>Fl,saveRemoteStep:()=>xl,saveTestPlanResult:()=>ul,updateCompanySlot:()=>jl,updateExecutionTests:()=>pl,updateRemoteRunFailure:()=>Dl,updateTestDataArtifact:()=>Ji,updateTestResult:()=>Ki,updateTestStatus:()=>vr,uploadAppToGrid:()=>Nl,uploadRunDataArtifact:()=>Cl,validateUserAccessKey:()=>il});async function ts(){let s=await xt();if(!s)throw new Error("Failed to get token from server");return{Authorization:`Bearer ${s}`}}async function Re({url:s,body:e,headers:t={},timeout:r,retry:n}){let i=await ts(),o={...t,...i};return Ve({url:`${fe}${s||""}`,body:e,headers:o,timeout:r,retry:n})}async function qw(s,e,t,r={},n=void 0){let i=await ts(),o={...r,...i};return await $s(`${fe}${s||""}`,e,t,o,n)}async function ln(s,e){let t=await ts();return await vc(`${fe}${s||""}`,e,t)}async function zw(s,e){let t=await ts();return await js(`${fe}${s||""}`,e,t)}async function Kw(s,e){let t=await ts();return await Ws(`${fe}${s||""}`,e||void 0,t)}async function Se(s,e,t,r){let n=await ts();return await be(`${fe}${s||""}`,e||void 0,n,r,t)}function un(s,e){return(0,X.default)(()=>Se(`/storage${s}`,null,{isBinary:!0},e),{retries:ee,factor:1})}function al(s){return(0,X.default)(()=>Kw(`/storage${s}`))}async function Jw(s,e){let t=n=>n==null?[]:typeof n=="string"&&JSON.parse(n)||n;return(await(0,X.default)(()=>Se("/testPlan",{projectId:s,name:e.join(",")}),{retries:ee,factor:1})).map(({testConfigIds:n,beforeAllLabels:i,testLabels:o,afterAllLabels:a,...l})=>Object.assign(l,{testConfigIds:t(n),beforeAllLabels:t(i),testLabels:t(o),afterAllLabels:t(a)}))}async function cl({branch:s,projectId:e}){let t=await(0,X.default)(()=>Se(`/branch/branchData/${s}`,{projectId:e}),{retries:ee,factor:1});return t==null?void 0:t.sfdcCredential}function ll({testId:s,branch:e,projectId:t,skipSharedSteps:r=!1,useBranchMap:n=!0}){return(0,X.default)(()=>Se(`/test/${s}`,{projectId:t,branch:e,skipSharedSteps:r,useBranchMap:n}),{retries:ee,factor:1})}function ul(s,e,t){return(0,X.default)(()=>Re({url:"/testPlan/result",body:{projectId:s,testPlanId:e,result:t}}),{retries:ee,factor:1})}function vr(s,e,t,r,n,i,o=ee){return(0,X.default)(()=>ln("/result/run/test",{runId:e,testId:t,resultId:r,status:n,projectId:s,runnerVersion:Gw,...i}),{retries:o,factor:1})}function pl(s,e,t,r,n,i,o,a){return(0,X.default)(()=>ln("/result/run/tests",{runId:s,runnerStatuses:e,status:t,reason:r,success:n,startTime:i,endTime:o,projectId:a}),{retries:ee,factor:1})}async function dl({executionId:s,projectId:e,labels:t,startTime:r,executions:n,config:i,resultLabels:o,remoteRunId:a,localRunUserId:l,isLocalRun:c,intersections:d}){let{isCi:m}=await Promise.resolve().then(()=>(Hi(),Gm));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:d,metadata:{isCiRun:m,localRunUserId:l,isLocalRun:c}},retry:3})}function qi(s,e,t,r,n={},i=void 0,o=void 0){let a=Date.now();return(0,X.default)(()=>ln("/result/run",{runId:e,projectId:t,endTime:a,status:s,success:r,tmsOptions:n,remoteRunId:i,resultExtraData:o}),{retries:ee,factor:1})}async function ml(s,e,t,r,n){return(0,X.default)(()=>Re({url:"/testPlan/list",body:{projectId:s,names:e,planIds:t,branch:r,intersections:n},timeout:12e4}),{retries:ee,factor:1})}function fl({projectId:s,labels:e,testIds:t,testNames:r,testConfigNames:n,suiteNames:i,suiteIds:o,branch:a,rerunFailedByRunId:l,testConfigIds:c,intersections:d}){return(0,X.default)(()=>Re({url:"/suite/v2/list",body:{projectId:s,labels:e,testIds:t,testNames:r,testConfigNames:n,suiteNames:i,suiteIds:o,branch:a,rerunFailedByRunId:l,testConfigIds:c,intersections:d}}),{retries:ee,factor:1})}async function pn({appId:s,projectId:e}){try{return await(0,X.default)(()=>Se(`/mobile-app/app/${s}?projectId=${e}`),{retries:ee,factor:1})}catch(t){throw new Error(`Could not load app with the ID ${s}`,{cause:t})}}async function gl(s){try{return await(0,X.default)(()=>Se(`/plan/project/${s}/usage-current-billing-period`),{retries:ee,factor:1})}catch(e){jt.error("failed getting usage for current billing period",{projectId:s,error:e});return}}function hl(s,e,t){return(0,X.default)(()=>Se(`/result/${s}/isComplete`,{projectId:e,testRetryKey:t}),{retries:ee,factor:1})}function Sr(s,e,t,r){return(0,X.default)(()=>Se(`/test/v2/${s}/result/${e}`,{projectId:t,branch:r}),{retries:ee,factor:1})}function yl(s,e){return Re({url:`/grid/keep-alive?reqId=${se()}`,body:{projectId:s,slots:e},timeout:1e4})}function bl(s,e,t,r,n){return Re({url:`/grid/release?reqId=${se()}`,body:{companyId:s,projectId:e,slotId:t,gridId:r,browser:n}})}function Tl(s){return Re({url:"/grid/hybrid/provider",body:s})}function wl(s,e,t,r,n){return(0,X.default)(()=>Se("/grid/name",{companyId:s,projectId:e,name:t,browser:r,executionId:n,reqId:se()}),{retries:ee,factor:1})}function zi(s,e,t,r,n){return(0,X.default)(()=>Se(`/grid/${t}`,{companyId:s,projectId:e,browser:r,executionId:n,reqId:se()}),{retries:ee,factor:1})}async function vl({projectId:s,token:e,branchName:t,lightweightMode:r,localGrid:n,publicIp:i,gridId:o,grid:a}){var l,c;try{return await(0,X.default)(()=>Ve({url:`${fe}/executions/initialize`,body:{projectId:s,token:e,branchName:t||"master",lightweightMode:r,localGrid:n,publicIp:i,gridId:o,gridName:a}}),{retries:ee,factor:1})}catch(d){throw jt.error("error initializing info from server",d),(l=d==null?void 0:d.message)!=null&&l.includes("Bad Request")?new A("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."):(c=d==null?void 0:d.code)!=null&&c.includes("ENOTFOUND")?new A("Due to network connectivity issues, Testim CLI has been unable to connect to the Testim backend."):d}}async function Yw(){if(Ls)return{editorUrl:Ls};try{return await(0,X.default)(()=>Se("/system-info/editor-url"),{retries:ee,onFailedAttempt:s=>{if(s.attemptNumber>=ee)throw s},factor:1})}catch{return jt.error("cannot retrieve editor-url from server"),{editorUrl:"https://app.testim.io"}}}function Sl(s){return(0,X.default)(()=>Se("/grid",{companyId:s}),{retries:ee,factor:1})}function Rl(s,e,t){return(0,X.default)(()=>Se(`/real-data/${e}?${t}&projectId=${s}`),{retries:ee,factor:1})}function Ki(s,e,t,r,n){return(0,X.default)(()=>Re({url:"/result/test",body:{projectId:s,resultId:e,testId:t,testResult:r,remoteRunId:n}}),{retries:ee,factor:1})}function Al(s,e,t,r){return(0,X.default)(()=>Re({url:"/result/test/clear",body:{projectId:s,resultId:e,testId:t,testResult:r}}),{retries:ee,factor:1})}function xl(s,e,t,r){return(0,X.default)(()=>Re({url:"/remoteStep",body:{projectId:s,resultId:e,stepId:t,remoteStep:r}}),{retries:ee,factor:1})}function Xw(s){return s.startsWith("/")?s:`/${s}`}function Qw(s,e,t){let r=Xw(s);return t&&(r=`/${t}${r}`),e&&(r=`/${e}${r}`),r}async function qm(s,e,t,r,n,i="application/octet-stream"){let o=null;i==="application/json"&&(o=".json");let a=`${n}_${se()}${o||""}`,l=`${e}/${t}/${a}`,c=Qw(l,"test-result-artifacts",s),d=Buffer.from(Hm.gzip(r,{level:3})),m={file:{fileName:a,buffer:d}};return await(0,X.default)(()=>qw(`/storage${c}`,{},m,{"X-Asset-Encoding":"gzip"}),{retries:ee,factor:1}),c}function Pl({projectId:s,runId:e,testId:t,newResultId:r,originalTestResultId:n,previousTestResultId:i,testResult:o}){return(0,X.default)(()=>Re({url:"/result/test/retry",body:{projectId:s,newResultId:r,originalTestResultId:n,previousTestResultId:i,testId:t,runId:e,testResult:o}}),{retries:ee,factor:1})}async function kl(s){try{return await Se(`/integration/applitools/v3/connected?projectId=${s}`)}catch(e){return jt.warn("could'nt get applitools integration data.",{err:e}),{}}}async function _l(s,e){try{return await ln("/tunnel",{companyId:s,routes:e})}catch(t){return jt.warn("could'nt get tunnel.",{err:t}),{}}}async function Ol(s,e){try{return await Re({url:`/tunnel/${e}`,body:{companyId:s}})}catch(t){jt.warn("could'nt get tunnel.",{err:t});return}}async function Ll(s,e){try{return await zw(`/tunnel/${e}`,{companyId:s})}catch(t){jt.warn("could'nt get tunnel.",{err:t});return}}function Dl(s){return Ve({url:`${fe}/result/remoteRunFailure`,body:s})}async function Ml({projectId:s,projectType:e,gridId:t,companyId:r,selectors:n}){let i=`${Hw}/mobileDevices/${t}/${r}?projectType=${e}`;i=n?`${i}&selectors=${encodeURIComponent(n)}`:i;try{return await(0,X.default)(()=>Se(i,{projectId:s}),{retries:ee,factor:1})}catch(o){return jt.warn("could'nt get devices from headspin grid.",{err:o}),null}}async function Nl({projectId:s,gridId:e,app:t,timeout:r}){return(0,X.default)(()=>Re({url:`/mobile-app/app/upload-to-grid?projectId=${s}&gridId=${e}`,body:t,timeout:r}),{retries:ee,factor:1})}async function Ul(s){return(0,X.default)(()=>Re({url:"/mobile-app/app/fix-grid-app-id",body:s}),{retries:ee,factor:1})}async function Fl(s,e){return(0,X.default)(()=>Re({url:"/slot-management/request-slot",body:{companyId:s,projectId:e}}),{retries:ee,factor:1})}async function Bl(s,e,t){return(0,X.default)(()=>Re({url:"/slot-management/release-slot",body:{companyId:s,projectId:e,slotId:t}}),{retries:ee,factor:1})}async function jl(s,e,t){return(0,X.default)(()=>ln("/slot-management/update-slot",{slotId:t.slotId,companyId:s,projectId:e,slot:t}),{retries:ee,factor:1})}function $l(s,e,t){return Re({url:`/slot-management/keep-alive?reqId=${se()}`,body:{slots:t,companyId:s,projectId:e},timeout:1e4})}async function Zw(s,e){return await be(`${Ms}/sessions/${s}`,void 0,{Authorization:`Basic ${Buffer.from(`${e.user}:${e.key}`).toString("base64")}`})}async function il(s){try{return await Se("/v2/project/validateUserAccessKey",s),!0}catch(e){return jt.error("error validating user access key",{error:e}),!1}}var Zt,Hm,X,ol,Gw,jt,ee,Hw,El,Il,Cl,Ji,he=w(()=>{"use strict";Zt=S(require("lodash")),Hm=S(require("pako"));F();pe();ne();Ge();it();X=S(require("p-retry")),ol=S(require("object-hash"));J();W();Gw=dt(),jt=C("testim service api"),ee=3,Hw="/grid";El=async()=>(0,X.default)(()=>Se("/grid/lt/config"),{retries:ee,factor:1}),Il=async s=>(0,X.default)(()=>Se(`/labFeature/v2/project/${s}`),{retries:ee,factor:1});Cl=Zt.memoize(async(s,e,t,r)=>{if(!Zt.isEmpty(r))return await qm(s,e,t,JSON.stringify(r),"test-run-data","application/json")},(s,e,t,r)=>`${(0,ol.default)(r)}:${e}:${t}`),Ji=Zt.memoize(async(s,e,t,r,n)=>!r||Zt.isEmpty(r)?void 0:await qm(s,e,t,JSON.stringify((()=>{let o=Zt.clone(r);if(n!=null&&n.hiddenParams){let{hiddenParams:a}=n;(a||[]).forEach(l=>{o[l]&&Object.assign(o,{[l]:Pc.HIDDEN_PARAM})})}return o})()),"test-test-data","application/json"),(s,e,t,r)=>`${(0,ol.default)(r)}:${e}:${t}`)});async function zm(){let s=await Promise.any(ev.map(async e=>{try{return await be(e)}catch{return null}}));return s==null?void 0:s.ip}var ev,Km=w(()=>{"use strict";Ge();ev=["https://api.ipify.org?format=json","https://ipinfo.io/json","https://api.my-ip.io/ip.json"]});var er={};H(er,{getSessionPlayer:()=>Q,options:()=>Vl});var Yi,Vl,Wl,Q,Te=w(()=>{"use strict";Yi=require("path");W();Vl={playerPath:void 0},Q=()=>{if(Wl)return Wl;let s=(We(),Ue($e));s.log("getSessionPlayerRequire start");let{getSessionPlayerFolder:e}=(tn(),Ue(en)),t=e(),r=Vl.playerPath?(0,Yi.resolve)(Vl.playerPath,"src/background/sessionPlayerInit.ts"):(0,Yi.join)(t,"sessionPlayer.js"),n=require(r);return s.log("getSessionPlayerRequire end"),Wl=n,process.env.LOGGER_CONSOLE&&process.env.DEBUG&&n.setLoggerFormatter&&n.setLoggerFormatter(uc),n}});function sv(s){q.EXTENSION!==s&&process.nextTick(()=>{try{(Te(),Ue(er)).getSessionPlayer()}catch{}})}async function dn(s){let{project:e,token:t,userAccessKey:r,lightweightMode:n,useLocalChromeDriver:i,useChromeLauncher:o,mode:a,gridId:l,grid:c}=s,d=Boolean(n==null?void 0:n.general),m=Boolean(i||o),u=d?rv:tv,g=null;if(O.flags.getPublicIpFrom3rdPartyServices.isEnabled()&&!m)try{g=await zm()}catch(y){Jm.error("failed to get public ip",y)}let h=!0;U("before initializeUserWithAuth");let f=await ht(async()=>(sv(a),h=!1,await vl({projectId:e,token:t,branchName:s.branch,lightweightMode:n,localGrid:m,publicIp:g,gridId:l,grid:c})),"initializeUserWithAuth",u,{project:e,token:t,branchName:s.branch,lightweightModeGeneral:d,localGrid:m,gridId:l,grid:c,publicIp:g})();return s.publicIps=[f.clientPublicIp],U("after initializeUserWithAuth"),g&&f.clientPublicIp&&f.clientPublicIp!==g&&(Jm.error("public ip mismatch",{publicIpFromExternalService:g,publicIpFromServices:f.clientPublicIp}),s.publicIps.push(g)),Vm(f.authData,{projectId:e,token:t,userAccessKey:r,publicIp:f.clientPublicIp,initializedFromCache:h}),f}var Jm,tv,rv,Ym=w(()=>{"use strict";We();he();Bt();it();Km();ne();W();le();Jm=C("initializeUserWithAuth"),tv=1e3*60*5,rv=1e3*60*60*10});async function Zm(s){var r;let e=Promise.resolve();s.useLocalChromeDriver&&(s.chromeBinaryLocation=s.downloadBrowser?await ji():s.chromeBinaryLocation,e=Zs({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!==q.EXTENSION&&await br(s.playerLocation,s.canary),s.mode!==q.SELENIUM&&s.mode!==q.APPIUM&&!s.ext&&await Jc(s.extensionLocation);let t;if(s.installCustomExtension){let n=Boolean(s.useLocalChromeDriver||s.useChromeLauncher);t=await Kc(s.installCustomExtension,n)}return await e,t}async function ef(s){var o;nv.info("prepare MockNetwork",{location:s});let e=await Rc(s),t=Buffer.isBuffer(e)?e:e.body;if(t.byteLength>Xm*1e6)throw new Error(`${Gl} exceeded ${Xm}MB`);let r;try{r=JSON.parse(t.toString("utf-8"))}catch(a){throw new Error(`${Gl} cannot be parsed.${Xi.EOL}${a}`)}let n=new Qm.default;if(!n.validate(Fc,r)){let a=(o=n.errors)==null?void 0:o.map((l,c)=>`${++c}) ${l.dataPath} ${l.message}`).join(Xi.EOL);throw new Error(`${Gl} is malformed.${Xi.EOL}${a}`)}return r.entries}var Xi,Qm,Xm,Gl,nv,Hl=w(()=>{"use strict";Xi=S(require("os"));F();sm();tn();Qm=S(require("ajv"));ne();Zc();Ym();Xm=1,Gl="JSON file supplied to --mock-network-pattern",nv=(W(),Ue(fc)).getLogger("prepare runner")});function rf(s,e=process){async function t(r){await oe(ae(tf,async n=>n()),1e4).catch(()=>null),s(r)}e.on("uncaughtException",async r=>{mn.error("Caught exception",{err:r}),console.log("Uncaught exception"),r.message&&console.log("Message =",r.message),r.reason&&console.log("Reason =",r.reason),await t(r)}),e.on("unhandledRejection",r=>{var n;if(mn.fatal("Caught unhandled promise rejection",r),!((n=r==null?void 0:r.message)!=null&&n.includes("ENOTFOUND x-api.rollout.io")))throw r}),e.on("rejectionHandled",()=>{mn.error("Caught rejection handled")}),e.once("SIGTERM",()=>{let r="Runner aborted - SIGTERM event",n=new Error(r);throw mn.error(r),t(n),n}),e.once("SIGINT",()=>{let r="Runner aborted - SIGINT event",n=new Error(r);throw mn.error(r),t(n),n}),e.once("exit",r=>{s(r)})}function rs(s){tf.push(s)}var mn,tf,fn=w(()=>{"use strict";W();F();mn=C("process-handler"),tf=[]});function Jl(s,e){var i;let t=s.canary?"-master.zip":".zip",r=`${e?Td:Ds}/extension/testim-headless${t}`,n=O.flags.testimHeadlessExtensionDownloadUrl.getValue({companyId:(i=s.company)==null?void 0:i.companyId,projectId:s.project});return n&&(r=n,s.testimHeadlessExtensionDownloadUrl=n),{chrome:r,"edge-chromium":r}}function cf(s){let{chrome:e}=Jl(s,!1);return e}function Zi(s){let e=`${Ds}/extension/sessionPlayer`;return s.canary?`${e}-master`:e}var gn=w(()=>{"use strict";pe();le()});function mf(s){Oe||(s!=null&&s.userId||(s={anonymousId:df}),pf.identify(s))}function yt(s,e){return hn("ci",s,e)}function hn(s,e,t){if(Oe)return;let r=s?{userId:s}:{anonymousId:df};pf.track(Object.assign(r,{event:e,properties:t}))}var uf,pf,df,ss=w(()=>{"use strict";pe();uf=require("@segment/analytics-node"),pf=new uf.Analytics({writeKey:"sJOSIGKa5x5rJEGsaOlCjrgozAf7FnVY",flushAt:1}),df=require("crypto").randomBytes(20).toString("hex")});function ff(s){return s.start&&hn(null,"cli-start-command",{downloadBrowser:Boolean(s.downloadBrowser)}),!!(s.startV2||s.start||s.agent)}async function gf(s){let e=!!s.start;if(Number.isNaN(s.agentPort))throw new A("Agent port is not number");let t=Zi(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 hf=w(()=>{"use strict";gn();ss();J()});var yf,pv,dv,Yl,bf=w(()=>{"use strict";yf="TST_CREDS",pv=["username","password"],dv="$encrypted",Yl={get proxyPlaceholder(){return new Proxy({},{get(s,e){let t={};for(let r of pv)t[r]={[dv]:`${e}.${r}`};return t}})},containsEncryptedCredentials(s){return s.includes(yf)},injectProxyCredentialsStoreToGlobal(){Object.assign(globalThis,{[yf]:this.proxyPlaceholder})}}});async function wf(s,e){var t;return(t=s.lightweightMode)!=null&&t.onlyTestIdsNoSuite&&s.testId?{tests:[s.testId.map(n=>({testId:n,testConfig:{},resultId:se()}))]}:await fl({projectId:s.project,labels:s.label,testIds:s.testId,testNames:s.name,testConfigNames:s.testConfigNames,suiteNames:s.suites,suiteIds:s.suiteIds,branch:e,rerunFailedByRunId:s.rerunFailedByRunId,testConfigIds:s.testConfigIds,intersections:s.intersections})}function Xl(s){let e=Object.keys(s).length,t=Object.keys(s).reduce((r,n)=>r+(s[n].success===!0?1:0),0);return e===t}async function Ql(s,e){let t=s.mode===q.EXTENSION?Er:bn,r=Tf.difference(Hs(s,e),t);if(r.length>0)throw yt("invalid-config-run",{browser:r.join(", "),mode:"runner"}),new A(`browser type <${r}> is not supported in ${s.mode} mode.`);return e}var Tf,Er,bn,eo=w(()=>{"use strict";Tf=S(require("lodash"));F();ss();he();J();ne();Er=["edge-chromium","chrome"],bn=[...Er,"firefox","safari","safari technology preview"]});function ro(s){let{platform:e}=process;e==="win32"?(0,to.exec)(`start chrome ${s}`):e==="darwin"?(0,to.exec)(`open -a "Google Chrome" ${s}`):e==="linux"&&(0,to.exec)(`google-chrome ${s}`)}var to,Zl=w(()=>{"use strict";to=require("child_process")});var nu={};H(nu,{doLogin:()=>su,getProjectId:()=>mv,getToken:()=>fv});async function mv(){return Ef("projectId")}async function fv(){return Ef("token")}function Sf(s,e){return Promise.race([s,ce(e).then(()=>{throw new ie("timeout")})])}async function gv(){let s=(await import("express")).default(),e=async function(){return Sf(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(()=>(he(),Ae)),{editorUrl:n}=await r();ro(`${n}/#/new-test`)}catch{console.log("Unable to open Testim automatically - please manually go to https://app.testim.io")}return await e}async function su({overwriteExisting:s=!0,projects:e=null}={}){let t=eu.homedir(),r=tu.join(t,".testim");if(await ge(r)&&!s)return;let i={},[{default:o},{default:a}]=await Promise.all([import("prompts"),import("ora")]),l=a("Getting credentials from Tricentis Testim extension ...").start();if(e||(e=await Sf(gv(),62e3).catch(()=>null)),e!=null&&e.token){i.token=e.token,i.projectId=e.projectId,l.succeed(),await vf(r,i);return}if(e!=null&&e.length){l.succeed();let c=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(d=>({title:d.name,value:d}))});i.token=c.project.ci.token,i.projectId=c.project.id,await vf(r,i);return}l.fail(),console.log("Error getting credentials - please pass `--token` and `--project` to the CLI or try again")}async function vf(s,e){await ru.promises.writeFile(s,so.stringify(e)),console.log(`Testim credentials saved in '${s}'`)}async function Ef(s){let e=eu.homedir(),t=tu.join(e,".testim"),r=await ge(t),n={};if(r)try{n=so.parse((await ru.promises.readFile(t)).toString())}catch{}return n||={},n[s]}var eu,tu,so,ru,no=w(()=>{"use strict";eu=S(require("os")),tu=S(require("path")),so=S(require("yaml"));F();ru=require("fs");J();Zl()});var _f={};H(_f,{process:()=>Ev});var ou,xf,io,Cf,$t,Ne,Pf,hv,Me,lu,yv,bv,Rf,kf,Tv,au,cu,uu,iu,Ct,wv,p,vv,Sv,Af,Ev,Of=w(()=>{"use strict";ou=S(require("ms")),xf=S(require("chalk")),io=S(require("fs")),Cf=S(require("url")),$t=S(require("lodash")),Ne=S(require("path"));F();gn();hf();Bt();Pf=require("commander");ne();J();Fr();F();le();bf();eo();hv=s=>s.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),Me=(s,e)=>(e.push(s),e),lu=new Pf.Command,yv=s=>s.split(","),bv=(s,e)=>!s||s.length===0?e:s,Rf=["enable-heavy-ad-intervention","heavy-ad-privacy-mitigations","use-fake-device-for-media-stream","use-fake-ui-for-media-stream","proxy-server"],kf=()=>{function s(f){return f.includes("-h, --help")}function e(f){return f.includes("--params [params-json-string]")}function t(f){return f.includes("--ext")||f.includes("--extension-path")||f.includes("--headless-extension-download-path")}function r(f){return f.includes("--player-path")||f.includes("--player-require-path")}function n(f){return f.includes("--executionId")||f.includes("--source")||f.includes("--resultId")||f.includes("--remoteRunId")||f.includes("--schedulerId")}function i(f){return f.includes("--get-browser-timeout")||f.includes("--get-browser-retries")||f.includes("--get-session-timeout")||f.includes("--get-session-retries")||f.includes("--driver-request-timeout")||f.includes("--driver-request-retries")}function o(f){return f.includes("--user")}function a(f){return f.includes("shouldMonitorPerformance")}function l(f){return f.includes("--save-rca-locally")}function c(f){return f.includes("--exit-code-ignore-failing-tests")}function d(f){return f.includes("--high-speed")}function m(f){return f.includes("--urls")}function u(f){return f.includes("--test-start-timeout")}function g(f){return f.includes("--install-lazy-deps")}function h(f){return f.includes("--print-final-caps")||f.includes("--print-grids")}lu.help(f=>f.split(`
|
|
16
|
+
4. You can always use a standalone Selenium grid and providing it's details with the --host and --port flags (see https://www.npmjs.com/package/selenium-standalone)`)),n.fail(a),o}}async function Uw(){let s=`${Ds}/extension/sessionPlayer_LATEST_RELEASE`;return(await Nt(s)).body.toString("utf8")}async function Fw(s,e){if(!_e(s)||_e(s)&&e||Oe)return s;let t=await Uw();return`${s}-${t}`}function Yc(){let s=ft();return Zr.resolve(s,"testim-bin")}function Bw(){let s=Yc();return Zr.resolve(s,"sessionPlayer.zip")}async function Fm(s,e,t=!1){try{return await Ti(s,e),await st(e,Yc())}catch(r){if(t)throw r;return await Fm(s,e,!0)}}async function br(s,e){Fi.info("prepare player",{location:s,canary:e});let t=Bw();return ht(async()=>{let r=await Fw(s,e);return await Fm(r,t),{}},"preparePlayer",Um,[s,e,t])()}var Dm,Mm,Zr,Nm,Fi,Um,zc,Lm,tn=w(()=>{"use strict";Dm=S(require("ms")),Mm=S(require("fs")),Zr=S(require("path"));pe();Bt();Nm=require("serialize-error");W();jc();J();F();Fi=C("prepare runner and testim start"),Um=(0,Dm.default)("0.5 day"),zc=16,Lm=`The size of the custom extension is more than ${zc}MB`});function jw(){let s=rn.type().toLowerCase();return s==="darwin"?rn.arch()==="arm"?"mac_arm":"mac":s==="windows_nt"?rn.arch()==="x64"?"win64":"win32":"linux"}async function ji(){let s=jw(),e="https://storage.googleapis.com/chromium-browser-snapshots",t={linux:"Linux_x64",mac:"Mac",mac_arm:"Mac_Arm",win32:"Win",win64:"Win_x64"};if(!(s in t))throw new A(`Unsupported platform: ${s}`);let r=parseInt(sn,10)>591479?"chrome-win":"chrome-win32",n={linux:"chrome-linux",mac:"chrome-mac",mac_arm:"chrome-mac",win32:r,win64:r},i={linux:"chrome",mac:"Chromium.app/Contents/MacOS/Chromium",mac_arm:"Chromium.app/Contents/MacOS/Chromium",win32:"chrome.exe",win64:"chrome.exe"},o=`${e}/${t[s]}/${sn}/${n[s]}.zip`,a=Bi.join(Xc,n[s]),l=`${a}.zip`,c=Bi.join(a,i[s]);if(await ge(c))return c;if(!await ge(l)){let m=(0,Qc.default)("Downloading Chromium").start();try{await Bm.promises.mkdir(Xc),await Je(o,l)}catch(u){let g=`Failed to download Chromium: ${u.message}`;throw m.fail(g),new Error(g)}m.succeed()}let d=(0,Qc.default)("Extracting Chromium").start();try{await st(l,Xc)}catch(m){let u=`Failed to extract Chromium: ${m.message}`;throw d.fail(u),new Error(u)}return d.succeed(),c}var Bm,rn,Bi,Qc,sn,Xc,Zc=w(()=>{"use strict";Bm=S(require("fs")),rn=S(require("os")),Bi=S(require("path")),Qc=S(require("ora"));J();F();sn="1000968",Xc=Bi.join(Ft,`chrome-${sn}`)});async function Wm(s,e){return Tr=s,sl=e,await el()}function Vm(s,e){Tr=e.projectId,sl=e.token,nn=e.userAccessKey,nt=s.token,an=nl(nt),cn=s.refreshToken,tl=s.ngrokToken,rl=s.isNgrokWhitelisted,jm=e.publicIp,$m=e.initializedFromCache}function Ww(s=Tr,e=sl){return ht(()=>(on.info("request to get cli token from server"),Ve({url:`${fe}/auth/token`,body:{projectId:s,token:e}})),"getTokenV3",$w*10,{projectId:s,token:e})()}async function Vw(){on.info("request to refresh JWT cli token from server");let s=await Ve({url:`${fe}/auth/refreshToken`,body:{token:nt,refreshToken:cn}});return nt=s.token,an=nl(nt),s.refreshToken&&(cn=s.refreshToken),nt}async function el(){try{let s=await Ww();return on.info("successfully get cli token from server"),nt=s.token,an=nl(nt),cn=s.refreshToken,tl=s.ngrokToken,rl=s.isNgrokWhitelisted,nt}catch(s){throw s.message.includes("Unauthorized")?new A("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."):(on.error(`While trying to retrieve CLI token. caught error: ${s}`,{projectId:Tr}),new A(`While trying to retrieve CLI token, caught error: ${s}`))}}function nl(s){return require("jsonwebtoken").decode(s).exp*1e3}async function xt(){if(!an)return el();let s=O.flags.accessTokenExpiryMargin.getValue();if(an<Date.now()+4*s)try{return await Vw()}catch(e){return on.error("failed to refresh token, executing fallback",e),el()}return nt}function $i(){return cn}function wr(){return nt?{uid:require("jsonwebtoken").decode(nt).id,ngrokToken:tl,isNgrokWhitelisted:rl}:{}}async function Wi(){if(!nn||!Tr)return;if(await il({userAccessKey:nn,projectId:Tr}))return nn;let e=`user access key "${nn}" is invalid for project "${Tr}"`;throw new A(e)}function Vi(){return jm}function Gi(){return $m}var on,nt,an,cn,tl,rl,Tr,sl,nn,jm,$m,$w,it=w(()=>{"use strict";pe();Ge();Bt();J();W();he();le();on=C("testim-custom-token"),Tr=null,sl=null,$w=5*60*1e3});var Gm={};H(Gm,{isCi:()=>es});var es,Hi=w(()=>{"use strict";es=Boolean(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.BUILD_NUMBER||process.env.RUN_ID||!1)});var Ae={};H(Ae,{addTestRetry:()=>Pl,clearTestResult:()=>Al,deleteCloudflareTunnel:()=>Ll,fetchLambdatestConfig:()=>El,fixGridAppIDStructure:()=>Ul,forceUpdateCloudflareTunnelRoutes:()=>Ol,getAllGrids:()=>Sl,getAppDetails:()=>pn,getApplitoolsIntegrationData:()=>kl,getBrowserStackSessionMetaData:()=>Zw,getCloudflareTunnel:()=>_l,getEditorUrl:()=>Yw,getGridById:()=>zi,getGridByName:()=>wl,getHybridGridProvider:()=>Tl,getLabFeaturesByProjectId:()=>Il,getMobileDevicesFromGrid:()=>Ml,getRealData:()=>Rl,getS3Artifact:()=>un,getS3ArtifactText:()=>al,getSuiteTestList:()=>fl,getTestPlan:()=>Jw,getTestPlanTestList:()=>ml,getTestResults:()=>Sr,getUsageForCurrentBillingPeriod:()=>gl,initializeUserWithAuth:()=>vl,isTestResultCompleted:()=>hl,keepAliveCompanySlots:()=>$l,keepAliveGrid:()=>yl,loadSfdcCredential:()=>cl,loadTest:()=>ll,releaseCompanySlot:()=>Bl,releaseGridSlot:()=>bl,reportExecutionFinished:()=>qi,reportExecutionStarted:()=>dl,requestCompanySlot:()=>Fl,saveRemoteStep:()=>xl,saveTestPlanResult:()=>ul,updateCompanySlot:()=>jl,updateExecutionTests:()=>pl,updateRemoteRunFailure:()=>Dl,updateTestDataArtifact:()=>Ji,updateTestResult:()=>Ki,updateTestStatus:()=>vr,uploadAppToGrid:()=>Nl,uploadRunDataArtifact:()=>Cl,validateUserAccessKey:()=>il});async function ts(){let s=await xt();if(!s)throw new Error("Failed to get token from server");return{Authorization:`Bearer ${s}`}}async function Re({url:s,body:e,headers:t={},timeout:r,retry:n}){let i=await ts(),o={...t,...i};return Ve({url:`${fe}${s||""}`,body:e,headers:o,timeout:r,retry:n})}async function qw(s,e,t,r={},n=void 0){let i=await ts(),o={...r,...i};return await $s(`${fe}${s||""}`,e,t,o,n)}async function ln(s,e){let t=await ts();return await vc(`${fe}${s||""}`,e,t)}async function zw(s,e){let t=await ts();return await js(`${fe}${s||""}`,e,t)}async function Kw(s,e){let t=await ts();return await Ws(`${fe}${s||""}`,e||void 0,t)}async function Se(s,e,t,r){let n=await ts();return await be(`${fe}${s||""}`,e||void 0,n,r,t)}function un(s,e){return(0,X.default)(()=>Se(`/storage${s}`,null,{isBinary:!0},e),{retries:ee,factor:1})}function al(s){return(0,X.default)(()=>Kw(`/storage${s}`))}async function Jw(s,e){let t=n=>n==null?[]:typeof n=="string"&&JSON.parse(n)||n;return(await(0,X.default)(()=>Se("/testPlan",{projectId:s,name:e.join(",")}),{retries:ee,factor:1})).map(({testConfigIds:n,beforeAllLabels:i,testLabels:o,afterAllLabels:a,...l})=>Object.assign(l,{testConfigIds:t(n),beforeAllLabels:t(i),testLabels:t(o),afterAllLabels:t(a)}))}async function cl({branch:s,projectId:e}){let t=await(0,X.default)(()=>Se(`/branch/branchData/${s}`,{projectId:e}),{retries:ee,factor:1});return t==null?void 0:t.sfdcCredential}function ll({testId:s,branch:e,projectId:t,skipSharedSteps:r=!1,useBranchMap:n=!0}){return(0,X.default)(()=>Se(`/test/${s}`,{projectId:t,branch:e,skipSharedSteps:r,useBranchMap:n}),{retries:ee,factor:1})}function ul(s,e,t){return(0,X.default)(()=>Re({url:"/testPlan/result",body:{projectId:s,testPlanId:e,result:t}}),{retries:ee,factor:1})}function vr(s,e,t,r,n,i,o=ee){return(0,X.default)(()=>ln("/result/run/test",{runId:e,testId:t,resultId:r,status:n,projectId:s,runnerVersion:Gw,...i}),{retries:o,factor:1})}function pl(s,e,t,r,n,i,o,a){return(0,X.default)(()=>ln("/result/run/tests",{runId:s,runnerStatuses:e,status:t,reason:r,success:n,startTime:i,endTime:o,projectId:a}),{retries:ee,factor:1})}async function dl({executionId:s,projectId:e,labels:t,startTime:r,executions:n,config:i,resultLabels:o,remoteRunId:a,localRunUserId:l,isLocalRun:c,intersections:d}){let{isCi:m}=await Promise.resolve().then(()=>(Hi(),Gm));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:d,metadata:{isCiRun:m,localRunUserId:l,isLocalRun:c}},retry:3})}function qi(s,e,t,r,n={},i=void 0,o=void 0){let a=Date.now();return(0,X.default)(()=>ln("/result/run",{runId:e,projectId:t,endTime:a,status:s,success:r,tmsOptions:n,remoteRunId:i,resultExtraData:o}),{retries:ee,factor:1})}async function ml(s,e,t,r,n){return(0,X.default)(()=>Re({url:"/testPlan/list",body:{projectId:s,names:e,planIds:t,branch:r,intersections:n},timeout:12e4}),{retries:ee,factor:1})}function fl({projectId:s,labels:e,testIds:t,testNames:r,testConfigNames:n,suiteNames:i,suiteIds:o,branch:a,rerunFailedByRunId:l,testConfigIds:c,intersections:d}){return(0,X.default)(()=>Re({url:"/suite/v2/list",body:{projectId:s,labels:e,testIds:t,testNames:r,testConfigNames:n,suiteNames:i,suiteIds:o,branch:a,rerunFailedByRunId:l,testConfigIds:c,intersections:d}}),{retries:ee,factor:1})}async function pn({appId:s,projectId:e}){try{return await(0,X.default)(()=>Se(`/mobile-app/app/${s}?projectId=${e}`),{retries:ee,factor:1})}catch(t){throw new Error(`Could not load app with the ID ${s}`,{cause:t})}}async function gl(s){try{return await(0,X.default)(()=>Se(`/plan/project/${s}/usage-current-billing-period`),{retries:ee,factor:1})}catch(e){jt.error("failed getting usage for current billing period",{projectId:s,error:e});return}}function hl(s,e,t){return(0,X.default)(()=>Se(`/result/${s}/isComplete`,{projectId:e,testRetryKey:t}),{retries:ee,factor:1})}function Sr(s,e,t,r){return(0,X.default)(()=>Se(`/test/v2/${s}/result/${e}`,{projectId:t,branch:r}),{retries:ee,factor:1})}function yl(s,e){return Re({url:`/grid/keep-alive?reqId=${se()}`,body:{projectId:s,slots:e},timeout:1e4})}function bl(s,e,t,r,n){return Re({url:`/grid/release?reqId=${se()}`,body:{companyId:s,projectId:e,slotId:t,gridId:r,browser:n}})}function Tl(s){return Re({url:"/grid/hybrid/provider",body:s})}function wl(s,e,t,r,n){return(0,X.default)(()=>Se("/grid/name",{companyId:s,projectId:e,name:t,browser:r,executionId:n,reqId:se()}),{retries:ee,factor:1})}function zi(s,e,t,r,n){return(0,X.default)(()=>Se(`/grid/${t}`,{companyId:s,projectId:e,browser:r,executionId:n,reqId:se()}),{retries:ee,factor:1})}async function vl({projectId:s,token:e,branchName:t,lightweightMode:r,localGrid:n,publicIp:i,gridId:o,grid:a}){var l,c;try{return await(0,X.default)(()=>Ve({url:`${fe}/executions/initialize`,body:{projectId:s,token:e,branchName:t||"master",lightweightMode:r,localGrid:n,publicIp:i,gridId:o,gridName:a}}),{retries:ee,factor:1})}catch(d){throw jt.error("error initializing info from server",d),(l=d==null?void 0:d.message)!=null&&l.includes("Bad Request")?new A("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."):(c=d==null?void 0:d.code)!=null&&c.includes("ENOTFOUND")?new A("Due to network connectivity issues, Testim CLI has been unable to connect to the Testim backend."):d}}async function Yw(){if(Ls)return{editorUrl:Ls};try{return await(0,X.default)(()=>Se("/system-info/editor-url"),{retries:ee,onFailedAttempt:s=>{if(s.attemptNumber>=ee)throw s},factor:1})}catch{return jt.error("cannot retrieve editor-url from server"),{editorUrl:"https://app.testim.io"}}}function Sl(s){return(0,X.default)(()=>Se("/grid",{companyId:s}),{retries:ee,factor:1})}function Rl(s,e,t){return(0,X.default)(()=>Se(`/real-data/${e}?${t}&projectId=${s}`),{retries:ee,factor:1})}function Ki(s,e,t,r,n){return(0,X.default)(()=>Re({url:"/result/test",body:{projectId:s,resultId:e,testId:t,testResult:r,remoteRunId:n}}),{retries:ee,factor:1})}function Al(s,e,t,r){return(0,X.default)(()=>Re({url:"/result/test/clear",body:{projectId:s,resultId:e,testId:t,testResult:r}}),{retries:ee,factor:1})}function xl(s,e,t,r){return(0,X.default)(()=>Re({url:"/remoteStep",body:{projectId:s,resultId:e,stepId:t,remoteStep:r}}),{retries:ee,factor:1})}function Xw(s){return s.startsWith("/")?s:`/${s}`}function Qw(s,e,t){let r=Xw(s);return t&&(r=`/${t}${r}`),e&&(r=`/${e}${r}`),r}async function qm(s,e,t,r,n,i="application/octet-stream"){let o=null;i==="application/json"&&(o=".json");let a=`${n}_${se()}${o||""}`,l=`${e}/${t}/${a}`,c=Qw(l,"test-result-artifacts",s),d=Buffer.from(Hm.gzip(r,{level:3})),m={file:{fileName:a,buffer:d}};return await(0,X.default)(()=>qw(`/storage${c}`,{},m,{"X-Asset-Encoding":"gzip"}),{retries:ee,factor:1}),c}function Pl({projectId:s,runId:e,testId:t,newResultId:r,originalTestResultId:n,previousTestResultId:i,testResult:o}){return(0,X.default)(()=>Re({url:"/result/test/retry",body:{projectId:s,newResultId:r,originalTestResultId:n,previousTestResultId:i,testId:t,runId:e,testResult:o}}),{retries:ee,factor:1})}async function kl(s){try{return await Se(`/integration/applitools/v3/connected?projectId=${s}`)}catch(e){return jt.warn("could'nt get applitools integration data.",{err:e}),{}}}async function _l(s,e){try{return await ln("/tunnel",{companyId:s,routes:e})}catch(t){return jt.warn("could'nt get tunnel.",{err:t}),{}}}async function Ol(s,e){try{return await Re({url:`/tunnel/${e}`,body:{companyId:s}})}catch(t){jt.warn("could'nt get tunnel.",{err:t});return}}async function Ll(s,e){try{return await zw(`/tunnel/${e}`,{companyId:s})}catch(t){jt.warn("could'nt get tunnel.",{err:t});return}}function Dl(s){return Ve({url:`${fe}/result/remoteRunFailure`,body:s})}async function Ml({projectId:s,projectType:e,gridId:t,companyId:r,selectors:n}){let i=`${Hw}/mobileDevices/${t}/${r}?projectType=${e}`;i=n?`${i}&selectors=${encodeURIComponent(n)}`:i;try{return await(0,X.default)(()=>Se(i,{projectId:s}),{retries:ee,factor:1})}catch(o){return jt.warn("could'nt get devices from headspin grid.",{err:o}),null}}async function Nl({projectId:s,gridId:e,app:t,timeout:r}){return(0,X.default)(()=>Re({url:`/mobile-app/app/upload-to-grid?projectId=${s}&gridId=${e}`,body:t,timeout:r}),{retries:ee,factor:1})}async function Ul(s){return(0,X.default)(()=>Re({url:"/mobile-app/app/fix-grid-app-id",body:s}),{retries:ee,factor:1})}async function Fl(s,e){return(0,X.default)(()=>Re({url:"/slot-management/request-slot",body:{companyId:s,projectId:e}}),{retries:ee,factor:1})}async function Bl(s,e,t){return(0,X.default)(()=>Re({url:"/slot-management/release-slot",body:{companyId:s,projectId:e,slotId:t}}),{retries:ee,factor:1})}async function jl(s,e,t){return(0,X.default)(()=>ln("/slot-management/update-slot",{slotId:t.slotId,companyId:s,projectId:e,slot:t}),{retries:ee,factor:1})}function $l(s,e,t){return Re({url:`/slot-management/keep-alive?reqId=${se()}`,body:{slots:t,companyId:s,projectId:e},timeout:1e4})}async function Zw(s,e){return await be(`${Ms}/sessions/${s}`,void 0,{Authorization:`Basic ${Buffer.from(`${e.user}:${e.key}`).toString("base64")}`})}async function il(s){try{return await Se("/v2/project/validateUserAccessKey",s),!0}catch(e){return jt.error("error validating user access key",{error:e}),!1}}var Zt,Hm,X,ol,Gw,jt,ee,Hw,El,Il,Cl,Ji,he=w(()=>{"use strict";Zt=S(require("lodash")),Hm=S(require("pako"));F();pe();ne();Ge();it();X=S(require("p-retry")),ol=S(require("object-hash"));J();W();Gw=dt(),jt=C("testim service api"),ee=3,Hw="/grid";El=async()=>(0,X.default)(()=>Se("/grid/lt/config"),{retries:ee,factor:1}),Il=async s=>(0,X.default)(()=>Se(`/labFeature/v2/project/${s}`),{retries:ee,factor:1});Cl=Zt.memoize(async(s,e,t,r)=>{if(!Zt.isEmpty(r))return await qm(s,e,t,JSON.stringify(r),"test-run-data","application/json")},(s,e,t,r)=>`${(0,ol.default)(r)}:${e}:${t}`),Ji=Zt.memoize(async(s,e,t,r,n)=>!r||Zt.isEmpty(r)?void 0:await qm(s,e,t,JSON.stringify((()=>{let o=Zt.clone(r);if(n!=null&&n.hiddenParams){let{hiddenParams:a}=n;(a||[]).forEach(l=>{o[l]&&Object.assign(o,{[l]:Pc.HIDDEN_PARAM})})}return o})()),"test-test-data","application/json"),(s,e,t,r)=>`${(0,ol.default)(r)}:${e}:${t}`)});async function zm(){let s=await Promise.any(ev.map(async e=>{try{return await be(e)}catch{return null}}));return s==null?void 0:s.ip}var ev,Km=w(()=>{"use strict";Ge();ev=["https://api.ipify.org?format=json","https://ipinfo.io/json","https://api.my-ip.io/ip.json"]});var er={};H(er,{getSessionPlayer:()=>Q,options:()=>Vl});var Yi,Vl,Wl,Q,Te=w(()=>{"use strict";Yi=require("path");W();Vl={playerPath:void 0},Q=()=>{if(Wl)return Wl;let s=(We(),Ue($e));s.log("getSessionPlayerRequire start");let{getSessionPlayerFolder:e}=(tn(),Ue(en)),t=e(),r=Vl.playerPath?(0,Yi.resolve)(Vl.playerPath,"src/background/sessionPlayerInit.ts"):(0,Yi.join)(t,"sessionPlayer.js"),n=require(r);return s.log("getSessionPlayerRequire end"),Wl=n,process.env.LOGGER_CONSOLE&&process.env.DEBUG&&n.setLoggerFormatter&&n.setLoggerFormatter(uc),n}});function sv(s){q.EXTENSION!==s&&process.nextTick(()=>{try{(Te(),Ue(er)).getSessionPlayer()}catch{}})}async function dn(s){let{project:e,token:t,userAccessKey:r,lightweightMode:n,useLocalChromeDriver:i,useChromeLauncher:o,mode:a,gridId:l,grid:c}=s,d=Boolean(n==null?void 0:n.general),m=Boolean(i||o),u=d?rv:tv,g=null;if(O.flags.getPublicIpFrom3rdPartyServices.isEnabled()&&!m)try{g=await zm()}catch(y){Jm.error("failed to get public ip",y)}let h=!0;U("before initializeUserWithAuth");let f=await ht(async()=>(sv(a),h=!1,await vl({projectId:e,token:t,branchName:s.branch,lightweightMode:n,localGrid:m,publicIp:g,gridId:l,grid:c})),"initializeUserWithAuth",u,{project:e,token:t,branchName:s.branch,lightweightModeGeneral:d,localGrid:m,gridId:l,grid:c,publicIp:g})();return s.publicIps=[f.clientPublicIp],U("after initializeUserWithAuth"),g&&f.clientPublicIp&&f.clientPublicIp!==g&&(Jm.error("public ip mismatch",{publicIpFromExternalService:g,publicIpFromServices:f.clientPublicIp}),s.publicIps.push(g)),Vm(f.authData,{projectId:e,token:t,userAccessKey:r,publicIp:f.clientPublicIp,initializedFromCache:h}),f}var Jm,tv,rv,Ym=w(()=>{"use strict";We();he();Bt();it();Km();ne();W();le();Jm=C("initializeUserWithAuth"),tv=1e3*60*5,rv=1e3*60*60*10});async function Zm(s){var r;let e=Promise.resolve();s.useLocalChromeDriver&&(s.chromeBinaryLocation=s.downloadBrowser?await ji():s.chromeBinaryLocation,e=Zs({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!==q.EXTENSION&&await br(s.playerLocation,s.canary),s.mode!==q.SELENIUM&&s.mode!==q.APPIUM&&!s.ext&&await Jc(s.extensionLocation);let t;if(s.installCustomExtension){let n=Boolean(s.useLocalChromeDriver||s.useChromeLauncher);t=await Kc(s.installCustomExtension,n)}return await e,t}async function ef(s){var o;nv.info("prepare MockNetwork",{location:s});let e=await Rc(s),t=Buffer.isBuffer(e)?e:e.body;if(t.byteLength>Xm*1e6)throw new Error(`${Gl} exceeded ${Xm}MB`);let r;try{r=JSON.parse(t.toString("utf-8"))}catch(a){throw new Error(`${Gl} cannot be parsed.${Xi.EOL}${a}`)}let n=new Qm.default;if(!n.validate(Fc,r)){let a=(o=n.errors)==null?void 0:o.map((l,c)=>`${++c}) ${l.dataPath} ${l.message}`).join(Xi.EOL);throw new Error(`${Gl} is malformed.${Xi.EOL}${a}`)}return r.entries}var Xi,Qm,Xm,Gl,nv,Hl=w(()=>{"use strict";Xi=S(require("os"));F();sm();tn();Qm=S(require("ajv"));ne();Zc();Ym();Xm=1,Gl="JSON file supplied to --mock-network-pattern",nv=(W(),Ue(fc)).getLogger("prepare runner")});function rf(s,e=process){async function t(r){await oe(ae(tf,async n=>n()),1e4).catch(()=>null),s(r)}e.on("uncaughtException",async r=>{mn.error("Caught exception",{err:r}),console.log("Uncaught exception"),r.message&&console.log("Message =",r.message),r.reason&&console.log("Reason =",r.reason),await t(r)}),e.on("unhandledRejection",r=>{var n;if(mn.fatal("Caught unhandled promise rejection",r),!((n=r==null?void 0:r.message)!=null&&n.includes("ENOTFOUND x-api.rollout.io")))throw r}),e.on("rejectionHandled",()=>{mn.error("Caught rejection handled")}),e.once("SIGTERM",()=>{let r="Runner aborted - SIGTERM event",n=new Error(r);throw mn.error(r),t(n),n}),e.once("SIGINT",()=>{let r="Runner aborted - SIGINT event",n=new Error(r);throw mn.error(r),t(n),n}),e.once("exit",r=>{s(r)})}function rs(s){tf.push(s)}var mn,tf,fn=w(()=>{"use strict";W();F();mn=C("process-handler"),tf=[]});function Jl(s,e){var o;let t=s.canary?"-master.zip":".zip",r=`${e?Td:Ds}/extension/testim-headless${t}`,n=O.flags.testimHeadlessExtensionDownloadUrl.getValue({companyId:(o=s.company)==null?void 0:o.companyId,projectId:s.project});return!(s.ext||s.extensionPath)&&n&&(r=n,s.testimHeadlessExtensionDownloadUrl=n),{chrome:r,"edge-chromium":r}}function cf(s){let{chrome:e}=Jl(s,!1);return e}function Zi(s){let e=`${Ds}/extension/sessionPlayer`;return s.canary?`${e}-master`:e}var gn=w(()=>{"use strict";pe();le()});function mf(s){Oe||(s!=null&&s.userId||(s={anonymousId:df}),pf.identify(s))}function yt(s,e){return hn("ci",s,e)}function hn(s,e,t){if(Oe)return;let r=s?{userId:s}:{anonymousId:df};pf.track(Object.assign(r,{event:e,properties:t}))}var uf,pf,df,ss=w(()=>{"use strict";pe();uf=require("@segment/analytics-node"),pf=new uf.Analytics({writeKey:"sJOSIGKa5x5rJEGsaOlCjrgozAf7FnVY",flushAt:1}),df=require("crypto").randomBytes(20).toString("hex")});function ff(s){return s.start&&hn(null,"cli-start-command",{downloadBrowser:Boolean(s.downloadBrowser)}),!!(s.startV2||s.start||s.agent)}async function gf(s){let e=!!s.start;if(Number.isNaN(s.agentPort))throw new A("Agent port is not number");let t=Zi(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 hf=w(()=>{"use strict";gn();ss();J()});var yf,pv,dv,Yl,bf=w(()=>{"use strict";yf="TST_CREDS",pv=["username","password"],dv="$encrypted",Yl={get proxyPlaceholder(){return new Proxy({},{get(s,e){let t={};for(let r of pv)t[r]={[dv]:`${e}.${r}`};return t}})},containsEncryptedCredentials(s){return s.includes(yf)},injectProxyCredentialsStoreToGlobal(){Object.assign(globalThis,{[yf]:this.proxyPlaceholder})}}});async function wf(s,e){var t;return(t=s.lightweightMode)!=null&&t.onlyTestIdsNoSuite&&s.testId?{tests:[s.testId.map(n=>({testId:n,testConfig:{},resultId:se()}))]}:await fl({projectId:s.project,labels:s.label,testIds:s.testId,testNames:s.name,testConfigNames:s.testConfigNames,suiteNames:s.suites,suiteIds:s.suiteIds,branch:e,rerunFailedByRunId:s.rerunFailedByRunId,testConfigIds:s.testConfigIds,intersections:s.intersections})}function Xl(s){let e=Object.keys(s).length,t=Object.keys(s).reduce((r,n)=>r+(s[n].success===!0?1:0),0);return e===t}async function Ql(s,e){let t=s.mode===q.EXTENSION?Er:bn,r=Tf.difference(Hs(s,e),t);if(r.length>0)throw yt("invalid-config-run",{browser:r.join(", "),mode:"runner"}),new A(`browser type <${r}> is not supported in ${s.mode} mode.`);return e}var Tf,Er,bn,eo=w(()=>{"use strict";Tf=S(require("lodash"));F();ss();he();J();ne();Er=["edge-chromium","chrome"],bn=[...Er,"firefox","safari","safari technology preview"]});function ro(s){let{platform:e}=process;e==="win32"?(0,to.exec)(`start chrome ${s}`):e==="darwin"?(0,to.exec)(`open -a "Google Chrome" ${s}`):e==="linux"&&(0,to.exec)(`google-chrome ${s}`)}var to,Zl=w(()=>{"use strict";to=require("child_process")});var nu={};H(nu,{doLogin:()=>su,getProjectId:()=>mv,getToken:()=>fv});async function mv(){return Ef("projectId")}async function fv(){return Ef("token")}function Sf(s,e){return Promise.race([s,ce(e).then(()=>{throw new ie("timeout")})])}async function gv(){let s=(await import("express")).default(),e=async function(){return Sf(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(()=>(he(),Ae)),{editorUrl:n}=await r();ro(`${n}/#/new-test`)}catch{console.log("Unable to open Testim automatically - please manually go to https://app.testim.io")}return await e}async function su({overwriteExisting:s=!0,projects:e=null}={}){let t=eu.homedir(),r=tu.join(t,".testim");if(await ge(r)&&!s)return;let i={},[{default:o},{default:a}]=await Promise.all([import("prompts"),import("ora")]),l=a("Getting credentials from Tricentis Testim extension ...").start();if(e||(e=await Sf(gv(),62e3).catch(()=>null)),e!=null&&e.token){i.token=e.token,i.projectId=e.projectId,l.succeed(),await vf(r,i);return}if(e!=null&&e.length){l.succeed();let c=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(d=>({title:d.name,value:d}))});i.token=c.project.ci.token,i.projectId=c.project.id,await vf(r,i);return}l.fail(),console.log("Error getting credentials - please pass `--token` and `--project` to the CLI or try again")}async function vf(s,e){await ru.promises.writeFile(s,so.stringify(e)),console.log(`Testim credentials saved in '${s}'`)}async function Ef(s){let e=eu.homedir(),t=tu.join(e,".testim"),r=await ge(t),n={};if(r)try{n=so.parse((await ru.promises.readFile(t)).toString())}catch{}return n||={},n[s]}var eu,tu,so,ru,no=w(()=>{"use strict";eu=S(require("os")),tu=S(require("path")),so=S(require("yaml"));F();ru=require("fs");J();Zl()});var _f={};H(_f,{process:()=>Ev});var ou,xf,io,Cf,$t,Ne,Pf,hv,Me,lu,yv,bv,Rf,kf,Tv,au,cu,uu,iu,Ct,wv,p,vv,Sv,Af,Ev,Of=w(()=>{"use strict";ou=S(require("ms")),xf=S(require("chalk")),io=S(require("fs")),Cf=S(require("url")),$t=S(require("lodash")),Ne=S(require("path"));F();gn();hf();Bt();Pf=require("commander");ne();J();Fr();F();le();bf();eo();hv=s=>s.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),Me=(s,e)=>(e.push(s),e),lu=new Pf.Command,yv=s=>s.split(","),bv=(s,e)=>!s||s.length===0?e:s,Rf=["enable-heavy-ad-intervention","heavy-ad-privacy-mitigations","use-fake-device-for-media-stream","use-fake-ui-for-media-stream","proxy-server"],kf=()=>{function s(f){return f.includes("-h, --help")}function e(f){return f.includes("--params [params-json-string]")}function t(f){return f.includes("--ext")||f.includes("--extension-path")||f.includes("--headless-extension-download-path")}function r(f){return f.includes("--player-path")||f.includes("--player-require-path")}function n(f){return f.includes("--executionId")||f.includes("--source")||f.includes("--resultId")||f.includes("--remoteRunId")||f.includes("--schedulerId")}function i(f){return f.includes("--get-browser-timeout")||f.includes("--get-browser-retries")||f.includes("--get-session-timeout")||f.includes("--get-session-retries")||f.includes("--driver-request-timeout")||f.includes("--driver-request-retries")}function o(f){return f.includes("--user")}function a(f){return f.includes("shouldMonitorPerformance")}function l(f){return f.includes("--save-rca-locally")}function c(f){return f.includes("--exit-code-ignore-failing-tests")}function d(f){return f.includes("--high-speed")}function m(f){return f.includes("--urls")}function u(f){return f.includes("--test-start-timeout")}function g(f){return f.includes("--install-lazy-deps")}function h(f){return f.includes("--print-final-caps")||f.includes("--print-grids")}lu.help(f=>f.split(`
|
|
17
17
|
`).filter(T=>!t(T)&&!e(T)&&!s(T)&&!r(T)&&!n(T)&&!a(T)&&!o(T)&&!i(T)&&!l(T)&&!c(T)&&!d(T)&&!m(T)&&!u(T)&&!g(T)&&!h(T)).join(`
|
|
18
18
|
`))},Tv=(s,e)=>{let t=e?`Please use ${e} instead.`:"";console.log(xf.default.yellow(`
|
|
19
19
|
WARNING: ${s} is deprecated. ${t}
|