system-testing 1.0.77 → 1.0.79

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.
@@ -9,6 +9,10 @@ const shared = {
9
9
  systemTestBrowserHelper: null
10
10
  };
11
11
  export default class SystemTestBrowserHelper {
12
+ /** @returns {SystemTestBrowserHelper | null} */
13
+ static getCurrent() {
14
+ return shared.systemTestBrowserHelper;
15
+ }
12
16
  static current() {
13
17
  if (!shared.systemTestBrowserHelper) {
14
18
  throw new Error("No current SystemTestBrowserHelper set");
@@ -157,9 +161,7 @@ export default class SystemTestBrowserHelper {
157
161
  data.backtrace = backtrace;
158
162
  this.communicator.sendCommand(data);
159
163
  }
160
- /**
161
- * @returns {void}
162
- */
164
+ /** @returns {void} */
163
165
  connectWebSocket() {
164
166
  const host = this.getSystemTestHost();
165
167
  this.ws = new WebSocket(`ws://${host}:1985`);
@@ -168,9 +170,7 @@ export default class SystemTestBrowserHelper {
168
170
  this.ws.addEventListener("open", digg(this, "communicator", "onOpen"));
169
171
  this.ws.addEventListener("message", (event) => this.communicator.onMessage(event.data));
170
172
  }
171
- /**
172
- * @returns {string}
173
- */
173
+ /** @returns {string} */
174
174
  getSystemTestHost() {
175
175
  const location = globalThis.location;
176
176
  const defaultHost = location?.hostname || "localhost";
@@ -187,10 +187,11 @@ export default class SystemTestBrowserHelper {
187
187
  return "127.0.0.1";
188
188
  return resolvedHost;
189
189
  }
190
- /**
191
- * @returns {void}
192
- */
190
+ /** @returns {void} */
193
191
  enableOnBrowser() {
192
+ if (this._enabled) {
193
+ return;
194
+ }
194
195
  this._enabled = true;
195
196
  this.connectWebSocket();
196
197
  this.connectOnError();
@@ -267,9 +268,7 @@ export default class SystemTestBrowserHelper {
267
268
  onFirstInitialize(callback) {
268
269
  this._onFirstInitializeCallback = callback;
269
270
  }
270
- /**
271
- * @returns {void}
272
- */
271
+ /** @returns {void} */
273
272
  overrideConsoleLog() {
274
273
  if (this.originalConsoleError || this.originalConsoleLog) {
275
274
  throw new Error("Console methods has already been overridden!");
@@ -288,4 +287,4 @@ export default class SystemTestBrowserHelper {
288
287
  return await this.communicator.sendCommand({ type: "query", sql });
289
288
  }
290
289
  }
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLDZDQUE2QyxDQUFBO0FBQ2hFLE9BQU8sZUFBZSxNQUFNLG9FQUFvRSxDQUFBO0FBQ2hHLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUUxQyxPQUFPLHNCQUFzQixNQUFNLCtCQUErQixDQUFBO0FBRWxFLHdFQUF3RTtBQUN4RSxNQUFNLE1BQU0sR0FBRztJQUNiLHVCQUF1QixFQUFFLElBQUk7Q0FDOUIsQ0FBQTtBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sdUJBQXVCO0lBQzFDLE1BQU0sQ0FBQyxPQUFPO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtRQUMzRCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsdUJBQXVCLENBQUE7SUFDdkMsQ0FBQztJQUVEO1FBd0tBOzs7V0FHRztRQUNILHFCQUFnQixHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDLENBQUE7WUFFM0YsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtZQUMzQyxDQUFDO1FBQ0gsQ0FBQyxDQUFBO1FBRUQ7OztXQUdH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cy1jaGVja1xuXG5pbXBvcnQgQ2xpZW50IGZyb20gXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvY2xpZW50L2luZGV4LmpzXCJcbmltcG9ydCBDbGllbnRXZWJTb2NrZXQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvY29ubmVjdGlvbnMvd2ViLXNvY2tldC9pbmRleC5qc1wiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gXCJldmVudGVtaXR0ZXIzXCJcblxuaW1wb3J0IFN5c3RlbVRlc3RDb21tdW5pY2F0b3IgZnJvbSBcIi4vc3lzdGVtLXRlc3QtY29tbXVuaWNhdG9yLmpzXCJcblxuLyoqIEB0eXBlIHt7c3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IFN5c3RlbVRlc3RCcm93c2VySGVscGVyIHwgbnVsbH19ICovXG5jb25zdCBzaGFyZWQgPSB7XG4gIHN5c3RlbVRlc3RCcm93c2VySGVscGVyOiBudWxsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbVRlc3RCcm93c2VySGVscGVyIHtcbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgc2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7cGFyZW50OiB0aGlzLCBvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kfSlcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2VcbiAgICB0aGlzLl9oYXNJbml0aWFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAgIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IHRoaXNcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZ2V0U3lzdGVtVGVzdEhvc3QoKVxuICAgIHRoaXMuc2NvdW5kcmVsV3MgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7aG9zdH06ODA5MGApXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5zY291bmRyZWxDbGllbnRXZWJTb2NrZXQgPSBuZXcgQ2xpZW50V2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldC53YWl0Rm9yT3BlbmVkKClcblxuICAgIHRoaXMuc2NvdW5kcmVsQ2xpZW50ID0gbmV3IENsaWVudCh0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldCwge2VuYWJsZVNlcnZlckNvbnRyb2w6IHRydWV9KVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJzY291bmRyZWxTdGFydGVkXCIpXG4gIH1cblxuICB3YWl0Rm9yU2NvdW5kcmVsU3RhcnRlZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjb3VuZHJlbENsaWVudCkge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLm9uY2UoXCJzY291bmRyZWxTdGFydGVkXCIsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0U2NvdW5kcmVsKCkge1xuICAgIGlmICghdGhpcy5zY291bmRyZWxDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBjbGllbnQgaXMgbm90IHN0YXJ0ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2NvdW5kcmVsQ2xpZW50XG4gIH1cblxuICBjb25uZWN0T25FcnJvcigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3I6IGV2ZW50LmVycm9yLFxuICAgICAgICBlcnJvckNsYXNzOiBldmVudC5lcnJvcj8ubmFtZSxcbiAgICAgICAgZmlsZTogZXZlbnQuZmlsZW5hbWUsXG4gICAgICAgIGxpbmU6IGV2ZW50LmxpbmVubyxcbiAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29ubmVjdFVuaGFuZGxlZFJlamVjdGlvbigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICB0eXBlOiBcInVuaGFuZGxlZHJlamVjdGlvblwiLFxuICAgICAgICBlcnJvcjogZXZlbnQucmVhc29uLFxuICAgICAgICBlcnJvckNsYXNzOiBcIlVuaGFuZGxlZFJlamVjdGlvblwiLFxuICAgICAgICBtZXNzYWdlOiBldmVudC5yZWFzb24ubWVzc2FnZSB8fCBldmVudC5yZWFzb24gfHwgXCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2l0aG91dCBhIG1lc3NhZ2VcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5iYWNrdHJhY2VdXG4gICAqIEBwYXJhbSB7RXJyb3J9IFtkYXRhLmVycm9yXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuZXJyb3JDbGFzc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmZpbGVdXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5saW5lXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEubWVzc2FnZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLnR5cGVdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS51cmxdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlRXJyb3IoZGF0YSkge1xuICAgIGxldCBiYWNrdHJhY2VcblxuICAgIGlmIChkYXRhLmVycm9yICYmIGRhdGEuZXJyb3Iuc3RhY2spIHtcbiAgICAgIGJhY2t0cmFjZSA9IGRhdGEuZXJyb3Iuc3RhY2suc3BsaXQoXCJcXG5cIilcbiAgICAgIGJhY2t0cmFjZS5zaGlmdCgpXG4gICAgICBiYWNrdHJhY2UgPSBiYWNrdHJhY2Uuam9pbihcIlxcblwiKVxuICAgIH0gZWxzZSBpZiAoZGF0YS5maWxlKSB7XG4gICAgICBiYWNrdHJhY2UgPSBgJHtkYXRhLmZpbGV9OiR7ZGF0YS5saW5lfWBcbiAgICB9XG5cbiAgICBkYXRhLmJhY2t0cmFjZSA9IGJhY2t0cmFjZVxuXG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNvbm5lY3RXZWJTb2NrZXQoKSB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZ2V0U3lzdGVtVGVzdEhvc3QoKVxuICAgIHRoaXMud3MgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7aG9zdH06MTk4NWApXG4gICAgdGhpcy5jb21tdW5pY2F0b3Iud3MgPSB0aGlzLndzXG4gICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgZGlnZyh0aGlzLCBcImNvbW11bmljYXRvclwiLCBcIm9uRXJyb3JcIikpXG4gICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCBkaWdnKHRoaXMsIFwiY29tbXVuaWNhdG9yXCIsIFwib25PcGVuXCIpKVxuICAgIHRoaXMud3MuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGV2ZW50KSA9PiB0aGlzLmNvbW11bmljYXRvci5vbk1lc3NhZ2UoZXZlbnQuZGF0YSkpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFN5c3RlbVRlc3RIb3N0KCkge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZ2xvYmFsVGhpcy5sb2NhdGlvblxuICAgIGNvbnN0IGRlZmF1bHRIb3N0ID0gbG9jYXRpb24/Lmhvc3RuYW1lIHx8IFwibG9jYWxob3N0XCJcbiAgICBjb25zdCBzZWFyY2ggPSBsb2NhdGlvbj8uc2VhcmNoXG4gICAgY29uc3QgZW52SG9zdCA9IHByb2Nlc3MuZW52LkVYUE9fUFVCTElDX1NZU1RFTV9URVNUX0hPU1RcblxuICAgIGlmIChlbnZIb3N0KSByZXR1cm4gZW52SG9zdFxuXG4gICAgaWYgKCFzZWFyY2gpIHJldHVybiBkZWZhdWx0SG9zdFxuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhzZWFyY2gpXG4gICAgY29uc3QgaG9zdCA9IHBhcmFtcy5nZXQoXCJzeXN0ZW1UZXN0SG9zdFwiKVxuXG4gICAgY29uc3QgcmVzb2x2ZWRIb3N0ID0gaG9zdCB8fCBkZWZhdWx0SG9zdFxuXG4gICAgaWYgKHJlc29sdmVkSG9zdCA9PT0gXCIwLjAuMC4wXCIpIHJldHVybiBcIjEyNy4wLjAuMVwiXG5cbiAgICByZXR1cm4gcmVzb2x2ZWRIb3N0XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbmFibGVPbkJyb3dzZXIoKSB7XG4gICAgdGhpcy5fZW5hYmxlZCA9IHRydWVcbiAgICB0aGlzLmNvbm5lY3RXZWJTb2NrZXQoKVxuICAgIHRoaXMuY29ubmVjdE9uRXJyb3IoKVxuICAgIHRoaXMuY29ubmVjdFVuaGFuZGxlZFJlamVjdGlvbigpXG4gICAgdGhpcy5vdmVycmlkZUNvbnNvbGVMb2coKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBnZXRFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fZW5hYmxlZCB9XG5cbiAgLyoqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9ICovXG4gIGdldEV2ZW50cygpIHsgcmV0dXJuIHRoaXMuZXZlbnRzIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBjb21tYW5kIGV2ZW50IGFuZCB0aHJvd3Mgd2hlbiBubyBsaXN0ZW5lciBoYW5kbGVkIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7e3BhdGg6IHN0cmluZ319IHBheWxvYWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbWl0Q29tbWFuZEV2ZW50KGV2ZW50TmFtZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGRpZEVtaXQgPSB0aGlzLmV2ZW50cy5lbWl0KGV2ZW50TmFtZSwgcGF5bG9hZClcblxuICAgIGlmICghZGlkRW1pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciBjb21tYW5kIGV2ZW50OiAke2V2ZW50TmFtZX0gKCR7cGF5bG9hZC5wYXRofSlgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZmFrZUNvbnNvbGVFcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoe3R5cGU6IFwiY29uc29sZS5lcnJvclwiLCB2YWx1ZTogdGhpcy5jb25zb2xlTG9nTWVzc2FnZShhcmdzKX0pXG5cbiAgICBpZiAodGhpcy5vcmlnaW5hbENvbnNvbGVFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxDb25zb2xlRXJyb3IoLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZha2VDb25zb2xlTG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICB0aGlzLmNvbW11bmljYXRvci5zZW5kQ29tbWFuZCh7dHlwZTogXCJjb25zb2xlLmxvZ1wiLCB2YWx1ZTogdGhpcy5jb25zb2xlTG9nTWVzc2FnZShhcmdzKX0pXG5cbiAgICBpZiAodGhpcy5vcmlnaW5hbENvbnNvbGVMb2cpIHtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gYXJnXG4gICAqIEBwYXJhbSB7YW55W119IFtzY2FubmVkT2JqZWN0c11cbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGNvbnNvbGVMb2dNZXNzYWdlKGFyZywgc2Nhbm5lZE9iamVjdHMgPSBbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIGlmIChzY2FubmVkT2JqZWN0cy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHJldHVybiBcIltyZWN1cnNpdmVdXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjYW5uZWRPYmplY3RzLnB1c2goYXJnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFyZykge1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNvbnNvbGVMb2dNZXNzYWdlKHZhbHVlLCBzY2FubmVkT2JqZWN0cykpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgaWYgKHNjYW5uZWRPYmplY3RzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgcmV0dXJuIFwiW3JlY3Vyc2l2ZV1cIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Nhbm5lZE9iamVjdHMucHVzaChhcmcpXG4gICAgICB9XG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGFyZykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJnW2tleV0sIHNjYW5uZWRPYmplY3RzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBgW29iamVjdCAke2FyZz8uY29uc3RydWN0b3I/Lm5hbWV9XWBcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFyZ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3tkYXRhOiB7cGF0aDogc3RyaW5nLCB0eXBlOiBzdHJpbmd9fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7cmVzdWx0OiBzdHJpbmd9IHwgdm9pZD59XG4gICAqL1xuICBvbkNvbW1hbmQgPSBhc3luYyAoe2RhdGF9KSA9PiB7XG4gICAgaWYgKGRhdGEudHlwZSA9PSBcImluaXRpYWxpemVcIikge1xuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImluaXRpYWxpemVcIilcblxuICAgICAgaWYgKCF0aGlzLl9oYXNJbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLl9oYXNJbml0aWFsaXplZCA9IHRydWVcblxuICAgICAgICBpZiAodGhpcy5fb25GaXJzdEluaXRpYWxpemVDYWxsYmFjaykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX29uRmlyc3RJbml0aWFsaXplQ2FsbGJhY2soKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9vbkluaXRpYWxpemVDYWxsYmFjaykge1xuICAgICAgICBhd2FpdCB0aGlzLl9vbkluaXRpYWxpemVDYWxsYmFjaygpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7cmVzdWx0OiBcImluaXRpYWxpemVkXCJ9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJ3YWl0Rm9yU2NvdW5kcmVsXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvclNjb3VuZHJlbFN0YXJ0ZWQoKVxuICAgICAgcmV0dXJuIHtyZXN1bHQ6IFwic2NvdW5kcmVsLXJlYWR5XCJ9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJ2aXNpdFwiKSB7XG4gICAgICB0aGlzLmVtaXRDb21tYW5kRXZlbnQoXCJuYXZpZ2F0ZVwiLCB7cGF0aDogZGF0YS5wYXRofSlcbiAgICAgIHJldHVybiB7cmVzdWx0OiBcInZpc2l0ZWRcIn1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcImRpc21pc3NUb1wiKSB7XG4gICAgICB0aGlzLmVtaXRDb21tYW5kRXZlbnQoXCJkaXNtaXNzVG9cIiwge3BhdGg6IGRhdGEucGF0aH0pXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJkaXNtaXNzZWRcIn1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQgdHlwZSBmb3IgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6ICR7ZGF0YS50eXBlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25Jbml0aWFsaXplKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2sgPSBjYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25GaXJzdEluaXRpYWxpemUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkZpcnN0SW5pdGlhbGl6ZUNhbGxiYWNrID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG92ZXJyaWRlQ29uc29sZUxvZygpIHtcbiAgICBpZiAodGhpcy5vcmlnaW5hbENvbnNvbGVFcnJvciB8fCB0aGlzLm9yaWdpbmFsQ29uc29sZUxvZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uc29sZSBtZXRob2RzIGhhcyBhbHJlYWR5IGJlZW4gb3ZlcnJpZGRlbiFcIilcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvclxuICAgIHRoaXMub3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2dcblxuICAgIGNvbnNvbGUuZXJyb3IgPSB0aGlzLmZha2VDb25zb2xlRXJyb3JcbiAgICBjb25zb2xlLmxvZyA9IHRoaXMuZmFrZUNvbnNvbGVMb2dcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn1cbiAgICovXG4gIGFzeW5jIHNlbmRRdWVyeShzcWwpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKHt0eXBlOiBcInF1ZXJ5XCIsIHNxbH0pXG4gIH1cbn1cbiJdfQ==
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLDZDQUE2QyxDQUFBO0FBQ2hFLE9BQU8sZUFBZSxNQUFNLG9FQUFvRSxDQUFBO0FBQ2hHLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUUxQyxPQUFPLHNCQUFzQixNQUFNLCtCQUErQixDQUFBO0FBRWxFLHdFQUF3RTtBQUN4RSxNQUFNLE1BQU0sR0FBRztJQUNiLHVCQUF1QixFQUFFLElBQUk7Q0FDOUIsQ0FBQTtBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sdUJBQXVCO0lBQzFDLGdEQUFnRDtJQUNoRCxNQUFNLENBQUMsVUFBVTtRQUNmLE9BQU8sTUFBTSxDQUFDLHVCQUF1QixDQUFBO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBTztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFDM0QsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLHVCQUF1QixDQUFBO0lBQ3ZDLENBQUM7SUFFRDtRQXNLQTs7O1dBR0c7UUFDSCxxQkFBZ0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxDQUFBO1lBRTNGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzlCLE9BQU8sSUFB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LG1CQUFtQjtRQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUE7SUFDbEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDbGllbnQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvaW5kZXguanNcIlxuaW1wb3J0IENsaWVudFdlYlNvY2tldCBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL2NsaWVudC9jb25uZWN0aW9ucy93ZWItc29ja2V0L2luZGV4LmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIlxuXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuXG4vKiogQHR5cGUge3tzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcjogU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgfCBudWxsfX0gKi9cbmNvbnN0IHNoYXJlZCA9IHtcbiAgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IG51bGxcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIge1xuICAvKiogQHJldHVybnMge1N5c3RlbVRlc3RCcm93c2VySGVscGVyIHwgbnVsbH0gKi9cbiAgc3RhdGljIGdldEN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgc2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7cGFyZW50OiB0aGlzLCBvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kfSlcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2VcbiAgICB0aGlzLl9oYXNJbml0aWFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAgIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IHRoaXNcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZ2V0U3lzdGVtVGVzdEhvc3QoKVxuICAgIHRoaXMuc2NvdW5kcmVsV3MgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7aG9zdH06ODA5MGApXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5zY291bmRyZWxDbGllbnRXZWJTb2NrZXQgPSBuZXcgQ2xpZW50V2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldC53YWl0Rm9yT3BlbmVkKClcblxuICAgIHRoaXMuc2NvdW5kcmVsQ2xpZW50ID0gbmV3IENsaWVudCh0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldCwge2VuYWJsZVNlcnZlckNvbnRyb2w6IHRydWV9KVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJzY291bmRyZWxTdGFydGVkXCIpXG4gIH1cblxuICB3YWl0Rm9yU2NvdW5kcmVsU3RhcnRlZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjb3VuZHJlbENsaWVudCkge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLm9uY2UoXCJzY291bmRyZWxTdGFydGVkXCIsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0U2NvdW5kcmVsKCkge1xuICAgIGlmICghdGhpcy5zY291bmRyZWxDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBjbGllbnQgaXMgbm90IHN0YXJ0ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2NvdW5kcmVsQ2xpZW50XG4gIH1cblxuICBjb25uZWN0T25FcnJvcigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3I6IGV2ZW50LmVycm9yLFxuICAgICAgICBlcnJvckNsYXNzOiBldmVudC5lcnJvcj8ubmFtZSxcbiAgICAgICAgZmlsZTogZXZlbnQuZmlsZW5hbWUsXG4gICAgICAgIGxpbmU6IGV2ZW50LmxpbmVubyxcbiAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29ubmVjdFVuaGFuZGxlZFJlamVjdGlvbigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICB0eXBlOiBcInVuaGFuZGxlZHJlamVjdGlvblwiLFxuICAgICAgICBlcnJvcjogZXZlbnQucmVhc29uLFxuICAgICAgICBlcnJvckNsYXNzOiBcIlVuaGFuZGxlZFJlamVjdGlvblwiLFxuICAgICAgICBtZXNzYWdlOiBldmVudC5yZWFzb24ubWVzc2FnZSB8fCBldmVudC5yZWFzb24gfHwgXCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2l0aG91dCBhIG1lc3NhZ2VcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5iYWNrdHJhY2VdXG4gICAqIEBwYXJhbSB7RXJyb3J9IFtkYXRhLmVycm9yXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuZXJyb3JDbGFzc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmZpbGVdXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5saW5lXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEubWVzc2FnZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLnR5cGVdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS51cmxdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlRXJyb3IoZGF0YSkge1xuICAgIGxldCBiYWNrdHJhY2VcblxuICAgIGlmIChkYXRhLmVycm9yICYmIGRhdGEuZXJyb3Iuc3RhY2spIHtcbiAgICAgIGJhY2t0cmFjZSA9IGRhdGEuZXJyb3Iuc3RhY2suc3BsaXQoXCJcXG5cIilcbiAgICAgIGJhY2t0cmFjZS5zaGlmdCgpXG4gICAgICBiYWNrdHJhY2UgPSBiYWNrdHJhY2Uuam9pbihcIlxcblwiKVxuICAgIH0gZWxzZSBpZiAoZGF0YS5maWxlKSB7XG4gICAgICBiYWNrdHJhY2UgPSBgJHtkYXRhLmZpbGV9OiR7ZGF0YS5saW5lfWBcbiAgICB9XG5cbiAgICBkYXRhLmJhY2t0cmFjZSA9IGJhY2t0cmFjZVxuXG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoZGF0YSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY29ubmVjdFdlYlNvY2tldCgpIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5nZXRTeXN0ZW1UZXN0SG9zdCgpXG4gICAgdGhpcy53cyA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHtob3N0fToxOTg1YClcbiAgICB0aGlzLmNvbW11bmljYXRvci53cyA9IHRoaXMud3NcbiAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBkaWdnKHRoaXMsIFwiY29tbXVuaWNhdG9yXCIsIFwib25FcnJvclwiKSlcbiAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk9wZW5cIikpXG4gICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZXZlbnQpID0+IHRoaXMuY29tbXVuaWNhdG9yLm9uTWVzc2FnZShldmVudC5kYXRhKSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRTeXN0ZW1UZXN0SG9zdCgpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGdsb2JhbFRoaXMubG9jYXRpb25cbiAgICBjb25zdCBkZWZhdWx0SG9zdCA9IGxvY2F0aW9uPy5ob3N0bmFtZSB8fCBcImxvY2FsaG9zdFwiXG4gICAgY29uc3Qgc2VhcmNoID0gbG9jYXRpb24/LnNlYXJjaFxuICAgIGNvbnN0IGVudkhvc3QgPSBwcm9jZXNzLmVudi5FWFBPX1BVQkxJQ19TWVNURU1fVEVTVF9IT1NUXG5cbiAgICBpZiAoZW52SG9zdCkgcmV0dXJuIGVudkhvc3RcblxuICAgIGlmICghc2VhcmNoKSByZXR1cm4gZGVmYXVsdEhvc3RcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKVxuICAgIGNvbnN0IGhvc3QgPSBwYXJhbXMuZ2V0KFwic3lzdGVtVGVzdEhvc3RcIilcblxuICAgIGNvbnN0IHJlc29sdmVkSG9zdCA9IGhvc3QgfHwgZGVmYXVsdEhvc3RcblxuICAgIGlmIChyZXNvbHZlZEhvc3QgPT09IFwiMC4wLjAuMFwiKSByZXR1cm4gXCIxMjcuMC4wLjFcIlxuXG4gICAgcmV0dXJuIHJlc29sdmVkSG9zdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBlbmFibGVPbkJyb3dzZXIoKSB7XG4gICAgaWYgKHRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlXG4gICAgdGhpcy5jb25uZWN0V2ViU29ja2V0KClcbiAgICB0aGlzLmNvbm5lY3RPbkVycm9yKClcbiAgICB0aGlzLmNvbm5lY3RVbmhhbmRsZWRSZWplY3Rpb24oKVxuICAgIHRoaXMub3ZlcnJpZGVDb25zb2xlTG9nKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgZ2V0RW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2VuYWJsZWQgfVxuXG4gIC8qKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSAqL1xuICBnZXRFdmVudHMoKSB7IHJldHVybiB0aGlzLmV2ZW50cyB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgY29tbWFuZCBldmVudCBhbmQgdGhyb3dzIHdoZW4gbm8gbGlzdGVuZXIgaGFuZGxlZCBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3twYXRoOiBzdHJpbmd9fSBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdENvbW1hbmRFdmVudChldmVudE5hbWUsIHBheWxvYWQpIHtcbiAgICBjb25zdCBkaWRFbWl0ID0gdGhpcy5ldmVudHMuZW1pdChldmVudE5hbWUsIHBheWxvYWQpXG5cbiAgICBpZiAoIWRpZEVtaXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgY29tbWFuZCBldmVudDogJHtldmVudE5hbWV9ICgke3BheWxvYWQucGF0aH0pYClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZha2VDb25zb2xlRXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKHt0eXBlOiBcImNvbnNvbGUuZXJyb3JcIiwgdmFsdWU6IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJncyl9KVxuXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yKC4uLmFyZ3MpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmYWtlQ29uc29sZUxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoe3R5cGU6IFwiY29uc29sZS5sb2dcIiwgdmFsdWU6IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJncyl9KVxuXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlTG9nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbENvbnNvbGVMb2coLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGFyZ1xuICAgKiBAcGFyYW0ge2FueVtdfSBbc2Nhbm5lZE9iamVjdHNdXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBjb25zb2xlTG9nTWVzc2FnZShhcmcsIHNjYW5uZWRPYmplY3RzID0gW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICBpZiAoc2Nhbm5lZE9iamVjdHMuaW5jbHVkZXMoYXJnKSkge1xuICAgICAgICByZXR1cm4gXCJbcmVjdXJzaXZlXVwiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2FubmVkT2JqZWN0cy5wdXNoKGFyZylcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jb25zb2xlTG9nTWVzc2FnZSh2YWx1ZSwgc2Nhbm5lZE9iamVjdHMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIGlmIChzY2FubmVkT2JqZWN0cy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHJldHVybiBcIltyZWN1cnNpdmVdXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjYW5uZWRPYmplY3RzLnB1c2goYXJnKVxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNvbnNvbGVMb2dNZXNzYWdlKGFyZ1trZXldLCBzY2FubmVkT2JqZWN0cylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gYFtvYmplY3QgJHthcmc/LmNvbnN0cnVjdG9yPy5uYW1lfV1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhcmdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGF0YToge3BhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nfX19IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8e3Jlc3VsdDogc3RyaW5nfSB8IHZvaWQ+fVxuICAgKi9cbiAgb25Db21tYW5kID0gYXN5bmMgKHtkYXRhfSkgPT4ge1xuICAgIGlmIChkYXRhLnR5cGUgPT0gXCJpbml0aWFsaXplXCIpIHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJpbml0aWFsaXplXCIpXG5cbiAgICAgIGlmICghdGhpcy5faGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhpcy5faGFzSW5pdGlhbGl6ZWQgPSB0cnVlXG5cbiAgICAgICAgaWYgKHRoaXMuX29uRmlyc3RJbml0aWFsaXplQ2FsbGJhY2spIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9vbkZpcnN0SW5pdGlhbGl6ZUNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2spIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2soKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJpbml0aWFsaXplZFwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwid2FpdEZvclNjb3VuZHJlbFwiKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JTY291bmRyZWxTdGFydGVkKClcbiAgICAgIHJldHVybiB7cmVzdWx0OiBcInNjb3VuZHJlbC1yZWFkeVwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwidmlzaXRcIikge1xuICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KFwibmF2aWdhdGVcIiwge3BhdGg6IGRhdGEucGF0aH0pXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJ2aXNpdGVkXCJ9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJkaXNtaXNzVG9cIikge1xuICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KFwiZGlzbWlzc1RvXCIsIHtwYXRoOiBkYXRhLnBhdGh9KVxuICAgICAgcmV0dXJuIHtyZXN1bHQ6IFwiZGlzbWlzc2VkXCJ9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kIHR5cGUgZm9yIFN5c3RlbVRlc3RCcm93c2VySGVscGVyOiAke2RhdGEudHlwZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uSW5pdGlhbGl6ZShjYWxsYmFjaykge1xuICAgIHRoaXMuX29uSW5pdGlhbGl6ZUNhbGxiYWNrID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uRmlyc3RJbml0aWFsaXplKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25GaXJzdEluaXRpYWxpemVDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG92ZXJyaWRlQ29uc29sZUxvZygpIHtcbiAgICBpZiAodGhpcy5vcmlnaW5hbENvbnNvbGVFcnJvciB8fCB0aGlzLm9yaWdpbmFsQ29uc29sZUxvZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29uc29sZSBtZXRob2RzIGhhcyBhbHJlYWR5IGJlZW4gb3ZlcnJpZGRlbiFcIilcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvclxuICAgIHRoaXMub3JpZ2luYWxDb25zb2xlTG9nID0gY29uc29sZS5sb2dcblxuICAgIGNvbnNvbGUuZXJyb3IgPSB0aGlzLmZha2VDb25zb2xlRXJyb3JcbiAgICBjb25zb2xlLmxvZyA9IHRoaXMuZmFrZUNvbnNvbGVMb2dcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3FsXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pn1cbiAgICovXG4gIGFzeW5jIHNlbmRRdWVyeShzcWwpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKHt0eXBlOiBcInF1ZXJ5XCIsIHNxbH0pXG4gIH1cbn1cbiJdfQ==
@@ -18,7 +18,7 @@
18
18
  /**
19
19
  * @typedef {object} FindArgs
20
20
  * @property {number} [timeout] Override timeout for lookup.
21
- * @property {boolean} [visible] Whether to require elements to be visible.
21
+ * @property {boolean | null} [visible] Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
22
22
  * @property {boolean} [useBaseSelector] Whether to scope by the base selector.
23
23
  */
24
24
  /**
@@ -29,7 +29,7 @@
29
29
  * @typedef {object} NotificationMessageArgs
30
30
  * @property {boolean} [dismiss] Whether to dismiss the notification after it appears.
31
31
  */
32
- export default class SystemTest {
32
+ export default class SystemTest extends Browser {
33
33
  static rootPath: string;
34
34
  /**
35
35
  * Gets the current system test instance
@@ -57,21 +57,11 @@ export default class SystemTest {
57
57
  * @param {SystemTestArgs} [args]
58
58
  */
59
59
  constructor({ host, port, httpHost, httpPort, httpConnectHost, debug, errorFilter, urlArgs, driver, ...restArgs }?: SystemTestArgs);
60
- /** @type {SystemTestCommunicator | undefined} */
61
- communicator: SystemTestCommunicator | undefined;
62
- /** @type {import("selenium-webdriver").WebDriver | undefined} */
63
- driver: import("selenium-webdriver").WebDriver | undefined;
64
- /** @type {import("./drivers/webdriver-driver.js").default | undefined} */
65
- driverAdapter: import("./drivers/webdriver-driver.js").default | undefined;
66
60
  _started: boolean;
67
- /** @type {SystemTestDriverConfig | undefined} */
68
- _driverConfig: SystemTestDriverConfig | undefined;
69
61
  _httpHost: string;
70
62
  _httpPort: number;
71
63
  /** @type {(error: any) => boolean | undefined} */
72
64
  _errorFilter: (error: any) => boolean | undefined;
73
- /** @type {Error | undefined} */
74
- _httpServerError: Error | undefined;
75
65
  /** @type {WebSocketServer | undefined} */
76
66
  scoundrelWss: WebSocketServer | undefined;
77
67
  /** @type {WebSocketServer | undefined} */
@@ -99,57 +89,11 @@ export default class SystemTest {
99
89
  _host: string;
100
90
  _port: number;
101
91
  _httpConnectHost: string;
102
- _debug: boolean;
103
92
  _urlArgs: Record<string, any>;
104
93
  _rootPath: string;
105
94
  /** @type {Record<number, object>} */
106
95
  _responses: Record<number, object>;
107
96
  _sendCount: number;
108
- /**
109
- * Gets the base selector for scoping element searches
110
- * @returns {string | undefined}
111
- */
112
- getBaseSelector(): string | undefined;
113
- /** @returns {import("selenium-webdriver").WebDriver} */
114
- getDriver(): import("selenium-webdriver").WebDriver;
115
- /** @returns {import("./drivers/webdriver-driver.js").default} */
116
- getDriverAdapter(): import("./drivers/webdriver-driver.js").default;
117
- /**
118
- * @param {SystemTestDriverConfig} [driverConfig]
119
- * @returns {import("./drivers/webdriver-driver.js").default}
120
- */
121
- createDriver(driverConfig?: SystemTestDriverConfig): import("./drivers/webdriver-driver.js").default;
122
- /**
123
- * Sets the base selector for scoping element searches
124
- * @param {string} baseSelector
125
- */
126
- setBaseSelector(baseSelector: string): void;
127
- _baseSelector: string;
128
- /**
129
- * Gets a selector scoped to the base selector
130
- * @param {string} selector
131
- * @returns {string}
132
- */
133
- getSelector(selector: string): string;
134
- /**
135
- * Logs messages
136
- * @param {any[]} args
137
- * @returns {void}
138
- */
139
- debugError(...args: any[]): void;
140
- /**
141
- * Logs messages when debugging is enabled
142
- * @param {any[]} args
143
- * @returns {void}
144
- */
145
- debugLog(...args: any[]): void;
146
- /** @returns {void} */
147
- throwIfHttpServerError(): void;
148
- /**
149
- * @param {Error} error
150
- * @returns {void}
151
- */
152
- onHttpServerError: (error: Error) => void;
153
97
  /**
154
98
  * Starts Scoundrel server which the browser connects to for remote evaluation in the browser
155
99
  * @returns {void}
@@ -167,79 +111,6 @@ export default class SystemTest {
167
111
  * @returns {Promise<import("scoundrel-remote-eval/build/client/index.js").default>}
168
112
  */
169
113
  getScoundrelClient(timeoutMs?: number): Promise<import("scoundrel-remote-eval/build/client/index.js").default>;
170
- /**
171
- * Finds all elements by CSS selector
172
- * @param {string} selector
173
- * @param {FindArgs} [args]
174
- * @returns {Promise<import("selenium-webdriver").WebElement[]>}
175
- */
176
- all(selector: string, args?: FindArgs): Promise<import("selenium-webdriver").WebElement[]>;
177
- /**
178
- * Clicks an element that has children which fills out the element and would otherwise have caused a ElementClickInterceptedError
179
- * @param {string|import("selenium-webdriver").WebElement} elementOrIdentifier
180
- * @returns {Promise<void>}
181
- */
182
- /**
183
- * Clicks an element, allowing selector args when using a CSS selector.
184
- * @param {string|import("selenium-webdriver").WebElement} elementOrIdentifier
185
- * @param {FindArgs} [args]
186
- * @returns {Promise<void>}
187
- */
188
- click(elementOrIdentifier: string | import("selenium-webdriver").WebElement, args?: FindArgs): Promise<void>;
189
- /**
190
- * Finds a single element by CSS selector
191
- * @param {string} selector
192
- * @param {FindArgs} [args]
193
- * @returns {Promise<import("selenium-webdriver").WebElement>}
194
- */
195
- find(selector: string, args?: FindArgs): Promise<import("selenium-webdriver").WebElement>;
196
- /**
197
- * Finds a single element by test ID
198
- * @param {string} testID
199
- * @param {FindArgs} [args]
200
- * @returns {Promise<import("selenium-webdriver").WebElement>}
201
- */
202
- findByTestID(testID: string, args?: FindArgs): Promise<import("selenium-webdriver").WebElement>;
203
- /**
204
- * Finds a single element by CSS selector without waiting
205
- * @param {string} selector
206
- * @param {FindArgs} [args]
207
- * @returns {Promise<import("selenium-webdriver").WebElement>}
208
- */
209
- findNoWait(selector: string, args?: FindArgs): Promise<import("selenium-webdriver").WebElement>;
210
- /**
211
- * Gets browser logs
212
- * @returns {Promise<string[]>}
213
- */
214
- getBrowserLogs(): Promise<string[]>;
215
- /** @returns {Promise<string>} */
216
- getCurrentUrl(): Promise<string>;
217
- /** @returns {number} */
218
- getTimeouts(): number;
219
- /**
220
- * Interacts with an element by calling a method on it with the given arguments.
221
- * Retrying on ElementNotInteractableError, ElementClickInterceptedError, or StaleElementReferenceError.
222
- * @param {import("selenium-webdriver").WebElement|string|{selector: string} & FindArgs} elementOrIdentifier The element or a CSS selector to find the element.
223
- * @param {string} methodName The method name to call on the element.
224
- * @param {...any} args Arguments to pass to the method.
225
- * @returns {Promise<any>}
226
- */
227
- interact(elementOrIdentifier: import("selenium-webdriver").WebElement | string | ({
228
- selector: string;
229
- } & FindArgs), methodName: string, ...args: any[]): Promise<any>;
230
- /**
231
- * Expects no element to be found by CSS selector
232
- * @param {string} selector
233
- * @param {FindArgs} [args]
234
- * @returns {Promise<void>}
235
- */
236
- expectNoElement(selector: string, args?: FindArgs): Promise<void>;
237
- /**
238
- * @param {string} selector
239
- * @param {WaitForNoSelectorArgs} [args]
240
- * @returns {Promise<void>}
241
- */
242
- waitForNoSelector(selector: string, args?: WaitForNoSelectorArgs): Promise<void>;
243
114
  /**
244
115
  * Gets notification messages
245
116
  * @returns {Promise<string[]>}
@@ -259,11 +130,6 @@ export default class SystemTest {
259
130
  * @returns {boolean}
260
131
  */
261
132
  isStarted(): boolean;
262
- /**
263
- * Gets the HTML of the current page
264
- * @returns {Promise<string>}
265
- */
266
- getHTML(): Promise<string>;
267
133
  /**
268
134
  * Starts the system test
269
135
  * @returns {Promise<void>}
@@ -279,23 +145,6 @@ export default class SystemTest {
279
145
  * @returns {string}
280
146
  */
281
147
  buildRootPath(): string;
282
- /**
283
- * Restores previously set timeouts
284
- * @returns {Promise<void>}
285
- */
286
- restoreTimeouts(): Promise<void>;
287
- /**
288
- * Sets driver timeouts
289
- * @param {number} newTimeout
290
- * @returns {Promise<void>}
291
- */
292
- driverSetTimeouts(newTimeout: number): Promise<void>;
293
- /**
294
- * Sets timeouts and stores the previous timeouts
295
- * @param {number} newTimeout
296
- * @returns {Promise<void>}
297
- */
298
- setTimeouts(newTimeout: number): Promise<void>;
299
148
  /**
300
149
  * Waits for the client web socket to connect
301
150
  * @returns {Promise<void>}
@@ -364,42 +213,6 @@ export default class SystemTest {
364
213
  * @returns {Promise<void>}
365
214
  */
366
215
  reinitialize(): Promise<void>;
367
- /**
368
- * Visits a path in the browser
369
- * @param {string} path
370
- * @returns {Promise<void>}
371
- */
372
- driverVisit(path: string): Promise<void>;
373
- /**
374
- * Formats browser logs for console output and truncates overly long output.
375
- * @param {string[]} logs
376
- * @param {number} [maxLines]
377
- * @returns {string[]}
378
- */
379
- formatBrowserLogsForConsole(logs: string[], maxLines?: number): string[];
380
- /**
381
- * Prints browser logs to stdout for CI visibility when tests fail.
382
- * @param {string[]} logs
383
- * @returns {void}
384
- */
385
- printBrowserLogsForFailure(logs: string[]): void;
386
- /**
387
- * Takes a screenshot, saves HTML and browser logs
388
- * @returns {Promise<void>}
389
- */
390
- takeScreenshot(): Promise<void>;
391
- /**
392
- * Visits a path in the browser
393
- * @param {string} path
394
- * @returns {Promise<void>}
395
- */
396
- visit(path: string): Promise<void>;
397
- /**
398
- * Dismisses to a path in the browser
399
- * @param {string} path
400
- * @returns {Promise<void>}
401
- */
402
- dismissTo(path: string): Promise<void>;
403
216
  /**
404
217
  * @param {WebSocketServer | undefined} wss
405
218
  * @param {string} [label]
@@ -461,9 +274,9 @@ export type FindArgs = {
461
274
  */
462
275
  timeout?: number;
463
276
  /**
464
- * Whether to require elements to be visible.
277
+ * Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
465
278
  */
466
- visible?: boolean;
279
+ visible?: boolean | null;
467
280
  /**
468
281
  * Whether to scope by the base selector.
469
282
  */
@@ -481,8 +294,9 @@ export type NotificationMessageArgs = {
481
294
  */
482
295
  dismiss?: boolean;
483
296
  };
484
- import SystemTestCommunicator from "./system-test-communicator.js";
297
+ import Browser from "./browser.js";
485
298
  import { WebSocketServer } from "ws";
299
+ import SystemTestCommunicator from "./system-test-communicator.js";
486
300
  import ServerWebSocket from "scoundrel-remote-eval/build/server/connections/web-socket/index.js";
487
301
  import Server from "scoundrel-remote-eval/build/server/index.js";
488
302
  import SystemTestHttpServer from "./system-test-http-server.js";