@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 +2 -0
- package/build/ci.d.ts.map +1 -0
- package/build/ci.js +57 -0
- package/build/service.d.ts +6 -0
- package/build/service.d.ts.map +1 -1
- package/build/service.js +81 -1
- package/build/types.d.ts +10 -0
- package/build/types.d.ts.map +1 -1
- package/package.json +8 -8
package/build/ci.d.ts
ADDED
|
@@ -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;
|
package/build/service.d.ts
CHANGED
|
@@ -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
|
package/build/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,OAAO,IAAI,SAAS,
|
|
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
|
package/build/types.d.ts.map
CHANGED
|
@@ -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.
|
|
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.
|
|
34
|
-
"@wdio/types": "8.
|
|
35
|
-
"@wdio/utils": "8.
|
|
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.
|
|
38
|
-
"webdriverio": "8.
|
|
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.
|
|
42
|
+
"@wdio/globals": "8.28.0"
|
|
43
43
|
},
|
|
44
44
|
"publishConfig": {
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "15f6ac509df48b23477cd4c793206a4f707e3df0"
|
|
48
48
|
}
|