system-testing 1.0.78 → 1.0.81

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.
Files changed (35) hide show
  1. package/README.md +232 -6
  2. package/build/browser-command-client.d.ts +19 -0
  3. package/build/browser-command-client.js +39 -0
  4. package/build/browser-command-runner.d.ts +34 -0
  5. package/build/browser-command-runner.js +155 -0
  6. package/build/browser-daemon-constants.d.ts +2 -0
  7. package/build/browser-daemon-constants.js +3 -0
  8. package/build/browser-process.d.ts +45 -0
  9. package/build/browser-process.js +134 -0
  10. package/build/browser-registry.d.ts +44 -0
  11. package/build/browser-registry.js +191 -0
  12. package/build/browser.d.ts +240 -0
  13. package/build/browser.js +375 -0
  14. package/build/cli-helpers.d.ts +16 -0
  15. package/build/cli-helpers.js +177 -0
  16. package/build/cli.d.ts +2 -0
  17. package/build/cli.js +81 -0
  18. package/build/drivers/appium-driver.js +21 -21
  19. package/build/drivers/webdriver-driver.d.ts +4 -4
  20. package/build/drivers/webdriver-driver.js +32 -28
  21. package/build/index.d.ts +9 -1
  22. package/build/index.js +10 -3
  23. package/build/system-test-browser-helper.d.ts +6 -12
  24. package/build/system-test-browser-helper.js +12 -13
  25. package/build/system-test.d.ts +3 -189
  26. package/build/system-test.js +6 -220
  27. package/build/use-system-test-expo.d.ts +16 -0
  28. package/build/use-system-test-expo.js +34 -0
  29. package/build/use-system-test-react-native.d.ts +25 -0
  30. package/build/use-system-test-react-native.js +20 -0
  31. package/build/use-system-test-shape-hook.d.ts +35 -0
  32. package/build/use-system-test-shape-hook.js +74 -0
  33. package/build/use-system-test.d.ts +19 -10
  34. package/build/use-system-test.js +26 -72
  35. package/package.json +17 -8
@@ -0,0 +1,375 @@
1
+ // @ts-check
2
+ import fs from "node:fs/promises";
3
+ import moment from "moment";
4
+ import { prettify } from "htmlfy";
5
+ import timeout from "awaitery/build/timeout.js";
6
+ import SeleniumDriver from "./drivers/selenium-driver.js";
7
+ import AppiumDriver from "./drivers/appium-driver.js";
8
+ /**
9
+ * @typedef {object} BrowserArgs
10
+ * @property {boolean} [debug] Enable debug logging.
11
+ * @property {BrowserDriverConfig} [driver] Driver configuration.
12
+ * @property {import("./system-test-communicator.js").default} [communicator] Optional command communicator for helper-driven navigation.
13
+ * @property {string} [screenshotsPath] Directory used for saved screenshots and browser artifacts.
14
+ */
15
+ /**
16
+ * @typedef {object} BrowserDriverConfig
17
+ * @property {"selenium"|"appium"} [type] Driver implementation to use.
18
+ * @property {Record<string, any>} [options] Driver-specific options.
19
+ */
20
+ /**
21
+ * @typedef {object} BrowserNavigationArgs
22
+ * @property {number} [timeout] Override the timeout for this navigation command.
23
+ */
24
+ /** Generic browser session wrapper around the configured driver. */
25
+ export default class Browser {
26
+ /** @param {BrowserArgs} [args] */
27
+ constructor({ debug = false, driver, communicator, screenshotsPath = `${process.cwd()}/tmp/screenshots`, ...restArgs } = {}) {
28
+ /** @type {import("selenium-webdriver").WebDriver | undefined} */
29
+ this.driver = undefined;
30
+ /** @type {import("./drivers/webdriver-driver.js").default | undefined} */
31
+ this.driverAdapter = undefined;
32
+ this._debug = false;
33
+ /** @type {BrowserDriverConfig | undefined} */
34
+ this._driverConfig = undefined;
35
+ /** @type {Error | undefined} */
36
+ this._httpServerError = undefined;
37
+ /**
38
+ * @param {Error} error
39
+ * @returns {void}
40
+ */
41
+ this.onHttpServerError = (error) => {
42
+ const errorMessage = error instanceof Error ? error.message : String(error);
43
+ this._httpServerError = error instanceof Error ? error : new Error(errorMessage);
44
+ console.error(`HTTP server error: ${errorMessage}`);
45
+ };
46
+ const restArgsKeys = Object.keys(restArgs);
47
+ if (restArgsKeys.length > 0) {
48
+ throw new Error(`Unknown browser arguments: ${restArgsKeys.join(", ")}`);
49
+ }
50
+ this._debug = debug;
51
+ this._driverConfig = driver;
52
+ this._screenshotsPath = screenshotsPath;
53
+ this.communicator = communicator;
54
+ this.driverAdapter = this.createDriver(driver);
55
+ }
56
+ /**
57
+ * @param {BrowserDriverConfig} [driverConfig]
58
+ * @returns {import("./drivers/webdriver-driver.js").default}
59
+ */
60
+ createDriver(driverConfig = {}) {
61
+ const { type = "selenium", options, ...restArgs } = driverConfig;
62
+ const restArgsKeys = Object.keys(restArgs);
63
+ if (restArgsKeys.length > 0) {
64
+ throw new Error(`Unknown driver args: ${restArgsKeys.join(", ")}`);
65
+ }
66
+ if (type === "selenium") {
67
+ return new SeleniumDriver({ browser: this, options });
68
+ }
69
+ if (type === "appium") {
70
+ return new AppiumDriver({ browser: this, options });
71
+ }
72
+ throw new Error(`Unsupported driver type: ${type}`);
73
+ }
74
+ /**
75
+ * @param {import("./system-test-communicator.js").default | undefined} communicator
76
+ * @returns {void}
77
+ */
78
+ setCommunicator(communicator) {
79
+ this.communicator = communicator;
80
+ }
81
+ /** @returns {boolean} */
82
+ communicatorExists() {
83
+ return Boolean(this.communicator);
84
+ }
85
+ /**
86
+ * @param {string} baseSelector
87
+ * @returns {void}
88
+ */
89
+ setBaseSelector(baseSelector) { this._baseSelector = baseSelector; }
90
+ /** @returns {string | undefined} */
91
+ getBaseSelector() { return this._baseSelector; }
92
+ /**
93
+ * @param {string} selector
94
+ * @returns {string}
95
+ */
96
+ getSelector(selector) {
97
+ return this.getBaseSelector() ? `${this.getBaseSelector()} ${selector}` : selector;
98
+ }
99
+ /**
100
+ * @param {...any} args
101
+ * @returns {void}
102
+ */
103
+ debugError(...args) {
104
+ console.error("[Browser error]", ...args);
105
+ }
106
+ /**
107
+ * @param {...any} args
108
+ * @returns {void}
109
+ */
110
+ debugLog(...args) {
111
+ if (this._debug) {
112
+ console.log("[Browser debug]", ...args);
113
+ }
114
+ }
115
+ /** @returns {void} */
116
+ throwIfHttpServerError() {
117
+ if (this._httpServerError) {
118
+ throw new Error(`HTTP server error: ${this._httpServerError.message}`);
119
+ }
120
+ }
121
+ /** @returns {import("selenium-webdriver").WebDriver} */
122
+ getDriver() {
123
+ return this.getDriverAdapter().getWebDriver();
124
+ }
125
+ /** @returns {import("./drivers/webdriver-driver.js").default} */
126
+ getDriverAdapter() {
127
+ if (!this.driverAdapter) {
128
+ throw new Error("Driver hasn't been initialized yet");
129
+ }
130
+ return this.driverAdapter;
131
+ }
132
+ /** @returns {number} */
133
+ getTimeouts() { return this.getDriverAdapter().getTimeouts(); }
134
+ /** @returns {Promise<void>} */
135
+ async restoreTimeouts() {
136
+ await this.getDriverAdapter().restoreTimeouts();
137
+ }
138
+ /**
139
+ * @param {number} newTimeout
140
+ * @returns {Promise<void>}
141
+ */
142
+ async driverSetTimeouts(newTimeout) {
143
+ await this.getDriverAdapter().driverSetTimeouts(newTimeout);
144
+ }
145
+ /**
146
+ * @param {number} newTimeout
147
+ * @returns {Promise<void>}
148
+ */
149
+ async setTimeouts(newTimeout) {
150
+ await this.getDriverAdapter().setTimeouts(newTimeout);
151
+ }
152
+ /** @returns {Promise<string[]>} */
153
+ async getBrowserLogs() {
154
+ return await this.getDriverAdapter().getBrowserLogs();
155
+ }
156
+ /** @returns {Promise<string>} */
157
+ async getCurrentUrl() {
158
+ return await this.getDriverAdapter().getCurrentUrl();
159
+ }
160
+ /**
161
+ * @param {string} selector
162
+ * @param {import("./system-test.js").FindArgs} [args]
163
+ * @returns {Promise<import("selenium-webdriver").WebElement[]>}
164
+ */
165
+ async all(selector, args = {}) {
166
+ return await this.getDriverAdapter().all(selector, args);
167
+ }
168
+ /**
169
+ * @param {string} selector
170
+ * @param {import("./system-test.js").FindArgs} [args]
171
+ * @returns {Promise<import("selenium-webdriver").WebElement>}
172
+ */
173
+ async find(selector, args = {}) {
174
+ return await this.getDriverAdapter().find(selector, args);
175
+ }
176
+ /**
177
+ * @param {string} testID
178
+ * @param {import("./system-test.js").FindArgs} [args]
179
+ * @returns {Promise<import("selenium-webdriver").WebElement>}
180
+ */
181
+ async findByTestID(testID, args) {
182
+ return await this.getDriverAdapter().findByTestID(testID, args);
183
+ }
184
+ /**
185
+ * @param {string} selector
186
+ * @param {import("./system-test.js").FindArgs} [args]
187
+ * @returns {Promise<import("selenium-webdriver").WebElement>}
188
+ */
189
+ async findNoWait(selector, args = {}) {
190
+ return await this.getDriverAdapter().findNoWait(selector, args);
191
+ }
192
+ /**
193
+ * @param {string | import("selenium-webdriver").WebElement} elementOrIdentifier
194
+ * @param {import("./system-test.js").FindArgs} [args]
195
+ * @returns {Promise<void>}
196
+ */
197
+ async click(elementOrIdentifier, args) {
198
+ await this.getDriverAdapter().click(elementOrIdentifier, args);
199
+ }
200
+ /**
201
+ * @param {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").FindArgs} elementOrIdentifier
202
+ * @param {string} methodName
203
+ * @param {...any} args
204
+ * @returns {Promise<any>}
205
+ */
206
+ async interact(elementOrIdentifier, methodName, ...args) {
207
+ return await this.getDriverAdapter().interact(elementOrIdentifier, methodName, ...args);
208
+ }
209
+ /**
210
+ * @param {string} selector
211
+ * @param {import("./system-test.js").WaitForNoSelectorArgs} [args]
212
+ * @returns {Promise<void>}
213
+ */
214
+ async waitForNoSelector(selector, args = {}) {
215
+ await this.getDriverAdapter().waitForNoSelector(selector, args);
216
+ }
217
+ /**
218
+ * @param {string} selector
219
+ * @param {import("./system-test.js").FindArgs} [args]
220
+ * @returns {Promise<void>}
221
+ */
222
+ async expectNoElement(selector, args = {}) {
223
+ let found = false;
224
+ try {
225
+ await this.findNoWait(selector, args);
226
+ found = true;
227
+ }
228
+ catch (error) {
229
+ if (error instanceof Error && error.message.startsWith("Element couldn't be found after ")) {
230
+ // Ignore
231
+ }
232
+ else {
233
+ throw error;
234
+ }
235
+ }
236
+ if (found) {
237
+ throw new Error(`Expected not to find: ${selector}`);
238
+ }
239
+ }
240
+ /** @returns {Promise<string>} */
241
+ async getHTML() {
242
+ return await this.getDriverAdapter().getHTML();
243
+ }
244
+ /**
245
+ * @param {number | undefined} timeoutOverride
246
+ * @returns {number}
247
+ */
248
+ getCommandTimeout(timeoutOverride) {
249
+ if (timeoutOverride !== undefined) {
250
+ return timeoutOverride;
251
+ }
252
+ return this.getTimeouts();
253
+ }
254
+ /**
255
+ * @param {string} path
256
+ * @returns {Promise<void>}
257
+ */
258
+ async driverVisit(path) {
259
+ await this.getDriverAdapter().driverVisit(path);
260
+ }
261
+ /**
262
+ * @param {string} type
263
+ * @param {string} path
264
+ * @param {BrowserNavigationArgs} [args]
265
+ * @returns {Promise<void>}
266
+ */
267
+ async sendBrowserCommand(type, path, args = {}) {
268
+ if (!this.communicator) {
269
+ throw new Error("Communicator hasn't been initialized yet");
270
+ }
271
+ await timeout({ timeout: this.getCommandTimeout(args.timeout), errorMessage: `timeout while sending browser command ${type}: ${path}` }, async () => await this.communicator.sendCommand({ type, path }));
272
+ }
273
+ /**
274
+ * Visits a path using the injected browser helper when available, otherwise navigates directly with the driver.
275
+ * @param {string} path
276
+ * @param {BrowserNavigationArgs} [args]
277
+ * @returns {Promise<void>}
278
+ */
279
+ async visit(path, args = {}) {
280
+ if (this.communicatorExists()) {
281
+ await this.sendBrowserCommand("visit", path, args);
282
+ }
283
+ else {
284
+ await timeout({ timeout: this.getCommandTimeout(args.timeout), errorMessage: `timeout while visiting path: ${path}` }, async () => await this.driverVisit(path));
285
+ }
286
+ }
287
+ /**
288
+ * Dismisses to a path via the injected browser helper when available, otherwise navigates directly with the driver.
289
+ * @param {string} path
290
+ * @param {BrowserNavigationArgs} [args]
291
+ * @returns {Promise<void>}
292
+ */
293
+ async dismissTo(path, args = {}) {
294
+ if (this.communicatorExists()) {
295
+ await this.sendBrowserCommand("dismissTo", path, args);
296
+ }
297
+ else {
298
+ await timeout({ timeout: this.getCommandTimeout(args.timeout), errorMessage: `timeout while dismissing to path: ${path}` }, async () => await this.driverVisit(path));
299
+ }
300
+ }
301
+ /**
302
+ * Formats browser logs for console output and truncates overly long output.
303
+ * @param {string[]} logs
304
+ * @param {number} [maxLines]
305
+ * @returns {string[]}
306
+ */
307
+ formatBrowserLogsForConsole(logs, maxLines = 200) {
308
+ if (!Array.isArray(logs) || logs.length === 0) {
309
+ return ["(no browser logs)"];
310
+ }
311
+ if (logs.length <= maxLines) {
312
+ return logs;
313
+ }
314
+ const keptLogs = logs.slice(logs.length - maxLines);
315
+ const hiddenCount = logs.length - maxLines;
316
+ return [`(showing last ${maxLines} of ${logs.length} browser logs, ${hiddenCount} omitted)`, ...keptLogs];
317
+ }
318
+ /**
319
+ * @param {string[]} logs
320
+ * @returns {void}
321
+ */
322
+ printBrowserLogsForFailure(logs) {
323
+ console.log("Browser logs:");
324
+ for (const line of this.formatBrowserLogsForConsole(logs)) {
325
+ console.log(line);
326
+ }
327
+ }
328
+ /**
329
+ * Takes a screenshot, writes HTML/browser logs to disk, and returns the collected artifacts.
330
+ * @returns {Promise<{currentUrl: string, html: string, htmlPath: string, logs: string[], logsPath: string, screenshotPath: string}>}
331
+ */
332
+ async takeScreenshot() {
333
+ this.debugLog("Getting path for screenshots");
334
+ const path = this._screenshotsPath;
335
+ this.debugLog(`Creating dir with recursive: ${path}`);
336
+ await fs.mkdir(path, { recursive: true });
337
+ this.debugLog("Getting screenshot image content");
338
+ const imageContent = await timeout({ timeout: 5000, errorMessage: "timeout while taking screenshot" }, async () => await this.getDriverAdapter().takeScreenshot());
339
+ this.debugLog("Generating date variables");
340
+ const now = new Date();
341
+ const timestamp = moment(now).format("YYYY-MM-DD-HH-MM-SS");
342
+ const screenshotPath = `${path}/${timestamp}.png`;
343
+ const htmlPath = `${path}/${timestamp}.html`;
344
+ const logsPath = `${path}/${timestamp}.logs.txt`;
345
+ this.debugLog("Getting browser logs");
346
+ const logs = await timeout({ timeout: 5000, errorMessage: "timeout while reading browser logs" }, async () => await this.getBrowserLogs());
347
+ const html = await timeout({ timeout: 5000, errorMessage: "timeout while reading page HTML" }, async () => await this.getHTML());
348
+ const htmlPretty = prettify(html);
349
+ this.printBrowserLogsForFailure(logs);
350
+ this.debugLog("Writing files");
351
+ await fs.writeFile(htmlPath, htmlPretty);
352
+ await fs.writeFile(logsPath, logs.join("\n"));
353
+ await fs.writeFile(screenshotPath, imageContent, "base64");
354
+ const currentUrl = await this.getCurrentUrl();
355
+ console.log("Current URL:", currentUrl);
356
+ console.log("Logs:", logsPath);
357
+ console.log("Screenshot:", screenshotPath);
358
+ console.log("HTML:", htmlPath);
359
+ return {
360
+ currentUrl,
361
+ html,
362
+ htmlPath,
363
+ logs,
364
+ logsPath,
365
+ screenshotPath
366
+ };
367
+ }
368
+ /** @returns {Promise<void>} */
369
+ async stopDriver() {
370
+ if (this.driverAdapter) {
371
+ await this.driverAdapter.stop();
372
+ }
373
+ }
374
+ }
375
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFFBQVEsQ0FBQTtBQUMvQixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGNBQWMsTUFBTSw4QkFBOEIsQ0FBQTtBQUN6RCxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRDs7Ozs7O0dBTUc7QUFDSDs7OztHQUlHO0FBQ0g7OztHQUdHO0FBRUgsb0VBQW9FO0FBQ3BFLE1BQU0sQ0FBQyxPQUFPLE9BQU8sT0FBTztJQWExQixrQ0FBa0M7SUFDbEMsWUFBWSxFQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxlQUFlLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsRUFBRTtRQWJ6SCxpRUFBaUU7UUFDakUsV0FBTSxHQUFHLFNBQVMsQ0FBQTtRQUVsQiwwRUFBMEU7UUFDMUUsa0JBQWEsR0FBRyxTQUFTLENBQUE7UUFFekIsV0FBTSxHQUFHLEtBQUssQ0FBQTtRQUNkLDhDQUE4QztRQUM5QyxrQkFBYSxHQUFHLFNBQVMsQ0FBQTtRQUN6QixnQ0FBZ0M7UUFDaEMscUJBQWdCLEdBQUcsU0FBUyxDQUFBO1FBK0Y1Qjs7O1dBR0c7UUFDSCxzQkFBaUIsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzVCLE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUUzRSxJQUFJLENBQUMs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LEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUUxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUU3QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUU5QixPQUFPO1lBQ0wsVUFBVTtZQUNWLElBQUk7WUFDSixRQUFRO1lBQ1IsSUFBSTtZQUNKLFFBQVE7WUFDUixjQUFjO1NBQ2YsQ0FBQTtJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDakMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCJcbmltcG9ydCB7cHJldHRpZnl9IGZyb20gXCJodG1sZnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IFNlbGVuaXVtRHJpdmVyIGZyb20gXCIuL2RyaXZlcnMvc2VsZW5pdW0tZHJpdmVyLmpzXCJcbmltcG9ydCBBcHBpdW1Ecml2ZXIgZnJvbSBcIi4vZHJpdmVycy9hcHBpdW0tZHJpdmVyLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyQXJnc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nLlxuICogQHByb3BlcnR5IHtCcm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyXSBEcml2ZXIgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIikuZGVmYXVsdH0gW2NvbW11bmljYXRvcl0gT3B0aW9uYWwgY29tbWFuZCBjb21tdW5pY2F0b3IgZm9yIGhlbHBlci1kcml2ZW4gbmF2aWdhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2NyZWVuc2hvdHNQYXRoXSBEaXJlY3RvcnkgdXNlZCBmb3Igc2F2ZWQgc2NyZWVuc2hvdHMgYW5kIGJyb3dzZXIgYXJ0aWZhY3RzLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJEcml2ZXJDb25maWdcbiAqIEBwcm9wZXJ0eSB7XCJzZWxlbml1bVwifFwiYXBwaXVtXCJ9IFt0eXBlXSBEcml2ZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb3B0aW9uc10gRHJpdmVyLXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3Nlck5hdmlnYXRpb25BcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRoZSB0aW1lb3V0IGZvciB0aGlzIG5hdmlnYXRpb24gY29tbWFuZC5cbiAqL1xuXG4vKiogR2VuZXJpYyBicm93c2VyIHNlc3Npb24gd3JhcHBlciBhcm91bmQgdGhlIGNvbmZpZ3VyZWQgZHJpdmVyLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJvd3NlciB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkRyaXZlciB8IHVuZGVmaW5lZH0gKi9cbiAgZHJpdmVyID0gdW5kZWZpbmVkXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RyaXZlcnMvd2ViZHJpdmVyLWRyaXZlci5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAqL1xuICBkcml2ZXJBZGFwdGVyID0gdW5kZWZpbmVkXG5cbiAgX2RlYnVnID0gZmFsc2VcbiAgLyoqIEB0eXBlIHtCcm93c2VyRHJpdmVyQ29uZmlnIHwgdW5kZWZpbmVkfSAqL1xuICBfZHJpdmVyQ29uZmlnID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7RXJyb3IgfCB1bmRlZmluZWR9ICovXG4gIF9odHRwU2VydmVyRXJyb3IgPSB1bmRlZmluZWRcblxuICAvKiogQHBhcmFtIHtCcm93c2VyQXJnc30gW2FyZ3NdICovXG4gIGNvbnN0cnVjdG9yKHtkZWJ1ZyA9IGZhbHNlLCBkcml2ZXIsIGNvbW11bmljYXRvciwgc2NyZWVuc2hvdHNQYXRoID0gYCR7cHJvY2Vzcy5jd2QoKX0vdG1wL3NjcmVlbnNob3RzYCwgLi4ucmVzdEFyZ3N9ID0ge30pIHtcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGJyb3dzZXIgYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnXG4gICAgdGhpcy5fZHJpdmVyQ29uZmlnID0gZHJpdmVyXG4gICAgdGhpcy5fc2NyZWVuc2hvdHNQYXRoID0gc2NyZWVuc2hvdHNQYXRoXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBjb21tdW5pY2F0b3JcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcihkcml2ZXIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCcm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyQ29uZmlnXVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanNcIikuZGVmYXVsdH1cbiAgICovXG4gIGNyZWF0ZURyaXZlcihkcml2ZXJDb25maWcgPSB7fSkge1xuICAgIGNvbnN0IHt0eXBlID0gXCJzZWxlbml1bVwiLCBvcHRpb25zLCAuLi5yZXN0QXJnc30gPSBkcml2ZXJDb25maWdcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRyaXZlciBhcmdzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJzZWxlbml1bVwiKSB7XG4gICAgICByZXR1cm4gbmV3IFNlbGVuaXVtRHJpdmVyKHticm93c2VyOiB0aGlzLCBvcHRpb25zfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJhcHBpdW1cIikge1xuICAgICAgcmV0dXJuIG5ldyBBcHBpdW1Ecml2ZXIoe2Jyb3dzZXI6IHRoaXMsIG9wdGlvbnN9KVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZHJpdmVyIHR5cGU6ICR7dHlwZX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gY29tbXVuaWNhdG9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Q29tbXVuaWNhdG9yKGNvbW11bmljYXRvcikge1xuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gY29tbXVuaWNhdG9yXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGNvbW11bmljYXRvckV4aXN0cygpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNvbW11bmljYXRvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0QmFzZVNlbGVjdG9yKGJhc2VTZWxlY3RvcikgeyB0aGlzLl9iYXNlU2VsZWN0b3IgPSBiYXNlU2VsZWN0b3IgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBnZXRCYXNlU2VsZWN0b3IoKSB7IHJldHVybiB0aGlzLl9iYXNlU2VsZWN0b3IgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QmFzZVNlbGVjdG9yKCkgPyBgJHt0aGlzLmdldEJhc2VTZWxlY3RvcigpfSAke3NlbGVjdG9yfWAgOiBzZWxlY3RvclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGVidWdFcnJvciguLi5hcmdzKSB7XG4gICAgY29uc29sZS5lcnJvcihcIltCcm93c2VyIGVycm9yXVwiLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGVidWdMb2coLi4uYXJncykge1xuICAgIGlmICh0aGlzLl9kZWJ1Zykge1xuICAgICAgY29uc29sZS5sb2coXCJbQnJvd3NlciBkZWJ1Z11cIiwgLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHRocm93SWZIdHRwU2VydmVyRXJyb3IoKSB7XG4gICAgaWYgKHRoaXMuX2h0dHBTZXJ2ZXJFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIHNlcnZlciBlcnJvcjogJHt0aGlzLl9odHRwU2VydmVyRXJyb3IubWVzc2FnZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uSHR0cFNlcnZlckVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG5cbiAgICB0aGlzLl9odHRwU2VydmVyRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgIGNvbnNvbGUuZXJyb3IoYEhUVFAgc2VydmVyIGVycm9yOiAke2Vycm9yTWVzc2FnZX1gKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyfSAqL1xuICBnZXREcml2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldFdlYkRyaXZlcigpXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcIi4vZHJpdmVycy93ZWJkcml2ZXItZHJpdmVyLmpzXCIpLmRlZmF1bHR9ICovXG4gIGdldERyaXZlckFkYXB0ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kcml2ZXJBZGFwdGVyXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgZ2V0VGltZW91dHMoKSB7IHJldHVybiB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRUaW1lb3V0cygpIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHJlc3RvcmVUaW1lb3V0cygpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5yZXN0b3JlVGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmRyaXZlclNldFRpbWVvdXRzKG5ld1RpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuc2V0VGltZW91dHMobmV3VGltZW91dClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59ICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRCcm93c2VyTG9ncygpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0Q3VycmVudFVybCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0Q3VycmVudFVybCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsaWNrKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5jbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIGltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLldhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLndhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vRWxlbWVudChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgICBmb3VuZCA9IHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3QgdG8gZmluZDogJHtzZWxlY3Rvcn1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRIVE1MKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRIVE1MKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gdGltZW91dE92ZXJyaWRlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRDb21tYW5kVGltZW91dCh0aW1lb3V0T3ZlcnJpZGUpIHtcbiAgICBpZiAodGltZW91dE92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aW1lb3V0T3ZlcnJpZGVcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJWaXNpdChwYXRoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZHJpdmVyVmlzaXQocGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJOYXZpZ2F0aW9uQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2VuZEJyb3dzZXJDb21tYW5kKHR5cGUsIHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb21tdW5pY2F0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW11bmljYXRvciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSBzZW5kaW5nIGJyb3dzZXIgY29tbWFuZCAke3R5cGV9OiAke3BhdGh9YH0sXG4gICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmNvbW11bmljYXRvci5zZW5kQ29tbWFuZCh7dHlwZSwgcGF0aH0pXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIHBhdGggdXNpbmcgdGhlIGluamVjdGVkIGJyb3dzZXIgaGVscGVyIHdoZW4gYXZhaWxhYmxlLCBvdGhlcndpc2UgbmF2aWdhdGVzIGRpcmVjdGx5IHdpdGggdGhlIGRyaXZlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtCcm93c2VyTmF2aWdhdGlvbkFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHZpc2l0KHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICh0aGlzLmNvbW11bmljYXRvckV4aXN0cygpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRCcm93c2VyQ29tbWFuZChcInZpc2l0XCIsIHBhdGgsIGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgdmlzaXRpbmcgcGF0aDogJHtwYXRofWB9LFxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHBhdGgpXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0byBhIHBhdGggdmlhIHRoZSBpbmplY3RlZCBicm93c2VyIGhlbHBlciB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG5hdmlnYXRlcyBkaXJlY3RseSB3aXRoIHRoZSBkcml2ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkaXNtaXNzVG8ocGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuY29tbXVuaWNhdG9yRXhpc3RzKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEJyb3dzZXJDb21tYW5kKFwiZGlzbWlzc1RvXCIsIHBhdGgsIGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgZGlzbWlzc2luZyB0byBwYXRoOiAke3BhdGh9YH0sXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocGF0aClcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBicm93c2VyIGxvZ3MgZm9yIGNvbnNvbGUgb3V0cHV0IGFuZCB0cnVuY2F0ZXMgb3Zlcmx5IGxvbmcgb3V0cHV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBsb2dzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4TGluZXNdXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZvcm1hdEJyb3dzZXJMb2dzRm9yQ29uc29sZShsb2dzLCBtYXhMaW5lcyA9IDIwMCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsb2dzKSB8fCBsb2dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtcIihubyBicm93c2VyIGxvZ3MpXCJdXG4gICAgfVxuXG4gICAgaWYgKGxvZ3MubGVuZ3RoIDw9IG1heExpbmVzKSB7XG4gICAgICByZXR1cm4gbG9nc1xuICAgIH1cblxuICAgIGNvbnN0IGtlcHRMb2dzID0gbG9ncy5zbGljZShsb2dzLmxlbmd0aCAtIG1heExpbmVzKVxuICAgIGNvbnN0IGhpZGRlbkNvdW50ID0gbG9ncy5sZW5ndGggLSBtYXhMaW5lc1xuXG4gICAgcmV0dXJuIFtgKHNob3dpbmcgbGFzdCAke21heExpbmVzfSBvZiAke2xvZ3MubGVuZ3RofSBicm93c2VyIGxvZ3MsICR7aGlkZGVuQ291bnR9IG9taXR0ZWQpYCwgLi4ua2VwdExvZ3NdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbG9nc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHByaW50QnJvd3NlckxvZ3NGb3JGYWlsdXJlKGxvZ3MpIHtcbiAgICBjb25zb2xlLmxvZyhcIkJyb3dzZXIgbG9nczpcIilcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLmZvcm1hdEJyb3dzZXJMb2dzRm9yQ29uc29sZShsb2dzKSkge1xuICAgICAgY29uc29sZS5sb2cobGluZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBzY3JlZW5zaG90LCB3cml0ZXMgSFRNTC9icm93c2VyIGxvZ3MgdG8gZGlzaywgYW5kIHJldHVybnMgdGhlIGNvbGxlY3RlZCBhcnRpZmFjdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjdXJyZW50VXJsOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgaHRtbFBhdGg6IHN0cmluZywgbG9nczogc3RyaW5nW10sIGxvZ3NQYXRoOiBzdHJpbmcsIHNjcmVlbnNob3RQYXRoOiBzdHJpbmd9Pn1cbiAgICovXG4gIGFzeW5jIHRha2VTY3JlZW5zaG90KCkge1xuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIHBhdGggZm9yIHNjcmVlbnNob3RzXCIpXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3NjcmVlbnNob3RzUGF0aFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhgQ3JlYXRpbmcgZGlyIHdpdGggcmVjdXJzaXZlOiAke3BhdGh9YClcbiAgICBhd2FpdCBmcy5ta2RpcihwYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSlcblxuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIHNjcmVlbnNob3QgaW1hZ2UgY29udGVudFwiKVxuICAgIGNvbnN0IGltYWdlQ29udGVudCA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHRha2luZyBzY3JlZW5zaG90XCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50YWtlU2NyZWVuc2hvdCgpKVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdlbmVyYXRpbmcgZGF0ZSB2YXJpYWJsZXNcIilcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3QgdGltZXN0YW1wID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERC1ISC1NTS1TU1wiKVxuICAgIGNvbnN0IHNjcmVlbnNob3RQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9LnBuZ2BcbiAgICBjb25zdCBodG1sUGF0aCA9IGAke3BhdGh9LyR7dGltZXN0YW1wfS5odG1sYFxuICAgIGNvbnN0IGxvZ3NQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9LmxvZ3MudHh0YFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdldHRpbmcgYnJvd3NlciBsb2dzXCIpXG4gICAgY29uc3QgbG9ncyA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHJlYWRpbmcgYnJvd3NlciBsb2dzXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCkpXG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHJlYWRpbmcgcGFnZSBIVE1MXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldEhUTUwoKSlcbiAgICBjb25zdCBodG1sUHJldHR5ID0gcHJldHRpZnkoaHRtbClcbiAgICB0aGlzLnByaW50QnJvd3NlckxvZ3NGb3JGYWlsdXJlKGxvZ3MpXG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiV3JpdGluZyBmaWxlc1wiKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShodG1sUGF0aCwgaHRtbFByZXR0eSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9nc1BhdGgsIGxvZ3Muam9pbihcIlxcblwiKSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoc2NyZWVuc2hvdFBhdGgsIGltYWdlQ29udGVudCwgXCJiYXNlNjRcIilcblxuICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKVxuXG4gICAgY29uc29sZS5sb2coXCJDdXJyZW50IFVSTDpcIiwgY3VycmVudFVybClcbiAgICBjb25zb2xlLmxvZyhcIkxvZ3M6XCIsIGxvZ3NQYXRoKVxuICAgIGNvbnNvbGUubG9nKFwiU2NyZWVuc2hvdDpcIiwgc2NyZWVuc2hvdFBhdGgpXG4gICAgY29uc29sZS5sb2coXCJIVE1MOlwiLCBodG1sUGF0aClcblxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VXJsLFxuICAgICAgaHRtbCxcbiAgICAgIGh0bWxQYXRoLFxuICAgICAgbG9ncyxcbiAgICAgIGxvZ3NQYXRoLFxuICAgICAgc2NyZWVuc2hvdFBhdGhcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0b3BEcml2ZXIoKSB7XG4gICAgaWYgKHRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgYXdhaXQgdGhpcy5kcml2ZXJBZGFwdGVyLnN0b3AoKVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @param {string[]} argv
3
+ * @returns {{_: string[], flags: Record<string, any>}}
4
+ */
5
+ export function parseArgv(argv: string[]): {
6
+ _: string[];
7
+ flags: Record<string, any>;
8
+ };
9
+ /**
10
+ * @param {Record<string, any>} flags
11
+ * @returns {{command: string, args: Record<string, any>}}
12
+ */
13
+ export function resolveBrowserCommand(flags: Record<string, any>): {
14
+ command: string;
15
+ args: Record<string, any>;
16
+ };
@@ -0,0 +1,177 @@
1
+ /**
2
+ * @param {string[]} argv
3
+ * @returns {{_: string[], flags: Record<string, any>}}
4
+ */
5
+ export function parseArgv(argv) {
6
+ const result = { _: [], flags: {} };
7
+ const setFlag = (key, value) => {
8
+ if (!(key in result.flags)) {
9
+ result.flags[key] = value;
10
+ return;
11
+ }
12
+ if (!Array.isArray(result.flags[key])) {
13
+ result.flags[key] = [result.flags[key]];
14
+ }
15
+ result.flags[key].push(value);
16
+ };
17
+ for (let index = 0; index < argv.length; index++) {
18
+ const value = argv[index];
19
+ if (!value.startsWith("--")) {
20
+ result._.push(value);
21
+ continue;
22
+ }
23
+ const flag = value.slice(2);
24
+ if (flag.includes("=")) {
25
+ const [key, ...rest] = flag.split("=");
26
+ setFlag(key, rest.join("="));
27
+ continue;
28
+ }
29
+ const nextValue = argv[index + 1];
30
+ if (nextValue && !nextValue.startsWith("--")) {
31
+ setFlag(flag, nextValue);
32
+ index += 1;
33
+ }
34
+ else {
35
+ setFlag(flag, true);
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ /**
41
+ * Parses a CLI timeout flag into milliseconds.
42
+ * Bare numeric values are treated as seconds for CLI ergonomics.
43
+ * @param {any} timeoutFlag
44
+ * @returns {number | undefined}
45
+ */
46
+ function resolveCliTimeout(timeoutFlag) {
47
+ if (timeoutFlag === undefined) {
48
+ return undefined;
49
+ }
50
+ if (typeof timeoutFlag === "number") {
51
+ return timeoutFlag * 1000;
52
+ }
53
+ const timeoutString = String(timeoutFlag).trim();
54
+ if (/^\d+(\.\d+)?ms$/i.test(timeoutString)) {
55
+ return Number(timeoutString.slice(0, -2));
56
+ }
57
+ if (/^\d+(\.\d+)?s$/i.test(timeoutString)) {
58
+ return Number(timeoutString.slice(0, -1)) * 1000;
59
+ }
60
+ if (/^\d+(\.\d+)?$/.test(timeoutString)) {
61
+ return Number(timeoutString) * 1000;
62
+ }
63
+ throw new Error(`Invalid timeout flag: ${timeoutFlag}`);
64
+ }
65
+ /**
66
+ * @param {Record<string, any>} flags
67
+ * @returns {{command: string, args: Record<string, any>}}
68
+ */
69
+ export function resolveBrowserCommand(flags) {
70
+ const timeout = resolveCliTimeout(flags.timeout);
71
+ if (flags.visit) {
72
+ const args = { url: flags.visit };
73
+ if (timeout !== undefined) {
74
+ args.timeout = timeout;
75
+ }
76
+ return { args, command: "visit" };
77
+ }
78
+ if (flags["dismiss-to"]) {
79
+ const args = { path: flags["dismiss-to"] };
80
+ if (timeout !== undefined) {
81
+ args.timeout = timeout;
82
+ }
83
+ return { args, command: "dismissTo" };
84
+ }
85
+ if (flags["find-by-test-id"]) {
86
+ return {
87
+ args: {
88
+ testID: flags["find-by-test-id"],
89
+ timeout,
90
+ useBaseSelector: flags["use-base-selector"],
91
+ visible: flags.visible
92
+ },
93
+ command: "findByTestID"
94
+ };
95
+ }
96
+ if (flags.find) {
97
+ return {
98
+ args: {
99
+ selector: flags.find,
100
+ timeout,
101
+ useBaseSelector: flags["use-base-selector"],
102
+ visible: flags.visible
103
+ },
104
+ command: "find"
105
+ };
106
+ }
107
+ if (flags.click) {
108
+ return {
109
+ args: {
110
+ selector: flags.click,
111
+ timeout,
112
+ useBaseSelector: flags["use-base-selector"],
113
+ visible: flags.visible
114
+ },
115
+ command: "click"
116
+ };
117
+ }
118
+ if (flags["wait-for-no-selector"]) {
119
+ return {
120
+ args: {
121
+ selector: flags["wait-for-no-selector"],
122
+ timeout,
123
+ useBaseSelector: flags["use-base-selector"]
124
+ },
125
+ command: "waitForNoSelector"
126
+ };
127
+ }
128
+ if (flags["expect-no-element"]) {
129
+ return {
130
+ args: {
131
+ selector: flags["expect-no-element"],
132
+ timeout,
133
+ useBaseSelector: flags["use-base-selector"]
134
+ },
135
+ command: "expectNoElement"
136
+ };
137
+ }
138
+ if (flags["set-base-selector"]) {
139
+ return { args: { selector: flags["set-base-selector"] }, command: "setBaseSelector" };
140
+ }
141
+ if (flags["get-html"]) {
142
+ return { args: {}, command: "getHTML" };
143
+ }
144
+ if (flags["get-browser-logs"]) {
145
+ return { args: {}, command: "getBrowserLogs" };
146
+ }
147
+ if (flags["get-current-url"]) {
148
+ return { args: {}, command: "getCurrentUrl" };
149
+ }
150
+ if (flags["take-screenshot"]) {
151
+ return { args: {}, command: "takeScreenshot" };
152
+ }
153
+ if (flags.command) {
154
+ const args = {};
155
+ if (flags.url)
156
+ args.url = flags.url;
157
+ if (flags.path)
158
+ args.path = flags.path;
159
+ if (flags.selector)
160
+ args.selector = flags.selector;
161
+ if (flags["test-id"])
162
+ args.testID = flags["test-id"];
163
+ if (flags.method)
164
+ args.methodName = flags.method;
165
+ if (flags.arg)
166
+ args.args = Array.isArray(flags.arg) ? flags.arg : [flags.arg];
167
+ if (timeout !== undefined)
168
+ args.timeout = timeout;
169
+ if (flags.visible !== undefined)
170
+ args.visible = flags.visible;
171
+ if (flags["use-base-selector"] !== undefined)
172
+ args.useBaseSelector = flags["use-base-selector"];
173
+ return { args, command: flags.command };
174
+ }
175
+ throw new Error("No browser command was given");
176
+ }
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWhlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFJO0lBQzVCLE1BQU0sTUFBTSxHQUFHLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFDLENBQUE7SUFDakMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDN0IsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFBO1lBQ3pCLE9BQU07UUFDUixDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN6QyxDQUFDO1FBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDL0IsQ0FBQyxDQUFBO0lBRUQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMs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QUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3ZcbiAqIEByZXR1cm5zIHt7Xzogc3RyaW5nW10sIGZsYWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXJndihhcmd2KSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtfOiBbXSwgZmxhZ3M6IHt9fVxuICBjb25zdCBzZXRGbGFnID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICBpZiAoIShrZXkgaW4gcmVzdWx0LmZsYWdzKSkge1xuICAgICAgcmVzdWx0LmZsYWdzW2tleV0gPSB2YWx1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3VsdC5mbGFnc1trZXldKSkge1xuICAgICAgcmVzdWx0LmZsYWdzW2tleV0gPSBbcmVzdWx0LmZsYWdzW2tleV1dXG4gICAgfVxuXG4gICAgcmVzdWx0LmZsYWdzW2tleV0ucHVzaCh2YWx1ZSlcbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcmd2Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHZhbHVlID0gYXJndltpbmRleF1cblxuICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICByZXN1bHQuXy5wdXNoKHZhbHVlKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBmbGFnID0gdmFsdWUuc2xpY2UoMilcblxuICAgIGlmIChmbGFnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBmbGFnLnNwbGl0KFwiPVwiKVxuXG4gICAgICBzZXRGbGFnKGtleSwgcmVzdC5qb2luKFwiPVwiKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFZhbHVlID0gYXJndltpbmRleCArIDFdXG5cbiAgICBpZiAobmV4dFZhbHVlICYmICFuZXh0VmFsdWUuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICBzZXRGbGFnKGZsYWcsIG5leHRWYWx1ZSlcbiAgICAgIGluZGV4ICs9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RmxhZyhmbGFnLCB0cnVlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBDTEkgdGltZW91dCBmbGFnIGludG8gbWlsbGlzZWNvbmRzLlxuICogQmFyZSBudW1lcmljIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBzZWNvbmRzIGZvciBDTEkgZXJnb25vbWljcy5cbiAqIEBwYXJhbSB7YW55fSB0aW1lb3V0RmxhZ1xuICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUNsaVRpbWVvdXQodGltZW91dEZsYWcpIHtcbiAgaWYgKHRpbWVvdXRGbGFnID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBpZiAodHlwZW9mIHRpbWVvdXRGbGFnID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHRpbWVvdXRGbGFnICogMTAwMFxuICB9XG5cbiAgY29uc3QgdGltZW91dFN0cmluZyA9IFN0cmluZyh0aW1lb3V0RmxhZykudHJpbSgpXG5cbiAgaWYgKC9eXFxkKyhcXC5cXGQrKT9tcyQvaS50ZXN0KHRpbWVvdXRTdHJpbmcpKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aW1lb3V0U3RyaW5nLnNsaWNlKDAsIC0yKSlcbiAgfVxuXG4gIGlmICgvXlxcZCsoXFwuXFxkKyk/cyQvaS50ZXN0KHRpbWVvdXRTdHJpbmcpKSB7XG4gICAgcmV0dXJuIE51bWJlcih0aW1lb3V0U3RyaW5nLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gIH1cblxuICBpZiAoL15cXGQrKFxcLlxcZCspPyQvLnRlc3QodGltZW91dFN0cmluZykpIHtcbiAgICByZXR1cm4gTnVtYmVyKHRpbWVvdXRTdHJpbmcpICogMTAwMFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRpbWVvdXQgZmxhZzogJHt0aW1lb3V0RmxhZ31gKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZmxhZ3NcbiAqIEByZXR1cm5zIHt7Y29tbWFuZDogc3RyaW5nLCBhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCcm93c2VyQ29tbWFuZChmbGFncykge1xuICBjb25zdCB0aW1lb3V0ID0gcmVzb2x2ZUNsaVRpbWVvdXQoZmxhZ3MudGltZW91dClcblxuICBpZiAoZmxhZ3MudmlzaXQpIHtcbiAgICBjb25zdCBhcmdzID0ge3VybDogZmxhZ3MudmlzaXR9XG5cbiAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgcmV0dXJuIHthcmdzLCBjb21tYW5kOiBcInZpc2l0XCJ9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJkaXNtaXNzLXRvXCJdKSB7XG4gICAgY29uc3QgYXJncyA9IHtwYXRoOiBmbGFnc1tcImRpc21pc3MtdG9cIl19XG5cbiAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgcmV0dXJuIHthcmdzLCBjb21tYW5kOiBcImRpc21pc3NUb1wifVxuICB9XG5cbiAgaWYgKGZsYWdzW1wiZmluZC1ieS10ZXN0LWlkXCJdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgdGVzdElEOiBmbGFnc1tcImZpbmQtYnktdGVzdC1pZFwiXSxcbiAgICAgICAgdGltZW91dCxcbiAgICAgICAgdXNlQmFzZVNlbGVjdG9yOiBmbGFnc1tcInVzZS1iYXNlLXNlbGVjdG9yXCJdLFxuICAgICAgICB2aXNpYmxlOiBmbGFncy52aXNpYmxlXG4gICAgICB9LFxuICAgICAgY29tbWFuZDogXCJmaW5kQnlUZXN0SURcIlxuICAgIH1cbiAgfVxuXG4gIGlmIChmbGFncy5maW5kKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgc2VsZWN0b3I6IGZsYWdzLmZpbmQsXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIHVzZUJhc2VTZWxlY3RvcjogZmxhZ3NbXCJ1c2UtYmFzZS1zZWxlY3RvclwiXSxcbiAgICAgICAgdmlzaWJsZTogZmxhZ3MudmlzaWJsZVxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IFwiZmluZFwiXG4gICAgfVxuICB9XG5cbiAgaWYgKGZsYWdzLmNsaWNrKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgc2VsZWN0b3I6IGZsYWdzLmNsaWNrLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgICB1c2VCYXNlU2VsZWN0b3I6IGZsYWdzW1widXNlLWJhc2Utc2VsZWN0b3JcIl0sXG4gICAgICAgIHZpc2libGU6IGZsYWdzLnZpc2libGVcbiAgICAgIH0sXG4gICAgICBjb21tYW5kOiBcImNsaWNrXCJcbiAgICB9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJ3YWl0LWZvci1uby1zZWxlY3RvclwiXSkge1xuICAgIHJldHVybiB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIHNlbGVjdG9yOiBmbGFnc1tcIndhaXQtZm9yLW5vLXNlbGVjdG9yXCJdLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgICB1c2VCYXNlU2VsZWN0b3I6IGZsYWdzW1widXNlLWJhc2Utc2VsZWN0b3JcIl1cbiAgICAgIH0sXG4gICAgICBjb21tYW5kOiBcIndhaXRGb3JOb1NlbGVjdG9yXCJcbiAgICB9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJleHBlY3Qtbm8tZWxlbWVudFwiXSkge1xuICAgIHJldHVybiB7XG4gICAgICBhcmdzOiB7XG4gICAgICAgIHNlbGVjdG9yOiBmbGFnc1tcImV4cGVjdC1uby1lbGVtZW50XCJdLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgICB1c2VCYXNlU2VsZWN0b3I6IGZsYWdzW1widXNlLWJhc2Utc2VsZWN0b3JcIl1cbiAgICAgIH0sXG4gICAgICBjb21tYW5kOiBcImV4cGVjdE5vRWxlbWVudFwiXG4gICAgfVxuICB9XG5cbiAgaWYgKGZsYWdzW1wic2V0LWJhc2Utc2VsZWN0b3JcIl0pIHtcbiAgICByZXR1cm4ge2FyZ3M6IHtzZWxlY3RvcjogZmxhZ3NbXCJzZXQtYmFzZS1zZWxlY3RvclwiXX0sIGNvbW1hbmQ6IFwic2V0QmFzZVNlbGVjdG9yXCJ9XG4gIH1cblxuICBpZiAoZmxhZ3NbXCJnZXQtaHRtbFwiXSkge1xuICAgIHJldHVybiB7YXJnczoge30sIGNvbW1hbmQ6IFwiZ2V0SFRNTFwifVxuICB9XG5cbiAgaWYgKGZsYWdzW1wiZ2V0LWJyb3dzZXItbG9nc1wiXSkge1xuICAgIHJldHVybiB7YXJnczoge30sIGNvbW1hbmQ6IFwiZ2V0QnJvd3NlckxvZ3NcIn1cbiAgfVxuXG4gIGlmIChmbGFnc1tcImdldC1jdXJyZW50LXVybFwiXSkge1xuICAgIHJldHVybiB7YXJnczoge30sIGNvbW1hbmQ6IFwiZ2V0Q3VycmVudFVybFwifVxuICB9XG5cbiAgaWYgKGZsYWdzW1widGFrZS1zY3JlZW5zaG90XCJdKSB7XG4gICAgcmV0dXJuIHthcmdzOiB7fSwgY29tbWFuZDogXCJ0YWtlU2NyZWVuc2hvdFwifVxuICB9XG5cbiAgaWYgKGZsYWdzLmNvbW1hbmQpIHtcbiAgICBjb25zdCBhcmdzID0ge31cblxuICAgIGlmIChmbGFncy51cmwpIGFyZ3MudXJsID0gZmxhZ3MudXJsXG4gICAgaWYgKGZsYWdzLnBhdGgpIGFyZ3MucGF0aCA9IGZsYWdzLnBhdGhcbiAgICBpZiAoZmxhZ3Muc2VsZWN0b3IpIGFyZ3Muc2VsZWN0b3IgPSBmbGFncy5zZWxlY3RvclxuICAgIGlmIChmbGFnc1tcInRlc3QtaWRcIl0pIGFyZ3MudGVzdElEID0gZmxhZ3NbXCJ0ZXN0LWlkXCJdXG4gICAgaWYgKGZsYWdzLm1ldGhvZCkgYXJncy5tZXRob2ROYW1lID0gZmxhZ3MubWV0aG9kXG4gICAgaWYgKGZsYWdzLmFyZykgYXJncy5hcmdzID0gQXJyYXkuaXNBcnJheShmbGFncy5hcmcpID8gZmxhZ3MuYXJnIDogW2ZsYWdzLmFyZ11cbiAgICBpZiAodGltZW91dCAhPT0gdW5kZWZpbmVkKSBhcmdzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgaWYgKGZsYWdzLnZpc2libGUgIT09IHVuZGVmaW5lZCkgYXJncy52aXNpYmxlID0gZmxhZ3MudmlzaWJsZVxuICAgIGlmIChmbGFnc1tcInVzZS1iYXNlLXNlbGVjdG9yXCJdICE9PSB1bmRlZmluZWQpIGFyZ3MudXNlQmFzZVNlbGVjdG9yID0gZmxhZ3NbXCJ1c2UtYmFzZS1zZWxlY3RvclwiXVxuXG4gICAgcmV0dXJuIHthcmdzLCBjb21tYW5kOiBmbGFncy5jb21tYW5kfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiTm8gYnJvd3NlciBjb21tYW5kIHdhcyBnaXZlblwiKVxufVxuIl19
package/build/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};