@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 CHANGED
@@ -112,7 +112,7 @@ run();
112
112
 
113
113
  - **Type:** `string`
114
114
  - **Required:** No
115
- - **Description:** Slug of the App for build uploads. When provided in combination with `buildPath`, the build is uploaded under this specified App.
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;YAoBzD,gBAAgB;YAgBhB,WAAW;YA8BX,gBAAgB;YAehB,eAAe;YAWf,aAAa;IAW3B,OAAO,CAAC,cAAc;CAYvB"}
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.6";
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 { url, build_id } = await this.requestUploadUrl(metadata, appSlug);
371
- this.log.info('Uploading build...');
372
- await this.uploadToUrl(url, buildPath, metadata);
373
- const { application_id } = await this.extractBuildInfo();
374
- this.log.info(`Build "${application_id}" processed successfully`);
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-server', this._config.logLevel);
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
- if (!Array.isArray(param)) {
462
- throw new webdriverio.SevereServiceError('Multi-remote capabilities are not implemented. Contact TV Labs support if you are interested in this feature.');
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
- const buildPath = this.buildPath();
467
- if (buildPath) {
468
- const buildChannel = new BuildChannel(this.buildEndpoint(), this.reconnectRetries(), this.apiKey(), this.logLevel());
469
- await buildChannel.connect();
470
- capabilities['tvlabs:build'] = await buildChannel.uploadBuild(buildPath, this.appSlug());
471
- await buildChannel.disconnect();
472
- }
473
- const sessionChannel = new SessionChannel(this.sessionEndpoint(), this.reconnectRetries(), this.apiKey(), this.logLevel());
474
- await sessionChannel.connect();
475
- capabilities['tvlabs:session_id'] = await sessionChannel.newSession(capabilities, this.retries());
476
- await sessionChannel.disconnect();
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;
@@ -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;IAStC,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;IAuCd,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,gBAAgB;IAgBxB,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"}
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;
@@ -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;CAClB,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
+ {"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;YAoBzD,gBAAgB;YAgBhB,WAAW;YA8BX,gBAAgB;YAehB,eAAe;YAWf,aAAa;IAW3B,OAAO,CAAC,cAAc;CAYvB"}
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.6";
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 { url, build_id } = await this.requestUploadUrl(metadata, appSlug);
345
- this.log.info('Uploading build...');
346
- await this.uploadToUrl(url, buildPath, metadata);
347
- const { application_id } = await this.extractBuildInfo();
348
- this.log.info(`Build "${application_id}" processed successfully`);
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-server', this._config.logLevel);
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
- if (!Array.isArray(param)) {
436
- throw new SevereServiceError('Multi-remote capabilities are not implemented. Contact TV Labs support if you are interested in this feature.');
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
- const buildPath = this.buildPath();
441
- if (buildPath) {
442
- const buildChannel = new BuildChannel(this.buildEndpoint(), this.reconnectRetries(), this.apiKey(), this.logLevel());
443
- await buildChannel.connect();
444
- capabilities['tvlabs:build'] = await buildChannel.uploadBuild(buildPath, this.appSlug());
445
- await buildChannel.disconnect();
446
- }
447
- const sessionChannel = new SessionChannel(this.sessionEndpoint(), this.reconnectRetries(), this.apiKey(), this.logLevel());
448
- await sessionChannel.connect();
449
- capabilities['tvlabs:session_id'] = await sessionChannel.newSession(capabilities, this.retries());
450
- await sessionChannel.disconnect();
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;
@@ -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;IAStC,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;IAuCd,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,gBAAgB;IAgBxB,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"}
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;
@@ -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;CAClB,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
+ {"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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tvlabs/wdio-service",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "WebdriverIO service that provides a better integration into TV Labs",
5
5
  "author": "Regan Karlewicz <regan@tvlabs.ai>",
6
6
  "license": "Apache-2.0",
@@ -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 { url, build_id } = await this.requestUploadUrl(metadata, appSlug);
66
+ const { existing, build_id, url } = await this.requestUploadUrl(
67
+ metadata,
68
+ appSlug,
69
+ );
67
70
 
68
- this.log.info('Uploading build...');
71
+ if (existing) {
72
+ this.log.info('Build is pre-existing, skipping upload');
73
+ } else {
74
+ this.log.info('Uploading build...');
69
75
 
70
- await this.uploadToUrl(url, buildPath, metadata);
76
+ await this.uploadToUrl(url, buildPath, metadata);
71
77
 
72
- const { application_id } = await this.extractBuildInfo();
78
+ const { application_id } = await this.extractBuildInfo();
73
79
 
74
- this.log.info(`Build "${application_id}" processed successfully`);
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-server', this._config.logLevel);
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
- if (!Array.isArray(param)) {
34
- throw new SevereServiceError(
35
- 'Multi-remote capabilities are not implemented. Contact TV Labs support if you are interested in this feature.',
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
- const buildPath = this.buildPath();
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
- if (buildPath) {
49
- const buildChannel = new BuildChannel(
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 buildChannel.connect();
82
+ await sessionChannel.connect();
57
83
 
58
- capabilities['tvlabs:build'] = await buildChannel.uploadBuild(
59
- buildPath,
60
- this.appSlug(),
84
+ capabilities['tvlabs:session_id'] = await sessionChannel.newSession(
85
+ capabilities,
86
+ this.retries(),
61
87
  );
62
88
 
63
- await buildChannel.disconnect();
64
- }
65
-
66
- const sessionChannel = new SessionChannel(
67
- this.sessionEndpoint(),
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
- await sessionChannel.disconnect();
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 = {