@checksum-ai/runtime 2.0.17 → 2.0.18-beta
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/.env +1 -1
- package/index.js +1 -1
- package/package.json +1 -1
package/.env
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
CHECKSUM_RUNTIME_BUILD_TIME=2026-
|
|
1
|
+
CHECKSUM_RUNTIME_BUILD_TIME=2026-02-19T16:38:03.790Z
|
package/index.js
CHANGED
|
@@ -2040,7 +2040,7 @@ Supported model providers are: ${f}`)}}}catch(f){if("code"in f&&f.code.includes(
|
|
|
2040
2040
|
`)}),r.on("response",c=>{if(!c.ok()){let f=new Date().toISOString();a.write(`[${f}] [RESPONSE_ERROR] [${r.url()}] ${c.url()} - ${c.status()} ${c.statusText()}
|
|
2041
2041
|
`)}}),r.context().on("page",c=>{c!==r&&this.setupFrontendLogging(c)})}writeConsoleMessageToLog(r,a){var w;let o=r.text(),c=r.type(),f=r.location(),_=new Date().toISOString(),v=((w=r.page())==null?void 0:w.url())||"unknown",C=`[${_}] [${c.toUpperCase()}] [${v}] ${o}`;f&&(C+=`
|
|
2042
2042
|
at ${f.url}:${f.lineNumber}:${f.columnNumber}`),a.write(C+`
|
|
2043
|
-
`)}async run(r){await this.init(r),this.buildServices(r),this.buildServer(),await this.loadIfNecessary(),await this.start()}async loadIfNecessary(){let r=await this.getInitialServicesData();r&&(this.actionsManager.setActions(r.actions),this.testAssetsManager.setCurrentSaveAsLocation(this.editLocationPath),this.storyId=r.storyId,r.testGenerationData&&this.userStoryService.setTestGenerationData(r.testGenerationData))}async init(r){tf.info(`Initializing VTG with runtime version ${this.checksumRuntimeVersion}...`),await this.patchPlaywright(),this.loadPlaywrightConfigForVTG(),this.webDriver=this.buildWebDriver(r),this.webDriver.registerEventListener(this),this.taskTimeMachine=new cbe(this.webDriver.frameMsgBroker,this.webDriver.injectedScriptManager,{headless:!V0.vtg.taskTimeMachine.showTaskTimeMachine,timestampBatchingEnabled:!1,sortByTimestamp:!0,taskTimeout:V0.vtg.taskTimeMachine.taskTimeout,debugPort:V0.vtg.isSeparateProcess?V0.vtg.taskTimeMachine.debugPort:void 0,frameMsgBrokerRegisterName:"task-time-machine",logPerformance:V0.vtg.taskTimeMachine.logPerformance,webProxy:this.getPlaywrightProxySettings()}),this.pageInteractor=new wve(this.webDriver.evaluateWithChecksum.bind(this.webDriver),()=>this.webDriver.appMainFrame,this.webDriver.getTimeMachine.bind(this.webDriver),{log:e((a,...o)=>o!=null&&o.length?tf.info(a,...o):tf.info(a),"log"),logError:e((a,...o)=>o!=null&&o.length?tf.error(a,...o):tf.error(a),"logError")},{...this.getTimeoutParams(),waitActionDelay:1e3,testAssetsDir:__dirname,listenToDialog:!0,listenToFileChooser:!1},new iVe(this.checksumConfig)),this.testAssetsManager=new cGt(this.projectRootDirectory,this.checksumRoot,this.vtgInternalFilesDir,this.vtgTestFileRunConfig)}buildServices(r){this.actionsManager=new BWt,this.settingsService=new sgt(this.checksumRoot,this.apiService,this.vtgInternalFilesDir),this.apiService=new Y_t(this.checksumConfig),this.settingsService=new sgt(this.checksumRoot,this.apiService),this.userStoryService=new G_t(this.apiService,this.checksumConfig),this.variableStoreService=new hGt,this.evaluatorService=new yGt(this.variableStoreService,this.settingsService,this.vtgTestFileMode,r,this.port),this.actionsService=new dJt(this.checksumConfig,this.checksumRoot,this.pageInteractor,this.apiService,this.userStoryService,this.actionsManager,this.testAssetsManager,this.webDriver,this.evaluatorService,this.vtgInternalFilesDir),this.assertionsService=new AJt(this.webDriver,this.actionsManager,this.evaluatorService),this.locatorsService=new FJt(this.webDriver,this.taskTimeMachine,this.apiService,this.userStoryService,this.evaluatorService),this.aiTestGenerationService=new _Jt(this.webDriver,this.pageInteractor,this.actionsService,this.actionsManager,this.apiService,this.userStoryService),this.aiAssertionsService=new xJt(this.actionsManager,this.apiService,this.userStoryService,this.taskTimeMachine,this.webDriver,this.evaluatorService,{logPerformance:V0.vtg.aiAssertions.logPerformance}),this.aiThoughtsService=new _Gt(this.actionsManager,this.apiService,this.userStoryService,this.taskTimeMachine,this.webDriver),this.storageService=new OWt(this.checksumConfig,this.userStoryService,this.apiService,this.actionsManager,this.testAssetsManager,this.actionsService,this.vtgTestFileRunConfig,this.evaluatorService,this.settingsService,this.taskTimeMachine),this.actionsManager.setStorageService(this.storageService),this.monacoService=new bGt,this.aiChatService=new prr(this.taskTimeMachine,this.evaluatorService)}buildServer(){this.reactAppServer=new oGt(this.actionsService,this.assertionsService,this.locatorsService,this.aiTestGenerationService,this.aiAssertionsService,this.aiThoughtsService,this.actionsManager,this.storageService,this.settingsService,this.monacoService,this.evaluatorService,this.aiChatService)}loadPlaywrightConfigForVTG(){try{let r=`${this.checksumRoot}/playwright.config.ts`;if((0,F3e.existsSync)(r)){let a=require(r).default;a&&(this.playwrightConfigForVTG=a)}}catch{tf.warning("Could not find playwright config file, will run with defaults")}}async getInitialServicesData(){switch(this.vtgMode){case"cloud":return this.getInitialServicesDataFromCloud();case"edit":return this.vtgTestFileMode?await this.getInitialServicesDataForEditedFile():this.getInitialServicesDataFromJSON("local");case"start":if(this.vtgTestFileRunConfig.restoreFromAutoSave)return this.getInitialServicesDataFromJSON("auto-save")}}getInitialServicesDataFromJSON(r){let a=this.storageService.getLocalSavedJSONFilePath(r,this.storyId),o=this.storageService.readLocalSavedDataFromJSONFile(a);if(!o)throw new Error(`No data found in ${r} while reading from ${a}`);return{actions:o.executedActions,storyId:o.story.id}}async getInitialServicesDataFromCloud(){let a=await(await this.apiService.post(`test-generation/${this.cloudTestGenerationId}/info`)).json(),{actionsDownloadSignedURL:o}=a,c=await fetch(o,{mode:"cors",credentials:"same-origin",headers:{"Content-Type":"application/json"}});if(!c.ok)throw new Error(`HTTP error! Status: ${c.status}`);let f=await c.json();return{actions:this.initializeTestStepsWithIds(f),storyId:a.story.id}}initializeTestStepsWithIds(r){return r.map((a,o)=>({...a,id:(0,Chn.randomUUID)(),assertions:(a.assertions??[]).map(c=>({...c,id:(0,Chn.randomUUID)()}))}))}async getInitialServicesDataForEditedFile(){var a,o,c,f,_,v,C;if(((a=this.vtgTestFileRunConfig)==null?void 0:a.mode)!=="edit")return;let r=[];if(!this.vtgTestFileRunConfig.restoreFromAutoSave){let w=(o=this.vtgTestFileRunConfig)==null?void 0:o.actionsJsonFilePath;r=this.storageService.readJsonFile(w),(0,F3e.rmSync)(w,{force:!0}),r=this.initializeTestStepsWithIds(r)}if((c=this.vtgTestFileRunConfig)!=null&&c.internalTestId)try{let w=await this.apiService.post(`test-generation-by-internal-test-id/${(f=this.vtgTestFileRunConfig)==null?void 0:f.internalTestId}/info`);if(!w.ok){let k=w.statusText;try{let R=await w.text();try{k=JSON.parse(R).message||R||w.statusText}catch{k=R||w.statusText}}catch{k="Test id not found or invalid"}throw new Error(`Error fetching test generation data: ${k}`)}let T=await w.json();if(this.vtgTestFileRunConfig.restoreFromAutoSave){let k=this.storageService.getLocalSavedJSONFilePath("auto-save"),R=this.storageService.readLocalSavedDataFromJSONFile(k);if(!R)throw new Error(`No data found in auto-save while reading from ${k}`);r=R==null?void 0:R.executedActions}return{actions:r,storyId:T.story.id,testGenerationData:T.testGenerationData}}catch{tf.warning(`Could not find data matching internal test id: ${(_=this.vtgTestFileRunConfig)==null?void 0:_.internalTestId}`)}if((v=this.vtgTestFileRunConfig)!=null&&v.storyId)return{actions:r,storyId:(C=this.vtgTestFileRunConfig)==null?void 0:C.storyId};throw new Error("Cannot edit file without either valid internal test id or story id")}async start({createAssetsFolder:r=!0}={}){var o,c;await this.userStoryService.fetchStory(this.storyId),r&&this.testAssetsManager.createTestAssetsFolders(),this.testAssetsManager.createTestGenerationLocalAutoSaveFolder(),await this.reactAppServer.start();let{environment:a}=this.userStoryService.getEnvInfo();await this.webDriver.prepare({baseURL:a.baseURL,shutdown:!this.vtgTestFileMode},{serverPort:await this.reactAppServer.getPort()}),V0.vtg.writeLogFile&&this.setupFrontendLogging(this.webDriver.page),await this.webDriver.page.evaluate(()=>{"checksumRRWeb"in window&&console.log(`Using forked rrweb. ${JSON.stringify(window.checksumRRWeb)}`)}),await this.webDriver.addHARMockAPIRecordings(this.testAssetsManager.getHarFilePath()),await this.initTimeMachine(),this.pageInteractor.init(),this.assertionsService.setPage(this.webDriver.appMainFrame.page()),this.actionsService.setPage(this.webDriver.appMainFrame.page()),this.evaluatorService.setPage(this.webDriver.appMainFrame.page()),this.aiChatService.setPage(this.webDriver.appMainFrame.page()),await this.taskTimeMachine.prepare(this.webDriver.appMainFrame,void 0,f=>this.webDriver.registerTimeMachineFrame(f)),await this.reactAppServer.evaluateServerPort(this.webDriver.page),await this.webDriver.appMainFrame.goto("about:blank",{waitUntil:"domcontentloaded",timeout:0}),await this.webDriver.getTimeMachine().toggleTimeMachineHandleEvents(!1),this.vtgMode==="start"&&!this.vtgTestFileRunConfig.restoreFromAutoSave&&(await this.actionsService.addInitialLoginAction(),await this.actionsService.addStartURLNavigationAction(),this.vtgTestFileMode&&await this.storageService.saveTestFile()),tf.info("VTG is ready with story:",{goal:(o=this.userStoryService.getStory())==null?void 0:o.goal}),await this.webDriver.page.evaluate(({localSaveFolderPath:f,stepsData:_,appViewport:v,userStoryGoal:C,isLoadedFromFile:w})=>{window.vtg.initClient(f,_,v,this.checksumRuntimeVersion,C,w)},{localSaveFolderPath:this.editLocationPath,stepsData:await this.actionsManager.buildStepDataWithCode(this.actionsManager.actions,{loadingFromFile:["edit","cloud"].includes(this.vtgMode)}),appViewport:this.webDriver.getApplicationViewport(),userStoryGoal:(c=this.userStoryService.getStory())==null?void 0:c.goal,isLoadedFromFile:this.vtgTestFileMode}),this.vtgTestFileMode||await new Promise(()=>{})}getTimeoutParams(){var o,c,f,_;let r=((c=(o=this.playwrightConfigForVTG)==null?void 0:o.use)==null?void 0:c.navigationTimeout)||3e4,a=((_=(f=this.playwrightConfigForVTG)==null?void 0:f.use)==null?void 0:_.actionTimeout)||5e3;return{navigationTimeout:r,actionTimeout:a}}getPlaywrightProxySettings(){var f,_;let r=(_=(f=this.playwrightConfigForVTG)==null?void 0:f.use)==null?void 0:_.proxy,{server:a,username:o,password:c}=r||{};if(o&&c&&a)return{username:o,password:c,server:a}}getPlaywrightViewportSettings(){var o,c;let{width:r=1280,height:a=720}=((c=(o=this.playwrightConfigForVTG)==null?void 0:o.use)==null?void 0:c.viewport)||{};return{width:r,height:a}}buildWebDriver(r){var c,f,_,v,C,w;let a=this.getPlaywrightProxySettings(),o=this.getPlaywrightViewportSettings();return new fGt({scriptSource:V0.checksumScript.source,scriptURL:V0.checksumScript.url,scriptFile:V0.checksumScript.path,isScriptFileAbsolute:!0,fullScreenResolution:!1,hostWindowViewport:!0,baseURL:(c=this.checksumConfig.environments.find(T=>T.default))==null?void 0:c.baseURL,useProxy:!!a,webProxy:a,disableWebSecurity:!0,allowFileAccess:!0,remoteDebugging:V0.vtg.remoteDebugging,remoteDebuggingPort:V0.vtg.vtgRemoteDebuggingPort},{devtools:!1,headless:V0.CI},{frontendAppSpecificRules:{},frontendTestGenerationConfig:{logPrefix:"$checksum"},viewport:o,completeOriginHeaderOnLivePage:!V0.vtg.isSeparateProcess&&!((v=(_=(f=this.checksumConfig.options)==null?void 0:f.modelConfig)==null?void 0:_.browserArgs)!=null&&v.skipDisableWebSecurity)&&!((w=(C=this.checksumConfig.options)==null?void 0:C.modelConfig)!=null&&w.skipCompleteOriginHeaderOnDisableWebSecurity)},r)}async onWebDriverContextClose(){var r,a,o;this.evaluatorService.stopListening(),(r=this.vtgTestFileRunConfig)!=null&&r.evalFilePath&&(0,F3e.rmSync)((a=this.vtgTestFileRunConfig)==null?void 0:a.evalFilePath,{force:!0}),this.vtgTestFileRunConfig.mode==="edit"&&(0,F3e.rmSync)((o=this.vtgTestFileRunConfig)==null?void 0:o.actionsJsonFilePath,{force:!0})}initializeAccordingToVTGMode(r){var c;let a=r.indexOf("--edit"),o=r.indexOf("--cloud");if(r.indexOf("--test-file")!==-1){this.vtgTestFileMode=!0,this.vtgTestFileRunConfig=JSON.parse(process.env.CHECKSUM_VTG_TEST_FILE_RUN_CONFIG),this.vtgMode=this.vtgTestFileRunConfig.mode,this.storyId=((c=this.vtgTestFileRunConfig)==null?void 0:c.mode)==="start"?this.vtgTestFileRunConfig.storyId:void 0;return}a!==-1&&(this.vtgMode="edit",this.editLocationPath=r[a+1]),o!==-1&&(this.vtgMode="cloud",this.cloudTestGenerationId=r[o+1]),this.vtgMode==="start"&&(this.storyId=r[0])}getWebDriver(){return this.webDriver}async eval(r){return this.evaluatorService.listenForExecution(r)}};e(whn,"VisualTestGenerator");var frr=whn;Eve();var iEi=require("child_process"),Dhn=require("net");vT();var aEi=require("path");v7();var nEi=sf(vht());fQ();var Shn=e(async(i,t,r,a,o={})=>{let{preventDialogFromAutoDismissing:c=!1,retry:f=!0,maxRetries:_=void 0,numberOfRetries:v=0}=o;try{console.log(`${i} attempting to connect to ${t} on port ${r}...`);let w=(await nEi.chromium.connectOverCDP("http://127.0.0.1:"+r)).contexts()[0],T=a(w.pages());for(;!T;)await TA(1e3),T=a(w.pages());return console.log(`${i} is connected to ${t} on port ${r}`,T.url()),c&&bzt(T),T}catch(C){if(!f||_&&v>=_)throw console.error(`${i} failed to connect to ${t}, retries were exhausted or disabled`,C),C;return console.log(`${i} is waiting and retrying connection to ${t} on port ${r}...`),await TA(1e3),Shn(i,t,r,a,{...o,numberOfRetries:v+1})}},"connectToPage");qw();var Thn=class Thn{constructor(t){this.checksumConfig=t;this.isReady=!1;this.onMessage=e(async(t,r)=>{let{id:a,err:o,result:c}=await this.execute(t);r.write(this.messageParser.makeMessage(JSON.stringify({id:a,err:this.serializedErr(o),result:c})))},"onMessage");this.messageParser=new BGe(this.onMessage),this.isReadyPromise=new Promise(r=>{this.isReadyResolve=r}),this.routeInterceptor=new qWe({completeOriginHeader:!0})}async eval(t){return this.listenForExecution(t)}async run(t){this.liveAppPage=t,await this.applyRouteInterceptorsIfNecessary(),await this.createServer(),this.startRunner()}async applyRouteInterceptorsIfNecessary(){var r,a,o,c,f,_;if(!((o=(a=(r=this.checksumConfig.options)==null?void 0:r.modelConfig)==null?void 0:a.browserArgs)!=null&&o.skipDisableWebSecurity)&&!((f=(c=this.checksumConfig.options)==null?void 0:c.modelConfig)!=null&&f.skipCompleteOriginHeaderOnDisableWebSecurity))try{await((_=this.liveAppPage)==null?void 0:_.route("**/*",async(v,C)=>this.routeInterceptor.intercept(v,C,{page:this.liveAppPage},{completeOriginHeader:!0})))}catch(v){tf.error("[WebDriver] applyRouteInterceptors error",v)}}startRunner(){let t=V0.isRepoMode?"yarn vtg-pw-bridge":`ts-node ${(0,aEi.join)(__dirname,"vtg-pw-bridge-runner.js")}`;Yes(t,{CHECKSUM_PORT:this.port.toString(),CHECKSUM_CONFIG:JSON.stringify(this.checksumConfig)})}async createServer(){this.server=(0,Dhn.createServer)(t=>{t.on("data",async r=>{try{await this.messageParser.onMessage(t,r)}catch(a){t.write(JSON.stringify({err:a.message}))}}),t.on("end",()=>{}),t.on("error",r=>{}),this.connectToVTG()}),this.port=await this.acquirePortNumber(),this.server.listen(this.port,()=>tf.info(`VTG PW Bridge Server listening on port ${this.port}...`))}serializedErr(t){return t&&JSON.stringify(t,Object.getOwnPropertyNames(t))}async connectToVTG(){tf.info("[VTG PW Bridge] Connecting to VTG...");let t=e(r=>r.frames().find(a=>a.name()==="time-machine-iframe"),"findTimeMachineIframe");this.vtgPage=await this.connectToPage("VTG page",V0.vtg.vtgRemoteDebuggingPort,r=>r.find(a=>t(a))),this.vtgTimeMachineFrame=t(this.vtgPage),this.taskTimeMachinePage=await this.connectToPage("Task Time Machine page",V0.vtg.taskTimeMachine.debugPort,r=>r[0]),tf.info("[VTG PW Bridge] Connected to VTG."),this.isReady=!0,this.isReadyResolve()}async connectToPage(t,r,a){return Shn("Playwright via Bridge",t,r,a,{preventDialogFromAutoDismissing:!0})}async acquirePortNumber(){return await new Promise((t,r)=>{let a=(0,Dhn.createServer)();a.unref(),a.on("error",r),a.listen(0,()=>{let o=a.address().port;a.close(()=>{t(o)})})})}async listenForExecution(t){return new Promise(r=>{this.resolveEvaluator=r,this.listener=t})}stopListening(){var t;(t=this.resolveEvaluator)==null||t.call(this)}buildContext(t){let{frame:r,expectConfig:a}=t,o={};switch(r){case"task-time-machine":o.page=this.taskTimeMachinePage.frameLocator("iframe");break;case"vtg-time-machine":o.page=this.vtgTimeMachineFrame.frameLocator("iframe");break;case"live":default:break}return a&&(o.expect=Jbe.expect.configure(a)),o}wrapCodeInContext(t,r){return`(async ({${Object.keys(r).join(", ")}}) => { ${t} })`}async execute(t){this.isReady||tf.warning("[VTG PW Bridge] Execute called before ready"),await this.isReadyPromise;let{id:r,code:a,options:o}=t,c=this.buildContext(o),f=this.wrapCodeInContext(a,c)+"(context)";return new Promise(_=>{this.listener&&this.listener(f,c,(v,C)=>{_({id:r,err:v,result:C})})})}};e(Thn,"VtgPwBridge");var drr=Thn;async function Yes(i,t={}){let r={...process.env,...t};(0,iEi.spawn)(i,{env:r,shell:!0,stdio:["inherit","inherit","inherit"],detached:!1}).on("exit",o=>{process.exit(o)})}e(Yes,"spawnCmd");var PEi=require("@playwright/test"),FEi=sf(IEi());var lae=class lae{constructor(t){this.options=t;this.importPluginPackages()}importPluginPackages(){lae.pw??(lae.pw=vht()),lae.StealthPlugin??(lae.StealthPlugin=require("puppeteer-extra-plugin-stealth"))}static createFreshInstance(){try{let{addExtra:t}=vht(),r=t(lae.pw.chromium);return console.log("[StealthProvider] Created fresh playwright-extra instance for testing"),r}catch(t){throw console.error("[StealthProvider] Error creating fresh instance:",t),t}}buildChromiumWithPlugins(t){let{project:r}=this.options,a=r.use.userAgent,o=r.use.playwrightExtra||[],c=lae.StealthPlugin();if(o.push(c),this.isCustomUserAgent(a)){c.enabledEvasions.delete("user-agent-override");let v=require("puppeteer-extra-plugin-stealth/evasions/user-agent-override")({userAgent:a});o.push(v)}let f=t??lae.pw.chromium;return o.forEach((_,v)=>{try{!(_ instanceof FEi.PuppeteerExtraPlugin)&&_!==c&&console.warn(`Plugin at index ${v} in the project's checksum.config.ts file is not an instance of PuppeteerExtraPlugin.`),f.use(_)}catch(C){console.warn(C)}}),f}isCustomUserAgent(t){return t?!Object.values(PEi.devices).some(r=>t===r.userAgent):!1}};e(lae,"StealthProvider");var hrr=lae;Mjt();function NEi(i,t){return{testSuiteRunId:t,appName:"generic-app",commitHash:"generic-commit-hash",envName:"generic-env-name",branch:"generic-branch",checksumRuntimeVersion:i}}e(NEi,"createDefaultTestSuiteRunInfo");var BEi=require("crypto");UVr();var N3e=class N3e{constructor(t,r){this.context=t;this.isVTG=r;this._pages={};this._pagesInProgress=new Map;this._testAssets=null;this.pageGuidMap=new WeakMap;this.instanceId=++N3e.instanceCounter,this.setContextProxy()}static makeContext(t,r){return new N3e(t,r).proxy}_rawContext(){return this.context}setTestAssets(t){this._testAssets=t,this.setupPageListener()}getTestAssets(){return this._testAssets}cleanup(){this._pagesInProgress.clear(),this._pages={}}async newPage(){let t=await this.context.newPage();return await this.makePage(t)}async makePage(t){if(t._isChecksumPage===!0)return t;let r=this.getPageGuid(t);if(this.hasPage(r))return this.getPageByGuid(r);if(this._pagesInProgress.has(r))return this._pagesInProgress.get(r);let a=this._createPageInstance(t);this._pagesInProgress.set(r,a);try{let o=await a;return this._pagesInProgress.delete(r),this.addPage(o),o}catch(o){throw this._pagesInProgress.delete(r),o}}addPage(t){let r=this.getPageGuid(t);this._pages[r]=t,t.once("close",()=>{this.removePage(r)})}removePage(t){this._pages[t]&&delete this._pages[t]}async _createPageInstance(t){if(this._testAssets)try{return await vzt.init(t,this.proxy,this._testAssets.testRunAnalytics,this._testAssets.monitorBridge,this._testAssets.variableStore,this._testAssets.testInfo,this._testAssets.checksumTestId,this._testAssets.test,this._testAssets.config,this._testAssets.isReplMode)}catch(r){throw new Error(`Failed to initialize RuntimePage: ${r instanceof Error?r.message:String(r)}. Test assets must be properly configured.`)}throw new Error("Cannot create page: Test assets not set. Use setTestAssets() before creating pages.")}setContextProxy(){this.proxy=new Proxy(this,{get:e(function(r,a){return r.getContextMethod(a)},"get")})}setupPageListener(){this.context.on("page",async t=>{try{await this.makePage(t)}catch(r){throw console.error("[ChecksumBrowserContext] Failed to initialize page created by application:",r),r}})}getPageGuid(t){let r=this.pageGuidMap.get(t);return r||(r=`page@checksumctx_${this.instanceId}_${++N3e.guidCounter}`,this.pageGuidMap.set(t,r)),r}getPageByGuid(t){return this._pages[t]}hasPage(t){return t in this._pages}getAllPages(){return Object.values(this._pages)}getContextMethod(t){if(t in this){let a=this[t];return typeof a=="function"?a.bind(this):a}let r=this.context[t];return typeof r=="function"?r.bind(this.context):r}pages(){return this.getAllPages()}getPage(t){let r=this.getAllPages(),a=r[t];if(!a)throw new Error(`Page with index ${t} not found. Total pages: ${r.length}`);return a}};e(N3e,"ChecksumBrowserContext"),N3e.instanceCounter=0,N3e.guidCounter=0;var grr=N3e;var Nhn={},pZe=!!process.env.CHECKSUM_VTG_TEST_FILE_RUN_CONFIG,REi=e((i,t,r={},a=!1)=>{let{runMode:o,environments:c}=t,f=c.find(v=>v.default),_=i.extend({baseURL:f.baseURL,bypassCSP:!0,...pZe?{trace:"off",video:"off",screenshot:"off",ignoreHTTPSErrors:!0}:{},permissions:e(async({},v,C)=>{if(!pZe)await v(C.project.use.permissions);else{let w=new Set(C.project.use.permissions);w.add("clipboard-read"),w.add("clipboard-write"),w.add("camera"),w.add("storage-access"),w.add("notifications"),w.add("geolocation"),w.add("microphone"),await v(Array.from(w))}},"permissions"),proxy:e(async({proxy:v},C)=>{v?await C({...v,bypass:"127.0.0.1,localhost"}):await C(v)},"proxy"),browser:e(async({browser:v,browserName:C,launchOptions:w},T,k)=>{let R=e(()=>(k.project.use.playwrightExtra||[]).some(X=>X.constructor.name==="StealthPlugin"),"checkIfStealthPluginExists"),B=e(async()=>{let W=await(await new hrr({project:k.project}).buildChromiumWithPlugins()).launch(w);await T(W)},"launchBrowserWithStealthPlugin");pZe?V0.vtg.isSeparateProcess?await T(v):R()?(console.log("StealthPlugin already configured"),await T(v)):await B():V0.useRemoteDebugging.enabled&&R()?await B():await T(v)},"browser"),launchOptions:e(async({launchOptions:v},C)=>{var k;let w=v!=null&&v.args?[...v.args]:[],T=e(R=>{w.includes(R)||w.push(R)},"pushArg");if(r.useMockData&&T("--disable-web-security"),V0.bypassProxyForLocalhost&&T("--proxy-bypass-list=localhost,127.0.0.1"),pZe){T("--proxy-bypass-list=localhost,127.0.0.1"),V0.vtg.isSeparateProcess&&T(`--remote-debugging-port=${V0.vtg.appRemoteDebuggingPort}`);let R=((k=r.modelConfig)==null?void 0:k.browserArgs)??{};R.skipDisableWebSecurity||T("--disable-web-security"),R.skipAllowFileAccessFromFiles||T("--allow-file-access-from-files"),R.skipDisableSiteIsolationTrials||T("--disable-site-isolation-trials"),R.skipAllowRunningInsecureContent||T("--allow-running-insecure-content")}V0.useRemoteDebugging.enabled&&T(`--remote-debugging-port=${V0.useRemoteDebugging.port}`),await C({...v,args:w})},"launchOptions"),variableStore:e(async({},v)=>{let C=new yWe;await v(C)},"variableStore"),vs:e(async({variableStore:v},C)=>{await C(v)},"vs"),variablesStore:e(async({variableStore:v},C)=>{await C(v)},"variablesStore"),testRunAnalytics:e(async({},v,C)=>{let w=(()=>{try{if(process.env.CHECKSUM_TEST_SUITE_INFO)return JSON.parse(process.env.CHECKSUM_TEST_SUITE_INFO);throw new Error("Missing Checksum test suite info")}catch{return console.warn("\u26A0\uFE0F Warning: It seems like you ran the test suite directly via Playwright. This can lead to degraded functionality and unexpected issues. To ensure a fully supported and stable test run, please use: 'npx checksumai test'."),NEi("playwright-run-version-unknown",(0,BEi.randomUUID)())}})(),T=OEi(C),k=rie.getTestRunInstance({...w,checksumTestId:T},process.env.CHECKSUM_ISOLATED_MODE==="true",C);await v(k)},"testRunAnalytics"),monitorBridge:[async({},v,C)=>{let w=new wzt(C);await v(w)},{scope:"worker"}],context:e(async({context:v,monitorBridge:C,variableStore:w,testRunAnalytics:T},k,R)=>{let B=grr.makeContext(v,pZe);B.setTestAssets({testRunAnalytics:T,monitorBridge:C,variableStore:w,testInfo:R,checksumTestId:OEi(R),test:_,config:t,isReplMode:a}),await k(B),B.cleanup()},"context"),page:e(async({page:v,context:C},w,T)=>{let k=await C.makePage(v);Object.defineProperty(k.constructor,"name",{value:"Page"}),await w(k),k&&typeof k.onTestComplete=="function"&&await k.onTestComplete(T.status==="passed"),k&&typeof k.shutdown=="function"&&await k.shutdown()},"page"),vtg:e(async({page:v},C)=>{if(!pZe)C(null);else if(V0.vtg.isSeparateProcess){let w=new drr(t);await w.run(v),await C(w)}else{let w=new frr(["--test-file"],!1,t);await w.run(v),await C(w)}},"vtg")});return{test:_,defineChecksumTest:dts}},"createChecksumTestExtension"),dts=e((i,t,r)=>{let o=new Error().stack.split(`
|
|
2043
|
+
`)}async run(r){await this.init(r),this.buildServices(r),this.buildServer(),await this.loadIfNecessary(),await this.start()}async loadIfNecessary(){let r=await this.getInitialServicesData();r&&(this.actionsManager.setActions(r.actions),this.testAssetsManager.setCurrentSaveAsLocation(this.editLocationPath),this.storyId=r.storyId,r.testGenerationData&&this.userStoryService.setTestGenerationData(r.testGenerationData))}async init(r){tf.info(`Initializing VTG with runtime version ${this.checksumRuntimeVersion}...`),await this.patchPlaywright(),this.loadPlaywrightConfigForVTG(),this.webDriver=this.buildWebDriver(r),this.webDriver.registerEventListener(this),this.taskTimeMachine=new cbe(this.webDriver.frameMsgBroker,this.webDriver.injectedScriptManager,{headless:!V0.vtg.taskTimeMachine.showTaskTimeMachine,timestampBatchingEnabled:!1,sortByTimestamp:!0,taskTimeout:V0.vtg.taskTimeMachine.taskTimeout,debugPort:V0.vtg.isSeparateProcess?V0.vtg.taskTimeMachine.debugPort:void 0,frameMsgBrokerRegisterName:"task-time-machine",logPerformance:V0.vtg.taskTimeMachine.logPerformance,webProxy:this.getPlaywrightProxySettings()}),this.pageInteractor=new wve(this.webDriver.evaluateWithChecksum.bind(this.webDriver),()=>this.webDriver.appMainFrame,this.webDriver.getTimeMachine.bind(this.webDriver),{log:e((a,...o)=>o!=null&&o.length?tf.info(a,...o):tf.info(a),"log"),logError:e((a,...o)=>o!=null&&o.length?tf.error(a,...o):tf.error(a),"logError")},{...this.getTimeoutParams(),waitActionDelay:1e3,testAssetsDir:__dirname,listenToDialog:!0,listenToFileChooser:!1},new iVe(this.checksumConfig)),this.testAssetsManager=new cGt(this.projectRootDirectory,this.checksumRoot,this.vtgInternalFilesDir,this.vtgTestFileRunConfig)}buildServices(r){this.actionsManager=new BWt,this.settingsService=new sgt(this.checksumRoot,this.apiService,this.vtgInternalFilesDir),this.apiService=new Y_t(this.checksumConfig),this.settingsService=new sgt(this.checksumRoot,this.apiService),this.userStoryService=new G_t(this.apiService,this.checksumConfig),this.variableStoreService=new hGt,this.evaluatorService=new yGt(this.variableStoreService,this.settingsService,this.vtgTestFileMode,r,this.port),this.actionsService=new dJt(this.checksumConfig,this.checksumRoot,this.pageInteractor,this.apiService,this.userStoryService,this.actionsManager,this.testAssetsManager,this.webDriver,this.evaluatorService,this.vtgInternalFilesDir),this.assertionsService=new AJt(this.webDriver,this.actionsManager,this.evaluatorService),this.locatorsService=new FJt(this.webDriver,this.taskTimeMachine,this.apiService,this.userStoryService,this.evaluatorService),this.aiTestGenerationService=new _Jt(this.webDriver,this.pageInteractor,this.actionsService,this.actionsManager,this.apiService,this.userStoryService),this.aiAssertionsService=new xJt(this.actionsManager,this.apiService,this.userStoryService,this.taskTimeMachine,this.webDriver,this.evaluatorService,{logPerformance:V0.vtg.aiAssertions.logPerformance}),this.aiThoughtsService=new _Gt(this.actionsManager,this.apiService,this.userStoryService,this.taskTimeMachine,this.webDriver),this.storageService=new OWt(this.checksumConfig,this.userStoryService,this.apiService,this.actionsManager,this.testAssetsManager,this.actionsService,this.vtgTestFileRunConfig,this.evaluatorService,this.settingsService,this.taskTimeMachine),this.actionsManager.setStorageService(this.storageService),this.monacoService=new bGt,this.aiChatService=new prr(this.taskTimeMachine,this.evaluatorService)}buildServer(){this.reactAppServer=new oGt(this.actionsService,this.assertionsService,this.locatorsService,this.aiTestGenerationService,this.aiAssertionsService,this.aiThoughtsService,this.actionsManager,this.storageService,this.settingsService,this.monacoService,this.evaluatorService,this.aiChatService)}loadPlaywrightConfigForVTG(){try{let r=`${this.checksumRoot}/playwright.config.ts`;if((0,F3e.existsSync)(r)){let a=require(r).default;a&&(this.playwrightConfigForVTG=a)}}catch{tf.warning("Could not find playwright config file, will run with defaults")}}async getInitialServicesData(){switch(this.vtgMode){case"cloud":return this.getInitialServicesDataFromCloud();case"edit":return this.vtgTestFileMode?await this.getInitialServicesDataForEditedFile():this.getInitialServicesDataFromJSON("local");case"start":if(this.vtgTestFileRunConfig.restoreFromAutoSave)return this.getInitialServicesDataFromJSON("auto-save")}}getInitialServicesDataFromJSON(r){let a=this.storageService.getLocalSavedJSONFilePath(r,this.storyId),o=this.storageService.readLocalSavedDataFromJSONFile(a);if(!o)throw new Error(`No data found in ${r} while reading from ${a}`);return{actions:o.executedActions,storyId:o.story.id}}async getInitialServicesDataFromCloud(){let a=await(await this.apiService.post(`test-generation/${this.cloudTestGenerationId}/info`)).json(),{actionsDownloadSignedURL:o}=a,c=await fetch(o,{mode:"cors",credentials:"same-origin",headers:{"Content-Type":"application/json"}});if(!c.ok)throw new Error(`HTTP error! Status: ${c.status}`);let f=await c.json();return{actions:this.initializeTestStepsWithIds(f),storyId:a.story.id}}initializeTestStepsWithIds(r){return r.map((a,o)=>({...a,id:(0,Chn.randomUUID)(),assertions:(a.assertions??[]).map(c=>({...c,id:(0,Chn.randomUUID)()}))}))}async getInitialServicesDataForEditedFile(){var a,o,c,f,_,v,C;if(((a=this.vtgTestFileRunConfig)==null?void 0:a.mode)!=="edit")return;let r=[];if(!this.vtgTestFileRunConfig.restoreFromAutoSave){let w=(o=this.vtgTestFileRunConfig)==null?void 0:o.actionsJsonFilePath;r=this.storageService.readJsonFile(w),(0,F3e.rmSync)(w,{force:!0}),r=this.initializeTestStepsWithIds(r)}if((c=this.vtgTestFileRunConfig)!=null&&c.internalTestId)try{let w=await this.apiService.post(`test-generation-by-internal-test-id/${(f=this.vtgTestFileRunConfig)==null?void 0:f.internalTestId}/info`);if(!w.ok){let k=w.statusText;try{let R=await w.text();try{k=JSON.parse(R).message||R||w.statusText}catch{k=R||w.statusText}}catch{k="Test id not found or invalid"}throw new Error(`Error fetching test generation data: ${k}`)}let T=await w.json();if(this.vtgTestFileRunConfig.restoreFromAutoSave){let k=this.storageService.getLocalSavedJSONFilePath("auto-save"),R=this.storageService.readLocalSavedDataFromJSONFile(k);if(!R)throw new Error(`No data found in auto-save while reading from ${k}`);r=R==null?void 0:R.executedActions}return{actions:r,storyId:T.story.id,testGenerationData:T.testGenerationData}}catch{tf.warning(`Could not find data matching internal test id: ${(_=this.vtgTestFileRunConfig)==null?void 0:_.internalTestId}`)}if((v=this.vtgTestFileRunConfig)!=null&&v.storyId)return{actions:r,storyId:(C=this.vtgTestFileRunConfig)==null?void 0:C.storyId};throw new Error("Cannot edit file without either valid internal test id or story id")}async start({createAssetsFolder:r=!0}={}){var o,c;await this.userStoryService.fetchStory(this.storyId),r&&this.testAssetsManager.createTestAssetsFolders(),this.testAssetsManager.createTestGenerationLocalAutoSaveFolder(),await this.reactAppServer.start();let{environment:a}=this.userStoryService.getEnvInfo();await this.webDriver.prepare({baseURL:a.baseURL,shutdown:!this.vtgTestFileMode},{serverPort:await this.reactAppServer.getPort()}),V0.vtg.writeLogFile&&this.setupFrontendLogging(this.webDriver.page),await this.webDriver.page.evaluate(()=>{"checksumRRWeb"in window&&console.log(`Using forked rrweb. ${JSON.stringify(window.checksumRRWeb)}`)}),await this.webDriver.addHARMockAPIRecordings(this.testAssetsManager.getHarFilePath()),await this.initTimeMachine(),this.pageInteractor.init(),this.assertionsService.setPage(this.webDriver.appMainFrame.page()),this.actionsService.setPage(this.webDriver.appMainFrame.page()),this.evaluatorService.setPage(this.webDriver.appMainFrame.page()),this.aiChatService.setPage(this.webDriver.appMainFrame.page()),await this.taskTimeMachine.prepare(this.webDriver.appMainFrame,void 0,f=>this.webDriver.registerTimeMachineFrame(f)),await this.reactAppServer.evaluateServerPort(this.webDriver.page),await this.webDriver.appMainFrame.goto("about:blank",{waitUntil:"domcontentloaded",timeout:0}),await this.webDriver.getTimeMachine().toggleTimeMachineHandleEvents(!1),this.vtgMode==="start"&&!this.vtgTestFileRunConfig.restoreFromAutoSave&&(await this.actionsService.addInitialLoginAction(),await this.actionsService.addStartURLNavigationAction(),this.vtgTestFileMode&&await this.storageService.saveTestFile()),tf.info("VTG is ready with story:",{goal:(o=this.userStoryService.getStory())==null?void 0:o.goal}),await this.webDriver.page.evaluate(({localSaveFolderPath:f,stepsData:_,appViewport:v,userStoryGoal:C,isLoadedFromFile:w})=>{window.vtg.initClient(f,_,v,this.checksumRuntimeVersion,C,w)},{localSaveFolderPath:this.editLocationPath,stepsData:await this.actionsManager.buildStepDataWithCode(this.actionsManager.actions,{loadingFromFile:["edit","cloud"].includes(this.vtgMode)}),appViewport:this.webDriver.getApplicationViewport(),userStoryGoal:(c=this.userStoryService.getStory())==null?void 0:c.goal,isLoadedFromFile:this.vtgTestFileMode}),this.vtgTestFileMode||await new Promise(()=>{})}getTimeoutParams(){var o,c,f,_;let r=((c=(o=this.playwrightConfigForVTG)==null?void 0:o.use)==null?void 0:c.navigationTimeout)||3e4,a=((_=(f=this.playwrightConfigForVTG)==null?void 0:f.use)==null?void 0:_.actionTimeout)||5e3;return{navigationTimeout:r,actionTimeout:a}}getPlaywrightProxySettings(){var f,_;let r=(_=(f=this.playwrightConfigForVTG)==null?void 0:f.use)==null?void 0:_.proxy,{server:a,username:o,password:c}=r||{};if(o&&c&&a)return{username:o,password:c,server:a}}getPlaywrightViewportSettings(){var o,c;let{width:r=1280,height:a=720}=((c=(o=this.playwrightConfigForVTG)==null?void 0:o.use)==null?void 0:c.viewport)||{};return{width:r,height:a}}buildWebDriver(r){var c,f,_,v,C,w;let a=this.getPlaywrightProxySettings(),o=this.getPlaywrightViewportSettings();return new fGt({scriptSource:V0.checksumScript.source,scriptURL:V0.checksumScript.url,scriptFile:V0.checksumScript.path,isScriptFileAbsolute:!0,fullScreenResolution:!1,hostWindowViewport:!0,baseURL:(c=this.checksumConfig.environments.find(T=>T.default))==null?void 0:c.baseURL,useProxy:!!a,webProxy:a,disableWebSecurity:!0,allowFileAccess:!0,remoteDebugging:V0.vtg.remoteDebugging,remoteDebuggingPort:V0.vtg.vtgRemoteDebuggingPort},{devtools:!1,headless:V0.CI},{frontendAppSpecificRules:{},frontendTestGenerationConfig:{logPrefix:"$checksum"},viewport:o,completeOriginHeaderOnLivePage:!V0.vtg.isSeparateProcess&&!((v=(_=(f=this.checksumConfig.options)==null?void 0:f.modelConfig)==null?void 0:_.browserArgs)!=null&&v.skipDisableWebSecurity)&&!((w=(C=this.checksumConfig.options)==null?void 0:C.modelConfig)!=null&&w.skipCompleteOriginHeaderOnDisableWebSecurity)},r)}async onWebDriverContextClose(){var r,a,o;this.evaluatorService.stopListening(),(r=this.vtgTestFileRunConfig)!=null&&r.evalFilePath&&(0,F3e.rmSync)((a=this.vtgTestFileRunConfig)==null?void 0:a.evalFilePath,{force:!0}),this.vtgTestFileRunConfig.mode==="edit"&&(0,F3e.rmSync)((o=this.vtgTestFileRunConfig)==null?void 0:o.actionsJsonFilePath,{force:!0})}initializeAccordingToVTGMode(r){var c;let a=r.indexOf("--edit"),o=r.indexOf("--cloud");if(r.indexOf("--test-file")!==-1){this.vtgTestFileMode=!0,this.vtgTestFileRunConfig=JSON.parse(process.env.CHECKSUM_VTG_TEST_FILE_RUN_CONFIG),this.vtgMode=this.vtgTestFileRunConfig.mode,this.storyId=((c=this.vtgTestFileRunConfig)==null?void 0:c.mode)==="start"?this.vtgTestFileRunConfig.storyId:void 0;return}a!==-1&&(this.vtgMode="edit",this.editLocationPath=r[a+1]),o!==-1&&(this.vtgMode="cloud",this.cloudTestGenerationId=r[o+1]),this.vtgMode==="start"&&(this.storyId=r[0])}getWebDriver(){return this.webDriver}async eval(r){return this.evaluatorService.listenForExecution(r)}};e(whn,"VisualTestGenerator");var frr=whn;Eve();var iEi=require("child_process"),Dhn=require("net");vT();var aEi=require("path");v7();var nEi=sf(vht());fQ();var Shn=e(async(i,t,r,a,o={})=>{let{preventDialogFromAutoDismissing:c=!1,retry:f=!0,maxRetries:_=void 0,numberOfRetries:v=0}=o;try{console.log(`${i} attempting to connect to ${t} on port ${r}...`);let w=(await nEi.chromium.connectOverCDP("http://127.0.0.1:"+r)).contexts()[0],T=a(w.pages());for(;!T;)await TA(1e3),T=a(w.pages());return console.log(`${i} is connected to ${t} on port ${r}`,T.url()),c&&bzt(T),T}catch(C){if(!f||_&&v>=_)throw console.error(`${i} failed to connect to ${t}, retries were exhausted or disabled`,C),C;return console.log(`${i} is waiting and retrying connection to ${t} on port ${r}...`),await TA(1e3),Shn(i,t,r,a,{...o,numberOfRetries:v+1})}},"connectToPage");qw();var Thn=class Thn{constructor(t){this.checksumConfig=t;this.isReady=!1;this.onMessage=e(async(t,r)=>{let{id:a,err:o,result:c}=await this.execute(t);r.write(this.messageParser.makeMessage(JSON.stringify({id:a,err:this.serializedErr(o),result:c})))},"onMessage");this.messageParser=new BGe(this.onMessage),this.isReadyPromise=new Promise(r=>{this.isReadyResolve=r}),this.routeInterceptor=new qWe({completeOriginHeader:!0})}async eval(t){return this.listenForExecution(t)}async run(t){this.liveAppPage=t,await this.applyRouteInterceptorsIfNecessary(),await this.createServer(),this.startRunner()}async applyRouteInterceptorsIfNecessary(){var r,a,o,c,f,_;if(!((o=(a=(r=this.checksumConfig.options)==null?void 0:r.modelConfig)==null?void 0:a.browserArgs)!=null&&o.skipDisableWebSecurity)&&!((f=(c=this.checksumConfig.options)==null?void 0:c.modelConfig)!=null&&f.skipCompleteOriginHeaderOnDisableWebSecurity))try{await((_=this.liveAppPage)==null?void 0:_.route("**/*",async(v,C)=>this.routeInterceptor.intercept(v,C,{page:this.liveAppPage},{completeOriginHeader:!0})))}catch(v){tf.error("[WebDriver] applyRouteInterceptors error",v)}}startRunner(){let t=V0.isRepoMode?"yarn vtg-pw-bridge":`ts-node ${(0,aEi.join)(__dirname,"vtg-pw-bridge-runner.js")}`;Yes(t,{CHECKSUM_PORT:this.port.toString(),CHECKSUM_CONFIG:JSON.stringify(this.checksumConfig)})}async createServer(){this.server=(0,Dhn.createServer)(t=>{t.on("data",async r=>{try{await this.messageParser.onMessage(t,r)}catch(a){t.write(JSON.stringify({err:a.message}))}}),t.on("end",()=>{}),t.on("error",r=>{}),this.connectToVTG()}),this.port=await this.acquirePortNumber(),this.server.listen(this.port,()=>tf.info(`VTG PW Bridge Server listening on port ${this.port}...`))}serializedErr(t){return t&&JSON.stringify(t,Object.getOwnPropertyNames(t))}async connectToVTG(){tf.info("[VTG PW Bridge] Connecting to VTG...");let t=e(r=>r.frames().find(a=>a.name()==="time-machine-iframe"),"findTimeMachineIframe");this.vtgPage=await this.connectToPage("VTG page",V0.vtg.vtgRemoteDebuggingPort,r=>r.find(a=>t(a))),this.vtgTimeMachineFrame=t(this.vtgPage),this.taskTimeMachinePage=await this.connectToPage("Task Time Machine page",V0.vtg.taskTimeMachine.debugPort,r=>r[0]),tf.info("[VTG PW Bridge] Connected to VTG."),this.isReady=!0,this.isReadyResolve()}async connectToPage(t,r,a){return Shn("Playwright via Bridge",t,r,a,{preventDialogFromAutoDismissing:!0})}async acquirePortNumber(){return await new Promise((t,r)=>{let a=(0,Dhn.createServer)();a.unref(),a.on("error",r),a.listen(0,()=>{let o=a.address().port;a.close(()=>{t(o)})})})}async listenForExecution(t){return new Promise(r=>{this.resolveEvaluator=r,this.listener=t})}stopListening(){var t;(t=this.resolveEvaluator)==null||t.call(this)}buildContext(t){let{frame:r,expectConfig:a}=t,o={};switch(r){case"task-time-machine":o.page=this.taskTimeMachinePage.frameLocator("iframe");break;case"vtg-time-machine":o.page=this.vtgTimeMachineFrame.frameLocator("iframe");break;case"live":default:break}return a&&(o.expect=Jbe.expect.configure(a)),o}wrapCodeInContext(t,r){return`(async ({${Object.keys(r).join(", ")}}) => { ${t} })`}async execute(t){this.isReady||tf.warning("[VTG PW Bridge] Execute called before ready"),await this.isReadyPromise;let{id:r,code:a,options:o}=t,c=this.buildContext(o),f=this.wrapCodeInContext(a,c)+"(context)";return new Promise(_=>{this.listener&&this.listener(f,c,(v,C)=>{_({id:r,err:v,result:C})})})}};e(Thn,"VtgPwBridge");var drr=Thn;async function Yes(i,t={}){let r={...process.env,...t};(0,iEi.spawn)(i,{env:r,shell:!0,stdio:["inherit","inherit","inherit"],detached:!1}).on("exit",o=>{process.exit(o)})}e(Yes,"spawnCmd");var PEi=require("@playwright/test"),FEi=sf(IEi());var lae=class lae{constructor(t){this.options=t;this.importPluginPackages()}importPluginPackages(){lae.pw??(lae.pw=vht()),lae.StealthPlugin??(lae.StealthPlugin=require("puppeteer-extra-plugin-stealth"))}static createFreshInstance(){try{let{addExtra:t}=vht(),r=t(lae.pw.chromium);return console.log("[StealthProvider] Created fresh playwright-extra instance for testing"),r}catch(t){throw console.error("[StealthProvider] Error creating fresh instance:",t),t}}buildChromiumWithPlugins(t){let{project:r}=this.options,a=r.use.userAgent,o=r.use.playwrightExtra||[],c=lae.StealthPlugin();if(o.push(c),this.isCustomUserAgent(a)){c.enabledEvasions.delete("user-agent-override");let v=require("puppeteer-extra-plugin-stealth/evasions/user-agent-override")({userAgent:a});o.push(v)}let f=t??lae.pw.chromium;return o.forEach((_,v)=>{try{!(_ instanceof FEi.PuppeteerExtraPlugin)&&_!==c&&console.warn(`Plugin at index ${v} in the project's checksum.config.ts file is not an instance of PuppeteerExtraPlugin.`),f.use(_)}catch(C){console.warn(C)}}),f}isCustomUserAgent(t){return t?!Object.values(PEi.devices).some(r=>t===r.userAgent):!1}};e(lae,"StealthProvider");var hrr=lae;Mjt();function NEi(i,t){return{testSuiteRunId:t,appName:"generic-app",commitHash:"generic-commit-hash",envName:"generic-env-name",branch:"generic-branch",checksumRuntimeVersion:i}}e(NEi,"createDefaultTestSuiteRunInfo");var BEi=require("crypto");UVr();var N3e=class N3e{constructor(t,r){this.context=t;this.isVTG=r;this._pages={};this._pagesInProgress=new Map;this._testAssets=null;this.pageGuidMap=new WeakMap;this.instanceId=++N3e.instanceCounter,this.setContextProxy()}static makeContext(t,r){return new N3e(t,r).proxy}_rawContext(){return this.context}setTestAssets(t){this._testAssets=t,this.setupPageListener()}getTestAssets(){return this._testAssets}cleanup(){this._pagesInProgress.clear(),this._pages={}}async newPage(){let t=await this.context.newPage();return await this.makePage(t)}async makePage(t){if(t._isChecksumPage===!0)return t;if(t.isClosed())throw new Error("Cannot initialize closed page");let r=this.getPageGuid(t);if(this.hasPage(r))return this.getPageByGuid(r);if(this._pagesInProgress.has(r))return this._pagesInProgress.get(r);let a=this._createPageInstance(t);this._pagesInProgress.set(r,a);try{let o=await a;return this._pagesInProgress.delete(r),this.addPage(o),o}catch(o){throw this._pagesInProgress.delete(r),o}}addPage(t){let r=this.getPageGuid(t);this._pages[r]=t,t.once("close",()=>{this.removePage(r)})}removePage(t){this._pages[t]&&delete this._pages[t]}async _createPageInstance(t){if(t.isClosed())throw new Error("Cannot initialize page: Page has already been closed");if(this._testAssets)try{return await vzt.init(t,this.proxy,this._testAssets.testRunAnalytics,this._testAssets.monitorBridge,this._testAssets.variableStore,this._testAssets.testInfo,this._testAssets.checksumTestId,this._testAssets.test,this._testAssets.config,this._testAssets.isReplMode)}catch(r){throw new Error(`Failed to initialize RuntimePage: ${r instanceof Error?r.message:String(r)}. Test assets must be properly configured.`)}throw new Error("Cannot create page: Test assets not set. Use setTestAssets() before creating pages.")}setContextProxy(){this.proxy=new Proxy(this,{get:e(function(r,a){return r.getContextMethod(a)},"get")})}setupPageListener(){this.context.on("page",async t=>{try{if(t.isClosed())return;await this.makePage(t)}catch(r){let a=r instanceof Error?r.message:String(r);if(a.includes("Page has already been closed")||a.includes("Target page, context or browser has been closed")){console.debug("[ChecksumBrowserContext] Skipping initialization of closed page");return}throw console.error("[ChecksumBrowserContext] Failed to initialize page created by application:",r),r}})}getPageGuid(t){let r=this.pageGuidMap.get(t);return r||(r=`page@checksumctx_${this.instanceId}_${++N3e.guidCounter}`,this.pageGuidMap.set(t,r)),r}getPageByGuid(t){return this._pages[t]}hasPage(t){return t in this._pages}getAllPages(){return Object.values(this._pages)}getContextMethod(t){if(t in this){let a=this[t];return typeof a=="function"?a.bind(this):a}let r=this.context[t];return typeof r=="function"?r.bind(this.context):r}pages(){return this.getAllPages()}getPage(t){let r=this.getAllPages(),a=r[t];if(!a)throw new Error(`Page with index ${t} not found. Total pages: ${r.length}`);return a}};e(N3e,"ChecksumBrowserContext"),N3e.instanceCounter=0,N3e.guidCounter=0;var grr=N3e;var Nhn={},pZe=!!process.env.CHECKSUM_VTG_TEST_FILE_RUN_CONFIG,REi=e((i,t,r={},a=!1)=>{let{runMode:o,environments:c}=t,f=c.find(v=>v.default),_=i.extend({baseURL:f.baseURL,bypassCSP:!0,...pZe?{trace:"off",video:"off",screenshot:"off",ignoreHTTPSErrors:!0}:{},permissions:e(async({},v,C)=>{if(!pZe)await v(C.project.use.permissions);else{let w=new Set(C.project.use.permissions);w.add("clipboard-read"),w.add("clipboard-write"),w.add("camera"),w.add("storage-access"),w.add("notifications"),w.add("geolocation"),w.add("microphone"),await v(Array.from(w))}},"permissions"),proxy:e(async({proxy:v},C)=>{v?await C({...v,bypass:"127.0.0.1,localhost"}):await C(v)},"proxy"),browser:e(async({browser:v,browserName:C,launchOptions:w},T,k)=>{let R=e(()=>(k.project.use.playwrightExtra||[]).some(X=>X.constructor.name==="StealthPlugin"),"checkIfStealthPluginExists"),B=e(async()=>{let W=await(await new hrr({project:k.project}).buildChromiumWithPlugins()).launch(w);await T(W)},"launchBrowserWithStealthPlugin");pZe?V0.vtg.isSeparateProcess?await T(v):R()?(console.log("StealthPlugin already configured"),await T(v)):await B():V0.useRemoteDebugging.enabled&&R()?await B():await T(v)},"browser"),launchOptions:e(async({launchOptions:v},C)=>{var k;let w=v!=null&&v.args?[...v.args]:[],T=e(R=>{w.includes(R)||w.push(R)},"pushArg");if(r.useMockData&&T("--disable-web-security"),V0.bypassProxyForLocalhost&&T("--proxy-bypass-list=localhost,127.0.0.1"),pZe){T("--proxy-bypass-list=localhost,127.0.0.1"),V0.vtg.isSeparateProcess&&T(`--remote-debugging-port=${V0.vtg.appRemoteDebuggingPort}`);let R=((k=r.modelConfig)==null?void 0:k.browserArgs)??{};R.skipDisableWebSecurity||T("--disable-web-security"),R.skipAllowFileAccessFromFiles||T("--allow-file-access-from-files"),R.skipDisableSiteIsolationTrials||T("--disable-site-isolation-trials"),R.skipAllowRunningInsecureContent||T("--allow-running-insecure-content")}V0.useRemoteDebugging.enabled&&T(`--remote-debugging-port=${V0.useRemoteDebugging.port}`),await C({...v,args:w})},"launchOptions"),variableStore:e(async({},v)=>{let C=new yWe;await v(C)},"variableStore"),vs:e(async({variableStore:v},C)=>{await C(v)},"vs"),variablesStore:e(async({variableStore:v},C)=>{await C(v)},"variablesStore"),testRunAnalytics:e(async({},v,C)=>{let w=(()=>{try{if(process.env.CHECKSUM_TEST_SUITE_INFO)return JSON.parse(process.env.CHECKSUM_TEST_SUITE_INFO);throw new Error("Missing Checksum test suite info")}catch{return console.warn("\u26A0\uFE0F Warning: It seems like you ran the test suite directly via Playwright. This can lead to degraded functionality and unexpected issues. To ensure a fully supported and stable test run, please use: 'npx checksumai test'."),NEi("playwright-run-version-unknown",(0,BEi.randomUUID)())}})(),T=OEi(C),k=rie.getTestRunInstance({...w,checksumTestId:T},process.env.CHECKSUM_ISOLATED_MODE==="true",C);await v(k)},"testRunAnalytics"),monitorBridge:[async({},v,C)=>{let w=new wzt(C);await v(w)},{scope:"worker"}],context:e(async({context:v,monitorBridge:C,variableStore:w,testRunAnalytics:T},k,R)=>{let B=grr.makeContext(v,pZe);B.setTestAssets({testRunAnalytics:T,monitorBridge:C,variableStore:w,testInfo:R,checksumTestId:OEi(R),test:_,config:t,isReplMode:a}),await k(B),B.cleanup()},"context"),page:e(async({page:v,context:C},w,T)=>{let k=await C.makePage(v);Object.defineProperty(k.constructor,"name",{value:"Page"}),await w(k),k&&typeof k.onTestComplete=="function"&&await k.onTestComplete(T.status==="passed"),k&&typeof k.shutdown=="function"&&await k.shutdown()},"page"),vtg:e(async({page:v},C)=>{if(!pZe)C(null);else if(V0.vtg.isSeparateProcess){let w=new drr(t);await w.run(v),await C(w)}else{let w=new frr(["--test-file"],!1,t);await w.run(v),await C(w)}},"vtg")});return{test:_,defineChecksumTest:dts}},"createChecksumTestExtension"),dts=e((i,t,r)=>{let o=new Error().stack.split(`
|
|
2044
2044
|
`).filter(c=>c.includes(".checksum.spec.ts"))[0];if(!o)throw new Error("Could not locate test location. Make sure test is run from valid checksum test file");return Nhn[o]=t,i},"defineChecksumTest");function OEi(i){let{file:t,line:r}=i,a=Object.keys(Nhn).filter(c=>c.trim().includes(t.trim()));if(!a.length)return;let o=4;for(let c=0;c<o;c++)for(let f of a){let _;try{_=parseInt(f.split(":").reverse()[1])}catch{continue}if(_-c===parseInt(r))return Nhn[f]}}e(OEi,"getCurrentTestIdFromMapping");fQ();JH();jne();fQ();var mts=["toPass"],_ts=["toBeOK"],hts=["toBeAttached","toBeChecked","toBeDisabled","toBeEditable","toBeEmpty","toBeEnabled","toBeFocused","toBeHidden","toBeInViewport","toBeVisible","toContainClass","toContainText","toHaveAccessibleDescription","toHaveAccessibleErrorMessage","toHaveAccessibleName","toHaveAttribute","toHaveClass","toHaveCount","toHaveCSS","toHaveId","toHaveJSProperty","toHaveRole","toHaveScreenshot","toHaveText","toHaveValue","toHaveValues","toMatchAriaSnapshot"],gts=["toHaveScreenshot","toHaveTitle","toHaveURL"],yts=["toMatchSnapshot"],vts=["toBe","toBeCloseTo","toBeDefined","toBeFalsy","toBeGreaterThan","toBeGreaterThanOrEqual","toBeInstanceOf","toBeLessThan","toBeLessThanOrEqual","toBeNaN","toBeNull","toBeTruthy","toBeUndefined","toContain","toContainEqual","toEqual","toHaveLength","toHaveProperty","toMatch","toMatchObject","toStrictEqual","toThrow","toThrowError"],LEi=[...vts,...yts],Nqo=[...mts,..._ts,...hts,...gts];var Ohn=class Ohn{constructor(t,r,a=!1,o=!1,c={}){this.page=t;this.soft=a;this.skipAutoRecovery=o;this.configuration=c;this.fallbackEnabled=!1;this.withChecksumAI=!1;this.withChecksumAIMatcher=e(async()=>{throw this.withChecksumAI=!0,new Error},"withChecksumAIMatcher");this.setThought(r)}setThought(t){var r,a;t&&(this.checksumAIThought=this.page.addNewThought(t,"assertion"),this.useChecksumAIOptions=(r=this.page.getRuntimeOptions())==null?void 0:r.useChecksumAI,(a=this.useChecksumAIOptions)!=null&&a.assertions&&(this.page.setAIFallback(t,"assertion"),this.fallbackEnabled=!0))}get(t,r,a){if(typeof r!="string")return t[r];if(r==="checksumAI")return o=>(this.setThought(o),a);if(r==="withChecksumAI"||typeof t[r]=="function"){let o=r==="withChecksumAI"?this.withChecksumAIMatcher:t[r];return(...c)=>LEi.includes(r)?o.call(t,...c):this.checksumAIThought?this.executeMatcherWithinStep(o,t,...c):this.executeMatcher(o,t,...c)}else{let o=t[r];return new Proxy(o,this)}}findNestedErrors(t,r){t.error&&t.infectParentStepsWithError&&r.push(t.error);for(let a of t.steps)this.findNestedErrors(a,r)}async callMatcher(t,r,...a){this.beforeMatcherCall();let o=t.call(r,...a),c=o instanceof Promise?await o:o;if(this.step){let f=[];if(this.step.error?f.push(this.step.error):this.findNestedErrors(this.step,f),f.length)throw f[0]}return c}executeMatcherWithinStep(t,r,...a){return this.page.step(this.checksumAIThought.thought,()=>this.callMatcher(t,r,...a).catch(this.onMatcherFailure.bind(this)),!1,{obtainStep:e(o=>this.step=o,"obtainStep")}).catch(o=>{if(!this.soft&&!(this.withChecksumAI&&o.message===B4e))throw o}).finally(this.afterMatcherExecute.bind(this))}async executeMatcher(t,r,...a){try{return await this.callMatcher(t,r,...a)}catch(o){await this.onMatcherFailure(o)}finally{this.afterMatcherExecute()}}beforeMatcherCall(){this.page.setExpectConfiguration(this.configuration)}afterMatcherExecute(){this.checksumAIThought=void 0,this.fallbackEnabled=!1,this.withChecksumAI=!1,this.page.resetFallbacks(),this.page.setExpectConfiguration(void 0)}shouldInitiateFallback(t){var a;return!(!this.fallbackEnabled||((a=t.matcherResult)==null?void 0:a.name)==="toHaveScreenshot"&&!this.useChecksumAIOptions.visualComparison)}async onMatcherFailure(t){var r,a;if(!this.shouldInitiateFallback(t))throw Dv("[onMatcherFailure] fallback disabled, continuing with error."),this.page.testRunAnalytics.testRunAssertionExecutionFailure({failedThought:(r=this.checksumAIThought)==null?void 0:r.thought,error:t.message,matcher:(a=t.matcherResult)==null?void 0:a.name}),t;if(Dv("[onMatcherFailure] initiating fallback sequence with thought:",this.checksumAIThought.thought),this.skipAutoRecovery){if(this.soft)return;throw t}try{await this.page.initiateFallbackSequence({type:"assertion",error:t,withChecksumAI:this.withChecksumAI,testInfo:this.page.testInfo})}catch(o){if(this.soft)return;throw o}throw this.soft=!0,t}};e(Ohn,"ExpectCallProxyHandler");var yrr=Ohn;var Yvt=class Yvt{constructor(t=void 0,r={}){this.page=t;this.configuration=r}get(t,r){return r==="setPage"?a=>{this.page=a}:r==="extend"?(...a)=>{let o=t.extend(...a);return new Proxy(o,this)}:r==="configure"?a=>{let o=t.configure(a);return new Proxy(o,new Yvt(this.page,{...this.configuration,...a}))}:r==="soft"?(...a)=>{let o=this.manipulateArgsAndExtractThought(a),c=t.soft(...a);return new Proxy(c,this.makeExpectCallProxyHandler(o,!0))}:r==="poll"?(...a)=>{let o=this.manipulateArgsAndExtractThought(a),c=t.poll(...a);return new Proxy(c,this.makeExpectCallProxyHandler(o))}:r==="skipAutoRecovery"?new Proxy(()=>{},{apply:e((o,c,f)=>{let _=this.manipulateArgsAndExtractThought(f),v=t.apply(c,f);return new Proxy(v,this.makeExpectCallProxyHandler(_,void 0,!0))},"apply"),get:e((o,c)=>new Proxy(t,new Yvt(this.page,{...this.configuration,skipAutoRecovery:!0}))[c],"get")}):t[r]instanceof Function?t[r].bind(t):t[r]}apply(t,r,a){let o=this.manipulateArgsAndExtractThought(a),c=t.apply(r,a);return new Proxy(c,this.makeExpectCallProxyHandler(o))}makeExpectCallProxyHandler(t,r,a){var o,c;return new yrr(this.page,t,r===!0?!0:(o=this.configuration)==null?void 0:o.soft,a===!0?!0:(c=this.configuration)==null?void 0:c.skipAutoRecovery,this.configuration)}manipulateArgsAndExtractThought(t){let r,a=t[1];if(typeof a=="string")r=a,t[1]=void 0;else if(typeof a=="object"){if(a.checksumAI===!1){t[1].checksumAI=void 0;return}a.checksumAI&&typeof a.checksumAI=="string"?(r=a.checksumAI,t[1].checksumAI=void 0):a.message&&(r=a.message,t[1].message=void 0)}return r}};e(Yvt,"ExpectProxyHandler");var vrr=Yvt;var xrr=class xrr{constructor(t){this.expect=t;this.proxy=new Proxy(this.expect,new vrr)}static init(t){return new xrr(t).proxy}};e(xrr,"ChecksumExpect");var brr=xrr;v7();var UEi=require("@playwright/test");fQ();var MEi=sf(bT()),Arr=require("fs");var Xvt=sf(require("path"));var bts=e(i=>{let t=H7e(i),r=new G7e(t),a=r1t();return r.transformSourceFile([new rNe(i),new nGe(i,a,{newRequireIdentifier:"checksumHotRequire",extraImportArguments:[MEi.factory.createIdentifier("__filename")]})]),`${iri}
|
|
2045
2045
|
${r.getTestFileCode().code}`},"transformFileToHoRequireFormat"),xts=e(i=>{let t=Xvt.default.dirname(i),a=Xvt.default.basename(i).split(".")[0],o=Math.random().toString(36).substring(2,15),c=Xvt.default.extname(i);return Xvt.default.join(t,`${a}-${Date.now()}-${o}${c}`)},"generateTempFilePath"),Ats=e((i,t)=>{let r=r1t();return new K7e(t,r).getResolvedPath(i)},"resolveFilePath"),Ets=e((i,t=__filename)=>{let r;try{let a=require.resolve(Ats(i,t)),o=bts(a);r=xts(a),(0,Arr.writeFileSync)(r,o);let c=require(r);return require.cache[a]=require.cache[r],c}catch(a){throw console.error("Error in require",a),a}finally{r&&(0,Arr.unlinkSync)(r)}},"checksumHotRequire"),jEi=Ets;Eve();function Cts(i){let t=sQt(),{options:r,apiKey:a,environments:o}=t,c=o.find(R=>R.default);if(!c)throw new Error("No default environment found. Please set the default field to true on one of the environments in the checksum.config.ts file.");if(!c.baseURL)throw new Error("A baseURL is required. Please set the baseURL field in the default environment in the checksum.config.ts file.");if(!c.users.find(R=>R.default))throw new Error("A default user within the default environment is required. Please set one of the default environment users as default in the checksum.config.ts file.");if(!a)throw new Error("An API key is required. Please set the apiKey field in the checksum.config.ts file.");let _=process.env.CHECKSUM_REPL==="true",{test:v,defineChecksumTest:C}=REi(i??UEi.test,t,r,_),w=brr.init(v.expect),T=wts();v._checksum={expect:w,checksumAI:T},_&&(console.log("Detected REPL mode"),v.beforeEach(async()=>{v.setTimeout(0)}),v.afterEach(async()=>{for(;;)await TA(1e3)}));let k=e(({name:R,userRole:B})=>{let{environment:U,user:W}=K_t(t,{environment:R,role:B},!0),X=MJn({config:t,throwIfEnvInfoInvalid:!0},{environmentName:U.name,userRole:W.role});return{environment:U,user:W,login:X}},"getEnvironment");return{test:v,expect:w,login:Ube({config:t}),defineChecksumTest:C,getEnvironment:k,checksumAI:T}}e(Cts,"init");var Bhn=e(i=>new Proxy(i,{apply:e(function(r,a,o){let c={...r.options,...o[2]};return r.page.checksumAI(o[0],o[1],c)},"apply"),get:e(function(r,a){return a==="withDialog"?(r.options.withDialog=!0,Bhn(i)):a==="skipAutoRecovery"?(r.options.skipAutoRecovery=!0,Bhn(i)):r[a]},"get"),set:e(function(r,a,o){if(a==="page")return r[a]=o},"set")}),"makeChecksumAIProxy"),wts=e(()=>{let i=e(function(){},"func");return i.page=void 0,i.options={withDialog:!1,withTomer:!1,skipAutoRecovery:!1},Bhn(i)},"makeChecksumAI");0&&(module.exports={AutoRecoveryMode,RunMode,checksumHotRequire,getChecksumConfig,getLogin,init});
|
|
2046
2046
|
/*! Bundled license information:
|