@applitools/core 3.9.0 → 3.10.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 (67) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/dist/abort.js +40 -0
  3. package/dist/automation/abort.js +49 -0
  4. package/dist/{ufg → automation}/close.js +22 -6
  5. package/dist/automation/get-nml-client.js +3 -3
  6. package/dist/{ufg → automation}/get-results.js +4 -4
  7. package/dist/check-and-close.js +1 -10
  8. package/dist/check.js +8 -17
  9. package/dist/classic/check-and-close.js +111 -69
  10. package/dist/classic/check.js +103 -63
  11. package/dist/classic/core.js +4 -4
  12. package/dist/classic/get-base-eyes.js +29 -7
  13. package/dist/classic/open-eyes.js +42 -56
  14. package/dist/classic/utils/extract-default-renderers.js +72 -0
  15. package/dist/classic/utils/take-screenshots.js +60 -0
  16. package/dist/close.js +6 -3
  17. package/dist/core.js +4 -4
  18. package/dist/get-typed-eyes.js +3 -5
  19. package/dist/make-manager.js +2 -2
  20. package/dist/open-eyes.js +13 -10
  21. package/dist/ufg/check-and-close.js +61 -54
  22. package/dist/ufg/check.js +62 -60
  23. package/dist/ufg/core.js +2 -2
  24. package/dist/ufg/get-base-eyes.js +23 -13
  25. package/dist/ufg/open-eyes.js +24 -37
  26. package/dist/ufg/utils/extract-default-renderers.js +22 -0
  27. package/dist/universal/core.js +1 -0
  28. package/dist/universal/spec-driver.js +43 -50
  29. package/package.json +23 -28
  30. package/types/abort.d.ts +13 -0
  31. package/types/{classic → automation}/abort.d.ts +5 -4
  32. package/types/{classic → automation}/close.d.ts +3 -4
  33. package/types/automation/get-nml-client.d.ts +3 -3
  34. package/types/automation/get-results.d.ts +11 -0
  35. package/types/automation/types.d.ts +78 -7
  36. package/types/{ufg → automation}/utils/uniquify-renderers.d.ts +1 -1
  37. package/types/check.d.ts +2 -2
  38. package/types/classic/check-and-close.d.ts +11 -4
  39. package/types/classic/check.d.ts +6 -3
  40. package/types/classic/core.d.ts +2 -1
  41. package/types/classic/get-base-eyes.d.ts +4 -8
  42. package/types/classic/open-eyes.d.ts +3 -4
  43. package/types/classic/types.d.ts +3 -4
  44. package/types/classic/utils/extract-default-renderers.d.ts +9 -0
  45. package/types/classic/utils/take-screenshots.d.ts +18 -0
  46. package/types/close.d.ts +3 -2
  47. package/types/core.d.ts +7 -1
  48. package/types/get-typed-eyes.d.ts +5 -4
  49. package/types/make-manager.d.ts +7 -1
  50. package/types/open-eyes.d.ts +7 -1
  51. package/types/types.d.ts +3 -6
  52. package/types/ufg/check-and-close.d.ts +8 -12
  53. package/types/ufg/check.d.ts +4 -9
  54. package/types/ufg/core.d.ts +3 -3
  55. package/types/ufg/get-base-eyes.d.ts +3 -7
  56. package/types/ufg/open-eyes.d.ts +3 -4
  57. package/types/ufg/types.d.ts +3 -24
  58. package/types/ufg/utils/extract-default-renderers.d.ts +5 -0
  59. package/types/universal/spec-driver.d.ts +6 -5
  60. package/types/universal/types.d.ts +54 -50
  61. package/dist/classic/abort.js +0 -23
  62. package/dist/classic/close.js +0 -23
  63. package/dist/ufg/abort.js +0 -33
  64. package/types/ufg/abort.d.ts +0 -21
  65. package/types/ufg/close.d.ts +0 -19
  66. package/types/ufg/get-results.d.ts +0 -16
  67. /package/dist/{ufg → automation}/utils/uniquify-renderers.js +0 -0
package/dist/open-eyes.js CHANGED
@@ -31,12 +31,13 @@ const get_typed_eyes_1 = require("./get-typed-eyes");
31
31
  const check_1 = require("./check");
32
32
  const check_and_close_1 = require("./check-and-close");
33
33
  const close_1 = require("./close");
34
+ const abort_1 = require("./abort");
34
35
  const get_eyes_results_1 = require("./get-eyes-results");
35
36
  const utils = __importStar(require("@applitools/utils"));
36
- function makeOpenEyes({ type: defaultType = 'classic', concurrency, batch, core, cores, spec, environment, logger: mainLogger, }) {
37
+ function makeOpenEyes({ type: defaultType = 'classic', clients, concurrency, batch, core, cores, spec, environment, logger: mainLogger, }) {
37
38
  return async function openEyes({ type = defaultType, settings, config, target, logger = mainLogger, }) {
38
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
39
- var _u, _v, _w, _x;
39
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u;
40
+ var _v, _w, _x, _y;
40
41
  logger = logger.extend(mainLogger, { tags: [`eyes-${type}-${utils.general.shortid()}`] });
41
42
  settings = { ...config === null || config === void 0 ? void 0 : config.open, ...settings };
42
43
  (_a = settings.userTestId) !== null && _a !== void 0 ? _a : (settings.userTestId = `${settings.testName}--${utils.general.guid()}`);
@@ -44,10 +45,10 @@ function makeOpenEyes({ type: defaultType = 'classic', concurrency, batch, core,
44
45
  (_f = settings.apiKey) !== null && _f !== void 0 ? _f : (settings.apiKey = utils.general.getEnvValue('API_KEY'));
45
46
  (_g = settings.useDnsCache) !== null && _g !== void 0 ? _g : (settings.useDnsCache = utils.general.getEnvValue('USE_DNS_CACHE', 'boolean'));
46
47
  settings.batch = { ...batch, ...settings.batch };
47
- (_h = (_u = settings.batch).id) !== null && _h !== void 0 ? _h : (_u.id = (_j = utils.general.getEnvValue('BATCH_ID')) !== null && _j !== void 0 ? _j : `generated-${utils.general.guid()}`);
48
- (_k = (_v = settings.batch).name) !== null && _k !== void 0 ? _k : (_v.name = utils.general.getEnvValue('BATCH_NAME'));
49
- (_l = (_w = settings.batch).sequenceName) !== null && _l !== void 0 ? _l : (_w.sequenceName = utils.general.getEnvValue('BATCH_SEQUENCE'));
50
- (_m = (_x = settings.batch).notifyOnCompletion) !== null && _m !== void 0 ? _m : (_x.notifyOnCompletion = utils.general.getEnvValue('BATCH_NOTIFY', 'boolean'));
48
+ (_h = (_v = settings.batch).id) !== null && _h !== void 0 ? _h : (_v.id = (_j = utils.general.getEnvValue('BATCH_ID')) !== null && _j !== void 0 ? _j : `generated-${utils.general.guid()}`);
49
+ (_k = (_w = settings.batch).name) !== null && _k !== void 0 ? _k : (_w.name = utils.general.getEnvValue('BATCH_NAME'));
50
+ (_l = (_x = settings.batch).sequenceName) !== null && _l !== void 0 ? _l : (_x.sequenceName = utils.general.getEnvValue('BATCH_SEQUENCE'));
51
+ (_m = (_y = settings.batch).notifyOnCompletion) !== null && _m !== void 0 ? _m : (_y.notifyOnCompletion = utils.general.getEnvValue('BATCH_NOTIFY', 'boolean'));
51
52
  (_o = settings.keepBatchOpen) !== null && _o !== void 0 ? _o : (settings.keepBatchOpen = utils.general.getEnvValue('DONT_CLOSE_BATCHES', 'boolean'));
52
53
  (_p = settings.branchName) !== null && _p !== void 0 ? _p : (settings.branchName = utils.general.getEnvValue('BRANCH'));
53
54
  (_q = settings.parentBranchName) !== null && _q !== void 0 ? _q : (settings.parentBranchName = utils.general.getEnvValue('PARENT_BRANCH'));
@@ -55,6 +56,7 @@ function makeOpenEyes({ type: defaultType = 'classic', concurrency, batch, core,
55
56
  (_s = settings.ignoreBaseline) !== null && _s !== void 0 ? _s : (settings.ignoreBaseline = false);
56
57
  (_t = settings.compareWithParentBranch) !== null && _t !== void 0 ? _t : (settings.compareWithParentBranch = false);
57
58
  const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger, customConfig: settings }));
59
+ const renderers = (_u = config === null || config === void 0 ? void 0 : config.check) === null || _u === void 0 ? void 0 : _u.renderers;
58
60
  core.logEvent({
59
61
  settings: {
60
62
  ...settings,
@@ -73,8 +75,8 @@ function makeOpenEyes({ type: defaultType = 'classic', concurrency, batch, core,
73
75
  settings: settings,
74
76
  target: driver,
75
77
  cores: cores !== null && cores !== void 0 ? cores : {
76
- ufg: (0, core_2.makeCore)({ spec, base: core.base, concurrency: concurrency !== null && concurrency !== void 0 ? concurrency : 5, logger }),
77
- classic: (0, core_1.makeCore)({ spec, base: core.base, logger }),
78
+ ufg: (0, core_2.makeCore)({ spec, clients, base: core.base, concurrency: concurrency !== null && concurrency !== void 0 ? concurrency : 5, logger }),
79
+ classic: (0, core_1.makeCore)({ spec, clients, base: core.base, logger }),
78
80
  },
79
81
  logger,
80
82
  });
@@ -83,7 +85,8 @@ function makeOpenEyes({ type: defaultType = 'classic', concurrency, batch, core,
83
85
  getTypedEyes,
84
86
  check: (0, check_1.makeCheck)({ type, eyes, target: driver, spec, logger }),
85
87
  checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ type, eyes, target: driver, spec, logger }),
86
- close: (0, close_1.makeClose)({ eyes, logger }),
88
+ close: (0, close_1.makeClose)({ eyes, renderers, logger }),
89
+ abort: (0, abort_1.makeAbort)({ eyes, renderers, logger }),
87
90
  getResults: (0, get_eyes_results_1.makeGetEyesResults)({ eyes, logger }),
88
91
  })); // TODO solve the types issue
89
92
  };
@@ -32,11 +32,11 @@ const take_dom_snapshots_1 = require("./utils/take-dom-snapshots");
32
32
  const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
33
33
  const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
34
34
  const generate_safe_selectors_1 = require("./utils/generate-safe-selectors");
35
- const uniquify_renderers_1 = require("./utils/uniquify-renderers");
35
+ const uniquify_renderers_1 = require("../automation/utils/uniquify-renderers");
36
36
  const abort_error_1 = require("../errors/abort-error");
37
37
  const utils = __importStar(require("@applitools/utils"));
38
38
  const chalk_1 = __importDefault(require("chalk"));
39
- function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal, logger: mainLogger, }) {
39
+ function makeCheckAndClose({ eyes, target: defaultTarget, renderers: defaultRenderers = [], spec, signal, logger: mainLogger, }) {
40
40
  return async function checkAndClose({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
41
41
  var _a, _b, _c, _d, _e, _f, _g, _h;
42
42
  logger = logger.extend(mainLogger);
@@ -48,7 +48,7 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
48
48
  const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
49
49
  settings,
50
50
  });
51
- const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : []);
51
+ const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : defaultRenderers);
52
52
  const ufgClient = await eyes.core.getUFGClient({
53
53
  settings: {
54
54
  ...eyes.test.ufgServer,
@@ -69,15 +69,6 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
69
69
  : null;
70
70
  if (driver) {
71
71
  const environment = await driver.getEnvironment();
72
- if (uniqueRenderers.length === 0) {
73
- if (environment.isWeb) {
74
- const viewportSize = await driver.getViewportSize();
75
- uniqueRenderers.push({ name: 'chrome', ...viewportSize });
76
- }
77
- else {
78
- // TODO add default nmg renderers
79
- }
80
- }
81
72
  let cleanupGeneratedSelectors;
82
73
  if (environment.isWeb) {
83
74
  userAgent = await driver.getUserAgentLegacy();
@@ -104,44 +95,56 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
104
95
  }
105
96
  else {
106
97
  regionToTarget = (0, driver_1.isSelector)(elementReferenceToTarget)
107
- ? (_e = (_d = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _d === void 0 ? void 0 : _d.call(spec, settings.scrollRootElement)) !== null && _e !== void 0 ? _e : undefined
98
+ ? (_e = (_d = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _d === void 0 ? void 0 : _d.call(spec, settings.scrollRootElement)) !== null && _e !== void 0 ? _e : undefined
108
99
  : undefined;
109
100
  scrollRootSelector = (0, driver_1.isSelector)(settings.scrollRootElement)
110
- ? (_g = (_f = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _f === void 0 ? void 0 : _f.call(spec, settings.scrollRootElement)) !== null && _g !== void 0 ? _g : undefined
101
+ ? (_g = (_f = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _f === void 0 ? void 0 : _f.call(spec, settings.scrollRootElement)) !== null && _g !== void 0 ? _g : undefined
111
102
  : undefined;
112
103
  }
113
104
  const currentContext = driver.currentContext;
114
- const snapshotOptions = {
115
- settings: {
116
- ...eyes.test.eyesServer,
117
- waitBeforeCapture: settings.waitBeforeCapture,
118
- disableBrowserFetching: settings.disableBrowserFetching,
119
- layoutBreakpoints: settings.layoutBreakpoints,
120
- renderers: uniqueRenderers,
121
- skipResources: ufgClient.getCachedResourceUrls(),
122
- },
123
- hooks: {
124
- async beforeSnapshots() {
125
- if (settings.lazyLoad && environment.isWeb) {
126
- await (0, wait_for_lazy_load_1.waitForLazyLoad)({
127
- context: driver.currentContext,
128
- settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
129
- logger,
130
- });
131
- }
132
- },
133
- },
134
- provides: {
135
- getChromeEmulationDevices: ufgClient.getChromeEmulationDevices,
136
- getIOSDevices: ufgClient.getIOSDevices,
137
- },
138
- };
139
105
  if (environment.isWeb) {
140
- snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({ driver, ...snapshotOptions, logger });
106
+ snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({
107
+ driver,
108
+ settings: {
109
+ ...eyes.test.eyesServer,
110
+ waitBeforeCapture: settings.waitBeforeCapture,
111
+ disableBrowserFetching: settings.disableBrowserFetching,
112
+ layoutBreakpoints: settings.layoutBreakpoints,
113
+ renderers: uniqueRenderers,
114
+ skipResources: ufgClient.getCachedResourceUrls(),
115
+ },
116
+ hooks: {
117
+ async beforeSnapshots() {
118
+ if (settings.lazyLoad && environment.isWeb) {
119
+ await (0, wait_for_lazy_load_1.waitForLazyLoad)({
120
+ context: driver.currentContext,
121
+ settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
122
+ logger,
123
+ });
124
+ }
125
+ },
126
+ },
127
+ provides: {
128
+ getChromeEmulationDevices: ufgClient.getChromeEmulationDevices,
129
+ getIOSDevices: ufgClient.getIOSDevices,
130
+ },
131
+ logger,
132
+ });
141
133
  }
142
134
  else {
143
- const nmlClient = await eyes.core.getNMLClient({ config: eyes.test.eyesServer, driver, logger });
144
- snapshots = (await nmlClient.takeSnapshots({ ...snapshotOptions, logger }));
135
+ const nmlClient = await eyes.core.getNMLClient({
136
+ driver,
137
+ settings: { ...eyes.test.eyesServer, renderEnvironmentsUrl: eyes.test.renderEnvironmentsUrl },
138
+ logger,
139
+ });
140
+ snapshots = (await nmlClient.takeSnapshots({
141
+ settings: {
142
+ ...eyes.test.eyesServer,
143
+ waitBeforeCapture: settings.waitBeforeCapture,
144
+ renderers: uniqueRenderers,
145
+ },
146
+ logger,
147
+ }));
145
148
  }
146
149
  await currentContext.focus();
147
150
  snapshotUrl = await driver.getUrl();
@@ -157,9 +160,10 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
157
160
  originalSelector: selector,
158
161
  safeSelector: selector,
159
162
  })));
160
- const promises = uniqueRenderers.map(async ({ properties, ...renderer }, index) => {
163
+ const promises = uniqueRenderers.map(async (renderer, index) => {
161
164
  const rendererLogger = logger.extend({ tags: [`renderer-${utils.general.shortid()}`] });
162
- if (utils.types.has(renderer, 'name') && renderer.name === 'edge') {
165
+ const ufgRenderer = renderer;
166
+ if (utils.types.has(ufgRenderer, 'name') && ufgRenderer.name === 'edge') {
163
167
  const message = chalk_1.default.yellow(`The 'edge' option that is being used in your browsers' configuration will soon be deprecated. Please change it to either 'edgelegacy' for the legacy version or to 'edgechromium' for the new Chromium-based version. Please note, when using the built-in BrowserType enum, then the values are BrowserType.EDGE_LEGACY and BrowserType.EDGE_CHROMIUM, respectively.`);
164
168
  rendererLogger.console.log(message);
165
169
  }
@@ -169,13 +173,13 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
169
173
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
170
174
  }
171
175
  const { cookies, ...snapshot } = snapshots[index];
172
- if (utils.types.has(renderer, 'iosDeviceInfo') || utils.types.has(renderer, 'androidDeviceInfo')) {
173
- renderer.type = utils.types.has(snapshot, 'cdt') ? 'web' : 'native';
176
+ if (utils.types.has(ufgRenderer, 'iosDeviceInfo') || utils.types.has(ufgRenderer, 'androidDeviceInfo')) {
177
+ ufgRenderer.type = utils.types.has(snapshot, 'cdt') ? 'web' : 'native';
174
178
  }
175
179
  const renderTargetPromise = ufgClient.createRenderTarget({
176
180
  snapshot,
177
181
  settings: {
178
- renderer,
182
+ renderer: ufgRenderer,
179
183
  cookies,
180
184
  headers: {
181
185
  Referer: snapshotUrl,
@@ -187,7 +191,7 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
187
191
  },
188
192
  logger: rendererLogger,
189
193
  });
190
- const [baseEyes] = await eyes.getBaseEyes({ settings: { renderer, properties }, logger });
194
+ const baseEyes = await eyes.getBaseEyes({ settings: { renderer }, logger });
191
195
  try {
192
196
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
193
197
  rendererLogger.warn('Command "check" was aborted before rendering');
@@ -214,7 +218,7 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
214
218
  scrollRootElement: scrollRootSelector,
215
219
  selectorsToCalculate: selectorsToCalculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
216
220
  includeFullPageSize: !!settings.pageId,
217
- renderer,
221
+ renderer: ufgRenderer,
218
222
  renderEnvironmentId: baseEyes.test.renderEnvironmentId,
219
223
  uploadUrl: baseEyes.test.uploadUrl,
220
224
  stitchingServiceUrl: baseEyes.test.stitchingServiceUrl,
@@ -245,7 +249,6 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
245
249
  settings: baseSettings,
246
250
  logger: rendererLogger,
247
251
  });
248
- return { eyes: baseEyes, renderer };
249
252
  }
250
253
  catch (error) {
251
254
  rendererLogger.error(`Render on environment with id "${baseEyes.test.renderEnvironmentId}" failed due to an error`, error);
@@ -255,15 +258,19 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
255
258
  }
256
259
  }
257
260
  catch (error) {
258
- rendererLogger.error(`Renderer with id ${renderer.id} failed before rendering started due to an error`, error);
259
- error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer };
261
+ rendererLogger.error(`Renderer with id ${ufgRenderer.id} failed before rendering started due to an error`, error);
262
+ error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer: ufgRenderer };
260
263
  throw error;
261
264
  }
262
265
  });
263
266
  uniqueRenderers.forEach((renderer, index) => {
264
- var _a;
265
267
  const key = JSON.stringify(renderer);
266
- storage.set(key, [...((_a = storage.get(key)) !== null && _a !== void 0 ? _a : []), promises[index]]);
268
+ let item = eyes.storage.get(key);
269
+ if (!item) {
270
+ item = { renderer, eyes: null, jobs: [] };
271
+ eyes.storage.set(key, item);
272
+ }
273
+ item.jobs.push(promises[index]);
267
274
  });
268
275
  };
269
276
  }
package/dist/ufg/check.js CHANGED
@@ -32,11 +32,11 @@ const take_dom_snapshots_1 = require("./utils/take-dom-snapshots");
32
32
  const wait_for_lazy_load_1 = require("../automation/utils/wait-for-lazy-load");
33
33
  const to_base_check_settings_1 = require("../automation/utils/to-base-check-settings");
34
34
  const generate_safe_selectors_1 = require("./utils/generate-safe-selectors");
35
- const uniquify_renderers_1 = require("./utils/uniquify-renderers");
35
+ const uniquify_renderers_1 = require("../automation/utils/uniquify-renderers");
36
36
  const abort_error_1 = require("../errors/abort-error");
37
37
  const utils = __importStar(require("@applitools/utils"));
38
38
  const chalk_1 = __importDefault(require("chalk"));
39
- function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger: mainLogger, }) {
39
+ function makeCheck({ eyes, target: defaultTarget, renderers: defaultRenderers = [], spec, signal, logger: mainLogger, }) {
40
40
  return async function check({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
41
41
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
42
42
  logger = logger.extend(mainLogger);
@@ -48,7 +48,7 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
48
48
  const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
49
49
  settings,
50
50
  });
51
- const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : []);
51
+ const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : defaultRenderers);
52
52
  const ufgClient = await eyes.core.getUFGClient({
53
53
  settings: {
54
54
  ...eyes.test.ufgServer,
@@ -70,15 +70,6 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
70
70
  if (driver) {
71
71
  const environment = await driver.getEnvironment();
72
72
  await driver.currentContext.setScrollingElement((_b = settings.scrollRootElement) !== null && _b !== void 0 ? _b : null);
73
- if (uniqueRenderers.length === 0) {
74
- if (environment.isWeb) {
75
- const viewportSize = await driver.getViewportSize();
76
- uniqueRenderers.push({ name: 'chrome', ...viewportSize });
77
- }
78
- else {
79
- // TODO add default nmg renderers
80
- }
81
- }
82
73
  let cleanupGeneratedSelectors;
83
74
  if (environment.isWeb) {
84
75
  userAgent = await driver.getUserAgentLegacy();
@@ -105,44 +96,56 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
105
96
  }
106
97
  else {
107
98
  regionToTarget = (0, driver_1.isSelector)(elementReferenceToTarget)
108
- ? (_f = (_e = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _e === void 0 ? void 0 : _e.call(spec, settings.scrollRootElement)) !== null && _f !== void 0 ? _f : undefined
99
+ ? (_f = (_e = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _e === void 0 ? void 0 : _e.call(spec, settings.scrollRootElement)) !== null && _f !== void 0 ? _f : undefined
109
100
  : undefined;
110
101
  scrollRootSelector = (0, driver_1.isSelector)(settings.scrollRootElement)
111
- ? (_h = (_g = spec === null || spec === void 0 ? void 0 : spec.untransformSelector) === null || _g === void 0 ? void 0 : _g.call(spec, settings.scrollRootElement)) !== null && _h !== void 0 ? _h : undefined
102
+ ? (_h = (_g = spec === null || spec === void 0 ? void 0 : spec.toSimpleCommonSelector) === null || _g === void 0 ? void 0 : _g.call(spec, settings.scrollRootElement)) !== null && _h !== void 0 ? _h : undefined
112
103
  : undefined;
113
104
  }
114
105
  const currentContext = driver.currentContext;
115
- const snapshotOptions = {
116
- settings: {
117
- ...eyes.test.eyesServer,
118
- waitBeforeCapture: settings.waitBeforeCapture,
119
- disableBrowserFetching: settings.disableBrowserFetching,
120
- layoutBreakpoints: settings.layoutBreakpoints,
121
- renderers: uniqueRenderers,
122
- skipResources: ufgClient.getCachedResourceUrls(),
123
- },
124
- hooks: {
125
- async beforeSnapshots() {
126
- if (settings.lazyLoad && environment.isWeb) {
127
- await (0, wait_for_lazy_load_1.waitForLazyLoad)({
128
- context: driver.currentContext,
129
- settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
130
- logger,
131
- });
132
- }
133
- },
134
- },
135
- provides: {
136
- getChromeEmulationDevices: ufgClient.getChromeEmulationDevices,
137
- getIOSDevices: ufgClient.getIOSDevices,
138
- },
139
- };
140
106
  if (environment.isWeb) {
141
- snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({ driver, ...snapshotOptions, logger });
107
+ snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({
108
+ driver,
109
+ settings: {
110
+ ...eyes.test.eyesServer,
111
+ waitBeforeCapture: settings.waitBeforeCapture,
112
+ disableBrowserFetching: settings.disableBrowserFetching,
113
+ layoutBreakpoints: settings.layoutBreakpoints,
114
+ renderers: uniqueRenderers,
115
+ skipResources: ufgClient.getCachedResourceUrls(),
116
+ },
117
+ hooks: {
118
+ async beforeSnapshots() {
119
+ if (settings.lazyLoad && environment.isWeb) {
120
+ await (0, wait_for_lazy_load_1.waitForLazyLoad)({
121
+ context: driver.currentContext,
122
+ settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
123
+ logger,
124
+ });
125
+ }
126
+ },
127
+ },
128
+ provides: {
129
+ getChromeEmulationDevices: ufgClient.getChromeEmulationDevices,
130
+ getIOSDevices: ufgClient.getIOSDevices,
131
+ },
132
+ logger,
133
+ });
142
134
  }
143
135
  else {
144
- const nmlClient = await eyes.core.getNMLClient({ config: eyes.test.eyesServer, driver, logger });
145
- snapshots = (await nmlClient.takeSnapshots({ ...snapshotOptions, logger }));
136
+ const nmlClient = await eyes.core.getNMLClient({
137
+ driver,
138
+ settings: { ...eyes.test.eyesServer, renderEnvironmentsUrl: eyes.test.renderEnvironmentsUrl },
139
+ logger,
140
+ });
141
+ snapshots = (await nmlClient.takeSnapshots({
142
+ settings: {
143
+ ...eyes.test.eyesServer,
144
+ waitBeforeCapture: settings.waitBeforeCapture,
145
+ renderers: uniqueRenderers,
146
+ },
147
+ logger,
148
+ }));
146
149
  }
147
150
  await currentContext.focus();
148
151
  snapshotUrl = await driver.getUrl();
@@ -158,9 +161,10 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
158
161
  originalSelector: selector,
159
162
  safeSelector: selector,
160
163
  })));
161
- const promises = uniqueRenderers.map(async ({ properties, ...renderer }, index) => {
164
+ const promises = uniqueRenderers.map(async (renderer, index) => {
162
165
  const rendererLogger = logger.extend({ tags: [`renderer-${utils.general.shortid()}`] });
163
- if (utils.types.has(renderer, 'name') && renderer.name === 'edge') {
166
+ const ufgRenderer = renderer;
167
+ if (utils.types.has(ufgRenderer, 'name') && ufgRenderer.name === 'edge') {
164
168
  const message = chalk_1.default.yellow(`The 'edge' option that is being used in your browsers' configuration will soon be deprecated. Please change it to either 'edgelegacy' for the legacy version or to 'edgechromium' for the new Chromium-based version. Please note, when using the built-in BrowserType enum, then the values are BrowserType.EDGE_LEGACY and BrowserType.EDGE_CHROMIUM, respectively.`);
165
169
  rendererLogger.console.log(message);
166
170
  }
@@ -170,13 +174,13 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
170
174
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
171
175
  }
172
176
  const { cookies, ...snapshot } = snapshots[index];
173
- if (utils.types.has(renderer, 'iosDeviceInfo') || utils.types.has(renderer, 'androidDeviceInfo')) {
174
- renderer.type = utils.types.has(snapshot, 'cdt') ? 'web' : 'native';
177
+ if (utils.types.has(ufgRenderer, 'iosDeviceInfo') || utils.types.has(ufgRenderer, 'androidDeviceInfo')) {
178
+ ufgRenderer.type = utils.types.has(snapshot, 'cdt') ? 'web' : 'native';
175
179
  }
176
180
  const renderTargetPromise = ufgClient.createRenderTarget({
177
181
  snapshot,
178
182
  settings: {
179
- renderer,
183
+ renderer: ufgRenderer,
180
184
  cookies,
181
185
  headers: {
182
186
  Referer: snapshotUrl,
@@ -188,7 +192,7 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
188
192
  },
189
193
  logger: rendererLogger,
190
194
  });
191
- const [baseEyes] = await eyes.getBaseEyes({ settings: { renderer, properties }, logger: rendererLogger });
195
+ const baseEyes = await eyes.getBaseEyes({ settings: { renderer }, logger: rendererLogger });
192
196
  try {
193
197
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
194
198
  rendererLogger.warn('Command "check" was aborted before rendering');
@@ -215,7 +219,7 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
215
219
  scrollRootElement: scrollRootSelector,
216
220
  selectorsToCalculate: selectorsToCalculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
217
221
  includeFullPageSize: Boolean(settings.pageId),
218
- renderer,
222
+ renderer: ufgRenderer,
219
223
  renderEnvironmentId: baseEyes.test.renderEnvironmentId,
220
224
  uploadUrl: baseEyes.test.uploadUrl,
221
225
  stitchingServiceUrl: baseEyes.test.stitchingServiceUrl,
@@ -246,11 +250,6 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
246
250
  settings: baseSettings,
247
251
  logger: rendererLogger,
248
252
  });
249
- if (!baseEyes.running) {
250
- rendererLogger.warn(`Render on environment with id "${baseEyes.test.renderEnvironmentId}" was aborted during one of the previous steps`);
251
- throw new abort_error_1.AbortError(`Render on environment with id "${baseEyes.test.renderEnvironmentId}" was aborted during one of the previous steps`);
252
- }
253
- return { eyes: baseEyes, renderer };
254
253
  }
255
254
  catch (error) {
256
255
  rendererLogger.error(`Render on environment with id "${baseEyes.test.renderEnvironmentId}" failed due to an error`, error);
@@ -261,16 +260,19 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
261
260
  }
262
261
  }
263
262
  catch (error) {
264
- rendererLogger.error(`Renderer with id ${renderer.id} failed before rendering started due to an error`, error);
265
- error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer };
263
+ rendererLogger.error(`Renderer with id ${ufgRenderer.id} failed before rendering started due to an error`, error);
264
+ error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer: ufgRenderer };
266
265
  throw error;
267
266
  }
268
267
  });
269
- return uniqueRenderers.map((renderer, index) => {
270
- var _a;
268
+ uniqueRenderers.forEach((renderer, index) => {
271
269
  const key = JSON.stringify(renderer);
272
- storage.set(key, [...((_a = storage.get(key)) !== null && _a !== void 0 ? _a : []), promises[index]]);
273
- return { asExpected: true, userTestId: eyes.test.userTestId, renderer };
270
+ let item = eyes.storage.get(key);
271
+ if (!item) {
272
+ item = { renderer, eyes: null, jobs: [] };
273
+ eyes.storage.set(key, item);
274
+ }
275
+ item.jobs.push(promises[index]);
274
276
  });
275
277
  };
276
278
  }
package/dist/ufg/core.js CHANGED
@@ -35,10 +35,10 @@ const get_nml_client_1 = require("../automation/get-nml-client");
35
35
  const get_ufg_client_1 = require("./get-ufg-client");
36
36
  const open_eyes_1 = require("./open-eyes");
37
37
  const utils = __importStar(require("@applitools/utils"));
38
- function makeCore({ concurrency, spec, clients, base, fetchConcurrency, agentId = 'core-ufg', cwd = process.cwd(), logger: defaultLogger, }) {
38
+ function makeCore({ spec, clients, base, concurrency, fetchConcurrency, agentId = 'core-ufg', cwd = process.cwd(), logger: defaultLogger, }) {
39
39
  const logger = (0, logger_1.makeLogger)({ logger: defaultLogger, format: { label: 'core-ufg' } });
40
40
  logger.log(`Core ufg is initialized ${base ? 'with' : 'without'} custom base core`);
41
- base !== null && base !== void 0 ? base : (base = (0, core_base_1.makeCore)({ agentId, concurrency, cwd, logger }));
41
+ base !== null && base !== void 0 ? base : (base = (0, core_base_1.makeCore)({ concurrency, agentId, cwd, logger }));
42
42
  return utils.general.extend(base, core => {
43
43
  return {
44
44
  type: 'ufg',
@@ -25,17 +25,23 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.makeGetBaseEyes = void 0;
27
27
  const utils = __importStar(require("@applitools/utils"));
28
- function makeGetBaseEyes({ settings: defaultSettings, eyes, base, logger: mainLogger, }) {
29
- const getBaseEyesWithCache = utils.general.cachify(getBaseEyes, ([options]) => { var _a; return (_a = options === null || options === void 0 ? void 0 : options.settings) === null || _a === void 0 ? void 0 : _a.renderer; });
30
- if (base) {
31
- base.forEach(baseEyes => getBaseEyesWithCache.setCachedValue(baseEyes.test.renderer, Promise.resolve([baseEyes])));
32
- }
28
+ function makeGetBaseEyes({ settings: defaultSettings, eyes, logger: mainLogger, }) {
29
+ const getBaseEyesWithCache = utils.general.wrap(getBaseEyes, (getBaseEyes, options) => {
30
+ const key = JSON.stringify(options.settings.renderer);
31
+ let item = eyes.storage.get(key);
32
+ if (!item) {
33
+ item = { renderer: options.settings.renderer, eyes: getBaseEyes(options), jobs: [] };
34
+ eyes.storage.set(key, item);
35
+ }
36
+ else if (!item.eyes) {
37
+ item.eyes = getBaseEyes(options);
38
+ }
39
+ return item.eyes;
40
+ });
33
41
  return getBaseEyesWithCache;
34
- async function getBaseEyes({ settings, logger = mainLogger, } = {}) {
42
+ async function getBaseEyes({ settings, logger = mainLogger, }) {
35
43
  logger = logger.extend(mainLogger);
36
44
  logger.log(`Command "getBaseEyes" is called with settings`, settings);
37
- if (!settings)
38
- throw new Error('');
39
45
  const ufgClient = await eyes.core.getUFGClient({
40
46
  settings: {
41
47
  ...eyes.test.ufgServer,
@@ -44,13 +50,17 @@ function makeGetBaseEyes({ settings: defaultSettings, eyes, base, logger: mainLo
44
50
  },
45
51
  logger,
46
52
  });
47
- const environment = await ufgClient.getRenderEnvironment({ settings, logger });
48
- environment.properties = settings.properties;
49
- const baseEyes = await eyes.core.base.openEyes({
50
- settings: { ...defaultSettings, environment: { ...defaultSettings.environment, ...environment } },
53
+ const environment = await ufgClient.getRenderEnvironment({
54
+ settings: { renderer: settings.renderer },
55
+ logger,
56
+ });
57
+ return eyes.core.base.openEyes({
58
+ settings: {
59
+ ...defaultSettings,
60
+ environment: { ...defaultSettings.environment, ...environment, properties: settings.renderer.properties },
61
+ },
51
62
  logger,
52
63
  });
53
- return [baseEyes];
54
64
  }
55
65
  }
56
66
  exports.makeGetBaseEyes = makeGetBaseEyes;
@@ -28,35 +28,33 @@ const driver_1 = require("@applitools/driver");
28
28
  const get_base_eyes_1 = require("./get-base-eyes");
29
29
  const check_1 = require("./check");
30
30
  const check_and_close_1 = require("./check-and-close");
31
- const close_1 = require("./close");
32
- const abort_1 = require("./abort");
33
- const get_results_1 = require("./get-results");
31
+ const close_1 = require("../automation/close");
32
+ const abort_1 = require("../automation/abort");
33
+ const get_results_1 = require("../automation/get-results");
34
+ const extract_default_renderers_1 = require("./utils/extract-default-renderers");
34
35
  const abort_controller_1 = require("abort-controller");
35
36
  const utils = __importStar(require("@applitools/utils"));
36
37
  function makeOpenEyes({ core, spec, logger: mainLogger }) {
37
- return async function openEyes({ target, settings, base, logger = mainLogger, }) {
38
- var _a, _b;
38
+ return async function openEyes({ target, settings, storage = new Map(), logger = mainLogger, }) {
39
+ var _a, _b, _c;
39
40
  logger = logger.extend(mainLogger);
40
- logger.log(`Command "openEyes" is called with ${target ? 'default driver and' : ''}`, ...(settings ? ['settings', settings] : []), base ? 'predefined eyes' : '');
41
+ logger.log(`Command "openEyes" is called with ${target ? 'default driver' : ''}`, ...(settings ? ['and settings', settings] : []), storage.size > 0 ? 'and default eyes storage' : '');
41
42
  const driver = target && (await (0, driver_1.makeDriver)({ spec, driver: target, logger }));
42
- if (driver && !base) {
43
- const environment = await (driver === null || driver === void 0 ? void 0 : driver.getEnvironment());
44
- const currentContext = driver.currentContext;
45
- (_a = settings.environment) !== null && _a !== void 0 ? _a : (settings.environment = {});
46
- if (environment.isEC) {
47
- settings.environment.ecSessionId = (_b = (await driver.getSessionId())) !== null && _b !== void 0 ? _b : undefined;
48
- }
49
- if (settings.environment.viewportSize) {
43
+ if (driver && storage.size === 0) {
44
+ const environment = await driver.getEnvironment();
45
+ if (((_a = settings.environment) === null || _a === void 0 ? void 0 : _a.viewportSize) && !environment.isMobile) {
50
46
  await driver.setViewportSize(settings.environment.viewportSize);
51
47
  }
52
- await currentContext.focus();
48
+ (_b = settings.environment) !== null && _b !== void 0 ? _b : (settings.environment = {});
49
+ if (environment.isEC) {
50
+ settings.environment.ecSessionId = (_c = (await driver.getSessionId())) !== null && _c !== void 0 ? _c : undefined;
51
+ }
53
52
  }
53
+ const renderers = await (0, extract_default_renderers_1.extractDefaultRenderers)({ driver });
54
54
  const controller = new abort_controller_1.AbortController();
55
55
  const account = await core.getAccountInfo({ settings, logger });
56
56
  return utils.general.extend({}, eyes => {
57
57
  var _a;
58
- const storage = new Map();
59
- let running = true;
60
58
  return {
61
59
  type: 'ufg',
62
60
  core,
@@ -68,28 +66,17 @@ function makeOpenEyes({ core, spec, logger: mainLogger }) {
68
66
  ufgServer: account.ufgServer,
69
67
  uploadUrl: account.uploadUrl,
70
68
  stitchingServiceUrl: account.stitchingServiceUrl,
69
+ renderEnvironmentsUrl: account.renderEnvironmentsUrl,
71
70
  account,
72
71
  },
73
- get running() {
74
- return running;
75
- },
76
- getBaseEyes: (0, get_base_eyes_1.makeGetBaseEyes)({ settings, eyes, base, logger }),
77
- // check with indexing and storage
78
- check: (0, check_1.makeCheck)({ eyes, storage, target: driver, spec, signal: controller.signal, logger }),
79
- checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ eyes, storage, target: driver, spec, signal: controller.signal, logger }),
80
- close: utils.general.wrap((0, close_1.makeClose)({ storage, target: driver, logger }), async (close, options) => {
81
- if (!running)
82
- return;
83
- running = false;
84
- return close(options);
85
- }),
86
- abort: utils.general.wrap((0, abort_1.makeAbort)({ storage, target: driver, spec, controller, logger }), async (abort, options) => {
87
- if (!running)
88
- return;
89
- running = false;
90
- return abort(options);
91
- }),
92
- getResults: (0, get_results_1.makeGetResults)({ storage, logger }),
72
+ running: true,
73
+ storage,
74
+ getBaseEyes: (0, get_base_eyes_1.makeGetBaseEyes)({ settings, eyes, logger }),
75
+ check: (0, check_1.makeCheck)({ eyes, target: driver, renderers, spec, signal: controller.signal, logger }),
76
+ checkAndClose: (0, check_and_close_1.makeCheckAndClose)({ eyes, target: driver, renderers, spec, signal: controller.signal, logger }),
77
+ close: (0, close_1.makeClose)({ eyes, target: driver, logger }),
78
+ abort: (0, abort_1.makeAbort)({ eyes, target: driver, spec, controller, logger }),
79
+ getResults: (0, get_results_1.makeGetResults)({ eyes, logger }),
93
80
  };
94
81
  });
95
82
  };