@wdio/browserstack-service 0.0.0-canary-20260722132416

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 (331) hide show
  1. package/LICENSE-MIT +20 -0
  2. package/README.md +392 -0
  3. package/browserstack-service.d.ts +43 -0
  4. package/build/Percy/Percy-Handler.d.ts +32 -0
  5. package/build/Percy/Percy-Handler.d.ts.map +1 -0
  6. package/build/Percy/Percy-Handler.js +165 -0
  7. package/build/Percy/Percy-Handler.js.map +1 -0
  8. package/build/Percy/Percy.d.ts +19 -0
  9. package/build/Percy/Percy.d.ts.map +1 -0
  10. package/build/Percy/Percy.js +164 -0
  11. package/build/Percy/Percy.js.map +1 -0
  12. package/build/Percy/PercyBinary.d.ts +10 -0
  13. package/build/Percy/PercyBinary.d.ts.map +1 -0
  14. package/build/Percy/PercyBinary.js +161 -0
  15. package/build/Percy/PercyBinary.js.map +1 -0
  16. package/build/Percy/PercyCaptureMap.d.ts +9 -0
  17. package/build/Percy/PercyCaptureMap.d.ts.map +1 -0
  18. package/build/Percy/PercyCaptureMap.js +36 -0
  19. package/build/Percy/PercyCaptureMap.js.map +1 -0
  20. package/build/Percy/PercyHelper.d.ts +8 -0
  21. package/build/Percy/PercyHelper.d.ts.map +1 -0
  22. package/build/Percy/PercyHelper.js +68 -0
  23. package/build/Percy/PercyHelper.js.map +1 -0
  24. package/build/Percy/PercyLogger.d.ts +15 -0
  25. package/build/Percy/PercyLogger.d.ts.map +1 -0
  26. package/build/Percy/PercyLogger.js +68 -0
  27. package/build/Percy/PercyLogger.js.map +1 -0
  28. package/build/Percy/PercySDK.d.ts +4 -0
  29. package/build/Percy/PercySDK.d.ts.map +1 -0
  30. package/build/Percy/PercySDK.js +86 -0
  31. package/build/Percy/PercySDK.js.map +1 -0
  32. package/build/accessibility-handler.d.ts +52 -0
  33. package/build/accessibility-handler.d.ts.map +1 -0
  34. package/build/accessibility-handler.js +361 -0
  35. package/build/accessibility-handler.js.map +1 -0
  36. package/build/ai-handler.d.ts +23 -0
  37. package/build/ai-handler.d.ts.map +1 -0
  38. package/build/ai-handler.js +184 -0
  39. package/build/ai-handler.js.map +1 -0
  40. package/build/bstackLogger.d.ts +16 -0
  41. package/build/bstackLogger.d.ts.map +1 -0
  42. package/build/bstackLogger.js +71 -0
  43. package/build/bstackLogger.js.map +1 -0
  44. package/build/cleanup.d.ts +9 -0
  45. package/build/cleanup.d.ts.map +1 -0
  46. package/build/cleanup.js +101 -0
  47. package/build/cleanup.js.map +1 -0
  48. package/build/cli/apiUtils.d.ts +14 -0
  49. package/build/cli/apiUtils.d.ts.map +1 -0
  50. package/build/cli/apiUtils.js +25 -0
  51. package/build/cli/apiUtils.js.map +1 -0
  52. package/build/cli/cliLogger.d.ts +17 -0
  53. package/build/cli/cliLogger.d.ts.map +1 -0
  54. package/build/cli/cliLogger.js +82 -0
  55. package/build/cli/cliLogger.js.map +1 -0
  56. package/build/cli/cliUtils.d.ts +64 -0
  57. package/build/cli/cliUtils.d.ts.map +1 -0
  58. package/build/cli/cliUtils.js +461 -0
  59. package/build/cli/cliUtils.js.map +1 -0
  60. package/build/cli/eventDispatcher.d.ts +28 -0
  61. package/build/cli/eventDispatcher.d.ts.map +1 -0
  62. package/build/cli/eventDispatcher.js +49 -0
  63. package/build/cli/eventDispatcher.js.map +1 -0
  64. package/build/cli/frameworks/automationFramework.d.ts +89 -0
  65. package/build/cli/frameworks/automationFramework.d.ts.map +1 -0
  66. package/build/cli/frameworks/automationFramework.js +132 -0
  67. package/build/cli/frameworks/automationFramework.js.map +1 -0
  68. package/build/cli/frameworks/constants/automationFrameworkConstants.d.ts +18 -0
  69. package/build/cli/frameworks/constants/automationFrameworkConstants.d.ts.map +1 -0
  70. package/build/cli/frameworks/constants/automationFrameworkConstants.js +18 -0
  71. package/build/cli/frameworks/constants/automationFrameworkConstants.js.map +1 -0
  72. package/build/cli/frameworks/constants/testFrameworkConstants.d.ts +43 -0
  73. package/build/cli/frameworks/constants/testFrameworkConstants.d.ts.map +1 -0
  74. package/build/cli/frameworks/constants/testFrameworkConstants.js +43 -0
  75. package/build/cli/frameworks/constants/testFrameworkConstants.js.map +1 -0
  76. package/build/cli/frameworks/testFramework.d.ts +89 -0
  77. package/build/cli/frameworks/testFramework.d.ts.map +1 -0
  78. package/build/cli/frameworks/testFramework.js +126 -0
  79. package/build/cli/frameworks/testFramework.js.map +1 -0
  80. package/build/cli/frameworks/wdioAutomationFramework.d.ts +28 -0
  81. package/build/cli/frameworks/wdioAutomationFramework.d.ts.map +1 -0
  82. package/build/cli/frameworks/wdioAutomationFramework.js +67 -0
  83. package/build/cli/frameworks/wdioAutomationFramework.js.map +1 -0
  84. package/build/cli/frameworks/wdioMochaTestFramework.d.ts +82 -0
  85. package/build/cli/frameworks/wdioMochaTestFramework.d.ts.map +1 -0
  86. package/build/cli/frameworks/wdioMochaTestFramework.js +322 -0
  87. package/build/cli/frameworks/wdioMochaTestFramework.js.map +1 -0
  88. package/build/cli/grpcClient.d.ts +86 -0
  89. package/build/cli/grpcClient.d.ts.map +1 -0
  90. package/build/cli/grpcClient.js +532 -0
  91. package/build/cli/grpcClient.js.map +1 -0
  92. package/build/cli/index.d.ts +150 -0
  93. package/build/cli/index.d.ts.map +1 -0
  94. package/build/cli/index.js +464 -0
  95. package/build/cli/index.js.map +1 -0
  96. package/build/cli/instances/automationFrameworkInstance.d.ts +33 -0
  97. package/build/cli/instances/automationFrameworkInstance.d.ts.map +1 -0
  98. package/build/cli/instances/automationFrameworkInstance.js +45 -0
  99. package/build/cli/instances/automationFrameworkInstance.js.map +1 -0
  100. package/build/cli/instances/testFrameworkInstance.d.ts +62 -0
  101. package/build/cli/instances/testFrameworkInstance.d.ts.map +1 -0
  102. package/build/cli/instances/testFrameworkInstance.js +97 -0
  103. package/build/cli/instances/testFrameworkInstance.js.map +1 -0
  104. package/build/cli/instances/trackedContext.d.ts +32 -0
  105. package/build/cli/instances/trackedContext.d.ts.map +1 -0
  106. package/build/cli/instances/trackedContext.js +48 -0
  107. package/build/cli/instances/trackedContext.js.map +1 -0
  108. package/build/cli/instances/trackedInstance.d.ts +40 -0
  109. package/build/cli/instances/trackedInstance.d.ts.map +1 -0
  110. package/build/cli/instances/trackedInstance.js +64 -0
  111. package/build/cli/instances/trackedInstance.js.map +1 -0
  112. package/build/cli/modules/accessibilityModule.d.ts +46 -0
  113. package/build/cli/modules/accessibilityModule.d.ts.map +1 -0
  114. package/build/cli/modules/accessibilityModule.js +447 -0
  115. package/build/cli/modules/accessibilityModule.js.map +1 -0
  116. package/build/cli/modules/automateModule.d.ts +26 -0
  117. package/build/cli/modules/automateModule.d.ts.map +1 -0
  118. package/build/cli/modules/automateModule.js +223 -0
  119. package/build/cli/modules/automateModule.js.map +1 -0
  120. package/build/cli/modules/baseModule.d.ts +33 -0
  121. package/build/cli/modules/baseModule.d.ts.map +1 -0
  122. package/build/cli/modules/baseModule.js +52 -0
  123. package/build/cli/modules/baseModule.js.map +1 -0
  124. package/build/cli/modules/observabilityModule.d.ts +22 -0
  125. package/build/cli/modules/observabilityModule.d.ts.map +1 -0
  126. package/build/cli/modules/observabilityModule.js +46 -0
  127. package/build/cli/modules/observabilityModule.js.map +1 -0
  128. package/build/cli/modules/percyModule.d.ts +19 -0
  129. package/build/cli/modules/percyModule.d.ts.map +1 -0
  130. package/build/cli/modules/percyModule.js +78 -0
  131. package/build/cli/modules/percyModule.js.map +1 -0
  132. package/build/cli/modules/testHubModule.d.ts +30 -0
  133. package/build/cli/modules/testHubModule.d.ts.map +1 -0
  134. package/build/cli/modules/testHubModule.js +233 -0
  135. package/build/cli/modules/testHubModule.js.map +1 -0
  136. package/build/cli/modules/webdriverIOModule.d.ts +29 -0
  137. package/build/cli/modules/webdriverIOModule.d.ts.map +1 -0
  138. package/build/cli/modules/webdriverIOModule.js +129 -0
  139. package/build/cli/modules/webdriverIOModule.js.map +1 -0
  140. package/build/cli/states/automationFrameworkState.d.ts +65 -0
  141. package/build/cli/states/automationFrameworkState.d.ts.map +1 -0
  142. package/build/cli/states/automationFrameworkState.js +62 -0
  143. package/build/cli/states/automationFrameworkState.js.map +1 -0
  144. package/build/cli/states/hookState.d.ts +45 -0
  145. package/build/cli/states/hookState.d.ts.map +1 -0
  146. package/build/cli/states/hookState.js +44 -0
  147. package/build/cli/states/hookState.js.map +1 -0
  148. package/build/cli/states/testFrameworkState.d.ts +125 -0
  149. package/build/cli/states/testFrameworkState.d.ts.map +1 -0
  150. package/build/cli/states/testFrameworkState.js +116 -0
  151. package/build/cli/states/testFrameworkState.js.map +1 -0
  152. package/build/config.d.ts +29 -0
  153. package/build/config.d.ts.map +1 -0
  154. package/build/config.js +52 -0
  155. package/build/config.js.map +1 -0
  156. package/build/constants.d.ts +96 -0
  157. package/build/constants.d.ts.map +1 -0
  158. package/build/constants.js +156 -0
  159. package/build/constants.js.map +1 -0
  160. package/build/crash-reporter.d.ts +18 -0
  161. package/build/crash-reporter.d.ts.map +1 -0
  162. package/build/crash-reporter.js +134 -0
  163. package/build/crash-reporter.js.map +1 -0
  164. package/build/cucumber-types.d.ts +194 -0
  165. package/build/cucumber-types.d.ts.map +1 -0
  166. package/build/cucumber-types.js +2 -0
  167. package/build/cucumber-types.js.map +1 -0
  168. package/build/data-store.d.ts +4 -0
  169. package/build/data-store.d.ts.map +1 -0
  170. package/build/data-store.js +42 -0
  171. package/build/data-store.js.map +1 -0
  172. package/build/exitHandler.d.ts +4 -0
  173. package/build/exitHandler.d.ts.map +1 -0
  174. package/build/exitHandler.js +105 -0
  175. package/build/exitHandler.js.map +1 -0
  176. package/build/fileStream.d.ts +9 -0
  177. package/build/fileStream.d.ts.map +1 -0
  178. package/build/fileStream.js +13 -0
  179. package/build/fileStream.js.map +1 -0
  180. package/build/grpc/generated/sdk-messages-accessibility.d.ts +76 -0
  181. package/build/grpc/generated/sdk-messages-accessibility.d.ts.map +1 -0
  182. package/build/grpc/generated/sdk-messages-accessibility.js +908 -0
  183. package/build/grpc/generated/sdk-messages-accessibility.js.map +1 -0
  184. package/build/grpc/generated/sdk-messages-ai.d.ts +52 -0
  185. package/build/grpc/generated/sdk-messages-ai.d.ts.map +1 -0
  186. package/build/grpc/generated/sdk-messages-ai.js +643 -0
  187. package/build/grpc/generated/sdk-messages-ai.js.map +1 -0
  188. package/build/grpc/generated/sdk-messages-observability.d.ts +44 -0
  189. package/build/grpc/generated/sdk-messages-observability.d.ts.map +1 -0
  190. package/build/grpc/generated/sdk-messages-observability.js +505 -0
  191. package/build/grpc/generated/sdk-messages-observability.js.map +1 -0
  192. package/build/grpc/generated/sdk-messages-percy.d.ts +16 -0
  193. package/build/grpc/generated/sdk-messages-percy.d.ts.map +1 -0
  194. package/build/grpc/generated/sdk-messages-percy.js +111 -0
  195. package/build/grpc/generated/sdk-messages-percy.js.map +1 -0
  196. package/build/grpc/generated/sdk-messages-testhub.d.ts +16 -0
  197. package/build/grpc/generated/sdk-messages-testhub.d.ts.map +1 -0
  198. package/build/grpc/generated/sdk-messages-testhub.js +132 -0
  199. package/build/grpc/generated/sdk-messages-testhub.js.map +1 -0
  200. package/build/grpc/generated/sdk-messages.d.ts +288 -0
  201. package/build/grpc/generated/sdk-messages.d.ts.map +1 -0
  202. package/build/grpc/generated/sdk-messages.js +3958 -0
  203. package/build/grpc/generated/sdk-messages.js.map +1 -0
  204. package/build/grpc/generated/sdk.d.ts +282 -0
  205. package/build/grpc/generated/sdk.d.ts.map +1 -0
  206. package/build/grpc/generated/sdk.js +197 -0
  207. package/build/grpc/generated/sdk.js.map +1 -0
  208. package/build/grpc/index.d.ts +43 -0
  209. package/build/grpc/index.d.ts.map +1 -0
  210. package/build/grpc/index.js +154 -0
  211. package/build/grpc/index.js.map +1 -0
  212. package/build/index.d.ts +20 -0
  213. package/build/index.d.ts.map +1 -0
  214. package/build/index.js +13 -0
  215. package/build/index.js.map +1 -0
  216. package/build/insights-handler.d.ts +76 -0
  217. package/build/insights-handler.d.ts.map +1 -0
  218. package/build/insights-handler.js +855 -0
  219. package/build/insights-handler.js.map +1 -0
  220. package/build/instrumentation/funnelInstrumentation.d.ts +8 -0
  221. package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -0
  222. package/build/instrumentation/funnelInstrumentation.js +235 -0
  223. package/build/instrumentation/funnelInstrumentation.js.map +1 -0
  224. package/build/instrumentation/performance/constants.d.ts +151 -0
  225. package/build/instrumentation/performance/constants.d.ts.map +1 -0
  226. package/build/instrumentation/performance/constants.js +158 -0
  227. package/build/instrumentation/performance/constants.js.map +1 -0
  228. package/build/instrumentation/performance/performance-tester.d.ts +55 -0
  229. package/build/instrumentation/performance/performance-tester.d.ts.map +1 -0
  230. package/build/instrumentation/performance/performance-tester.js +403 -0
  231. package/build/instrumentation/performance/performance-tester.js.map +1 -0
  232. package/build/launcher.d.ts +49 -0
  233. package/build/launcher.d.ts.map +1 -0
  234. package/build/launcher.js +1077 -0
  235. package/build/launcher.js.map +1 -0
  236. package/build/log4jsAppender.d.ts +2 -0
  237. package/build/log4jsAppender.d.ts.map +1 -0
  238. package/build/log4jsAppender.js +20 -0
  239. package/build/log4jsAppender.js.map +1 -0
  240. package/build/logPatcher.d.ts +13 -0
  241. package/build/logPatcher.d.ts.map +1 -0
  242. package/build/logPatcher.js +39 -0
  243. package/build/logPatcher.js.map +1 -0
  244. package/build/logReportingAPI.d.ts +12 -0
  245. package/build/logReportingAPI.d.ts.map +1 -0
  246. package/build/logReportingAPI.js +57 -0
  247. package/build/logReportingAPI.js.map +1 -0
  248. package/build/reporter.d.ts +40 -0
  249. package/build/reporter.d.ts.map +1 -0
  250. package/build/reporter.js +254 -0
  251. package/build/reporter.js.map +1 -0
  252. package/build/request-handler.d.ts +19 -0
  253. package/build/request-handler.d.ts.map +1 -0
  254. package/build/request-handler.js +78 -0
  255. package/build/request-handler.js.map +1 -0
  256. package/build/scripts/accessibility-scripts.d.ts +26 -0
  257. package/build/scripts/accessibility-scripts.d.ts.map +1 -0
  258. package/build/scripts/accessibility-scripts.js +91 -0
  259. package/build/scripts/accessibility-scripts.js.map +1 -0
  260. package/build/service.d.ts +68 -0
  261. package/build/service.d.ts.map +1 -0
  262. package/build/service.js +740 -0
  263. package/build/service.js.map +1 -0
  264. package/build/testHub/utils.d.ts +10 -0
  265. package/build/testHub/utils.d.ts.map +1 -0
  266. package/build/testHub/utils.js +67 -0
  267. package/build/testHub/utils.js.map +1 -0
  268. package/build/testOps/featureStats.d.ts +45 -0
  269. package/build/testOps/featureStats.d.ts.map +1 -0
  270. package/build/testOps/featureStats.js +117 -0
  271. package/build/testOps/featureStats.js.map +1 -0
  272. package/build/testOps/featureUsage.d.ts +22 -0
  273. package/build/testOps/featureUsage.d.ts.map +1 -0
  274. package/build/testOps/featureUsage.js +48 -0
  275. package/build/testOps/featureUsage.js.map +1 -0
  276. package/build/testOps/listener.d.ts +40 -0
  277. package/build/testOps/listener.d.ts.map +1 -0
  278. package/build/testOps/listener.js +269 -0
  279. package/build/testOps/listener.js.map +1 -0
  280. package/build/testOps/requestUtils.d.ts +4 -0
  281. package/build/testOps/requestUtils.d.ts.map +1 -0
  282. package/build/testOps/requestUtils.js +41 -0
  283. package/build/testOps/requestUtils.js.map +1 -0
  284. package/build/testOps/testOpsConfig.d.ts +11 -0
  285. package/build/testOps/testOpsConfig.d.ts.map +1 -0
  286. package/build/testOps/testOpsConfig.js +20 -0
  287. package/build/testOps/testOpsConfig.js.map +1 -0
  288. package/build/testOps/usageStats.d.ts +404 -0
  289. package/build/testOps/usageStats.d.ts.map +1 -0
  290. package/build/testOps/usageStats.js +115 -0
  291. package/build/testOps/usageStats.js.map +1 -0
  292. package/build/testorchestration/apply-orchestration.d.ts +7 -0
  293. package/build/testorchestration/apply-orchestration.d.ts.map +1 -0
  294. package/build/testorchestration/apply-orchestration.js +43 -0
  295. package/build/testorchestration/apply-orchestration.js.map +1 -0
  296. package/build/testorchestration/helpers.d.ts +20 -0
  297. package/build/testorchestration/helpers.d.ts.map +1 -0
  298. package/build/testorchestration/helpers.js +413 -0
  299. package/build/testorchestration/helpers.js.map +1 -0
  300. package/build/testorchestration/request-utils.d.ts +23 -0
  301. package/build/testorchestration/request-utils.d.ts.map +1 -0
  302. package/build/testorchestration/request-utils.js +82 -0
  303. package/build/testorchestration/request-utils.js.map +1 -0
  304. package/build/testorchestration/test-ordering-server.d.ts +33 -0
  305. package/build/testorchestration/test-ordering-server.d.ts.map +1 -0
  306. package/build/testorchestration/test-ordering-server.js +169 -0
  307. package/build/testorchestration/test-ordering-server.js.map +1 -0
  308. package/build/testorchestration/testorcherstrationhandler.d.ts +50 -0
  309. package/build/testorchestration/testorcherstrationhandler.d.ts.map +1 -0
  310. package/build/testorchestration/testorcherstrationhandler.js +134 -0
  311. package/build/testorchestration/testorcherstrationhandler.js.map +1 -0
  312. package/build/testorchestration/testorcherstrationutils.d.ts +86 -0
  313. package/build/testorchestration/testorcherstrationutils.d.ts.map +1 -0
  314. package/build/testorchestration/testorcherstrationutils.js +380 -0
  315. package/build/testorchestration/testorcherstrationutils.js.map +1 -0
  316. package/build/types.d.ts +413 -0
  317. package/build/types.d.ts.map +1 -0
  318. package/build/types.js +2 -0
  319. package/build/types.js.map +1 -0
  320. package/build/util.d.ts +241 -0
  321. package/build/util.d.ts.map +1 -0
  322. package/build/util.js +1665 -0
  323. package/build/util.js.map +1 -0
  324. package/package.json +96 -0
  325. package/src/proto/browserstack/sdk/v1/sdk-messages-accessibility.proto +71 -0
  326. package/src/proto/browserstack/sdk/v1/sdk-messages-ai.proto +48 -0
  327. package/src/proto/browserstack/sdk/v1/sdk-messages-observability.proto +39 -0
  328. package/src/proto/browserstack/sdk/v1/sdk-messages-percy.proto +10 -0
  329. package/src/proto/browserstack/sdk/v1/sdk-messages-testhub.proto +10 -0
  330. package/src/proto/browserstack/sdk/v1/sdk-messages.proto +276 -0
  331. package/src/proto/browserstack/sdk/v1/sdk.proto +41 -0
@@ -0,0 +1,184 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import url from 'node:url';
4
+ import aiSDK from '@browserstack/ai-sdk-node';
5
+ import { BStackLogger } from './bstackLogger.js';
6
+ import { TCG_URL, TCG_INFO, SUPPORTED_BROWSERS_FOR_AI, BSTACK_SERVICE_VERSION, BSTACK_TCG_AUTH_RESULT } from './constants.js';
7
+ import { handleHealingInstrumentation } from './instrumentation/funnelInstrumentation.js';
8
+ import { getBrowserStackUserAndKey, isBrowserstackInfra } from './util.js';
9
+ import PerformanceTester from './instrumentation/performance/performance-tester.js';
10
+ import * as PERFORMANCE_SDK_EVENTS from './instrumentation/performance/constants.js';
11
+ class AiHandler {
12
+ authResult;
13
+ wdioBstackVersion;
14
+ constructor() {
15
+ this.authResult = JSON.parse(process.env[BSTACK_TCG_AUTH_RESULT] || '{}');
16
+ this.wdioBstackVersion = BSTACK_SERVICE_VERSION;
17
+ }
18
+ async authenticateUser(user, key) {
19
+ return await aiSDK.BrowserstackHealing.init(key, user, TCG_URL, this.wdioBstackVersion);
20
+ }
21
+ updateCaps(authResult, options, caps) {
22
+ const installExtCondition = authResult.isAuthenticated === true && (authResult.defaultLogDataEnabled === true || options.selfHeal === true);
23
+ if (installExtCondition) {
24
+ if (Array.isArray(caps)) {
25
+ const newCaps = aiSDK.BrowserstackHealing.initializeCapabilities(caps[0]);
26
+ caps[0] = newCaps;
27
+ }
28
+ else if (typeof caps === 'object') {
29
+ caps = aiSDK.BrowserstackHealing.initializeCapabilities(caps);
30
+ }
31
+ }
32
+ else if (options.selfHeal === true) {
33
+ const healingWarnMessage = authResult.message;
34
+ BStackLogger.warn(`Healing Auth failed. Disabling healing for this session. Reason: ${healingWarnMessage}`);
35
+ }
36
+ return caps;
37
+ }
38
+ async setToken(sessionId, sessionToken) {
39
+ await aiSDK.BrowserstackHealing.setToken(sessionId, sessionToken, TCG_URL);
40
+ }
41
+ async installFirefoxExtension(browser) {
42
+ const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
43
+ const extensionPath = path.resolve(__dirname, aiSDK.BrowserstackHealing.getFirefoxAddonPath());
44
+ const extFile = fs.readFileSync(extensionPath);
45
+ await browser.installAddOn(extFile.toString('base64'), true);
46
+ }
47
+ async handleHealing(orginalFunc, using, value, browser, options) {
48
+ const sessionId = browser.sessionId;
49
+ // a utility function to escape single and double quotes
50
+ const escapeString = (str) => str.replace(/'/g, "\\'").replace(/"/g, '\\"');
51
+ const tcgDetails = escapeString(JSON.stringify({
52
+ region: TCG_INFO.tcgRegion,
53
+ tcgUrls: {
54
+ [TCG_INFO.tcgRegion]: {
55
+ endpoint: TCG_INFO.tcgUrl.split('://')[1]
56
+ }
57
+ }
58
+ }));
59
+ const locatorType = escapeString(using);
60
+ const locatorValue = escapeString(value);
61
+ this.authResult = this.authResult;
62
+ try {
63
+ const result = await orginalFunc(using, value);
64
+ if (!result.error) {
65
+ const script = await aiSDK.BrowserstackHealing.logData(locatorType, locatorValue, undefined, undefined, this.authResult.groupId, sessionId, undefined, tcgDetails);
66
+ if (script) {
67
+ await browser.execute(script);
68
+ }
69
+ return result;
70
+ }
71
+ if (options.selfHeal === true && this.authResult.isHealingEnabled) {
72
+ BStackLogger.info('findElement failed, trying to heal');
73
+ PerformanceTester.start(PERFORMANCE_SDK_EVENTS.AI_EVENTS.SELF_HEAL_STEP);
74
+ const script = await aiSDK.BrowserstackHealing.healFailure(locatorType, locatorValue, undefined, undefined, this.authResult.userId, this.authResult.groupId, sessionId, undefined, undefined, this.authResult.isGroupAIEnabled, tcgDetails);
75
+ if (script) {
76
+ await browser.execute(script);
77
+ PerformanceTester.start(PERFORMANCE_SDK_EVENTS.AI_EVENTS.SELF_HEAL_GET_RESULT);
78
+ const tcgData = await aiSDK.BrowserstackHealing.pollResult(TCG_URL, sessionId, this.authResult.sessionToken);
79
+ PerformanceTester.end(PERFORMANCE_SDK_EVENTS.AI_EVENTS.SELF_HEAL_GET_RESULT);
80
+ if (tcgData && tcgData.selector && tcgData.value) {
81
+ const healedResult = await orginalFunc(tcgData.selector, tcgData.value);
82
+ BStackLogger.info('Healing worked, element found: ' + tcgData.selector + ': ' + tcgData.value);
83
+ PerformanceTester.end(PERFORMANCE_SDK_EVENTS.AI_EVENTS.SELF_HEAL_STEP);
84
+ return healedResult.error ? result : healedResult;
85
+ }
86
+ PerformanceTester.end(PERFORMANCE_SDK_EVENTS.AI_EVENTS.SELF_HEAL_STEP, false, 'No healed result found');
87
+ }
88
+ else {
89
+ PerformanceTester.end(PERFORMANCE_SDK_EVENTS.AI_EVENTS.SELF_HEAL_STEP, false, 'No healing script generated');
90
+ }
91
+ }
92
+ }
93
+ catch (err) {
94
+ PerformanceTester.end(PERFORMANCE_SDK_EVENTS.AI_EVENTS.SELF_HEAL_STEP, false, String(err));
95
+ if (options.selfHeal === true) {
96
+ BStackLogger.warn('Something went wrong while healing. Disabling healing for this command');
97
+ }
98
+ else {
99
+ BStackLogger.warn('Error in findElement: ' + err + 'using: ' + using + 'value: ' + value);
100
+ }
101
+ }
102
+ return await orginalFunc(using, value);
103
+ }
104
+ addMultiRemoteCaps(authResult, config, browserStackConfig, options, caps, browser) {
105
+ if (caps[browser].capabilities &&
106
+ !(isBrowserstackInfra(caps[browser])) &&
107
+ SUPPORTED_BROWSERS_FOR_AI.includes(caps[browser]?.capabilities?.browserName?.toLowerCase())) {
108
+ const innerConfig = getBrowserStackUserAndKey(config, options);
109
+ if (innerConfig?.user && innerConfig.key) {
110
+ handleHealingInstrumentation(authResult, browserStackConfig, options.selfHeal);
111
+ caps[browser].capabilities = this.updateCaps(authResult, options, caps[browser].capabilities);
112
+ }
113
+ }
114
+ }
115
+ handleMultiRemoteSetup(authResult, config, browserStackConfig, options, caps) {
116
+ const browserNames = Object.keys(caps);
117
+ for (let i = 0; i < browserNames.length; i++) {
118
+ const browser = browserNames[i];
119
+ this.addMultiRemoteCaps(authResult, config, browserStackConfig, options, caps, browser);
120
+ }
121
+ }
122
+ async setup(config, browserStackConfig, options, caps, isMultiremote) {
123
+ try {
124
+ const innerConfig = getBrowserStackUserAndKey(config, options);
125
+ if (innerConfig?.user && innerConfig.key) {
126
+ const authResult = await this.authenticateUser(innerConfig.user, innerConfig.key);
127
+ process.env[BSTACK_TCG_AUTH_RESULT] = JSON.stringify(authResult);
128
+ if (!isMultiremote && SUPPORTED_BROWSERS_FOR_AI.includes(caps?.browserName?.toLowerCase())) {
129
+ handleHealingInstrumentation(authResult, browserStackConfig, options.selfHeal);
130
+ this.updateCaps(authResult, options, caps);
131
+ }
132
+ else if (isMultiremote) {
133
+ this.handleMultiRemoteSetup(authResult, config, browserStackConfig, options, caps);
134
+ }
135
+ }
136
+ }
137
+ catch (err) {
138
+ if (options.selfHeal === true) {
139
+ BStackLogger.warn(`Error while initiliazing Browserstack healing Extension ${err}`);
140
+ }
141
+ }
142
+ return caps;
143
+ }
144
+ async handleSelfHeal(options, browser) {
145
+ if (SUPPORTED_BROWSERS_FOR_AI.includes(browser.capabilities?.browserName?.toLowerCase())) {
146
+ const authInfo = this.authResult;
147
+ if (Object.keys(authInfo).length === 0 && options.selfHeal === true) {
148
+ BStackLogger.debug('TCG Auth result is empty');
149
+ return;
150
+ }
151
+ const { isAuthenticated, sessionToken, defaultLogDataEnabled } = authInfo;
152
+ if (isAuthenticated && (defaultLogDataEnabled === true || options.selfHeal === true)) {
153
+ await this.setToken(browser.sessionId, sessionToken);
154
+ if (browser.capabilities.browserName === 'firefox') {
155
+ await this.installFirefoxExtension(browser);
156
+ }
157
+ browser.overwriteCommand('findElement', async (orginalFunc, using, value) => {
158
+ return await this.handleHealing(orginalFunc, using, value, browser, options);
159
+ });
160
+ }
161
+ }
162
+ }
163
+ async selfHeal(options, caps, browser) {
164
+ try {
165
+ const multiRemoteBrowsers = Object.keys(caps).filter(e => Object.keys(browser).includes(e));
166
+ if (multiRemoteBrowsers.length > 0) {
167
+ for (let i = 0; i < multiRemoteBrowsers.length; i++) {
168
+ const remoteBrowser = browser[multiRemoteBrowsers[i]];
169
+ await this.handleSelfHeal(options, remoteBrowser);
170
+ }
171
+ }
172
+ else {
173
+ await this.handleSelfHeal(options, browser);
174
+ }
175
+ }
176
+ catch (err) {
177
+ if (options.selfHeal === true) {
178
+ BStackLogger.warn(`Error while setting up self-healing: ${err}. Disabling healing for this session.`);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ export default new AiHandler();
184
+ //# sourceMappingURL=ai-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-handler.js","sourceRoot":"","sources":["../src/ai-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare class BStackLogger {
2
+ static logFilePath: string;
3
+ static logFolderPath: string;
4
+ private static logFileStream;
5
+ static logToFile(logMessage: string, logLevel: string): void;
6
+ private static formatLog;
7
+ static info(message: string): void;
8
+ static error(message: string): void;
9
+ static debug(message: string, param?: any): void;
10
+ static warn(message: string): void;
11
+ static trace(message: string): void;
12
+ static clearLogger(): void;
13
+ static clearLogFile(): void;
14
+ static ensureLogsFolder(): void;
15
+ }
16
+ //# sourceMappingURL=bstackLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bstackLogger.d.ts","sourceRoot":"","sources":["../src/bstackLogger.ts"],"names":[],"mappings":"AAWA,qBAAa,YAAY;IACrB,OAAc,WAAW,SAAsC;IAC/D,OAAc,aAAa,SAAmC;IAC9D,OAAO,CAAC,MAAM,CAAC,aAAa,CAAuB;IAEnD,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAcrD,OAAO,CAAC,MAAM,CAAC,SAAS;WAIV,IAAI,CAAC,OAAO,EAAE,MAAM;WAKpB,KAAK,CAAC,OAAO,EAAE,MAAM;WAKrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG;WASlC,IAAI,CAAC,OAAO,EAAE,MAAM;WAKpB,KAAK,CAAC,OAAO,EAAE,MAAM;WAKrB,WAAW;WAOX,YAAY;WAMZ,gBAAgB;CAKjC"}
@@ -0,0 +1,71 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import chalk from 'chalk';
4
+ import logger from '@wdio/logger';
5
+ import { LOGS_FILE } from './constants.js';
6
+ import { COLORS } from './util.js';
7
+ const log = logger('@wdio/browserstack-service');
8
+ export class BStackLogger {
9
+ static logFilePath = path.join(process.cwd(), LOGS_FILE);
10
+ static logFolderPath = path.join(process.cwd(), 'logs');
11
+ static logFileStream;
12
+ static logToFile(logMessage, logLevel) {
13
+ try {
14
+ if (!this.logFileStream) {
15
+ this.ensureLogsFolder();
16
+ this.logFileStream = fs.createWriteStream(this.logFilePath, { flags: 'a' });
17
+ }
18
+ if (this.logFileStream && this.logFileStream.writable) {
19
+ this.logFileStream.write(this.formatLog(logMessage, logLevel));
20
+ }
21
+ }
22
+ catch (error) {
23
+ log.debug(`Failed to log to file. Error ${error}`);
24
+ }
25
+ }
26
+ static formatLog(logMessage, level) {
27
+ return `${chalk.gray(new Date().toISOString())} ${chalk[COLORS[level]](level.toUpperCase())} ${chalk.whiteBright('@wdio/browserstack-service')} ${logMessage}\n`;
28
+ }
29
+ static info(message) {
30
+ this.logToFile(message, 'info');
31
+ log.info(message);
32
+ }
33
+ static error(message) {
34
+ this.logToFile(message, 'error');
35
+ log.error(message);
36
+ }
37
+ static debug(message, param) {
38
+ this.logToFile(message, 'debug');
39
+ if (param) {
40
+ log.debug(message, param);
41
+ }
42
+ else {
43
+ log.debug(message);
44
+ }
45
+ }
46
+ static warn(message) {
47
+ this.logToFile(message, 'warn');
48
+ log.warn(message);
49
+ }
50
+ static trace(message) {
51
+ this.logToFile(message, 'trace');
52
+ log.trace(message);
53
+ }
54
+ static clearLogger() {
55
+ if (this.logFileStream) {
56
+ this.logFileStream.end();
57
+ }
58
+ this.logFileStream = null;
59
+ }
60
+ static clearLogFile() {
61
+ if (fs.existsSync(this.logFilePath)) {
62
+ fs.truncateSync(this.logFilePath);
63
+ }
64
+ }
65
+ static ensureLogsFolder() {
66
+ if (!fs.existsSync(this.logFolderPath)) {
67
+ fs.mkdirSync(this.logFolderPath);
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=bstackLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bstackLogger.js","sourceRoot":"","sources":["../src/bstackLogger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export default class BStackCleanup {
2
+ static startCleanup(): Promise<void>;
3
+ static executeObservabilityCleanup(funnelData: any): Promise<void>;
4
+ static updateO11yStopData(funnelData: any, status: string, error?: unknown): void;
5
+ static sendFunnelData(funnelData: any): Promise<void>;
6
+ static getFunnelDataFromFile(filePath: string): any;
7
+ static removeFunnelDataFile(filePath?: string): void;
8
+ }
9
+ //# sourceMappingURL=cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../src/cleanup.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,OAAO,aAAa;WACjB,YAAY;WA+BZ,2BAA2B,CAAC,UAAU,EAAE,GAAG;IAoBxD,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,OAAmB;WAkBxE,cAAc,CAAC,UAAU,EAAE,GAAG;IAS3C,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM;IAY7C,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM;CAMhD"}
@@ -0,0 +1,101 @@
1
+ import { getErrorString, stopBuildUpstream } from './util.js';
2
+ import { BStackLogger } from './bstackLogger.js';
3
+ import fs from 'node:fs';
4
+ import util from 'node:util';
5
+ import { fireFunnelRequest } from './instrumentation/funnelInstrumentation.js';
6
+ import { BROWSERSTACK_TESTHUB_UUID, BROWSERSTACK_TESTHUB_JWT, BROWSERSTACK_OBSERVABILITY } from './constants.js';
7
+ import PerformanceTester from './instrumentation/performance/performance-tester.js';
8
+ export default class BStackCleanup {
9
+ static async startCleanup() {
10
+ try {
11
+ // Get funnel data object from saved file
12
+ const funnelDataCleanup = process.argv.includes('--funnelData');
13
+ let funnelData = null;
14
+ if (funnelDataCleanup) {
15
+ const index = process.argv.indexOf('--funnelData');
16
+ const filePath = process.argv[index + 1];
17
+ funnelData = this.getFunnelDataFromFile(filePath);
18
+ }
19
+ if (process.argv.includes('--observability')) {
20
+ await this.executeObservabilityCleanup(funnelData);
21
+ }
22
+ if (funnelDataCleanup && funnelData) {
23
+ await this.sendFunnelData(funnelData);
24
+ }
25
+ }
26
+ catch (err) {
27
+ const error = err;
28
+ BStackLogger.error(error);
29
+ }
30
+ try {
31
+ if (process.argv.includes('--performanceData')) {
32
+ await PerformanceTester.uploadEventsData();
33
+ }
34
+ }
35
+ catch (er) {
36
+ BStackLogger.debug(`Error in sending events data ${util.format(er)}`);
37
+ }
38
+ }
39
+ static async executeObservabilityCleanup(funnelData) {
40
+ if (!process.env[BROWSERSTACK_TESTHUB_JWT]) {
41
+ return;
42
+ }
43
+ BStackLogger.debug('Executing Test Reporting and Analytics cleanup');
44
+ try {
45
+ const killSignal = funnelData?.event_properties?.finishedMetadata?.signal;
46
+ const result = await stopBuildUpstream(killSignal);
47
+ if (process.env[BROWSERSTACK_OBSERVABILITY] && process.env[BROWSERSTACK_TESTHUB_UUID]) {
48
+ BStackLogger.info(`\nVisit https://automation.browserstack.com/builds/${process.env[BROWSERSTACK_TESTHUB_UUID]} to view build report, insights, and many more debugging information all at one place!\n`);
49
+ }
50
+ const status = (result && result.status) || 'failed';
51
+ const message = (result && result.message);
52
+ this.updateO11yStopData(funnelData, status, status === 'failed' ? message : undefined);
53
+ }
54
+ catch (e) {
55
+ BStackLogger.error('Error in stopping Test Reporting and Analytics build: ' + e);
56
+ this.updateO11yStopData(funnelData, 'failed', e);
57
+ }
58
+ }
59
+ static updateO11yStopData(funnelData, status, error = undefined) {
60
+ const toData = funnelData?.event_properties?.productUsage?.testObservability;
61
+ // Return if no O11y data in funnel data
62
+ if (!toData) {
63
+ return;
64
+ }
65
+ let existingStopData = toData.events.buildEvents.finished;
66
+ existingStopData = existingStopData || {};
67
+ existingStopData = {
68
+ ...existingStopData,
69
+ status,
70
+ error: getErrorString(error),
71
+ stoppedFrom: 'exitHook'
72
+ };
73
+ toData.events.buildEvents.finished = existingStopData;
74
+ }
75
+ static async sendFunnelData(funnelData) {
76
+ try {
77
+ await fireFunnelRequest(funnelData);
78
+ BStackLogger.debug('Funnel data sent successfully from cleanup');
79
+ }
80
+ catch (e) {
81
+ BStackLogger.error('Error in sending funnel data: ' + e);
82
+ }
83
+ }
84
+ static getFunnelDataFromFile(filePath) {
85
+ if (!filePath) {
86
+ return null;
87
+ }
88
+ const content = fs.readFileSync(filePath, 'utf8');
89
+ const data = JSON.parse(content);
90
+ this.removeFunnelDataFile(filePath);
91
+ return data;
92
+ }
93
+ static removeFunnelDataFile(filePath) {
94
+ if (!filePath) {
95
+ return;
96
+ }
97
+ fs.rmSync(filePath, { force: true });
98
+ }
99
+ }
100
+ await BStackCleanup.startCleanup();
101
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../src/cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export default class APIUtils {
2
+ static FUNNEL_INSTRUMENTATION_URL: string;
3
+ static BROWSERSTACK_AUTOMATE_API_URL: string;
4
+ static BROWSERSTACK_AA_API_URL: string;
5
+ static BROWSERSTACK_PERCY_API_URL: string;
6
+ static BROWSERSTACK_AUTOMATE_API_CLOUD_URL: string;
7
+ static BROWSERSTACK_AA_API_CLOUD_URL: string;
8
+ static APP_ALLY_ENDPOINT: string;
9
+ static DATA_ENDPOINT: string;
10
+ static UPLOAD_LOGS_ADDRESS: string;
11
+ static EDS_URL: string;
12
+ static updateURLSForGRR(apis: GRRUrls): void;
13
+ }
14
+ //# sourceMappingURL=apiUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiUtils.d.ts","sourceRoot":"","sources":["../../src/cli/apiUtils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,MAAM,CAAC,0BAA0B,SAA8C;IAC/E,MAAM,CAAC,6BAA6B,SAAiC;IACrE,MAAM,CAAC,uBAAuB,SAAiC;IAC/D,MAAM,CAAC,0BAA0B,SAAiC;IAClE,MAAM,CAAC,mCAAmC,SAAuC;IACjF,MAAM,CAAC,6BAA6B,SAAuC;IAC3E,MAAM,CAAC,iBAAiB,SAAwD;IAChF,MAAM,CAAC,aAAa,SAAqD;IACzE,MAAM,CAAC,mBAAmB,SAAkD;IAC5E,MAAM,CAAC,OAAO,SAAiC;IAE/C,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO;CAYxC"}
@@ -0,0 +1,25 @@
1
+ export default class APIUtils {
2
+ static FUNNEL_INSTRUMENTATION_URL = 'https://api.browserstack.com/sdk/v1/event';
3
+ static BROWSERSTACK_AUTOMATE_API_URL = 'https://api.browserstack.com';
4
+ static BROWSERSTACK_AA_API_URL = 'https://api.browserstack.com';
5
+ static BROWSERSTACK_PERCY_API_URL = 'https://api.browserstack.com';
6
+ static BROWSERSTACK_AUTOMATE_API_CLOUD_URL = 'https://api-cloud.browserstack.com';
7
+ static BROWSERSTACK_AA_API_CLOUD_URL = 'https://api-cloud.browserstack.com';
8
+ static APP_ALLY_ENDPOINT = 'https://app-accessibility.browserstack.com/automate';
9
+ static DATA_ENDPOINT = 'https://collector-observability.browserstack.com';
10
+ static UPLOAD_LOGS_ADDRESS = 'https://upload-observability.browserstack.com';
11
+ static EDS_URL = 'https://eds.browserstack.com';
12
+ static updateURLSForGRR(apis) {
13
+ this.FUNNEL_INSTRUMENTATION_URL = `${apis.automate.api}/sdk/v1/event`;
14
+ this.BROWSERSTACK_AUTOMATE_API_URL = apis.automate.api;
15
+ this.BROWSERSTACK_AA_API_URL = apis.appAutomate.api;
16
+ this.BROWSERSTACK_PERCY_API_URL = apis.percy.api;
17
+ this.BROWSERSTACK_AUTOMATE_API_CLOUD_URL = apis.automate.upload;
18
+ this.BROWSERSTACK_AA_API_CLOUD_URL = apis.appAutomate.upload;
19
+ this.APP_ALLY_ENDPOINT = `${apis.appAccessibility.api}/automate`;
20
+ this.DATA_ENDPOINT = apis.observability.api;
21
+ this.UPLOAD_LOGS_ADDRESS = apis.observability.upload;
22
+ this.EDS_URL = apis.edsInstrumentation.api;
23
+ }
24
+ }
25
+ //# sourceMappingURL=apiUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiUtils.js","sourceRoot":"","sources":["../../src/cli/apiUtils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,QAAQ;IACzB,MAAM,CAAC,0BAA0B,GAAG,2CAA2C,CAAA;IAC/E,MAAM,CAAC,6BAA6B,GAAG,8BAA8B,CAAA;IACrE,MAAM,CAAC,uBAAuB,GAAG,8BAA8B,CAAA;IAC/D,MAAM,CAAC,0BAA0B,GAAG,8BAA8B,CAAA;IAClE,MAAM,CAAC,mCAAmC,GAAG,oCAAoC,CAAA;IACjF,MAAM,CAAC,6BAA6B,GAAG,oCAAoC,CAAA;IAC3E,MAAM,CAAC,iBAAiB,GAAG,qDAAqD,CAAA;IAChF,MAAM,CAAC,aAAa,GAAG,kDAAkD,CAAA;IACzE,MAAM,CAAC,mBAAmB,GAAG,+CAA+C,CAAA;IAC5E,MAAM,CAAC,OAAO,GAAG,8BAA8B,CAAA;IAE/C,MAAM,CAAC,gBAAgB,CAAC,IAAa;QACjC,IAAI,CAAC,0BAA0B,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,eAAe,CAAA;QACrE,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAA;QACtD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAA;QACnD,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA;QAChD,IAAI,CAAC,mCAAmC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA;QAC/D,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAC5D,IAAI,CAAC,iBAAiB,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAA;QAChE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAA;QAC3C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAA;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAA;IAC9C,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare class BStackLogger {
2
+ static logFilePath: string;
3
+ static logFolderPath: string;
4
+ private static logFileStream;
5
+ private static redactCredentials;
6
+ static logToFile(logMessage: string, logLevel: string): void;
7
+ private static formatLog;
8
+ static info(message: string): void;
9
+ static error(message: string): void;
10
+ static debug(message: string, param?: unknown): void;
11
+ static warn(message: string): void;
12
+ static trace(message: string): void;
13
+ static clearLogger(): void;
14
+ static clearLogFile(): void;
15
+ static ensureLogsFolder(): void;
16
+ }
17
+ //# sourceMappingURL=cliLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliLogger.d.ts","sourceRoot":"","sources":["../../src/cli/cliLogger.ts"],"names":[],"mappings":"AAWA,qBAAa,YAAY;IACrB,OAAc,WAAW,SAAsC;IAC/D,OAAc,aAAa,SAAmC;IAC9D,OAAO,CAAC,MAAM,CAAC,aAAa,CAAuB;IAEnD,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAMhC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAerD,OAAO,CAAC,MAAM,CAAC,SAAS;WAIV,IAAI,CAAC,OAAO,EAAE,MAAM;WAMpB,KAAK,CAAC,OAAO,EAAE,MAAM;WAMrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;WAUtC,IAAI,CAAC,OAAO,EAAE,MAAM;WAMpB,KAAK,CAAC,OAAO,EAAE,MAAM;WAMrB,WAAW;WAOX,YAAY;WAMZ,gBAAgB;CAKjC"}
@@ -0,0 +1,82 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import chalk from 'chalk';
4
+ import logger from '@wdio/logger';
5
+ import { LOGS_FILE } from '../constants.js';
6
+ import { COLORS } from '../util.js';
7
+ const log = logger('@wdio/browserstack-service/cli');
8
+ export class BStackLogger {
9
+ static logFilePath = path.join(process.cwd(), LOGS_FILE);
10
+ static logFolderPath = path.join(process.cwd(), 'logs');
11
+ static logFileStream;
12
+ static redactCredentials(logMessage) {
13
+ return logMessage
14
+ .replace(/([\\'"]*(?:username|accesskey|user|key)[\\'"]*\s*[:=]\s*[\\'"]*)([^\\'"\s,}]+)/gi, '$1')
15
+ .replace(/([?&](?:username|access_key|accesskey|user|key)=)([^&#\s]+)/gi, '$1');
16
+ }
17
+ static logToFile(logMessage, logLevel) {
18
+ try {
19
+ const redactedMessage = this.redactCredentials(logMessage);
20
+ if (!this.logFileStream) {
21
+ this.ensureLogsFolder();
22
+ this.logFileStream = fs.createWriteStream(this.logFilePath, { flags: 'a' });
23
+ }
24
+ if (this.logFileStream && this.logFileStream.writable) {
25
+ this.logFileStream.write(this.formatLog(redactedMessage, logLevel));
26
+ }
27
+ }
28
+ catch (error) {
29
+ log.debug(`Failed to log to file. Error ${error}`);
30
+ }
31
+ }
32
+ static formatLog(logMessage, level) {
33
+ return `${chalk.gray(new Date().toISOString())} ${chalk[COLORS[level]](level.toUpperCase())} ${chalk.whiteBright('@wdio/browserstack-service')} ${logMessage}\n`;
34
+ }
35
+ static info(message) {
36
+ const redactedMessage = this.redactCredentials(message);
37
+ this.logToFile(redactedMessage, 'info');
38
+ log.info(redactedMessage);
39
+ }
40
+ static error(message) {
41
+ const redactedMessage = this.redactCredentials(message);
42
+ this.logToFile(redactedMessage, 'error');
43
+ log.error(redactedMessage);
44
+ }
45
+ static debug(message, param) {
46
+ const redactedMessage = this.redactCredentials(message);
47
+ this.logToFile(redactedMessage, 'debug');
48
+ if (param) {
49
+ log.debug(redactedMessage, param);
50
+ }
51
+ else {
52
+ log.debug(redactedMessage);
53
+ }
54
+ }
55
+ static warn(message) {
56
+ const redactedMessage = this.redactCredentials(message);
57
+ this.logToFile(redactedMessage, 'warn');
58
+ log.warn(redactedMessage);
59
+ }
60
+ static trace(message) {
61
+ const redactedMessage = this.redactCredentials(message);
62
+ this.logToFile(redactedMessage, 'trace');
63
+ log.trace(redactedMessage);
64
+ }
65
+ static clearLogger() {
66
+ if (this.logFileStream) {
67
+ this.logFileStream.end();
68
+ }
69
+ this.logFileStream = null;
70
+ }
71
+ static clearLogFile() {
72
+ if (fs.existsSync(this.logFilePath)) {
73
+ fs.truncateSync(this.logFilePath);
74
+ }
75
+ }
76
+ static ensureLogsFolder() {
77
+ if (!fs.existsSync(this.logFolderPath)) {
78
+ fs.mkdirSync(this.logFolderPath);
79
+ }
80
+ }
81
+ }
82
+ //# sourceMappingURL=cliLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliLogger.js","sourceRoot":"","sources":["../../src/cli/cliLogger.ts"],"names":[],"mappings":"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"}