@applitools/core 1.0.0

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 (90) hide show
  1. package/LICENSE +26 -0
  2. package/dist/automation/get-viewport-size.js +12 -0
  3. package/dist/automation/locate.js +22 -0
  4. package/dist/automation/set-viewport-size.js +12 -0
  5. package/dist/automation/utils/take-screenshot.js +55 -0
  6. package/dist/check-and-close.js +11 -0
  7. package/dist/check.js +55 -0
  8. package/dist/classic/check-and-close.js +67 -0
  9. package/dist/classic/check.js +78 -0
  10. package/dist/classic/core.js +50 -0
  11. package/dist/classic/extract-text.js +71 -0
  12. package/dist/classic/locate-text.js +53 -0
  13. package/dist/classic/open-eyes.js +78 -0
  14. package/dist/classic/utils/take-dom-capture.js +135 -0
  15. package/dist/classic/utils/transform-check-settings.js +68 -0
  16. package/dist/close-manager.js +62 -0
  17. package/dist/close.js +20 -0
  18. package/dist/core.js +51 -0
  19. package/dist/errors/test-error.js +29 -0
  20. package/dist/extract-text.js +37 -0
  21. package/dist/index.js +32 -0
  22. package/dist/locate-text.js +11 -0
  23. package/dist/locate.js +11 -0
  24. package/dist/make-manager.js +65 -0
  25. package/dist/open-eyes.js +84 -0
  26. package/dist/troubleshoot/check-network.js +106 -0
  27. package/dist/troubleshoot/eyes.js +85 -0
  28. package/dist/troubleshoot/ufg.js +130 -0
  29. package/dist/troubleshoot/utils.js +68 -0
  30. package/dist/ufg/abort.js +18 -0
  31. package/dist/ufg/check-and-close.js +7 -0
  32. package/dist/ufg/check.js +192 -0
  33. package/dist/ufg/close.js +31 -0
  34. package/dist/ufg/core.js +78 -0
  35. package/dist/ufg/open-eyes.js +123 -0
  36. package/dist/ufg/utils/generate-safe-selectors.js +60 -0
  37. package/dist/ufg/utils/take-dom-snapshot.js +132 -0
  38. package/dist/ufg/utils/take-dom-snapshots.js +141 -0
  39. package/dist/ufg/utils/take-snapshots.js +38 -0
  40. package/dist/ufg/utils/take-vhses.js +258 -0
  41. package/dist/utils/execute-poll-script.js +75 -0
  42. package/dist/utils/extract-broker-url.js +19 -0
  43. package/dist/utils/format-results.js +185 -0
  44. package/dist/utils/to-base-check-settings.js +69 -0
  45. package/dist/utils/wait-for-lazy-load.js +25 -0
  46. package/package.json +105 -0
  47. package/types/automation/get-viewport-size.d.ts +11 -0
  48. package/types/automation/locate.d.ts +16 -0
  49. package/types/automation/set-viewport-size.d.ts +12 -0
  50. package/types/automation/utils/take-screenshot.d.ts +15 -0
  51. package/types/check-and-close.d.ts +15 -0
  52. package/types/check.d.ts +15 -0
  53. package/types/classic/check-and-close.d.ts +16 -0
  54. package/types/classic/check.d.ts +16 -0
  55. package/types/classic/core.d.ts +13 -0
  56. package/types/classic/extract-text.d.ts +16 -0
  57. package/types/classic/locate-text.d.ts +16 -0
  58. package/types/classic/open-eyes.d.ts +15 -0
  59. package/types/classic/utils/take-dom-capture.d.ts +13 -0
  60. package/types/classic/utils/transform-check-settings.d.ts +11 -0
  61. package/types/close-manager.d.ts +18 -0
  62. package/types/close.d.ts +14 -0
  63. package/types/core.d.ts +14 -0
  64. package/types/errors/test-error.d.ts +5 -0
  65. package/types/extract-text.d.ts +15 -0
  66. package/types/index.d.ts +3 -0
  67. package/types/locate-text.d.ts +15 -0
  68. package/types/locate.d.ts +15 -0
  69. package/types/make-manager.d.ts +19 -0
  70. package/types/open-eyes.d.ts +19 -0
  71. package/types/troubleshoot/check-network.d.ts +20 -0
  72. package/types/troubleshoot/eyes.d.ts +11 -0
  73. package/types/troubleshoot/ufg.d.ts +10 -0
  74. package/types/troubleshoot/utils.d.ts +4 -0
  75. package/types/ufg/abort.d.ts +17 -0
  76. package/types/ufg/check-and-close.d.ts +17 -0
  77. package/types/ufg/check.d.ts +27 -0
  78. package/types/ufg/close.d.ts +16 -0
  79. package/types/ufg/core.d.ts +16 -0
  80. package/types/ufg/open-eyes.d.ts +18 -0
  81. package/types/ufg/utils/generate-safe-selectors.d.ts +12 -0
  82. package/types/ufg/utils/take-dom-snapshot.d.ts +23 -0
  83. package/types/ufg/utils/take-dom-snapshots.d.ts +24 -0
  84. package/types/ufg/utils/take-snapshots.d.ts +21 -0
  85. package/types/ufg/utils/take-vhses.d.ts +17 -0
  86. package/types/utils/execute-poll-script.d.ts +20 -0
  87. package/types/utils/extract-broker-url.d.ts +2 -0
  88. package/types/utils/format-results.d.ts +16 -0
  89. package/types/utils/to-base-check-settings.d.ts +17 -0
  90. package/types/utils/wait-for-lazy-load.d.ts +13 -0
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.checkNetwork = void 0;
30
+ const chalk_1 = __importDefault(require("chalk"));
31
+ const utils_1 = require("./utils");
32
+ const eyes_1 = __importDefault(require("./eyes"));
33
+ const ufg_1 = __importDefault(require("./ufg"));
34
+ const utils = __importStar(require("@applitools/utils"));
35
+ const TIMEOUT = 15000;
36
+ const config = utils.config.getConfig({ params: ['apiKey', 'serverUrl', 'proxy'] });
37
+ async function checkNetwork({ stream = process.stdout, eyes = eyes_1.default, ufg = ufg_1.default } = {}) {
38
+ const hasClearLine = stream.clearLine && stream.cursorTo;
39
+ async function doTest(func, name) {
40
+ const delimiterLength = 30 - name.length;
41
+ const delimiter = new Array(delimiterLength).join(' ');
42
+ hasClearLine && printSuccess(name, delimiter, '[ ? ]');
43
+ const start = Date.now();
44
+ const funcWithTimeout = (0, utils_1.ptimeoutWithError)(func(), TIMEOUT, new Error('request timeout!'));
45
+ const [err] = await (0, utils_1.presult)(funcWithTimeout);
46
+ const end = (Date.now() - start) / 1000;
47
+ clearLine();
48
+ if (err) {
49
+ printErr(name, delimiter, `[ X ] +${end}`, err.message, err.message[err.message.length - 1] !== '\n' ? '\n' : '');
50
+ }
51
+ else {
52
+ printSuccess(name, delimiter, `[ OK ] +${end}`, '\n');
53
+ }
54
+ return !!err;
55
+ }
56
+ function print(...msg) {
57
+ stream.write((0, chalk_1.default)(...msg));
58
+ }
59
+ function printErr(...msg) {
60
+ stream.write(chalk_1.default.red(...msg));
61
+ }
62
+ function printSuccess(...msg) {
63
+ stream.write(chalk_1.default.green(...msg));
64
+ }
65
+ function clearLine() {
66
+ if (hasClearLine) {
67
+ stream.clearLine(0);
68
+ stream.cursorTo(0);
69
+ }
70
+ }
71
+ if (!config.apiKey) {
72
+ printErr('Missing "apiKey". Add APPLITOOLS_API_KEY as an env variable or add "apiKey" in applitools.config.js\n');
73
+ return;
74
+ }
75
+ const proxyEnvMsg = `HTTP_PROXY="${process.env.HTTP_PROXY || ''}"\nHTTPS_PROXY="${process.env.HTTPS_PROXY || ''}"`;
76
+ const configMsg = `User config: ${JSON.stringify(config, null, 2)}\n${proxyEnvMsg}`;
77
+ print(`Eyes Check Network. Running with:\n\n---\n\n${chalk_1.default.cyan(configMsg)}\n\n---\n\n`);
78
+ let hasErr = false;
79
+ let curlRenderErr = true;
80
+ let curlVgErr = true;
81
+ // TODO - http and fetch need to account for proxy.
82
+ print('[1] Checking eyes API', eyes.url.origin, '\n');
83
+ curlRenderErr = await doTest(eyes.testCurl, '[eyes] cURL');
84
+ hasErr = curlRenderErr;
85
+ hasErr = (await doTest(eyes.testHttps, '[eyes] https')) || hasErr;
86
+ hasErr = (await doTest(eyes.testFetch, '[eyes] node-fetch')) || hasErr;
87
+ hasErr = await doTest(eyes.testServer, '[eyes] server connector');
88
+ print('[2] Checking Ultrafast grid API', ufg.url.origin, '\n');
89
+ curlVgErr = await doTest(ufg.testCurl, '[UFG] cURL');
90
+ hasErr = curlVgErr || hasErr;
91
+ hasErr = (await doTest(ufg.testHttps, '[UFG] https')) || hasErr;
92
+ hasErr = (await doTest(ufg.testFetch, '[UFG] node-fetch')) || hasErr;
93
+ hasErr = (await doTest(ufg.testServer, '[UFG] server connector')) || hasErr;
94
+ if (!hasErr) {
95
+ printSuccess('\nSuccess!\n');
96
+ }
97
+ const proxyMsg = '\nYour proxy seems to be blocking requests to Applitools. Please make sure the following command succeeds:';
98
+ if (curlRenderErr) {
99
+ printErr(proxyMsg, '\n', eyes.cmd, '\n');
100
+ }
101
+ else if (curlVgErr) {
102
+ printErr(proxyMsg, '\n', await ufg.getCmd());
103
+ }
104
+ }
105
+ exports.checkNetwork = checkNetwork;
106
+ checkNetwork();
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.CURL_CMD = exports.RENDER_INFO_URL = void 0;
30
+ const https_1 = require("https");
31
+ const core_base_1 = require("@applitools/core-base");
32
+ const utils_1 = require("./utils");
33
+ const utils = __importStar(require("@applitools/utils"));
34
+ const node_fetch_1 = __importDefault(require("node-fetch"));
35
+ exports.RENDER_INFO_URL = `${utils_1.config.serverUrl}/api/sessions/renderinfo?apiKey=${utils_1.config.apiKey}`;
36
+ exports.CURL_CMD = `curl ${exports.RENDER_INFO_URL} ${(0, utils_1.getProxyCurlArg)()}`;
37
+ const validateRawAccountInfo = res => {
38
+ if (!res || !res.accessToken || !res.resultsUrl) {
39
+ throw new Error(`bad render info result ${JSON.stringify(res)}`);
40
+ }
41
+ };
42
+ const validateAccountInfo = res => {
43
+ if (!res || !res.ufg || !res.ufg.accessToken || !res.uploadUrl) {
44
+ throw new Error(`bad render info result ${JSON.stringify(res)}`);
45
+ }
46
+ };
47
+ exports.default = {
48
+ async testFetch() {
49
+ const response = await (0, node_fetch_1.default)(exports.RENDER_INFO_URL);
50
+ const data = await response.json();
51
+ validateRawAccountInfo(data);
52
+ },
53
+ async testCurl() {
54
+ const { stdout } = await utils.process.execute(exports.CURL_CMD, {
55
+ maxBuffer: 10000000,
56
+ });
57
+ const data = JSON.parse(stdout);
58
+ validateRawAccountInfo(data);
59
+ },
60
+ async testServer() {
61
+ const server = (0, core_base_1.makeCoreRequests)({ agentId: 'check-network' });
62
+ const result = await server.getAccountInfo({ settings: utils_1.config });
63
+ validateAccountInfo(result);
64
+ },
65
+ testHttps: async () => {
66
+ return new Promise((resolve, reject) => {
67
+ const request = (0, https_1.get)(exports.RENDER_INFO_URL, response => {
68
+ let data = '';
69
+ response.on('data', chunk => (data += chunk));
70
+ response.on('end', () => {
71
+ try {
72
+ validateRawAccountInfo(JSON.parse(data));
73
+ resolve();
74
+ }
75
+ catch (err) {
76
+ reject(err);
77
+ }
78
+ });
79
+ });
80
+ request.on('error', reject);
81
+ });
82
+ },
83
+ url: new URL(exports.RENDER_INFO_URL),
84
+ cmd: exports.CURL_CMD,
85
+ };
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.getCmd = void 0;
30
+ const https_1 = require("https");
31
+ const crypto_1 = require("crypto");
32
+ const eyes_1 = require("./eyes");
33
+ const ufg_client_1 = require("@applitools/ufg-client");
34
+ const utils_1 = require("./utils");
35
+ const utils = __importStar(require("@applitools/utils"));
36
+ const node_fetch_1 = __importDefault(require("node-fetch"));
37
+ const value = Buffer.from(JSON.stringify({ resources: {}, domNodes: [] }));
38
+ const hash = (0, crypto_1.createHash)('sha256').update(value).digest('hex');
39
+ const contentType = 'x-applitools-html/cdt';
40
+ const resource = {
41
+ id: 'id',
42
+ url: 'https://localhost:2107',
43
+ value,
44
+ hash: { hashFormat: 'sha256', hash, contentType },
45
+ contentType,
46
+ };
47
+ const UFG_PUT_RESOURCE_URL = `https://render-wus.applitools.com/sha256/${resource.hash.hash}?render-id=fake`;
48
+ const accessTokenPromise = new Promise(async (resolve) => {
49
+ const { stdout } = await utils.process.execute(`curl -s ${eyes_1.RENDER_INFO_URL} ${(0, utils_1.getProxyCurlArg)()}`, {
50
+ maxBuffer: 10000000,
51
+ });
52
+ const accessToken = JSON.parse(stdout).accessToken;
53
+ if (!accessToken)
54
+ throw new Error('could not receive auth token since cURL command to get it failed.');
55
+ resolve(accessToken);
56
+ });
57
+ const getCmd = async () => `curl -X PUT -H "Content-Type: application/json" -H "X-Auth-Token: ${await accessTokenPromise}" -d '${resource.value}' ${UFG_PUT_RESOURCE_URL} ${(0, utils_1.getProxyCurlArg)()}`;
58
+ exports.getCmd = getCmd;
59
+ const validateVgResult = (res, sha) => {
60
+ if (!res || res.hash !== sha) {
61
+ throw new Error(`bad VG result ${res}`);
62
+ }
63
+ };
64
+ exports.default = {
65
+ async testFetch() {
66
+ const response = await (0, node_fetch_1.default)(UFG_PUT_RESOURCE_URL, {
67
+ method: 'PUT',
68
+ headers: {
69
+ 'Content-Type': 'x-applitools-html/cdt',
70
+ 'X-Auth-Token': await accessTokenPromise,
71
+ },
72
+ body: resource.value,
73
+ });
74
+ const data = await response.json();
75
+ validateVgResult(data, resource.hash.hash);
76
+ },
77
+ async testCurl() {
78
+ // HTTP_PROXY and HTTPS_PROXY are read by cURL.
79
+ let proxyUrl;
80
+ if (utils_1.config.proxy) {
81
+ proxyUrl = new URL(utils.types.isString(utils_1.config.proxy) ? utils_1.config.proxy : utils_1.config.proxy.url);
82
+ if (utils_1.config.proxy.username)
83
+ proxyUrl.username = utils_1.config.proxy.username;
84
+ if (utils_1.config.proxy.password)
85
+ proxyUrl.password = utils_1.config.proxy.password;
86
+ }
87
+ const { stdout } = await utils.process.execute(await (0, exports.getCmd)(), { maxBuffer: 10000000 });
88
+ validateVgResult(JSON.parse(stdout), resource.hash.hash);
89
+ },
90
+ testServer: async () => {
91
+ const url = new URL(UFG_PUT_RESOURCE_URL);
92
+ const requests = (0, ufg_client_1.makeUFGRequests)({
93
+ config: { serverUrl: url.origin, accessToken: await accessTokenPromise, uploadUrl: '', stitchingServiceUrl: '' },
94
+ logger: null,
95
+ });
96
+ await requests.uploadResource({ resource });
97
+ },
98
+ async testHttps() {
99
+ return new Promise(async (resolve, reject) => {
100
+ const url = new URL(UFG_PUT_RESOURCE_URL);
101
+ const request = (0, https_1.request)({
102
+ host: url.host,
103
+ path: `${url.pathname}${url.search}`,
104
+ method: 'PUT',
105
+ headers: {
106
+ 'Content-Type': 'x-applitools-html/cdt',
107
+ 'X-Auth-Token': await accessTokenPromise,
108
+ },
109
+ });
110
+ request.on('response', response => {
111
+ let data = '';
112
+ response.on('data', chunk => (data += chunk));
113
+ response.on('end', () => {
114
+ try {
115
+ validateVgResult(JSON.parse(data), resource.hash.hash);
116
+ resolve();
117
+ }
118
+ catch (e) {
119
+ reject(e);
120
+ }
121
+ });
122
+ });
123
+ request.on('error', reject);
124
+ request.write(resource.value);
125
+ request.end();
126
+ });
127
+ },
128
+ url: new URL(UFG_PUT_RESOURCE_URL),
129
+ getCmd: exports.getCmd,
130
+ };
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ptimeoutWithError = exports.presult = exports.getProxyCurlArg = exports.config = void 0;
27
+ const utils = __importStar(require("@applitools/utils"));
28
+ exports.config = {
29
+ serverUrl: 'https://eyesapi.applitools.com',
30
+ ...utils.config.getConfig({ params: ['apiKey', 'serverUrl', 'proxy'] }),
31
+ };
32
+ function getProxyCurlArg() {
33
+ // HTTP_PROXY and HTTPS_PROXY are read by cURL.
34
+ let proxyUrl;
35
+ if (exports.config.proxy) {
36
+ proxyUrl = new URL(utils.types.isString(exports.config.proxy) ? exports.config.proxy : exports.config.proxy.url);
37
+ if (exports.config.proxy.username)
38
+ proxyUrl.username = exports.config.proxy.username;
39
+ if (exports.config.proxy.password)
40
+ proxyUrl.password = exports.config.proxy.password;
41
+ }
42
+ return proxyUrl ? `-x ${proxyUrl.href}` : '';
43
+ }
44
+ exports.getProxyCurlArg = getProxyCurlArg;
45
+ function presult(promise) {
46
+ return promise.then(v => [undefined, v], err => [err]);
47
+ }
48
+ exports.presult = presult;
49
+ async function ptimeoutWithError(promiseOrPromiseFunc, timeout, err) {
50
+ let promiseResolved = false;
51
+ const hasAborted = () => promiseResolved;
52
+ const promise = promiseOrPromiseFunc.then ? promiseOrPromiseFunc : promiseOrPromiseFunc(hasAborted);
53
+ let cancel;
54
+ const v = await Promise.race([
55
+ promise.then(v => ((promiseResolved = true), cancel && clearTimeout(cancel), v), err => ((promiseResolved = true), cancel && clearTimeout(cancel), Promise.reject(err))),
56
+ new Promise(res => (cancel = setTimeout(() => {
57
+ if (promiseResolved)
58
+ res(undefined);
59
+ else {
60
+ cancel = undefined;
61
+ promiseResolved = true;
62
+ res(Promise.reject(err));
63
+ }
64
+ }, timeout))),
65
+ ]);
66
+ return v;
67
+ }
68
+ exports.ptimeoutWithError = ptimeoutWithError;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeAbort = void 0;
4
+ function makeAbort({ storage, controller, logger: defaultLogger }) {
5
+ return async function ({ logger = defaultLogger, } = {}) {
6
+ controller.abort();
7
+ const results = await Promise.allSettled(storage);
8
+ const eyes = results.reduce((eyes, result) => {
9
+ const value = result.status === 'fulfilled' ? result.value : result.reason;
10
+ return eyes.set(value.eyes, value.renderer);
11
+ }, new Map());
12
+ return Promise.all(Array.from(eyes.entries(), async ([eyes, renderer]) => {
13
+ const [result] = await eyes.abort({ logger });
14
+ return { ...result, renderer };
15
+ }));
16
+ };
17
+ }
18
+ exports.makeAbort = makeAbort;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeCheckAndClose = void 0;
4
+ function makeCheckAndClose(_options) {
5
+ return null;
6
+ }
7
+ exports.makeCheckAndClose = makeCheckAndClose;
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.makeCheck = void 0;
27
+ const driver_1 = require("@applitools/driver");
28
+ const take_snapshots_1 = require("./utils/take-snapshots");
29
+ const wait_for_lazy_load_1 = require("../utils/wait-for-lazy-load");
30
+ const to_base_check_settings_1 = require("../utils/to-base-check-settings");
31
+ const generate_safe_selectors_1 = require("./utils/generate-safe-selectors");
32
+ const utils = __importStar(require("@applitools/utils"));
33
+ function makeCheck({ spec, getEyes, client, test, signal, target: defaultTarget, logger: defaultLogger, }) {
34
+ return async function check({ target = defaultTarget, settings = {}, logger = defaultLogger, }) {
35
+ var _a, _b;
36
+ logger.log('Command "check" is called with settings', settings);
37
+ if (signal.aborted) {
38
+ logger.warn('Command "check" was called after test was already aborted');
39
+ throw new Error('Command "check" was called after test was already aborted');
40
+ }
41
+ const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
42
+ let snapshots, snapshotUrl, snapshotTitle, regionToTarget, selectorsToCalculate;
43
+ if (spec === null || spec === void 0 ? void 0 : spec.isDriver(target)) {
44
+ // TODO driver custom config
45
+ const driver = await (0, driver_1.makeDriver)({ spec, driver: target, logger });
46
+ const viewportSize = await driver.getViewportSize();
47
+ if (driver.isWeb && (!settings.renderers || settings.renderers.length === 0)) {
48
+ settings.renderers = [{ name: 'chrome', ...viewportSize }];
49
+ }
50
+ let cleanupGeneratedSelectors;
51
+ if (driver.isWeb) {
52
+ const generated = await (0, generate_safe_selectors_1.generateSafeSelectors)({
53
+ context: driver.currentContext,
54
+ elementReferences: [...(elementReferenceToTarget ? [elementReferenceToTarget] : []), ...elementReferencesToCalculate],
55
+ });
56
+ cleanupGeneratedSelectors = generated.cleanupGeneratedSelectors;
57
+ if (elementReferenceToTarget) {
58
+ regionToTarget = (_a = generated.selectors[0]) === null || _a === void 0 ? void 0 : _a.safeSelector;
59
+ if (!regionToTarget)
60
+ throw new Error('Target element not found');
61
+ selectorsToCalculate = generated.selectors.slice(1);
62
+ }
63
+ else {
64
+ selectorsToCalculate = generated.selectors;
65
+ }
66
+ }
67
+ snapshots = await (0, take_snapshots_1.takeSnapshots)({
68
+ driver,
69
+ settings: {
70
+ ...test.server,
71
+ waitBeforeCapture: settings.waitBeforeCapture,
72
+ disableBrowserFetching: settings.disableBrowserFetching,
73
+ layoutBreakpoints: settings.layoutBreakpoints,
74
+ renderers: settings.renderers,
75
+ skipResources: client.getCachedResourceUrls(),
76
+ },
77
+ hooks: {
78
+ async beforeSnapshots() {
79
+ if (driver.isWeb && settings.lazyLoad) {
80
+ await (0, wait_for_lazy_load_1.waitForLazyLoad)({ driver, settings: settings.lazyLoad !== true ? settings.lazyLoad : {}, logger });
81
+ }
82
+ },
83
+ },
84
+ provides: {
85
+ getChromeEmulationDevices: client.getChromeEmulationDevices,
86
+ getIOSDevices: client.getIOSDevices,
87
+ },
88
+ logger,
89
+ });
90
+ snapshotUrl = await driver.getUrl();
91
+ snapshotTitle = await driver.getTitle();
92
+ await (cleanupGeneratedSelectors === null || cleanupGeneratedSelectors === void 0 ? void 0 : cleanupGeneratedSelectors());
93
+ }
94
+ else {
95
+ snapshots = !utils.types.isArray(target) ? Array(settings.renderers.length).fill(target) : target;
96
+ snapshotUrl = utils.types.has(snapshots[0], 'url') ? snapshots[0].url : undefined;
97
+ }
98
+ regionToTarget !== null && regionToTarget !== void 0 ? regionToTarget : (regionToTarget = (_b = elementReferenceToTarget) !== null && _b !== void 0 ? _b : settings.region);
99
+ selectorsToCalculate !== null && selectorsToCalculate !== void 0 ? selectorsToCalculate : (selectorsToCalculate = elementReferencesToCalculate.map(selector => ({
100
+ originalSelector: selector,
101
+ safeSelector: selector,
102
+ })));
103
+ const promises = settings.renderers.map(async (renderer, index) => {
104
+ try {
105
+ if (signal.aborted) {
106
+ logger.warn('Command "check" was aborted before rendering');
107
+ throw new Error('Command "check" was aborted before rendering');
108
+ }
109
+ const { cookies, ...snapshot } = snapshots[index];
110
+ const renderTargetPromise = client.createRenderTarget({
111
+ snapshot,
112
+ settings: { renderer, referer: snapshotUrl, cookies, proxy: test.server.proxy, autProxy: settings.autProxy },
113
+ });
114
+ const request = {
115
+ target: null,
116
+ settings: {
117
+ ...settings,
118
+ region: regionToTarget,
119
+ type: utils.types.has(snapshot, 'cdt') ? 'web' : 'native',
120
+ renderer,
121
+ selectorsToCalculate: selectorsToCalculate.map(({ safeSelector }) => safeSelector),
122
+ includeFullPageSize: Boolean(settings.pageId),
123
+ },
124
+ };
125
+ const { rendererId, rawEnvironment } = await client.bookRenderer({ settings: request.settings });
126
+ const eyes = await getEyes({ rawEnvironment });
127
+ try {
128
+ if (signal.aborted) {
129
+ logger.warn('Command "check" was aborted before rendering');
130
+ throw new Error('Command "check" was aborted before rendering');
131
+ }
132
+ else if (eyes.aborted) {
133
+ logger.warn(`Renderer with id ${rendererId} was aborted during one of the previous steps`);
134
+ throw new Error(`Renderer with id "${rendererId}" was aborted during one of the previous steps`);
135
+ }
136
+ request.settings.rendererId = rendererId;
137
+ request.target = await renderTargetPromise;
138
+ if (signal.aborted) {
139
+ logger.warn('Command "check" was aborted before rendering');
140
+ throw new Error('Command "check" was aborted before rendering');
141
+ }
142
+ else if (eyes.aborted) {
143
+ logger.warn(`Renderer with id ${rendererId} was aborted during one of the previous steps`);
144
+ throw new Error(`Renderer with id "${rendererId}" was aborted during one of the previous steps`);
145
+ }
146
+ const { renderId, selectorRegions, ...baseTarget } = await client.render({ request, signal });
147
+ const baseSettings = getBaseCheckSettings({
148
+ calculatedRegions: selectorsToCalculate.map(({ originalSelector }, index) => ({
149
+ selector: originalSelector,
150
+ regions: selectorRegions[index],
151
+ })),
152
+ });
153
+ baseSettings.renderId = renderId;
154
+ baseTarget.source = snapshotUrl;
155
+ baseTarget.name = snapshotTitle;
156
+ if (signal.aborted) {
157
+ logger.warn('Command "check" was aborted after rendering');
158
+ throw new Error('Command "check" was aborted after rendering');
159
+ }
160
+ else if (eyes.aborted) {
161
+ logger.warn(`Renderer with id ${rendererId} was aborted during one of the previous steps`);
162
+ throw new Error(`Renderer with id "${rendererId}" was aborted during one of the previous steps`);
163
+ }
164
+ const [result] = await eyes.check({ target: baseTarget, settings: baseSettings, logger });
165
+ if (eyes.aborted) {
166
+ logger.warn(`Renderer with id ${rendererId} was aborted during one of the previous steps`);
167
+ throw new Error(`Renderer with id "${rendererId}" was aborted during one of the previous steps`);
168
+ }
169
+ return { ...result, eyes, renderer };
170
+ }
171
+ catch (error) {
172
+ error.eyes = eyes;
173
+ await eyes.abort();
174
+ throw error;
175
+ }
176
+ }
177
+ catch (error) {
178
+ error.userTestId = test.userTestId;
179
+ error.renderer = renderer;
180
+ throw error;
181
+ }
182
+ });
183
+ return settings.renderers.map((renderer, index) => ({
184
+ asExpected: true,
185
+ windowId: null,
186
+ userTestId: test.userTestId,
187
+ renderer,
188
+ promise: promises[index],
189
+ }));
190
+ };
191
+ }
192
+ exports.makeCheck = makeCheck;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeClose = void 0;
4
+ function makeClose({ storage, logger: defaultLogger }) {
5
+ return async function ({ settings, logger = defaultLogger, } = {}) {
6
+ const results = await Promise.allSettled(storage);
7
+ let error;
8
+ const eyes = results.reduce((eyes, result) => {
9
+ let value;
10
+ if (result.status === 'fulfilled') {
11
+ value = result.value;
12
+ }
13
+ else {
14
+ value = result.reason;
15
+ error !== null && error !== void 0 ? error : (error = result.reason);
16
+ }
17
+ return eyes.set(value.eyes, value.renderer);
18
+ }, new Map());
19
+ if (error) {
20
+ await Promise.all(Array.from(eyes.entries(), async ([eyes]) => eyes.abort({ logger })));
21
+ throw error;
22
+ }
23
+ else {
24
+ return Promise.all(Array.from(eyes.entries(), async ([eyes, renderer]) => {
25
+ const [result] = await eyes.close({ settings, logger });
26
+ return { ...result, renderer };
27
+ }));
28
+ }
29
+ };
30
+ }
31
+ exports.makeClose = makeClose;