@applitools/core 4.74.2 → 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 (70) hide show
  1. package/CHANGELOG.md +53 -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/tasks/abort.js +32 -0
  16. package/dist/tasks/aborted-check.js +14 -0
  17. package/dist/tasks/classic/capture.js +54 -0
  18. package/dist/tasks/classic/steps.js +51 -0
  19. package/dist/tasks/classic/upload.js +40 -0
  20. package/dist/tasks/close.js +31 -0
  21. package/dist/tasks/fill.js +13 -0
  22. package/dist/tasks/get-results.js +29 -0
  23. package/dist/tasks/graph.js +6 -0
  24. package/dist/tasks/index.js +20 -0
  25. package/dist/tasks/lifecycle.js +101 -0
  26. package/dist/tasks/match.js +109 -0
  27. package/dist/tasks/open.js +38 -0
  28. package/dist/tasks/queries.js +39 -0
  29. package/dist/tasks/types.js +2 -0
  30. package/dist/tasks/ufg/create-render-target.js +16 -0
  31. package/dist/tasks/ufg/recheck.js +49 -0
  32. package/dist/tasks/ufg/render.js +66 -0
  33. package/dist/tasks/ufg/steps.js +51 -0
  34. package/dist/tasks/upload-target.js +10 -0
  35. package/dist/ufg/check-and-close.js +32 -137
  36. package/dist/ufg/check.js +39 -175
  37. package/dist/ufg/get-base-eyes.js +34 -72
  38. package/dist/ufg/open-eyes.js +14 -8
  39. package/package.json +6 -5
  40. package/types/automation/abort.d.ts +2 -3
  41. package/types/automation/close.d.ts +2 -3
  42. package/types/automation/types.d.ts +13 -16
  43. package/types/automation/utils/make-environment-loggers.d.ts +3 -0
  44. package/types/classic/get-base-eyes.d.ts +5 -9
  45. package/types/classic/open-eyes.d.ts +4 -3
  46. package/types/classic/types.d.ts +1 -1
  47. package/types/classic/utils/capture.d.ts +21 -0
  48. package/types/tasks/abort.d.ts +11 -0
  49. package/types/tasks/aborted-check.d.ts +9 -0
  50. package/types/tasks/classic/capture.d.ts +10 -0
  51. package/types/tasks/classic/steps.d.ts +17 -0
  52. package/types/tasks/classic/upload.d.ts +14 -0
  53. package/types/tasks/close.d.ts +9 -0
  54. package/types/tasks/fill.d.ts +8 -0
  55. package/types/tasks/get-results.d.ts +6 -0
  56. package/types/tasks/graph.d.ts +3 -0
  57. package/types/tasks/index.d.ts +3 -0
  58. package/types/tasks/lifecycle.d.ts +23 -0
  59. package/types/tasks/match.d.ts +13 -0
  60. package/types/tasks/open.d.ts +10 -0
  61. package/types/tasks/queries.d.ts +15 -0
  62. package/types/tasks/types.d.ts +187 -0
  63. package/types/tasks/ufg/create-render-target.d.ts +11 -0
  64. package/types/tasks/ufg/recheck.d.ts +20 -0
  65. package/types/tasks/ufg/render.d.ts +15 -0
  66. package/types/tasks/ufg/steps.d.ts +15 -0
  67. package/types/tasks/upload-target.d.ts +5 -0
  68. package/types/ufg/get-base-eyes.d.ts +5 -10
  69. package/types/ufg/open-eyes.d.ts +4 -3
  70. package/types/ufg/types.d.ts +1 -1
package/dist/ufg/check.js CHANGED
@@ -35,10 +35,9 @@ const utils = __importStar(require("@applitools/utils"));
35
35
  const lang = __importStar(require("../lang"));
36
36
  const chalk_1 = __importDefault(require("chalk"));
37
37
  const take_snapshots_1 = require("./take-snapshots");
38
- const create_render_target_from_snapshot_1 = require("./create-render-target-from-snapshot");
39
- const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
40
38
  const to_old_infra_environment_1 = require("./to-old-infra-environment");
41
- const build_accessibility_report_options_1 = require("./build-accessibility-report-options");
39
+ const tasks_1 = require("../tasks");
40
+ const steps_1 = require("../tasks/ufg/steps");
42
41
  function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironments = [], spec, signal, logger: mainLogger, }) {
43
42
  // Sessions whose old-infra retry chain has ended: once a retry doesn't confirm an old-infra match,
44
43
  // the backend stops expecting retries, so we must stop sending them. baseEyes is cached per
@@ -78,183 +77,48 @@ function makeCheck({ eyes, target: defaultTarget, environments: defaultEnvironme
78
77
  // TODO (amit)
79
78
  snapshots = !utils.types.isArray(target) ? Array(uniqueEnvironments.length).fill(target) : target;
80
79
  }
81
- const promises = snapshots.map(async (snapshot, i) => {
82
- var _a, _b, _c, _d, _e, _f, _g, _h;
83
- const environmentLogger = logger.extend({ tags: [`environment-${utils.general.shortid()}`] });
84
- const { target } = snapshot;
80
+ if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
81
+ return (0, tasks_1.addAbortedCheck)(eyes, uniqueEnvironments, 'Command "check" was aborted before rendering', logger);
82
+ }
83
+ logInvalidSettings(logger, settings);
84
+ // Only request a report when the check configures an accessibility standard.
85
+ const accessibility = settings.accessibilitySettings
86
+ ? { accountOptions: eyes.test.account.accessibilityOptions, runOptions: settings.accessibilityRunOptions }
87
+ : undefined;
88
+ const mutability = settings.assumesMutability ? { eyes, checkName: settings.name } : undefined;
89
+ snapshots.forEach((snapshot, i) => {
85
90
  const environment = uniqueEnvironments[i];
91
+ const environmentLogger = eyes.getEnvironmentLogger(environment, logger);
86
92
  if (utils.types.has(environment, 'name') && environment.name === 'edge') {
87
93
  environmentLogger.console.log(chalk_1.default.yellow(lang.edgeUfgEnvironmentDeprecatedWarning));
88
94
  }
89
- try {
90
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
91
- environmentLogger.warn('Command "check" was aborted before rendering');
92
- throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
93
- }
94
- if (utils.types.has(environment, 'iosDeviceInfo') || utils.types.has(environment, 'androidDeviceInfo')) {
95
- environment.type = utils.types.has(target, 'cdt') ? 'web' : 'native';
96
- }
97
- const renderTargetPromise = (0, create_render_target_from_snapshot_1.createRenderTargetFromSnapshot)({
98
- ufgClient,
99
- snapshot,
100
- logger: environmentLogger,
101
- urlWithCredentials: snapshot.url,
102
- });
103
- const baseEyes = await eyes.getBaseEyes({ settings: { environment, driver }, logger: environmentLogger });
104
- try {
105
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
106
- environmentLogger.warn('Command "check" was aborted before rendering');
107
- throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
108
- }
109
- else if (!baseEyes.running) {
110
- environmentLogger.warn(`Render on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" was aborted during one of the previous steps`);
111
- throw new abort_error_1.AbortError(`Render on environment with id "${(_b = baseEyes.test.environment) === null || _b === void 0 ? void 0 : _b.environmentId}" was aborted during one of the previous steps`);
112
- }
113
- const renderTarget = await renderTargetPromise;
114
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
115
- environmentLogger.warn('Command "check" was aborted before rendering');
116
- throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
117
- }
118
- else if (!baseEyes.running) {
119
- environmentLogger.warn(`Render on environment with id "${(_c = baseEyes.test.environment) === null || _c === void 0 ? void 0 : _c.environmentId}" was aborted during one of the previous steps`);
120
- throw new abort_error_1.AbortError(`Render on environment with id "${(_d = baseEyes.test.environment) === null || _d === void 0 ? void 0 : _d.environmentId}" was aborted during one of the previous steps`);
121
- }
122
- const { elementReferences: selectors, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
123
- settings: snapshot.settings,
124
- });
125
- const renderForCheck = async (env) => {
126
- var _a, _b;
127
- // Only request a report when the check configures an accessibility standard.
128
- const accessibilityReportOptions = settings.accessibilitySettings
129
- ? (0, build_accessibility_report_options_1.buildAccessibilityReportOptions)({
130
- accountOptions: eyes.test.account.accessibilityOptions,
131
- runOptions: settings.accessibilityRunOptions,
132
- })
133
- : undefined;
134
- const { renderId, selectorRegions, ...target } = await ufgClient.render({
135
- target: renderTarget,
136
- settings: {
137
- ...snapshot.settings,
138
- region: (_a = selectors.target) !== null && _a !== void 0 ? _a : snapshot.settings.region,
139
- scrollRootElement: selectors.scrolling,
140
- selectorsToCalculate: selectors.calculate,
141
- includeFullPageSize: Boolean(snapshot.settings.pageId),
142
- environment: { ...env, environmentId: baseEyes.test.environment.environmentId },
143
- uploadUrl: baseEyes.test.uploadUrl,
144
- stitchingServiceUrl: baseEyes.test.stitchingServiceUrl,
145
- accessibilityReportOptions,
146
- },
147
- signal,
148
- logger: environmentLogger,
149
- });
150
- const checkSettings = getBaseCheckSettings({
151
- calculatedRegions: selectors.calculate.map((_, index) => {
152
- var _a;
153
- return ({
154
- regions: (_a = selectorRegions === null || selectorRegions === void 0 ? void 0 : selectorRegions[index]) !== null && _a !== void 0 ? _a : [],
155
- });
156
- }),
157
- });
158
- checkSettings.renderId = renderId;
159
- target.source = snapshot.url;
160
- target.name = snapshot.title;
161
- // Fall back to the minted upload URL when the render result carries no report location.
162
- if (accessibilityReportOptions === null || accessibilityReportOptions === void 0 ? void 0 : accessibilityReportOptions.uploadUrl)
163
- (_b = target.accessibilityReportLocation) !== null && _b !== void 0 ? _b : (target.accessibilityReportLocation = accessibilityReportOptions.uploadUrl);
164
- return { target, settings: checkSettings };
165
- };
166
- const { target: baseTarget, settings: baseSettings } = await renderForCheck(environment);
167
- if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
168
- environmentLogger.warn('Command "check" was aborted after rendering');
169
- throw new abort_error_1.AbortError('Command "check" was aborted after rendering');
170
- }
171
- else if (!baseEyes.running) {
172
- environmentLogger.warn(`Render on environment with id "${(_e = baseEyes.test.environment) === null || _e === void 0 ? void 0 : _e.environmentId}" was aborted during one of the previous steps`);
173
- throw new abort_error_1.AbortError(`Render on environment with id "${(_f = baseEyes.test.environment) === null || _f === void 0 ? void 0 : _f.environmentId}" was aborted during one of the previous steps`);
174
- }
175
- if (settings.assumesMutability) {
176
- void eyes.core.logEvent({
177
- settings: {
178
- level: 'Notice',
179
- event: {
180
- type: 'eyes.check',
181
- message: 'Assuming mutability for check Target',
182
- test: {
183
- checkName: settings.name,
184
- batchId: baseEyes.test.batchId,
185
- sessionId: baseEyes.test.sessionId,
186
- testName: baseEyes.test.testName,
187
- testId: baseEyes.test.testId,
188
- userTestId: baseEyes.test.userTestId,
189
- appId: baseEyes.test.appId,
190
- baselineId: baseEyes.test.baselineId,
191
- environmentId: (_g = baseEyes.test.environment) === null || _g === void 0 ? void 0 : _g.environmentId,
192
- },
193
- isNew: baseEyes.test.isNew,
194
- resultsUrl: baseEyes.test.resultsUrl,
195
- },
196
- ...eyes.test.eyesServer,
197
- },
198
- logger: environmentLogger,
199
- });
200
- }
201
- try {
202
- logInvalidSettings(logger, settings);
203
- }
204
- catch (err) {
205
- logger.log('Failed to log invalid check settings', err);
206
- }
207
- await baseEyes.check({
208
- target: { ...baseTarget, isTransformed: true },
209
- settings: baseSettings,
210
- logger: environmentLogger,
211
- // When the backend enabled old-infra retry, re-check a mismatch against the previous
212
- // browser version in the SAME step slot (so it reaches the backend before the next
213
- // step's check), and stop once a retry fails — at that point the backend treats the
214
- // session as non-infra and stops expecting retries. Best-effort: a failed retry render
215
- // must not abort the environment, since the primary check already recorded its step.
216
- followup: baseEyes.test.shouldRetryWithOldInfra
217
- ? async (result, recheck) => {
218
- if (result.asExpected || oldInfraRetryDisabled.has(baseEyes))
219
- return;
220
- const oldInfraEnvironment = (0, to_old_infra_environment_1.toOldInfraEnvironment)(environment);
221
- if (!oldInfraEnvironment)
222
- return;
223
- try {
224
- const { target, settings } = await renderForCheck(oldInfraEnvironment);
225
- settings.oldInfraRetry = true;
226
- const retry = await recheck({ ...target, isTransformed: true }, settings);
227
- if (!retry.asExpected)
228
- oldInfraRetryDisabled.add(baseEyes);
229
- }
230
- catch (error) {
231
- oldInfraRetryDisabled.add(baseEyes);
232
- environmentLogger.warn('Old-infra retry failed; keeping the primary check result', error);
233
- }
234
- }
235
- : undefined,
236
- });
237
- }
238
- catch (error) {
239
- environmentLogger.error(`Render on environment with id "${(_h = baseEyes.test.environment) === null || _h === void 0 ? void 0 : _h.environmentId}" failed due to an error`, error);
240
- if (baseEyes.running && !(signal === null || signal === void 0 ? void 0 : signal.aborted))
241
- await baseEyes.abort({ logger: environmentLogger, settings: { reason: error } });
242
- }
243
- }
244
- catch (error) {
245
- environmentLogger.error(`Environment with id ${environment.environmentId} failed before rendering started due to an error`, error);
246
- error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
247
- throw error;
248
- }
249
- });
250
- uniqueEnvironments.forEach((environment, index) => {
251
95
  const key = (0, to_environment_key_1.toEnvironmentKey)(environment);
252
- let item = eyes.storage.get(key);
253
- if (!item) {
254
- item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
255
- eyes.storage.set(key, item);
256
- }
257
- item.jobs.push(promises[index]);
96
+ const open = { eyes, environment, driver, logger: environmentLogger };
97
+ const renderInputs = { ufgClient, snapshot, environment, accessibility, signal, logger: environmentLogger };
98
+ const oldInfraEnvironment = (0, to_old_infra_environment_1.toOldInfraEnvironment)(environment);
99
+ (0, steps_1.addCheck)(eyes.session, key, {
100
+ open,
101
+ renderTarget: { ufgClient, snapshot, logger: environmentLogger },
102
+ render: renderInputs,
103
+ recheck: oldInfraEnvironment
104
+ ? {
105
+ render: { ...renderInputs, environment: oldInfraEnvironment },
106
+ disabled: oldInfraRetryDisabled,
107
+ logger: environmentLogger,
108
+ }
109
+ : undefined,
110
+ inputs: {
111
+ canFuse: !oldInfraEnvironment,
112
+ mutability,
113
+ signal,
114
+ onError: (error, baseEyes) => {
115
+ var _a;
116
+ environmentLogger.error(`Render on environment with id "${(_a = baseEyes.test.environment) === null || _a === void 0 ? void 0 : _a.environmentId}" failed due to an error`, error);
117
+ error.info = { ...error.info, userTestId: eyes.test.userTestId, environment };
118
+ },
119
+ logger: environmentLogger,
120
+ },
121
+ });
258
122
  });
259
123
  };
260
124
  }
@@ -1,78 +1,40 @@
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 utils = __importStar(require("@applitools/utils"));
3
+ exports.getBaseEyes = void 0;
28
4
  const report_kobiton_1 = require("../automation/utils/report-kobiton");
29
- function makeGetBaseEyes({ settings: defaultSettings, eyes, logger: mainLogger, }) {
30
- const getBaseEyesWithCache = utils.general.wrap(getBaseEyes, (getBaseEyes, options) => {
31
- const key = JSON.stringify(options.settings.environment);
32
- let item = eyes.storage.get(key);
33
- if (!item) {
34
- item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
35
- eyes.storage.set(key, item);
36
- }
37
- if (!item.eyes.settled)
38
- item.eyes.resolve(getBaseEyes(options));
39
- return item.eyes;
5
+ async function getBaseEyes({ eyes, settings, logger, }) {
6
+ var _a, _b;
7
+ const defaultSettings = eyes.openSettings;
8
+ logger.log(`Command "getBaseEyes" is called with settings`, settings);
9
+ const ufgClient = await eyes.core.getUFGClient({
10
+ settings: {
11
+ ...eyes.test.ufgServer,
12
+ eyesServerUrl: eyes.test.eyesServer.eyesServerUrl,
13
+ apiKey: eyes.test.eyesServer.apiKey,
14
+ },
15
+ logger,
40
16
  });
41
- return getBaseEyesWithCache;
42
- async function getBaseEyes({ settings, logger = mainLogger, }) {
43
- var _a, _b;
44
- logger = logger.extend(mainLogger);
45
- logger.log(`Command "getBaseEyes" is called with settings`, settings);
46
- const ufgClient = await eyes.core.getUFGClient({
47
- settings: {
48
- ...eyes.test.ufgServer,
49
- eyesServerUrl: eyes.test.eyesServer.eyesServerUrl,
50
- apiKey: eyes.test.eyesServer.apiKey,
51
- },
52
- logger,
53
- });
54
- const environment = await ufgClient.getActualEnvironment({
55
- settings: { environment: settings.environment },
56
- logger,
57
- });
58
- const baseEyes = await eyes.core.base.openEyes({
59
- settings: {
60
- ...defaultSettings,
61
- fallbackBaselineId: (_b = (_a = settings.environment) === null || _a === void 0 ? void 0 : _a.fallbackBaselineId) !== null && _b !== void 0 ? _b : defaultSettings.fallbackBaselineId,
62
- environment: {
63
- ...defaultSettings.environment,
64
- ...environment,
65
- os: settings.environment.os,
66
- displayOs: settings.environment.displayOs,
67
- hostingApp: settings.environment.hostingApp,
68
- displayHostingApp: settings.environment.displayHostingApp,
69
- properties: settings.environment.properties,
70
- },
17
+ const environment = await ufgClient.getActualEnvironment({
18
+ settings: { environment: settings.environment },
19
+ logger,
20
+ });
21
+ const baseEyes = await eyes.core.base.openEyes({
22
+ settings: {
23
+ ...defaultSettings,
24
+ fallbackBaselineId: (_b = (_a = settings.environment) === null || _a === void 0 ? void 0 : _a.fallbackBaselineId) !== null && _b !== void 0 ? _b : defaultSettings.fallbackBaselineId,
25
+ environment: {
26
+ ...defaultSettings.environment,
27
+ ...environment,
28
+ os: settings.environment.os,
29
+ displayOs: settings.environment.displayOs,
30
+ hostingApp: settings.environment.hostingApp,
31
+ displayHostingApp: settings.environment.displayHostingApp,
32
+ properties: settings.environment.properties,
71
33
  },
72
- logger,
73
- });
74
- void (0, report_kobiton_1.reportKobiton)({ driver: settings.driver, settings: baseEyes.test, logger });
75
- return baseEyes;
76
- }
34
+ },
35
+ logger,
36
+ });
37
+ void (0, report_kobiton_1.reportKobiton)({ driver: settings.driver, settings: baseEyes.test, logger });
38
+ return baseEyes;
77
39
  }
78
- exports.makeGetBaseEyes = makeGetBaseEyes;
40
+ exports.getBaseEyes = getBaseEyes;
@@ -25,7 +25,6 @@ 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");
@@ -33,16 +32,19 @@ const abort_1 = require("../automation/abort");
33
32
  const get_results_1 = require("../automation/get-results");
34
33
  const extract_default_environment_1 = require("./utils/extract-default-environment");
35
34
  const verify_environment_info_1 = require("./utils/verify-environment-info");
35
+ const tasks_1 = require("../tasks");
36
+ const uniquify_environments_1 = require("../automation/utils/uniquify-environments");
36
37
  const abort_controller_1 = require("abort-controller");
37
38
  const utils = __importStar(require("@applitools/utils"));
38
39
  const register_default_scripts_1 = require("./utils/register-default-scripts");
40
+ const make_environment_loggers_1 = require("../automation/utils/make-environment-loggers");
39
41
  function makeOpenEyes({ core, spec, logger: mainLogger }) {
40
- return async function openEyes({ target, settings, storage = new Map(), logger = mainLogger, }) {
41
- var _a, _b, _c, _d;
42
+ return async function openEyes({ target, settings, session = {}, logger = mainLogger, }) {
43
+ var _a, _b, _c, _d, _e;
42
44
  logger = logger.extend(mainLogger);
43
- logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []), storage.size > 0 ? 'and default eyes storage' : '');
45
+ logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []), (0, tasks_1.activeEnvironmentKeys)(session).length > 0 ? 'and existing sessions' : '');
44
46
  const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger }));
45
- if (driver && storage.size === 0) {
47
+ if (driver && (0, tasks_1.activeEnvironmentKeys)(session).length === 0) {
46
48
  const environment = await driver.getEnvironment();
47
49
  if (((_a = settings.environment) === null || _a === void 0 ? void 0 : _a.viewportSize) && !environment.isMobile) {
48
50
  await driver.setViewportSize(settings.environment.viewportSize);
@@ -68,7 +70,7 @@ function makeOpenEyes({ core, spec, logger: mainLogger }) {
68
70
  logger,
69
71
  });
70
72
  await (0, verify_environment_info_1.verifyEnvironmentsInfo)({ environments: (_d = settings.environments) !== null && _d !== void 0 ? _d : [], ufgClient });
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: 'ufg',
@@ -86,8 +88,9 @@ 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
96
  close: (0, close_1.makeClose)({ eyes, driver, logger }),
@@ -95,6 +98,9 @@ function makeOpenEyes({ core, spec, logger: mainLogger }) {
95
98
  getResults: (0, get_results_1.makeGetResults)({ eyes, logger }),
96
99
  };
97
100
  });
101
+ const declared = (0, uniquify_environments_1.uniquifyEnvironments)(((_e = settings.environments) === null || _e === void 0 ? void 0 : _e.length) ? settings.environments : environments);
102
+ (0, tasks_1.declareOpens)(eyes, declared, driver, logger);
103
+ return eyes;
98
104
  };
99
105
  }
100
106
  exports.makeOpenEyes = makeOpenEyes;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/core",
3
- "version": "4.74.2",
3
+ "version": "4.75.0",
4
4
  "homepage": "https://applitools.com",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
@@ -55,19 +55,20 @@
55
55
  "test:ios-simulator": "MOCHA_ONLY_TAGS=ios-simulator MOCHA_GROUP=ios-simulator run --top-level mocha ./test/e2e/classic/webview.spec.ts --exit --require ./test/mocha-global-setup.js"
56
56
  },
57
57
  "dependencies": {
58
- "@applitools/core-base": "1.41.5",
58
+ "@applitools/core-base": "1.42.0",
59
59
  "@applitools/dom-capture": "11.8.11",
60
60
  "@applitools/dom-snapshot": "4.18.9",
61
61
  "@applitools/driver": "1.26.15",
62
- "@applitools/ec-client": "1.12.56",
62
+ "@applitools/ec-client": "1.12.57",
63
63
  "@applitools/image": "1.3.5",
64
64
  "@applitools/logger": "2.3.3",
65
- "@applitools/nml-client": "1.12.12",
65
+ "@applitools/nml-client": "1.12.13",
66
66
  "@applitools/req": "1.11.7",
67
67
  "@applitools/screenshoter": "3.12.37",
68
68
  "@applitools/snippets": "2.9.10",
69
69
  "@applitools/socket": "1.3.19",
70
- "@applitools/ufg-client": "1.25.1",
70
+ "@applitools/task-manager": "1.0.0",
71
+ "@applitools/ufg-client": "1.26.0",
71
72
  "@applitools/utils": "1.15.3",
72
73
  "abort-controller": "3.0.0",
73
74
  "chalk": "4.1.2",
@@ -1,4 +1,4 @@
1
- import type { Eyes, AbortSettings, Environment } from './types';
1
+ import type { Eyes, AbortSettings } from './types';
2
2
  import { type Logger } from '@applitools/logger';
3
3
  import { type AbortController } from 'abort-controller';
4
4
  import { type Driver, type SpecType } from '@applitools/driver';
@@ -6,10 +6,9 @@ type Options<TSpec extends SpecType> = {
6
6
  eyes: Eyes<TSpec>;
7
7
  driver?: Driver<TSpec>;
8
8
  controller: AbortController;
9
- environments?: Environment[];
10
9
  logger: Logger;
11
10
  };
12
- export declare function makeAbort<TSpec extends SpecType>({ eyes, driver, controller, environments: defaultEnvironments, logger: mainLogger, }: Options<TSpec>): ({ settings, logger, }?: {
11
+ export declare function makeAbort<TSpec extends SpecType>({ eyes, driver, controller, logger: mainLogger }: Options<TSpec>): ({ settings, logger, }?: {
13
12
  settings?: AbortSettings | undefined;
14
13
  logger?: Logger | undefined;
15
14
  }) => Promise<void>;
@@ -1,13 +1,12 @@
1
- import type { Eyes, CloseSettings, Environment } from '../ufg/types';
1
+ import type { Eyes, CloseSettings } from './types';
2
2
  import { type Logger } from '@applitools/logger';
3
3
  import { type Driver, type SpecType } from '@applitools/driver';
4
4
  type Options<TSpec extends SpecType> = {
5
5
  eyes: Eyes<TSpec>;
6
6
  driver?: Driver<TSpec>;
7
- environments?: Environment[];
8
7
  logger: Logger;
9
8
  };
10
- export declare function makeClose<TSpec extends SpecType>({ eyes, driver, environments: defaultEnvironments, logger: mainLogger, }: Options<TSpec>): ({ settings, logger, }?: {
9
+ export declare function makeClose<TSpec extends SpecType>({ eyes, driver, logger: mainLogger }: Options<TSpec>): ({ settings, logger, }?: {
11
10
  settings?: CloseSettings | undefined;
12
11
  logger?: Logger | undefined;
13
12
  }) => Promise<void>;
@@ -1,10 +1,12 @@
1
- import type { MaybeArray, Size, Region, ControlledPromise } from '@applitools/utils';
1
+ import type { MaybeArray, Size, Region } from '@applitools/utils';
2
2
  import type * as BaseCore from '@applitools/core-base/types';
3
3
  import { type SpecType, type Driver, type ElementReference, type ContextReference } from '@applitools/driver';
4
4
  import { type NMLClient, type NMLClientSettings } from '@applitools/nml-client';
5
5
  import { type Logger } from '@applitools/logger';
6
6
  import type { FigmaOptions } from '../figma/types';
7
+ import type { Session } from '../tasks';
7
8
  export type * from '@applitools/core-base/types';
9
+ export type { Session } from '../tasks';
8
10
  export type DriverTarget<TSpec extends SpecType> = TSpec['driver'] | Driver<TSpec>;
9
11
  export type Target<TSpec extends SpecType> = DriverTarget<TSpec> | BaseCore.Target;
10
12
  export interface DesktopBrowserEnvironment {
@@ -72,7 +74,8 @@ export interface Core<TSpec extends SpecType> extends Omit<BaseCore.Core, 'openE
72
74
  openEyes(options: {
73
75
  target?: DriverTarget<TSpec>;
74
76
  settings: BaseCore.OpenSettings;
75
- storage?: EyesStorage;
77
+ /** Shares the test's identity with another typed eyes of the same test. @internal */
78
+ session?: Session;
76
79
  logger?: Logger;
77
80
  }): Promise<Eyes<TSpec>>;
78
81
  locate<TLocator extends string>(options: {
@@ -91,13 +94,15 @@ export interface Core<TSpec extends SpecType> extends Omit<BaseCore.Core, 'openE
91
94
  logger?: Logger;
92
95
  }): Promise<string[]>;
93
96
  }
94
- export interface Eyes<TSpec extends SpecType> extends Omit<BaseCore.Eyes, 'core' | 'check' | 'checkAndClose'> {
97
+ export interface Eyes<TSpec extends SpecType> extends Pick<BaseCore.Eyes, 'test' | 'running'> {
98
+ readonly type: 'classic' | 'ufg';
95
99
  readonly core: Core<TSpec>;
96
- readonly storage: EyesStorage;
97
- getBaseEyes(options: {
98
- settings: GetBaseEyesSettings<TSpec>;
99
- logger?: Logger;
100
- }): Promise<BaseCore.Eyes>;
100
+ /** The test's identity in the task graph — the graph holds its state. @internal */
101
+ readonly session: Session;
102
+ /** Tags each environment's logs alike across its open and checks. @internal */
103
+ getEnvironmentLogger(environment: Environment, logger: Logger): Logger;
104
+ /** The settings each environment's base session opens with. @internal */
105
+ readonly openSettings: BaseCore.OpenSettings;
101
106
  check(options?: {
102
107
  target?: Target<TSpec>;
103
108
  settings?: CheckSettings<TSpec>;
@@ -121,14 +126,6 @@ export interface Eyes<TSpec extends SpecType> extends Omit<BaseCore.Eyes, 'core'
121
126
  logger?: Logger;
122
127
  }): Promise<TestResult[]>;
123
128
  }
124
- export type EyesStorage = Map<string, {
125
- eyes: ControlledPromise<BaseCore.Eyes>;
126
- jobs: Promise<void>[];
127
- }>;
128
- export interface GetBaseEyesSettings<TSpec extends SpecType> {
129
- environment: Environment;
130
- driver?: Driver<TSpec>;
131
- }
132
129
  export type LazyLoadOptions = {
133
130
  scrollLength?: number;
134
131
  waitingTime?: number;
@@ -0,0 +1,3 @@
1
+ import type { Environment } from '../types';
2
+ import type { Logger } from '@applitools/logger';
3
+ export declare function makeEnvironmentLoggers(): (environment: Environment, logger: Logger) => Logger;
@@ -1,14 +1,10 @@
1
- import type { Eyes, GetBaseEyesSettings, OpenSettings } from './types';
1
+ import type { Eyes } from './types';
2
2
  import type { Eyes as BaseEyes } from '@applitools/core-base';
3
3
  import { type SpecType } from '@applitools/driver';
4
4
  import { type Logger } from '@applitools/logger';
5
- type Options<TSpec extends SpecType> = {
6
- settings: OpenSettings;
5
+ import type { OpenInputs } from '../tasks/types';
6
+ export declare function getBaseEyes<TSpec extends SpecType>({ eyes, settings, logger, }: {
7
7
  eyes: Eyes<TSpec>;
8
+ settings: Pick<OpenInputs, 'environment' | 'driver'>;
8
9
  logger: Logger;
9
- };
10
- export declare function makeGetBaseEyes<TSpec extends SpecType>({ settings: defaultSettings, eyes, logger: mainLogger, }: Options<TSpec>): ({ settings, logger, }: {
11
- settings: GetBaseEyesSettings<TSpec>;
12
- logger?: Logger | undefined;
13
- }) => Promise<BaseEyes>;
14
- export {};
10
+ }): Promise<BaseEyes>;
@@ -1,15 +1,16 @@
1
- import type { DriverTarget, Core, Eyes, EyesStorage, OpenSettings } from './types';
1
+ import type { DriverTarget, Core, Eyes, OpenSettings } from './types';
2
2
  import { type Logger } from '@applitools/logger';
3
3
  import { type SpecType, type SpecDriver } from '@applitools/driver';
4
+ import { type Session } from '../tasks';
4
5
  type Options<TSpec extends SpecType> = {
5
6
  core: Core<TSpec>;
6
7
  spec?: SpecDriver<TSpec>;
7
8
  logger: Logger;
8
9
  };
9
- export declare function makeOpenEyes<TSpec extends SpecType>({ core, spec, logger: mainLogger }: Options<TSpec>): ({ target, settings, storage, logger, }: {
10
+ export declare function makeOpenEyes<TSpec extends SpecType>({ core, spec, logger: mainLogger }: Options<TSpec>): ({ target, settings, session, logger, }: {
10
11
  target?: DriverTarget<TSpec> | undefined;
11
12
  settings: OpenSettings;
12
- storage?: EyesStorage | undefined;
13
+ session?: object | undefined;
13
14
  logger?: Logger | undefined;
14
15
  }) => Promise<Eyes<TSpec>>;
15
16
  export {};
@@ -7,7 +7,7 @@ export interface Core<TSpec extends SpecType> extends AutomationCore.Core<TSpec>
7
7
  openEyes(options: {
8
8
  target?: AutomationCore.DriverTarget<TSpec>;
9
9
  settings: OpenSettings;
10
- storage?: AutomationCore.EyesStorage;
10
+ session?: AutomationCore.Session;
11
11
  logger?: Logger;
12
12
  }): Promise<Eyes<TSpec>>;
13
13
  }
@@ -0,0 +1,21 @@
1
+ import type { CheckSettings, Eyes, Environment, ExactEnvironment } from '../types';
2
+ import type { Target as BaseTarget, CheckSettings as BaseCheckSettings } from '@applitools/core-base';
3
+ import { type Logger } from '@applitools/logger';
4
+ import type { SpecType, Driver } from '@applitools/driver';
5
+ export type Captured = {
6
+ baseTarget: BaseTarget;
7
+ baseSetting: BaseCheckSettings;
8
+ exactEnvironment: ExactEnvironment;
9
+ };
10
+ type DriverEnvironment = Awaited<ReturnType<Driver<SpecType>['getEnvironment']>>;
11
+ /** Whether the capture keeps `environment` as its exact environment, at the same index. */
12
+ export declare function isCapturedAsRequested(settings: CheckSettings<SpecType>, driverEnvironment: DriverEnvironment, environment: Environment): boolean;
13
+ /**
14
+ * create base targets (array of screenshots) and base settings (array of check settings) for each environment
15
+ */
16
+ export declare function generateBaseScreenshotsAndSettings<TSpec extends SpecType>(settings: CheckSettings<TSpec>, uniqueEnvironments: Environment[], eyes: Eyes<TSpec>, logger: Logger, driver: Driver<TSpec>): Promise<{
17
+ baseTarget: BaseTarget;
18
+ baseSetting: BaseCheckSettings;
19
+ exactEnvironment: ExactEnvironment;
20
+ }[]>;
21
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { AbortInputs, Labels, Graph } from './types';
2
+ /**
3
+ * Aborts the environment's session as soon as it is open, without waiting for its steps (they read the
4
+ * abort signal), unless an abort is already queued. A pending close or matchAndEnd still gets it; core-base ends a
5
+ * session only once. Kind `dismiss`: if the open is still lazy (nothing needed it), it's discarded and no session
6
+ * opens.
7
+ */
8
+ export declare function add(graph: Graph, { inputs, labels }: {
9
+ inputs: AbortInputs;
10
+ labels: Labels;
11
+ }): import("@applitools/task-manager").Task<void, AbortInputs, Labels>;