@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.
- package/LICENSE-MIT +20 -0
- package/README.md +392 -0
- package/browserstack-service.d.ts +43 -0
- package/build/Percy/Percy-Handler.d.ts +32 -0
- package/build/Percy/Percy-Handler.d.ts.map +1 -0
- package/build/Percy/Percy-Handler.js +165 -0
- package/build/Percy/Percy-Handler.js.map +1 -0
- package/build/Percy/Percy.d.ts +19 -0
- package/build/Percy/Percy.d.ts.map +1 -0
- package/build/Percy/Percy.js +164 -0
- package/build/Percy/Percy.js.map +1 -0
- package/build/Percy/PercyBinary.d.ts +10 -0
- package/build/Percy/PercyBinary.d.ts.map +1 -0
- package/build/Percy/PercyBinary.js +161 -0
- package/build/Percy/PercyBinary.js.map +1 -0
- package/build/Percy/PercyCaptureMap.d.ts +9 -0
- package/build/Percy/PercyCaptureMap.d.ts.map +1 -0
- package/build/Percy/PercyCaptureMap.js +36 -0
- package/build/Percy/PercyCaptureMap.js.map +1 -0
- package/build/Percy/PercyHelper.d.ts +8 -0
- package/build/Percy/PercyHelper.d.ts.map +1 -0
- package/build/Percy/PercyHelper.js +68 -0
- package/build/Percy/PercyHelper.js.map +1 -0
- package/build/Percy/PercyLogger.d.ts +15 -0
- package/build/Percy/PercyLogger.d.ts.map +1 -0
- package/build/Percy/PercyLogger.js +68 -0
- package/build/Percy/PercyLogger.js.map +1 -0
- package/build/Percy/PercySDK.d.ts +4 -0
- package/build/Percy/PercySDK.d.ts.map +1 -0
- package/build/Percy/PercySDK.js +86 -0
- package/build/Percy/PercySDK.js.map +1 -0
- package/build/accessibility-handler.d.ts +52 -0
- package/build/accessibility-handler.d.ts.map +1 -0
- package/build/accessibility-handler.js +361 -0
- package/build/accessibility-handler.js.map +1 -0
- package/build/ai-handler.d.ts +23 -0
- package/build/ai-handler.d.ts.map +1 -0
- package/build/ai-handler.js +184 -0
- package/build/ai-handler.js.map +1 -0
- package/build/bstackLogger.d.ts +16 -0
- package/build/bstackLogger.d.ts.map +1 -0
- package/build/bstackLogger.js +71 -0
- package/build/bstackLogger.js.map +1 -0
- package/build/cleanup.d.ts +9 -0
- package/build/cleanup.d.ts.map +1 -0
- package/build/cleanup.js +101 -0
- package/build/cleanup.js.map +1 -0
- package/build/cli/apiUtils.d.ts +14 -0
- package/build/cli/apiUtils.d.ts.map +1 -0
- package/build/cli/apiUtils.js +25 -0
- package/build/cli/apiUtils.js.map +1 -0
- package/build/cli/cliLogger.d.ts +17 -0
- package/build/cli/cliLogger.d.ts.map +1 -0
- package/build/cli/cliLogger.js +82 -0
- package/build/cli/cliLogger.js.map +1 -0
- package/build/cli/cliUtils.d.ts +64 -0
- package/build/cli/cliUtils.d.ts.map +1 -0
- package/build/cli/cliUtils.js +461 -0
- package/build/cli/cliUtils.js.map +1 -0
- package/build/cli/eventDispatcher.d.ts +28 -0
- package/build/cli/eventDispatcher.d.ts.map +1 -0
- package/build/cli/eventDispatcher.js +49 -0
- package/build/cli/eventDispatcher.js.map +1 -0
- package/build/cli/frameworks/automationFramework.d.ts +89 -0
- package/build/cli/frameworks/automationFramework.d.ts.map +1 -0
- package/build/cli/frameworks/automationFramework.js +132 -0
- package/build/cli/frameworks/automationFramework.js.map +1 -0
- package/build/cli/frameworks/constants/automationFrameworkConstants.d.ts +18 -0
- package/build/cli/frameworks/constants/automationFrameworkConstants.d.ts.map +1 -0
- package/build/cli/frameworks/constants/automationFrameworkConstants.js +18 -0
- package/build/cli/frameworks/constants/automationFrameworkConstants.js.map +1 -0
- package/build/cli/frameworks/constants/testFrameworkConstants.d.ts +43 -0
- package/build/cli/frameworks/constants/testFrameworkConstants.d.ts.map +1 -0
- package/build/cli/frameworks/constants/testFrameworkConstants.js +43 -0
- package/build/cli/frameworks/constants/testFrameworkConstants.js.map +1 -0
- package/build/cli/frameworks/testFramework.d.ts +89 -0
- package/build/cli/frameworks/testFramework.d.ts.map +1 -0
- package/build/cli/frameworks/testFramework.js +126 -0
- package/build/cli/frameworks/testFramework.js.map +1 -0
- package/build/cli/frameworks/wdioAutomationFramework.d.ts +28 -0
- package/build/cli/frameworks/wdioAutomationFramework.d.ts.map +1 -0
- package/build/cli/frameworks/wdioAutomationFramework.js +67 -0
- package/build/cli/frameworks/wdioAutomationFramework.js.map +1 -0
- package/build/cli/frameworks/wdioMochaTestFramework.d.ts +82 -0
- package/build/cli/frameworks/wdioMochaTestFramework.d.ts.map +1 -0
- package/build/cli/frameworks/wdioMochaTestFramework.js +322 -0
- package/build/cli/frameworks/wdioMochaTestFramework.js.map +1 -0
- package/build/cli/grpcClient.d.ts +86 -0
- package/build/cli/grpcClient.d.ts.map +1 -0
- package/build/cli/grpcClient.js +532 -0
- package/build/cli/grpcClient.js.map +1 -0
- package/build/cli/index.d.ts +150 -0
- package/build/cli/index.d.ts.map +1 -0
- package/build/cli/index.js +464 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/instances/automationFrameworkInstance.d.ts +33 -0
- package/build/cli/instances/automationFrameworkInstance.d.ts.map +1 -0
- package/build/cli/instances/automationFrameworkInstance.js +45 -0
- package/build/cli/instances/automationFrameworkInstance.js.map +1 -0
- package/build/cli/instances/testFrameworkInstance.d.ts +62 -0
- package/build/cli/instances/testFrameworkInstance.d.ts.map +1 -0
- package/build/cli/instances/testFrameworkInstance.js +97 -0
- package/build/cli/instances/testFrameworkInstance.js.map +1 -0
- package/build/cli/instances/trackedContext.d.ts +32 -0
- package/build/cli/instances/trackedContext.d.ts.map +1 -0
- package/build/cli/instances/trackedContext.js +48 -0
- package/build/cli/instances/trackedContext.js.map +1 -0
- package/build/cli/instances/trackedInstance.d.ts +40 -0
- package/build/cli/instances/trackedInstance.d.ts.map +1 -0
- package/build/cli/instances/trackedInstance.js +64 -0
- package/build/cli/instances/trackedInstance.js.map +1 -0
- package/build/cli/modules/accessibilityModule.d.ts +46 -0
- package/build/cli/modules/accessibilityModule.d.ts.map +1 -0
- package/build/cli/modules/accessibilityModule.js +447 -0
- package/build/cli/modules/accessibilityModule.js.map +1 -0
- package/build/cli/modules/automateModule.d.ts +26 -0
- package/build/cli/modules/automateModule.d.ts.map +1 -0
- package/build/cli/modules/automateModule.js +223 -0
- package/build/cli/modules/automateModule.js.map +1 -0
- package/build/cli/modules/baseModule.d.ts +33 -0
- package/build/cli/modules/baseModule.d.ts.map +1 -0
- package/build/cli/modules/baseModule.js +52 -0
- package/build/cli/modules/baseModule.js.map +1 -0
- package/build/cli/modules/observabilityModule.d.ts +22 -0
- package/build/cli/modules/observabilityModule.d.ts.map +1 -0
- package/build/cli/modules/observabilityModule.js +46 -0
- package/build/cli/modules/observabilityModule.js.map +1 -0
- package/build/cli/modules/percyModule.d.ts +19 -0
- package/build/cli/modules/percyModule.d.ts.map +1 -0
- package/build/cli/modules/percyModule.js +78 -0
- package/build/cli/modules/percyModule.js.map +1 -0
- package/build/cli/modules/testHubModule.d.ts +30 -0
- package/build/cli/modules/testHubModule.d.ts.map +1 -0
- package/build/cli/modules/testHubModule.js +233 -0
- package/build/cli/modules/testHubModule.js.map +1 -0
- package/build/cli/modules/webdriverIOModule.d.ts +29 -0
- package/build/cli/modules/webdriverIOModule.d.ts.map +1 -0
- package/build/cli/modules/webdriverIOModule.js +129 -0
- package/build/cli/modules/webdriverIOModule.js.map +1 -0
- package/build/cli/states/automationFrameworkState.d.ts +65 -0
- package/build/cli/states/automationFrameworkState.d.ts.map +1 -0
- package/build/cli/states/automationFrameworkState.js +62 -0
- package/build/cli/states/automationFrameworkState.js.map +1 -0
- package/build/cli/states/hookState.d.ts +45 -0
- package/build/cli/states/hookState.d.ts.map +1 -0
- package/build/cli/states/hookState.js +44 -0
- package/build/cli/states/hookState.js.map +1 -0
- package/build/cli/states/testFrameworkState.d.ts +125 -0
- package/build/cli/states/testFrameworkState.d.ts.map +1 -0
- package/build/cli/states/testFrameworkState.js +116 -0
- package/build/cli/states/testFrameworkState.js.map +1 -0
- package/build/config.d.ts +29 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +52 -0
- package/build/config.js.map +1 -0
- package/build/constants.d.ts +96 -0
- package/build/constants.d.ts.map +1 -0
- package/build/constants.js +156 -0
- package/build/constants.js.map +1 -0
- package/build/crash-reporter.d.ts +18 -0
- package/build/crash-reporter.d.ts.map +1 -0
- package/build/crash-reporter.js +134 -0
- package/build/crash-reporter.js.map +1 -0
- package/build/cucumber-types.d.ts +194 -0
- package/build/cucumber-types.d.ts.map +1 -0
- package/build/cucumber-types.js +2 -0
- package/build/cucumber-types.js.map +1 -0
- package/build/data-store.d.ts +4 -0
- package/build/data-store.d.ts.map +1 -0
- package/build/data-store.js +42 -0
- package/build/data-store.js.map +1 -0
- package/build/exitHandler.d.ts +4 -0
- package/build/exitHandler.d.ts.map +1 -0
- package/build/exitHandler.js +105 -0
- package/build/exitHandler.js.map +1 -0
- package/build/fileStream.d.ts +9 -0
- package/build/fileStream.d.ts.map +1 -0
- package/build/fileStream.js +13 -0
- package/build/fileStream.js.map +1 -0
- package/build/grpc/generated/sdk-messages-accessibility.d.ts +76 -0
- package/build/grpc/generated/sdk-messages-accessibility.d.ts.map +1 -0
- package/build/grpc/generated/sdk-messages-accessibility.js +908 -0
- package/build/grpc/generated/sdk-messages-accessibility.js.map +1 -0
- package/build/grpc/generated/sdk-messages-ai.d.ts +52 -0
- package/build/grpc/generated/sdk-messages-ai.d.ts.map +1 -0
- package/build/grpc/generated/sdk-messages-ai.js +643 -0
- package/build/grpc/generated/sdk-messages-ai.js.map +1 -0
- package/build/grpc/generated/sdk-messages-observability.d.ts +44 -0
- package/build/grpc/generated/sdk-messages-observability.d.ts.map +1 -0
- package/build/grpc/generated/sdk-messages-observability.js +505 -0
- package/build/grpc/generated/sdk-messages-observability.js.map +1 -0
- package/build/grpc/generated/sdk-messages-percy.d.ts +16 -0
- package/build/grpc/generated/sdk-messages-percy.d.ts.map +1 -0
- package/build/grpc/generated/sdk-messages-percy.js +111 -0
- package/build/grpc/generated/sdk-messages-percy.js.map +1 -0
- package/build/grpc/generated/sdk-messages-testhub.d.ts +16 -0
- package/build/grpc/generated/sdk-messages-testhub.d.ts.map +1 -0
- package/build/grpc/generated/sdk-messages-testhub.js +132 -0
- package/build/grpc/generated/sdk-messages-testhub.js.map +1 -0
- package/build/grpc/generated/sdk-messages.d.ts +288 -0
- package/build/grpc/generated/sdk-messages.d.ts.map +1 -0
- package/build/grpc/generated/sdk-messages.js +3958 -0
- package/build/grpc/generated/sdk-messages.js.map +1 -0
- package/build/grpc/generated/sdk.d.ts +282 -0
- package/build/grpc/generated/sdk.d.ts.map +1 -0
- package/build/grpc/generated/sdk.js +197 -0
- package/build/grpc/generated/sdk.js.map +1 -0
- package/build/grpc/index.d.ts +43 -0
- package/build/grpc/index.d.ts.map +1 -0
- package/build/grpc/index.js +154 -0
- package/build/grpc/index.js.map +1 -0
- package/build/index.d.ts +20 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +13 -0
- package/build/index.js.map +1 -0
- package/build/insights-handler.d.ts +76 -0
- package/build/insights-handler.d.ts.map +1 -0
- package/build/insights-handler.js +855 -0
- package/build/insights-handler.js.map +1 -0
- package/build/instrumentation/funnelInstrumentation.d.ts +8 -0
- package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -0
- package/build/instrumentation/funnelInstrumentation.js +235 -0
- package/build/instrumentation/funnelInstrumentation.js.map +1 -0
- package/build/instrumentation/performance/constants.d.ts +151 -0
- package/build/instrumentation/performance/constants.d.ts.map +1 -0
- package/build/instrumentation/performance/constants.js +158 -0
- package/build/instrumentation/performance/constants.js.map +1 -0
- package/build/instrumentation/performance/performance-tester.d.ts +55 -0
- package/build/instrumentation/performance/performance-tester.d.ts.map +1 -0
- package/build/instrumentation/performance/performance-tester.js +403 -0
- package/build/instrumentation/performance/performance-tester.js.map +1 -0
- package/build/launcher.d.ts +49 -0
- package/build/launcher.d.ts.map +1 -0
- package/build/launcher.js +1077 -0
- package/build/launcher.js.map +1 -0
- package/build/log4jsAppender.d.ts +2 -0
- package/build/log4jsAppender.d.ts.map +1 -0
- package/build/log4jsAppender.js +20 -0
- package/build/log4jsAppender.js.map +1 -0
- package/build/logPatcher.d.ts +13 -0
- package/build/logPatcher.d.ts.map +1 -0
- package/build/logPatcher.js +39 -0
- package/build/logPatcher.js.map +1 -0
- package/build/logReportingAPI.d.ts +12 -0
- package/build/logReportingAPI.d.ts.map +1 -0
- package/build/logReportingAPI.js +57 -0
- package/build/logReportingAPI.js.map +1 -0
- package/build/reporter.d.ts +40 -0
- package/build/reporter.d.ts.map +1 -0
- package/build/reporter.js +254 -0
- package/build/reporter.js.map +1 -0
- package/build/request-handler.d.ts +19 -0
- package/build/request-handler.d.ts.map +1 -0
- package/build/request-handler.js +78 -0
- package/build/request-handler.js.map +1 -0
- package/build/scripts/accessibility-scripts.d.ts +26 -0
- package/build/scripts/accessibility-scripts.d.ts.map +1 -0
- package/build/scripts/accessibility-scripts.js +91 -0
- package/build/scripts/accessibility-scripts.js.map +1 -0
- package/build/service.d.ts +68 -0
- package/build/service.d.ts.map +1 -0
- package/build/service.js +740 -0
- package/build/service.js.map +1 -0
- package/build/testHub/utils.d.ts +10 -0
- package/build/testHub/utils.d.ts.map +1 -0
- package/build/testHub/utils.js +67 -0
- package/build/testHub/utils.js.map +1 -0
- package/build/testOps/featureStats.d.ts +45 -0
- package/build/testOps/featureStats.d.ts.map +1 -0
- package/build/testOps/featureStats.js +117 -0
- package/build/testOps/featureStats.js.map +1 -0
- package/build/testOps/featureUsage.d.ts +22 -0
- package/build/testOps/featureUsage.d.ts.map +1 -0
- package/build/testOps/featureUsage.js +48 -0
- package/build/testOps/featureUsage.js.map +1 -0
- package/build/testOps/listener.d.ts +40 -0
- package/build/testOps/listener.d.ts.map +1 -0
- package/build/testOps/listener.js +269 -0
- package/build/testOps/listener.js.map +1 -0
- package/build/testOps/requestUtils.d.ts +4 -0
- package/build/testOps/requestUtils.d.ts.map +1 -0
- package/build/testOps/requestUtils.js +41 -0
- package/build/testOps/requestUtils.js.map +1 -0
- package/build/testOps/testOpsConfig.d.ts +11 -0
- package/build/testOps/testOpsConfig.d.ts.map +1 -0
- package/build/testOps/testOpsConfig.js +20 -0
- package/build/testOps/testOpsConfig.js.map +1 -0
- package/build/testOps/usageStats.d.ts +404 -0
- package/build/testOps/usageStats.d.ts.map +1 -0
- package/build/testOps/usageStats.js +115 -0
- package/build/testOps/usageStats.js.map +1 -0
- package/build/testorchestration/apply-orchestration.d.ts +7 -0
- package/build/testorchestration/apply-orchestration.d.ts.map +1 -0
- package/build/testorchestration/apply-orchestration.js +43 -0
- package/build/testorchestration/apply-orchestration.js.map +1 -0
- package/build/testorchestration/helpers.d.ts +20 -0
- package/build/testorchestration/helpers.d.ts.map +1 -0
- package/build/testorchestration/helpers.js +413 -0
- package/build/testorchestration/helpers.js.map +1 -0
- package/build/testorchestration/request-utils.d.ts +23 -0
- package/build/testorchestration/request-utils.d.ts.map +1 -0
- package/build/testorchestration/request-utils.js +82 -0
- package/build/testorchestration/request-utils.js.map +1 -0
- package/build/testorchestration/test-ordering-server.d.ts +33 -0
- package/build/testorchestration/test-ordering-server.d.ts.map +1 -0
- package/build/testorchestration/test-ordering-server.js +169 -0
- package/build/testorchestration/test-ordering-server.js.map +1 -0
- package/build/testorchestration/testorcherstrationhandler.d.ts +50 -0
- package/build/testorchestration/testorcherstrationhandler.d.ts.map +1 -0
- package/build/testorchestration/testorcherstrationhandler.js +134 -0
- package/build/testorchestration/testorcherstrationhandler.js.map +1 -0
- package/build/testorchestration/testorcherstrationutils.d.ts +86 -0
- package/build/testorchestration/testorcherstrationutils.d.ts.map +1 -0
- package/build/testorchestration/testorcherstrationutils.js +380 -0
- package/build/testorchestration/testorcherstrationutils.js.map +1 -0
- package/build/types.d.ts +413 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +2 -0
- package/build/types.js.map +1 -0
- package/build/util.d.ts +241 -0
- package/build/util.d.ts.map +1 -0
- package/build/util.js +1665 -0
- package/build/util.js.map +1 -0
- package/package.json +96 -0
- package/src/proto/browserstack/sdk/v1/sdk-messages-accessibility.proto +71 -0
- package/src/proto/browserstack/sdk/v1/sdk-messages-ai.proto +48 -0
- package/src/proto/browserstack/sdk/v1/sdk-messages-observability.proto +39 -0
- package/src/proto/browserstack/sdk/v1/sdk-messages-percy.proto +10 -0
- package/src/proto/browserstack/sdk/v1/sdk-messages-testhub.proto +10 -0
- package/src/proto/browserstack/sdk/v1/sdk-messages.proto +276 -0
- 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"}
|
package/build/cleanup.js
ADDED
|
@@ -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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"}
|