@wdio/sauce-service 8.27.0 → 8.28.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.
package/build/ci.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const CI: import("./types.js").CI;
2
+ //# sourceMappingURL=ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AAkEA,eAAO,MAAM,EAAE,yBAA6B,CAAA"}
package/build/ci.js ADDED
@@ -0,0 +1,57 @@
1
+ const GITHUB = {
2
+ matcher: () => !!process.env.GITHUB_ACTIONS,
3
+ ci: {
4
+ repo: process.env.GITHUB_REPOSITORY ?? '',
5
+ refName: process.env.GITHUB_HEAD_REF ?? process.env.GITHUB_REF_NAME ?? '',
6
+ sha: process.env.GITHUB_SHA ?? '',
7
+ user: process.env.GITHUB_ACTOR ?? '',
8
+ },
9
+ };
10
+ const GITLAB = {
11
+ matcher: () => !!process.env.GITLAB_CI,
12
+ ci: {
13
+ repo: process.env.CI_PROJECT_PATH ?? '',
14
+ refName: process.env.CI_COMMIT_REF_NAME ?? '',
15
+ sha: process.env.CI_COMMIT_SHA ?? '',
16
+ user: process.env.GITLAB_USER_LOGIN ?? '',
17
+ },
18
+ };
19
+ const JENKINS = {
20
+ matcher: () => !!process.env.JENKINS_URL,
21
+ ci: {
22
+ repo: process.env.GIT_URL ?? '',
23
+ refName: process.env.GIT_BRANCH ?? '',
24
+ sha: process.env.GIT_COMMIT ?? '',
25
+ user: '',
26
+ },
27
+ };
28
+ const BITBUCKET = {
29
+ matcher: () => !!process.env.BITBUCKET_BUILD_NUMBER,
30
+ ci: {
31
+ repo: process.env.BITBUCKET_REPO_FULL_NAME ?? '',
32
+ refName: process.env.BITBUCKET_BRANCH ?? '',
33
+ sha: process.env.BITBUCKET_COMMIT ?? '',
34
+ user: process.env.BITBUCKET_STEP_TRIGGERER_UUID ?? '',
35
+ },
36
+ };
37
+ const CIRCLECI = {
38
+ matcher: () => !!process.env.CIRCLECI,
39
+ ci: {
40
+ repo: process.env.CIRCLE_REPOSITORY_URL ?? '',
41
+ refName: process.env.CIRCLE_BRANCH ?? '',
42
+ sha: process.env.CIRCLE_SHA1 ?? '',
43
+ user: process.env.CIRCLE_USERNAME ?? '',
44
+ },
45
+ };
46
+ const DEFAULT = {
47
+ matcher: () => true,
48
+ ci: {
49
+ repo: '',
50
+ refName: '',
51
+ sha: '',
52
+ user: '',
53
+ },
54
+ };
55
+ const providers = [GITHUB, GITLAB, JENKINS, BITBUCKET, CIRCLECI];
56
+ const provider = providers.find((p) => p.matcher());
57
+ export const CI = provider?.ci ?? DEFAULT.ci;
@@ -9,12 +9,14 @@ export default class SauceService implements Services.ServiceInstance {
9
9
  private _failures;
10
10
  private _isServiceEnabled;
11
11
  private _isJobNameSet;
12
+ private _testStartTime;
12
13
  private _options;
13
14
  private _api;
14
15
  private _browser?;
15
16
  private _isRDC?;
16
17
  private _suiteTitle?;
17
18
  private _cid;
19
+ private _testRuns;
18
20
  constructor(options: SauceServiceConfig, _capabilities: Capabilities.RemoteCapability, _config: Options.Testrunner);
19
21
  /**
20
22
  * gather information about runner
@@ -69,5 +71,9 @@ export default class SauceService implements Services.ServiceInstance {
69
71
  */
70
72
  setAnnotation(annotation: string): Promise<unknown>;
71
73
  private _setJobName;
74
+ private _getStatusForTestRun;
75
+ private _getOsName;
76
+ private _collectTestRun;
77
+ private _updateJobIdInTestRuns;
72
78
  }
73
79
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,OAAO,IAAI,SAAS,EAGvB,MAAM,WAAW,CAAA;AAElB,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAMpD,MAAM,CAAC,OAAO,OAAO,YAAa,YAAW,QAAQ,CAAC,eAAe;IAgB7D,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IAhBnB,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,iBAAiB,CAAO;IAChC,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAsD;IACvE,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,IAAI,CAAK;gBAGb,OAAO,EAAE,kBAAkB,EACnB,aAAa,EAAE,YAAY,CAAC,gBAAgB,EAC5C,OAAO,EAAE,OAAO,CAAC,UAAU;IAOvC;;OAEG;IACH,aAAa,CAAE,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM;IAkBxE,MAAM,CAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB;IAazF,WAAW,CAAE,KAAK,EAAE,UAAU,CAAC,KAAK;IAepC,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI;IAgCvC,UAAU,CAAE,KAAK,EAAE,UAAU,CAAC,KAAK;IAMnC,OAAO,CAAC,eAAe;IAKvB,SAAS,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,UAAU;IAuClF,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,UAAU;IAarE;;OAEG;IACG,aAAa,CAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IAc5D;;;OAGG;IACH,cAAc,CAAE,KAAK,EAAE,UAAU,CAAC,KAAK;IASjC,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,UAAU;IAS7C;;;;;;;OAOG;IACH,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY;IAOtE;;OAEG;IACG,KAAK,CAAE,MAAM,EAAE,MAAM;IAqC3B;;;;OAIG;YACW,WAAW;IAezB,QAAQ,CAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAmB9C,SAAS,CAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,UAAQ,EAAE,WAAW,CAAC,EAAE,MAAM;IAMlG;;OAEG;IACH,OAAO,CAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,UAAQ,EAAE,WAAW,CAAC,EAAE,MAAM;IAgDvE;;OAEG;IACG,aAAa,CAAE,UAAU,EAAE,MAAM;YAezB,WAAW;CAe5B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,OAAO,IAAI,SAAS,EAMvB,MAAM,WAAW,CAAA;AAElB,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAOpD,MAAM,CAAC,OAAO,OAAO,YAAa,YAAW,QAAQ,CAAC,eAAe;IAmB7D,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IAnBnB,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,iBAAiB,CAAO;IAChC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,cAAc,CAAM;IAE5B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAsD;IACvE,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,IAAI,CAAK;IAEjB,OAAO,CAAC,SAAS,CAAsB;gBAGnC,OAAO,EAAE,kBAAkB,EACnB,aAAa,EAAE,YAAY,CAAC,gBAAgB,EAC5C,OAAO,EAAE,OAAO,CAAC,UAAU;IAUvC;;OAEG;IACH,aAAa,CAAE,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM;IAkBxE,MAAM,CAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB;IAazF,WAAW,CAAE,KAAK,EAAE,UAAU,CAAC,KAAK;IAepC,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI;IAkCvC,UAAU,CAAE,KAAK,EAAE,UAAU,CAAC,KAAK;IAMnC,OAAO,CAAC,eAAe;IAKvB,SAAS,CAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,UAAU;IAyClF,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,UAAU;IAarE;;OAEG;IACG,aAAa,CAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IAc5D;;;OAGG;IACH,cAAc,CAAE,KAAK,EAAE,UAAU,CAAC,KAAK;IASjC,UAAU,CAAE,IAAI,EAAE,UAAU,CAAC,UAAU;IAS7C;;;;;;;OAOG;IACH,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY;IAOtE;;OAEG;IACG,KAAK,CAAE,MAAM,EAAE,MAAM;IAmD3B;;;;OAIG;YACW,WAAW;IAezB,QAAQ,CAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAmB9C,SAAS,CAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,UAAQ,EAAE,WAAW,CAAC,EAAE,MAAM;IAMlG;;OAEG;IACH,OAAO,CAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,UAAQ,EAAE,WAAW,CAAC,EAAE,MAAM;IAgDvE;;OAEG;IACG,aAAa,CAAE,UAAU,EAAE,MAAM;YAezB,WAAW;IAgBzB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,sBAAsB;CAOjC"}
package/build/service.js CHANGED
@@ -1,9 +1,10 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { default as SauceLabs } from 'saucelabs';
3
+ import { default as SauceLabs, } from 'saucelabs';
4
4
  import logger from '@wdio/logger';
5
5
  import { isRDC, ansiRegex } from './utils.js';
6
6
  import { DEFAULT_OPTIONS } from './constants.js';
7
+ import { CI } from './ci.js';
7
8
  const jobDataProperties = ['name', 'tags', 'public', 'build', 'custom-data'];
8
9
  const log = logger('@wdio/sauce-service');
9
10
  export default class SauceService {
@@ -14,18 +15,22 @@ export default class SauceService {
14
15
  _failures = 0; // counts failures between reloads
15
16
  _isServiceEnabled = true;
16
17
  _isJobNameSet = false;
18
+ _testStartTime;
17
19
  _options;
18
20
  _api;
19
21
  _browser;
20
22
  _isRDC;
21
23
  _suiteTitle;
22
24
  _cid = '';
25
+ _testRuns;
23
26
  constructor(options, _capabilities, _config) {
24
27
  this._capabilities = _capabilities;
25
28
  this._config = _config;
26
29
  this._options = { ...DEFAULT_OPTIONS, ...options };
27
30
  this._api = new SauceLabs.default(this._config);
28
31
  this._maxErrorStackLength = this._options.maxErrorStackLength || this._maxErrorStackLength;
32
+ this._testStartTime = new Date();
33
+ this._testRuns = [];
29
34
  }
30
35
  /**
31
36
  * gather information about runner
@@ -74,6 +79,7 @@ export default class SauceService {
74
79
  if (!this._isServiceEnabled || !this._browser) {
75
80
  return;
76
81
  }
82
+ this._testStartTime = new Date();
77
83
  /**
78
84
  * in jasmine we get Jasmine__TopLevel__Suite as title since service using test
79
85
  * framework hooks in order to execute async functions.
@@ -107,6 +113,7 @@ export default class SauceService {
107
113
  lines.forEach((line) => this.setAnnotation(`sauce:context=${line.replace(ansiRegex(), '')}`));
108
114
  }
109
115
  afterTest(test, context, results) {
116
+ this._collectTestRun(test, results);
110
117
  /**
111
118
  * If the test failed push the stack to Sauce Labs in separate lines
112
119
  */
@@ -211,6 +218,13 @@ export default class SauceService {
211
218
  const status = 'status: ' + (failures > 0 ? 'failing' : 'passing');
212
219
  if (!this._browser.isMultiremote) {
213
220
  await this._uploadLogs(this._browser.sessionId);
221
+ this._updateJobIdInTestRuns(this._browser.sessionId);
222
+ try {
223
+ await this._api.createTestRunsV1({ test_runs: this._testRuns });
224
+ }
225
+ catch (e) {
226
+ log.debug('Submitting test run failed: ', e);
227
+ }
214
228
  log.info(`Update job with sessionId ${this._browser.sessionId}, ${status}`);
215
229
  return this._isRDC ?
216
230
  this.setAnnotation(`sauce:job-result=${failures === 0}`) :
@@ -221,6 +235,13 @@ export default class SauceService {
221
235
  const isMultiRemoteRDC = isRDC(multiRemoteBrowser.capabilities);
222
236
  log.info(`Update multiRemote job for browser "${browserName}" and sessionId ${multiRemoteBrowser.sessionId}, ${status}`);
223
237
  await this._uploadLogs(multiRemoteBrowser.sessionId);
238
+ this._updateJobIdInTestRuns(multiRemoteBrowser.sessionId);
239
+ try {
240
+ await this._api.createTestRunsV1({ test_runs: this._testRuns });
241
+ }
242
+ catch (e) {
243
+ log.debug('Submitting test run failed: ', e);
244
+ }
224
245
  // Sauce Unified Platform (RDC) can not be updated with an API.
225
246
  if (isMultiRemoteRDC) {
226
247
  return this.setAnnotation(`sauce:job-result=${failures === 0}`);
@@ -323,4 +344,63 @@ export default class SauceService {
323
344
  await this.setAnnotation(`sauce:job-name=${jobName}`);
324
345
  this._isJobNameSet = true;
325
346
  }
347
+ _getStatusForTestRun(result) {
348
+ if (['passed', 'failed', 'skipped'].includes(result.status)) {
349
+ return result.status;
350
+ }
351
+ if (result.error) {
352
+ return 'failed';
353
+ }
354
+ if (result.passed) {
355
+ return 'passed';
356
+ }
357
+ return 'skipped';
358
+ }
359
+ _getOsName(osName) {
360
+ if (!osName) {
361
+ return 'unknown';
362
+ }
363
+ if ('darwin' === osName) {
364
+ return 'Mac';
365
+ }
366
+ return osName;
367
+ }
368
+ _collectTestRun(test, results) {
369
+ const caps = this._capabilities;
370
+ const sauceCaps = this._capabilities;
371
+ const testRun = {
372
+ name: `${test.parent} - ${test.title}`,
373
+ start_time: this._testStartTime?.toISOString(),
374
+ end_time: (new Date()).toISOString(),
375
+ duration: results.duration || 0,
376
+ browser: caps?.browserName || 'chrome',
377
+ build_name: sauceCaps?.build?.toString() || '',
378
+ tags: sauceCaps?.tags,
379
+ framework: 'webdriverio',
380
+ platform: 'other',
381
+ os: this._getOsName(process.platform),
382
+ status: this._getStatusForTestRun(results),
383
+ type: 'web',
384
+ ci: {
385
+ ref_name: CI.refName,
386
+ commit_sha: CI.sha,
387
+ repository: CI.repo,
388
+ branch: CI.refName,
389
+ }
390
+ };
391
+ if (results.error) {
392
+ testRun.errors = [{
393
+ message: results.error?.message?.toString(),
394
+ path: test.file,
395
+ }];
396
+ }
397
+ this._testRuns?.push(testRun);
398
+ }
399
+ _updateJobIdInTestRuns(id) {
400
+ this._testRuns?.forEach(testRun => {
401
+ testRun.sauce_job = {
402
+ id,
403
+ };
404
+ });
405
+ }
326
406
  }
package/build/types.d.ts CHANGED
@@ -43,4 +43,14 @@ export interface SauceServiceConfig {
43
43
  */
44
44
  setJobName?: (config: Options.Testrunner, capabilities: Capabilities.RemoteCapability, suiteTitle: string) => string;
45
45
  }
46
+ export interface Provider {
47
+ matcher(): boolean;
48
+ ci: CI;
49
+ }
50
+ export interface CI {
51
+ repo: string;
52
+ refName: string;
53
+ sha: string;
54
+ user: string;
55
+ }
46
56
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAExD,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAE5B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;IAEtC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,CACT,MAAM,EAAE,OAAO,CAAC,UAAU,EAC1B,YAAY,EAAE,YAAY,CAAC,gBAAgB,EAC3C,UAAU,EAAE,MAAM,KACjB,MAAM,CAAA;CACd"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAExD,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAE5B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;IAEtC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,CACT,MAAM,EAAE,OAAO,CAAC,UAAU,EAC1B,YAAY,EAAE,YAAY,CAAC,gBAAgB,EAC3C,UAAU,EAAE,MAAM,KACjB,MAAM,CAAA;CACd;AAED,MAAM,WAAW,QAAQ;IACrB,OAAO,IAAI,OAAO,CAAC;IACnB,EAAE,EAAE,EAAE,CAAC;CACV;AAED,MAAM,WAAW,EAAE;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CAChB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wdio/sauce-service",
3
- "version": "8.27.0",
3
+ "version": "8.28.0",
4
4
  "description": "WebdriverIO service that provides a better integration into Sauce Labs",
5
5
  "author": "Christian Bromann <mail@bromann.dev>",
6
6
  "homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-sauce-service",
@@ -30,19 +30,19 @@
30
30
  },
31
31
  "typeScriptVersion": "3.8.3",
32
32
  "dependencies": {
33
- "@wdio/logger": "8.24.12",
34
- "@wdio/types": "8.27.0",
35
- "@wdio/utils": "8.27.0",
33
+ "@wdio/logger": "8.28.0",
34
+ "@wdio/types": "8.28.0",
35
+ "@wdio/utils": "8.28.0",
36
36
  "ip": "^1.1.8",
37
- "saucelabs": "7.4.0",
38
- "webdriverio": "8.27.0"
37
+ "saucelabs": "7.5.0",
38
+ "webdriverio": "8.28.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/ip": "^1.1.0",
42
- "@wdio/globals": "8.27.0"
42
+ "@wdio/globals": "8.28.0"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public"
46
46
  },
47
- "gitHead": "be6dce3344ac864509f676b561cb0eed821b36f6"
47
+ "gitHead": "15f6ac509df48b23477cd4c793206a4f707e3df0"
48
48
  }