@wdio/browserstack-service 7.34.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 (85) hide show
  1. package/build/Percy/Percy-Handler.d.ts +34 -0
  2. package/build/Percy/Percy-Handler.d.ts.map +1 -0
  3. package/build/Percy/Percy-Handler.js +187 -0
  4. package/build/Percy/Percy.d.ts +24 -0
  5. package/build/Percy/Percy.d.ts.map +1 -0
  6. package/build/Percy/Percy.js +128 -0
  7. package/build/Percy/PercyBinary.d.ts +17 -0
  8. package/build/Percy/PercyBinary.d.ts.map +1 -0
  9. package/build/Percy/PercyBinary.js +151 -0
  10. package/build/Percy/PercyCaptureMap.d.ts +9 -0
  11. package/build/Percy/PercyCaptureMap.d.ts.map +1 -0
  12. package/build/Percy/PercyCaptureMap.js +46 -0
  13. package/build/Percy/PercyHelper.d.ts +8 -0
  14. package/build/Percy/PercyHelper.d.ts.map +1 -0
  15. package/build/Percy/PercyHelper.js +78 -0
  16. package/build/Percy/PercyLogger.d.ts +15 -0
  17. package/build/Percy/PercyLogger.d.ts.map +1 -0
  18. package/build/Percy/PercyLogger.js +76 -0
  19. package/build/Percy/PercySDK.d.ts +4 -0
  20. package/build/Percy/PercySDK.d.ts.map +1 -0
  21. package/build/Percy/PercySDK.js +42 -0
  22. package/build/bstackLogger.d.ts +14 -0
  23. package/build/bstackLogger.d.ts.map +1 -0
  24. package/build/bstackLogger.js +52 -0
  25. package/build/cleanup.d.ts +6 -2
  26. package/build/cleanup.d.ts.map +1 -1
  27. package/build/cleanup.js +104 -12
  28. package/build/config.d.ts +23 -0
  29. package/build/config.d.ts.map +1 -0
  30. package/build/config.js +32 -0
  31. package/build/constants.d.ts +20 -0
  32. package/build/constants.d.ts.map +1 -1
  33. package/build/constants.js +45 -1
  34. package/build/crash-reporter.js +1 -1
  35. package/build/data-store.d.ts +3 -0
  36. package/build/data-store.d.ts.map +1 -0
  37. package/build/data-store.js +49 -0
  38. package/build/exitHandler.d.ts +4 -0
  39. package/build/exitHandler.d.ts.map +1 -0
  40. package/build/exitHandler.js +37 -0
  41. package/build/index.d.ts +2 -0
  42. package/build/index.d.ts.map +1 -1
  43. package/build/index.js +15 -1
  44. package/build/insights-handler.d.ts +5 -11
  45. package/build/insights-handler.d.ts.map +1 -1
  46. package/build/insights-handler.js +45 -106
  47. package/build/instrumentation/funnelInstrumentation.d.ts +6 -0
  48. package/build/instrumentation/funnelInstrumentation.d.ts.map +1 -0
  49. package/build/instrumentation/funnelInstrumentation.js +127 -0
  50. package/build/launcher.d.ts +8 -4
  51. package/build/launcher.d.ts.map +1 -1
  52. package/build/launcher.js +87 -18
  53. package/build/reporter.d.ts +3 -3
  54. package/build/reporter.d.ts.map +1 -1
  55. package/build/reporter.js +10 -23
  56. package/build/request-handler.d.ts +5 -13
  57. package/build/request-handler.d.ts.map +1 -1
  58. package/build/request-handler.js +27 -48
  59. package/build/service.d.ts +3 -0
  60. package/build/service.d.ts.map +1 -1
  61. package/build/service.js +50 -18
  62. package/build/testOps/featureStats.d.ts +45 -0
  63. package/build/testOps/featureStats.d.ts.map +1 -0
  64. package/build/testOps/featureStats.js +120 -0
  65. package/build/testOps/featureUsage.d.ts +22 -0
  66. package/build/testOps/featureUsage.d.ts.map +1 -0
  67. package/build/testOps/featureUsage.js +46 -0
  68. package/build/testOps/listener.d.ts +33 -0
  69. package/build/testOps/listener.d.ts.map +1 -0
  70. package/build/testOps/listener.js +228 -0
  71. package/build/testOps/requestUtils.d.ts +4 -0
  72. package/build/testOps/requestUtils.d.ts.map +1 -0
  73. package/build/testOps/requestUtils.js +47 -0
  74. package/build/testOps/testOpsConfig.d.ts +11 -0
  75. package/build/testOps/testOpsConfig.d.ts.map +1 -0
  76. package/build/testOps/testOpsConfig.js +17 -0
  77. package/build/testOps/usageStats.d.ts +404 -0
  78. package/build/testOps/usageStats.d.ts.map +1 -0
  79. package/build/testOps/usageStats.js +110 -0
  80. package/build/types.d.ts +48 -7
  81. package/build/types.d.ts.map +1 -1
  82. package/build/util.d.ts +4 -6
  83. package/build/util.d.ts.map +1 -1
  84. package/build/util.js +82 -67
  85. package/package.json +7 -4
@@ -1,9 +1,9 @@
1
1
  import * as BrowserstackLocalLauncher from 'browserstack-local';
2
2
  import type { Capabilities, Services, Options } from '@wdio/types';
3
- import type { App, AppConfig, AppUploadResponse, BrowserstackConfig } from './types';
3
+ import type { App, AppConfig, AppUploadResponse, BrowserstackConfig, UserConfig } from './types';
4
4
  type BrowserstackLocal = BrowserstackLocalLauncher.Local & {
5
5
  pid?: number;
6
- stop(callback: (err?: any) => void): void;
6
+ stop(callback: (err?: Error) => void): void;
7
7
  };
8
8
  export default class BrowserstackLauncherService implements Services.ServiceInstance {
9
9
  private _options;
@@ -14,11 +14,15 @@ export default class BrowserstackLauncherService implements Services.ServiceInst
14
14
  private _buildTag?;
15
15
  private _buildIdentifier?;
16
16
  private _accessibilityAutomation?;
17
- _testOpsBuildStopped?: boolean;
17
+ private _percy?;
18
+ private _percyBestPlatformCaps?;
19
+ private readonly browserStackConfig;
18
20
  constructor(_options: BrowserstackConfig & Options.Testrunner, capabilities: Capabilities.RemoteCapability, _config: Options.Testrunner);
19
- setupExitHandlers(): void;
21
+ onWorkerStart(cid: any, caps: any): Promise<void>;
20
22
  onPrepare(config?: Options.Testrunner, capabilities?: Capabilities.RemoteCapabilities): Promise<unknown>;
21
23
  onComplete(): Promise<unknown>;
24
+ setupPercy(options: BrowserstackConfig & Options.Testrunner, config: Options.Testrunner, bsConfig: UserConfig): Promise<void>;
25
+ stopPercy(): Promise<void>;
22
26
  _uploadApp(app: App): Promise<AppUploadResponse>;
23
27
  /**
24
28
  * @param {String | AppConfig} appConfig <string>: should be "app file path" or "app_url" or "custom_id" or "shareable_id".
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,yBAAyB,MAAM,oBAAoB,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAMlE,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAkBpF,KAAK,iBAAiB,GAAG,yBAAyB,CAAC,KAAK,GAAG;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;CAC7C,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,2BAA4B,YAAW,QAAQ,CAAC,eAAe;IAU5E,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,OAAO;IAXnB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAQ;IACjC,OAAO,CAAC,wBAAwB,CAAC,CAAS;IACnC,oBAAoB,CAAC,EAAE,OAAO,CAAA;gBAGzB,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EACzD,YAAY,EAAE,YAAY,CAAC,gBAAgB,EACnC,OAAO,EAAE,OAAO,CAAC,UAAU;IA+FvC,iBAAiB;IAUX,SAAS,CAAE,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB;IA4ItF,UAAU;IA6DV,UAAU,CAAC,GAAG,EAAC,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkBrD;;;OAGG;IACG,YAAY,CAAE,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyBhE,qBAAqB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KAAE;IAiFvH,WAAW,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAC,MAAM;IAoF3F,sBAAsB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB;IAyCrE;;;OAGG;IACH,oBAAoB;IA6BpB,sBAAsB,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,SAAS,CAAC,EAAC,MAAM,EAAE,eAAe,CAAC,EAAC,MAAM;CAQtF"}
1
+ {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,yBAAyB,MAAM,oBAAoB,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAMlE,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AA8BhG,KAAK,iBAAiB,GAAG,yBAAyB,CAAC,KAAK,GAAG;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAC/C,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,2BAA4B,YAAW,QAAQ,CAAC,eAAe;IAY5E,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,OAAO;IAbnB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAQ;IACjC,OAAO,CAAC,wBAAwB,CAAC,CAAS;IAC1C,OAAO,CAAC,MAAM,CAAC,CAAO;IACtB,OAAO,CAAC,sBAAsB,CAAC,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;gBAG3C,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EACzD,YAAY,EAAE,YAAY,CAAC,gBAAgB,EACnC,OAAO,EAAE,OAAO,CAAC,UAAU;IAsGjC,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;IAalC,SAAS,CAAE,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB;IA2JtF,UAAU;IAqEV,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU;IAuB7G,SAAS;IAYT,UAAU,CAAC,GAAG,EAAC,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqBrD;;;OAGG;IACG,YAAY,CAAE,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAyBhE,qBAAqB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KAAE;IAiFvH,WAAW,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAC,MAAM;IAoF3F,sBAAsB,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,kBAAkB;IAyCrE;;;OAGG;IACH,oBAAoB;IA6BpB,sBAAsB,CAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,SAAS,CAAC,EAAC,MAAM,EAAE,eAAe,CAAC,EAAC,MAAM;CAQtF"}
package/build/launcher.js CHANGED
@@ -36,21 +36,27 @@ const os_1 = __importDefault(require("os"));
36
36
  const webdriverio_1 = require("webdriverio");
37
37
  const BrowserstackLocalLauncher = __importStar(require("browserstack-local"));
38
38
  const logger_1 = __importDefault(require("@wdio/logger"));
39
- const node_child_process_1 = require("node:child_process");
40
39
  // @ts-ignore
41
40
  const package_json_1 = require("../package.json");
42
41
  const crash_reporter_1 = __importDefault(require("./crash-reporter"));
42
+ const PercyHelper_1 = require("./Percy/PercyHelper");
43
43
  const constants_1 = require("./constants");
44
44
  const util_2 = require("./util");
45
45
  const performance_tester_1 = __importDefault(require("./performance-tester"));
46
+ const PercyLogger_1 = require("./Percy/PercyLogger");
47
+ const exitHandler_1 = require("./exitHandler");
48
+ const config_1 = __importDefault(require("./config"));
49
+ const funnelInstrumentation_1 = require("./instrumentation/funnelInstrumentation");
46
50
  const log = (0, logger_1.default)('@wdio/browserstack-service');
47
51
  class BrowserstackLauncherService {
48
52
  constructor(_options, capabilities, _config) {
49
53
  this._options = _options;
50
54
  this._config = _config;
55
+ PercyLogger_1.PercyLogger.clearLogFile();
56
+ (0, exitHandler_1.setupExitHandlers)();
51
57
  // added to maintain backward compatibility with webdriverIO v5
52
- this.setupExitHandlers();
53
58
  this._config || (this._config = _options);
59
+ this.browserStackConfig = config_1.default.getInstance(_options, _config);
54
60
  if (Array.isArray(capabilities)) {
55
61
  capabilities.forEach((capability) => {
56
62
  var _a, _b;
@@ -124,7 +130,9 @@ class BrowserstackLauncherService {
124
130
  }
125
131
  });
126
132
  }
127
- if (process.env.BROWSERSTACK_O11Y_PERF_MEASUREMENT) {
133
+ this.browserStackConfig.buildIdentifier = this._buildIdentifier;
134
+ this.browserStackConfig.buildName = this._buildName;
135
+ if (process.env[constants_1.PERF_MEASUREMENT_ENV]) {
128
136
  performance_tester_1.default.startMonitoring('performance-report-launcher.csv');
129
137
  }
130
138
  this._accessibilityAutomation || (this._accessibilityAutomation = (0, util_2.isTrue)(this._options.accessibility));
@@ -133,8 +141,8 @@ class BrowserstackLauncherService {
133
141
  this._options.testObservability = this._options.testObservability == false ? false : true;
134
142
  if (this._options.testObservability &&
135
143
  // update files to run if it's a rerun
136
- process.env.BROWSERSTACK_RERUN && process.env.BROWSERSTACK_RERUN_TESTS) {
137
- this._config.specs = process.env.BROWSERSTACK_RERUN_TESTS.split(',');
144
+ process.env[constants_1.RERUN_ENV] && process.env[constants_1.RERUN_TESTS_ENV]) {
145
+ this._config.specs = process.env[constants_1.RERUN_TESTS_ENV].split(',');
138
146
  }
139
147
  try {
140
148
  crash_reporter_1.default.setConfigDetails(this._config, capabilities, this._options);
@@ -143,16 +151,22 @@ class BrowserstackLauncherService {
143
151
  log.error(`[Crash_Report_Upload] Config processing failed due to ${error}`);
144
152
  }
145
153
  }
146
- setupExitHandlers() {
147
- process.on('exit', (code) => {
148
- if (!!process.env.BS_TESTOPS_JWT && !this._testOpsBuildStopped) {
149
- const childProcess = (0, node_child_process_1.spawn)('node', [`${path_1.default.join(__dirname, 'cleanup.js')}`], { detached: true, stdio: 'inherit', env: { ...process.env } });
150
- childProcess.unref();
151
- process.exit(code);
154
+ async onWorkerStart(cid, caps) {
155
+ try {
156
+ if (this._options.percy && this._percyBestPlatformCaps) {
157
+ const isThisBestPercyPlatform = (0, util_2.ObjectsAreEqual)(caps, this._percyBestPlatformCaps);
158
+ if (isThisBestPercyPlatform) {
159
+ process.env.BEST_PLATFORM_CID = cid;
160
+ }
152
161
  }
153
- });
162
+ }
163
+ catch (err) {
164
+ PercyLogger_1.PercyLogger.error(`Error while setting best platform for Percy snapshot at worker start ${err}`);
165
+ }
154
166
  }
155
167
  async onPrepare(config, capabilities) {
168
+ // // Send Funnel start request
169
+ await (0, funnelInstrumentation_1.sendStart)(this.browserStackConfig);
156
170
  /**
157
171
  * Upload app to BrowserStack if valid file path to app is given.
158
172
  * Update app value of capability directly if app_url, custom_id, shareable_id is given
@@ -239,6 +253,18 @@ class BrowserstackLauncherService {
239
253
  buildIdentifier: this._buildIdentifier
240
254
  });
241
255
  }
256
+ if (this._options.percy) {
257
+ try {
258
+ const bestPlatformPercyCaps = (0, PercyHelper_1.getBestPlatformForPercySnapshot)(capabilities);
259
+ this._percyBestPlatformCaps = bestPlatformPercyCaps;
260
+ await this.setupPercy(this._options, this._config, {
261
+ projectName: this._projectName
262
+ });
263
+ }
264
+ catch (err) {
265
+ PercyLogger_1.PercyLogger.error(`Error while setting up Percy ${err}`);
266
+ }
267
+ }
242
268
  if (!this._options.browserstackLocal) {
243
269
  return log.info('browserstackLocal is not enabled - skipping...');
244
270
  }
@@ -288,12 +314,12 @@ class BrowserstackLauncherService {
288
314
  if (this._options.testObservability) {
289
315
  log.debug('Sending stop launch event');
290
316
  await (0, util_2.stopBuildUpstream)();
291
- if (process.env.BS_TESTOPS_BUILD_HASHED_ID) {
292
- 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`);
293
- this._testOpsBuildStopped = true;
317
+ if (process.env[constants_1.TESTOPS_BUILD_ID_ENV]) {
318
+ console.log(`\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`);
319
+ this.browserStackConfig.testObservability.buildStopped = true;
294
320
  }
295
321
  }
296
- if (process.env.BROWSERSTACK_O11Y_PERF_MEASUREMENT) {
322
+ if (process.env[constants_1.PERF_MEASUREMENT_ENV]) {
297
323
  await performance_tester_1.default.stopAndGenerate('performance-launcher.html');
298
324
  performance_tester_1.default.calculateTimes(['launchTestSession', 'stopBuildUpstream']);
299
325
  if (!process.env.START_TIME) {
@@ -302,6 +328,11 @@ class BrowserstackLauncherService {
302
328
  const duration = (new Date()).getTime() - (new Date(process.env.START_TIME)).getTime();
303
329
  log.info(`Total duration is ${duration / 1000} s`);
304
330
  }
331
+ if (this._options.percy) {
332
+ await this.stopPercy();
333
+ }
334
+ PercyLogger_1.PercyLogger.clearLogger();
335
+ await (0, funnelInstrumentation_1.sendFinish)(this.browserStackConfig);
305
336
  if (!this.browserstackLocal || !this.browserstackLocal.isRunning()) {
306
337
  return;
307
338
  }
@@ -331,11 +362,49 @@ class BrowserstackLauncherService {
331
362
  return Promise.reject(err);
332
363
  });
333
364
  }
365
+ async setupPercy(options, config, bsConfig) {
366
+ var _a;
367
+ if ((_a = this._percy) === null || _a === void 0 ? void 0 : _a.isRunning()) {
368
+ return;
369
+ }
370
+ try {
371
+ this._percy = await (0, PercyHelper_1.startPercy)(options, config, bsConfig);
372
+ if (!this._percy) {
373
+ throw new Error('Could not start percy, check percy logs for info.');
374
+ }
375
+ PercyLogger_1.PercyLogger.info('Percy started successfully');
376
+ let signal = 0;
377
+ const handler = async () => {
378
+ signal++;
379
+ signal === 1 && await this.stopPercy();
380
+ };
381
+ process.on('beforeExit', handler);
382
+ process.on('SIGINT', handler);
383
+ process.on('SIGTERM', handler);
384
+ }
385
+ catch (err) {
386
+ PercyLogger_1.PercyLogger.debug(`Error in percy setup ${err}`);
387
+ }
388
+ }
389
+ async stopPercy() {
390
+ if (!this._percy || !this._percy.isRunning()) {
391
+ return;
392
+ }
393
+ try {
394
+ await (0, PercyHelper_1.stopPercy)(this._percy);
395
+ PercyLogger_1.PercyLogger.info('Percy stopped');
396
+ }
397
+ catch (err) {
398
+ PercyLogger_1.PercyLogger.error(`Error occured while stopping percy : ${err}`);
399
+ }
400
+ }
334
401
  async _uploadApp(app) {
335
402
  log.info(`uploading app ${app.app} ${app.customId ? `and custom_id: ${app.customId}` : ''} to browserstack`);
336
403
  const form = new form_data_1.default();
337
- if (app.app)
338
- form.append('file', fs_1.default.createReadStream(app.app));
404
+ if (app.app) {
405
+ const fileName = path_1.default.basename(app.app);
406
+ form.append('file', fs_1.default.createReadStream(app.app), fileName);
407
+ }
339
408
  if (app.customId)
340
409
  form.append('custom_id', app.customId);
341
410
  const res = await got_1.default.post('https://api-cloud.browserstack.com/app-automate/upload', {
@@ -1,18 +1,18 @@
1
1
  import WDIOReporter, { SuiteStats, TestStats, RunnerStats, HookStats } from '@wdio/reporter';
2
- import type { CurrentRunInfo, StdLog, TestMeta } from './types';
2
+ import type { CurrentRunInfo, StdLog, TestData, TestMeta } from './types';
3
3
  declare class _TestReporter extends WDIOReporter {
4
4
  private _capabilities;
5
5
  private _config?;
6
6
  private _observability;
7
7
  private _sessionId?;
8
8
  private _suiteName?;
9
- private _requestQueueHandler;
10
9
  private _suites;
11
10
  private static _tests;
12
11
  private _gitConfigPath?;
13
12
  private _gitConfigured;
14
13
  private _currentHook;
15
14
  private _currentTest;
15
+ private listener;
16
16
  onRunnerStart(runnerStats: RunnerStats): Promise<void>;
17
17
  registerListeners(): void;
18
18
  appendTestItemLog(stdLog: StdLog): Promise<void>;
@@ -27,7 +27,7 @@ declare class _TestReporter extends WDIOReporter {
27
27
  onHookStart(hookStats: HookStats): Promise<void>;
28
28
  onHookEnd(hookStats: HookStats): Promise<void>;
29
29
  getHookIdentifier(hookStats: HookStats): string;
30
- sendTestRunEvent(testStats: TestStats | HookStats, eventType: string): Promise<void>;
30
+ getRunData(testStats: TestStats | HookStats, eventType: string): Promise<TestData>;
31
31
  onTestSkip(testStats: TestStats): Promise<void>;
32
32
  }
33
33
  declare const TestReporter: typeof _TestReporter;
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAO5F,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,EAAY,QAAQ,EAAc,MAAM,SAAS,CAAA;AAczG,cAAM,aAAc,SAAQ,YAAY;IACpC,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,OAAO,CAAC,CAAyC;IACzD,OAAO,CAAC,cAAc,CAAO;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAAoC;IAChE,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAC,MAAM,CAA+B;IACpD,OAAO,CAAC,cAAc,CAAC,CAAQ;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,YAAY,CAAqB;IAEnC,aAAa,CAAE,WAAW,EAAE,WAAW;IAS7C,iBAAiB;IAQJ,iBAAiB,CAAC,MAAM,EAAE,MAAM;IAc7C,cAAc,CAAC,WAAW,EAAE,cAAc;IAapC,YAAY;IAWlB,MAAM,CAAC,QAAQ;IAIf,YAAY,CAAE,UAAU,EAAE,UAAU;IAoBpC,UAAU;IAIV,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAe1C,SAAS,CAAC,SAAS,EAAE,SAAS;IAQ9B,WAAW,CAAC,SAAS,EAAE,SAAS;IAahC,WAAW,CAAC,SAAS,EAAE,SAAS;IAehC,SAAS,CAAC,SAAS,EAAE,SAAS;IAqBpC,iBAAiB,CAAC,SAAS,EAAE,SAAS;IAIhC,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAC,SAAS,EAAE,SAAS,EAAE,MAAM;IAkFlE,UAAU,CAAE,SAAS,EAAE,SAAS;CAQzC;AAED,QAAA,MAAM,YAAY,EAAE,OAAO,aAAoD,CAAA;AAC/E,KAAK,YAAY,GAAG,aAAa,CAAA;AACjC,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAEA,OAAO,YAAY,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAO5F,OAAO,KAAK,EAAsB,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAY7F,cAAM,aAAc,SAAQ,YAAY;IACpC,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,OAAO,CAAC,CAAyC;IACzD,OAAO,CAAC,cAAc,CAAO;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAC,MAAM,CAA+B;IACpD,OAAO,CAAC,cAAc,CAAC,CAAQ;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAyB;IAEnC,aAAa,CAAE,WAAW,EAAE,WAAW;IAS7C,iBAAiB;IAQJ,iBAAiB,CAAC,MAAM,EAAE,MAAM;IAW7C,cAAc,CAAC,WAAW,EAAE,cAAc;IAapC,YAAY;IAWlB,MAAM,CAAC,QAAQ;IAIf,YAAY,CAAE,UAAU,EAAE,UAAU;IAoBpC,UAAU;IAIV,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAe1C,SAAS,CAAC,SAAS,EAAE,SAAS;IAQ9B,WAAW,CAAC,SAAS,EAAE,SAAS;IAahC,WAAW,CAAC,SAAS,EAAE,SAAS;IAehC,SAAS,CAAC,SAAS,EAAE,SAAS;IAqBpC,iBAAiB,CAAC,SAAS,EAAE,SAAS;IAIhC,UAAU,CAAC,SAAS,EAAE,SAAS,GAAC,SAAS,EAAE,SAAS,EAAE,MAAM;IAwE5D,UAAU,CAAE,SAAS,EAAE,SAAS;CAQzC;AAED,QAAA,MAAM,YAAY,EAAE,OAAO,aAAoD,CAAA;AAC/E,KAAK,YAAY,GAAG,aAAa,CAAA;AACjC,eAAe,YAAY,CAAA"}
package/build/reporter.js CHANGED
@@ -9,18 +9,18 @@ const reporter_1 = __importDefault(require("@wdio/reporter"));
9
9
  const uuid_1 = require("uuid");
10
10
  const logger_1 = __importDefault(require("@wdio/logger"));
11
11
  const util_1 = require("./util");
12
- const request_handler_1 = __importDefault(require("./request-handler"));
12
+ const listener_1 = __importDefault(require("./testOps/listener"));
13
13
  const log = (0, logger_1.default)('@wdio/browserstack-service');
14
14
  class _TestReporter extends reporter_1.default {
15
15
  constructor() {
16
16
  super(...arguments);
17
17
  this._capabilities = {};
18
18
  this._observability = true;
19
- this._requestQueueHandler = request_handler_1.default.getInstance();
20
19
  this._suites = [];
21
20
  this._gitConfigured = false;
22
21
  this._currentHook = {};
23
22
  this._currentTest = {};
23
+ this.listener = listener_1.default.getInstance();
24
24
  }
25
25
  async onRunnerStart(runnerStats) {
26
26
  this._capabilities = runnerStats.capabilities;
@@ -47,10 +47,7 @@ class _TestReporter extends reporter_1.default {
47
47
  stdLog.test_run_uuid = this._currentTest.uuid;
48
48
  }
49
49
  if (stdLog.hook_run_uuid || stdLog.test_run_uuid) {
50
- await (0, util_1.pushDataToQueue)({
51
- event_type: 'LogCreated',
52
- logs: [stdLog]
53
- });
50
+ this.listener.logCreated([stdLog]);
54
51
  }
55
52
  }
56
53
  setCurrentHook(hookDetails) {
@@ -122,7 +119,7 @@ class _TestReporter extends reporter_1.default {
122
119
  if (testStats.fullTitle === '<unknown test>')
123
120
  return;
124
121
  testStats.end || (testStats.end = new Date());
125
- await this.sendTestRunEvent(testStats, 'TestRunFinished');
122
+ this.listener.testFinished(await this.getRunData(testStats, 'TestRunFinished'));
126
123
  }
127
124
  async onTestStart(testStats) {
128
125
  if (!this.needToSendData('test', 'start'))
@@ -134,7 +131,7 @@ class _TestReporter extends reporter_1.default {
134
131
  _TestReporter._tests[testStats.fullTitle] = {
135
132
  uuid: uuid,
136
133
  };
137
- await this.sendTestRunEvent(testStats, 'TestRunStarted');
134
+ this.listener.testStarted(await this.getRunData(testStats, 'TestRunStarted'));
138
135
  }
139
136
  async onHookStart(hookStats) {
140
137
  if (!this.needToSendData('hook', 'start')) {
@@ -147,7 +144,7 @@ class _TestReporter extends reporter_1.default {
147
144
  uuid: hookId,
148
145
  startedAt: (new Date()).toISOString()
149
146
  };
150
- await this.sendTestRunEvent(hookStats, 'HookRunStarted');
147
+ this.listener.hookStarted(await this.getRunData(hookStats, 'HookRunStarted'));
151
148
  }
152
149
  async onHookEnd(hookStats) {
153
150
  if (!this.needToSendData('hook', 'end')) {
@@ -166,13 +163,13 @@ class _TestReporter extends reporter_1.default {
166
163
  if (!hookStats.state && !hookStats.error) {
167
164
  hookStats.state = 'passed';
168
165
  }
169
- await this.sendTestRunEvent(hookStats, 'HookRunFinished');
166
+ this.listener.hookFinished(await this.getRunData(hookStats, 'HookRunFinished'));
170
167
  }
171
168
  getHookIdentifier(hookStats) {
172
169
  var _a;
173
170
  return `${hookStats.title} for ${(_a = this._suites.at(-1)) === null || _a === void 0 ? void 0 : _a.title}`;
174
171
  }
175
- async sendTestRunEvent(testStats, eventType) {
172
+ async getRunData(testStats, eventType) {
176
173
  var _a, _b, _c, _d, _e, _f;
177
174
  const framework = (_a = this._config) === null || _a === void 0 ? void 0 : _a.framework;
178
175
  const scopes = this._suites.map(s => s.title);
@@ -231,20 +228,10 @@ class _TestReporter extends reporter_1.default {
231
228
  if (eventType == 'TestRunSkipped') {
232
229
  eventType = 'TestRunFinished';
233
230
  }
234
- const uploadData = {
235
- event_type: eventType,
236
- };
237
231
  if (eventType.match(/HookRun/)) {
238
232
  testData.hook_type = ((_f = testData.name) === null || _f === void 0 ? void 0 : _f.toLowerCase()) ? (0, util_1.getHookType)(testData.name.toLowerCase()) : 'undefined';
239
- uploadData.hook_run = testData;
240
- }
241
- else {
242
- uploadData.test_run = testData;
243
- }
244
- const req = this._requestQueueHandler.add(uploadData);
245
- if (req.proceed && req.data) {
246
- await (0, util_1.uploadEventData)(req.data, req.url);
247
233
  }
234
+ return testData;
248
235
  }
249
236
  async onTestSkip(testStats) {
250
237
  // cucumber steps call this method. We don't want step skipped state so skip for cucumber
@@ -252,7 +239,7 @@ class _TestReporter extends reporter_1.default {
252
239
  return;
253
240
  testStats.start || (testStats.start = new Date());
254
241
  testStats.end || (testStats.end = new Date());
255
- await this.sendTestRunEvent(testStats, 'TestRunSkipped');
242
+ this.listener.testFinished(await this.getRunData(testStats, 'TestRunSkipped'));
256
243
  }
257
244
  }
258
245
  _TestReporter._tests = {};
@@ -1,27 +1,19 @@
1
1
  import type { UploadType } from './types';
2
2
  export default class RequestQueueHandler {
3
3
  private queue;
4
- private started;
5
4
  private pollEventBatchInterval?;
6
- pendingUploads: number;
5
+ private readonly callback?;
7
6
  tearDownInvoked: boolean;
8
7
  static instance: RequestQueueHandler;
9
8
  private constructor();
10
- static getInstance(): RequestQueueHandler;
11
- start(): void;
12
- add(event: UploadType): {
13
- proceed: boolean;
14
- data?: undefined;
15
- url?: undefined;
16
- } | {
17
- proceed: boolean;
18
- data: UploadType[] | undefined;
19
- url: string;
20
- };
9
+ static getInstance(callback?: Function): RequestQueueHandler;
10
+ add(event: UploadType): void;
21
11
  shutdown(): Promise<void>;
22
12
  startEventBatchPolling(): void;
23
13
  resetEventBatchPolling(): void;
24
14
  removeEventBatchPolling(tag: string): void;
15
+ sendBatch(): Promise<void>;
16
+ callCallback: (data: UploadType[], kind: string) => Promise<void>;
25
17
  shouldProceed(): boolean;
26
18
  }
27
19
  //# sourceMappingURL=request-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../src/request-handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAKzC,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACpC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,sBAAsB,CAAC,CAAgC;IACxD,cAAc,SAAI;IAClB,eAAe,UAAQ;IAE9B,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAA;IAGpC,OAAO;WAGO,WAAW,IAAI,mBAAmB;IAOhD,KAAK;IAOL,GAAG,CAAE,KAAK,EAAE,UAAU;;;;;;;;;IAuChB,QAAQ;IAQd,sBAAsB;IAUtB,sBAAsB;IAKtB,uBAAuB,CAAE,GAAG,EAAE,MAAM;IAQpC,aAAa;CAOhB"}
1
+ {"version":3,"file":"request-handler.d.ts","sourceRoot":"","sources":["../src/request-handler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAKzC,MAAM,CAAC,OAAO,OAAO,mBAAmB;IACpC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,sBAAsB,CAAC,CAAgC;IAC/D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAU;IAC7B,eAAe,UAAQ;IAE9B,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAA;IAGpC,OAAO;WAKO,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,mBAAmB;IAOnE,GAAG,CAAE,KAAK,EAAE,UAAU;IAehB,QAAQ;IAQd,sBAAsB;IAItB,sBAAsB;IAKtB,uBAAuB,CAAE,GAAG,EAAE,MAAM;IAO9B,SAAS;IASf,YAAY,SAAgB,UAAU,EAAE,QAAQ,MAAM,mBAGrD;IAED,aAAa;CAOhB"}
@@ -5,76 +5,48 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const logger_1 = __importDefault(require("@wdio/logger"));
7
7
  const constants_1 = require("./constants");
8
- const util_1 = require("./util");
8
+ const bstackLogger_1 = require("./bstackLogger");
9
9
  const log = (0, logger_1.default)('@wdio/browserstack-service');
10
10
  class RequestQueueHandler {
11
11
  // making it private to use singleton pattern
12
- constructor() {
12
+ constructor(callback) {
13
13
  this.queue = [];
14
- this.started = false;
15
- this.pendingUploads = 0;
16
14
  this.tearDownInvoked = false;
15
+ this.callCallback = async (data, kind) => {
16
+ bstackLogger_1.BStackLogger.debug('calling callback with kind ' + kind);
17
+ this.callback && await this.callback(data);
18
+ };
19
+ this.callback = callback;
20
+ this.startEventBatchPolling();
17
21
  }
18
- static getInstance() {
19
- if (!RequestQueueHandler.instance) {
20
- RequestQueueHandler.instance = new RequestQueueHandler();
22
+ static getInstance(callback) {
23
+ if (!RequestQueueHandler.instance && callback) {
24
+ RequestQueueHandler.instance = new RequestQueueHandler(callback);
21
25
  }
22
26
  return RequestQueueHandler.instance;
23
27
  }
24
- start() {
25
- if (!this.started) {
26
- this.started = true;
27
- this.startEventBatchPolling();
28
- }
29
- }
30
28
  add(event) {
31
- if (!process.env.BS_TESTOPS_BUILD_COMPLETED) {
32
- return {
33
- proceed: false
34
- };
35
- }
36
- if (!constants_1.BATCH_EVENT_TYPES.includes(event.event_type)) {
37
- return {
38
- proceed: true
39
- };
40
- }
41
- if (event.logs && event.logs[0] && event.logs[0].kind === 'TEST_SCREENSHOT') {
42
- return {
43
- proceed: true,
44
- data: [event],
45
- url: constants_1.DATA_SCREENSHOT_ENDPOINT
46
- };
29
+ if (!process.env[constants_1.TESTOPS_BUILD_COMPLETED_ENV]) {
30
+ throw new Error('Observability build start not completed yet.');
47
31
  }
48
32
  this.queue.push(event);
49
- log.debug(`Added data to request queue. Queue length = ${this.queue.length}`);
50
- let data;
33
+ bstackLogger_1.BStackLogger.debug(`Added data to request queue. Queue length = ${this.queue.length}`);
51
34
  const shouldProceed = this.shouldProceed();
52
35
  if (shouldProceed) {
53
- data = this.queue.splice(0, constants_1.DATA_BATCH_SIZE);
54
- this.resetEventBatchPolling();
55
- log.debug(`Sending data from request queue. Data length = ${data.length}, Queue length after removal = ${this.queue.length}`);
36
+ this.sendBatch().catch((e) => {
37
+ bstackLogger_1.BStackLogger.debug('Exception in sending batch: ' + e);
38
+ });
56
39
  }
57
- return {
58
- proceed: shouldProceed,
59
- data: data,
60
- url: constants_1.DATA_BATCH_ENDPOINT
61
- };
62
40
  }
63
41
  async shutdown() {
64
42
  this.removeEventBatchPolling('Shutting down');
65
43
  while (this.queue.length > 0) {
66
44
  const data = this.queue.splice(0, constants_1.DATA_BATCH_SIZE);
67
- await (0, util_1.batchAndPostEvents)(constants_1.DATA_BATCH_ENDPOINT, 'SHUTDOWN_QUEUE', data);
45
+ await this.callCallback(data, 'SHUTDOWN_QUEUE');
68
46
  }
69
47
  }
70
48
  startEventBatchPolling() {
71
- this.pollEventBatchInterval = setInterval(async () => {
72
- if (this.queue.length > 0) {
73
- const data = this.queue.splice(0, constants_1.DATA_BATCH_SIZE);
74
- log.debug(`Sending data from request queue. Data length = ${data.length}, Queue length after removal = ${this.queue.length}`);
75
- await (0, util_1.batchAndPostEvents)(constants_1.DATA_BATCH_ENDPOINT, 'INTERVAL_QUEUE', data);
76
- }
77
- }, constants_1.DATA_BATCH_INTERVAL);
49
+ this.pollEventBatchInterval = setInterval(this.sendBatch.bind(this), constants_1.DATA_BATCH_INTERVAL);
78
50
  }
79
51
  resetEventBatchPolling() {
80
52
  this.removeEventBatchPolling('Resetting');
@@ -84,9 +56,16 @@ class RequestQueueHandler {
84
56
  if (this.pollEventBatchInterval) {
85
57
  log.debug(`${tag} request queue`);
86
58
  clearInterval(this.pollEventBatchInterval);
87
- this.started = false;
88
59
  }
89
60
  }
61
+ async sendBatch() {
62
+ const data = this.queue.splice(0, constants_1.DATA_BATCH_SIZE);
63
+ if (data.length === 0) {
64
+ return;
65
+ }
66
+ bstackLogger_1.BStackLogger.debug(`Sending data from request queue. Data length = ${data.length}, Queue length after removal = ${this.queue.length}`);
67
+ await this.callCallback(data, 'INTERVAL_QUEUE');
68
+ }
90
69
  shouldProceed() {
91
70
  if (this.tearDownInvoked) {
92
71
  log.debug('Force request-queue shutdown, as test run event is received after teardown');
@@ -20,6 +20,8 @@ export default class BrowserstackService implements Services.ServiceInstance {
20
20
  private _accessibility;
21
21
  private _accessibilityHandler?;
22
22
  private _turboScale;
23
+ private _percy;
24
+ private _percyHandler?;
23
25
  constructor(options: BrowserstackConfig & Options.Testrunner, _caps: Capabilities.RemoteCapability, _config: Options.Testrunner);
24
26
  _updateCaps(fn: (caps: Capabilities.Capabilities | Capabilities.DesiredCapabilities) => void): void;
25
27
  beforeSession(config: Omit<Options.Testrunner, 'capabilities'>): void;
@@ -58,5 +60,6 @@ export default class BrowserstackService implements Services.ServiceInstance {
58
60
  private _setSessionName;
59
61
  private _setAnnotation;
60
62
  private _executeCommand;
63
+ private saveWorkerData;
61
64
  }
62
65
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAA8C,MAAM,SAAS,CAAA;AAKhH,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAoB7F,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,QAAQ,CAAC,eAAe;IAqBpE,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IArBnB,OAAO,CAAC,eAAe,CAAmD;IAC1E,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,gBAAgB,CAA4D;IACpF,OAAO,CAAC,QAAQ,CAAC,CAAgD;IACjE,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,cAAc,CAAA;IACtB,OAAO,CAAC,YAAY,CAAC,CAA0C;IAC/D,OAAO,CAAC,gBAAgB,CAAC,CAAiB;IAC1C,OAAO,CAAC,cAAc,CAAA;IACtB,OAAO,CAAC,qBAAqB,CAAC,CAAsB;IACpD,OAAO,CAAC,WAAW,CAAA;IACnB,OAAO,CAAC,MAAM,CAAA;IACd,OAAO,CAAC,aAAa,CAAC,CAAc;gBAGhC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EACxC,KAAK,EAAE,YAAY,CAAC,gBAAgB,EACpC,OAAO,EAAE,OAAO,CAAC,UAAU;IAiCvC,WAAW,CAAE,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,mBAAmB,KAAK,IAAI;IAU7F,aAAa,CAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC;IAgBzD,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC;IA4F1H;;;;;;OAMG;IACG,WAAW,CAAE,KAAK,EAAE,UAAU,CAAC,KAAK;IAQpC,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI,GAAC,YAAY,EAAE,OAAO,EAAE,GAAG;IAK5D,SAAS,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI,GAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,UAAU;IAI9F,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI;IAoBjC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,UAAU;IAY/E,KAAK,CAAE,MAAM,EAAE,MAAM;IAgC3B;;OAEG;IAEG,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAOjD;;;OAGG;IACG,cAAc,CAAE,KAAK,EAAE,sBAAsB;IAQ7C,aAAa,CAAE,KAAK,EAAE,sBAAsB;IAwB5C,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM;IAKzD,SAAS,CAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY;IAIzF,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IA+BzD,cAAc,IAAI,OAAO;IAOzB,UAAU,CAAE,WAAW,EAAE,GAAG;IAU5B,kBAAkB,CAAE,MAAM,EAAE,iBAAiB;IAqB7C,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG;IAsBrC,gBAAgB;YAiCR,eAAe;IA4B7B,OAAO,CAAC,cAAc;YAIR,eAAe;IAsB7B,OAAO,CAAC,cAAc;CAKzB"}