system-testing 1.0.103 → 1.0.105

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
@@ -449,6 +449,14 @@ await systemTest.reinitialize()
449
449
 
450
450
  This tears down the browser, servers, and sockets, then starts them again so subsequent steps run against a fresh app instance.
451
451
 
452
+ `SystemTest.run(...)` does this automatically after a failed callback or teardown by default. Disable it only for tests that intentionally inspect the broken session after failure:
453
+
454
+ ```js
455
+ await SystemTest.run({reinitializeAfterFailure: false}, async (systemTest) => {
456
+ await systemTest.findByTestID("brokenState")
457
+ })
458
+ ```
459
+
452
460
  ## Dummy Expo app
453
461
 
454
462
  A ready-to-run Expo Router dummy app that uses `system-testing` lives in `spec/dummy`.
@@ -1,3 +1,20 @@
1
+ /**
2
+ * Parse a cookie boolean attribute coming in over the JSON command transport.
3
+ * The transport carries booleans either as native `true`/`false` or as the
4
+ * string forms `"true"`/`"false"`. Anything else is rejected so a typo like
5
+ * `--cookie-secure=TRUE` or `--cookie-secure=1` fails loudly instead of
6
+ * silently producing an insecure cookie.
7
+ * @param {string} fieldName
8
+ * @param {unknown} rawValue
9
+ * @returns {boolean}
10
+ */
11
+ function parseCookieBoolean(fieldName, rawValue) {
12
+ if (rawValue === true || rawValue === "true")
13
+ return true;
14
+ if (rawValue === false || rawValue === "false")
15
+ return false;
16
+ throw new Error(`addCookie ${fieldName} must be true or false, got ${JSON.stringify(rawValue)}`);
17
+ }
1
18
  /** Runs browser commands across CLI and WebSocket transports. */
2
19
  export default class BrowserCommandRunner {
3
20
  /**
@@ -144,6 +161,41 @@ export default class BrowserCommandRunner {
144
161
  await this.browser.expectNoElement(commandArgs.selector, this.normalizeFindArgs(commandArgs));
145
162
  return { ok: true };
146
163
  }
164
+ if (command === "executeScript") {
165
+ const script = commandArgs.script;
166
+ if (typeof script !== "string" || script.length === 0) {
167
+ throw new Error("executeScript requires script");
168
+ }
169
+ const scriptArgs = Array.isArray(commandArgs.args) ? commandArgs.args : [];
170
+ const result = await this.browser.executeScript(script, ...scriptArgs);
171
+ return { result };
172
+ }
173
+ if (command === "addCookie") {
174
+ const name = commandArgs.name;
175
+ if (typeof name !== "string" || name.length === 0) {
176
+ throw new Error("addCookie requires name");
177
+ }
178
+ const value = commandArgs.value;
179
+ if (typeof value !== "string") {
180
+ throw new Error("addCookie requires string value");
181
+ }
182
+ /** @type {{name: string, value: string, domain?: string, path?: string, secure?: boolean, httpOnly?: boolean, expiry?: number, sameSite?: "Strict" | "Lax" | "None"}} */
183
+ const cookie = { name, value };
184
+ if (typeof commandArgs.domain === "string" && commandArgs.domain.length > 0)
185
+ cookie.domain = commandArgs.domain;
186
+ if (typeof commandArgs.path === "string" && commandArgs.path.length > 0)
187
+ cookie.path = commandArgs.path;
188
+ if (commandArgs.secure !== undefined)
189
+ cookie.secure = parseCookieBoolean("secure", commandArgs.secure);
190
+ if (commandArgs.httpOnly !== undefined)
191
+ cookie.httpOnly = parseCookieBoolean("httpOnly", commandArgs.httpOnly);
192
+ if (commandArgs.expiry !== undefined)
193
+ cookie.expiry = Number(commandArgs.expiry);
194
+ if (typeof commandArgs.sameSite === "string")
195
+ cookie.sameSite = /** @type {"Strict" | "Lax" | "None"} */ (commandArgs.sameSite);
196
+ await this.browser.addCookie(cookie);
197
+ return { ok: true };
198
+ }
147
199
  if (command === "interact") {
148
200
  const selector = commandArgs.selector;
149
201
  const methodName = commandArgs.methodName ?? commandArgs.method;
@@ -169,4 +221,4 @@ export default class BrowserCommandRunner {
169
221
  throw new Error(`Unknown browser command: ${command}`);
170
222
  }
171
223
  }
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1jb21tYW5kLXJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLWNvbW1hbmQtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7O09BR0c7SUFDSCxZQUFZLEVBQUMsT0FBTyxFQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxvQkFBb0IsQ0FBQyxXQUFXO1FBQzlCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQTtRQUV6QixJQUFJLFNBQVMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRSxjQUFjLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7WUFFcEQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUM1RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxXQUFXO1FBQzNCLE1BQU0sUUFBUSxHQUFHLGtEQUFrRCxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFFNUcsSUFBSSxTQUFTLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEUsSUFBSSxXQUFXLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxXQUFXLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNuRSxRQUFR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QUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7WUFDakQsQ0FBQztZQUVELElBQUksY0FBYyxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1RSxJQUFJLE9BQU8sV0FBVyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDbEQsWUFBWSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFBO2dCQUN0RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sWUFBWSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsWUFBWSxLQUFLLE1BQU0sQ0FBQTtnQkFDakUsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQTtZQUVuRixPQUFPLEVBQUMsTUFBTSxFQUFDLENBQUE7UUFDakIsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDeEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFJ1bnMgYnJvd3NlciBjb21tYW5kcyBhY3Jvc3MgQ0xJIGFuZCBXZWJTb2NrZXQgdHJhbnNwb3J0cy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJDb21tYW5kUnVubmVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9icm93c2VyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuYnJvd3NlclxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2Jyb3dzZXJ9KSB7XG4gICAgdGhpcy5icm93c2VyID0gYnJvd3NlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29tbWFuZEFyZ3NcbiAgICogQHJldHVybnMge3t0aW1lb3V0PzogbnVtYmVyfX1cbiAgICovXG4gIG5vcm1hbGl6ZVRpbWVvdXRBcmdzKGNvbW1hbmRBcmdzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEFyZ3MgPSB7fVxuXG4gICAgaWYgKFwidGltZW91dFwiIGluIGNvbW1hbmRBcmdzICYmIGNvbW1hbmRBcmdzLnRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbm9ybWFsaXplZEFyZ3MudGltZW91dCA9IE51bWJlcihjb21tYW5kQXJncy50aW1lb3V0KVxuXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG5vcm1hbGl6ZWRBcmdzLnRpbWVvdXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0aW1lb3V0OiAke2NvbW1hbmRBcmdzLnRpbWVvdXR9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZEFyZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfVxuICAgKi9cbiAgbm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmaW5kQXJncyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gKi8gKHRoaXMubm9ybWFsaXplVGltZW91dEFyZ3MoY29tbWFuZEFyZ3MpKVxuXG4gICAgaWYgKFwidmlzaWJsZVwiIGluIGNvbW1hbmRBcmdzICYmIGNvbW1hbmRBcmdzLnZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbW1hbmRBcmdzLnZpc2libGUgPT09IG51bGwgfHwgY29tbWFuZEFyZ3MudmlzaWJsZSA9PT0gXCJudWxsXCIpIHtcbiAgICAgICAgZmluZEFyZ3MudmlzaWJsZSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbW1hbmRBcmdzLnZpc2libGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGZpbmRBcmdzLnZpc2libGUgPSBjb21tYW5kQXJncy52aXNpYmxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5kQXJncy52aXNpYmxlID0gY29tbWFuZEFyZ3MudmlzaWJsZSA9PT0gXCJ0cnVlXCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXCJ1c2VCYXNlU2VsZWN0b3JcIiBpbiBjb21tYW5kQXJncyAmJiBjb21tYW5kQXJncy51c2VCYXNlU2VsZWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21tYW5kQXJncy51c2VCYXNlU2VsZWN0b3IgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGZpbmRBcmdzLnVzZUJhc2VTZWxlY3RvciA9IGNvbW1hbmRBcmdzLnVzZUJhc2VTZWxlY3RvclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluZEFyZ3MudXNlQmFzZVNlbGVjdG9yID0gY29tbWFuZEFyZ3MudXNlQmFzZVNlbGVjdG9yID09PSBcInRydWVcIlxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcInNjcm9sbFRvXCIgaW4gY29tbWFuZEFyZ3MgJiYgY29tbWFuZEFyZ3Muc2Nyb2xsVG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21tYW5kQXJncy5zY3JvbGxUbyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZmluZEFyZ3Muc2Nyb2xsVG8gPSBjb21tYW5kQXJncy5zY3JvbGxUb1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluZEFyZ3Muc2Nyb2xsVG8gPSBjb21tYW5kQXJncy5zY3JvbGxUbyA9PT0gXCJ0cnVlXCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmluZEFyZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fVxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplRWxlbWVudChlbGVtZW50KSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpXG4gICAgY29uc3QgdGFnTmFtZSA9IGF3YWl0IGVsZW1lbnQuZ2V0VGFnTmFtZSgpXG4gICAgY29uc3QgZGlzcGxheWVkID0gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG5cbiAgICByZXR1cm4ge2Rpc3BsYXllZCwgdGFnTmFtZSwgdGV4dH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBydW4oY29tbWFuZCwgY29tbWFuZEFyZ3MgPSB7fSkge1xuICAgIGlmIChjb21tYW5kID09PSBcInZpc2l0XCIpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBjb21tYW5kQXJncy5wYXRoID8/IGNvbW1hbmRBcmdzLnVybFxuXG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmlzaXQgcmVxdWlyZXMgcGF0aCBvciB1cmxcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnZpc2l0KHBhdGgsIHRoaXMubm9ybWFsaXplVGltZW91dEFyZ3MoY29tbWFuZEFyZ3MpKVxuICAgICAgcmV0dXJuIHtvazogdHJ1ZX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJkaXNtaXNzVG9cIikge1xuICAgICAgY29uc3QgcGF0aCA9IGNvbW1hbmRBcmdzLnBhdGggPz8gY29tbWFuZEFyZ3MudXJsXG5cbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkaXNtaXNzVG8gcmVxdWlyZXMgcGF0aCBvciB1cmxcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmRpc21pc3NUbyhwYXRoLCB0aGlzLm5vcm1hbGl6ZVRpbWVvdXRBcmdzKGNvbW1hbmRBcmdzKSlcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwic2V0QmFzZVNlbGVjdG9yXCIpIHtcbiAgICAgIGlmICghY29tbWFuZEFyZ3Muc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0QmFzZVNlbGVjdG9yIHJlcXVpcmVzIHNlbGVjdG9yXCIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnJvd3Nlci5zZXRCYXNlU2VsZWN0b3IoY29tbWFuZEFyZ3Muc2VsZWN0b3IpXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEN1cnJlbnRVcmxcIikge1xuICAgICAgcmV0dXJuIHtjdXJyZW50VXJsOiBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0Q3VycmVudFVybCgpfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEhUTUxcIikge1xuICAgICAgcmV0dXJuIHtodG1sOiBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0SFRNTCgpfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEJyb3dzZXJMb2dzXCIpIHtcbiAgICAgIHJldHVybiB7bG9nczogYXdhaXQgdGhpcy5icm93c2VyLmdldEJyb3dzZXJMb2dzKCl9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwidGFrZVNjcmVlbnNob3RcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYnJvd3Nlci50YWtlU2NyZWVuc2hvdCgpXG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZmluZFwiKSB7XG4gICAgICBpZiAoIWNvbW1hbmRBcmdzLnNlbGVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmQgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuYnJvd3Nlci5maW5kKGNvbW1hbmRBcmdzLnNlbGVjdG9yLCB0aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKSlcblxuICAgICAgcmV0dXJuIHtlbGVtZW50OiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCl9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZmluZEJ5VGVzdElEXCIpIHtcbiAgICAgIGNvbnN0IHRlc3RJRCA9IGNvbW1hbmRBcmdzLnRlc3RJRCA/PyBjb21tYW5kQXJncy50ZXN0SWRcblxuICAgICAgaWYgKCF0ZXN0SUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluZEJ5VGVzdElEIHJlcXVpcmVzIHRlc3RJRFwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5icm93c2VyLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpKVxuXG4gICAgICByZXR1cm4ge2VsZW1lbnQ6IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJjbGlja1wiKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGNvbW1hbmRBcmdzLnNlbGVjdG9yXG5cbiAgICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpY2sgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmNsaWNrKHNlbGVjdG9yLCB0aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKSlcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwid2FpdEZvck5vU2VsZWN0b3JcIikge1xuICAgICAgaWYgKCFjb21tYW5kQXJncy5zZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3YWl0Rm9yTm9TZWxlY3RvciByZXF1aXJlcyBzZWxlY3RvclwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIud2FpdEZvck5vU2VsZWN0b3IoY29tbWFuZEFyZ3Muc2VsZWN0b3IsIHRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpKVxuICAgICAgcmV0dXJuIHtvazogdHJ1ZX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJleHBlY3ROb0VsZW1lbnRcIikge1xuICAgICAgaWYgKCFjb21tYW5kQXJncy5zZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3ROb0VsZW1lbnQgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmV4cGVjdE5vRWxlbWVudChjb21tYW5kQXJncy5zZWxlY3RvciwgdGhpcy5ub3JtYWxpemVGaW5kQXJncyhjb21tYW5kQXJncykpXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImludGVyYWN0XCIpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29tbWFuZEFyZ3Muc2VsZWN0b3JcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBjb21tYW5kQXJncy5tZXRob2ROYW1lID8/IGNvbW1hbmRBcmdzLm1ldGhvZFxuICAgICAgY29uc3QgbWV0aG9kQXJncyA9IEFycmF5LmlzQXJyYXkoY29tbWFuZEFyZ3MuYXJncykgPyBjb21tYW5kQXJncy5hcmdzIDogW11cbiAgICAgIGNvbnN0IGludGVyYWN0QXJncyA9IC8qKiBAdHlwZSB7e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5JbnRlcmFjdEFyZ3N9ICovICh7c2VsZWN0b3IsIC4uLnRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpfSlcblxuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcmFjdCByZXF1aXJlcyBzZWxlY3RvclwiKVxuICAgICAgfVxuXG4gICAgICBpZiAoIW1ldGhvZE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJhY3QgcmVxdWlyZXMgbWV0aG9kTmFtZVwiKVxuICAgICAgfVxuXG4gICAgICBpZiAoXCJ3aXRoRmFsbGJhY2tcIiBpbiBjb21tYW5kQXJncyAmJiBjb21tYW5kQXJncy53aXRoRmFsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmRBcmdzLndpdGhGYWxsYmFjayA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpbnRlcmFjdEFyZ3Mud2l0aEZhbGxiYWNrID0gY29tbWFuZEFyZ3Mud2l0aEZhbGxiYWNrXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJhY3RBcmdzLndpdGhGYWxsYmFjayA9IGNvbW1hbmRBcmdzLndpdGhGYWxsYmFjayA9PT0gXCJ0cnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJyb3dzZXIuaW50ZXJhY3QoaW50ZXJhY3RBcmdzLCBtZXRob2ROYW1lLCAuLi5tZXRob2RBcmdzKVxuXG4gICAgICByZXR1cm4ge3Jlc3VsdH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYnJvd3NlciBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgfVxufVxuIl19
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci1jb21tYW5kLXJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLWNvbW1hbmQtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFFBQVE7SUFDN0MsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDekQsSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxPQUFPO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFNUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLFNBQVMsK0JBQStCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ2xHLENBQUM7QUFFRCxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE9BQU8sT0FBTyxvQkFBb0I7SUFDdkM7OztPQUdHO0lBQ0gsWUFBWSxFQUFDLE9BQU8sRUFBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtJQUN4QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsb0JBQW9CLENBQUMsV0FBVztRQUM5QixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFFekIsSUFBSSxTQUFTLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEUsY0FBYyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBRXBELElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFDNUQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLGNB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VyxDQUFDLEVBQUMsQ0FBQyxDQUFBO1lBRXJKLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUE7WUFDL0MsQ0FBQztZQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1lBQ2pELENBQUM7WUFFRCxJQUFJLGNBQWMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDNUUsSUFBSSxPQUFPLFdBQVcsQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2xELFlBQVksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQTtnQkFDdEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFlBQVksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLFlBQVksS0FBSyxNQUFNLENBQUE7Z0JBQ2pFLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUE7WUFFbkYsT0FBTyxFQUFDLE1BQU0sRUFBQyxDQUFBO1FBQ2pCLENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ3hELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGFyc2UgYSBjb29raWUgYm9vbGVhbiBhdHRyaWJ1dGUgY29taW5nIGluIG92ZXIgdGhlIEpTT04gY29tbWFuZCB0cmFuc3BvcnQuXG4gKiBUaGUgdHJhbnNwb3J0IGNhcnJpZXMgYm9vbGVhbnMgZWl0aGVyIGFzIG5hdGl2ZSBgdHJ1ZWAvYGZhbHNlYCBvciBhcyB0aGVcbiAqIHN0cmluZyBmb3JtcyBgXCJ0cnVlXCJgL2BcImZhbHNlXCJgLiBBbnl0aGluZyBlbHNlIGlzIHJlamVjdGVkIHNvIGEgdHlwbyBsaWtlXG4gKiBgLS1jb29raWUtc2VjdXJlPVRSVUVgIG9yIGAtLWNvb2tpZS1zZWN1cmU9MWAgZmFpbHMgbG91ZGx5IGluc3RlYWQgb2ZcbiAqIHNpbGVudGx5IHByb2R1Y2luZyBhbiBpbnNlY3VyZSBjb29raWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGROYW1lXG4gKiBAcGFyYW0ge3Vua25vd259IHJhd1ZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb29raWVCb29sZWFuKGZpZWxkTmFtZSwgcmF3VmFsdWUpIHtcbiAgaWYgKHJhd1ZhbHVlID09PSB0cnVlIHx8IHJhd1ZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWVcbiAgaWYgKHJhd1ZhbHVlID09PSBmYWxzZSB8fCByYXdWYWx1ZSA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2VcblxuICB0aHJvdyBuZXcgRXJyb3IoYGFkZENvb2tpZSAke2ZpZWxkTmFtZX0gbXVzdCBiZSB0cnVlIG9yIGZhbHNlLCBnb3QgJHtKU09OLnN0cmluZ2lmeShyYXdWYWx1ZSl9YClcbn1cblxuLyoqIFJ1bnMgYnJvd3NlciBjb21tYW5kcyBhY3Jvc3MgQ0xJIGFuZCBXZWJTb2NrZXQgdHJhbnNwb3J0cy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJDb21tYW5kUnVubmVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9icm93c2VyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuYnJvd3NlclxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2Jyb3dzZXJ9KSB7XG4gICAgdGhpcy5icm93c2VyID0gYnJvd3NlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gY29tbWFuZEFyZ3NcbiAgICogQHJldHVybnMge3t0aW1lb3V0PzogbnVtYmVyfX1cbiAgICovXG4gIG5vcm1hbGl6ZVRpbWVvdXRBcmdzKGNvbW1hbmRBcmdzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEFyZ3MgPSB7fVxuXG4gICAgaWYgKFwidGltZW91dFwiIGluIGNvbW1hbmRBcmdzICYmIGNvbW1hbmRBcmdzLnRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbm9ybWFsaXplZEFyZ3MudGltZW91dCA9IE51bWJlcihjb21tYW5kQXJncy50aW1lb3V0KVxuXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKG5vcm1hbGl6ZWRBcmdzLnRpbWVvdXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0aW1lb3V0OiAke2NvbW1hbmRBcmdzLnRpbWVvdXR9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZEFyZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfVxuICAgKi9cbiAgbm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmaW5kQXJncyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gKi8gKHRoaXMubm9ybWFsaXplVGltZW91dEFyZ3MoY29tbWFuZEFyZ3MpKVxuXG4gICAgaWYgKFwidmlzaWJsZVwiIGluIGNvbW1hbmRBcmdzICYmIGNvbW1hbmRBcmdzLnZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbW1hbmRBcmdzLnZpc2libGUgPT09IG51bGwgfHwgY29tbWFuZEFyZ3MudmlzaWJsZSA9PT0gXCJudWxsXCIpIHtcbiAgICAgICAgZmluZEFyZ3MudmlzaWJsZSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbW1hbmRBcmdzLnZpc2libGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGZpbmRBcmdzLnZpc2libGUgPSBjb21tYW5kQXJncy52aXNpYmxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaW5kQXJncy52aXNpYmxlID0gY29tbWFuZEFyZ3MudmlzaWJsZSA9PT0gXCJ0cnVlXCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXCJ1c2VCYXNlU2VsZWN0b3JcIiBpbiBjb21tYW5kQXJncyAmJiBjb21tYW5kQXJncy51c2VCYXNlU2VsZWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21tYW5kQXJncy51c2VCYXNlU2VsZWN0b3IgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGZpbmRBcmdzLnVzZUJhc2VTZWxlY3RvciA9IGNvbW1hbmRBcmdzLnVzZUJhc2VTZWxlY3RvclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluZEFyZ3MudXNlQmFzZVNlbGVjdG9yID0gY29tbWFuZEFyZ3MudXNlQmFzZVNlbGVjdG9yID09PSBcInRydWVcIlxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcInNjcm9sbFRvXCIgaW4gY29tbWFuZEFyZ3MgJiYgY29tbWFuZEFyZ3Muc2Nyb2xsVG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21tYW5kQXJncy5zY3JvbGxUbyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZmluZEFyZ3Muc2Nyb2xsVG8gPSBjb21tYW5kQXJncy5zY3JvbGxUb1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluZEFyZ3Muc2Nyb2xsVG8gPSBjb21tYW5kQXJncy5zY3JvbGxUbyA9PT0gXCJ0cnVlXCJcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmluZEFyZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fVxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplRWxlbWVudChlbGVtZW50KSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpXG4gICAgY29uc3QgdGFnTmFtZSA9IGF3YWl0IGVsZW1lbnQuZ2V0VGFnTmFtZSgpXG4gICAgY29uc3QgZGlzcGxheWVkID0gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG5cbiAgICByZXR1cm4ge2Rpc3BsYXllZCwgdGFnTmFtZSwgdGV4dH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGNvbW1hbmRBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBydW4oY29tbWFuZCwgY29tbWFuZEFyZ3MgPSB7fSkge1xuICAgIGlmIChjb21tYW5kID09PSBcInZpc2l0XCIpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBjb21tYW5kQXJncy5wYXRoID8/IGNvbW1hbmRBcmdzLnVybFxuXG4gICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmlzaXQgcmVxdWlyZXMgcGF0aCBvciB1cmxcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnZpc2l0KHBhdGgsIHRoaXMubm9ybWFsaXplVGltZW91dEFyZ3MoY29tbWFuZEFyZ3MpKVxuICAgICAgcmV0dXJuIHtvazogdHJ1ZX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJkaXNtaXNzVG9cIikge1xuICAgICAgY29uc3QgcGF0aCA9IGNvbW1hbmRBcmdzLnBhdGggPz8gY29tbWFuZEFyZ3MudXJsXG5cbiAgICAgIGlmICghcGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkaXNtaXNzVG8gcmVxdWlyZXMgcGF0aCBvciB1cmxcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmRpc21pc3NUbyhwYXRoLCB0aGlzLm5vcm1hbGl6ZVRpbWVvdXRBcmdzKGNvbW1hbmRBcmdzKSlcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwic2V0QmFzZVNlbGVjdG9yXCIpIHtcbiAgICAgIGlmICghY29tbWFuZEFyZ3Muc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2V0QmFzZVNlbGVjdG9yIHJlcXVpcmVzIHNlbGVjdG9yXCIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnJvd3Nlci5zZXRCYXNlU2VsZWN0b3IoY29tbWFuZEFyZ3Muc2VsZWN0b3IpXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEN1cnJlbnRVcmxcIikge1xuICAgICAgcmV0dXJuIHtjdXJyZW50VXJsOiBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0Q3VycmVudFVybCgpfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEhUTUxcIikge1xuICAgICAgcmV0dXJuIHtodG1sOiBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0SFRNTCgpfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImdldEJyb3dzZXJMb2dzXCIpIHtcbiAgICAgIHJldHVybiB7bG9nczogYXdhaXQgdGhpcy5icm93c2VyLmdldEJyb3dzZXJMb2dzKCl9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwidGFrZVNjcmVlbnNob3RcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYnJvd3Nlci50YWtlU2NyZWVuc2hvdCgpXG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZmluZFwiKSB7XG4gICAgICBpZiAoIWNvbW1hbmRBcmdzLnNlbGVjdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmQgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuYnJvd3Nlci5maW5kKGNvbW1hbmRBcmdzLnNlbGVjdG9yLCB0aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKSlcblxuICAgICAgcmV0dXJuIHtlbGVtZW50OiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCl9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiZmluZEJ5VGVzdElEXCIpIHtcbiAgICAgIGNvbnN0IHRlc3RJRCA9IGNvbW1hbmRBcmdzLnRlc3RJRCA/PyBjb21tYW5kQXJncy50ZXN0SWRcblxuICAgICAgaWYgKCF0ZXN0SUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluZEJ5VGVzdElEIHJlcXVpcmVzIHRlc3RJRFwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5icm93c2VyLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpKVxuXG4gICAgICByZXR1cm4ge2VsZW1lbnQ6IGF3YWl0IHRoaXMuc2VyaWFsaXplRWxlbWVudChlbGVtZW50KX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJjbGlja1wiKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGNvbW1hbmRBcmdzLnNlbGVjdG9yXG5cbiAgICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2xpY2sgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmNsaWNrKHNlbGVjdG9yLCB0aGlzLm5vcm1hbGl6ZUZpbmRBcmdzKGNvbW1hbmRBcmdzKSlcbiAgICAgIHJldHVybiB7b2s6IHRydWV9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwid2FpdEZvck5vU2VsZWN0b3JcIikge1xuICAgICAgaWYgKCFjb21tYW5kQXJncy5zZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3YWl0Rm9yTm9TZWxlY3RvciByZXF1aXJlcyBzZWxlY3RvclwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIud2FpdEZvck5vU2VsZWN0b3IoY29tbWFuZEFyZ3Muc2VsZWN0b3IsIHRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpKVxuICAgICAgcmV0dXJuIHtvazogdHJ1ZX1cbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZCA9PT0gXCJleHBlY3ROb0VsZW1lbnRcIikge1xuICAgICAgaWYgKCFjb21tYW5kQXJncy5zZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3ROb0VsZW1lbnQgcmVxdWlyZXMgc2VsZWN0b3JcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmV4cGVjdE5vRWxlbWVudChjb21tYW5kQXJncy5zZWxlY3RvciwgdGhpcy5ub3JtYWxpemVGaW5kQXJncyhjb21tYW5kQXJncykpXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImV4ZWN1dGVTY3JpcHRcIikge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gY29tbWFuZEFyZ3Muc2NyaXB0XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSBcInN0cmluZ1wiIHx8IHNjcmlwdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhlY3V0ZVNjcmlwdCByZXF1aXJlcyBzY3JpcHRcIilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NyaXB0QXJncyA9IEFycmF5LmlzQXJyYXkoY29tbWFuZEFyZ3MuYXJncykgPyBjb21tYW5kQXJncy5hcmdzIDogW11cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlU2NyaXB0KHNjcmlwdCwgLi4uc2NyaXB0QXJncylcblxuICAgICAgcmV0dXJuIHtyZXN1bHR9XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQgPT09IFwiYWRkQ29va2llXCIpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBjb21tYW5kQXJncy5uYW1lXG5cbiAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhZGRDb29raWUgcmVxdWlyZXMgbmFtZVwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbW1hbmRBcmdzLnZhbHVlXG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWRkQ29va2llIHJlcXVpcmVzIHN0cmluZyB2YWx1ZVwiKVxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge3tuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZywgcGF0aD86IHN0cmluZywgc2VjdXJlPzogYm9vbGVhbiwgaHR0cE9ubHk/OiBib29sZWFuLCBleHBpcnk/OiBudW1iZXIsIHNhbWVTaXRlPzogXCJTdHJpY3RcIiB8IFwiTGF4XCIgfCBcIk5vbmVcIn19ICovXG4gICAgICBjb25zdCBjb29raWUgPSB7bmFtZSwgdmFsdWV9XG5cbiAgICAgIGlmICh0eXBlb2YgY29tbWFuZEFyZ3MuZG9tYWluID09PSBcInN0cmluZ1wiICYmIGNvbW1hbmRBcmdzLmRvbWFpbi5sZW5ndGggPiAwKSBjb29raWUuZG9tYWluID0gY29tbWFuZEFyZ3MuZG9tYWluXG4gICAgICBpZiAodHlwZW9mIGNvbW1hbmRBcmdzLnBhdGggPT09IFwic3RyaW5nXCIgJiYgY29tbWFuZEFyZ3MucGF0aC5sZW5ndGggPiAwKSBjb29raWUucGF0aCA9IGNvbW1hbmRBcmdzLnBhdGhcbiAgICAgIGlmIChjb21tYW5kQXJncy5zZWN1cmUgIT09IHVuZGVmaW5lZCkgY29va2llLnNlY3VyZSA9IHBhcnNlQ29va2llQm9vbGVhbihcInNlY3VyZVwiLCBjb21tYW5kQXJncy5zZWN1cmUpXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuaHR0cE9ubHkgIT09IHVuZGVmaW5lZCkgY29va2llLmh0dHBPbmx5ID0gcGFyc2VDb29raWVCb29sZWFuKFwiaHR0cE9ubHlcIiwgY29tbWFuZEFyZ3MuaHR0cE9ubHkpXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZXhwaXJ5ICE9PSB1bmRlZmluZWQpIGNvb2tpZS5leHBpcnkgPSBOdW1iZXIoY29tbWFuZEFyZ3MuZXhwaXJ5KVxuICAgICAgaWYgKHR5cGVvZiBjb21tYW5kQXJncy5zYW1lU2l0ZSA9PT0gXCJzdHJpbmdcIikgY29va2llLnNhbWVTaXRlID0gLyoqIEB0eXBlIHtcIlN0cmljdFwiIHwgXCJMYXhcIiB8IFwiTm9uZVwifSAqLyAoY29tbWFuZEFyZ3Muc2FtZVNpdGUpXG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5hZGRDb29raWUoY29va2llKVxuXG4gICAgICByZXR1cm4ge29rOiB0cnVlfVxuICAgIH1cblxuICAgIGlmIChjb21tYW5kID09PSBcImludGVyYWN0XCIpIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29tbWFuZEFyZ3Muc2VsZWN0b3JcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBjb21tYW5kQXJncy5tZXRob2ROYW1lID8/IGNvbW1hbmRBcmdzLm1ldGhvZFxuICAgICAgY29uc3QgbWV0aG9kQXJncyA9IEFycmF5LmlzQXJyYXkoY29tbWFuZEFyZ3MuYXJncykgPyBjb21tYW5kQXJncy5hcmdzIDogW11cbiAgICAgIGNvbnN0IGludGVyYWN0QXJncyA9IC8qKiBAdHlwZSB7e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5JbnRlcmFjdEFyZ3N9ICovICh7c2VsZWN0b3IsIC4uLnRoaXMubm9ybWFsaXplRmluZEFyZ3MoY29tbWFuZEFyZ3MpfSlcblxuICAgICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcmFjdCByZXF1aXJlcyBzZWxlY3RvclwiKVxuICAgICAgfVxuXG4gICAgICBpZiAoIW1ldGhvZE5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW50ZXJhY3QgcmVxdWlyZXMgbWV0aG9kTmFtZVwiKVxuICAgICAgfVxuXG4gICAgICBpZiAoXCJ3aXRoRmFsbGJhY2tcIiBpbiBjb21tYW5kQXJncyAmJiBjb21tYW5kQXJncy53aXRoRmFsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmRBcmdzLndpdGhGYWxsYmFjayA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpbnRlcmFjdEFyZ3Mud2l0aEZhbGxiYWNrID0gY29tbWFuZEFyZ3Mud2l0aEZhbGxiYWNrXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW50ZXJhY3RBcmdzLndpdGhGYWxsYmFjayA9IGNvbW1hbmRBcmdzLndpdGhGYWxsYmFjayA9PT0gXCJ0cnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJyb3dzZXIuaW50ZXJhY3QoaW50ZXJhY3RBcmdzLCBtZXRob2ROYW1lLCAuLi5tZXRob2RBcmdzKVxuXG4gICAgICByZXR1cm4ge3Jlc3VsdH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYnJvd3NlciBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgfVxufVxuIl19
@@ -1,23 +1,3 @@
1
- /**
2
- * @typedef {object} BrowserArgs
3
- * @property {boolean} [debug] Enable debug logging.
4
- * @property {BrowserDriverConfig} [driver] Driver configuration.
5
- * @property {import("./system-test-communicator.js").default} [communicator] Optional command communicator for helper-driven navigation.
6
- * @property {string} [screenshotsPath] Directory used for saved screenshots and browser artifacts.
7
- */
8
- /**
9
- * @typedef {object} BrowserDriverConfig
10
- * @property {"selenium"|"appium"} [type] Driver implementation to use.
11
- * @property {Record<string, any>} [options] Driver-specific options.
12
- */
13
- /**
14
- * @typedef {object} BrowserNavigationArgs
15
- * @property {number} [timeout] Override the timeout for this navigation command.
16
- */
17
- /**
18
- * @typedef {object} BrowserPathWaitArgs
19
- * @property {number} [timeout] Override the timeout for this path wait.
20
- */
21
1
  /** Generic browser session wrapper around the configured driver. */
22
2
  export default class Browser {
23
3
  /** @param {BrowserArgs} [args] */
@@ -104,6 +84,27 @@ export default class Browser {
104
84
  * @returns {Promise<void>}
105
85
  */
106
86
  waitForPath(expectedPath: string, args?: BrowserPathWaitArgs): Promise<void>;
87
+ /**
88
+ * Waits until the current URL exactly matches the expected URL.
89
+ * @param {string} expectedUrl Exact URL expected.
90
+ * @param {BrowserCurrentUrlWaitArgs} [args] Optional timeout.
91
+ * @returns {Promise<void>}
92
+ */
93
+ waitForCurrentUrl(expectedUrl: string, args?: BrowserCurrentUrlWaitArgs): Promise<void>;
94
+ /**
95
+ * Waits until the current URL contains a fragment.
96
+ * @param {string} expectedFragment Fragment that should appear.
97
+ * @param {BrowserCurrentUrlWaitArgs} [args] Optional timeout.
98
+ * @returns {Promise<void>}
99
+ */
100
+ waitForUrlContains(expectedFragment: string, args?: BrowserCurrentUrlWaitArgs): Promise<void>;
101
+ /**
102
+ * Waits until the current URL does not contain a fragment.
103
+ * @param {string} unexpectedFragment Fragment that should disappear.
104
+ * @param {BrowserCurrentUrlWaitArgs} [args] Optional timeout.
105
+ * @returns {Promise<void>}
106
+ */
107
+ waitForUrlExcludes(unexpectedFragment: string, args?: BrowserCurrentUrlWaitArgs): Promise<void>;
107
108
  /**
108
109
  * @param {string} selector
109
110
  * @param {import("./system-test.js").FindArgs} [args]
@@ -152,6 +153,40 @@ export default class Browser {
152
153
  clearAndSendKeys(elementOrIdentifier: import("selenium-webdriver").WebElement | string | ({
153
154
  selector: string;
154
155
  } & import("./system-test.js").InteractArgs), nextValue: string): Promise<void>;
156
+ /**
157
+ * Replaces an input-like element's value by test id.
158
+ * @param {string} testID Field `data-testid` to target.
159
+ * @param {string} nextValue Text to leave in the field.
160
+ * @param {BrowserTestIDInputArgs} [args] Optional lookup timeout.
161
+ * @returns {Promise<void>}
162
+ */
163
+ replaceTestIDInputValue(testID: string, nextValue: string, args?: BrowserTestIDInputArgs): Promise<void>;
164
+ /**
165
+ * Waits until a test id contains expected visible text.
166
+ * @param {string} testID Element `data-testid` to inspect.
167
+ * @param {string} expectedText Fragment that must appear in the element text.
168
+ * @param {BrowserTextWaitArgs} [args] Optional timeout.
169
+ * @returns {Promise<void>}
170
+ */
171
+ waitForTestIDText(testID: string, expectedText: string, args?: BrowserTextWaitArgs): Promise<void>;
172
+ /**
173
+ * Waits until a test id no longer contains excluded visible text.
174
+ * @param {string} testID Element `data-testid` to inspect.
175
+ * @param {string} excludedText Fragment that should disappear from the element text.
176
+ * @param {BrowserTextWaitArgs} [args] Optional timeout.
177
+ * @returns {Promise<void>}
178
+ */
179
+ waitForTestIDTextExcludes(testID: string, excludedText: string, args?: BrowserTextWaitArgs): Promise<void>;
180
+ /**
181
+ * Asserts a rendered element has a CSS color from the expected palette.
182
+ * @param {string} testID Element `data-testid` to inspect.
183
+ * @param {string} propertyName CSS property to read.
184
+ * @param {string} expectedRgb Expected RGB fragment.
185
+ * @param {string} lightRgb Disallowed RGB fragment.
186
+ * @param {string} description Human-readable element description.
187
+ * @returns {Promise<void>}
188
+ */
189
+ expectTestIDCssColor(testID: string, propertyName: string, expectedRgb: string, lightRgb: string, description: string): Promise<void>;
155
190
  /**
156
191
  * Scrolls an element into view.
157
192
  * @param {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").FindArgs} elementOrIdentifier
@@ -194,6 +229,42 @@ export default class Browser {
194
229
  driverVisit(path: string): Promise<void>;
195
230
  /** @returns {Promise<void>} */
196
231
  deleteAllCookies(): Promise<void>;
232
+ /**
233
+ * Add a cookie to the active driver session for the current document
234
+ * origin. Useful when an out-of-band login (curl, fetch, etc.) returned
235
+ * a `Set-Cookie` value and the test needs the browser to start
236
+ * authenticated without driving the sign-in UI.
237
+ *
238
+ * The driver must already be on a page whose origin/domain matches the
239
+ * cookie domain, otherwise Selenium will reject the call.
240
+ * @param {{name: string, value: string, domain?: string, path?: string, secure?: boolean, httpOnly?: boolean, expiry?: number, sameSite?: "Strict" | "Lax" | "None"}} cookie
241
+ * @returns {Promise<void>}
242
+ */
243
+ addCookie(cookie: {
244
+ name: string;
245
+ value: string;
246
+ domain?: string;
247
+ path?: string;
248
+ secure?: boolean;
249
+ httpOnly?: boolean;
250
+ expiry?: number;
251
+ sameSite?: "Strict" | "Lax" | "None";
252
+ }): Promise<void>;
253
+ /**
254
+ * Run an arbitrary script in the active browser session and return the
255
+ * resolved value. `script` is the function body executed in the browser
256
+ * (`new Function("...")`-style); `args` are forwarded as `arguments[i]`.
257
+ * Asynchronous scripts must `return` a Promise, which Selenium awaits.
258
+ *
259
+ * Useful for verification flows that need to call into application code
260
+ * (e.g. `fetch("/development/sign-in", {...})`) without going through the
261
+ * UI, or to read browser state the existing finder/interact commands
262
+ * don't expose.
263
+ * @param {string} script
264
+ * @param {...any} args
265
+ * @returns {Promise<any>}
266
+ */
267
+ executeScript(script: string, ...args: any[]): Promise<any>;
197
268
  /**
198
269
  * @param {string} type
199
270
  * @param {string} path
@@ -282,3 +353,21 @@ export type BrowserPathWaitArgs = {
282
353
  */
283
354
  timeout?: number | undefined;
284
355
  };
356
+ export type BrowserTextWaitArgs = {
357
+ /**
358
+ * Override the timeout for this text wait.
359
+ */
360
+ timeout?: number | undefined;
361
+ };
362
+ export type BrowserCurrentUrlWaitArgs = {
363
+ /**
364
+ * Override the timeout for this URL wait.
365
+ */
366
+ timeout?: number | undefined;
367
+ };
368
+ export type BrowserTestIDInputArgs = {
369
+ /**
370
+ * Override timeout for the input lookup.
371
+ */
372
+ timeout?: number | undefined;
373
+ };