@applitools/core 4.48.0 → 4.50.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,48 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.50.0](https://github.com/Applitools-Dev/sdk/compare/js/core@4.49.0...js/core@4.50.0) (2025-10-08)
4
+
5
+
6
+ ### Features
7
+
8
+ * add calculateEstimatedTime to autonomous core | FLD-3472 ([#3241](https://github.com/Applitools-Dev/sdk/issues/3241)) ([4ab2c36](https://github.com/Applitools-Dev/sdk/commit/4ab2c3602ffcf4cc428ca8e132fadcd955822c0a))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * @applitools/dom-snapshot bumped to 4.13.8
14
+ #### Bug Fixes
15
+
16
+ * support cssom property rule ([#3263](https://github.com/Applitools-Dev/sdk/issues/3263)) ([c142687](https://github.com/Applitools-Dev/sdk/commit/c142687ec075784d0e0fb8f178af01c5e81dad82))
17
+
18
+ ## [4.49.0](https://github.com/Applitools-Dev/sdk/compare/js/core@4.48.0...js/core@4.49.0) (2025-10-01)
19
+
20
+
21
+ ### Features
22
+
23
+ * storybook addon ([#3104](https://github.com/Applitools-Dev/sdk/issues/3104)) ([16e09cb](https://github.com/Applitools-Dev/sdk/commit/16e09cba8928c3a24b9e0d9d41e0936fbaec2773))
24
+
25
+
26
+ ### Bug Fixes
27
+
28
+ * duplicate concurrency warnings ([#3255](https://github.com/Applitools-Dev/sdk/issues/3255)) ([ef2f94a](https://github.com/Applitools-Dev/sdk/commit/ef2f94ab4137c78396583f166344285beeb49be7))
29
+
30
+
31
+ ### Dependencies
32
+
33
+ * @applitools/screenshoter bumped to 3.12.6
34
+ #### Bug Fixes
35
+
36
+ * wait after scroll | FLD-3594 ([#3252](https://github.com/Applitools-Dev/sdk/issues/3252)) ([e452422](https://github.com/Applitools-Dev/sdk/commit/e4524229b64e40d9b9596a92bfa94daf5824286a))
37
+ * @applitools/nml-client bumped to 1.11.7
38
+
39
+ * @applitools/core-base bumped to 1.28.1
40
+ #### Bug Fixes
41
+
42
+ * unexpected concurrency values from server | AD-11465 ([#3248](https://github.com/Applitools-Dev/sdk/issues/3248)) ([0dd28c7](https://github.com/Applitools-Dev/sdk/commit/0dd28c7b297d5ad3aabc6b87e427e3e09a993825))
43
+ * @applitools/ec-client bumped to 1.12.9
44
+
45
+
3
46
  ## [4.48.0](https://github.com/Applitools-Dev/sdk/compare/js/core@4.47.1...js/core@4.48.0) (2025-09-22)
4
47
 
5
48
 
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.calculateRequiredSizesCount = exports.calculateRequiredSizes = void 0;
27
+ const extract_environment_info_1 = require("./extract-environment-info");
28
+ const utils = __importStar(require("@applitools/utils"));
29
+ function calculateBreakpoint({ breakpoints, value }) {
30
+ const nextBreakpointIndex = breakpoints
31
+ .sort((item1, item2) => (item1 > item2 ? 1 : -1))
32
+ .findIndex(breakpoint => breakpoint > value);
33
+ if (nextBreakpointIndex === -1)
34
+ return breakpoints[breakpoints.length - 1];
35
+ else if (nextBreakpointIndex === 0)
36
+ return breakpoints[0] - 1;
37
+ else
38
+ return breakpoints[nextBreakpointIndex - 1];
39
+ }
40
+ async function calculateRequiredSizes(environments, settings, deviceProviders, initialViewportSize = { width: 1024, height: 768 }) {
41
+ var _a;
42
+ const isStrictBreakpoints = utils.types.isArray((_a = settings.layoutBreakpoints) === null || _a === void 0 ? void 0 : _a.breakpoints);
43
+ return await environments.reduce(async (prev, environment, index) => {
44
+ var _a;
45
+ const { name, width, height } = await (0, extract_environment_info_1.extractEnvironmentInfo)(environment, deviceProviders);
46
+ const requiredSizes = await prev;
47
+ let requiredSize;
48
+ if ((_a = settings.layoutBreakpoints) === null || _a === void 0 ? void 0 : _a.heightBreakpoints) {
49
+ const requiredWidth = settings.layoutBreakpoints.breakpoints ? width : initialViewportSize.width;
50
+ requiredSize = `${requiredWidth},${height}`;
51
+ }
52
+ else {
53
+ const requiredWidth = isStrictBreakpoints
54
+ ? calculateBreakpoint({ breakpoints: settings.layoutBreakpoints.breakpoints, value: width })
55
+ : width;
56
+ requiredSize = `${requiredWidth},${initialViewportSize.height}`;
57
+ }
58
+ let environments = requiredSizes.get(requiredSize);
59
+ if (!environments)
60
+ requiredSizes.set(requiredSize, (environments = []));
61
+ environments.push({ name, width, height, index });
62
+ return requiredSizes;
63
+ }, Promise.resolve(new Map()));
64
+ }
65
+ exports.calculateRequiredSizes = calculateRequiredSizes;
66
+ async function calculateRequiredSizesCount(environments, settings, deviceProviders, initialViewportSize = { width: 1024, height: 768 }) {
67
+ const requiredSizes = await calculateRequiredSizes(environments, settings, deviceProviders, initialViewportSize);
68
+ return requiredSizes.size || 1;
69
+ }
70
+ exports.calculateRequiredSizesCount = calculateRequiredSizesCount;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_LAZY_LOAD = exports.DEFAULT_WAIT_BEFORE_CAPTURE = void 0;
4
+ exports.DEFAULT_WAIT_BEFORE_CAPTURE = 100;
5
+ exports.DEFAULT_LAZY_LOAD = {
6
+ scrollLength: 300,
7
+ waitingTime: 2000,
8
+ maxAmountToScroll: 15000,
9
+ };
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.extractEnvironmentInfo = void 0;
27
+ const utils = __importStar(require("@applitools/utils"));
28
+ async function extractEnvironmentInfo(environment, provides) {
29
+ if (utils.types.has(environment, ['width', 'height'])) {
30
+ const { name, width, height } = environment;
31
+ return { name: name !== null && name !== void 0 ? name : 'default', width, height };
32
+ }
33
+ else if (utils.types.has(environment, 'chromeEmulationInfo')) {
34
+ const devices = await provides.getChromeEmulationDevices();
35
+ const { deviceName, screenOrientation = 'portrait' } = environment.chromeEmulationInfo;
36
+ return { name: deviceName, screenOrientation, ...devices[deviceName][screenOrientation] };
37
+ }
38
+ else if (utils.types.has(environment, 'iosDeviceInfo')) {
39
+ const devices = await provides.getIOSDevices();
40
+ const { deviceName, screenOrientation = 'portrait' } = environment.iosDeviceInfo;
41
+ return { name: deviceName, screenOrientation, ...devices[deviceName][screenOrientation] };
42
+ }
43
+ throw new Error('Unknown environment type');
44
+ }
45
+ exports.extractEnvironmentInfo = extractEnvironmentInfo;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeCalculateEstimatedTime = void 0;
4
+ const calculate_required_sizes_1 = require("../automation/utils/calculate-required-sizes");
5
+ const defaults_1 = require("../automation/utils/defaults");
6
+ const verify_environment_info_1 = require("../ufg/utils/verify-environment-info");
7
+ const populate_eyes_server_settings_1 = require("../utils/populate-eyes-server-settings");
8
+ function makeCalculateEstimatedTime({ core, logger }) {
9
+ return async function calculateEstimatedTime({ settings }) {
10
+ var _a;
11
+ (0, populate_eyes_server_settings_1.populateEyesServerSettings)(settings);
12
+ const accountInfo = await core.getAccountInfo({ settings, logger });
13
+ const ufgClient = await core.getUFGClient({ settings: {
14
+ ...settings,
15
+ ufgServerUrl: accountInfo.ufgServer.ufgServerUrl,
16
+ accessToken: accountInfo.ufgServer.accessToken,
17
+ }, logger });
18
+ const deviceProviders = {
19
+ getChromeEmulationDevices: ufgClient.getChromeEmulationDevices.bind(ufgClient),
20
+ getIOSDevices: ufgClient.getIOSDevices.bind(ufgClient),
21
+ };
22
+ const environments = settings.environments || [];
23
+ // Validate environments first (same as open() does)
24
+ await (0, verify_environment_info_1.verifyEnvironmentsInfo)({ environments, ufgClient });
25
+ const { scrollLength, waitingTime, maxAmountToScroll } = {
26
+ ...defaults_1.DEFAULT_LAZY_LOAD,
27
+ ...(typeof settings.lazyLoad === 'object' ? settings.lazyLoad : {}),
28
+ };
29
+ // Calculate lazy load time per breakpoint
30
+ const lazyLoadTimePerBreakpoint = settings.lazyLoad
31
+ ? Math.ceil(maxAmountToScroll / scrollLength) * waitingTime
32
+ : 0;
33
+ // Calculate total times (only handle number case for time estimation, default from defaults.ts)
34
+ const waitBeforeCapture = Number(settings.waitBeforeCapture) || defaults_1.DEFAULT_WAIT_BEFORE_CAPTURE;
35
+ // Calculate required sizes count using the same logic as take-dom-snapshots
36
+ // Match the early return logic: if no layoutBreakpoints.breakpoints, take single snapshot
37
+ const waitCount = !((_a = settings.layoutBreakpoints) === null || _a === void 0 ? void 0 : _a.breakpoints)
38
+ ? 1
39
+ : await (0, calculate_required_sizes_1.calculateRequiredSizesCount)(environments, settings, deviceProviders);
40
+ // For numberOfBreakpoints, we need to count unique widths regardless of layoutBreakpoints
41
+ // We can reuse the same logic but ignore layoutBreakpoints settings
42
+ const settingsForBreakpointCount = { ...settings, layoutBreakpoints: undefined };
43
+ const numberOfBreakpoints = await (0, calculate_required_sizes_1.calculateRequiredSizesCount)(environments, settingsForBreakpointCount, deviceProviders);
44
+ const waitBeforeCaptureTime = waitBeforeCapture * waitCount;
45
+ const lazyLoadTime = lazyLoadTimePerBreakpoint * numberOfBreakpoints;
46
+ return {
47
+ totalTime: waitBeforeCaptureTime + lazyLoadTime,
48
+ breakdown: {
49
+ lazyLoadTimePerBreakpoint,
50
+ numberOfBreakpoints,
51
+ waitBeforeCaptureTime,
52
+ },
53
+ };
54
+ };
55
+ }
56
+ exports.makeCalculateEstimatedTime = makeCalculateEstimatedTime;
@@ -11,6 +11,7 @@ const create_render_results_1 = require("./create-render-results");
11
11
  const open_eyes_1 = require("./open-eyes");
12
12
  const open_check_and_close_1 = require("./open-check-and-close");
13
13
  const register_default_scripts_1 = require("../ufg/utils/register-default-scripts");
14
+ const calculate_estimated_time_1 = require("./calculate-estimated-time");
14
15
  function makeAutonomousCore({ spec, clients, base: defaultBase, asyncCache, agentId = 'core-autonomous', logger: defaultLogger, } = {}) {
15
16
  const logger = (0, logger_1.makeLogger)({ logger: defaultLogger, format: { label: 'core-autonomous' } });
16
17
  const core = (0, core_1.makeCore)({ spec, clients, base: defaultBase, asyncCache, agentId, logger });
@@ -25,6 +26,7 @@ function makeAutonomousCore({ spec, clients, base: defaultBase, asyncCache, agen
25
26
  /** @deprecated */
26
27
  openEyes: (0, open_eyes_1.makeOpenEyes)({ core, logger }),
27
28
  openCheckAndClose: (0, open_check_and_close_1.makeOpenCheckAndClose)({ core, logger }),
29
+ calculateEstimatedTime: (0, calculate_estimated_time_1.makeCalculateEstimatedTime)({ core, logger }),
28
30
  };
29
31
  }
30
32
  exports.makeAutonomousCore = makeAutonomousCore;
package/dist/check.js CHANGED
@@ -28,6 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.makeCheck = void 0;
30
30
  const driver_1 = require("@applitools/driver");
31
+ const defaults_1 = require("./automation/utils/defaults");
31
32
  const utils = __importStar(require("@applitools/utils"));
32
33
  const lang = __importStar(require("./lang"));
33
34
  const chalk_1 = __importDefault(require("chalk"));
@@ -39,7 +40,7 @@ function makeCheck({ type: defaultType = 'classic', eyes, target: defaultTarget,
39
40
  logger = logger.extend(mainLogger, { tags: [`check-${type}-${utils.general.shortid()}`] });
40
41
  settings = { ...config === null || config === void 0 ? void 0 : config.screenshot, ...config === null || config === void 0 ? void 0 : config.check, ...settings };
41
42
  (_a = settings.fully) !== null && _a !== void 0 ? _a : (settings.fully = !settings.region && (!settings.frames || settings.frames.length === 0));
42
- (_b = settings.waitBeforeCapture) !== null && _b !== void 0 ? _b : (settings.waitBeforeCapture = 100);
43
+ (_b = settings.waitBeforeCapture) !== null && _b !== void 0 ? _b : (settings.waitBeforeCapture = defaults_1.DEFAULT_WAIT_BEFORE_CAPTURE);
43
44
  (_c = settings.hideScrollbars) !== null && _c !== void 0 ? _c : (settings.hideScrollbars = true);
44
45
  (_d = settings.hideCaret) !== null && _d !== void 0 ? _d : (settings.hideCaret = true);
45
46
  settings.overlap = { top: 10, bottom: 50, ...settings === null || settings === void 0 ? void 0 : settings.overlap };
@@ -58,12 +59,12 @@ function makeCheck({ type: defaultType = 'classic', eyes, target: defaultTarget,
58
59
  (_k = (_r = settings).retryTimeout) !== null && _k !== void 0 ? _k : (_r.retryTimeout = 0);
59
60
  settings.lazyLoad = settings.lazyLoad === true ? {} : settings.lazyLoad;
60
61
  if (settings.lazyLoad) {
61
- (_l = (_s = settings.lazyLoad).scrollLength) !== null && _l !== void 0 ? _l : (_s.scrollLength = 300);
62
- (_m = (_t = settings.lazyLoad).waitingTime) !== null && _m !== void 0 ? _m : (_t.waitingTime = 2000);
63
- (_o = (_u = settings.lazyLoad).maxAmountToScroll) !== null && _o !== void 0 ? _o : (_u.maxAmountToScroll = 15000);
62
+ (_l = (_s = settings.lazyLoad).scrollLength) !== null && _l !== void 0 ? _l : (_s.scrollLength = defaults_1.DEFAULT_LAZY_LOAD.scrollLength);
63
+ (_m = (_t = settings.lazyLoad).waitingTime) !== null && _m !== void 0 ? _m : (_t.waitingTime = defaults_1.DEFAULT_LAZY_LOAD.waitingTime);
64
+ (_o = (_u = settings.lazyLoad).maxAmountToScroll) !== null && _o !== void 0 ? _o : (_u.maxAmountToScroll = defaults_1.DEFAULT_LAZY_LOAD.maxAmountToScroll);
64
65
  }
65
66
  settings.stepIndex = stepIndex++;
66
- (_p = settings.waitBetweenStitches) !== null && _p !== void 0 ? _p : (settings.waitBetweenStitches = utils.types.isObject(settings.lazyLoad) ? settings.lazyLoad.waitingTime : 100);
67
+ (_p = settings.waitBetweenStitches) !== null && _p !== void 0 ? _p : (settings.waitBetweenStitches = utils.types.isObject(settings.lazyLoad) ? settings.lazyLoad.waitingTime : defaults_1.DEFAULT_WAIT_BEFORE_CAPTURE);
67
68
  if (settings.mobileOptions) {
68
69
  (_q = (_v = settings.mobileOptions).keepNavigationBar) !== null && _q !== void 0 ? _q : (_v.keepNavigationBar = false);
69
70
  }
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
26
26
  return result;
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.logs = exports.formatters = void 0;
29
+ exports.MissingApiKeyError = exports.logs = exports.formatters = void 0;
30
30
  __exportStar(require("./types"), exports);
31
31
  __exportStar(require("./core"), exports);
32
32
  __exportStar(require("./universal/core-server"), exports);
@@ -35,3 +35,5 @@ __exportStar(require("./autonomous/core"), exports);
35
35
  __exportStar(require("@applitools/driver/dist/debug"), exports);
36
36
  exports.formatters = __importStar(require("./utils/format-results"));
37
37
  exports.logs = __importStar(require("./troubleshoot/logs"));
38
+ var core_base_1 = require("@applitools/core-base");
39
+ Object.defineProperty(exports, "MissingApiKeyError", { enumerable: true, get: function () { return core_base_1.MissingApiKeyError; } });
package/dist/open-eyes.js CHANGED
@@ -39,6 +39,7 @@ const core_base_1 = require("@applitools/core-base");
39
39
  const extract_git_info_1 = require("./utils/extract-git-info");
40
40
  const types_1 = require("./types");
41
41
  function makeOpenEyes({ type: defaultType = 'classic', clients, batch, removeDuplicateTests, core, cores, spec, environment, logger: mainLogger, asyncCache, concurrency, useServerConcurrency = false, cwd = process.cwd(), }) {
42
+ let shouldPrintConcurrencyWarning = true;
42
43
  return async function openEyes({ type = defaultType, settings: openSettings, config, target, logger = mainLogger, }) {
43
44
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
44
45
  var _1, _2, _3, _4, _5;
@@ -108,23 +109,22 @@ function makeOpenEyes({ type: defaultType = 'classic', clients, batch, removeDup
108
109
  // remember when implementing: other SDKs use session concurrency, not component concurrency like storybook
109
110
  if (useServerConcurrency) {
110
111
  if (concurrency && concurrency < componentConcurrency) {
111
- logger.console.warn(`Eyes Storybook "testConcurrency" explicitly set to ${concurrency}, which is lower than your available limit of ${componentConcurrency}. Using the lower value as requested.`);
112
+ if (shouldPrintConcurrencyWarning) {
113
+ // TODO make this warning more generic
114
+ logger.console.warn(`Eyes Storybook "testConcurrency" explicitly set to ${concurrency}, which is lower than your available limit of ${componentConcurrency}. Using the lower value as requested.`);
115
+ }
112
116
  settings.sessionConcurrency = concurrency;
113
117
  }
114
118
  else {
115
119
  settings.sessionConcurrency = componentConcurrency;
116
- if (concurrency) {
120
+ if (concurrency && shouldPrintConcurrencyWarning) {
117
121
  logger.console.warn(`Overriding user-defined "testConcurrency". Using organization concurrency limit from Eyes server: ${settings.sessionConcurrency}`);
118
122
  }
119
123
  }
124
+ shouldPrintConcurrencyWarning = false;
120
125
  }
121
126
  else {
122
- if (concurrency) {
123
- settings.sessionConcurrency = concurrency;
124
- }
125
- else {
126
- settings.sessionConcurrency = types_1.DEFAULT_CONCURRENCY;
127
- }
127
+ settings.sessionConcurrency = concurrency !== null && concurrency !== void 0 ? concurrency : types_1.DEFAULT_CONCURRENCY;
128
128
  }
129
129
  void core.logEvent({
130
130
  settings: {
@@ -43,7 +43,7 @@ async function takeDomSnapshot({ context, settings, logger, }) {
43
43
  return snapshot;
44
44
  async function takeContextDomSnapshot({ context, isRootFrame, }) {
45
45
  // logger.log(`taking dom snapshot. ${context._reference ? `context referece: ${JSON.stringify(context._reference)}` : ''}`)
46
- var _a, _b, _c;
46
+ var _a, _b, _c, _d;
47
47
  const arg = {
48
48
  dontFetchResources: settings === null || settings === void 0 ? void 0 : settings.disableBrowserFetching,
49
49
  skipResources: settings === null || settings === void 0 ? void 0 : settings.skipResources,
@@ -79,7 +79,8 @@ async function takeDomSnapshot({ context, settings, logger, }) {
79
79
  .context(reference)
80
80
  .then(context => context.focus())
81
81
  .catch(err => {
82
- const srcAttr = cdtNode.attributes.find(attr => attr.name === 'src');
82
+ var _a;
83
+ const srcAttr = (_a = cdtNode.attributes) === null || _a === void 0 ? void 0 : _a.find(attr => attr.name === 'src');
83
84
  if (srcAttr)
84
85
  srcAttr.value = '';
85
86
  logger.log(`could not switch to frame during takeDomSnapshot. Path to frame: ${JSON.stringify(reference)}`, err);
@@ -96,7 +97,7 @@ async function takeDomSnapshot({ context, settings, logger, }) {
96
97
  url.searchParams.set('applitools-iframe', utils.general.guid());
97
98
  frameSnapshot.url = url.href;
98
99
  parentSnapshot.frames.push(frameSnapshot);
99
- cdtNode.attributes.push({ name: 'data-applitools-src', value: frameSnapshot.url });
100
+ (_d = cdtNode.attributes) === null || _d === void 0 ? void 0 : _d.push({ name: 'data-applitools-src', value: frameSnapshot.url });
100
101
  }
101
102
  }
102
103
  logSnapshot(logger, snapshot);
@@ -33,6 +33,7 @@ exports.takeDomSnapshots = void 0;
33
33
  const take_dom_snapshot_1 = require("./take-dom-snapshot");
34
34
  const generate_safe_selectors_1 = require("./generate-safe-selectors");
35
35
  const wait_for_lazy_load_1 = require("../../automation/utils/wait-for-lazy-load");
36
+ const calculate_required_sizes_1 = require("../../automation/utils/calculate-required-sizes");
36
37
  const chalk_1 = __importDefault(require("chalk"));
37
38
  const utils = __importStar(require("@applitools/utils"));
38
39
  const lang = __importStar(require("../../lang"));
@@ -55,27 +56,7 @@ async function takeDomSnapshots({ driver, settings, hooks, provides, logger, })
55
56
  }
56
57
  const isStrictBreakpoints = utils.types.isArray((_b = settings.layoutBreakpoints) === null || _b === void 0 ? void 0 : _b.breakpoints);
57
58
  const initialViewportSize = await driver.getViewportSize();
58
- const requiredSizes = await settings.environments.reduce(async (prev, environment, index) => {
59
- var _a;
60
- const { name, width, height } = (await extractEnvironmentInfo(environment));
61
- const requiredSizes = await prev;
62
- let requiredSize;
63
- if ((_a = settings.layoutBreakpoints) === null || _a === void 0 ? void 0 : _a.heightBreakpoints) {
64
- const requiredWidth = settings.layoutBreakpoints.breakpoints ? width : initialViewportSize.width;
65
- requiredSize = `${requiredWidth},${height}`;
66
- }
67
- else {
68
- const requiredWidth = isStrictBreakpoints
69
- ? calculateBreakpoint({ breakpoints: settings.layoutBreakpoints.breakpoints, value: width })
70
- : width;
71
- requiredSize = `${requiredWidth},${initialViewportSize.height}`;
72
- }
73
- let environments = requiredSizes.get(requiredSize);
74
- if (!environments)
75
- requiredSizes.set(requiredSize, (environments = []));
76
- environments.push({ name, width, height, index });
77
- return requiredSizes;
78
- }, Promise.resolve(new Map()));
59
+ const requiredSizes = await (0, calculate_required_sizes_1.calculateRequiredSizes)(settings.environments, settings, provides, initialViewportSize);
79
60
  const smallestBreakpoint = Math.min(...(isStrictBreakpoints ? settings.layoutBreakpoints.breakpoints : []));
80
61
  const smallestSize = `${smallestBreakpoint - 1},${initialViewportSize.height}`;
81
62
  if (isStrictBreakpoints && requiredSizes.has(smallestSize)) {
@@ -159,32 +140,5 @@ async function takeDomSnapshots({ driver, settings, hooks, provides, logger, })
159
140
  await ((_b = driver.executeUserFunction) === null || _b === void 0 ? void 0 : _b.call(driver, settings.waitBeforeCapture));
160
141
  }
161
142
  }
162
- function calculateBreakpoint({ breakpoints, value }) {
163
- const nextBreakpointIndex = breakpoints
164
- .sort((item1, item2) => (item1 > item2 ? 1 : -1))
165
- .findIndex(breakpoint => breakpoint > value);
166
- if (nextBreakpointIndex === -1)
167
- return breakpoints[breakpoints.length - 1];
168
- else if (nextBreakpointIndex === 0)
169
- return breakpoints[0] - 1;
170
- else
171
- return breakpoints[nextBreakpointIndex - 1];
172
- }
173
- async function extractEnvironmentInfo(environment) {
174
- if (utils.types.has(environment, ['width', 'height'])) {
175
- const { name, width, height } = environment;
176
- return { name: name !== null && name !== void 0 ? name : 'default', width, height };
177
- }
178
- else if (utils.types.has(environment, 'chromeEmulationInfo')) {
179
- const devices = await provides.getChromeEmulationDevices();
180
- const { deviceName, screenOrientation = 'portrait' } = environment.chromeEmulationInfo;
181
- return { name: deviceName, screenOrientation, ...devices[deviceName][screenOrientation] };
182
- }
183
- else if (utils.types.has(environment, 'iosDeviceInfo')) {
184
- const devices = await provides.getIOSDevices();
185
- const { deviceName, screenOrientation = 'portrait' } = environment.iosDeviceInfo;
186
- return { name: deviceName, screenOrientation, ...devices[deviceName][screenOrientation] };
187
- }
188
- }
189
143
  }
190
144
  exports.takeDomSnapshots = takeDomSnapshots;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/core",
3
- "version": "4.48.0",
3
+ "version": "4.50.0",
4
4
  "homepage": "https://applitools.com",
5
5
  "bugs": {
6
6
  "url": "https://github.com/applitools/eyes.sdk.javascript1/issues"
@@ -79,15 +79,15 @@
79
79
  }
80
80
  },
81
81
  "dependencies": {
82
- "@applitools/core-base": "1.28.0",
82
+ "@applitools/core-base": "1.28.1",
83
83
  "@applitools/dom-capture": "11.6.5",
84
- "@applitools/dom-snapshot": "4.13.7",
84
+ "@applitools/dom-snapshot": "4.13.8",
85
85
  "@applitools/driver": "1.23.5",
86
- "@applitools/ec-client": "1.12.8",
86
+ "@applitools/ec-client": "1.12.9",
87
87
  "@applitools/logger": "2.2.4",
88
- "@applitools/nml-client": "1.11.6",
88
+ "@applitools/nml-client": "1.11.7",
89
89
  "@applitools/req": "1.8.4",
90
- "@applitools/screenshoter": "3.12.5",
90
+ "@applitools/screenshoter": "3.12.6",
91
91
  "@applitools/snippets": "2.7.0",
92
92
  "@applitools/socket": "1.3.5",
93
93
  "@applitools/spec-driver-webdriver": "1.4.5",
@@ -0,0 +1,17 @@
1
+ import type { Environment } from '../types';
2
+ import type { SpecType } from '@applitools/driver';
3
+ import type { SnapshotSettings } from '../../autonomous/types';
4
+ import { type DeviceProviders } from './extract-environment-info';
5
+ export declare function calculateRequiredSizes<TSpec extends SpecType>(environments: Environment[], settings: Partial<SnapshotSettings<TSpec>>, deviceProviders: DeviceProviders, initialViewportSize?: {
6
+ width: number;
7
+ height: number;
8
+ }): Promise<Map<string, {
9
+ name: string;
10
+ width: number;
11
+ height: number;
12
+ index: number;
13
+ }[]>>;
14
+ export declare function calculateRequiredSizesCount<TSpec extends SpecType>(environments: Environment[], settings: Partial<SnapshotSettings<TSpec>>, deviceProviders: DeviceProviders, initialViewportSize?: {
15
+ width: number;
16
+ height: number;
17
+ }): Promise<number>;
@@ -0,0 +1,6 @@
1
+ export declare const DEFAULT_WAIT_BEFORE_CAPTURE = 100;
2
+ export declare const DEFAULT_LAZY_LOAD: {
3
+ readonly scrollLength: 300;
4
+ readonly waitingTime: 2000;
5
+ readonly maxAmountToScroll: 15000;
6
+ };
@@ -0,0 +1,21 @@
1
+ import type { Environment } from '../types';
2
+ export type DeviceProviders = {
3
+ getChromeEmulationDevices(): Promise<Record<string, Record<string, {
4
+ width: number;
5
+ height: number;
6
+ }>>>;
7
+ getIOSDevices(): Promise<Record<string, Record<string, {
8
+ width: number;
9
+ height: number;
10
+ }>>>;
11
+ };
12
+ export declare function extractEnvironmentInfo(environment: Environment, provides: DeviceProviders): Promise<{
13
+ name: string;
14
+ width: number;
15
+ height: number;
16
+ } | {
17
+ width: number;
18
+ height: number;
19
+ name: string;
20
+ screenOrientation: string;
21
+ }>;
@@ -0,0 +1,12 @@
1
+ import type { EstimatedTimeResult, SnapshotSettings } from './types';
2
+ import type { SpecType } from '@applitools/driver';
3
+ import type { EyesServerSettings, Core as UFGCore } from '../ufg/types';
4
+ import type { Logger } from '@applitools/logger';
5
+ type Options<TSpec extends SpecType> = {
6
+ settings: Partial<SnapshotSettings<TSpec>> & EyesServerSettings;
7
+ };
8
+ export declare function makeCalculateEstimatedTime<TSpec extends SpecType>({ core, logger }: {
9
+ core: UFGCore<TSpec>;
10
+ logger: Logger;
11
+ }): ({ settings }: Options<TSpec>) => Promise<EstimatedTimeResult>;
12
+ export {};
@@ -45,6 +45,19 @@ export interface AutonomousCore<TSpec extends SpecType> {
45
45
  closeSettings?: BaseCloseSettings;
46
46
  logger?: Logger;
47
47
  }): Promise<void>;
48
+ calculateEstimatedTime(options: {
49
+ settings: Partial<SnapshotSettings<TSpec>>;
50
+ provides?: {
51
+ getChromeEmulationDevices(): Promise<Record<string, Record<string, {
52
+ width: number;
53
+ height: number;
54
+ }>>>;
55
+ getIOSDevices(): Promise<Record<string, Record<string, {
56
+ width: number;
57
+ height: number;
58
+ }>>>;
59
+ };
60
+ }): Promise<EstimatedTimeResult>;
48
61
  }
49
62
  export type SnapshotSettings<TSpec extends SpecType> = UFGCore.SnapshotSettings<TSpec> & UFGCore.EyesServerSettings;
50
63
  export type RenderTargetWithSettings = {
@@ -68,3 +81,11 @@ export type RenderResult = {
68
81
  account: UFGCore.Account;
69
82
  };
70
83
  export type OpenSettings = BaseOpenSettings;
84
+ export type EstimatedTimeResult = {
85
+ totalTime: number;
86
+ breakdown: {
87
+ lazyLoadTimePerBreakpoint: number;
88
+ numberOfBreakpoints: number;
89
+ waitBeforeCaptureTime: number;
90
+ };
91
+ };
package/types/index.d.ts CHANGED
@@ -7,3 +7,4 @@ export { type SpecType, type SpecDriver, type Selector } from '@applitools/drive
7
7
  export * from '@applitools/driver/dist/debug';
8
8
  export * as formatters from './utils/format-results';
9
9
  export * as logs from './troubleshoot/logs';
10
+ export { MissingApiKeyError } from '@applitools/core-base';
@@ -1,6 +1,6 @@
1
- import { type DomSnapshot } from '../types';
2
- import { type Logger } from '@applitools/logger';
3
- import { type SpecType, type Context, type Cookie, type ElementReference, type CommonSelector } from '@applitools/driver';
1
+ import type { DomSnapshot } from '../types';
2
+ import type { Logger } from '@applitools/logger';
3
+ import type { SpecType, Context, Cookie, ElementReference, CommonSelector } from '@applitools/driver';
4
4
  export type RawDomSnapshot = {
5
5
  url: string;
6
6
  selector?: string;