@applitools/core 3.9.1 → 3.10.1

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 (66) hide show
  1. package/CHANGELOG.md +107 -0
  2. package/dist/abort.js +40 -0
  3. package/dist/{ufg → automation}/abort.js +19 -3
  4. package/dist/{ufg → automation}/close.js +19 -3
  5. package/dist/automation/get-nml-client.js +3 -3
  6. package/dist/{ufg → automation}/get-results.js +4 -4
  7. package/dist/automation/utils/extract-renderer-key.js +35 -0
  8. package/dist/check-and-close.js +1 -10
  9. package/dist/check.js +8 -17
  10. package/dist/classic/check-and-close.js +125 -68
  11. package/dist/classic/check.js +108 -63
  12. package/dist/classic/core.js +4 -4
  13. package/dist/classic/get-base-eyes.js +30 -7
  14. package/dist/classic/open-eyes.js +42 -56
  15. package/dist/classic/utils/extract-default-renderers.js +72 -0
  16. package/dist/classic/utils/take-screenshots.js +60 -0
  17. package/dist/close.js +6 -3
  18. package/dist/core.js +4 -4
  19. package/dist/get-typed-eyes.js +3 -5
  20. package/dist/make-manager.js +2 -2
  21. package/dist/open-eyes.js +13 -10
  22. package/dist/ufg/check-and-close.js +61 -53
  23. package/dist/ufg/check.js +62 -59
  24. package/dist/ufg/core.js +2 -2
  25. package/dist/ufg/get-base-eyes.js +22 -13
  26. package/dist/ufg/open-eyes.js +24 -37
  27. package/dist/ufg/utils/extract-default-renderers.js +22 -0
  28. package/dist/universal/core.js +1 -0
  29. package/package.json +15 -15
  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 -8
  36. package/types/automation/utils/extract-renderer-key.d.ts +2 -0
  37. package/types/{ufg → automation}/utils/uniquify-renderers.d.ts +1 -1
  38. package/types/check.d.ts +2 -2
  39. package/types/classic/check-and-close.d.ts +11 -4
  40. package/types/classic/check.d.ts +6 -3
  41. package/types/classic/core.d.ts +2 -1
  42. package/types/classic/get-base-eyes.d.ts +4 -8
  43. package/types/classic/open-eyes.d.ts +3 -4
  44. package/types/classic/types.d.ts +3 -4
  45. package/types/classic/utils/extract-default-renderers.d.ts +9 -0
  46. package/types/classic/utils/take-screenshots.d.ts +18 -0
  47. package/types/close.d.ts +3 -2
  48. package/types/core.d.ts +7 -1
  49. package/types/get-typed-eyes.d.ts +5 -4
  50. package/types/make-manager.d.ts +7 -1
  51. package/types/open-eyes.d.ts +7 -1
  52. package/types/types.d.ts +5 -8
  53. package/types/ufg/check-and-close.d.ts +8 -12
  54. package/types/ufg/check.d.ts +4 -9
  55. package/types/ufg/core.d.ts +3 -3
  56. package/types/ufg/get-base-eyes.d.ts +3 -7
  57. package/types/ufg/open-eyes.d.ts +3 -4
  58. package/types/ufg/types.d.ts +3 -24
  59. package/types/ufg/utils/extract-default-renderers.d.ts +5 -0
  60. package/types/ufg/utils/take-dom-snapshots.d.ts +3 -3
  61. package/dist/classic/abort.js +0 -23
  62. package/dist/classic/close.js +0 -23
  63. package/types/ufg/abort.d.ts +0 -21
  64. package/types/ufg/close.d.ts +0 -19
  65. package/types/ufg/get-results.d.ts +0 -16
  66. /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,12 @@ 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
+ const extract_renderer_key_1 = require("../automation/utils/extract-renderer-key");
36
37
  const abort_error_1 = require("../errors/abort-error");
37
38
  const utils = __importStar(require("@applitools/utils"));
38
39
  const chalk_1 = __importDefault(require("chalk"));
39
- function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal, logger: mainLogger, }) {
40
+ function makeCheckAndClose({ eyes, target: defaultTarget, renderers: defaultRenderers = [], spec, signal, logger: mainLogger, }) {
40
41
  return async function checkAndClose({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
41
42
  var _a, _b, _c, _d, _e, _f, _g, _h;
42
43
  logger = logger.extend(mainLogger);
@@ -48,7 +49,7 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
48
49
  const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
49
50
  settings,
50
51
  });
51
- const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : []);
52
+ const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : defaultRenderers);
52
53
  const ufgClient = await eyes.core.getUFGClient({
53
54
  settings: {
54
55
  ...eyes.test.ufgServer,
@@ -69,15 +70,6 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
69
70
  : null;
70
71
  if (driver) {
71
72
  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
73
  let cleanupGeneratedSelectors;
82
74
  if (environment.isWeb) {
83
75
  userAgent = await driver.getUserAgentLegacy();
@@ -111,37 +103,49 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
111
103
  : undefined;
112
104
  }
113
105
  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
106
  if (environment.isWeb) {
140
- 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
+ });
141
134
  }
142
135
  else {
143
- const nmlClient = await eyes.core.getNMLClient({ config: eyes.test.eyesServer, driver, logger });
144
- 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
+ }));
145
149
  }
146
150
  await currentContext.focus();
147
151
  snapshotUrl = await driver.getUrl();
@@ -157,9 +161,10 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
157
161
  originalSelector: selector,
158
162
  safeSelector: selector,
159
163
  })));
160
- const promises = uniqueRenderers.map(async ({ properties, ...renderer }, index) => {
164
+ const promises = uniqueRenderers.map(async (renderer, index) => {
161
165
  const rendererLogger = logger.extend({ tags: [`renderer-${utils.general.shortid()}`] });
162
- if (utils.types.has(renderer, 'name') && renderer.name === 'edge') {
166
+ const ufgRenderer = renderer;
167
+ if (utils.types.has(ufgRenderer, 'name') && ufgRenderer.name === 'edge') {
163
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.`);
164
169
  rendererLogger.console.log(message);
165
170
  }
@@ -169,13 +174,13 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
169
174
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
170
175
  }
171
176
  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';
177
+ if (utils.types.has(ufgRenderer, 'iosDeviceInfo') || utils.types.has(ufgRenderer, 'androidDeviceInfo')) {
178
+ ufgRenderer.type = utils.types.has(snapshot, 'cdt') ? 'web' : 'native';
174
179
  }
175
180
  const renderTargetPromise = ufgClient.createRenderTarget({
176
181
  snapshot,
177
182
  settings: {
178
- renderer,
183
+ renderer: ufgRenderer,
179
184
  cookies,
180
185
  headers: {
181
186
  Referer: snapshotUrl,
@@ -187,7 +192,7 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
187
192
  },
188
193
  logger: rendererLogger,
189
194
  });
190
- const [baseEyes] = await eyes.getBaseEyes({ settings: { renderer, properties }, logger });
195
+ const baseEyes = await eyes.getBaseEyes({ settings: { renderer }, logger });
191
196
  try {
192
197
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
193
198
  rendererLogger.warn('Command "check" was aborted before rendering');
@@ -214,7 +219,7 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
214
219
  scrollRootElement: scrollRootSelector,
215
220
  selectorsToCalculate: selectorsToCalculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
216
221
  includeFullPageSize: !!settings.pageId,
217
- renderer,
222
+ renderer: ufgRenderer,
218
223
  renderEnvironmentId: baseEyes.test.renderEnvironmentId,
219
224
  uploadUrl: baseEyes.test.uploadUrl,
220
225
  stitchingServiceUrl: baseEyes.test.stitchingServiceUrl,
@@ -245,7 +250,6 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
245
250
  settings: baseSettings,
246
251
  logger: rendererLogger,
247
252
  });
248
- return { eyes: baseEyes, renderer };
249
253
  }
250
254
  catch (error) {
251
255
  rendererLogger.error(`Render on environment with id "${baseEyes.test.renderEnvironmentId}" failed due to an error`, error);
@@ -255,15 +259,19 @@ function makeCheckAndClose({ eyes, storage, target: defaultTarget, spec, signal,
255
259
  }
256
260
  }
257
261
  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 };
262
+ rendererLogger.error(`Renderer with id ${ufgRenderer.id} failed before rendering started due to an error`, error);
263
+ error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer: ufgRenderer };
260
264
  throw error;
261
265
  }
262
266
  });
263
267
  uniqueRenderers.forEach((renderer, index) => {
264
- var _a;
265
- const key = JSON.stringify(renderer);
266
- storage.set(key, [...((_a = storage.get(key)) !== null && _a !== void 0 ? _a : []), promises[index]]);
268
+ const key = (0, extract_renderer_key_1.extractRendererKey)(renderer);
269
+ let item = eyes.storage.get(key);
270
+ if (!item) {
271
+ item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
272
+ eyes.storage.set(key, item);
273
+ }
274
+ item.jobs.push(promises[index]);
267
275
  });
268
276
  };
269
277
  }
package/dist/ufg/check.js CHANGED
@@ -32,11 +32,12 @@ 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
+ const extract_renderer_key_1 = require("../automation/utils/extract-renderer-key");
36
37
  const abort_error_1 = require("../errors/abort-error");
37
38
  const utils = __importStar(require("@applitools/utils"));
38
39
  const chalk_1 = __importDefault(require("chalk"));
39
- function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger: mainLogger, }) {
40
+ function makeCheck({ eyes, target: defaultTarget, renderers: defaultRenderers = [], spec, signal, logger: mainLogger, }) {
40
41
  return async function check({ target = defaultTarget, settings = {}, logger = mainLogger, } = {}) {
41
42
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
42
43
  logger = logger.extend(mainLogger);
@@ -48,7 +49,7 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
48
49
  const { elementReferencesToCalculate, elementReferenceToTarget, getBaseCheckSettings } = (0, to_base_check_settings_1.toBaseCheckSettings)({
49
50
  settings,
50
51
  });
51
- const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : []);
52
+ const uniqueRenderers = (0, uniquify_renderers_1.uniquifyRenderers)((_a = settings.renderers) !== null && _a !== void 0 ? _a : defaultRenderers);
52
53
  const ufgClient = await eyes.core.getUFGClient({
53
54
  settings: {
54
55
  ...eyes.test.ufgServer,
@@ -70,15 +71,6 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
70
71
  if (driver) {
71
72
  const environment = await driver.getEnvironment();
72
73
  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
74
  let cleanupGeneratedSelectors;
83
75
  if (environment.isWeb) {
84
76
  userAgent = await driver.getUserAgentLegacy();
@@ -112,37 +104,49 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
112
104
  : undefined;
113
105
  }
114
106
  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
107
  if (environment.isWeb) {
141
- snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({ driver, ...snapshotOptions, logger });
108
+ snapshots = await (0, take_dom_snapshots_1.takeDomSnapshots)({
109
+ driver,
110
+ settings: {
111
+ ...eyes.test.eyesServer,
112
+ waitBeforeCapture: settings.waitBeforeCapture,
113
+ disableBrowserFetching: settings.disableBrowserFetching,
114
+ layoutBreakpoints: settings.layoutBreakpoints,
115
+ renderers: uniqueRenderers,
116
+ skipResources: ufgClient.getCachedResourceUrls(),
117
+ },
118
+ hooks: {
119
+ async beforeSnapshots() {
120
+ if (settings.lazyLoad && environment.isWeb) {
121
+ await (0, wait_for_lazy_load_1.waitForLazyLoad)({
122
+ context: driver.currentContext,
123
+ settings: settings.lazyLoad !== true ? settings.lazyLoad : {},
124
+ logger,
125
+ });
126
+ }
127
+ },
128
+ },
129
+ provides: {
130
+ getChromeEmulationDevices: ufgClient.getChromeEmulationDevices,
131
+ getIOSDevices: ufgClient.getIOSDevices,
132
+ },
133
+ logger,
134
+ });
142
135
  }
143
136
  else {
144
- const nmlClient = await eyes.core.getNMLClient({ config: eyes.test.eyesServer, driver, logger });
145
- snapshots = (await nmlClient.takeSnapshots({ ...snapshotOptions, logger }));
137
+ const nmlClient = await eyes.core.getNMLClient({
138
+ driver,
139
+ settings: { ...eyes.test.eyesServer, renderEnvironmentsUrl: eyes.test.renderEnvironmentsUrl },
140
+ logger,
141
+ });
142
+ snapshots = (await nmlClient.takeSnapshots({
143
+ settings: {
144
+ ...eyes.test.eyesServer,
145
+ waitBeforeCapture: settings.waitBeforeCapture,
146
+ renderers: uniqueRenderers,
147
+ },
148
+ logger,
149
+ }));
146
150
  }
147
151
  await currentContext.focus();
148
152
  snapshotUrl = await driver.getUrl();
@@ -158,9 +162,10 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
158
162
  originalSelector: selector,
159
163
  safeSelector: selector,
160
164
  })));
161
- const promises = uniqueRenderers.map(async ({ properties, ...renderer }, index) => {
165
+ const promises = uniqueRenderers.map(async (renderer, index) => {
162
166
  const rendererLogger = logger.extend({ tags: [`renderer-${utils.general.shortid()}`] });
163
- if (utils.types.has(renderer, 'name') && renderer.name === 'edge') {
167
+ const ufgRenderer = renderer;
168
+ if (utils.types.has(ufgRenderer, 'name') && ufgRenderer.name === 'edge') {
164
169
  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
170
  rendererLogger.console.log(message);
166
171
  }
@@ -170,13 +175,13 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
170
175
  throw new abort_error_1.AbortError('Command "check" was aborted before rendering');
171
176
  }
172
177
  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';
178
+ if (utils.types.has(ufgRenderer, 'iosDeviceInfo') || utils.types.has(ufgRenderer, 'androidDeviceInfo')) {
179
+ ufgRenderer.type = utils.types.has(snapshot, 'cdt') ? 'web' : 'native';
175
180
  }
176
181
  const renderTargetPromise = ufgClient.createRenderTarget({
177
182
  snapshot,
178
183
  settings: {
179
- renderer,
184
+ renderer: ufgRenderer,
180
185
  cookies,
181
186
  headers: {
182
187
  Referer: snapshotUrl,
@@ -188,7 +193,7 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
188
193
  },
189
194
  logger: rendererLogger,
190
195
  });
191
- const [baseEyes] = await eyes.getBaseEyes({ settings: { renderer, properties }, logger: rendererLogger });
196
+ const baseEyes = await eyes.getBaseEyes({ settings: { renderer }, logger: rendererLogger });
192
197
  try {
193
198
  if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
194
199
  rendererLogger.warn('Command "check" was aborted before rendering');
@@ -215,7 +220,7 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
215
220
  scrollRootElement: scrollRootSelector,
216
221
  selectorsToCalculate: selectorsToCalculate.flatMap(({ safeSelector }) => safeSelector !== null && safeSelector !== void 0 ? safeSelector : []),
217
222
  includeFullPageSize: Boolean(settings.pageId),
218
- renderer,
223
+ renderer: ufgRenderer,
219
224
  renderEnvironmentId: baseEyes.test.renderEnvironmentId,
220
225
  uploadUrl: baseEyes.test.uploadUrl,
221
226
  stitchingServiceUrl: baseEyes.test.stitchingServiceUrl,
@@ -246,11 +251,6 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
246
251
  settings: baseSettings,
247
252
  logger: rendererLogger,
248
253
  });
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
254
  }
255
255
  catch (error) {
256
256
  rendererLogger.error(`Render on environment with id "${baseEyes.test.renderEnvironmentId}" failed due to an error`, error);
@@ -261,16 +261,19 @@ function makeCheck({ eyes, storage, target: defaultTarget, spec, signal, logger:
261
261
  }
262
262
  }
263
263
  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 };
264
+ rendererLogger.error(`Renderer with id ${ufgRenderer.id} failed before rendering started due to an error`, error);
265
+ error.info = { ...error.info, userTestId: eyes.test.userTestId, renderer: ufgRenderer };
266
266
  throw error;
267
267
  }
268
268
  });
269
- return uniqueRenderers.map((renderer, index) => {
270
- var _a;
271
- 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 };
269
+ uniqueRenderers.forEach((renderer, index) => {
270
+ const key = (0, extract_renderer_key_1.extractRendererKey)(renderer);
271
+ let item = eyes.storage.get(key);
272
+ if (!item) {
273
+ item = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
274
+ eyes.storage.set(key, item);
275
+ }
276
+ item.jobs.push(promises[index]);
274
277
  });
275
278
  };
276
279
  }
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,22 @@ 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 = { eyes: utils.promises.makeControlledPromise(), jobs: [] };
34
+ eyes.storage.set(key, item);
35
+ }
36
+ if (!item.eyes.settled)
37
+ item.eyes.resolve(getBaseEyes(options));
38
+ return item.eyes;
39
+ });
33
40
  return getBaseEyesWithCache;
34
- async function getBaseEyes({ settings, logger = mainLogger, } = {}) {
41
+ async function getBaseEyes({ settings, logger = mainLogger, }) {
35
42
  logger = logger.extend(mainLogger);
36
43
  logger.log(`Command "getBaseEyes" is called with settings`, settings);
37
- if (!settings)
38
- throw new Error('');
39
44
  const ufgClient = await eyes.core.getUFGClient({
40
45
  settings: {
41
46
  ...eyes.test.ufgServer,
@@ -44,13 +49,17 @@ function makeGetBaseEyes({ settings: defaultSettings, eyes, base, logger: mainLo
44
49
  },
45
50
  logger,
46
51
  });
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 } },
52
+ const environment = await ufgClient.getRenderEnvironment({
53
+ settings: { renderer: settings.renderer },
54
+ logger,
55
+ });
56
+ return eyes.core.base.openEyes({
57
+ settings: {
58
+ ...defaultSettings,
59
+ environment: { ...defaultSettings.environment, ...environment, properties: settings.renderer.properties },
60
+ },
51
61
  logger,
52
62
  });
53
- return [baseEyes];
54
63
  }
55
64
  }
56
65
  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
  };