@applitools/core 4.74.1 → 4.75.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 (73) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/README.md +15 -20
  3. package/dist/automation/abort.js +8 -18
  4. package/dist/automation/close.js +8 -27
  5. package/dist/automation/get-results.js +3 -11
  6. package/dist/automation/utils/make-environment-loggers.js +39 -0
  7. package/dist/automation/utils/to-environment-key.js +6 -1
  8. package/dist/classic/check-and-close.js +26 -69
  9. package/dist/classic/check.js +85 -354
  10. package/dist/classic/get-base-eyes.js +15 -54
  11. package/dist/classic/open-eyes.js +17 -10
  12. package/dist/classic/utils/capture.js +209 -0
  13. package/dist/get-typed-eyes.js +2 -2
  14. package/dist/offline/run-offline-snapshots.js +3 -1
  15. package/dist/open-eyes.js +5 -1
  16. package/dist/tasks/abort.js +32 -0
  17. package/dist/tasks/aborted-check.js +14 -0
  18. package/dist/tasks/classic/capture.js +54 -0
  19. package/dist/tasks/classic/steps.js +51 -0
  20. package/dist/tasks/classic/upload.js +40 -0
  21. package/dist/tasks/close.js +31 -0
  22. package/dist/tasks/fill.js +13 -0
  23. package/dist/tasks/get-results.js +29 -0
  24. package/dist/tasks/graph.js +6 -0
  25. package/dist/tasks/index.js +20 -0
  26. package/dist/tasks/lifecycle.js +101 -0
  27. package/dist/tasks/match.js +109 -0
  28. package/dist/tasks/open.js +38 -0
  29. package/dist/tasks/queries.js +39 -0
  30. package/dist/tasks/types.js +2 -0
  31. package/dist/tasks/ufg/create-render-target.js +16 -0
  32. package/dist/tasks/ufg/recheck.js +49 -0
  33. package/dist/tasks/ufg/render.js +66 -0
  34. package/dist/tasks/ufg/steps.js +51 -0
  35. package/dist/tasks/upload-target.js +10 -0
  36. package/dist/ufg/check-and-close.js +32 -137
  37. package/dist/ufg/check.js +39 -175
  38. package/dist/ufg/get-base-eyes.js +34 -72
  39. package/dist/ufg/open-eyes.js +14 -8
  40. package/dist/utils/extract-git-info.js +9 -2
  41. package/package.json +20 -19
  42. package/types/automation/abort.d.ts +2 -3
  43. package/types/automation/close.d.ts +2 -3
  44. package/types/automation/types.d.ts +13 -16
  45. package/types/automation/utils/make-environment-loggers.d.ts +3 -0
  46. package/types/classic/get-base-eyes.d.ts +5 -9
  47. package/types/classic/open-eyes.d.ts +4 -3
  48. package/types/classic/types.d.ts +1 -1
  49. package/types/classic/utils/capture.d.ts +21 -0
  50. package/types/tasks/abort.d.ts +11 -0
  51. package/types/tasks/aborted-check.d.ts +9 -0
  52. package/types/tasks/classic/capture.d.ts +10 -0
  53. package/types/tasks/classic/steps.d.ts +17 -0
  54. package/types/tasks/classic/upload.d.ts +14 -0
  55. package/types/tasks/close.d.ts +9 -0
  56. package/types/tasks/fill.d.ts +8 -0
  57. package/types/tasks/get-results.d.ts +6 -0
  58. package/types/tasks/graph.d.ts +3 -0
  59. package/types/tasks/index.d.ts +3 -0
  60. package/types/tasks/lifecycle.d.ts +23 -0
  61. package/types/tasks/match.d.ts +13 -0
  62. package/types/tasks/open.d.ts +10 -0
  63. package/types/tasks/queries.d.ts +15 -0
  64. package/types/tasks/types.d.ts +187 -0
  65. package/types/tasks/ufg/create-render-target.d.ts +11 -0
  66. package/types/tasks/ufg/recheck.d.ts +20 -0
  67. package/types/tasks/ufg/render.d.ts +15 -0
  68. package/types/tasks/ufg/steps.d.ts +15 -0
  69. package/types/tasks/upload-target.d.ts +5 -0
  70. package/types/ufg/get-base-eyes.d.ts +5 -10
  71. package/types/ufg/open-eyes.d.ts +4 -3
  72. package/types/ufg/types.d.ts +1 -1
  73. package/types/utils/extract-git-info.d.ts +2 -1
@@ -1,43 +1,14 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
29
3
  exports.makeCheck = void 0;
30
- const nml_client_1 = require("@applitools/nml-client");
31
4
  const driver_1 = require("@applitools/driver");
32
- const take_screenshots_1 = require("./utils/take-screenshots");
33
- const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
34
- const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
35
5
  const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
36
6
  const to_environment_key_1 = require("../automation/utils/to-environment-key");
7
+ const tasks_1 = require("../tasks");
8
+ const steps_1 = require("../tasks/classic/steps");
9
+ const capture_1 = require("./utils/capture");
37
10
  const abort_error_1 = require("../errors/abort-error");
38
- const chalk_1 = __importDefault(require("chalk"));
39
- const utils = __importStar(require("@applitools/utils"));
40
- const lang = __importStar(require("../lang"));
11
+ const ABORTED = 'Command "check" was aborted before checking';
41
12
  function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironments = [], spec, signal, logger: mainLogger, }) {
42
13
  return async function check({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
43
14
  var _a;
@@ -52,335 +23,95 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
52
23
  throw new abort_error_1.AbortError('Command "check" was called after test was already aborted');
53
24
  }
54
25
  const uniqueEnvironments = (0, uniquify_environments_1.uniquifyEnvironments)((_a = settings.environments) !== null && _a !== void 0 ? _a : defaultEnvironments);
55
- let driver = undefined;
56
- if ((0, driver_1.isDriver)(target, spec)) {
57
- driver = await (0, driver_1.makeDriver)({ spec, driver: target, reset: target === defaultTarget, logger });
58
- if (settings.matchTimeout) {
59
- // when match timeout is set, retry checking until it passes or timeout is reached. This will stall the client test execution until it passes or timeout is reached to prevent the test from continuing and changing the state of the app
60
- logger.log(`Match timeout is set to ${settings.matchTimeout}ms - will retry checking until it passes or timeout is reached`);
61
- const start = Date.now();
62
- const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
63
- // this getter actually open the eyes session if it's not already open
64
- const baseEyes = await Promise.all(uniqueEnvironments.map(environment => getBaseEyes({ environment, driver, logger: environmentLogger })));
65
- // if the test is new for any of the environments, we wait for the page to stabaliize before starting the checks. This should prevent us from creating a baseline with a loading spinner or something similar
66
- if (baseEyes.map(baseEye => baseEye.test.isNew).some(isNew => isNew)) {
67
- await new Promise(resolve => setTimeout(resolve, settings.matchTimeout));
68
- }
69
- let asExpected = false, retries = 0;
70
- do {
71
- retries++;
72
- // generate base targets (images to be compared) and settings for each environment
73
- const baseScreenshotsAndSettings = await generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver);
74
- const promises = baseScreenshotsAndSettings.map(async ({ exactEnvironment: environment, baseSetting: settings, baseTarget: target }) => {
75
- return await checkEnvironment({
76
- eyes,
77
- driver,
78
- target,
79
- environment,
80
- signal,
81
- logger,
82
- settings: {
83
- ...settings,
84
- replaceLast: retries > 1,
85
- },
86
- });
87
- });
88
- const results = await Promise.all(promises);
89
- asExpected = results.every(result => result.asExpected);
90
- if (retries === 1) {
91
- baseScreenshotsAndSettings.forEach(({ exactEnvironment }) => {
92
- // put dummy promises in storage to tell eyes.close that all checks hepped
93
- putInStorage(exactEnvironment, eyes, Promise.resolve());
94
- });
95
- }
96
- } while (!asExpected && Date.now() - start < settings.matchTimeout);
97
- }
98
- else {
99
- // Eagerly start opening sessions for web environments while screenshots are being taken.
100
- // NML environments are excluded because their exact environment shape (deviceName, os,
101
- // viewportSize) is only resolved after generateBaseScreenshotsAndSettings() returns, and
102
- // using the unique env shape would open the session with wrong/empty fields.
103
- const environmentLoggers = new Map();
104
- uniqueEnvironments
105
- .filter(env => !('iosDeviceInfo' in env) && !('androidDeviceInfo' in env))
106
- .forEach(environment => {
107
- const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
108
- environmentLoggers.set((0, to_environment_key_1.toEnvironmentKey)(environment), environmentLogger);
109
- void getBaseEyes({ environment, driver, logger: environmentLogger });
110
- });
111
- // generate base targets (images to be compared) and settings for each environment
112
- const baseScreenshotsAndSettings = await generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver);
113
- // when no match timeout is set, queue all environment checks against the server without stalling the client test execution
114
- baseScreenshotsAndSettings.forEach(({ exactEnvironment: environment, baseSetting, baseTarget }) => {
115
- checkInTheBackground(environment, baseTarget, baseSetting, environmentLoggers.get((0, to_environment_key_1.toEnvironmentKey)(environment)));
116
- });
117
- }
118
- }
119
- else {
120
- uniqueEnvironments.forEach(environment => checkInTheBackground(environment, target, settings));
121
- }
122
- function checkInTheBackground(environment, target, settings, environmentLogger) {
123
- putInStorage(environment, eyes, checkEnvironment({ eyes, driver, target, environment, signal, logger, settings, environmentLogger }));
26
+ const mutability = settings.assumesMutability ? { eyes, checkName: settings.name } : undefined;
27
+ if (!(0, driver_1.isDriver)(target, spec)) {
28
+ uniqueEnvironments.forEach(environment => addStep(environment, { upload: { target, settings: settings } }, undefined, {
29
+ canFuse: true,
30
+ mutability,
31
+ }));
32
+ return;
124
33
  }
125
- };
126
- function putInStorage(environment, eyes, promise) {
127
- const key = (0, to_environment_key_1.toEnvironmentKey)(environment);
128
- let item = eyes.storage.get(key);
129
- if (!item) {
130
- item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
131
- eyes.storage.set(key, item);
34
+ const driver = await (0, driver_1.makeDriver)({ spec, driver: target, reset: target === defaultTarget, logger });
35
+ if ((signal === null || signal === void 0 ? void 0 : signal.aborted) && settings.matchTimeout)
36
+ throw abortError();
37
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted)
38
+ return (0, tasks_1.addAbortedCheck)(eyes, uniqueEnvironments, ABORTED, logger);
39
+ if (settings.matchTimeout) {
40
+ // when match timeout is set, retry checking until it passes or timeout is reached. This will stall the client test execution until it passes or timeout is reached to prevent the test from continuing and changing the state of the app
41
+ logger.log(`Match timeout is set to ${settings.matchTimeout}ms - will retry checking until it passes or timeout is reached`);
42
+ const start = Date.now();
43
+ let asExpected = false;
44
+ let retries = 0;
45
+ do {
46
+ retries += 1;
47
+ const capture = (0, steps_1.addCapture)(eyes.session, {
48
+ eyes,
49
+ driver,
50
+ settings: { ...settings, replaceLast: retries > 1 },
51
+ environments: uniqueEnvironments,
52
+ newTestDelay: retries === 1 ? settings.matchTimeout : undefined,
53
+ logger,
54
+ });
55
+ // Each attempt's steps go to the session of the environment the capture resolved.
56
+ const environments = await capture.promise.then(captured => captured.map(({ exactEnvironment }) => exactEnvironment), () => uniqueEnvironments);
57
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted)
58
+ throw abortError();
59
+ const matches = environments.map((environment, index) => addStep(environment, { upload: { index }, capture }, driver, {
60
+ canFuse: false,
61
+ mutability: retries === 1 ? mutability : undefined,
62
+ }));
63
+ const results = Promise.all(matches.map(match => match.promise.then(result => result.asExpected, () => false)));
64
+ await capture.promise;
65
+ asExpected = (await results).every(Boolean);
66
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted)
67
+ throw abortError();
68
+ } while (!asExpected && Date.now() - start < settings.matchTimeout);
69
+ return;
132
70
  }
133
- item.jobs.push(promise.then());
134
- return item;
135
- }
136
- function getBaseEyes({ environment, driver, logger, }) {
137
- return eyes.getBaseEyes({ settings: { environment, driver }, logger });
138
- }
139
- }
140
- exports.makeCheck = makeCheck;
141
- async function logAmmutabilityIfNeeded({ eyes, baseEyes, settings, logger, }) {
142
- var _a;
143
- if (settings.assumesMutability) {
144
- await eyes.core.logEvent({
145
- settings: {
146
- level: 'Notice',
147
- event: {
148
- type: 'eyes.check',
149
- message: 'Assuming mutability for check Target',
150
- test: {
151
- checkName: settings.name,
152
- batchId: baseEyes.test.batchId,
153
- sessionId: baseEyes.test.sessionId,
154
- testName: baseEyes.test.testName,
155
- testId: baseEyes.test.testId,
156
- userTestId: baseEyes.test.userTestId,
157
- appId: baseEyes.test.appId,
158
- baselineId: baseEyes.test.baselineId,
159
- environmentId: (_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId,
160
- },
161
- isNew: baseEyes.test.isNew,
162
- resultsUrl: baseEyes.test.resultsUrl,
163
- },
164
- ...eyes.test.eyesServer,
165
- },
166
- logger,
71
+ // One capture of every environment; the check returns once it's done (the test may change the page
72
+ // right after), while its steps run in the background.
73
+ const driverEnvironment = await driver.getEnvironment();
74
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted)
75
+ return (0, tasks_1.addAbortedCheck)(eyes, uniqueEnvironments, ABORTED, logger);
76
+ const capture = (0, steps_1.addCapture)(eyes.session, { eyes, driver, settings, environments: uniqueEnvironments, logger });
77
+ const canOpenBeforeCapture = uniqueEnvironments.map(environment => (0, capture_1.isCapturedAsRequested)(settings, driverEnvironment, environment));
78
+ uniqueEnvironments.forEach((environment, index) => {
79
+ if (canOpenBeforeCapture[index]) {
80
+ addStep(environment, { upload: { index }, capture }, driver, { canFuse: true, mutability });
81
+ }
167
82
  });
168
- settings.assumesMutability = false; // prevent from logging this message again for the same check
169
- }
170
- }
171
- async function checkEnvironment({ eyes, driver, target, environment, signal, logger, settings, environmentLogger: providedEnvironmentLogger, }) {
172
- var _a, _b;
173
- const environmentLogger = providedEnvironmentLogger !== null && providedEnvironmentLogger !== void 0 ? providedEnvironmentLogger : logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
174
- environmentLogger.log('Command "check" is called with settings', settings);
175
- try {
83
+ const captured = await capture.promise;
176
84
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
177
- abortError({ logger: environmentLogger, message: 'Command "check" was aborted before checking' });
85
+ return (0, tasks_1.addAbortedCheck)(eyes, captured.map(({ exactEnvironment }) => exactEnvironment), ABORTED, logger);
178
86
  }
179
- const baseEyes = await eyes.getBaseEyes({ settings: { environment, driver }, logger: environmentLogger });
180
- void logAmmutabilityIfNeeded({
181
- eyes,
182
- baseEyes,
183
- settings,
184
- logger: environmentLogger,
185
- });
186
- try {
187
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
188
- abortError({
189
- logger: environmentLogger,
190
- message: `Command "check" was aborted before checking`,
191
- });
87
+ captured.forEach(({ exactEnvironment }, index) => {
88
+ if (!canOpenBeforeCapture[index]) {
89
+ addStep(exactEnvironment, { upload: { index }, capture }, driver, { canFuse: true, mutability });
192
90
  }
193
- else if (!baseEyes.running) {
194
- abortError({
195
- logger: environmentLogger,
196
- message: `Check on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" was aborted during one of the previous steps`,
197
- });
198
- }
199
- return await baseEyes.check({
200
- target,
201
- settings: settings,
202
- logger: environmentLogger,
203
- });
204
- }
205
- catch (error) {
206
- environmentLogger.error(`Check on environment with id "${(_b = baseEyes.test.environment) === null || _b === void 0 ? void 0 : _b.environmentId}" failed due to an error`, error);
207
- if (baseEyes.running && !(signal === null || signal === void 0 ? void 0 : signal.aborted))
208
- void baseEyes.abort({ logger: environmentLogger, settings: { reason: error } });
209
- }
210
- }
211
- catch (error) {
212
- environmentLogger.error(`Environment with id ${environment.environmentId} failed before checking started due to an error`, error);
213
- error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
214
- throw error;
215
- }
216
- return { asExpected: false };
217
- }
218
- /**
219
- * @throws {AbortError}
220
- */
221
- function abortError({ logger, message }) {
222
- logger.warn(message);
223
- throw new abort_error_1.AbortError(message);
224
- }
225
- /**
226
- * create base targets (array of screenshots) and base settings (array of check settings) for each environment
227
- */
228
- async function generateBaseScreenshotsAndSettings(settings, uniqueEnvironments, eyes, logger, driver) {
229
- var _a;
230
- const driverEnvironment = await driver.getEnvironment();
231
- uniqueEnvironments = addMobileDeviceInfo(uniqueEnvironments, driverEnvironment);
232
- await beforeScreenshot();
233
- const shouldTakeWebScreenshot = driverEnvironment.isWeb ||
234
- !((_a = driverEnvironment.applitoolsLib) === null || _a === void 0 ? void 0 : _a.instrumented) ||
235
- settings.webview ||
236
- settings.screenshotMode === 'default';
237
- if (shouldTakeWebScreenshot) {
238
- return await takeWebScreenshot({
239
- driver,
240
- settings,
241
- environments: uniqueEnvironments,
242
- logger,
243
- eyes,
244
91
  });
245
- }
246
- else {
247
- // take screenshot using NML
248
- checkConflictingCapabilities();
249
- return await takeNMLScreenshot({
250
- driver,
251
- settings,
252
- environments: uniqueEnvironments,
253
- logger,
254
- eyes,
255
- });
256
- }
257
- async function beforeScreenshot() {
258
- var _a;
259
- await driver.currentContext.setScrollingElement((_a = settings.scrollRootElement) !== null && _a !== void 0 ? _a : null);
260
- if (settings.lazyLoad && driverEnvironment.isWeb) {
261
- await (0, wait_for_lazy_load_1.waitForLazyLoad)({
262
- context: driver.currentContext,
263
- settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
264
- logger,
265
- });
92
+ function abortError() {
93
+ logger.warn(ABORTED);
94
+ return new abort_error_1.AbortError(ABORTED, { userTestId: eyes.test.userTestId, environment: uniqueEnvironments[0] });
266
95
  }
267
- }
268
- function checkConflictingCapabilities() {
269
- var _a;
270
- if ((_a = driverEnvironment.applitoolsLib) === null || _a === void 0 ? void 0 : _a.conflictingCapabilities) {
271
- const message = lang.applitoolsLibConflictingCapabilitiesWarning({
272
- conflictingCapabilities: driverEnvironment.applitoolsLib.conflictingCapabilities,
96
+ function addStep(environment, step, driver, match) {
97
+ const environmentLogger = eyes.getEnvironmentLogger(environment, logger);
98
+ const open = { eyes, environment, driver, logger: environmentLogger };
99
+ return (0, steps_1.addCheck)(eyes.session, (0, to_environment_key_1.toEnvironmentKey)(environment), {
100
+ open,
101
+ capture: step.capture,
102
+ upload: { ...step.upload, signal, logger: environmentLogger },
103
+ inputs: {
104
+ ...match,
105
+ signal,
106
+ onError: (error, baseEyes) => {
107
+ var _a;
108
+ environmentLogger.error(`Check on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" failed due to an error`, error);
109
+ error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
110
+ },
111
+ logger: environmentLogger,
112
+ },
273
113
  });
274
- logger.console.log(chalk_1.default.yellow(message));
275
- logger.log(message);
276
- }
277
- }
278
- function addMobileDeviceInfo(environments, driverEnvironment) {
279
- return environments.map(environment => {
280
- var _a, _b;
281
- var _c, _d;
282
- if (utils.types.has(environment, 'iosDeviceInfo')) {
283
- (_a = (_c = environment.iosDeviceInfo).version) !== null && _a !== void 0 ? _a : (_c.version = driverEnvironment.platformVersion);
284
- }
285
- else if (utils.types.has(environment, 'androidDeviceInfo')) {
286
- (_b = (_d = environment.androidDeviceInfo).version) !== null && _b !== void 0 ? _b : (_d.version = driverEnvironment.platformVersion);
287
- }
288
- return environment;
289
- });
290
- }
291
- }
292
- async function takeWebScreenshot({ driver, settings, environments, logger, eyes, }) {
293
- let actualEnvironments = environments;
294
- if (settings.screenshotMode === 'default') {
295
- const { localEnvironment, renderEnvironments } = await (0, nml_client_1.getNMLEnvironmentsInfo)({
296
- environments: environments,
297
- supportedEnvironmentsUrl: eyes.test.supportedEnvironmentsUrl,
298
- proxy: eyes.test.eyesServer.proxy,
299
- logger,
300
- });
301
- actualEnvironments = localEnvironment ? [localEnvironment] : renderEnvironments;
302
- }
303
- const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({ settings });
304
- const screenshots = await (0, take_screenshots_1.takeScreenshots)({
305
- driver,
306
- settings: {
307
- ...settings,
308
- environments: actualEnvironments,
309
- regionsToCalculate: elementReferences.calculate,
310
- calculateView: !!settings.pageId,
311
- domSettings: settings.sendDom ? { proxy: eyes.test.eyesServer.proxy } : undefined,
312
- },
313
- logger,
314
- });
315
- return screenshots.map(({ calculatedRegions, ...baseTarget }, i) => {
316
- return {
317
- baseTarget,
318
- baseSetting: getBaseCheckSettings({ calculatedRegions }),
319
- exactEnvironment: actualEnvironments[i],
320
- };
321
- });
322
- }
323
- async function takeNMLScreenshot({ driver, settings, environments, logger, eyes, }) {
324
- const nmlClient = await eyes.core.getNMLClient({
325
- driver,
326
- settings: { ...eyes.test.eyesServer, supportedEnvironmentsUrl: eyes.test.supportedEnvironmentsUrl },
327
- logger,
328
- });
329
- if (settings.scrollRootElement || settings.region || (0, to_base_check_settings_1.hasCodedRegions)(settings)) {
330
- //TODO we can skip `preTakeScreenshot` if the element/s already have the attribute `content-desc` (for android)
331
- // and send it to `takeScreenshot` right away (possibly with `name` attribute for ios as well)
332
- await nmlClient.preTakeScreenshot({ logger });
333
- }
334
- const { elementReferences, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
335
- settings: {
336
- ...settings,
337
- ...(await (0, to_base_check_settings_1.extractMobileElementsIntoCheckSettings)({ settings, driver, logger })),
338
- },
339
- });
340
- const calculate = elementReferences.calculate;
341
- if (typeof settings.waitBeforeCapture === 'function') {
342
- throw new Error('providing functions to waitBeforeCapture is not supported in NML - please use a number instead');
343
- }
344
- const screenshots = await nmlClient.takeScreenshots({
345
- settings: {
346
- environments: environments,
347
- fully: settings.fully,
348
- stitchMode: settings.stitchMode,
349
- hideScrollbars: settings.hideScrollbars,
350
- hideCaret: settings.hideCaret,
351
- overlap: settings.overlap,
352
- waitBeforeCapture: settings.waitBeforeCapture,
353
- waitBetweenStitches: settings.waitBetweenStitches,
354
- lazyLoad: settings.lazyLoad,
355
- name: settings.name,
356
- region: elementReferences.target,
357
- selectorsToFindRegionsFor: calculate.map(({ name }) => name),
358
- scrollRootElement: elementReferences.scrolling,
359
- sendDom: settings.sendDom,
360
- },
361
- logger,
362
- });
363
- return screenshots.map(({ calculateRegions, ...baseTarget }) => {
364
- var _a, _b;
365
- const aggregateCalculatedRegions = [];
366
- calculate.forEach(({ reference }, index) => {
367
- const regions = calculateRegions === null || calculateRegions === void 0 ? void 0 : calculateRegions[index];
368
- if (regions) {
369
- aggregateCalculatedRegions.push({ regions, selector: reference });
370
- }
371
- else {
372
- logger.log(`Regions "${JSON.stringify(reference)}" was not found in the screenshot`);
373
- }
374
- });
375
- if ((_a = baseTarget.dom) === null || _a === void 0 ? void 0 : _a.error) {
376
- logger.warn('could not fetch DOM: ' + baseTarget.dom.error);
377
114
  }
378
- return {
379
- baseTarget: { ...baseTarget, dom: (_b = baseTarget.dom) === null || _b === void 0 ? void 0 : _b.url, isTransformed: true },
380
- baseSetting: getBaseCheckSettings({
381
- calculatedRegions: aggregateCalculatedRegions,
382
- }),
383
- exactEnvironment: baseTarget.environment,
384
- };
385
- });
115
+ };
386
116
  }
117
+ exports.makeCheck = makeCheck;
@@ -1,59 +1,20 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.makeGetBaseEyes = void 0;
27
- const to_environment_key_1 = require("../automation/utils/to-environment-key");
28
- const utils = __importStar(require("@applitools/utils"));
3
+ exports.getBaseEyes = void 0;
29
4
  const report_kobiton_1 = require("../automation/utils/report-kobiton");
30
- function makeGetBaseEyes({ settings: defaultSettings, eyes, logger: mainLogger, }) {
31
- const getBaseEyesWithCache = utils.general.wrap(getBaseEyes, (getBaseEyes, options) => {
32
- const key = (0, to_environment_key_1.toEnvironmentKey)(options.settings.environment);
33
- let item = eyes.storage.get(key);
34
- if (!item) {
35
- item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
36
- eyes.storage.set(key, item);
37
- }
38
- if (!item.eyes.settled)
39
- item.eyes.resolve(getBaseEyes(options));
40
- return item.eyes;
5
+ async function getBaseEyes({ eyes, settings, logger, }) {
6
+ var _a;
7
+ const defaultSettings = eyes.openSettings;
8
+ logger.log(`Command "getBaseEyes" is called with settings`, settings);
9
+ const baseEyes = await eyes.core.base.openEyes({
10
+ settings: {
11
+ ...defaultSettings,
12
+ fallbackBaselineId: (_a = settings.environment) === null || _a === void 0 ? void 0 : _a.fallbackBaselineId,
13
+ environment: { ...defaultSettings.environment, ...settings.environment },
14
+ },
15
+ logger,
41
16
  });
42
- return getBaseEyesWithCache;
43
- async function getBaseEyes({ settings, logger = mainLogger, }) {
44
- var _a;
45
- logger = logger.extend(mainLogger);
46
- logger.log(`Command "getBaseEyes" is called with settings`, settings);
47
- const baseEyes = await eyes.core.base.openEyes({
48
- settings: {
49
- ...defaultSettings,
50
- fallbackBaselineId: (_a = settings.environment) === null || _a === void 0 ? void 0 : _a.fallbackBaselineId,
51
- environment: { ...defaultSettings.environment, ...settings.environment },
52
- },
53
- logger,
54
- });
55
- void (0, report_kobiton_1.reportKobiton)({ driver: settings.driver, settings: baseEyes.test, logger });
56
- return baseEyes;
57
- }
17
+ void (0, report_kobiton_1.reportKobiton)({ driver: settings.driver, settings: baseEyes.test, logger });
18
+ return baseEyes;
58
19
  }
59
- exports.makeGetBaseEyes = makeGetBaseEyes;
20
+ exports.getBaseEyes = getBaseEyes;
@@ -25,22 +25,24 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.makeOpenEyes = void 0;
27
27
  const driver_1 = require("@applitools/driver");
28
- const get_base_eyes_1 = require("./get-base-eyes");
29
28
  const check_1 = require("./check");
30
29
  const check_and_close_1 = require("./check-and-close");
31
30
  const close_1 = require("../automation/close");
32
31
  const abort_1 = require("../automation/abort");
33
32
  const get_results_1 = require("../automation/get-results");
34
33
  const extract_default_environments_1 = require("./utils/extract-default-environments");
34
+ const make_environment_loggers_1 = require("../automation/utils/make-environment-loggers");
35
+ const tasks_1 = require("../tasks");
36
+ const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
35
37
  const abort_controller_1 = require("abort-controller");
36
38
  const utils = __importStar(require("@applitools/utils"));
37
39
  function makeOpenEyes({ core, spec, logger: mainLogger }) {
38
- return async function openEyes({ target, settings, storage = new Map(), logger = mainLogger, }) {
39
- var _a, _b, _c, _d;
40
+ return async function openEyes({ target, settings, session = {}, logger = mainLogger, }) {
41
+ var _a, _b, _c, _d, _e;
40
42
  logger = logger.extend(mainLogger);
41
- logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []), storage.size > 0 ? 'and default eyes storage' : '');
43
+ logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []), (0, tasks_1.activeEnvironmentKeys)(session).length > 0 ? 'and existing sessions' : '');
42
44
  const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger, customConfig: settings }));
43
- if (driver && storage.size === 0) {
45
+ if (driver && (0, tasks_1.activeEnvironmentKeys)(session).length === 0) {
44
46
  const environment = await driver.getEnvironment();
45
47
  if (((_a = settings.environment) === null || _a === void 0 ? void 0 : _a.viewportSize) && !environment.isMobile) {
46
48
  await driver.setViewportSize(settings.environment.viewportSize);
@@ -68,7 +70,7 @@ function makeOpenEyes({ core, spec, logger: mainLogger }) {
68
70
  }
69
71
  }
70
72
  }
71
- return utils.general.extend({}, eyes => {
73
+ const eyes = utils.general.extend({}, eyes => {
72
74
  var _a, _b, _c, _d;
73
75
  return {
74
76
  type: 'classic',
@@ -86,15 +88,20 @@ function makeOpenEyes({ core, spec, logger: mainLogger }) {
86
88
  account,
87
89
  },
88
90
  running: true,
89
- storage,
90
- getBaseEyes: (0, get_base_eyes_1.makeGetBaseEyes)({ settings, eyes, logger }),
91
+ session,
92
+ getEnvironmentLogger: (0, make_environment_loggers_1.makeEnvironmentLoggers)(),
93
+ openSettings: settings,
91
94
  check: (0, check_1.makeCheck)({ eyes, target: driver, environments, spec, signal, logger }),
92
95
  checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ eyes, target: driver, environments, spec, signal, logger }),
93
- close: (0, close_1.makeClose)({ eyes, driver, environments, logger }),
94
- abort: (0, abort_1.makeAbort)({ eyes, driver, environments, controller, logger }),
96
+ close: (0, close_1.makeClose)({ eyes, driver, logger }),
97
+ abort: (0, abort_1.makeAbort)({ eyes, driver, controller, logger }),
95
98
  getResults: (0, get_results_1.makeGetResults)({ eyes, logger }),
96
99
  };
97
100
  });
101
+ // A device environment's session opens with the exact environment its capture resolves, so it isn't declared here.
102
+ const declared = (0, uniquify_environments_1.uniquifyEnvironments)(((_e = settings.environments) === null || _e === void 0 ? void 0 : _e.length) ? settings.environments : environments).filter(environment => !utils.types.has(environment, 'iosDeviceInfo') && !utils.types.has(environment, 'androidDeviceInfo'));
103
+ (0, tasks_1.declareOpens)(eyes, declared, driver, logger);
104
+ return eyes;
98
105
  };
99
106
  }
100
107
  exports.makeOpenEyes = makeOpenEyes;