@wdio/browserstack-service 7.35.0 → 7.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/build/bstackLogger.d.ts +14 -0
  2. package/build/bstackLogger.d.ts.map +1 -0
  3. package/build/bstackLogger.js +52 -0
  4. package/build/cleanup.d.ts +6 -2
  5. package/build/cleanup.d.ts.map +1 -1
  6. package/build/cleanup.js +104 -12
  7. package/build/config.d.ts +23 -0
  8. package/build/config.d.ts.map +1 -0
  9. package/build/config.js +32 -0
  10. package/build/constants.d.ts +17 -0
  11. package/build/constants.d.ts.map +1 -1
  12. package/build/constants.js +34 -1
  13. package/build/crash-reporter.js +1 -1
  14. package/build/data-store.d.ts +3 -0
  15. package/build/data-store.d.ts.map +1 -0
  16. package/build/data-store.js +49 -0
  17. package/build/exitHandler.d.ts +4 -0
  18. package/build/exitHandler.d.ts.map +1 -0
  19. package/build/exitHandler.js +37 -0
  20. package/build/insights-handler.d.ts +5 -11
  21. package/build/insights-handler.d.ts.map +1 -1
  22. package/build/insights-handler.js +45 -106
  23. package/build/instrumentation/funnelInstrumentation.d.ts +6 -0
  24. package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -0
  25. package/build/instrumentation/funnelInstrumentation.js +127 -0
  26. package/build/launcher.d.ts +1 -2
  27. package/build/launcher.d.ts.map +1 -1
  28. package/build/launcher.js +21 -20
  29. package/build/reporter.d.ts +3 -3
  30. package/build/reporter.d.ts.map +1 -1
  31. package/build/reporter.js +10 -23
  32. package/build/request-handler.d.ts +5 -13
  33. package/build/request-handler.d.ts.map +1 -1
  34. package/build/request-handler.js +27 -48
  35. package/build/service.d.ts +1 -0
  36. package/build/service.d.ts.map +1 -1
  37. package/build/service.js +14 -6
  38. package/build/testOps/featureStats.d.ts +45 -0
  39. package/build/testOps/featureStats.d.ts.map +1 -0
  40. package/build/testOps/featureStats.js +120 -0
  41. package/build/testOps/featureUsage.d.ts +22 -0
  42. package/build/testOps/featureUsage.d.ts.map +1 -0
  43. package/build/testOps/featureUsage.js +46 -0
  44. package/build/testOps/listener.d.ts +33 -0
  45. package/build/testOps/listener.d.ts.map +1 -0
  46. package/build/testOps/listener.js +228 -0
  47. package/build/testOps/requestUtils.d.ts +4 -0
  48. package/build/testOps/requestUtils.d.ts.map +1 -0
  49. package/build/testOps/requestUtils.js +47 -0
  50. package/build/testOps/testOpsConfig.d.ts +11 -0
  51. package/build/testOps/testOpsConfig.d.ts.map +1 -0
  52. package/build/testOps/testOpsConfig.js +17 -0
  53. package/build/testOps/usageStats.d.ts +404 -0
  54. package/build/testOps/usageStats.d.ts.map +1 -0
  55. package/build/testOps/usageStats.js +110 -0
  56. package/build/types.d.ts +33 -7
  57. package/build/types.d.ts.map +1 -1
  58. package/build/util.d.ts +2 -6
  59. package/build/util.d.ts.map +1 -1
  60. package/build/util.js +60 -66
  61. package/package.json +3 -3
@@ -0,0 +1,14 @@
1
+ export declare class BStackLogger {
2
+ static logFilePath: string;
3
+ static logFolderPath: string;
4
+ private static logFileStream;
5
+ static info(message: string): void;
6
+ static error(message: string): void;
7
+ static debug(message: string, param?: any): void;
8
+ static warn(message: string): void;
9
+ static trace(message: string): void;
10
+ static clearLogger(): void;
11
+ static clearLogFile(): void;
12
+ static ensureLogsFolder(): void;
13
+ }
14
+ //# sourceMappingURL=bstackLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bstackLogger.d.ts","sourceRoot":"","sources":["../src/bstackLogger.ts"],"names":[],"mappings":"AASA,qBAAa,YAAY;IACrB,OAAc,WAAW,SAAsC;IAC/D,OAAc,aAAa,SAAmC;IAC9D,OAAO,CAAC,MAAM,CAAC,aAAa,CAAuB;WAErC,IAAI,CAAC,OAAO,EAAE,MAAM;WAIpB,KAAK,CAAC,OAAO,EAAE,MAAM;WAIrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG;WAQlC,IAAI,CAAC,OAAO,EAAE,MAAM;WAIpB,KAAK,CAAC,OAAO,EAAE,MAAM;WAIrB,WAAW;WAOX,YAAY;WAMZ,gBAAgB;CAKjC"}
@@ -0,0 +1,52 @@
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.BStackLogger = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const logger_1 = __importDefault(require("@wdio/logger"));
10
+ const constants_1 = require("./constants");
11
+ const log = (0, logger_1.default)('@wdio/browserstack-service');
12
+ class BStackLogger {
13
+ static info(message) {
14
+ log.info(message);
15
+ }
16
+ static error(message) {
17
+ log.error(message);
18
+ }
19
+ static debug(message, param) {
20
+ if (param) {
21
+ log.debug(message, param);
22
+ }
23
+ else {
24
+ log.debug(message);
25
+ }
26
+ }
27
+ static warn(message) {
28
+ log.warn(message);
29
+ }
30
+ static trace(message) {
31
+ log.trace(message);
32
+ }
33
+ static clearLogger() {
34
+ if (this.logFileStream) {
35
+ this.logFileStream.end();
36
+ }
37
+ this.logFileStream = null;
38
+ }
39
+ static clearLogFile() {
40
+ if (node_fs_1.default.existsSync(this.logFilePath)) {
41
+ node_fs_1.default.truncateSync(this.logFilePath);
42
+ }
43
+ }
44
+ static ensureLogsFolder() {
45
+ if (!node_fs_1.default.existsSync(this.logFolderPath)) {
46
+ node_fs_1.default.mkdirSync(this.logFolderPath);
47
+ }
48
+ }
49
+ }
50
+ exports.BStackLogger = BStackLogger;
51
+ BStackLogger.logFilePath = node_path_1.default.join(process.cwd(), constants_1.LOGS_FILE);
52
+ BStackLogger.logFolderPath = node_path_1.default.join(process.cwd(), 'logs');
@@ -1,5 +1,9 @@
1
1
  export default class BStackCleanup {
2
- static startCleanup(): void;
3
- static executeObservabilityCleanup(): void;
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 removeFunnelDataFile(filePath?: string): void;
7
+ static getFunnelDataFromFile(filePath: string): any;
4
8
  }
5
9
  //# sourceMappingURL=cleanup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../src/cleanup.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,aAAa;IAC9B,MAAM,CAAC,YAAY;IAGnB,MAAM,CAAC,2BAA2B;CAarC"}
1
+ {"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../src/cleanup.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,OAAO,OAAO,aAAa;WACjB,YAAY;WAmBZ,2BAA2B,CAAC,UAAU,EAAE,GAAG;IAsBxD,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,OAAmB;WAkBxE,cAAc,CAAC,UAAU,EAAE,GAAG;IAS3C,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM;IAO7C,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM;CAWhD"}
package/build/cleanup.js CHANGED
@@ -1,23 +1,115 @@
1
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
+ };
2
28
  Object.defineProperty(exports, "__esModule", { value: true });
3
29
  const util_1 = require("./util");
30
+ const fs_1 = __importDefault(require("fs"));
31
+ const bstackLogger_1 = require("./bstackLogger");
32
+ const funnelInstrumentation_1 = require("./instrumentation/funnelInstrumentation");
33
+ const constants_1 = require("./constants");
34
+ const process = __importStar(require("process"));
4
35
  class BStackCleanup {
5
- static startCleanup() {
6
- this.executeObservabilityCleanup();
36
+ static async startCleanup() {
37
+ // Get funnel data object from saved file
38
+ const funnelDataCleanup = process.argv.includes('--funnelData');
39
+ let funnelData = null;
40
+ if (funnelDataCleanup) {
41
+ const index = process.argv.indexOf('--funnelData');
42
+ const filePath = process.argv[index + 1];
43
+ funnelData = this.getFunnelDataFromFile(filePath);
44
+ }
45
+ if (process.argv.includes('--observability')) {
46
+ await this.executeObservabilityCleanup(funnelData);
47
+ }
48
+ if (funnelDataCleanup && funnelData) {
49
+ await this.sendFunnelData(funnelData);
50
+ }
7
51
  }
8
- static executeObservabilityCleanup() {
9
- if (!process.env.BS_TESTOPS_JWT) {
52
+ static async executeObservabilityCleanup(funnelData) {
53
+ if (!process.env[constants_1.TESTOPS_JWT_ENV]) {
10
54
  return;
11
55
  }
12
- console.log('Executing observability cleanup');
13
- (0, util_1.stopBuildUpstream)().then(() => {
14
- if (process.env.BS_TESTOPS_BUILD_HASHED_ID) {
15
- console.log(`\nVisit https://observability.browserstack.com/builds/${process.env.BS_TESTOPS_BUILD_HASHED_ID} to view build report, insights, and many more debugging information all at one place!\n`);
56
+ bstackLogger_1.BStackLogger.debug('Executing observability cleanup');
57
+ try {
58
+ const result = await (0, util_1.stopBuildUpstream)();
59
+ if (process.env[constants_1.TESTOPS_BUILD_ID_ENV]) {
60
+ bstackLogger_1.BStackLogger.info(`\nVisit https://observability.browserstack.com/builds/${process.env[constants_1.TESTOPS_BUILD_ID_ENV]} to view build report, insights, and many more debugging information all at one place!\n`);
16
61
  }
17
- }).catch((err) => {
18
- console.error(err);
19
- });
62
+ const status = (result && result.status) || 'failed';
63
+ const message = (result && result.message);
64
+ this.updateO11yStopData(funnelData, status, status === 'failed' ? message : undefined);
65
+ }
66
+ catch (e) {
67
+ bstackLogger_1.BStackLogger.error('Error in stopping Observability build: ' + e);
68
+ this.updateO11yStopData(funnelData, 'failed', e);
69
+ }
70
+ }
71
+ static updateO11yStopData(funnelData, status, error = undefined) {
72
+ var _a, _b;
73
+ const toData = (_b = (_a = funnelData === null || funnelData === void 0 ? void 0 : funnelData.event_properties) === null || _a === void 0 ? void 0 : _a.productUsage) === null || _b === void 0 ? void 0 : _b.testObservability;
74
+ // Return if no O11y data in funnel data
75
+ if (!toData) {
76
+ return;
77
+ }
78
+ let existingStopData = toData.events.buildEvents.finished;
79
+ existingStopData = existingStopData || {};
80
+ existingStopData = {
81
+ ...existingStopData,
82
+ status,
83
+ error: (0, util_1.getErrorString)(error),
84
+ stoppedFrom: 'exitHook'
85
+ };
86
+ toData.events.buildEvents.finished = existingStopData;
87
+ }
88
+ static async sendFunnelData(funnelData) {
89
+ try {
90
+ await (0, funnelInstrumentation_1.fireFunnelRequest)(funnelData);
91
+ bstackLogger_1.BStackLogger.debug('Funnel data sent successfully from cleanup');
92
+ }
93
+ catch (e) {
94
+ bstackLogger_1.BStackLogger.error('Error in sending funnel data: ' + e);
95
+ }
96
+ }
97
+ static removeFunnelDataFile(filePath) {
98
+ if (!filePath) {
99
+ return;
100
+ }
101
+ fs_1.default.rmSync(filePath, { force: true });
102
+ }
103
+ static getFunnelDataFromFile(filePath) {
104
+ if (!filePath) {
105
+ return null;
106
+ }
107
+ bstackLogger_1.BStackLogger.debug('Getting saved funnel data from file ' + filePath);
108
+ const content = fs_1.default.readFileSync(filePath, 'utf8');
109
+ const data = JSON.parse(content);
110
+ this.removeFunnelDataFile(filePath);
111
+ return data;
20
112
  }
21
113
  }
22
114
  exports.default = BStackCleanup;
23
- BStackCleanup.startCleanup();
115
+ (async () => await BStackCleanup.startCleanup())();
@@ -0,0 +1,23 @@
1
+ import type { AppConfig, BrowserstackConfig } from './types';
2
+ import type { Options } from '@wdio/types';
3
+ import TestOpsConfig from './testOps/testOpsConfig';
4
+ declare class BrowserStackConfig {
5
+ static getInstance(options?: BrowserstackConfig & Options.Testrunner, config?: Options.Testrunner): BrowserStackConfig;
6
+ userName?: string;
7
+ accessKey?: string;
8
+ framework?: string;
9
+ buildName?: string;
10
+ buildIdentifier?: string;
11
+ testObservability: TestOpsConfig;
12
+ percy: boolean;
13
+ accessibility: boolean;
14
+ app?: string | AppConfig;
15
+ private static _instance;
16
+ appAutomate: boolean;
17
+ automate: boolean;
18
+ funnelDataSent: boolean;
19
+ constructor(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner);
20
+ sentFunnelData(): void;
21
+ }
22
+ export default BrowserStackConfig;
23
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,aAAa,MAAM,yBAAyB,CAAA;AAGnD,cAAM,kBAAkB;IACpB,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,GAAG,kBAAkB;IAO/G,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,aAAa,CAAA;IAChC,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,EAAE,OAAO,CAAA;IACtB,GAAG,CAAC,EAAE,MAAM,GAAC,SAAS,CAAA;IAC7B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAoB;IACrC,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,OAAO,CAAQ;gBAE1B,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU;IAaxF,cAAc;CAIjB;AAED,eAAe,kBAAkB,CAAA"}
@@ -0,0 +1,32 @@
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
+ const testOpsConfig_1 = __importDefault(require("./testOps/testOpsConfig"));
7
+ const util_1 = require("./util");
8
+ class BrowserStackConfig {
9
+ static getInstance(options, config) {
10
+ if (!this._instance && options && config) {
11
+ this._instance = new BrowserStackConfig(options, config);
12
+ }
13
+ return this._instance;
14
+ }
15
+ constructor(options, config) {
16
+ this.funnelDataSent = false;
17
+ this.framework = config.framework;
18
+ this.userName = config.user;
19
+ this.accessKey = config.key;
20
+ this.testObservability = new testOpsConfig_1.default(options.testObservability !== false, !(0, util_1.isUndefined)(options.testObservability));
21
+ this.percy = options.percy || false;
22
+ this.accessibility = options.accessibility || false;
23
+ this.app = options.app;
24
+ this.appAutomate = !(0, util_1.isUndefined)(options.app);
25
+ this.automate = !this.appAutomate;
26
+ this.buildIdentifier = options.buildIdentifier;
27
+ }
28
+ sentFunnelData() {
29
+ this.funnelDataSent = true;
30
+ }
31
+ }
32
+ exports.default = BrowserStackConfig;
@@ -12,9 +12,26 @@ export declare const DATA_BATCH_INTERVAL = 2000;
12
12
  export declare const BATCH_EVENT_TYPES: string[];
13
13
  export declare const DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = 5000;
14
14
  export declare const DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = 100;
15
+ export declare const BSTACK_SERVICE_VERSION: string;
15
16
  export declare const ACCESSIBILITY_API_URL = "https://accessibility.browserstack.com/api";
16
17
  export declare const NOT_ALLOWED_KEYS_IN_CAPS: string[];
18
+ export declare const LOGS_FILE = "logs/bstack-wdio-service.log";
19
+ export declare const COLORS: Record<string, string>;
17
20
  export declare const PERCY_LOGS_FILE = "logs/percy.log";
18
21
  export declare const PERCY_DOM_CHANGING_COMMANDS_ENDPOINTS: string[];
19
22
  export declare const CAPTURE_MODES: string[];
23
+ export declare const LOG_KIND_USAGE_MAP: {
24
+ TEST_LOG: string;
25
+ TEST_SCREENSHOT: string;
26
+ TEST_STEP: string;
27
+ HTTP: string;
28
+ };
29
+ export declare const FUNNEL_INSTRUMENTATION_URL = "https://api.browserstack.com/sdk/v1/event";
30
+ export declare const TESTOPS_JWT_ENV = "BS_TESTOPS_JWT";
31
+ export declare const TESTOPS_SCREENSHOT_ENV = "BS_TESTOPS_ALLOW_SCREENSHOTS";
32
+ export declare const TESTOPS_BUILD_ID_ENV = "BS_TESTOPS_BUILD_HASHED_ID";
33
+ export declare const PERF_MEASUREMENT_ENV = "BROWSERSTACK_O11Y_PERF_MEASUREMENT";
34
+ export declare const RERUN_TESTS_ENV = "BROWSERSTACK_RERUN_TESTS";
35
+ export declare const RERUN_ENV = "BROWSERSTACK_RERUN";
36
+ export declare const TESTOPS_BUILD_COMPLETED_ENV = "BS_TESTOPS_BUILD_COMPLETED";
20
37
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAEjD,eAAO,MAAM,mBAAmB,qHAStB,CAAA;AAEV,eAAO,MAAM,mBAAmB,UAI/B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,CAKvD,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,OAAO,OAAoC,CAAA;AACvE,eAAO,MAAM,aAAa,qDAAqD,CAAA;AAC/E,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAC5D,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,eAAO,MAAM,iBAAiB,UAAgH,CAAA;AAC9I,eAAO,MAAM,wCAAwC,OAAO,CAAA;AAC5D,eAAO,MAAM,yCAAyC,MAAM,CAAA;AAE5D,eAAO,MAAM,qBAAqB,+CAA+C,CAAA;AACjF,eAAO,MAAM,wBAAwB,UAA6D,CAAA;AAElG,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAE/C,eAAO,MAAM,qCAAqC,UAQjD,CAAA;AAED,eAAO,MAAM,aAAa,UAAwD,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAGjD,eAAO,MAAM,mBAAmB,qHAStB,CAAA;AAEV,eAAO,MAAM,mBAAmB,UAI/B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,OAAO,CAAC,kBAAkB,CAKvD,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,OAAO,OAAoC,CAAA;AACvE,eAAO,MAAM,aAAa,qDAAqD,CAAA;AAC/E,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,mBAAmB,iBAAiB,CAAA;AACjD,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAC5D,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,eAAO,MAAM,iBAAiB,UAAgH,CAAA;AAC9I,eAAO,MAAM,wCAAwC,OAAO,CAAA;AAC5D,eAAO,MAAM,yCAAyC,MAAM,CAAA;AAE5D,eAAO,MAAM,sBAAsB,QAAuB,CAAA;AAE1D,eAAO,MAAM,qBAAqB,+CAA+C,CAAA;AACjF,eAAO,MAAM,wBAAwB,UAA6D,CAAA;AAElG,eAAO,MAAM,SAAS,iCAAiC,CAAA;AACvD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAOzC,CAAA;AAED,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAE/C,eAAO,MAAM,qCAAqC,UAQjD,CAAA;AAED,eAAO,MAAM,aAAa,UAAwD,CAAA;AAElF,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAA;AAED,eAAO,MAAM,0BAA0B,8CAA8C,CAAA;AAKrF,eAAO,MAAM,eAAe,mBAAmB,CAAA;AAG/C,eAAO,MAAM,sBAAsB,iCAAiC,CAAA;AAGpE,eAAO,MAAM,oBAAoB,+BAA+B,CAAA;AAGhE,eAAO,MAAM,oBAAoB,uCAAuC,CAAA;AAGxE,eAAO,MAAM,eAAe,6BAA6B,CAAA;AAGzD,eAAO,MAAM,SAAS,uBAAuB,CAAA;AAG7C,eAAO,MAAM,2BAA2B,+BAA+B,CAAA"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CAPTURE_MODES = exports.PERCY_DOM_CHANGING_COMMANDS_ENDPOINTS = exports.PERCY_LOGS_FILE = exports.NOT_ALLOWED_KEYS_IN_CAPS = exports.ACCESSIBILITY_API_URL = exports.DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = exports.DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = exports.BATCH_EVENT_TYPES = exports.DATA_BATCH_INTERVAL = exports.DATA_BATCH_SIZE = exports.DATA_SCREENSHOT_ENDPOINT = exports.DATA_BATCH_ENDPOINT = exports.DATA_EVENT_ENDPOINT = exports.DATA_ENDPOINT = exports.consoleHolder = exports.DEFAULT_OPTIONS = exports.VALID_APP_EXTENSION = exports.BROWSER_DESCRIPTION = void 0;
3
+ exports.TESTOPS_BUILD_COMPLETED_ENV = exports.RERUN_ENV = exports.RERUN_TESTS_ENV = exports.PERF_MEASUREMENT_ENV = exports.TESTOPS_BUILD_ID_ENV = exports.TESTOPS_SCREENSHOT_ENV = exports.TESTOPS_JWT_ENV = exports.FUNNEL_INSTRUMENTATION_URL = exports.LOG_KIND_USAGE_MAP = exports.CAPTURE_MODES = exports.PERCY_DOM_CHANGING_COMMANDS_ENDPOINTS = exports.PERCY_LOGS_FILE = exports.COLORS = exports.LOGS_FILE = exports.NOT_ALLOWED_KEYS_IN_CAPS = exports.ACCESSIBILITY_API_URL = exports.BSTACK_SERVICE_VERSION = exports.DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = exports.DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = exports.BATCH_EVENT_TYPES = exports.DATA_BATCH_INTERVAL = exports.DATA_BATCH_SIZE = exports.DATA_SCREENSHOT_ENDPOINT = exports.DATA_BATCH_ENDPOINT = exports.DATA_EVENT_ENDPOINT = exports.DATA_ENDPOINT = exports.consoleHolder = exports.DEFAULT_OPTIONS = exports.VALID_APP_EXTENSION = exports.BROWSER_DESCRIPTION = void 0;
4
+ const package_json_1 = require("../package.json");
4
5
  exports.BROWSER_DESCRIPTION = [
5
6
  'device',
6
7
  'os',
@@ -32,8 +33,18 @@ exports.DATA_BATCH_INTERVAL = 2000;
32
33
  exports.BATCH_EVENT_TYPES = ['LogCreated', 'TestRunStarted', 'TestRunFinished', 'HookRunFinished', 'HookRunStarted', 'ScreenshotCreated'];
33
34
  exports.DEFAULT_WAIT_TIMEOUT_FOR_PENDING_UPLOADS = 5000; // 5s
34
35
  exports.DEFAULT_WAIT_INTERVAL_FOR_PENDING_UPLOADS = 100; // 100ms
36
+ exports.BSTACK_SERVICE_VERSION = package_json_1.version;
35
37
  exports.ACCESSIBILITY_API_URL = 'https://accessibility.browserstack.com/api';
36
38
  exports.NOT_ALLOWED_KEYS_IN_CAPS = ['includeTagsInTestingScope', 'excludeTagsInTestingScope'];
39
+ exports.LOGS_FILE = 'logs/bstack-wdio-service.log';
40
+ exports.COLORS = {
41
+ error: 'red',
42
+ warn: 'yellow',
43
+ info: 'cyanBright',
44
+ debug: 'green',
45
+ trace: 'cyan',
46
+ progress: 'magenta'
47
+ };
37
48
  exports.PERCY_LOGS_FILE = 'logs/percy.log';
38
49
  exports.PERCY_DOM_CHANGING_COMMANDS_ENDPOINTS = [
39
50
  '/session/:sessionId/url',
@@ -45,3 +56,25 @@ exports.PERCY_DOM_CHANGING_COMMANDS_ENDPOINTS = [
45
56
  '/session/:sessionId/appium/device/shake'
46
57
  ];
47
58
  exports.CAPTURE_MODES = ['click', 'auto', 'screenshot', 'manual', 'testcase'];
59
+ exports.LOG_KIND_USAGE_MAP = {
60
+ 'TEST_LOG': 'log',
61
+ 'TEST_SCREENSHOT': 'screenshot',
62
+ 'TEST_STEP': 'step',
63
+ 'HTTP': 'http'
64
+ };
65
+ exports.FUNNEL_INSTRUMENTATION_URL = 'https://api.browserstack.com/sdk/v1/event';
66
+ // Env variables - Define all the env variable constants over here
67
+ // To store the JWT token returned the session launch
68
+ exports.TESTOPS_JWT_ENV = 'BS_TESTOPS_JWT';
69
+ // To store the setting of whether to send screenshots or not
70
+ exports.TESTOPS_SCREENSHOT_ENV = 'BS_TESTOPS_ALLOW_SCREENSHOTS';
71
+ // To store build hashed id
72
+ exports.TESTOPS_BUILD_ID_ENV = 'BS_TESTOPS_BUILD_HASHED_ID';
73
+ // Whether to collect performance instrumentation or not
74
+ exports.PERF_MEASUREMENT_ENV = 'BROWSERSTACK_O11Y_PERF_MEASUREMENT';
75
+ // Whether the current run is rerun or not
76
+ exports.RERUN_TESTS_ENV = 'BROWSERSTACK_RERUN_TESTS';
77
+ // The tests that needs to be rerun
78
+ exports.RERUN_ENV = 'BROWSERSTACK_RERUN';
79
+ // To store whether the build launch has completed or not
80
+ exports.TESTOPS_BUILD_COMPLETED_ENV = 'BS_TESTOPS_BUILD_COMPLETED';
@@ -55,7 +55,7 @@ class CrashReporter {
55
55
  this.userConfigForReporting = {};
56
56
  }
57
57
  const data = {
58
- hashed_id: process.env.BS_TESTOPS_BUILD_HASHED_ID,
58
+ hashed_id: process.env[constants_1.TESTOPS_BUILD_ID_ENV],
59
59
  observability_version: {
60
60
  frameworkName: 'WebdriverIO-' + (this.userConfigForReporting.framework || 'null'),
61
61
  sdkVersion: package_json_1.version
@@ -0,0 +1,3 @@
1
+ export declare function getDataFromWorkers(): Record<string, object>[];
2
+ export declare function saveWorkerData(data: Record<string, any>): void;
3
+ //# sourceMappingURL=data-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-store.d.ts","sourceRoot":"","sources":["../src/data-store.ts"],"names":[],"mappings":"AAOA,wBAAgB,kBAAkB,6BAoBjC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QASvD"}
@@ -0,0 +1,49 @@
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.saveWorkerData = exports.getDataFromWorkers = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const bstackLogger_1 = require("./bstackLogger");
10
+ const workersDataDirPath = node_path_1.default.join(process.cwd(), 'logs', 'worker_data');
11
+ function getDataFromWorkers() {
12
+ const workersData = [];
13
+ if (!node_fs_1.default.existsSync(workersDataDirPath)) {
14
+ return workersData;
15
+ }
16
+ const files = node_fs_1.default.readdirSync(workersDataDirPath);
17
+ files.forEach((file) => {
18
+ bstackLogger_1.BStackLogger.debug('Reading worker file ' + file);
19
+ const filePath = node_path_1.default.join(workersDataDirPath, file);
20
+ const fileContent = node_fs_1.default.readFileSync(filePath, 'utf8');
21
+ const workerData = JSON.parse(fileContent);
22
+ workersData.push(workerData);
23
+ });
24
+ // Remove worker data after all reading
25
+ removeWorkersDataDir();
26
+ return workersData;
27
+ }
28
+ exports.getDataFromWorkers = getDataFromWorkers;
29
+ function saveWorkerData(data) {
30
+ const filePath = node_path_1.default.join(workersDataDirPath, 'worker-data-' + process.pid + '.json');
31
+ try {
32
+ createWorkersDataDir();
33
+ node_fs_1.default.writeFileSync(filePath, JSON.stringify(data));
34
+ }
35
+ catch (e) {
36
+ bstackLogger_1.BStackLogger.debug('Exception in saving worker data: ' + e);
37
+ }
38
+ }
39
+ exports.saveWorkerData = saveWorkerData;
40
+ function removeWorkersDataDir() {
41
+ node_fs_1.default.rmSync(workersDataDirPath, { recursive: true, force: true });
42
+ return true;
43
+ }
44
+ function createWorkersDataDir() {
45
+ if (!node_fs_1.default.existsSync(workersDataDirPath)) {
46
+ node_fs_1.default.mkdirSync(workersDataDirPath, { recursive: true });
47
+ }
48
+ return true;
49
+ }
@@ -0,0 +1,4 @@
1
+ import BrowserStackConfig from './config';
2
+ export declare function setupExitHandlers(): void;
3
+ export declare function shouldCallCleanup(config: BrowserStackConfig): string[];
4
+ //# sourceMappingURL=exitHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exitHandler.d.ts","sourceRoot":"","sources":["../src/exitHandler.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,MAAM,UAAU,CAAA;AAKzC,wBAAgB,iBAAiB,SAWhC;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAYtE"}
@@ -0,0 +1,37 @@
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.shouldCallCleanup = exports.setupExitHandlers = void 0;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const config_1 = __importDefault(require("./config"));
10
+ const funnelInstrumentation_1 = require("./instrumentation/funnelInstrumentation");
11
+ const constants_1 = require("./constants");
12
+ const bstackLogger_1 = require("./bstackLogger");
13
+ function setupExitHandlers() {
14
+ process.on('exit', (code) => {
15
+ bstackLogger_1.BStackLogger.debug('Exit hook called');
16
+ const args = shouldCallCleanup(config_1.default.getInstance());
17
+ if (Array.isArray(args) && args.length) {
18
+ bstackLogger_1.BStackLogger.debug('Spawning cleanup with args ' + args.toString());
19
+ const childProcess = (0, node_child_process_1.spawn)('node', [`${node_path_1.default.join(__dirname, 'cleanup.js')}`, ...args], { detached: true, stdio: 'inherit', env: { ...process.env } });
20
+ childProcess.unref();
21
+ process.exit(code);
22
+ }
23
+ });
24
+ }
25
+ exports.setupExitHandlers = setupExitHandlers;
26
+ function shouldCallCleanup(config) {
27
+ const args = [];
28
+ if (!!process.env[constants_1.TESTOPS_JWT_ENV] && !config.testObservability.buildStopped) {
29
+ args.push('--observability');
30
+ }
31
+ if (config.userName && config.accessKey && !config.funnelDataSent) {
32
+ const savedFilePath = (0, funnelInstrumentation_1.saveFunnelData)('SDKTestSuccessful', config);
33
+ args.push('--funnelData', savedFilePath);
34
+ }
35
+ return args;
36
+ }
37
+ exports.shouldCallCleanup = shouldCallCleanup;
@@ -2,7 +2,7 @@ import type { Capabilities, Frameworks } from '@wdio/types';
2
2
  import type { Browser, MultiRemoteBrowser } from 'webdriverio';
3
3
  import type { BeforeCommandArgs, AfterCommandArgs } from '@wdio/reporter';
4
4
  import type { Feature, Scenario, CucumberHook, CucumberHookParams, Pickle, ITestCaseHookParameter } from './cucumber-types';
5
- import type { TestMeta, CurrentRunInfo, StdLog } from './types';
5
+ import type { TestData, TestMeta, CurrentRunInfo, StdLog } from './types';
6
6
  declare class _InsightsHandler {
7
7
  private _browser;
8
8
  private _framework?;
@@ -11,10 +11,10 @@ declare class _InsightsHandler {
11
11
  private _platformMeta?;
12
12
  private _commands;
13
13
  private _gitConfigPath?;
14
- private _requestQueueHandler;
15
14
  private _currentTest;
16
15
  private _currentHook;
17
16
  private _cucumberData;
17
+ private listener;
18
18
  constructor(_browser: Browser<'async'> | MultiRemoteBrowser<'async'>, browserCaps?: Capabilities.Capabilities, isAppAutomate?: boolean, sessionId?: string, _framework?: string | undefined);
19
19
  registerListeners(): void;
20
20
  before(): Promise<void>;
@@ -32,14 +32,8 @@ declare class _InsightsHandler {
32
32
  afterStep(step: Frameworks.PickleStep, scenario: Pickle, result: Frameworks.PickleResult): Promise<void>;
33
33
  sendScenarioObjectSkipped(scenario: Scenario, feature: Feature, uri: string): Promise<void>;
34
34
  processCucumberHook(test: CucumberHook | undefined, params: CucumberHookParams, result?: Frameworks.TestResult): Promise<void>;
35
- uploadPending(waitTimeout?: number, waitInterval?: number): any;
36
- teardown(): Promise<void>;
37
- /**
38
- * misc methods
39
- */
40
35
  browserCommand(commandType: string, args: BeforeCommandArgs & AfterCommandArgs, test?: Frameworks.Test | ITestCaseHookParameter): Promise<void>;
41
36
  appendTestItemLog: (stdLog: StdLog) => Promise<void>;
42
- private sendData;
43
37
  private attachHookData;
44
38
  private setHooksFromSuite;
45
39
  getCucumberHookType(test: CucumberHook | undefined): string | null;
@@ -50,9 +44,9 @@ declare class _InsightsHandler {
50
44
  private getHierarchy;
51
45
  private getTestRunId;
52
46
  private getTestRunIdFromSuite;
53
- private sendTestRunEvent;
54
- private sendTestRunEventForCucumber;
55
- sendHookRunEvent(hookData: TestMeta, eventType: string, result?: Frameworks.TestResult): Promise<void>;
47
+ private getRunData;
48
+ private getTestRunDataForCucumber;
49
+ getHookRunDataForCucumber(hookData: TestMeta, eventType: string, result?: Frameworks.TestResult): TestData;
56
50
  private getIntegrationsObject;
57
51
  private getIdentifier;
58
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"insights-handler.d.ts","sourceRoot":"","sources":["../src/insights-handler.ts"],"names":[],"mappings":"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"}