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,16 @@
1
+ /**
2
+ * Expo Router integration for system testing.
3
+ * @param {object} options
4
+ * @param {import("./system-test-browser-helper.js").default} [options.browserHelper]
5
+ * @param {function() : void} [options.onFirstInitialize]
6
+ * @param {function() : void} [options.onInitialize]
7
+ * @returns {{enabled: boolean, systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null}}
8
+ */
9
+ export default function useSystemTestExpo({ browserHelper, onFirstInitialize, onInitialize, ...restArgs }?: {
10
+ browserHelper?: import("./system-test-browser-helper.js").default;
11
+ onFirstInitialize?: () => void;
12
+ onInitialize?: () => void;
13
+ }): {
14
+ enabled: boolean;
15
+ systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null;
16
+ };
@@ -0,0 +1,34 @@
1
+ import { useRouter } from "expo-router";
2
+ import useSystemTest from "./use-system-test.js";
3
+ /**
4
+ * Expo Router integration for system testing.
5
+ * @param {object} options
6
+ * @param {import("./system-test-browser-helper.js").default} [options.browserHelper]
7
+ * @param {function() : void} [options.onFirstInitialize]
8
+ * @param {function() : void} [options.onInitialize]
9
+ * @returns {{enabled: boolean, systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null}}
10
+ */
11
+ export default function useSystemTestExpo({ browserHelper, onFirstInitialize, onInitialize, ...restArgs } = { browserHelper: undefined, onFirstInitialize: undefined, onInitialize: undefined }) {
12
+ const router = useRouter();
13
+ const restArgsKeys = Object.keys(restArgs);
14
+ if (restArgsKeys.length > 0) {
15
+ throw new Error(`Unknown arguments given to useSystemTestExpo: ${restArgsKeys.join(", ")}`);
16
+ }
17
+ return useSystemTest({
18
+ browserHelper,
19
+ onDismissTo: ({ path }) => {
20
+ try {
21
+ router.dismissTo(path);
22
+ }
23
+ catch (error) {
24
+ console.error(`Failed to dismiss to path "${path}": ${error instanceof Error ? error.message : error}`);
25
+ }
26
+ },
27
+ onFirstInitialize,
28
+ onInitialize,
29
+ onNavigate: ({ path }) => {
30
+ router.navigate(path);
31
+ }
32
+ });
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXN5c3RlbS10ZXN0LWV4cG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXNlLXN5c3RlbS10ZXN0LWV4cG8uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUNyQyxPQUFPLGFBQWEsTUFBTSxzQkFBc0IsQ0FBQTtBQUVoRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxpQkFBaUIsQ0FBQyxFQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsR0FBRyxRQUFRLEVBQUMsR0FBRyxFQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUM7SUFDekwsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUE7SUFDMUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUUxQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVELE9BQU8sYUFBYSxDQUFDO1FBQ25CLGFBQWE7UUFDYixXQUFXLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUU7WUFDdEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDeEIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxNQUFNLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDekcsQ0FBQztRQUNILENBQUM7UUFDRCxpQkFBaUI7UUFDakIsWUFBWTtRQUNaLFVBQVUsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRTtZQUNyQixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3ZCLENBQUM7S0FDRixDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt1c2VSb3V0ZXJ9IGZyb20gXCJleHBvLXJvdXRlclwiXG5pbXBvcnQgdXNlU3lzdGVtVGVzdCBmcm9tIFwiLi91c2Utc3lzdGVtLXRlc3QuanNcIlxuXG4vKipcbiAqIEV4cG8gUm91dGVyIGludGVncmF0aW9uIGZvciBzeXN0ZW0gdGVzdGluZy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanNcIikuZGVmYXVsdH0gW29wdGlvbnMuYnJvd3NlckhlbHBlcl1cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IFtvcHRpb25zLm9uRmlyc3RJbml0aWFsaXplXVxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogdm9pZH0gW29wdGlvbnMub25Jbml0aWFsaXplXVxuICogQHJldHVybnMge3tlbmFibGVkOiBib29sZWFuLCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcjogaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC1icm93c2VyLWhlbHBlci5qc1wiKS5kZWZhdWx0IHwgbnVsbH19XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVN5c3RlbVRlc3RFeHBvKHticm93c2VySGVscGVyLCBvbkZpcnN0SW5pdGlhbGl6ZSwgb25Jbml0aWFsaXplLCAuLi5yZXN0QXJnc30gPSB7YnJvd3NlckhlbHBlcjogdW5kZWZpbmVkLCBvbkZpcnN0SW5pdGlhbGl6ZTogdW5kZWZpbmVkLCBvbkluaXRpYWxpemU6IHVuZGVmaW5lZH0pIHtcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKClcbiAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50cyBnaXZlbiB0byB1c2VTeXN0ZW1UZXN0RXhwbzogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICByZXR1cm4gdXNlU3lzdGVtVGVzdCh7XG4gICAgYnJvd3NlckhlbHBlcixcbiAgICBvbkRpc21pc3NUbzogKHtwYXRofSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcm91dGVyLmRpc21pc3NUbyhwYXRoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGRpc21pc3MgdG8gcGF0aCBcIiR7cGF0aH1cIjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWApXG4gICAgICB9XG4gICAgfSxcbiAgICBvbkZpcnN0SW5pdGlhbGl6ZSxcbiAgICBvbkluaXRpYWxpemUsXG4gICAgb25OYXZpZ2F0ZTogKHtwYXRofSkgPT4ge1xuICAgICAgcm91dGVyLm5hdmlnYXRlKHBhdGgpXG4gICAgfVxuICB9KVxufVxuIl19
@@ -0,0 +1,25 @@
1
+ /**
2
+ * React Native integration point for system testing without Expo Router.
3
+ * Supply runtime-specific navigation callbacks.
4
+ * @param {object} options
5
+ * @param {import("./system-test-browser-helper.js").default} [options.browserHelper]
6
+ * @param {(args: {path: string}) => void} [options.onDismissTo]
7
+ * @param {function() : void} [options.onFirstInitialize]
8
+ * @param {function() : void} [options.onInitialize]
9
+ * @param {(args: {path: string}) => void} [options.onNavigate]
10
+ * @returns {{enabled: boolean, systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null}}
11
+ */
12
+ export default function useSystemTestReactNative({ browserHelper, onDismissTo, onFirstInitialize, onInitialize, onNavigate, ...restArgs }?: {
13
+ browserHelper?: import("./system-test-browser-helper.js").default;
14
+ onDismissTo?: (args: {
15
+ path: string;
16
+ }) => void;
17
+ onFirstInitialize?: () => void;
18
+ onInitialize?: () => void;
19
+ onNavigate?: (args: {
20
+ path: string;
21
+ }) => void;
22
+ }): {
23
+ enabled: boolean;
24
+ systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null;
25
+ };
@@ -0,0 +1,20 @@
1
+ import useSystemTest from "./use-system-test.js";
2
+ /**
3
+ * React Native integration point for system testing without Expo Router.
4
+ * Supply runtime-specific navigation callbacks.
5
+ * @param {object} options
6
+ * @param {import("./system-test-browser-helper.js").default} [options.browserHelper]
7
+ * @param {(args: {path: string}) => void} [options.onDismissTo]
8
+ * @param {function() : void} [options.onFirstInitialize]
9
+ * @param {function() : void} [options.onInitialize]
10
+ * @param {(args: {path: string}) => void} [options.onNavigate]
11
+ * @returns {{enabled: boolean, systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null}}
12
+ */
13
+ export default function useSystemTestReactNative({ browserHelper, onDismissTo, onFirstInitialize, onInitialize, onNavigate, ...restArgs } = { browserHelper: undefined, onDismissTo: undefined, onFirstInitialize: undefined, onInitialize: undefined, onNavigate: undefined }) {
14
+ const restArgsKeys = Object.keys(restArgs);
15
+ if (restArgsKeys.length > 0) {
16
+ throw new Error(`Unknown arguments given to useSystemTestReactNative: ${restArgsKeys.join(", ")}`);
17
+ }
18
+ return useSystemTest({ browserHelper, onDismissTo, onFirstInitialize, onInitialize, onNavigate });
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXN5c3RlbS10ZXN0LXJlYWN0LW5hdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91c2Utc3lzdGVtLXRlc3QtcmVhY3QtbmF0aXZlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sYUFBYSxNQUFNLHNCQUFzQixDQUFBO0FBRWhEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsT0FBTyxVQUFVLHdCQUF3QixDQUFDLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsRUFBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQztJQUN4USxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTFDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNwRyxDQUFDO0lBRUQsT0FBTyxhQUFhLENBQUMsRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0FBQ2pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdXNlU3lzdGVtVGVzdCBmcm9tIFwiLi91c2Utc3lzdGVtLXRlc3QuanNcIlxuXG4vKipcbiAqIFJlYWN0IE5hdGl2ZSBpbnRlZ3JhdGlvbiBwb2ludCBmb3Igc3lzdGVtIHRlc3Rpbmcgd2l0aG91dCBFeHBvIFJvdXRlci5cbiAqIFN1cHBseSBydW50aW1lLXNwZWNpZmljIG5hdmlnYXRpb24gY2FsbGJhY2tzLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC1icm93c2VyLWhlbHBlci5qc1wiKS5kZWZhdWx0fSBbb3B0aW9ucy5icm93c2VySGVscGVyXVxuICogQHBhcmFtIHsoYXJnczoge3BhdGg6IHN0cmluZ30pID0+IHZvaWR9IFtvcHRpb25zLm9uRGlzbWlzc1RvXVxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogdm9pZH0gW29wdGlvbnMub25GaXJzdEluaXRpYWxpemVdXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBbb3B0aW9ucy5vbkluaXRpYWxpemVdXG4gKiBAcGFyYW0geyhhcmdzOiB7cGF0aDogc3RyaW5nfSkgPT4gdm9pZH0gW29wdGlvbnMub25OYXZpZ2F0ZV1cbiAqIEByZXR1cm5zIHt7ZW5hYmxlZDogYm9vbGVhbiwgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IGltcG9ydChcIi4vc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanNcIikuZGVmYXVsdCB8IG51bGx9fVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTeXN0ZW1UZXN0UmVhY3ROYXRpdmUoe2Jyb3dzZXJIZWxwZXIsIG9uRGlzbWlzc1RvLCBvbkZpcnN0SW5pdGlhbGl6ZSwgb25Jbml0aWFsaXplLCBvbk5hdmlnYXRlLCAuLi5yZXN0QXJnc30gPSB7YnJvd3NlckhlbHBlcjogdW5kZWZpbmVkLCBvbkRpc21pc3NUbzogdW5kZWZpbmVkLCBvbkZpcnN0SW5pdGlhbGl6ZTogdW5kZWZpbmVkLCBvbkluaXRpYWxpemU6IHVuZGVmaW5lZCwgb25OYXZpZ2F0ZTogdW5kZWZpbmVkfSkge1xuICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzIGdpdmVuIHRvIHVzZVN5c3RlbVRlc3RSZWFjdE5hdGl2ZTogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICByZXR1cm4gdXNlU3lzdGVtVGVzdCh7YnJvd3NlckhlbHBlciwgb25EaXNtaXNzVG8sIG9uRmlyc3RJbml0aWFsaXplLCBvbkluaXRpYWxpemUsIG9uTmF2aWdhdGV9KVxufVxuIl19
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @param {Record<string, any>} props
3
+ * @returns {UseSystemTestShapeHook}
4
+ */
5
+ export function useSystemTestShapeHook(props: Record<string, any>): UseSystemTestShapeHook;
6
+ /** Shared shape-hook state container for `useSystemTest*` hooks. */
7
+ export default class UseSystemTestShapeHook extends ShapeHook {
8
+ static defaultProps: {
9
+ browserHelper: any;
10
+ enabled: boolean;
11
+ onDismissTo: any;
12
+ onFirstInitialize: any;
13
+ onInitialize: any;
14
+ onNavigate: any;
15
+ };
16
+ /** @returns {SystemTestBrowserHelper | null} */
17
+ systemTestBrowserHelper(): SystemTestBrowserHelper | null;
18
+ /** @returns {{enabled: boolean, systemTestBrowserHelper: SystemTestBrowserHelper | null}} */
19
+ result(): {
20
+ enabled: boolean;
21
+ systemTestBrowserHelper: SystemTestBrowserHelper | null;
22
+ };
23
+ /** @returns {void} */
24
+ setup(): void;
25
+ /** @param {{path: string}} args */
26
+ onSystemTestBrowserHelperDismissTo: ({ path }: {
27
+ path: string;
28
+ }) => void;
29
+ /** @param {{path: string}} args */
30
+ onSystemTestBrowserHelperNavigate: ({ path }: {
31
+ path: string;
32
+ }) => void;
33
+ }
34
+ import { ShapeHook } from "set-state-compare";
35
+ import SystemTestBrowserHelper from "./system-test-browser-helper.js";
@@ -0,0 +1,74 @@
1
+ import { ShapeHook, useShapeHook } from "set-state-compare";
2
+ import { useEffect } from "react";
3
+ import SystemTestBrowserHelper from "./system-test-browser-helper.js";
4
+ const shared = {
5
+ defaultSystemTestBrowserHelper: null
6
+ };
7
+ /** Shared shape-hook state container for `useSystemTest*` hooks. */
8
+ class UseSystemTestShapeHook extends ShapeHook {
9
+ constructor() {
10
+ super(...arguments);
11
+ /** @param {{path: string}} args */
12
+ this.onSystemTestBrowserHelperDismissTo = ({ path }) => {
13
+ if (!this.p.enabled || !this.p.onDismissTo) {
14
+ return;
15
+ }
16
+ this.p.onDismissTo({ path });
17
+ };
18
+ /** @param {{path: string}} args */
19
+ this.onSystemTestBrowserHelperNavigate = ({ path }) => {
20
+ if (!this.p.enabled || !this.p.onNavigate) {
21
+ return;
22
+ }
23
+ this.p.onNavigate({ path });
24
+ };
25
+ }
26
+ /** @returns {SystemTestBrowserHelper | null} */
27
+ systemTestBrowserHelper() {
28
+ if (!this.p.enabled) {
29
+ return null;
30
+ }
31
+ if (this.p.browserHelper) {
32
+ this.p.browserHelper.enableOnBrowser();
33
+ return this.p.browserHelper;
34
+ }
35
+ if (!shared.defaultSystemTestBrowserHelper) {
36
+ shared.defaultSystemTestBrowserHelper = new SystemTestBrowserHelper();
37
+ }
38
+ shared.defaultSystemTestBrowserHelper.enableOnBrowser();
39
+ return shared.defaultSystemTestBrowserHelper;
40
+ }
41
+ /** @returns {{enabled: boolean, systemTestBrowserHelper: SystemTestBrowserHelper | null}} */
42
+ result() {
43
+ const systemTestBrowserHelper = this.systemTestBrowserHelper();
44
+ return this.cache("result", () => ({ enabled: this.p.enabled, systemTestBrowserHelper }), [this.p.enabled, systemTestBrowserHelper]);
45
+ }
46
+ /** @returns {void} */
47
+ setup() {
48
+ const systemTestBrowserHelper = this.systemTestBrowserHelper();
49
+ useEffect(() => {
50
+ if (!systemTestBrowserHelper) {
51
+ return;
52
+ }
53
+ systemTestBrowserHelper.onFirstInitialize(this.p.onFirstInitialize);
54
+ systemTestBrowserHelper.onInitialize(this.p.onInitialize);
55
+ }, [systemTestBrowserHelper, this.p.onFirstInitialize, this.p.onInitialize]);
56
+ }
57
+ }
58
+ UseSystemTestShapeHook.defaultProps = {
59
+ browserHelper: undefined,
60
+ enabled: false,
61
+ onDismissTo: undefined,
62
+ onFirstInitialize: undefined,
63
+ onInitialize: undefined,
64
+ onNavigate: undefined
65
+ };
66
+ export default UseSystemTestShapeHook;
67
+ /**
68
+ * @param {Record<string, any>} props
69
+ * @returns {UseSystemTestShapeHook}
70
+ */
71
+ export function useSystemTestShapeHook(props) {
72
+ return useShapeHook(UseSystemTestShapeHook, props);
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXN5c3RlbS10ZXN0LXNoYXBlLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXNlLXN5c3RlbS10ZXN0LXNoYXBlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQy9CLE9BQU8sdUJBQXVCLE1BQU0saUNBQWlDLENBQUE7QUFFckUsTUFBTSxNQUFNLEdBQUc7SUFDYiw4QkFBOEIsRUFBRSxJQUFJO0NBQ3JDLENBQUE7QUFFRCxvRUFBb0U7QUFDcEUsTUFBcUIsc0JBQXVCLFNBQVEsU0FBUztJQUE3RDs7UUF1REUsbUNBQW1DO1FBQ25DLHVDQUFrQyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNDLE9BQU07WUFDUixDQUFDO1lBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUVELG1DQUFtQztRQUNuQyxzQ0FBaUMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMxQyxPQUFNO1lBQ1IsQ0FBQztZQUVELElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUMzQixDQUFDLENBQUE7SUFDSCxDQUFDO0lBOURDLGdEQUFnRDtJQUNoRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFBO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUE7UUFDN0IsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUMzQyxNQUFNLENBQUMsOEJBQThCLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFBO1FBQ3ZFLENBQUM7UUFFRCxNQUFNLENBQUMsOEJBQThCLENBQUMsZUFBZSxFQUFFLENBQUE7UUFFdkQsT0FBTyxNQUFNLENBQUMsOEJBQThCLENBQUE7SUFDOUMsQ0FBQztJQUVELDZGQUE2RjtJQUM3RixNQUFNO1FBQ0osTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUU5RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQ2YsUUFBUSxFQUNSLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUMsQ0FBQyxFQUMxRCxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLHVCQUF1QixDQUFDLENBQzFDLENBQUE7SUFDSCxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLEtBQUs7UUFDSCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBRTlELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztnQkFDN0IsT0FBTTtZQUNSLENBQUM7WUFFRCx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDbkUsdUJBQXVCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDM0QsQ0FBQyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7SUFDOUUsQ0FBQzs7QUFwRE0sbUNBQVksR0FBRztJQUNwQixhQUFhLEVBQUUsU0FBUztJQUN4QixPQUFPLEVBQUUsS0FBSztJQUNkLFdBQVcsRUFBRSxTQUFTO0lBQ3RCLGlCQUFpQixFQUFFLFNBQVM7SUFDNUIsWUFBWSxFQUFFLFNBQVM7SUFDdkIsVUFBVSxFQUFFLFNBQVM7Q0FDdEIsQUFQa0IsQ0FPbEI7ZUFSa0Isc0JBQXNCO0FBMEUzQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsS0FBSztJQUMxQyxPQUFPLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTaGFwZUhvb2ssIHVzZVNoYXBlSG9va30gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlXCJcbmltcG9ydCB7dXNlRWZmZWN0fSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFN5c3RlbVRlc3RCcm93c2VySGVscGVyIGZyb20gXCIuL3N5c3RlbS10ZXN0LWJyb3dzZXItaGVscGVyLmpzXCJcblxuY29uc3Qgc2hhcmVkID0ge1xuICBkZWZhdWx0U3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IG51bGxcbn1cblxuLyoqIFNoYXJlZCBzaGFwZS1ob29rIHN0YXRlIGNvbnRhaW5lciBmb3IgYHVzZVN5c3RlbVRlc3QqYCBob29rcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZVN5c3RlbVRlc3RTaGFwZUhvb2sgZXh0ZW5kcyBTaGFwZUhvb2sge1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgIGJyb3dzZXJIZWxwZXI6IHVuZGVmaW5lZCxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBvbkRpc21pc3NUbzogdW5kZWZpbmVkLFxuICAgIG9uRmlyc3RJbml0aWFsaXplOiB1bmRlZmluZWQsXG4gICAgb25Jbml0aWFsaXplOiB1bmRlZmluZWQsXG4gICAgb25OYXZpZ2F0ZTogdW5kZWZpbmVkXG4gIH1cblxuICAvKiogQHJldHVybnMge1N5c3RlbVRlc3RCcm93c2VySGVscGVyIHwgbnVsbH0gKi9cbiAgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIoKSB7XG4gICAgaWYgKCF0aGlzLnAuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wLmJyb3dzZXJIZWxwZXIpIHtcbiAgICAgIHRoaXMucC5icm93c2VySGVscGVyLmVuYWJsZU9uQnJvd3NlcigpXG4gICAgICByZXR1cm4gdGhpcy5wLmJyb3dzZXJIZWxwZXJcbiAgICB9XG5cbiAgICBpZiAoIXNoYXJlZC5kZWZhdWx0U3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIpIHtcbiAgICAgIHNoYXJlZC5kZWZhdWx0U3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgPSBuZXcgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIoKVxuICAgIH1cblxuICAgIHNoYXJlZC5kZWZhdWx0U3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIuZW5hYmxlT25Ccm93c2VyKClcblxuICAgIHJldHVybiBzaGFyZWQuZGVmYXVsdFN5c3RlbVRlc3RCcm93c2VySGVscGVyXG4gIH1cblxuICAvKiogQHJldHVybnMge3tlbmFibGVkOiBib29sZWFuLCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcjogU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgfCBudWxsfX0gKi9cbiAgcmVzdWx0KCkge1xuICAgIGNvbnN0IHN5c3RlbVRlc3RCcm93c2VySGVscGVyID0gdGhpcy5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlcigpXG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZShcbiAgICAgIFwicmVzdWx0XCIsXG4gICAgICAoKSA9PiAoe2VuYWJsZWQ6IHRoaXMucC5lbmFibGVkLCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcn0pLFxuICAgICAgW3RoaXMucC5lbmFibGVkLCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcl1cbiAgICApXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHNldHVwKCkge1xuICAgIGNvbnN0IHN5c3RlbVRlc3RCcm93c2VySGVscGVyID0gdGhpcy5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlcigpXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCFzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIub25GaXJzdEluaXRpYWxpemUodGhpcy5wLm9uRmlyc3RJbml0aWFsaXplKVxuICAgICAgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIub25Jbml0aWFsaXplKHRoaXMucC5vbkluaXRpYWxpemUpXG4gICAgfSwgW3N5c3RlbVRlc3RCcm93c2VySGVscGVyLCB0aGlzLnAub25GaXJzdEluaXRpYWxpemUsIHRoaXMucC5vbkluaXRpYWxpemVdKVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7e3BhdGg6IHN0cmluZ319IGFyZ3MgKi9cbiAgb25TeXN0ZW1UZXN0QnJvd3NlckhlbHBlckRpc21pc3NUbyA9ICh7cGF0aH0pID0+IHtcbiAgICBpZiAoIXRoaXMucC5lbmFibGVkIHx8ICF0aGlzLnAub25EaXNtaXNzVG8pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMucC5vbkRpc21pc3NUbyh7cGF0aH0pXG4gIH1cblxuICAvKiogQHBhcmFtIHt7cGF0aDogc3RyaW5nfX0gYXJncyAqL1xuICBvblN5c3RlbVRlc3RCcm93c2VySGVscGVyTmF2aWdhdGUgPSAoe3BhdGh9KSA9PiB7XG4gICAgaWYgKCF0aGlzLnAuZW5hYmxlZCB8fCAhdGhpcy5wLm9uTmF2aWdhdGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMucC5vbk5hdmlnYXRlKHtwYXRofSlcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJvcHNcbiAqIEByZXR1cm5zIHtVc2VTeXN0ZW1UZXN0U2hhcGVIb29rfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU3lzdGVtVGVzdFNoYXBlSG9vayhwcm9wcykge1xuICByZXR1cm4gdXNlU2hhcGVIb29rKFVzZVN5c3RlbVRlc3RTaGFwZUhvb2ssIHByb3BzKVxufVxuIl19
@@ -1,15 +1,24 @@
1
1
  /**
2
- * A hook that provides system test capabilities.
3
- * @param {object} options - Options for the hook.
4
- * @param {function() : void} options.onInitialize - A callback function that is called when the system test browser helper is initialized.
5
- * @param {function() : void} options.onFirstInitialize - A callback function that is called the first time the system test browser helper is initialized.
6
- * @returns {{enabled: boolean, systemTestBrowserHelper: SystemTestBrowserHelper}}
2
+ * Generic system-test hook. Supply navigation callbacks for the target runtime/router.
3
+ * @param {object} options
4
+ * @param {import("./system-test-browser-helper.js").default} [options.browserHelper]
5
+ * @param {(args: {path: string}) => void} [options.onDismissTo]
6
+ * @param {function() : void} [options.onFirstInitialize]
7
+ * @param {function() : void} [options.onInitialize]
8
+ * @param {(args: {path: string}) => void} [options.onNavigate]
9
+ * @returns {{enabled: boolean, systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null}}
7
10
  */
8
- export default function useSystemTest({ onFirstInitialize, onInitialize, ...restArgs }?: {
9
- onInitialize: () => void;
10
- onFirstInitialize: () => void;
11
+ export default function useSystemTest({ browserHelper, onDismissTo, onFirstInitialize, onInitialize, onNavigate, ...restArgs }?: {
12
+ browserHelper?: import("./system-test-browser-helper.js").default;
13
+ onDismissTo?: (args: {
14
+ path: string;
15
+ }) => void;
16
+ onFirstInitialize?: () => void;
17
+ onInitialize?: () => void;
18
+ onNavigate?: (args: {
19
+ path: string;
20
+ }) => void;
11
21
  }): {
12
22
  enabled: boolean;
13
- systemTestBrowserHelper: SystemTestBrowserHelper;
23
+ systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null;
14
24
  };
15
- import SystemTestBrowserHelper from "./system-test-browser-helper.js";
@@ -1,15 +1,7 @@
1
1
  import qs from "qs";
2
- import SystemTestBrowserHelper from "./system-test-browser-helper.js";
3
- import { useCallback, useMemo } from "react";
4
2
  import useEventEmitter from "ya-use-event-emitter";
5
- import { useRouter } from "expo-router";
6
- const shared = {
7
- initialized: false,
8
- systemTestBrowserHelper: null
9
- };
10
- /**
11
- * @returns {boolean}
12
- */
3
+ import { useSystemTestShapeHook } from "./use-system-test-shape-hook.js";
4
+ /** @returns {boolean} */
13
5
  function isSystemTestEnabled() {
14
6
  let enabled = false;
15
7
  const envEnabled = process.env.EXPO_PUBLIC_SYSTEM_TEST === "true";
@@ -28,69 +20,31 @@ function isSystemTestEnabled() {
28
20
  return enabled;
29
21
  }
30
22
  /**
31
- * @returns {SystemTestBrowserHelper}
32
- */
33
- function getSystemTestBrowserHelper() {
34
- if (!shared.systemTestBrowserHelper) {
35
- shared.systemTestBrowserHelper = new SystemTestBrowserHelper();
36
- shared.systemTestBrowserHelper.enableOnBrowser();
37
- }
38
- return shared.systemTestBrowserHelper;
39
- }
40
- /**
41
- * A hook that provides system test capabilities.
42
- * @param {object} options - Options for the hook.
43
- * @param {function() : void} options.onInitialize - A callback function that is called when the system test browser helper is initialized.
44
- * @param {function() : void} options.onFirstInitialize - A callback function that is called the first time the system test browser helper is initialized.
45
- * @returns {{enabled: boolean, systemTestBrowserHelper: SystemTestBrowserHelper}}
23
+ * Generic system-test hook. Supply navigation callbacks for the target runtime/router.
24
+ * @param {object} options
25
+ * @param {import("./system-test-browser-helper.js").default} [options.browserHelper]
26
+ * @param {(args: {path: string}) => void} [options.onDismissTo]
27
+ * @param {function() : void} [options.onFirstInitialize]
28
+ * @param {function() : void} [options.onInitialize]
29
+ * @param {(args: {path: string}) => void} [options.onNavigate]
30
+ * @returns {{enabled: boolean, systemTestBrowserHelper: import("./system-test-browser-helper.js").default | null}}
46
31
  */
47
- export default function useSystemTest({ onFirstInitialize, onInitialize, ...restArgs } = { onFirstInitialize: undefined, onInitialize: undefined }) {
48
- if (!useMemo)
49
- throw new Error("[useSystemTest] React.useMemo is not available");
50
- if (!useCallback)
51
- throw new Error("[useSystemTest] React.useCallback is not available");
52
- let router = null;
53
- try {
54
- router = useRouter();
55
- }
56
- catch (error) {
57
- console.error("[useSystemTest] useRouter unavailable:", error);
58
- }
59
- const enabled = useMemo(() => isSystemTestEnabled(), []);
60
- const systemTestBrowserHelper = enabled ? getSystemTestBrowserHelper() : null;
61
- const result = useMemo(() => ({ enabled, systemTestBrowserHelper }), [enabled, systemTestBrowserHelper]);
62
- const instanceShared = useMemo(() => ({ enabled: false, router: null }), []);
63
- instanceShared.enabled = enabled;
64
- instanceShared.router = router;
65
- // Resets navigation when instructed by the system test browser helper
66
- const onSystemTestBrowserHelperDismissTo = useCallback(({ path }) => {
67
- if (instanceShared.enabled) {
68
- try {
69
- instanceShared.router?.dismissTo(path);
70
- }
71
- catch (error) {
72
- console.error(`Failed to dismiss to path "${path}": ${error.message}`);
73
- }
74
- }
75
- }, []);
76
- useEventEmitter(shared.systemTestBrowserHelper?.getEvents(), "dismissTo", onSystemTestBrowserHelperDismissTo);
77
- // Navigates when instructed by the system test browser helper and keeping history of screens
78
- const onSystemTestBrowserHelperNavigate = useCallback(({ path }) => {
79
- if (instanceShared.enabled) {
80
- instanceShared.router?.navigate(path);
81
- }
82
- }, []);
83
- useEventEmitter(shared.systemTestBrowserHelper?.getEvents(), "navigate", onSystemTestBrowserHelperNavigate);
84
- useMemo(() => {
85
- if (enabled && !shared.initialized) {
86
- shared.initialized = true;
87
- shared.systemTestBrowserHelper?.onFirstInitialize(onFirstInitialize);
88
- shared.systemTestBrowserHelper?.onInitialize(onInitialize);
89
- }
90
- }, [enabled, onFirstInitialize, onInitialize, shared.systemTestBrowserHelper]);
32
+ export default function useSystemTest({ browserHelper, onDismissTo, onFirstInitialize, onInitialize, onNavigate, ...restArgs } = { browserHelper: undefined, onDismissTo: undefined, onFirstInitialize: undefined, onInitialize: undefined, onNavigate: undefined }) {
91
33
  const restArgsKeys = Object.keys(restArgs);
92
- if (restArgsKeys.length > 0)
34
+ if (restArgsKeys.length > 0) {
93
35
  throw new Error(`Unknown arguments given to useSystemTest: ${restArgsKeys.join(", ")}`);
94
- return result;
36
+ }
37
+ const shapeHook = useSystemTestShapeHook({
38
+ browserHelper,
39
+ enabled: isSystemTestEnabled(),
40
+ onDismissTo,
41
+ onFirstInitialize,
42
+ onInitialize,
43
+ onNavigate
44
+ });
45
+ const systemTestBrowserHelper = shapeHook.systemTestBrowserHelper();
46
+ useEventEmitter(systemTestBrowserHelper?.getEvents(), "dismissTo", shapeHook.tt.onSystemTestBrowserHelperDismissTo);
47
+ useEventEmitter(systemTestBrowserHelper?.getEvents(), "navigate", shapeHook.tt.onSystemTestBrowserHelperNavigate);
48
+ return shapeHook.result();
95
49
  }
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXN5c3RlbS10ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3VzZS1zeXN0ZW0tdGVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDbkIsT0FBTyx1QkFBdUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNyRSxPQUFPLEVBQUMsV0FBVyxFQUFFLE9BQU8sRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUMxQyxPQUFPLGVBQWUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBRXJDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsV0FBVyxFQUFFLEtBQUs7SUFDbEIsdUJBQXVCLEVBQUUsSUFBSTtDQUM5QixDQUFBO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQjtJQUMxQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDbkIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsS0FBSyxNQUFNLENBQUE7SUFDakUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQTtJQUN4RCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQTtJQUU1QyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEYsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV6QyxJQUFJLFdBQVcsQ0FBQyxVQUFVLElBQUksTUFBTSxFQUFFLENBQUM7WUFDckMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVE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QUFDLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLENBQUM7SUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFTixlQUFlLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxFQUFFLFVBQVUsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFBO0lBRTNHLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDWCxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtZQUN6QixNQUFNLENBQUMsdUJBQXVCLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUNwRSxNQUFNLENBQUMsdUJBQXVCLEVBQUUsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzVELENBQUM7SUFDSCxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUE7SUFFOUUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUUxQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXBILE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBxcyBmcm9tIFwicXNcIlxuaW1wb3J0IFN5c3RlbVRlc3RCcm93c2VySGVscGVyIGZyb20gXCIuL3N5c3RlbS10ZXN0LWJyb3dzZXItaGVscGVyLmpzXCJcbmltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZU1lbW99IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgdXNlRXZlbnRFbWl0dGVyIGZyb20gXCJ5YS11c2UtZXZlbnQtZW1pdHRlclwiXG5pbXBvcnQge3VzZVJvdXRlcn0gZnJvbSBcImV4cG8tcm91dGVyXCJcblxuY29uc3Qgc2hhcmVkID0ge1xuICBpbml0aWFsaXplZDogZmFsc2UsXG4gIHN5c3RlbVRlc3RCcm93c2VySGVscGVyOiBudWxsXG59XG5cbi8qKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3lzdGVtVGVzdEVuYWJsZWQoKSB7XG4gIGxldCBlbmFibGVkID0gZmFsc2VcbiAgY29uc3QgZW52RW5hYmxlZCA9IHByb2Nlc3MuZW52LkVYUE9fUFVCTElDX1NZU1RFTV9URVNUID09PSBcInRydWVcIlxuICBjb25zdCBlbnZIb3N0ID0gcHJvY2Vzcy5lbnYuRVhQT19QVUJMSUNfU1lTVEVNX1RFU1RfSE9TVFxuICBjb25zdCBpbml0aWFsVXJsID0gZ2xvYmFsVGhpcy5sb2NhdGlvbj8uaHJlZlxuXG4gIGlmIChpbml0aWFsVXJsKSB7XG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBpbml0aWFsVXJsLnN1YnN0cmluZyhpbml0aWFsVXJsLmluZGV4T2YoXCI/XCIpICsgMSwgaW5pdGlhbFVybC5sZW5ndGgpXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBxcy5wYXJzZShxdWVyeVN0cmluZylcblxuICAgIGlmIChxdWVyeVBhcmFtcy5zeXN0ZW1UZXN0ID09IFwidHJ1ZVwiKSB7XG4gICAgICBlbmFibGVkID0gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbnZFbmFibGVkIHx8IGVudkhvc3QpIHtcbiAgICBlbmFibGVkID0gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGVuYWJsZWRcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7U3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFN5c3RlbVRlc3RCcm93c2VySGVscGVyKCkge1xuICBpZiAoIXNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlcikge1xuICAgIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IG5ldyBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlcigpXG4gICAgc2hhcmVkLnN5c3RlbVRlc3RCcm93c2VySGVscGVyLmVuYWJsZU9uQnJvd3NlcigpXG4gIH1cblxuICByZXR1cm4gc2hhcmVkLnN5c3RlbVRlc3RCcm93c2VySGVscGVyXG59XG5cbi8qKlxuICogQSBob29rIHRoYXQgcHJvdmlkZXMgc3lzdGVtIHRlc3QgY2FwYWJpbGl0aWVzLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgaG9vay5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IG9wdGlvbnMub25Jbml0aWFsaXplIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gdGVzdCBicm93c2VyIGhlbHBlciBpcyBpbml0aWFsaXplZC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IG9wdGlvbnMub25GaXJzdEluaXRpYWxpemUgLSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lIHRoZSBzeXN0ZW0gdGVzdCBicm93c2VyIGhlbHBlciBpcyBpbml0aWFsaXplZC5cbiAqIEByZXR1cm5zIHt7ZW5hYmxlZDogYm9vbGVhbiwgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IFN5c3RlbVRlc3RCcm93c2VySGVscGVyfX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU3lzdGVtVGVzdCh7b25GaXJzdEluaXRpYWxpemUsIG9uSW5pdGlhbGl6ZSwgLi4ucmVzdEFyZ3N9ID0ge29uRmlyc3RJbml0aWFsaXplOiB1bmRlZmluZWQsIG9uSW5pdGlhbGl6ZTogdW5kZWZpbmVkfSkge1xuICBpZiAoIXVzZU1lbW8pIHRocm93IG5ldyBFcnJvcihcIlt1c2VTeXN0ZW1UZXN0XSBSZWFjdC51c2VNZW1vIGlzIG5vdCBhdmFpbGFibGVcIilcbiAgaWYgKCF1c2VDYWxsYmFjaykgdGhyb3cgbmV3IEVycm9yKFwiW3VzZVN5c3RlbVRlc3RdIFJlYWN0LnVzZUNhbGxiYWNrIGlzIG5vdCBhdmFpbGFibGVcIilcblxuICBsZXQgcm91dGVyID0gbnVsbFxuXG4gIHRyeSB7XG4gICAgcm91dGVyID0gdXNlUm91dGVyKClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW3VzZVN5c3RlbVRlc3RdIHVzZVJvdXRlciB1bmF2YWlsYWJsZTpcIiwgZXJyb3IpXG4gIH1cbiAgY29uc3QgZW5hYmxlZCA9IHVzZU1lbW8oKCkgPT4gaXNTeXN0ZW1UZXN0RW5hYmxlZCgpLCBbXSlcbiAgY29uc3Qgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgPSBlbmFibGVkID8gZ2V0U3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIoKSA6IG51bGxcbiAgY29uc3QgcmVzdWx0ID0gdXNlTWVtbygoKSA9PiAoe2VuYWJsZWQsIHN5c3RlbVRlc3RCcm93c2VySGVscGVyfSksIFtlbmFibGVkLCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcl0pXG4gIGNvbnN0IGluc3RhbmNlU2hhcmVkID0gdXNlTWVtbygoKSA9PiAoe2VuYWJsZWQ6IGZhbHNlLCByb3V0ZXI6IG51bGx9KSwgW10pXG5cbiAgaW5zdGFuY2VTaGFyZWQuZW5hYmxlZCA9IGVuYWJsZWRcbiAgaW5zdGFuY2VTaGFyZWQucm91dGVyID0gcm91dGVyXG5cbiAgLy8gUmVzZXRzIG5hdmlnYXRpb24gd2hlbiBpbnN0cnVjdGVkIGJ5IHRoZSBzeXN0ZW0gdGVzdCBicm93c2VyIGhlbHBlclxuICBjb25zdCBvblN5c3RlbVRlc3RCcm93c2VySGVscGVyRGlzbWlzc1RvID0gdXNlQ2FsbGJhY2soKHtwYXRofSkgPT4ge1xuICAgIGlmIChpbnN0YW5jZVNoYXJlZC5lbmFibGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbnN0YW5jZVNoYXJlZC5yb3V0ZXI/LmRpc21pc3NUbyhwYXRoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGRpc21pc3MgdG8gcGF0aCBcIiR7cGF0aH1cIjogJHtlcnJvci5tZXNzYWdlfWApXG4gICAgICB9XG4gICAgfVxuICB9LCBbXSlcblxuICB1c2VFdmVudEVtaXR0ZXIoc2hhcmVkLnN5c3RlbVRlc3RCcm93c2VySGVscGVyPy5nZXRFdmVudHMoKSwgXCJkaXNtaXNzVG9cIiwgb25TeXN0ZW1UZXN0QnJvd3NlckhlbHBlckRpc21pc3NUbylcblxuXG4gIC8vIE5hdmlnYXRlcyB3aGVuIGluc3RydWN0ZWQgYnkgdGhlIHN5c3RlbSB0ZXN0IGJyb3dzZXIgaGVscGVyIGFuZCBrZWVwaW5nIGhpc3Rvcnkgb2Ygc2NyZWVuc1xuICBjb25zdCBvblN5c3RlbVRlc3RCcm93c2VySGVscGVyTmF2aWdhdGUgPSB1c2VDYWxsYmFjaygoe3BhdGh9KSA9PiB7XG4gICAgaWYgKGluc3RhbmNlU2hhcmVkLmVuYWJsZWQpIHtcbiAgICAgIGluc3RhbmNlU2hhcmVkLnJvdXRlcj8ubmF2aWdhdGUocGF0aClcbiAgICB9XG4gIH0sIFtdKVxuXG4gIHVzZUV2ZW50RW1pdHRlcihzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI/LmdldEV2ZW50cygpLCBcIm5hdmlnYXRlXCIsIG9uU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJOYXZpZ2F0ZSlcblxuICB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoZW5hYmxlZCAmJiAhc2hhcmVkLmluaXRpYWxpemVkKSB7XG4gICAgICBzaGFyZWQuaW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgICBzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI/Lm9uRmlyc3RJbml0aWFsaXplKG9uRmlyc3RJbml0aWFsaXplKVxuICAgICAgc2hhcmVkLnN5c3RlbVRlc3RCcm93c2VySGVscGVyPy5vbkluaXRpYWxpemUob25Jbml0aWFsaXplKVxuICAgIH1cbiAgfSwgW2VuYWJsZWQsIG9uRmlyc3RJbml0aWFsaXplLCBvbkluaXRpYWxpemUsIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlcl0pXG5cbiAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzIGdpdmVuIHRvIHVzZVN5c3RlbVRlc3Q6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdfQ==
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXN5c3RlbS10ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3VzZS1zeXN0ZW0tdGVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFDbkIsT0FBTyxlQUFlLE1BQU0sc0JBQXNCLENBQUE7QUFDbEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFFdEUseUJBQXlCO0FBQ3pCLFNBQVMsbUJBQW1CO0lBQzFCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQTtJQUNuQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixLQUFLLE1BQU0sQ0FBQTtJQUNqRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFBO0lBQ3hELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFBO0lBRTVDLElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4RixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRXpDLElBQUksV0FBVyxDQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVLElBQUksT0FBTyxFQUFFLENBQUM7UUFDMUIsT0FBTyxHQUFHLElBQUksQ0FBQTtJQUNoQixDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsYUFBYSxDQUFDLEVBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsRUFBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQztJQUM3UCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTFDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN6RixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDdkMsYUFBYTtRQUNiLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTtRQUM5QixXQUFXO1FBQ1gsaUJBQWlCO1FBQ2pCLFlBQVk7UUFDWixVQUFVO0tBQ1gsQ0FBQyxDQUFBO0lBQ0YsTUFBTSx1QkFBdUIsR0FBRyxTQUFTLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtJQUVuRSxlQUFlLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUNuSCxlQUFlLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJQUVqSCxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHFzIGZyb20gXCJxc1wiXG5pbXBvcnQgdXNlRXZlbnRFbWl0dGVyIGZyb20gXCJ5YS11c2UtZXZlbnQtZW1pdHRlclwiXG5pbXBvcnQge3VzZVN5c3RlbVRlc3RTaGFwZUhvb2t9IGZyb20gXCIuL3VzZS1zeXN0ZW0tdGVzdC1zaGFwZS1ob29rLmpzXCJcblxuLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuZnVuY3Rpb24gaXNTeXN0ZW1UZXN0RW5hYmxlZCgpIHtcbiAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICBjb25zdCBlbnZFbmFibGVkID0gcHJvY2Vzcy5lbnYuRVhQT19QVUJMSUNfU1lTVEVNX1RFU1QgPT09IFwidHJ1ZVwiXG4gIGNvbnN0IGVudkhvc3QgPSBwcm9jZXNzLmVudi5FWFBPX1BVQkxJQ19TWVNURU1fVEVTVF9IT1NUXG4gIGNvbnN0IGluaXRpYWxVcmwgPSBnbG9iYWxUaGlzLmxvY2F0aW9uPy5ocmVmXG5cbiAgaWYgKGluaXRpYWxVcmwpIHtcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGluaXRpYWxVcmwuc3Vic3RyaW5nKGluaXRpYWxVcmwuaW5kZXhPZihcIj9cIikgKyAxLCBpbml0aWFsVXJsLmxlbmd0aClcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxuXG4gICAgaWYgKHF1ZXJ5UGFyYW1zLnN5c3RlbVRlc3QgPT0gXCJ0cnVlXCIpIHtcbiAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKGVudkVuYWJsZWQgfHwgZW52SG9zdCkge1xuICAgIGVuYWJsZWQgPSB0cnVlXG4gIH1cblxuICByZXR1cm4gZW5hYmxlZFxufVxuXG4vKipcbiAqIEdlbmVyaWMgc3lzdGVtLXRlc3QgaG9vay4gU3VwcGx5IG5hdmlnYXRpb24gY2FsbGJhY2tzIGZvciB0aGUgdGFyZ2V0IHJ1bnRpbWUvcm91dGVyLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC1icm93c2VyLWhlbHBlci5qc1wiKS5kZWZhdWx0fSBbb3B0aW9ucy5icm93c2VySGVscGVyXVxuICogQHBhcmFtIHsoYXJnczoge3BhdGg6IHN0cmluZ30pID0+IHZvaWR9IFtvcHRpb25zLm9uRGlzbWlzc1RvXVxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogdm9pZH0gW29wdGlvbnMub25GaXJzdEluaXRpYWxpemVdXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBbb3B0aW9ucy5vbkluaXRpYWxpemVdXG4gKiBAcGFyYW0geyhhcmdzOiB7cGF0aDogc3RyaW5nfSkgPT4gdm9pZH0gW29wdGlvbnMub25OYXZpZ2F0ZV1cbiAqIEByZXR1cm5zIHt7ZW5hYmxlZDogYm9vbGVhbiwgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IGltcG9ydChcIi4vc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanNcIikuZGVmYXVsdCB8IG51bGx9fVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTeXN0ZW1UZXN0KHticm93c2VySGVscGVyLCBvbkRpc21pc3NUbywgb25GaXJzdEluaXRpYWxpemUsIG9uSW5pdGlhbGl6ZSwgb25OYXZpZ2F0ZSwgLi4ucmVzdEFyZ3N9ID0ge2Jyb3dzZXJIZWxwZXI6IHVuZGVmaW5lZCwgb25EaXNtaXNzVG86IHVuZGVmaW5lZCwgb25GaXJzdEluaXRpYWxpemU6IHVuZGVmaW5lZCwgb25Jbml0aWFsaXplOiB1bmRlZmluZWQsIG9uTmF2aWdhdGU6IHVuZGVmaW5lZH0pIHtcbiAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG5cbiAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50cyBnaXZlbiB0byB1c2VTeXN0ZW1UZXN0OiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIGNvbnN0IHNoYXBlSG9vayA9IHVzZVN5c3RlbVRlc3RTaGFwZUhvb2soe1xuICAgIGJyb3dzZXJIZWxwZXIsXG4gICAgZW5hYmxlZDogaXNTeXN0ZW1UZXN0RW5hYmxlZCgpLFxuICAgIG9uRGlzbWlzc1RvLFxuICAgIG9uRmlyc3RJbml0aWFsaXplLFxuICAgIG9uSW5pdGlhbGl6ZSxcbiAgICBvbk5hdmlnYXRlXG4gIH0pXG4gIGNvbnN0IHN5c3RlbVRlc3RCcm93c2VySGVscGVyID0gc2hhcGVIb29rLnN5c3RlbVRlc3RCcm93c2VySGVscGVyKClcblxuICB1c2VFdmVudEVtaXR0ZXIoc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI/LmdldEV2ZW50cygpLCBcImRpc21pc3NUb1wiLCBzaGFwZUhvb2sudHQub25TeXN0ZW1UZXN0QnJvd3NlckhlbHBlckRpc21pc3NUbylcbiAgdXNlRXZlbnRFbWl0dGVyKHN5c3RlbVRlc3RCcm93c2VySGVscGVyPy5nZXRFdmVudHMoKSwgXCJuYXZpZ2F0ZVwiLCBzaGFwZUhvb2sudHQub25TeXN0ZW1UZXN0QnJvd3NlckhlbHBlck5hdmlnYXRlKVxuXG4gIHJldHVybiBzaGFwZUhvb2sucmVzdWx0KClcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "name": "system-testing",
3
- "version": "1.0.78",
3
+ "version": "1.0.81",
4
4
  "description": "System testing with Selenium and browsers.",
5
+ "bin": {
6
+ "system-testing": "build/cli.js"
7
+ },
5
8
  "main": "build/index.js",
6
9
  "types": "build/index.d.ts",
7
10
  "files": [
@@ -36,7 +39,7 @@
36
39
  "prepublishOnly": "npm run build",
37
40
  "release:patch": "node scripts/release-patch.js",
38
41
  "test:appium:android": "(npx appium driver update uiautomator2 || npx appium driver install uiautomator2) && SDK_PATH=$(node -e \"const fs=require('fs'); const path=require('path'); const os=require('os'); const candidates=[process.env.ANDROID_SDK_ROOT, process.env.ANDROID_HOME, path.join(os.homedir(),'Android','Sdk'), path.join(os.homedir(),'Library','Android','sdk'), '/usr/lib/android-sdk', '/usr/local/android-sdk', '/opt/android-sdk', '/opt/android-sdk-linux']; const found=candidates.find((candidate)=>candidate && fs.existsSync(candidate)); if (found) process.stdout.write(found);\") && ANDROID_HOME=${ANDROID_HOME:-$SDK_PATH} ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT:-$SDK_PATH} node -e \"if (!process.env.ANDROID_HOME && !process.env.ANDROID_SDK_ROOT) { console.error('ANDROID_HOME or ANDROID_SDK_ROOT must be set to run Appium Android tests'); process.exit(1) }\" && ANDROID_HOME=${ANDROID_HOME:-$SDK_PATH} ANDROID_SDK_ROOT=${ANDROID_SDK_ROOT:-$SDK_PATH} SYSTEM_TEST_HOST=dist SYSTEM_TEST_HTTP_CONNECT_HOST=10.0.2.2 SYSTEM_TEST_DRIVER=appium SYSTEM_TEST_APPIUM_DRIVERS=uiautomator2 SYSTEM_TEST_APPIUM_TEST_ID_STRATEGY=css SYSTEM_TEST_APPIUM_SERVER_ARGS='{\"allowInsecure\":[\"uiautomator2:chromedriver_autodownload\"]}' SYSTEM_TEST_APPIUM_CAPABILITIES='{\"platformName\":\"Android\",\"appium:automationName\":\"UiAutomator2\",\"appium:deviceName\":\"Android Emulator\",\"browserName\":\"Chrome\",\"appium:chromedriverAutodownload\":true}' npm test",
39
- "test:appium:web": "npm run export:web && SYSTEM_TEST_HOST=dist SYSTEM_TEST_DRIVER=appium SYSTEM_TEST_APPIUM_DRIVERS=chromium SYSTEM_TEST_APPIUM_TEST_ID_STRATEGY=css npm test",
42
+ "test:appium:web": "node scripts/test-appium-web.js",
40
43
  "test:dist": "npm run export:web && SYSTEM_TEST_HOST=dist npm test",
41
44
  "test:selenium": "SYSTEM_TEST_HOST=dist npm test",
42
45
  "test": "jasmine",
@@ -44,39 +47,45 @@
44
47
  "watch": "tsc -w"
45
48
  },
46
49
  "dependencies": {
47
- "appium": "3.2.0",
50
+ "appium": "3.2.2",
48
51
  "awaitery": "^1.0.12",
49
52
  "diggerize": "^1.0.9",
50
53
  "eventemitter3": "^5.0.1",
51
54
  "htmlfy": "^1.0.0",
52
55
  "mime": "^4.0.7",
53
56
  "moment": "^2.30.1",
57
+ "prop-types": "^15.8.1",
54
58
  "qs": "^6.14.1",
55
59
  "scoundrel-remote-eval": "^1.0.28",
60
+ "set-state-compare": "^1.0.72",
56
61
  "ws": "^8.18.3",
57
62
  "ya-use-event-emitter": "^0.1.2"
58
63
  },
59
64
  "peerDependencies": {
60
65
  "expo-router": ">= 1.0.0",
66
+ "react": ">= 18.3.0",
61
67
  "selenium-webdriver": ">= 4.34.0"
62
68
  },
63
69
  "peerDependenciesMeta": {
64
70
  "expo-router": {
65
71
  "optional": true
72
+ },
73
+ "react": {
74
+ "optional": true
66
75
  }
67
76
  },
68
77
  "devDependencies": {
69
- "@eslint/js": "^9.39.1",
78
+ "@eslint/js": "^10.0.1",
70
79
  "@types/jasmine": "^6.0.0",
71
80
  "@types/node": "^25.0.2",
72
81
  "@types/qs": "^6.14.0",
73
82
  "@types/react": "^19.2.7",
74
83
  "@types/selenium-webdriver": "^4.35.4",
75
- "appium-chromium-driver": "2.1.2",
84
+ "appium-chromium-driver": "^2.1.6",
76
85
  "appium-uiautomator2-driver": "6.7.11",
77
- "eslint": "^9.39.1",
78
- "eslint-plugin-jsdoc": "^62.0.0",
79
- "expo-router": "^6.0.21",
86
+ "eslint": "^10.0.3",
87
+ "eslint-plugin-jsdoc": "^62.7.1",
88
+ "expo-router": "^55.0.5",
80
89
  "globals": "^17.0.0",
81
90
  "jasmine": "^6.0.0",
82
91
  "typescript": "^5.9.3"