@tvlabs/wdio-service 0.1.6 → 0.1.8
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/README.md +8 -1
- package/cjs/channels/build.d.ts.map +1 -1
- package/cjs/index.js +44 -20
- package/cjs/service.d.ts +1 -0
- package/cjs/service.d.ts.map +1 -1
- package/cjs/types.d.ts +3 -0
- package/cjs/types.d.ts.map +1 -1
- package/esm/channels/build.d.ts.map +1 -1
- package/esm/index.js +44 -20
- package/esm/service.d.ts +1 -0
- package/esm/service.d.ts.map +1 -1
- package/esm/types.d.ts +3 -0
- package/esm/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/channels/build.ts +12 -5
- package/src/service.ts +50 -30
- package/src/types.ts +3 -0
package/README.md
CHANGED
|
@@ -112,7 +112,7 @@ run();
|
|
|
112
112
|
|
|
113
113
|
- **Type:** `string`
|
|
114
114
|
- **Required:** No
|
|
115
|
-
- **Description:**
|
|
115
|
+
- **Description:** The slug of the app on the TV Labs platform to use to upload the build. When not provided, the organization's default app is used. You may find or create an app on the [Apps page](https://tvlabs.ai/app/apps) in the TV Labs platform.
|
|
116
116
|
|
|
117
117
|
### `retries`
|
|
118
118
|
|
|
@@ -134,3 +134,10 @@ run();
|
|
|
134
134
|
- **Required:** No
|
|
135
135
|
- **Default:** `true`
|
|
136
136
|
- **Description:** Controls whether or not to attach an `x-request-id` header to each request made to the TV Labs platform.
|
|
137
|
+
|
|
138
|
+
### `continueOnError`
|
|
139
|
+
|
|
140
|
+
- **Type:** `boolean`
|
|
141
|
+
- **Required:** No
|
|
142
|
+
- **Default:** `false`
|
|
143
|
+
- **Description:** Whether to continue the session request if any step fails. When `true`, the session request will still be made with the original provided capabilities. When `false`, the service will exit with a non-zero code.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/channels/build.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAIV,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,UAAU,CAAU;gBAG1B,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,QAAiB;IAYvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/channels/build.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAIV,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,UAAU,CAAU;gBAG1B,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,QAAiB;IAYvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YA2BzD,gBAAgB;YAgBhB,WAAW;YA8BX,gBAAgB;YAehB,eAAe;YAWf,aAAa;IAW3B,OAAO,CAAC,cAAc;CAYvB"}
|
package/cjs/index.js
CHANGED
|
@@ -136,7 +136,7 @@ class Logger {
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
var name = "@tvlabs/wdio-service";
|
|
139
|
-
var version = "0.1.
|
|
139
|
+
var version = "0.1.8";
|
|
140
140
|
var packageJson = {
|
|
141
141
|
name: name,
|
|
142
142
|
version: version};
|
|
@@ -367,11 +367,16 @@ class BuildChannel extends BaseChannel {
|
|
|
367
367
|
async uploadBuild(buildPath, appSlug) {
|
|
368
368
|
const metadata = await this.getFileMetadata(buildPath);
|
|
369
369
|
this.log.info(`Requesting upload for build ${metadata.filename} (${metadata.type}, ${metadata.size} bytes)`);
|
|
370
|
-
const {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
370
|
+
const { existing, build_id, url } = await this.requestUploadUrl(metadata, appSlug);
|
|
371
|
+
if (existing) {
|
|
372
|
+
this.log.info('Build is pre-existing, skipping upload');
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
this.log.info('Uploading build...');
|
|
376
|
+
await this.uploadToUrl(url, buildPath, metadata);
|
|
377
|
+
const { application_id } = await this.extractBuildInfo();
|
|
378
|
+
this.log.info(`Build "${application_id}" processed successfully`);
|
|
379
|
+
}
|
|
375
380
|
return build_id;
|
|
376
381
|
}
|
|
377
382
|
async requestUploadUrl(metadata, appSlug) {
|
|
@@ -452,28 +457,44 @@ class TVLabsService {
|
|
|
452
457
|
this._options = _options;
|
|
453
458
|
this._capabilities = _capabilities;
|
|
454
459
|
this._config = _config;
|
|
455
|
-
this.log = new Logger('@tvlabs/wdio-
|
|
460
|
+
this.log = new Logger('@tvlabs/wdio-service', this._config.logLevel);
|
|
456
461
|
if (this.attachRequestId()) {
|
|
457
462
|
this.setupRequestId();
|
|
458
463
|
}
|
|
459
464
|
}
|
|
460
465
|
onPrepare(_config, param) {
|
|
461
|
-
|
|
462
|
-
|
|
466
|
+
try {
|
|
467
|
+
if (!Array.isArray(param)) {
|
|
468
|
+
throw new webdriverio.SevereServiceError('Multi-remote capabilities are not implemented. Contact TV Labs support if you are interested in this feature.');
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
catch (error) {
|
|
472
|
+
if (!this.continueOnError()) {
|
|
473
|
+
process.exit(1);
|
|
474
|
+
}
|
|
475
|
+
throw error;
|
|
463
476
|
}
|
|
464
477
|
}
|
|
465
478
|
async beforeSession(_config, capabilities, _specs, _cid) {
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
479
|
+
try {
|
|
480
|
+
const buildPath = this.buildPath();
|
|
481
|
+
if (buildPath) {
|
|
482
|
+
const buildChannel = new BuildChannel(this.buildEndpoint(), this.reconnectRetries(), this.apiKey(), this.logLevel());
|
|
483
|
+
await buildChannel.connect();
|
|
484
|
+
capabilities['tvlabs:build'] = await buildChannel.uploadBuild(buildPath, this.appSlug());
|
|
485
|
+
await buildChannel.disconnect();
|
|
486
|
+
}
|
|
487
|
+
const sessionChannel = new SessionChannel(this.sessionEndpoint(), this.reconnectRetries(), this.apiKey(), this.logLevel());
|
|
488
|
+
await sessionChannel.connect();
|
|
489
|
+
capabilities['tvlabs:session_id'] = await sessionChannel.newSession(capabilities, this.retries());
|
|
490
|
+
await sessionChannel.disconnect();
|
|
491
|
+
}
|
|
492
|
+
catch (error) {
|
|
493
|
+
if (!this.continueOnError()) {
|
|
494
|
+
process.exit(1);
|
|
495
|
+
}
|
|
496
|
+
throw error;
|
|
497
|
+
}
|
|
477
498
|
}
|
|
478
499
|
setupRequestId() {
|
|
479
500
|
const originalTransformRequest = this._config.transformRequest;
|
|
@@ -503,6 +524,9 @@ class TVLabsService {
|
|
|
503
524
|
}
|
|
504
525
|
}
|
|
505
526
|
}
|
|
527
|
+
continueOnError() {
|
|
528
|
+
return this._options.continueOnError ?? false;
|
|
529
|
+
}
|
|
506
530
|
buildPath() {
|
|
507
531
|
return this._options.buildPath;
|
|
508
532
|
}
|
package/cjs/service.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export default class TVLabsService implements Services.ServiceInstance {
|
|
|
10
10
|
beforeSession(_config: Omit<Options.Testrunner, 'capabilities'>, capabilities: TVLabsCapabilities, _specs: string[], _cid: string): Promise<void>;
|
|
11
11
|
private setupRequestId;
|
|
12
12
|
private setRequestHeader;
|
|
13
|
+
private continueOnError;
|
|
13
14
|
private buildPath;
|
|
14
15
|
private appSlug;
|
|
15
16
|
private sessionEndpoint;
|
package/cjs/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,QAAQ,CAAC,eAAe;IAIlE,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,GAAG,CAAS;gBAGV,QAAQ,EAAE,oBAAoB,EAC9B,aAAa,EAAE,YAAY,CAAC,8BAA8B,EAC1D,OAAO,EAAE,OAAO,CAAC,WAAW;IAQtC,SAAS,CACP,OAAO,EAAE,OAAO,CAAC,UAAU,EAC3B,KAAK,EAAE,YAAY,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,QAAQ,CAAC,eAAe;IAIlE,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,GAAG,CAAS;gBAGV,QAAQ,EAAE,oBAAoB,EAC9B,aAAa,EAAE,YAAY,CAAC,8BAA8B,EAC1D,OAAO,EAAE,OAAO,CAAC,WAAW;IAQtC,SAAS,CACP,OAAO,EAAE,OAAO,CAAC,UAAU,EAC3B,KAAK,EAAE,YAAY,CAAC,sBAAsB;IAiBtC,aAAa,CACjB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,EACjD,YAAY,EAAE,kBAAkB,EAChC,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,MAAM;IA+Cd,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;CAGzB"}
|
package/cjs/types.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export type TVLabsServiceOptions = {
|
|
|
9
9
|
app?: string;
|
|
10
10
|
reconnectRetries?: number;
|
|
11
11
|
attachRequestId?: boolean;
|
|
12
|
+
continueOnError?: boolean;
|
|
12
13
|
};
|
|
13
14
|
export type TVLabsCapabilities = Capabilities.RequestedStandaloneCapabilities & {
|
|
14
15
|
'tvlabs:session_id'?: string;
|
|
@@ -44,6 +45,8 @@ export type TVLabsServiceInfo = {
|
|
|
44
45
|
export type TVLabsRequestUploadUrlResponse = {
|
|
45
46
|
url: string;
|
|
46
47
|
build_id: string;
|
|
48
|
+
existing: boolean;
|
|
49
|
+
application_id?: string;
|
|
47
50
|
};
|
|
48
51
|
export type TVLabsExtractBuildInfoResponse = {
|
|
49
52
|
application_id: string;
|
package/cjs/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,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC5B,YAAY,CAAC,+BAA+B,GAAG;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kCAAkC,CAAC,EAAE,MAAM,CAAC;QAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,CAAC;IACF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEJ,MAAM,MAAM,gCAAgC,GAAG,CAC7C,QAAQ,EAAE,0BAA0B,KACjC,IAAI,CAAC;AAEV,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC5B,YAAY,CAAC,+BAA+B,GAAG;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kCAAkC,CAAC,EAAE,MAAM,CAAC;QAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,CAAC;IACF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEJ,MAAM,MAAM,gCAAgC,GAAG,CAC7C,QAAQ,EAAE,0BAA0B,KACjC,IAAI,CAAC;AAEV,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/channels/build.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAIV,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,UAAU,CAAU;gBAG1B,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,QAAiB;IAYvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/channels/build.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAIV,QAAQ,EACT,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,SAAQ,WAAW;IAC3C,OAAO,CAAC,UAAU,CAAU;gBAG1B,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,QAAiB;IAYvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YA2BzD,gBAAgB;YAgBhB,WAAW;YA8BX,gBAAgB;YAehB,eAAe;YAWf,aAAa;IAW3B,OAAO,CAAC,cAAc;CAYvB"}
|
package/esm/index.js
CHANGED
|
@@ -110,7 +110,7 @@ class Logger {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
var name = "@tvlabs/wdio-service";
|
|
113
|
-
var version = "0.1.
|
|
113
|
+
var version = "0.1.8";
|
|
114
114
|
var packageJson = {
|
|
115
115
|
name: name,
|
|
116
116
|
version: version};
|
|
@@ -341,11 +341,16 @@ class BuildChannel extends BaseChannel {
|
|
|
341
341
|
async uploadBuild(buildPath, appSlug) {
|
|
342
342
|
const metadata = await this.getFileMetadata(buildPath);
|
|
343
343
|
this.log.info(`Requesting upload for build ${metadata.filename} (${metadata.type}, ${metadata.size} bytes)`);
|
|
344
|
-
const {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
344
|
+
const { existing, build_id, url } = await this.requestUploadUrl(metadata, appSlug);
|
|
345
|
+
if (existing) {
|
|
346
|
+
this.log.info('Build is pre-existing, skipping upload');
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
this.log.info('Uploading build...');
|
|
350
|
+
await this.uploadToUrl(url, buildPath, metadata);
|
|
351
|
+
const { application_id } = await this.extractBuildInfo();
|
|
352
|
+
this.log.info(`Build "${application_id}" processed successfully`);
|
|
353
|
+
}
|
|
349
354
|
return build_id;
|
|
350
355
|
}
|
|
351
356
|
async requestUploadUrl(metadata, appSlug) {
|
|
@@ -426,28 +431,44 @@ class TVLabsService {
|
|
|
426
431
|
this._options = _options;
|
|
427
432
|
this._capabilities = _capabilities;
|
|
428
433
|
this._config = _config;
|
|
429
|
-
this.log = new Logger('@tvlabs/wdio-
|
|
434
|
+
this.log = new Logger('@tvlabs/wdio-service', this._config.logLevel);
|
|
430
435
|
if (this.attachRequestId()) {
|
|
431
436
|
this.setupRequestId();
|
|
432
437
|
}
|
|
433
438
|
}
|
|
434
439
|
onPrepare(_config, param) {
|
|
435
|
-
|
|
436
|
-
|
|
440
|
+
try {
|
|
441
|
+
if (!Array.isArray(param)) {
|
|
442
|
+
throw new SevereServiceError('Multi-remote capabilities are not implemented. Contact TV Labs support if you are interested in this feature.');
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
if (!this.continueOnError()) {
|
|
447
|
+
process.exit(1);
|
|
448
|
+
}
|
|
449
|
+
throw error;
|
|
437
450
|
}
|
|
438
451
|
}
|
|
439
452
|
async beforeSession(_config, capabilities, _specs, _cid) {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
453
|
+
try {
|
|
454
|
+
const buildPath = this.buildPath();
|
|
455
|
+
if (buildPath) {
|
|
456
|
+
const buildChannel = new BuildChannel(this.buildEndpoint(), this.reconnectRetries(), this.apiKey(), this.logLevel());
|
|
457
|
+
await buildChannel.connect();
|
|
458
|
+
capabilities['tvlabs:build'] = await buildChannel.uploadBuild(buildPath, this.appSlug());
|
|
459
|
+
await buildChannel.disconnect();
|
|
460
|
+
}
|
|
461
|
+
const sessionChannel = new SessionChannel(this.sessionEndpoint(), this.reconnectRetries(), this.apiKey(), this.logLevel());
|
|
462
|
+
await sessionChannel.connect();
|
|
463
|
+
capabilities['tvlabs:session_id'] = await sessionChannel.newSession(capabilities, this.retries());
|
|
464
|
+
await sessionChannel.disconnect();
|
|
465
|
+
}
|
|
466
|
+
catch (error) {
|
|
467
|
+
if (!this.continueOnError()) {
|
|
468
|
+
process.exit(1);
|
|
469
|
+
}
|
|
470
|
+
throw error;
|
|
471
|
+
}
|
|
451
472
|
}
|
|
452
473
|
setupRequestId() {
|
|
453
474
|
const originalTransformRequest = this._config.transformRequest;
|
|
@@ -477,6 +498,9 @@ class TVLabsService {
|
|
|
477
498
|
}
|
|
478
499
|
}
|
|
479
500
|
}
|
|
501
|
+
continueOnError() {
|
|
502
|
+
return this._options.continueOnError ?? false;
|
|
503
|
+
}
|
|
480
504
|
buildPath() {
|
|
481
505
|
return this._options.buildPath;
|
|
482
506
|
}
|
package/esm/service.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export default class TVLabsService implements Services.ServiceInstance {
|
|
|
10
10
|
beforeSession(_config: Omit<Options.Testrunner, 'capabilities'>, capabilities: TVLabsCapabilities, _specs: string[], _cid: string): Promise<void>;
|
|
11
11
|
private setupRequestId;
|
|
12
12
|
private setRequestHeader;
|
|
13
|
+
private continueOnError;
|
|
13
14
|
private buildPath;
|
|
14
15
|
private appSlug;
|
|
15
16
|
private sessionEndpoint;
|
package/esm/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,QAAQ,CAAC,eAAe;IAIlE,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,GAAG,CAAS;gBAGV,QAAQ,EAAE,oBAAoB,EAC9B,aAAa,EAAE,YAAY,CAAC,8BAA8B,EAC1D,OAAO,EAAE,OAAO,CAAC,WAAW;IAQtC,SAAS,CACP,OAAO,EAAE,OAAO,CAAC,UAAU,EAC3B,KAAK,EAAE,YAAY,CAAC,sBAAsB;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,QAAQ,CAAC,eAAe;IAIlE,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,GAAG,CAAS;gBAGV,QAAQ,EAAE,oBAAoB,EAC9B,aAAa,EAAE,YAAY,CAAC,8BAA8B,EAC1D,OAAO,EAAE,OAAO,CAAC,WAAW;IAQtC,SAAS,CACP,OAAO,EAAE,OAAO,CAAC,UAAU,EAC3B,KAAK,EAAE,YAAY,CAAC,sBAAsB;IAiBtC,aAAa,CACjB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,EACjD,YAAY,EAAE,kBAAkB,EAChC,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,MAAM;IA+Cd,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;CAGzB"}
|
package/esm/types.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export type TVLabsServiceOptions = {
|
|
|
9
9
|
app?: string;
|
|
10
10
|
reconnectRetries?: number;
|
|
11
11
|
attachRequestId?: boolean;
|
|
12
|
+
continueOnError?: boolean;
|
|
12
13
|
};
|
|
13
14
|
export type TVLabsCapabilities = Capabilities.RequestedStandaloneCapabilities & {
|
|
14
15
|
'tvlabs:session_id'?: string;
|
|
@@ -44,6 +45,8 @@ export type TVLabsServiceInfo = {
|
|
|
44
45
|
export type TVLabsRequestUploadUrlResponse = {
|
|
45
46
|
url: string;
|
|
46
47
|
build_id: string;
|
|
48
|
+
existing: boolean;
|
|
49
|
+
application_id?: string;
|
|
47
50
|
};
|
|
48
51
|
export type TVLabsExtractBuildInfoResponse = {
|
|
49
52
|
application_id: string;
|
package/esm/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,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC5B,YAAY,CAAC,+BAA+B,GAAG;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kCAAkC,CAAC,EAAE,MAAM,CAAC;QAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,CAAC;IACF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEJ,MAAM,MAAM,gCAAgC,GAAG,CAC7C,QAAQ,EAAE,0BAA0B,KACjC,IAAI,CAAC;AAEV,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC5B,YAAY,CAAC,+BAA+B,GAAG;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kCAAkC,CAAC,EAAE,MAAM,CAAC;QAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;KACjC,CAAC;IACF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEJ,MAAM,MAAM,gCAAgC,GAAG,CAC7C,QAAQ,EAAE,0BAA0B,KACjC,IAAI,CAAC;AAEV,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
package/package.json
CHANGED
package/src/channels/build.ts
CHANGED
|
@@ -63,15 +63,22 @@ export class BuildChannel extends BaseChannel {
|
|
|
63
63
|
`Requesting upload for build ${metadata.filename} (${metadata.type}, ${metadata.size} bytes)`,
|
|
64
64
|
);
|
|
65
65
|
|
|
66
|
-
const {
|
|
66
|
+
const { existing, build_id, url } = await this.requestUploadUrl(
|
|
67
|
+
metadata,
|
|
68
|
+
appSlug,
|
|
69
|
+
);
|
|
67
70
|
|
|
68
|
-
|
|
71
|
+
if (existing) {
|
|
72
|
+
this.log.info('Build is pre-existing, skipping upload');
|
|
73
|
+
} else {
|
|
74
|
+
this.log.info('Uploading build...');
|
|
69
75
|
|
|
70
|
-
|
|
76
|
+
await this.uploadToUrl(url, buildPath, metadata);
|
|
71
77
|
|
|
72
|
-
|
|
78
|
+
const { application_id } = await this.extractBuildInfo();
|
|
73
79
|
|
|
74
|
-
|
|
80
|
+
this.log.info(`Build "${application_id}" processed successfully`);
|
|
81
|
+
}
|
|
75
82
|
|
|
76
83
|
return build_id;
|
|
77
84
|
}
|
package/src/service.ts
CHANGED
|
@@ -20,7 +20,7 @@ export default class TVLabsService implements Services.ServiceInstance {
|
|
|
20
20
|
private _capabilities: Capabilities.ResolvedTestrunnerCapabilities,
|
|
21
21
|
private _config: Options.WebdriverIO,
|
|
22
22
|
) {
|
|
23
|
-
this.log = new Logger('@tvlabs/wdio-
|
|
23
|
+
this.log = new Logger('@tvlabs/wdio-service', this._config.logLevel);
|
|
24
24
|
if (this.attachRequestId()) {
|
|
25
25
|
this.setupRequestId();
|
|
26
26
|
}
|
|
@@ -30,10 +30,18 @@ export default class TVLabsService implements Services.ServiceInstance {
|
|
|
30
30
|
_config: Options.Testrunner,
|
|
31
31
|
param: Capabilities.TestrunnerCapabilities,
|
|
32
32
|
) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
try {
|
|
34
|
+
if (!Array.isArray(param)) {
|
|
35
|
+
throw new SevereServiceError(
|
|
36
|
+
'Multi-remote capabilities are not implemented. Contact TV Labs support if you are interested in this feature.',
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (!this.continueOnError()) {
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
throw error;
|
|
37
45
|
}
|
|
38
46
|
}
|
|
39
47
|
|
|
@@ -43,41 +51,49 @@ export default class TVLabsService implements Services.ServiceInstance {
|
|
|
43
51
|
_specs: string[],
|
|
44
52
|
_cid: string,
|
|
45
53
|
) {
|
|
46
|
-
|
|
54
|
+
try {
|
|
55
|
+
const buildPath = this.buildPath();
|
|
56
|
+
|
|
57
|
+
if (buildPath) {
|
|
58
|
+
const buildChannel = new BuildChannel(
|
|
59
|
+
this.buildEndpoint(),
|
|
60
|
+
this.reconnectRetries(),
|
|
61
|
+
this.apiKey(),
|
|
62
|
+
this.logLevel(),
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
await buildChannel.connect();
|
|
66
|
+
|
|
67
|
+
capabilities['tvlabs:build'] = await buildChannel.uploadBuild(
|
|
68
|
+
buildPath,
|
|
69
|
+
this.appSlug(),
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
await buildChannel.disconnect();
|
|
73
|
+
}
|
|
47
74
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
this.buildEndpoint(),
|
|
75
|
+
const sessionChannel = new SessionChannel(
|
|
76
|
+
this.sessionEndpoint(),
|
|
51
77
|
this.reconnectRetries(),
|
|
52
78
|
this.apiKey(),
|
|
53
79
|
this.logLevel(),
|
|
54
80
|
);
|
|
55
81
|
|
|
56
|
-
await
|
|
82
|
+
await sessionChannel.connect();
|
|
57
83
|
|
|
58
|
-
capabilities['tvlabs:
|
|
59
|
-
|
|
60
|
-
this.
|
|
84
|
+
capabilities['tvlabs:session_id'] = await sessionChannel.newSession(
|
|
85
|
+
capabilities,
|
|
86
|
+
this.retries(),
|
|
61
87
|
);
|
|
62
88
|
|
|
63
|
-
await
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
this.reconnectRetries(),
|
|
69
|
-
this.apiKey(),
|
|
70
|
-
this.logLevel(),
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
await sessionChannel.connect();
|
|
74
|
-
|
|
75
|
-
capabilities['tvlabs:session_id'] = await sessionChannel.newSession(
|
|
76
|
-
capabilities,
|
|
77
|
-
this.retries(),
|
|
78
|
-
);
|
|
89
|
+
await sessionChannel.disconnect();
|
|
90
|
+
} catch (error) {
|
|
91
|
+
if (!this.continueOnError()) {
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
79
94
|
|
|
80
|
-
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
81
97
|
}
|
|
82
98
|
|
|
83
99
|
private setupRequestId() {
|
|
@@ -122,6 +138,10 @@ export default class TVLabsService implements Services.ServiceInstance {
|
|
|
122
138
|
}
|
|
123
139
|
}
|
|
124
140
|
|
|
141
|
+
private continueOnError(): boolean {
|
|
142
|
+
return this._options.continueOnError ?? false;
|
|
143
|
+
}
|
|
144
|
+
|
|
125
145
|
private buildPath(): string | undefined {
|
|
126
146
|
return this._options.buildPath;
|
|
127
147
|
}
|
package/src/types.ts
CHANGED
|
@@ -11,6 +11,7 @@ export type TVLabsServiceOptions = {
|
|
|
11
11
|
app?: string;
|
|
12
12
|
reconnectRetries?: number;
|
|
13
13
|
attachRequestId?: boolean;
|
|
14
|
+
continueOnError?: boolean;
|
|
14
15
|
};
|
|
15
16
|
|
|
16
17
|
export type TVLabsCapabilities =
|
|
@@ -56,6 +57,8 @@ export type TVLabsServiceInfo = {
|
|
|
56
57
|
export type TVLabsRequestUploadUrlResponse = {
|
|
57
58
|
url: string;
|
|
58
59
|
build_id: string;
|
|
60
|
+
existing: boolean;
|
|
61
|
+
application_id?: string;
|
|
59
62
|
};
|
|
60
63
|
|
|
61
64
|
export type TVLabsExtractBuildInfoResponse = {
|