@mablhq/playwright-tools 2.49.1

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.
Files changed (436) hide show
  1. package/Globals.js +69 -0
  2. package/LICENSE.txt +29 -0
  3. package/README.md +219 -0
  4. package/api/ApiError.js +11 -0
  5. package/api/atlassian/bitBucketApiClient.js +81 -0
  6. package/api/atlassian/entities/CodeAnnotation.js +9 -0
  7. package/api/atlassian/entities/CodeReport.js +15 -0
  8. package/api/atlassian/entities/PullRequest.js +2 -0
  9. package/api/basicApiClient.js +293 -0
  10. package/api/entities/Browser.js +11 -0
  11. package/api/entities/Email.js +14 -0
  12. package/api/entities/FindStrategy.js +10 -0
  13. package/api/entities/Label.js +2 -0
  14. package/api/entities/VersionedObject.js +2 -0
  15. package/api/entities/Workspace.js +2 -0
  16. package/api/featureSet.js +44 -0
  17. package/api/mablApiClient.js +1070 -0
  18. package/api/mablApiClientFactory.js +79 -0
  19. package/api/types.js +10 -0
  20. package/auth/AuthClient.js +38 -0
  21. package/auth/OktaClient.js +97 -0
  22. package/browserEngines/browserEngine.js +41 -0
  23. package/browserEngines/browserEngines.js +14 -0
  24. package/browserEngines/chromiumBrowserEngine.js +177 -0
  25. package/browserEngines/firefoxBrowserEngine.js +134 -0
  26. package/browserEngines/unsupportedBrowserEngine.js +29 -0
  27. package/browserEngines/webkitBrowerEngine.js +50 -0
  28. package/browserLauncher/browser.js +2 -0
  29. package/browserLauncher/browserEvent.js +11 -0
  30. package/browserLauncher/browserLauncher.js +17 -0
  31. package/browserLauncher/browserLauncherEventEmitter.js +2 -0
  32. package/browserLauncher/browserLauncherFactory.js +30 -0
  33. package/browserLauncher/elementHandle.js +30 -0
  34. package/browserLauncher/errors.js +26 -0
  35. package/browserLauncher/frame.js +17 -0
  36. package/browserLauncher/frameBase.js +10 -0
  37. package/browserLauncher/httpRequest.js +2 -0
  38. package/browserLauncher/httpResponse.js +2 -0
  39. package/browserLauncher/jsHandle.js +2 -0
  40. package/browserLauncher/page.js +2 -0
  41. package/browserLauncher/pageEvent.js +17 -0
  42. package/browserLauncher/playwrightBrowserLauncher/browserDelegate.js +2 -0
  43. package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumBrowserDelegate.js +61 -0
  44. package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumElementHandleDelegate.js +129 -0
  45. package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumFrameDelegate.js +24 -0
  46. package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumPageDelegate.js +145 -0
  47. package/browserLauncher/playwrightBrowserLauncher/elementHandleDelegate.js +2 -0
  48. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxBrowserDelegate.js +50 -0
  49. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxElementHandleDelegate.js +11 -0
  50. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxFrameDelegate.js +36 -0
  51. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxPageDelegate.js +15 -0
  52. package/browserLauncher/playwrightBrowserLauncher/frameDelegate.js +2 -0
  53. package/browserLauncher/playwrightBrowserLauncher/internals.js +2 -0
  54. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractBrowserDelegate.js +15 -0
  55. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractElementHandleDelegate.js +73 -0
  56. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractFrameDelegate.js +13 -0
  57. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractPageDelegate.js +81 -0
  58. package/browserLauncher/playwrightBrowserLauncher/pageDelegate.js +2 -0
  59. package/browserLauncher/playwrightBrowserLauncher/playwrightApiResponse.js +18 -0
  60. package/browserLauncher/playwrightBrowserLauncher/playwrightBrowser.js +259 -0
  61. package/browserLauncher/playwrightBrowserLauncher/playwrightBrowserLauncher.js +97 -0
  62. package/browserLauncher/playwrightBrowserLauncher/playwrightDom.js +319 -0
  63. package/browserLauncher/playwrightBrowserLauncher/playwrightFrame.js +265 -0
  64. package/browserLauncher/playwrightBrowserLauncher/playwrightHttpRequest.js +76 -0
  65. package/browserLauncher/playwrightBrowserLauncher/playwrightHttpResponse.js +26 -0
  66. package/browserLauncher/playwrightBrowserLauncher/playwrightPage.js +377 -0
  67. package/browserLauncher/playwrightBrowserLauncher/simplePlaywrightLogger.js +36 -0
  68. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitBrowserDelegate.js +50 -0
  69. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitElementHandleDelegate.js +16 -0
  70. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitFrameDelegate.js +19 -0
  71. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitPageDelegate.js +15 -0
  72. package/browserLauncher/playwrightBrowserLauncher/wrappers.js +25 -0
  73. package/browserLauncher/types.js +28 -0
  74. package/browserLauncher/utils.js +9 -0
  75. package/cli.js +66 -0
  76. package/commands/applications/applications.js +5 -0
  77. package/commands/applications/applications_cmds/describe.js +21 -0
  78. package/commands/applications/applications_cmds/list.js +56 -0
  79. package/commands/auth/auth.js +5 -0
  80. package/commands/auth/auth_cmds/activate-key.js +38 -0
  81. package/commands/auth/auth_cmds/clear.js +10 -0
  82. package/commands/auth/auth_cmds/info.js +10 -0
  83. package/commands/auth/auth_cmds/login.js +10 -0
  84. package/commands/branches/branches.js +5 -0
  85. package/commands/branches/branches_cmds/create.js +56 -0
  86. package/commands/branches/branches_cmds/describe.js +50 -0
  87. package/commands/branches/branches_cmds/list.js +84 -0
  88. package/commands/branches/branches_cmds/merge.js +56 -0
  89. package/commands/browserTypes.js +20 -0
  90. package/commands/commandUtil/awaitCompletion.js +67 -0
  91. package/commands/commandUtil/branches.js +44 -0
  92. package/commands/commandUtil/codeInsights.js +181 -0
  93. package/commands/commandUtil/describe.js +32 -0
  94. package/commands/commandUtil/fileUtil.js +50 -0
  95. package/commands/commandUtil/interfaces.js +4 -0
  96. package/commands/commandUtil/list.js +70 -0
  97. package/commands/commandUtil/util.js +127 -0
  98. package/commands/commandUtil/versionUtil.js +33 -0
  99. package/commands/config/config.js +5 -0
  100. package/commands/config/config_cmds/configKeys.js +28 -0
  101. package/commands/config/config_cmds/delete.js +29 -0
  102. package/commands/config/config_cmds/get.js +52 -0
  103. package/commands/config/config_cmds/install.js +119 -0
  104. package/commands/config/config_cmds/list.js +39 -0
  105. package/commands/config/config_cmds/set.js +80 -0
  106. package/commands/constants.js +160 -0
  107. package/commands/credentials/credentials.js +5 -0
  108. package/commands/credentials/credentials_cmds/list.js +66 -0
  109. package/commands/datatables/datatables.js +5 -0
  110. package/commands/datatables/datatables_cmds/create.js +61 -0
  111. package/commands/datatables/datatables_cmds/describe.js +17 -0
  112. package/commands/datatables/datatables_cmds/export.js +86 -0
  113. package/commands/datatables/datatables_cmds/list.js +18 -0
  114. package/commands/datatables/datatables_cmds/scenarios.js +35 -0
  115. package/commands/datatables/datatables_cmds/update.js +120 -0
  116. package/commands/datatables/utils.js +145 -0
  117. package/commands/deploy/deploy.js +5 -0
  118. package/commands/deploy/deploy_cmds/awaitDeploymentCompletion.js +100 -0
  119. package/commands/deploy/deploy_cmds/create.js +342 -0
  120. package/commands/deploy/deploy_cmds/describe.js +54 -0
  121. package/commands/deploy/deploy_cmds/executionResultPresenter.js +117 -0
  122. package/commands/deploy/deploy_cmds/list.js +74 -0
  123. package/commands/deploy/deploy_cmds/watch.js +44 -0
  124. package/commands/environments/environments.js +5 -0
  125. package/commands/environments/environments_cmds/build-files.js +5 -0
  126. package/commands/environments/environments_cmds/build-files_cmds/add.js +73 -0
  127. package/commands/environments/environments_cmds/build-files_cmds/list.js +54 -0
  128. package/commands/environments/environments_cmds/build-files_cmds/update.js +71 -0
  129. package/commands/environments/environments_cmds/create.js +153 -0
  130. package/commands/environments/environments_cmds/delete.js +32 -0
  131. package/commands/environments/environments_cmds/describe.js +28 -0
  132. package/commands/environments/environments_cmds/list.js +56 -0
  133. package/commands/environments/environments_cmds/update.js +46 -0
  134. package/commands/environments/environments_cmds/urls.js +5 -0
  135. package/commands/environments/environments_cmds/urls_cmds/add.js +91 -0
  136. package/commands/environments/environments_cmds/urls_cmds/list.js +49 -0
  137. package/commands/flows/flows.js +5 -0
  138. package/commands/flows/flows_cmds/export.js +78 -0
  139. package/commands/flows/flows_cmds/list.js +64 -0
  140. package/commands/internal/internal.js +6 -0
  141. package/commands/link-agents/link-agents.js +5 -0
  142. package/commands/link-agents/link-agents_cmds/delete.js +38 -0
  143. package/commands/link-agents/link-agents_cmds/list.js +131 -0
  144. package/commands/link-agents/link-agents_cmds/terminate.js +31 -0
  145. package/commands/mobile-build-files/mobile-build-files.js +5 -0
  146. package/commands/mobile-build-files/mobile-build-files_cmds/delete.js +31 -0
  147. package/commands/mobile-build-files/mobile-build-files_cmds/download.js +50 -0
  148. package/commands/mobile-build-files/mobile-build-files_cmds/list.js +72 -0
  149. package/commands/mobile-build-files/mobile-build-files_cmds/upload.js +101 -0
  150. package/commands/plans/plans.js +5 -0
  151. package/commands/plans/plans_cmds/describe.js +23 -0
  152. package/commands/plans/plans_cmds/list.js +63 -0
  153. package/commands/test-runs/test-runs.js +5 -0
  154. package/commands/test-runs/test-runs_cmds/export.js +62 -0
  155. package/commands/tests/mobileEmulationUtil.js +46 -0
  156. package/commands/tests/tests.js +5 -0
  157. package/commands/tests/testsUtil.js +538 -0
  158. package/commands/tests/tests_cmds/create.js +130 -0
  159. package/commands/tests/tests_cmds/edit.js +111 -0
  160. package/commands/tests/tests_cmds/export.js +145 -0
  161. package/commands/tests/tests_cmds/import.js +5 -0
  162. package/commands/tests/tests_cmds/import_cmds/import_playwright.js +439 -0
  163. package/commands/tests/tests_cmds/import_cmds/import_selenium.js +295 -0
  164. package/commands/tests/tests_cmds/list.js +94 -0
  165. package/commands/tests/tests_cmds/run-cloud.js +314 -0
  166. package/commands/tests/tests_cmds/run-mobile.js +260 -0
  167. package/commands/tests/tests_cmds/run.js +314 -0
  168. package/commands/tests/tests_cmds/runUtils.js +60 -0
  169. package/commands/tests/tests_cmds/trainerUtil.js +12 -0
  170. package/commands/users/users.js +5 -0
  171. package/commands/users/users_cmds/list.js +58 -0
  172. package/commands/workspaces/workspace_cmds/copy.js +108 -0
  173. package/commands/workspaces/workspace_cmds/describe.js +21 -0
  174. package/commands/workspaces/workspace_cmds/list.js +67 -0
  175. package/commands/workspaces/workspaces.js +5 -0
  176. package/core/entityValidation/environmentsValidation.js +7 -0
  177. package/core/entityValidation/stepValidation.js +15 -0
  178. package/core/execution/ApiTestUtils.js +1060 -0
  179. package/core/execution/MailboxConstants.js +4 -0
  180. package/core/execution/PostmanUtils.js +53 -0
  181. package/core/execution/RunConfig.js +2 -0
  182. package/core/execution/TestResult.js +15 -0
  183. package/core/execution/VariableUtils.js +154 -0
  184. package/core/execution/VariablesSummary.js +2 -0
  185. package/core/execution/basic-types.js +2 -0
  186. package/core/execution/newman-types.js +42 -0
  187. package/core/messaging/actions/MobileTrainingActions.js +17 -0
  188. package/core/messaging/actions/pdfActions.js +27 -0
  189. package/core/messaging/actions/runnerActions.js +18 -0
  190. package/core/messaging/actions/trainingSessionActions.js +38 -0
  191. package/core/messaging/logLineMessaging.js +50 -0
  192. package/core/messaging/messaging.js +130 -0
  193. package/core/messaging/pageMessaging.js +9 -0
  194. package/core/trainer/openUtils.js +47 -0
  195. package/core/trainer/trainingSessions-types.js +35 -0
  196. package/core/trainer/trainingSessions.js +151 -0
  197. package/core/util.js +52 -0
  198. package/coreWebVitals/index.js +77 -0
  199. package/domUtil/index.js +1 -0
  200. package/env/defaultEnv.js +17 -0
  201. package/env/dev.js +17 -0
  202. package/env/env.js +76 -0
  203. package/env/local.js +17 -0
  204. package/env/prod.js +17 -0
  205. package/execution/index.js +8 -0
  206. package/execution/index.js.LICENSE.txt +254 -0
  207. package/execution/runAppiumServer.js +145 -0
  208. package/functions/apiTest/utils.js +47 -0
  209. package/functions/types.js +2 -0
  210. package/functions/utils.js +12 -0
  211. package/http/MablHttpAgent.js +73 -0
  212. package/http/RequestFilteringHttpAgent.js +119 -0
  213. package/http/RequestSecurityError.js +13 -0
  214. package/http/axiosProxyConfig.js +101 -0
  215. package/http/httpUtil.js +73 -0
  216. package/http/requestInterceptor.js +206 -0
  217. package/index.d.ts +241 -0
  218. package/index.js +14 -0
  219. package/mablApi/index.js +1 -0
  220. package/mablscript/MablAction.js +102 -0
  221. package/mablscript/MablStep.js +191 -0
  222. package/mablscript/MablStepV2.js +73 -0
  223. package/mablscript/MablSymbol.js +35 -0
  224. package/mablscript/actions/AwaitDownloadAction.js +14 -0
  225. package/mablscript/actions/AwaitPDFDownloadAction.js +19 -0
  226. package/mablscript/actions/ConditionAction.js +123 -0
  227. package/mablscript/actions/CountAction.js +16 -0
  228. package/mablscript/actions/ExtractAction.js +71 -0
  229. package/mablscript/actions/FindAction.js +301 -0
  230. package/mablscript/actions/GenerateEmailAddressAction.js +14 -0
  231. package/mablscript/actions/GenerateRandomStringAction.js +20 -0
  232. package/mablscript/actions/GetUrlAction.js +22 -0
  233. package/mablscript/actions/GetVariableValue.js +31 -0
  234. package/mablscript/actions/GetViewportAction.js +17 -0
  235. package/mablscript/actions/JavaScriptAction.js +219 -0
  236. package/mablscript/diffing/diffingUtil.js +229 -0
  237. package/mablscript/importer.js +576 -0
  238. package/mablscript/mobile/steps/CreateVariableMobileStep.js +53 -0
  239. package/mablscript/mobile/steps/EnterTextStep.js +45 -0
  240. package/mablscript/mobile/steps/HideKeyboardStep.js +20 -0
  241. package/mablscript/mobile/steps/InstallAppStep.js +22 -0
  242. package/mablscript/mobile/steps/NavigateBackStep.js +20 -0
  243. package/mablscript/mobile/steps/NavigateHomeStep.js +21 -0
  244. package/mablscript/mobile/steps/OpenAppStep.js +22 -0
  245. package/mablscript/mobile/steps/OpenLinkStep.js +19 -0
  246. package/mablscript/mobile/steps/PrepareSessionStep.js +19 -0
  247. package/mablscript/mobile/steps/PushFileStep.js +27 -0
  248. package/mablscript/mobile/steps/ScrollStep.js +87 -0
  249. package/mablscript/mobile/steps/SetOrientationStep.js +20 -0
  250. package/mablscript/mobile/steps/TapStep.js +37 -0
  251. package/mablscript/mobile/steps/UninstallAppStep.js +22 -0
  252. package/mablscript/mobile/steps/actions/MobileFindAction.js +23 -0
  253. package/mablscript/mobile/steps/stepUtil.js +113 -0
  254. package/mablscript/mobile/tests/StepTestsUtil.js +20 -0
  255. package/mablscript/mobile/tests/TestMobileFindDescriptors.js +282 -0
  256. package/mablscript/mobile/tests/steps/CreateVariableMobileStep.mobiletest.js +298 -0
  257. package/mablscript/mobile/tests/steps/EnterTextStep.mobiletest.js +79 -0
  258. package/mablscript/mobile/tests/steps/GeneralHumanization.mobiletest.js +304 -0
  259. package/mablscript/mobile/tests/steps/HideKeyboardStep.mobiletest.js +27 -0
  260. package/mablscript/mobile/tests/steps/InstallAppStep.mobiletest.js +20 -0
  261. package/mablscript/mobile/tests/steps/NavigateBackStep.mobiletest.js +27 -0
  262. package/mablscript/mobile/tests/steps/NavigateHomeStep.mobiletest.js +27 -0
  263. package/mablscript/mobile/tests/steps/OpenLinkStep.mobiletest.js +20 -0
  264. package/mablscript/mobile/tests/steps/PushFileStep.mobiletest.js +55 -0
  265. package/mablscript/mobile/tests/steps/ScrollStep.mobiletest.js +386 -0
  266. package/mablscript/mobile/tests/steps/SetOrientationStep.mobiletest.js +32 -0
  267. package/mablscript/mobile/tests/steps/TapStep.mobiletest.js +57 -0
  268. package/mablscript/mobile/tests/steps/UninstallAppStep.mobiletest.js +20 -0
  269. package/mablscript/steps/AbstractAssertionsAndVariablesStep.js +52 -0
  270. package/mablscript/steps/AccessibilityCheck.js +108 -0
  271. package/mablscript/steps/ActionsUtils.js +18 -0
  272. package/mablscript/steps/AssertStep.js +318 -0
  273. package/mablscript/steps/AssertStepOld.js +159 -0
  274. package/mablscript/steps/AwaitTabStep.js +69 -0
  275. package/mablscript/steps/AwaitUploadsStep.js +26 -0
  276. package/mablscript/steps/ClearCookiesStep.js +26 -0
  277. package/mablscript/steps/ClickAndHoldStep.js +76 -0
  278. package/mablscript/steps/ClickStep.js +58 -0
  279. package/mablscript/steps/CookieUtils.js +54 -0
  280. package/mablscript/steps/CreateVariableStep.js +236 -0
  281. package/mablscript/steps/DatabaseQueryStep.js +28 -0
  282. package/mablscript/steps/DoubleClickStep.js +64 -0
  283. package/mablscript/steps/DownloadStep.js +96 -0
  284. package/mablscript/steps/EchoStep.js +34 -0
  285. package/mablscript/steps/ElseIfConditionStep.js +32 -0
  286. package/mablscript/steps/ElseStep.js +27 -0
  287. package/mablscript/steps/EndStep.js +27 -0
  288. package/mablscript/steps/EnterAuthCodeStep.js +59 -0
  289. package/mablscript/steps/EnterTextStep.js +96 -0
  290. package/mablscript/steps/EvaluateFlowStep.js +51 -0
  291. package/mablscript/steps/EvaluateJavaScriptStep.js +50 -0
  292. package/mablscript/steps/HoverStep.js +63 -0
  293. package/mablscript/steps/IfConditionStep.js +191 -0
  294. package/mablscript/steps/NavigateStep.js +30 -0
  295. package/mablscript/steps/OpenEmailStep.js +46 -0
  296. package/mablscript/steps/ReleaseStep.js +76 -0
  297. package/mablscript/steps/RemoveCookieStep.js +36 -0
  298. package/mablscript/steps/RightClickStep.js +58 -0
  299. package/mablscript/steps/SelectStep.js +82 -0
  300. package/mablscript/steps/SendHttpRequestStep.js +48 -0
  301. package/mablscript/steps/SendKeyStep.js +84 -0
  302. package/mablscript/steps/SetCookieStep.js +70 -0
  303. package/mablscript/steps/SetFilesStep.js +71 -0
  304. package/mablscript/steps/SetViewportStep.js +38 -0
  305. package/mablscript/steps/SwitchContextStep.js +122 -0
  306. package/mablscript/steps/SyntheticStep.js +20 -0
  307. package/mablscript/steps/VisitUrlStep.js +68 -0
  308. package/mablscript/steps/WaitStep.js +37 -0
  309. package/mablscript/steps/WaitUntilStep.js +46 -0
  310. package/mablscript/types/AccessibilityCheckStepDescriptor.js +2 -0
  311. package/mablscript/types/AccessibilityCheckTypes.js +9 -0
  312. package/mablscript/types/AssertionsAndVariablesStepDescriptor.js +2 -0
  313. package/mablscript/types/AwaitTabDescriptor.js +2 -0
  314. package/mablscript/types/AwaitUploadStepDescriptor.js +2 -0
  315. package/mablscript/types/ClearCookiesStepDescriptor.js +2 -0
  316. package/mablscript/types/ClickAndHoldStepDescriptor.js +2 -0
  317. package/mablscript/types/ClickStepDescriptor.js +2 -0
  318. package/mablscript/types/ConditionDescriptor.js +133 -0
  319. package/mablscript/types/CountDescriptor.js +2 -0
  320. package/mablscript/types/CreateVariableStepDescriptor.js +12 -0
  321. package/mablscript/types/DownloadStepDescriptor.js +2 -0
  322. package/mablscript/types/EchoStepDescriptor.js +2 -0
  323. package/mablscript/types/EnterTextStepDescriptor.js +2 -0
  324. package/mablscript/types/EvaluateFlowStepDescriptor.js +2 -0
  325. package/mablscript/types/EvaluateJavaScriptStepDescriptor.js +2 -0
  326. package/mablscript/types/ExtractDescriptor.js +21 -0
  327. package/mablscript/types/GetCurrentLocationDescriptor.js +12 -0
  328. package/mablscript/types/GetVariableDescriptor.js +16 -0
  329. package/mablscript/types/GetViewportDescriptor.js +12 -0
  330. package/mablscript/types/HoverStepDescriptor.js +2 -0
  331. package/mablscript/types/NavigateStepDescriptor.js +7 -0
  332. package/mablscript/types/OpenEmailStepDescriptor.js +2 -0
  333. package/mablscript/types/OperatingSystemDescriptor.js +45 -0
  334. package/mablscript/types/ReleaseStepDescriptor.js +7 -0
  335. package/mablscript/types/RemoveCookieStepDescriptor.js +2 -0
  336. package/mablscript/types/SelectStepDescriptor.js +2 -0
  337. package/mablscript/types/SendHttpRequestTypes.js +2 -0
  338. package/mablscript/types/SendKeyStepDescriptor.js +30 -0
  339. package/mablscript/types/SetCookieStepDescriptor.js +2 -0
  340. package/mablscript/types/SetFilesStepDescriptor.js +2 -0
  341. package/mablscript/types/SetViewportStepDescriptor.js +2 -0
  342. package/mablscript/types/SnippetsDescriptor.js +36 -0
  343. package/mablscript/types/StepDescriptor.js +2 -0
  344. package/mablscript/types/SwitchContextStepDescriptor.js +15 -0
  345. package/mablscript/types/VariableNamespace.js +17 -0
  346. package/mablscript/types/VisitUrlStepDescriptor.js +2 -0
  347. package/mablscript/types/WaitStepDescriptor.js +2 -0
  348. package/mablscript/types/WaitUntilStepDescriptor.js +2 -0
  349. package/mablscript/types/mobile/CreateVariableMobileStepDescriptor.js +9 -0
  350. package/mablscript/types/mobile/EnterTextStepDescriptor.js +2 -0
  351. package/mablscript/types/mobile/HideKeyboardStepDescriptor.js +2 -0
  352. package/mablscript/types/mobile/InstallAppStepDescriptor.js +2 -0
  353. package/mablscript/types/mobile/NavigateBackStepDescriptor.js +2 -0
  354. package/mablscript/types/mobile/NavigateHomeStepDescriptor.js +2 -0
  355. package/mablscript/types/mobile/OpenAppStepDescriptor.js +2 -0
  356. package/mablscript/types/mobile/OpenLinkStepDescriptor.js +2 -0
  357. package/mablscript/types/mobile/PrepareSessionStepDescriptor.js +2 -0
  358. package/mablscript/types/mobile/PushFileDescriptor.js +2 -0
  359. package/mablscript/types/mobile/ScrollStepDescriptor.js +32 -0
  360. package/mablscript/types/mobile/SetOrientationStepDescriptor.js +8 -0
  361. package/mablscript/types/mobile/StepWithMobileFindDescriptor.js +8 -0
  362. package/mablscript/types/mobile/TapStepDescriptor.js +8 -0
  363. package/mablscript/types/mobile/UninstallAppStepDescriptor.js +2 -0
  364. package/mablscriptFind/index.js +2 -0
  365. package/mablscriptFind/index.js.LICENSE.txt +25 -0
  366. package/middleware.js +42 -0
  367. package/mobile/index.js +2 -0
  368. package/mobile/types.js +8 -0
  369. package/observers/ObserverBase.js +11 -0
  370. package/observers/mockObserver.js +47 -0
  371. package/package.json +107 -0
  372. package/popupDismissal/candidate.js +2 -0
  373. package/popupDismissal/index.js +255 -0
  374. package/providers/authenticationProvider.js +254 -0
  375. package/providers/cliConfigProvider.js +271 -0
  376. package/providers/exportRequestProvider.js +196 -0
  377. package/providers/logging/loggingProvider.js +90 -0
  378. package/providers/scmContextInterfaces.js +14 -0
  379. package/providers/scmContextProvider.js +335 -0
  380. package/providers/scmContextProviderV2.js +122 -0
  381. package/providers/types.js +9 -0
  382. package/proxy/index.js +2 -0
  383. package/proxy/index.js.LICENSE.txt +12 -0
  384. package/proxy/lib/xpath.js +1 -0
  385. package/reporters/__tests__/resources/sampleData.js +162 -0
  386. package/reporters/mochAwesome/interfaces.js +2 -0
  387. package/reporters/mochAwesome/mochAwesomeReporter.js +227 -0
  388. package/reporters/reporter.js +46 -0
  389. package/resources/actionabilityCheck.js +160 -0
  390. package/resources/coreWebVitals.js +1 -0
  391. package/resources/mablFind.js +2 -0
  392. package/resources/media/mabl_test_audio.wav +0 -0
  393. package/resources/media/mabl_test_pattern.y4m +3 -0
  394. package/resources/pdf-viewer/EmbeddedPdfHandler.js +1 -0
  395. package/resources/pdf-viewer/embeddedPdfDetection.js +225 -0
  396. package/resources/pdf-viewer/index.html +1 -0
  397. package/resources/pdf-viewer/index.js +2 -0
  398. package/resources/pdf-viewer/libEmbeddedPdfHandler.js +279 -0
  399. package/resources/pdf-viewer/libmablPdfViewer.js +21909 -0
  400. package/resources/pdf-viewer/mabl_attention_move.gif +0 -0
  401. package/resources/pdf-viewer/mabl_error_artwork_Unplugged.gif +0 -0
  402. package/resources/pdf-viewer/pdf.worker.9251738a897f697389be.js +2 -0
  403. package/resources/pdf-viewer/pdf.worker.9e2021092643447a5b9f.js +81 -0
  404. package/resources/popupDismissal.js +1 -0
  405. package/resources/webdriver.js +19 -0
  406. package/socketTunnel/index.js +2 -0
  407. package/socketTunnel/index.js.LICENSE.txt +68 -0
  408. package/upload/index.js +2 -0
  409. package/upload/index.js.LICENSE.txt +27 -0
  410. package/util/CloudStorageWriter.js +45 -0
  411. package/util/FileCache.js +180 -0
  412. package/util/IdentifierUtil.js +57 -0
  413. package/util/InternalMetricsTrackingSingleton.js +36 -0
  414. package/util/Lazy.js +90 -0
  415. package/util/MobileAppFileCache.js +103 -0
  416. package/util/RichPromise.js +53 -0
  417. package/util/TestOutputWriter.js +104 -0
  418. package/util/actionabilityUtil.js +165 -0
  419. package/util/analytics-events.js +14 -0
  420. package/util/analytics.js +176 -0
  421. package/util/asyncUtil.js +61 -0
  422. package/util/browserTestUtils.js +17 -0
  423. package/util/clickUtil.js +68 -0
  424. package/util/downloadUtil.js +87 -0
  425. package/util/encodingUtil.js +50 -0
  426. package/util/fileUploadUtil.js +146 -0
  427. package/util/javaScriptStepMigration.js +115 -0
  428. package/util/jestUtil.js +21 -0
  429. package/util/logUtils.js +131 -0
  430. package/util/markdownUtil.js +125 -0
  431. package/util/postInstallMessage.js +14 -0
  432. package/util/pureUtil.js +175 -0
  433. package/util/resourceUtil.js +90 -0
  434. package/util/timeUtil.js +31 -0
  435. package/utilities.js +7 -0
  436. package/webdriver/index.js +44 -0
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.moveDownloadedFileToProcessed = exports.awaitDownload = exports.getAwaitDownloadTimeout = exports.PROCESSED_DIR_NAME = void 0;
27
+ const path = __importStar(require("path"));
28
+ const fs = __importStar(require("fs"));
29
+ const fsExtra = __importStar(require("fs-extra"));
30
+ const util = __importStar(require("util"));
31
+ const testsUtil_1 = require("../commands/tests/testsUtil");
32
+ const AWAIT_DOWNLOAD_MAX_TIMEOUT_MILLIS = 60000;
33
+ const FILE_MIN_STABLE_TIME_MILLIS = 3000;
34
+ const AWAIT_DOWNLOAD_POLLING_INTERVAL_MILLISECONDS = 500;
35
+ exports.PROCESSED_DIR_NAME = 'Processed';
36
+ function getAwaitDownloadTimeout() {
37
+ return AWAIT_DOWNLOAD_MAX_TIMEOUT_MILLIS;
38
+ }
39
+ exports.getAwaitDownloadTimeout = getAwaitDownloadTimeout;
40
+ async function awaitDownload(downloadDirectory, filePathSuffix, timeoutMillis = getAwaitDownloadTimeout()) {
41
+ const startTime = Date.now();
42
+ let foundDownloadPath;
43
+ let downloadComplete = false;
44
+ while (Date.now() - timeoutMillis < startTime && !downloadComplete) {
45
+ const latestFile = await getLatestFile(downloadDirectory, filePathSuffix);
46
+ if (latestFile) {
47
+ downloadComplete = true;
48
+ foundDownloadPath = latestFile;
49
+ }
50
+ else {
51
+ await (0, testsUtil_1.sleep)(AWAIT_DOWNLOAD_POLLING_INTERVAL_MILLISECONDS);
52
+ }
53
+ }
54
+ return foundDownloadPath;
55
+ }
56
+ exports.awaitDownload = awaitDownload;
57
+ async function getLatestFile(downloadDirectory, filePathSuffix) {
58
+ const readDirectoryAsync = util.promisify(fs.readdir);
59
+ const filesInDownloadDir = await readDirectoryAsync(downloadDirectory);
60
+ let latestFileTime = 0;
61
+ let latestFilePath;
62
+ filesInDownloadDir.forEach((fileName) => {
63
+ const fullPath = `${downloadDirectory}/${fileName}`;
64
+ try {
65
+ const stats = fs.statSync(path.normalize(fullPath));
66
+ if (stats.isFile() &&
67
+ stats.ctimeMs > latestFileTime &&
68
+ Date.now() - stats.mtimeMs >= FILE_MIN_STABLE_TIME_MILLIS &&
69
+ !fullPath.includes('.crDownload') &&
70
+ fullPath.endsWith(filePathSuffix)) {
71
+ latestFileTime = stats.ctimeMs;
72
+ latestFilePath = fullPath;
73
+ }
74
+ }
75
+ catch {
76
+ }
77
+ });
78
+ return latestFilePath;
79
+ }
80
+ function moveDownloadedFileToProcessed(downloadDirectory, fileName) {
81
+ const processedDirectory = path.join(downloadDirectory, exports.PROCESSED_DIR_NAME);
82
+ const sourceLocation = path.join(downloadDirectory, fileName);
83
+ const destinationLocation = path.join(processedDirectory, fileName);
84
+ fsExtra.ensureDirSync(processedDirectory);
85
+ fsExtra.moveSync(sourceLocation, destinationLocation, { overwrite: true });
86
+ }
87
+ exports.moveDownloadedFileToProcessed = moveDownloadedFileToProcessed;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.decodeTestConfigAsParamsForParsedUrlProtocol = exports.encodeTestConfigAsParamsForParsedUrlProtocol = exports.b64DecodeUnicodeNodeOrBrowser = exports.b64EncodeUnicodeInNode = exports.b64DecodeUnicodeInNode = exports.isNode = exports.TEST_CONFIG_URL_PARAM_KEY = void 0;
7
+ const querystring_1 = __importDefault(require("querystring"));
8
+ const domUtil_1 = require("../domUtil");
9
+ const MAX_PARSED_URL_PROTOCOL_PARAMS_LENGTH = 2000;
10
+ exports.TEST_CONFIG_URL_PARAM_KEY = 'scriptConfig';
11
+ function isNode() {
12
+ var _a;
13
+ return !!((_a = process === null || process === void 0 ? void 0 : process.versions) === null || _a === void 0 ? void 0 : _a.node);
14
+ }
15
+ exports.isNode = isNode;
16
+ function b64DecodeUnicodeInNode(encoded) {
17
+ return Buffer.from(encoded, 'base64').toString();
18
+ }
19
+ exports.b64DecodeUnicodeInNode = b64DecodeUnicodeInNode;
20
+ function b64EncodeUnicodeInNode(text) {
21
+ return Buffer.from(text).toString('base64');
22
+ }
23
+ exports.b64EncodeUnicodeInNode = b64EncodeUnicodeInNode;
24
+ function b64DecodeUnicodeNodeOrBrowser(encoded) {
25
+ if (isNode()) {
26
+ return b64DecodeUnicodeInNode(encoded);
27
+ }
28
+ return (0, domUtil_1.b64DecodeUnicode)(encoded);
29
+ }
30
+ exports.b64DecodeUnicodeNodeOrBrowser = b64DecodeUnicodeNodeOrBrowser;
31
+ function encodeTestConfigAsParamsForParsedUrlProtocol(testConfig, b64Encode) {
32
+ const encoded = querystring_1.default.stringify({
33
+ ...testConfig,
34
+ [exports.TEST_CONFIG_URL_PARAM_KEY]: b64Encode(JSON.stringify(testConfig)),
35
+ });
36
+ if (encoded.length > MAX_PARSED_URL_PROTOCOL_PARAMS_LENGTH) {
37
+ throw new Error('Test parameters exceed size limit. Please use the mabl Desktop App to create or edit tests.');
38
+ }
39
+ return encoded;
40
+ }
41
+ exports.encodeTestConfigAsParamsForParsedUrlProtocol = encodeTestConfigAsParamsForParsedUrlProtocol;
42
+ function decodeTestConfigAsParamsForParsedUrlProtocol(encoded, b64Decode, useV2) {
43
+ const params = querystring_1.default.parse(encoded);
44
+ if (useV2 && params[exports.TEST_CONFIG_URL_PARAM_KEY]) {
45
+ return JSON.parse(b64Decode(params[exports.TEST_CONFIG_URL_PARAM_KEY]));
46
+ }
47
+ delete params[exports.TEST_CONFIG_URL_PARAM_KEY];
48
+ return params;
49
+ }
50
+ exports.decodeTestConfigAsParamsForParsedUrlProtocol = decodeTestConfigAsParamsForParsedUrlProtocol;
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.downloadFileUploadsAndSetReferenceInContext = exports.downloadAllFileUploadsAndSetContext = exports.createTempDirectoryForFileUploads = exports.createFileUploadDirectoryName = exports.removeUploadDirs = exports.cleanupOldFiles = exports.downloadFileUpload = void 0;
30
+ const axios_1 = __importDefault(require("axios"));
31
+ const axiosProxyConfig_1 = require("../http/axiosProxyConfig");
32
+ const path_1 = __importDefault(require("path"));
33
+ const fs = __importStar(require("fs-extra"));
34
+ const stream_1 = require("stream");
35
+ const loggingProvider_1 = require("../providers/logging/loggingProvider");
36
+ const chalk_1 = __importDefault(require("chalk"));
37
+ const Globals_1 = require("../Globals");
38
+ const logUtils_1 = require("./logUtils");
39
+ async function downloadFileUpload(fileUploadUrl, fileUpload, downloadDirectory, mablApiClient) {
40
+ let client;
41
+ if (mablApiClient) {
42
+ client = mablApiClient.httpClient;
43
+ }
44
+ else {
45
+ client = axios_1.default.create(await (0, axiosProxyConfig_1.currentProxyConfig)());
46
+ }
47
+ try {
48
+ const finalDirectory = path_1.default.normalize(`${downloadDirectory}/${fileUpload.id}`);
49
+ try {
50
+ fs.mkdirSync(finalDirectory);
51
+ }
52
+ catch (error) {
53
+ if (!error.message.includes('file already exists')) {
54
+ throw error;
55
+ }
56
+ }
57
+ const finalPath = path_1.default.normalize(`${finalDirectory}/${fileUpload.name}`);
58
+ const writer = fs.createWriteStream(finalPath);
59
+ const response = await client.get(fileUploadUrl, {
60
+ responseType: 'stream',
61
+ });
62
+ if (response.data.pipe) {
63
+ response.data.pipe(writer);
64
+ }
65
+ else if (response.status < 400) {
66
+ if (typeof response.data[Symbol.iterator] === 'function') {
67
+ stream_1.Readable.from(response.data).pipe(writer);
68
+ }
69
+ else {
70
+ stream_1.Readable.from([JSON.stringify(response.data)]).pipe(writer);
71
+ }
72
+ }
73
+ return new Promise((resolve, reject) => {
74
+ writer.on('finish', () => resolve(finalPath));
75
+ writer.on('error', reject);
76
+ });
77
+ }
78
+ catch (error) {
79
+ loggingProvider_1.logger.error(chalk_1.default.red.bold('Error encountered downloading file for File Upload Step replay'));
80
+ throw error;
81
+ }
82
+ }
83
+ exports.downloadFileUpload = downloadFileUpload;
84
+ function cleanupOldFiles(ageInMs = 0) {
85
+ try {
86
+ const dir = Globals_1.Globals.getUploadDirectory();
87
+ const prefix = Globals_1.Globals.getUploadDirectoryPrefix();
88
+ fs.readdirSync(dir)
89
+ .filter((file) => file.startsWith(prefix) && uploadDirTooOld(file, ageInMs))
90
+ .forEach((file) => fs.rmSync(`${dir}/${file}`, { recursive: true, force: true }));
91
+ }
92
+ catch (e) {
93
+ const msg = `WARNING: error received when cleaning up old files from a previous test`;
94
+ (0, logUtils_1.logCliOutput)(loggingProvider_1.LogLevel.Warn, msg);
95
+ }
96
+ }
97
+ exports.cleanupOldFiles = cleanupOldFiles;
98
+ function uploadDirTooOld(dirFullPath, ageInMs) {
99
+ const now = Date.now();
100
+ const parts = dirFullPath.split('-');
101
+ return (parts.length === 3 &&
102
+ !Number.isNaN(parseInt(parts[1])) &&
103
+ (ageInMs === 0 || now - parseInt(parts[1]) > ageInMs));
104
+ }
105
+ function removeUploadDirs(dirFullPath) {
106
+ const MAX_RETRIES = 5;
107
+ const rmOpts = {
108
+ recursive: true,
109
+ maxRetries: MAX_RETRIES,
110
+ force: true,
111
+ };
112
+ fs.rmSync(dirFullPath, rmOpts);
113
+ }
114
+ exports.removeUploadDirs = removeUploadDirs;
115
+ function createFileUploadDirectoryName() {
116
+ const dir = Globals_1.Globals.getUploadDirectory();
117
+ const prefix = Globals_1.Globals.getUploadDirectoryPrefix();
118
+ return `${dir}/${prefix}${Date.now()}-`;
119
+ }
120
+ exports.createFileUploadDirectoryName = createFileUploadDirectoryName;
121
+ function createTempDirectoryForFileUploads(fileUploadDirName) {
122
+ return fs.mkdtempSync(fileUploadDirName);
123
+ }
124
+ exports.createTempDirectoryForFileUploads = createTempDirectoryForFileUploads;
125
+ async function downloadAllFileUploadsAndSetContext(apiClient, testContext, uploadDirectory, fileUploadReferences) {
126
+ await Promise.all(fileUploadReferences.map(async (fileRef) => {
127
+ const fileUploadUrl = await apiClient.getFileUploadUrl(fileRef.id);
128
+ const finalPathDownloaded = await downloadFileUpload(fileUploadUrl.redirectUrl, fileRef, uploadDirectory, apiClient);
129
+ testContext.setFileUploadReference(fileRef.id, finalPathDownloaded);
130
+ }));
131
+ }
132
+ exports.downloadAllFileUploadsAndSetContext = downloadAllFileUploadsAndSetContext;
133
+ async function downloadFileUploadsAndSetReferenceInContext(apiClient, testContext, fileUploadReferences) {
134
+ const uploadDirs = testContext.getFileUploadDirs();
135
+ let uploadDirectoryPath;
136
+ if (uploadDirs.size === 0) {
137
+ const dirName = createFileUploadDirectoryName();
138
+ uploadDirectoryPath = createTempDirectoryForFileUploads(dirName);
139
+ testContext.addFileUploadDir(uploadDirectoryPath);
140
+ }
141
+ else {
142
+ uploadDirectoryPath = uploadDirs.values().next().value;
143
+ }
144
+ return downloadAllFileUploadsAndSetContext(apiClient, testContext, uploadDirectoryPath, fileUploadReferences);
145
+ }
146
+ exports.downloadFileUploadsAndSetReferenceInContext = downloadFileUploadsAndSetReferenceInContext;
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.normalizeScript = exports.hasVariableReferences = exports.attemptReusableSnippetParameterization = exports.attemptMigrationToParameterizedStep = void 0;
27
+ const mablApi_1 = require("../mablApi");
28
+ const encodingUtil_1 = require("./encodingUtil");
29
+ const esprima = __importStar(require("esprima"));
30
+ const escodegen = __importStar(require("escodegen"));
31
+ const loggingProvider_1 = require("../providers/logging/loggingProvider");
32
+ function attemptMigrationToParameterizedStep(descriptor) {
33
+ let hasVariables;
34
+ let migrationDisabled;
35
+ try {
36
+ const decodedJS = (0, encodingUtil_1.b64DecodeUnicodeInNode)(descriptor.encodedJS);
37
+ migrationDisabled = isMigrationDisabled(decodedJS);
38
+ hasVariables = hasVariableReferences(decodedJS);
39
+ }
40
+ catch (error) {
41
+ loggingProvider_1.logger.warn(`Failed to determine if the inline snippet uses variables: ${error}`);
42
+ return descriptor;
43
+ }
44
+ if (migrationDisabled) {
45
+ return descriptor;
46
+ }
47
+ if (hasVariables) {
48
+ return descriptor;
49
+ }
50
+ loggingProvider_1.logger.info('Converting legacy inline JavaScript step to parameterized step.');
51
+ return migrateInlineDescriptor(descriptor);
52
+ }
53
+ exports.attemptMigrationToParameterizedStep = attemptMigrationToParameterizedStep;
54
+ function migrateInlineDescriptor(descriptor) {
55
+ return {
56
+ inlineSnippet: {
57
+ body: descriptor.encodedJS,
58
+ description: '',
59
+ name: 'Unnamed snippet',
60
+ parameters: [],
61
+ snippet_type: mablApi_1.SnippetTypeEnum.Javascript,
62
+ },
63
+ actionCode: descriptor.actionCode,
64
+ parameterOverrides: [],
65
+ };
66
+ }
67
+ function attemptReusableSnippetParameterization(snippet) {
68
+ if (Array.isArray(snippet.parameters)) {
69
+ return;
70
+ }
71
+ if (!snippet.body) {
72
+ return;
73
+ }
74
+ let hasVariables;
75
+ let migrationDisabled;
76
+ try {
77
+ const decodedJS = (0, encodingUtil_1.b64DecodeUnicodeInNode)(snippet.body);
78
+ migrationDisabled = isMigrationDisabled(decodedJS);
79
+ hasVariables = hasVariableReferences(decodedJS);
80
+ }
81
+ catch (error) {
82
+ loggingProvider_1.logger.warn(`Failed to determine if the reusable snippet uses variables: ${error}`);
83
+ return;
84
+ }
85
+ if (migrationDisabled) {
86
+ return;
87
+ }
88
+ if (hasVariables) {
89
+ loggingProvider_1.logger.info(`Skipping snippet parameter conversion due to variable usage. Snippet ID: ${snippet.id}`);
90
+ return;
91
+ }
92
+ loggingProvider_1.logger.info(`Migrating legacy snippet to parameterized snippet. Snippet ID: ${snippet.id}`);
93
+ snippet.parameters = [];
94
+ }
95
+ exports.attemptReusableSnippetParameterization = attemptReusableSnippetParameterization;
96
+ function isMigrationDisabled(decodedScript) {
97
+ return decodedScript.indexOf('@mabl-disable-parameterization') >= 0;
98
+ }
99
+ function hasVariableReferences(decodedScript) {
100
+ const normalizedCode = normalizeScript(decodedScript);
101
+ const hasSignature = normalizedCode.indexOf('function mablJavaScriptStep(mablInputs') >= 0;
102
+ if (!hasSignature) {
103
+ throw new Error('Did not find expected mabl JavaScript function signature.');
104
+ }
105
+ const rex = /mablInputs/gi;
106
+ const match = normalizedCode.match(rex);
107
+ const matchCount = match ? match.length : 0;
108
+ return matchCount > 1;
109
+ }
110
+ exports.hasVariableReferences = hasVariableReferences;
111
+ function normalizeScript(decodedScript) {
112
+ const tree = esprima.parseScript(decodedScript, { tolerant: true });
113
+ return escodegen.generate(tree);
114
+ }
115
+ exports.normalizeScript = normalizeScript;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.itIf = exports.describeIf = void 0;
4
+ const describeIf = (name, condition, reason, testSuite) => {
5
+ if (condition()) {
6
+ describe(name, testSuite);
7
+ return;
8
+ }
9
+ console.warn(`[skipped]: ${name} (reason: ${reason})`);
10
+ describe.skip(name, testSuite);
11
+ };
12
+ exports.describeIf = describeIf;
13
+ const itIf = (name, condition, reason, fn, timeout) => {
14
+ if (condition()) {
15
+ it(name, fn, timeout);
16
+ return;
17
+ }
18
+ console.warn(`[skipped]: ${name} (reason: ${reason})`);
19
+ it.skip(name, fn);
20
+ };
21
+ exports.itIf = itIf;
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.promiseRejectionMiddlewareMetric = exports.getPromiseSettledValues = exports.logPromiseSettledRejections = exports.logErrorVerbose = exports.formatTimestamp = exports.maybeTruncateLongMessage = exports.valueToString = exports.logWebUIAndCliOutput = exports.logWebUI = exports.findResultSeverityToLogLevel = exports.logCliOutput = exports.logInternal = exports.TRUNCATED_MESSAGE_SUFFIX = exports.VALUE_TO_STRING_DEFAULT_LIMIT = void 0;
7
+ const mablscriptFind_1 = require("../mablscriptFind");
8
+ const loggingProvider_1 = require("../providers/logging/loggingProvider");
9
+ const moment_1 = __importDefault(require("moment"));
10
+ const constants_1 = require("../commands/constants");
11
+ const pureUtil_1 = require("./pureUtil");
12
+ const InternalMetricsTrackingSingleton_1 = require("./InternalMetricsTrackingSingleton");
13
+ exports.VALUE_TO_STRING_DEFAULT_LIMIT = 2048;
14
+ exports.TRUNCATED_MESSAGE_SUFFIX = '…[truncated]';
15
+ function logInternal(logLine, ...meta) {
16
+ loggingProvider_1.logger.debug(logLine, meta);
17
+ }
18
+ exports.logInternal = logInternal;
19
+ function logCliOutput(logLevel, logLine) {
20
+ switch (logLevel) {
21
+ case loggingProvider_1.LogLevel.Error:
22
+ loggingProvider_1.logger.error(logLine);
23
+ break;
24
+ case loggingProvider_1.LogLevel.Warn:
25
+ loggingProvider_1.logger.warn(logLine);
26
+ break;
27
+ case loggingProvider_1.LogLevel.Info:
28
+ loggingProvider_1.logger.info(logLine);
29
+ break;
30
+ case loggingProvider_1.LogLevel.Debug:
31
+ default:
32
+ loggingProvider_1.logger.debug(logLine);
33
+ }
34
+ }
35
+ exports.logCliOutput = logCliOutput;
36
+ function findResultSeverityToLogLevel(severity) {
37
+ switch (severity) {
38
+ case mablscriptFind_1.FindResultLogSeverity.Error:
39
+ return loggingProvider_1.LogLevel.Error;
40
+ case mablscriptFind_1.FindResultLogSeverity.Warn:
41
+ return loggingProvider_1.LogLevel.Warn;
42
+ case mablscriptFind_1.FindResultLogSeverity.Info:
43
+ return loggingProvider_1.LogLevel.Info;
44
+ case mablscriptFind_1.FindResultLogSeverity.Debug:
45
+ default:
46
+ return loggingProvider_1.LogLevel.Debug;
47
+ }
48
+ }
49
+ exports.findResultSeverityToLogLevel = findResultSeverityToLogLevel;
50
+ function logWebUI(logLine, logLevel, executionContext, metadata) {
51
+ metadata = metadata ? JSON.parse(JSON.stringify(metadata)) : {};
52
+ metadata.shouldOutputInConsole = false;
53
+ logWebUIAndCliOutput(logLine, logLevel, executionContext, metadata);
54
+ }
55
+ exports.logWebUI = logWebUI;
56
+ function logWebUIAndCliOutput(logLine, logLevel, executionContext, metadata) {
57
+ switch (logLevel) {
58
+ case loggingProvider_1.LogLevel.Error:
59
+ executionContext.log.error(logLine, metadata);
60
+ break;
61
+ case loggingProvider_1.LogLevel.Warn:
62
+ executionContext.log.warning(logLine, metadata);
63
+ break;
64
+ case loggingProvider_1.LogLevel.Info:
65
+ executionContext.log.info(logLine, metadata);
66
+ break;
67
+ case loggingProvider_1.LogLevel.Debug:
68
+ default:
69
+ executionContext.log.debug(logLine, metadata);
70
+ }
71
+ }
72
+ exports.logWebUIAndCliOutput = logWebUIAndCliOutput;
73
+ function valueToString(value, maxLength = exports.VALUE_TO_STRING_DEFAULT_LIMIT) {
74
+ let stringValue;
75
+ if (typeof value === 'object') {
76
+ stringValue = JSON.stringify(value);
77
+ }
78
+ else {
79
+ stringValue = '' + value;
80
+ }
81
+ return maybeTruncateLongMessage(stringValue, maxLength);
82
+ }
83
+ exports.valueToString = valueToString;
84
+ function maybeTruncateLongMessage(message, maxLength) {
85
+ return message.length <= maxLength
86
+ ? message
87
+ : message.slice(0, maxLength - exports.TRUNCATED_MESSAGE_SUFFIX.length) +
88
+ exports.TRUNCATED_MESSAGE_SUFFIX;
89
+ }
90
+ exports.maybeTruncateLongMessage = maybeTruncateLongMessage;
91
+ function formatTimestamp(timeAsNumber) {
92
+ if (!timeAsNumber) {
93
+ return '';
94
+ }
95
+ return moment_1.default.utc(timeAsNumber).format(constants_1.ListTimeFormat);
96
+ }
97
+ exports.formatTimestamp = formatTimestamp;
98
+ function logErrorVerbose(error, context) {
99
+ loggingProvider_1.logger.verbose(`Error Message: ${error.message}`);
100
+ loggingProvider_1.logger.verbose(`Error Type: ${error.name}`);
101
+ loggingProvider_1.logger.verbose(`Stack Trace:\n${error.stack}`);
102
+ if (context) {
103
+ loggingProvider_1.logger.verbose(`(error)(context) => ${JSON.stringify(context)}`);
104
+ }
105
+ }
106
+ exports.logErrorVerbose = logErrorVerbose;
107
+ function logPromiseSettledRejections(promises, reThrow = false) {
108
+ promises
109
+ .filter(pureUtil_1.isRejectedPromise)
110
+ .forEach((promise) => logErrorVerbose(promise.reason));
111
+ const findRejectedPromise = promises.find(pureUtil_1.isRejectedPromise);
112
+ if (findRejectedPromise && reThrow) {
113
+ throw findRejectedPromise.reason;
114
+ }
115
+ }
116
+ exports.logPromiseSettledRejections = logPromiseSettledRejections;
117
+ function getPromiseSettledValues(promises, reThrow = false) {
118
+ logPromiseSettledRejections(promises, reThrow);
119
+ return promises.filter(pureUtil_1.isFulfilledPromise).map((promise) => promise.value);
120
+ }
121
+ exports.getPromiseSettledValues = getPromiseSettledValues;
122
+ async function promiseRejectionMiddlewareMetric(promise, metricName, metricValue) {
123
+ try {
124
+ return await promise;
125
+ }
126
+ catch (error) {
127
+ InternalMetricsTrackingSingleton_1.InternalMetricsTrackingSingleton.getInstance().addMetric(metricName, metricValue);
128
+ throw error;
129
+ }
130
+ }
131
+ exports.promiseRejectionMiddlewareMetric = promiseRejectionMiddlewareMetric;
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.summaryToElapsedTime = exports.journeyRunToElapsedTime = exports.maybeCapitalize = exports.humanizedMablStatusToGithubIcon = exports.humanizeMablStatus = exports.formatResultsAsGithubMarkdown = void 0;
4
+ const change_case_1 = require("change-case");
5
+ const mablApi_1 = require("../mablApi");
6
+ const timeUtil_1 = require("./timeUtil");
7
+ const table = require('markdown-table');
8
+ var HumanizedMablStatuses;
9
+ (function (HumanizedMablStatuses) {
10
+ HumanizedMablStatuses["Failed"] = "Failed";
11
+ HumanizedMablStatuses["Passed"] = "Passed";
12
+ HumanizedMablStatuses["RateLimited"] = "Quota Reached";
13
+ HumanizedMablStatuses["Running"] = "Running";
14
+ HumanizedMablStatuses["Stopped"] = "Stopped";
15
+ })(HumanizedMablStatuses || (HumanizedMablStatuses = {}));
16
+ function formatResultsAsGithubMarkdown(results) {
17
+ var _a;
18
+ const tableRows = [];
19
+ tableRows.push(['Plan', 'Test', 'Browser', 'Status', 'Run Time']);
20
+ const finalExecutions = (_a = results === null || results === void 0 ? void 0 : results.executions) !== null && _a !== void 0 ? _a : [];
21
+ finalExecutions.forEach((summary) => {
22
+ var _a, _b, _c, _d, _e, _f, _g;
23
+ const retryPrefix = ((_a = summary === null || summary === void 0 ? void 0 : summary.plan_execution) === null || _a === void 0 ? void 0 : _a.is_retry) ? '[Retry] ' : '';
24
+ const planName = retryPrefix + ((_c = (_b = summary.plan) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '<plan name unavailable>');
25
+ const humanizedPlanRunStatus = humanizeMablStatus((_d = summary === null || summary === void 0 ? void 0 : summary.plan_execution) === null || _d === void 0 ? void 0 : _d.status);
26
+ const planRunStatus = humanizedMablStatusToGithubIcon(humanizedPlanRunStatus) +
27
+ ' ' +
28
+ maybeCapitalize(humanizedPlanRunStatus === null || humanizedPlanRunStatus === void 0 ? void 0 : humanizedPlanRunStatus.toString());
29
+ const planHref = (_e = summary.plan) === null || _e === void 0 ? void 0 : _e.app_href;
30
+ const journeyMap = new Map();
31
+ (_f = summary.journeys) === null || _f === void 0 ? void 0 : _f.forEach((journeySummary) => journeyMap.set(journeySummary.id, journeySummary));
32
+ tableRows.push([
33
+ `[${planName}](${planHref})`,
34
+ '---',
35
+ '---',
36
+ planRunStatus,
37
+ summaryToElapsedTime(summary),
38
+ ]);
39
+ (_g = summary.journey_executions) === null || _g === void 0 ? void 0 : _g.forEach((journeyRun) => {
40
+ const humanizedJourneyRunStatus = humanizeMablStatus(journeyRun.status);
41
+ const journeyStatus = humanizedMablStatusToGithubIcon(humanizedJourneyRunStatus) +
42
+ ' ' +
43
+ maybeCapitalize(humanizedJourneyRunStatus === null || humanizedJourneyRunStatus === void 0 ? void 0 : humanizedJourneyRunStatus.toString());
44
+ const journeyBrowser = maybeCapitalize(journeyRun.browser_type);
45
+ const journeySummary = journeyMap.get(journeyRun.journey_id);
46
+ let journeyLabel = '<test name unavailable>';
47
+ if (journeySummary) {
48
+ journeyLabel = `[${retryPrefix}${journeySummary.name}](${journeySummary.app_href})`;
49
+ }
50
+ tableRows.push([
51
+ '',
52
+ journeyLabel,
53
+ journeyBrowser,
54
+ `[${journeyStatus}](${journeyRun.app_href})`,
55
+ journeyRunToElapsedTime(journeyRun),
56
+ ]);
57
+ });
58
+ });
59
+ return table(tableRows, {
60
+ align: ['l', 'l', 'l', 'l'],
61
+ });
62
+ }
63
+ exports.formatResultsAsGithubMarkdown = formatResultsAsGithubMarkdown;
64
+ function humanizeMablStatus(status) {
65
+ if (status) {
66
+ switch (status) {
67
+ case mablApi_1.TestRunResult.StatusEnum.Completed:
68
+ case mablApi_1.PlanExecutionResult.StatusEnum.Completed:
69
+ case mablApi_1.PlanExecutionResult.StatusEnum.Succeeded:
70
+ return HumanizedMablStatuses.Passed;
71
+ case mablApi_1.TestRunResult.StatusEnum.Failed:
72
+ case mablApi_1.PlanExecutionResult.StatusEnum.Failed:
73
+ return HumanizedMablStatuses.Failed;
74
+ case mablApi_1.TestRunResult.StatusEnum.Terminated:
75
+ case mablApi_1.PlanExecutionResult.StatusEnum.Terminated:
76
+ case mablApi_1.PlanExecutionResult.StatusEnum.Cancelled:
77
+ return HumanizedMablStatuses.Stopped;
78
+ case mablApi_1.TestRunResult.StatusEnum.Queued:
79
+ case mablApi_1.PlanExecutionResult.StatusEnum.Queued:
80
+ case mablApi_1.PlanExecutionResult.StatusEnum.Scheduled:
81
+ case mablApi_1.PlanExecutionResult.StatusEnum.Scheduling:
82
+ case mablApi_1.TestRunResult.StatusEnum.Running:
83
+ case mablApi_1.PlanExecutionResult.StatusEnum.PostExecution:
84
+ case mablApi_1.PlanExecutionResult.StatusEnum.PreExecution:
85
+ return HumanizedMablStatuses.Running;
86
+ case mablApi_1.TestRunResult.StatusEnum.RateLimited:
87
+ return HumanizedMablStatuses.RateLimited;
88
+ }
89
+ }
90
+ return;
91
+ }
92
+ exports.humanizeMablStatus = humanizeMablStatus;
93
+ function humanizedMablStatusToGithubIcon(status) {
94
+ if (!status) {
95
+ return '';
96
+ }
97
+ switch (status) {
98
+ case HumanizedMablStatuses.Passed:
99
+ return ':heavy_check_mark:';
100
+ case HumanizedMablStatuses.Failed:
101
+ return ':x:';
102
+ case HumanizedMablStatuses.Stopped:
103
+ return ':large_orange_diamond:';
104
+ case HumanizedMablStatuses.Running:
105
+ return '🔃';
106
+ default:
107
+ throw new Error(`Unhandled humanized status [${status}]`);
108
+ }
109
+ }
110
+ exports.humanizedMablStatusToGithubIcon = humanizedMablStatusToGithubIcon;
111
+ function maybeCapitalize(input) {
112
+ if (input) {
113
+ return (0, change_case_1.capitalCase)(input.replace('_', ' '));
114
+ }
115
+ return '';
116
+ }
117
+ exports.maybeCapitalize = maybeCapitalize;
118
+ function journeyRunToElapsedTime(journeyRun) {
119
+ return (0, timeUtil_1.elapsedTimeToString)(journeyRun.start_time, journeyRun.stop_time);
120
+ }
121
+ exports.journeyRunToElapsedTime = journeyRunToElapsedTime;
122
+ function summaryToElapsedTime(summary) {
123
+ return (0, timeUtil_1.elapsedTimeToString)(summary.start_time, summary.stop_time);
124
+ }
125
+ exports.summaryToElapsedTime = summaryToElapsedTime;